@adatechnology/notification-ui 0.1.0-rc.2 → 0.1.0-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-FNUYTJ36.js → chunk-QBQ62VZ3.js} +254 -31
- package/dist/chunk-QBQ62VZ3.js.map +1 -0
- package/dist/headless.d.ts +119 -7
- package/dist/headless.js +11 -1
- package/dist/index.d.ts +20 -5
- package/dist/index.js +232 -56
- package/dist/index.js.map +1 -1
- package/dist/styles.css +189 -4
- package/dist/styles.css.map +1 -1
- package/package.json +3 -3
- package/dist/chunk-FNUYTJ36.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/NotificationBell.tsx","../src/components/NotificationList.tsx","../src/components/NotificationItem.tsx","../src/components/PreferencesPanel.tsx","../src/components/NotificationsWorkspace.tsx","../src/components/NotificationSettingsWorkspace.tsx"],"sourcesContent":["/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n */\n\nimport { Bell } from 'lucide-react'\nimport clsx from 'clsx'\n\nimport { useNotificationContext } from '../NotificationProvider'\nimport { useUnreadCount } from '../hooks/useNotifications'\n\nexport type NotificationBellProps = {\n readonly onClick?: () => void\n readonly className?: string\n /** Acima disso o badge mostra `99+`; um número de 4 dígitos estoura o desenho do badge. */\n readonly maxBadgeCount?: number\n}\n\nconst DEFAULT_MAX_BADGE_COUNT = 99\n\nexport function NotificationBell({ onClick, className, maxBadgeCount = DEFAULT_MAX_BADGE_COUNT }: NotificationBellProps) {\n const { messages, theme } = useNotificationContext()\n const { data: unreadCount = 0 } = useUnreadCount()\n\n const hasUnread = unreadCount > 0\n const badgeLabel = unreadCount > maxBadgeCount ? `${maxBadgeCount}+` : String(unreadCount)\n const accessibleLabel = hasUnread\n ? `${messages['bell.label']}: ${unreadCount} ${messages['bell.unreadSuffix']}`\n : messages['bell.label']\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={clsx('adn-bell', theme.rootClassName, className)}\n // Botão só-ícone exige rótulo acessível (regra de ícones, `web.md` §9).\n aria-label={accessibleLabel}\n >\n {/* Decorativo: o rótulo acessível já está no botão, e anunciar o ícone repetiria a ação. */}\n <Bell className=\"adn-bell__icon\" aria-hidden=\"true\" />\n {hasUnread ? (\n // `aria-live` para leitor de tela anunciar a mudança do contador sem o usuário reabrir\n // o menu; `polite` porque notificação nova não deve interromper o que ele está lendo.\n <span className=\"adn-bell__badge\" aria-live=\"polite\">\n {badgeLabel}\n </span>\n ) : null}\n </button>\n )\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n */\n\nimport { CheckCheck, Inbox, RotateCw } from 'lucide-react'\nimport clsx from 'clsx'\nimport type { NotificationSummary } from '@adatechnology/notification-contracts'\n\nimport { useNotificationContext } from '../NotificationProvider'\nimport { flattenNotificationPages, useMarkAllAsRead, useNotifications, useUnreadCount } from '../hooks/useNotifications'\nimport { NotificationItem } from './NotificationItem'\n\nexport type NotificationListProps = {\n readonly category?: string\n readonly onSelect?: (notification: NotificationSummary) => void\n readonly className?: string\n /** Slot: o host troca a linha sem reimplementar a lista (regra §4.3, slots e overrides). */\n readonly components?: { readonly Item?: typeof NotificationItem }\n}\n\nexport function NotificationList({ category, onSelect, className, components }: NotificationListProps) {\n const { messages, theme } = useNotificationContext()\n const query = useNotifications({ category })\n const { data: unreadCount = 0 } = useUnreadCount()\n const markAllAsRead = useMarkAllAsRead()\n\n const Item = components?.Item ?? NotificationItem\n const notifications = flattenNotificationPages(query.data?.pages)\n\n return (\n <section className={clsx('adn-list', theme.rootClassName, className)} aria-label={messages['list.title']}>\n <header className=\"adn-list__header\">\n <h2 className=\"adn-list__title\">{messages['list.title']}</h2>\n {unreadCount > 0 ? (\n <button\n type=\"button\"\n className=\"adn-list__bulk-action\"\n onClick={() => markAllAsRead.mutate()}\n disabled={markAllAsRead.isPending}\n >\n <CheckCheck className=\"adn-list__bulk-icon\" aria-hidden=\"true\" />\n {messages['list.markAllAsRead']}\n </button>\n ) : null}\n </header>\n\n {query.isPending ? <p className=\"adn-list__state\">{messages['list.loading']}</p> : null}\n\n {query.isError ? (\n <div className=\"adn-list__state adn-list__state--error\">\n <p>{messages['list.error']}</p>\n <button type=\"button\" className=\"adn-list__retry\" onClick={() => void query.refetch()}>\n <RotateCw className=\"adn-list__retry-icon\" aria-hidden=\"true\" />\n {messages['list.retry']}\n </button>\n </div>\n ) : null}\n\n {!query.isPending && !query.isError && notifications.length === 0 ? (\n <div className=\"adn-list__state adn-list__state--empty\">\n <Inbox className=\"adn-list__empty-icon\" aria-hidden=\"true\" />\n <p>{messages['list.empty']}</p>\n </div>\n ) : null}\n\n {notifications.length > 0 ? (\n <ul className=\"adn-list__items\">\n {notifications.map((notification) => (\n <Item key={notification.id} notification={notification} onSelect={onSelect} />\n ))}\n </ul>\n ) : null}\n\n {query.hasNextPage ? (\n <button\n type=\"button\"\n className=\"adn-list__load-more\"\n onClick={() => void query.fetchNextPage()}\n disabled={query.isFetchingNextPage}\n >\n {messages['list.loadMore']}\n </button>\n ) : null}\n </section>\n )\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n */\n\nimport { Check, Trash2 } from 'lucide-react'\nimport clsx from 'clsx'\nimport type { NotificationSummary } from '@adatechnology/notification-contracts'\n\nimport { useNotificationContext } from '../NotificationProvider'\nimport { useDeleteNotification, useMarkAsRead } from '../hooks/useNotifications'\n\nexport type NotificationItemProps = {\n readonly notification: NotificationSummary\n readonly onSelect?: (notification: NotificationSummary) => void\n readonly className?: string\n}\n\nexport function NotificationItem({ notification, onSelect, className }: NotificationItemProps) {\n const { messages } = useNotificationContext()\n const markAsRead = useMarkAsRead()\n const deleteNotification = useDeleteNotification()\n\n const isUnread = notification.readAt === undefined\n\n function handleSelect(): void {\n if (isUnread) markAsRead.mutate(notification.id)\n onSelect?.(notification)\n }\n\n return (\n <li className={clsx('adn-item', isUnread && 'adn-item--unread', className)}>\n {/* Semântico: a linha inteira é clicável e precisa ser alcançável por teclado — `button`\n entrega Enter, Espaço e foco de graça, e um `div` com onClick não (web.md §Acessibilidade). */}\n <button type=\"button\" className=\"adn-item__main\" onClick={handleSelect}>\n <span className=\"adn-item__title\">{notification.title}</span>\n <span className=\"adn-item__body\">{notification.body}</span>\n {isUnread ? <span className=\"adn-item__unread-dot\" aria-label={messages['item.unread']} /> : null}\n </button>\n\n <div className=\"adn-item__actions\">\n {isUnread ? (\n <button\n type=\"button\"\n className=\"adn-item__action\"\n onClick={() => markAsRead.mutate(notification.id)}\n disabled={markAsRead.isPending}\n aria-label={messages['item.markAsRead']}\n title={messages['item.markAsRead']}\n >\n <Check className=\"adn-item__action-icon\" aria-hidden=\"true\" />\n </button>\n ) : null}\n\n <button\n type=\"button\"\n className=\"adn-item__action adn-item__action--danger\"\n onClick={() => deleteNotification.mutate(notification.id)}\n disabled={deleteNotification.isPending}\n aria-label={messages['item.delete']}\n title={messages['item.delete']}\n >\n {/* Ação destrutiva: ícone reforça o peso antes do clique (regra de ícones). */}\n <Trash2 className=\"adn-item__action-icon\" aria-hidden=\"true\" />\n </button>\n </div>\n </li>\n )\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n */\n\nimport { useState } from 'react'\nimport { Save } from 'lucide-react'\nimport clsx from 'clsx'\nimport type { NotificationPreference } from '@adatechnology/notification-contracts'\n\nimport { useNotificationContext } from '../NotificationProvider'\nimport { usePreferences, useUpdatePreferences } from '../hooks/usePreferences'\n\nexport type PreferencesPanelProps = {\n readonly className?: string\n}\n\nfunction channelLabelKey(channel: string): string {\n return `channel.${channel}`\n}\n\nexport function PreferencesPanel({ className }: PreferencesPanelProps) {\n const { messages, theme } = useNotificationContext()\n const { data: saved = [], isPending } = usePreferences()\n const updatePreferences = useUpdatePreferences()\n\n // Rascunho local só existe entre abrir e salvar: `undefined` significa \"ainda não mexeu\", e é o\n // que faz o painel refletir o servidor sem sobrescrever edição em andamento a cada refetch.\n const [draft, setDraft] = useState<NotificationPreference[] | undefined>(undefined)\n const preferences = draft ?? saved\n\n function toggleChannel(target: NotificationPreference): void {\n setDraft(\n preferences.map((preference) =>\n preference.category === target.category && preference.channel === target.channel\n ? { ...preference, enabled: !preference.enabled }\n : preference,\n ),\n )\n }\n\n function handleSave(): void {\n updatePreferences.mutate(preferences, { onSuccess: () => setDraft(undefined) })\n }\n\n if (isPending) return <p className=\"adn-preferences__state\">{messages['list.loading']}</p>\n\n return (\n <section className={clsx('adn-preferences', theme.rootClassName, className)}>\n <header className=\"adn-preferences__header\">\n <h2 className=\"adn-preferences__title\">{messages['preferences.title']}</h2>\n <p className=\"adn-preferences__description\">{messages['preferences.description']}</p>\n </header>\n\n {preferences.length === 0 ? (\n <p className=\"adn-preferences__state\">{messages['preferences.empty']}</p>\n ) : (\n <ul className=\"adn-preferences__items\">\n {preferences.map((preference) => {\n const inputId = `adn-pref-${preference.category}-${preference.channel}`\n return (\n <li key={inputId} className=\"adn-preferences__item\">\n {/* `label` associado por `htmlFor`: aumenta a área de toque e é o que faz o\n leitor de tela anunciar canal e estado juntos. */}\n <label className=\"adn-preferences__label\" htmlFor={inputId}>\n <input\n id={inputId}\n type=\"checkbox\"\n className=\"adn-preferences__checkbox\"\n checked={preference.enabled}\n onChange={() => toggleChannel(preference)}\n />\n <span className=\"adn-preferences__category\">{preference.category}</span>\n <span className=\"adn-preferences__channel\">\n {messages[channelLabelKey(preference.channel) as keyof typeof messages] ?? preference.channel}\n </span>\n </label>\n\n {preference.quietHoursStart && preference.quietHoursEnd ? (\n <span className=\"adn-preferences__quiet-hours\">\n {messages['preferences.quietHours']} {preference.quietHoursStart}{' '}\n {messages['preferences.quietHoursTo']} {preference.quietHoursEnd}\n </span>\n ) : null}\n </li>\n )\n })}\n </ul>\n )}\n\n <footer className=\"adn-preferences__footer\">\n {/* Ação primária de formulário com convenção clara → ícone (regra de ícones, web.md §9). */}\n <button\n type=\"button\"\n className=\"adn-preferences__save\"\n onClick={handleSave}\n disabled={updatePreferences.isPending || draft === undefined}\n >\n <Save className=\"adn-preferences__save-icon\" aria-hidden=\"true\" />\n {messages['preferences.save']}\n </button>\n\n {updatePreferences.isSuccess && draft === undefined ? (\n <span className=\"adn-preferences__feedback\" role=\"status\">\n {messages['preferences.saved']}\n </span>\n ) : null}\n {updatePreferences.isError ? (\n <span className=\"adn-preferences__feedback adn-preferences__feedback--error\" role=\"alert\">\n {messages['preferences.error']}\n </span>\n ) : null}\n </footer>\n </section>\n )\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n *\n * A tela de notificações COMPOSTA, no molde do `ConversationsWorkspace`.\n *\n * O pacote exportava só as peças (`NotificationList`, `PreferencesPanel`), e o primeiro consumidor\n * remontou o grid à mão — 56 linhas na página da inbox e 221 na de configuração, contra 35 da página\n * de Documentos, que consome workspace. É exatamente o que a regra de módulos plugáveis (§4) rejeita:\n * cada produto remontando o layout é como as telas divergiram antes.\n *\n * Customização por contrato, nunca por fork:\n * - vocabulário → `labels`\n * - UI do produto → slots `renderHeaderActions`, `renderAboveList`, `renderEmpty`\n * - regra de negócio → callbacks (`onSelectNotification`)\n * - **capacidade por ausência**: sem `settingsHref` não aparece link de configuração, sem\n * `showPreferences` não aparece a coluna. Nunca flag `hasX`.\n */\n\nimport type { ReactNode } from 'react'\nimport type { NotificationSummary } from '@adatechnology/notification-contracts'\n\nimport { useNotificationContext } from '../NotificationProvider'\nimport { NotificationList } from './NotificationList'\nimport { PreferencesPanel } from './PreferencesPanel'\n\nexport type NotificationsWorkspaceProps = {\n /** Sobrescreve textos pontuais sem trocar o locale inteiro. */\n readonly labels?: Partial<Record<string, string>>\n /** Filtra a inbox por assunto. Ausente, mostra tudo. */\n readonly category?: string\n /**\n * Coluna de preferências ao lado da inbox.\n *\n * Ligada por padrão porque é o caso comum; um produto que gerencia preferência noutra tela passa\n * `false` e fica só com a inbox, em largura cheia.\n */\n readonly showPreferences?: boolean\n /** Ausente, o link de configuração não aparece — o produto pode não ter essa tela. */\n readonly settingsHref?: string | undefined\n /** Clique numa notificação. Ausente, a linha não é clicável. */\n readonly onSelectNotification?: (notification: NotificationSummary) => void\n /** Ações do produto no cabeçalho, ao lado do link de configuração. */\n readonly renderHeaderActions?: () => ReactNode\n /** Aviso ou filtro do produto, entre o cabeçalho e a lista. */\n readonly renderAboveList?: () => ReactNode\n /** Substitui o vazio padrão — útil quando o produto sabe explicar por que está vazio. */\n readonly renderEmpty?: () => ReactNode\n readonly className?: string\n}\n\nexport function NotificationsWorkspace({\n labels: labelsOverride,\n category,\n showPreferences = true,\n settingsHref,\n onSelectNotification,\n renderHeaderActions,\n renderAboveList,\n renderEmpty,\n className,\n}: NotificationsWorkspaceProps) {\n const { messages } = useNotificationContext()\n const label = (key: string): string => labelsOverride?.[key] ?? (messages as Record<string, string>)[key] ?? key\n\n return (\n <div className={`adn-workspace ${className ?? ''}`}>\n <header className=\"adn-workspace__header\">\n <div>\n <h1 className=\"adn-workspace__title\">{label('workspace.title')}</h1>\n <p className=\"adn-workspace__description\">{label('workspace.description')}</p>\n </div>\n\n <div className=\"adn-workspace__actions\">\n {renderHeaderActions?.()}\n {/* Capacidade por ausência: sem href, sem link. */}\n {settingsHref && (\n <a href={settingsHref} className=\"adn-button adn-button--outline\">\n {label('workspace.settingsLink')}\n </a>\n )}\n </div>\n </header>\n\n {renderAboveList?.()}\n\n <div className={showPreferences ? 'adn-workspace__grid' : 'adn-workspace__grid--single'}>\n <section className=\"adn-workspace__inbox\">\n <NotificationList\n {...(category ? { category } : {})}\n {...(onSelectNotification ? { onSelect: onSelectNotification } : {})}\n />\n {renderEmpty?.()}\n </section>\n\n {showPreferences && (\n <aside className=\"adn-workspace__aside\">\n <PreferencesPanel />\n </aside>\n )}\n </div>\n </div>\n )\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n *\n * A tela de configuração COMPOSTA: canais por assunto e editor de mensagem com preview.\n *\n * Substitui as 221 linhas de página + 207 de hook que o primeiro consumidor escreveu. O que sobra\n * para o produto é dizer quais canais e assuntos existem — o resto é layout, e layout duplicado é\n * como as telas divergem.\n *\n * `channels` e `categories` são OBRIGATÓRIOS e vêm do produto porque o pacote não tem opinião sobre\n * eles: uma loja avisa status de pedido por WhatsApp, um banco avisa vencimento por e-mail, e o\n * `hint` de cada canal (\"exige template aprovado\", \"exige aparelho registrado\") é conhecimento do\n * produto sobre a própria operação.\n */\n\nimport type { ReactNode } from 'react'\nimport type { NotificationPreference, NotificationTemplate } from '@adatechnology/notification-contracts'\n\nimport { useNotificationContext } from '../NotificationProvider'\nimport { usePreferences, useUpdatePreferences } from '../hooks/usePreferences'\nimport { useTemplateEditor } from '../hooks/useTemplateEditor'\n\nexport type NotificationChannelOption = {\n readonly id: string\n readonly label: string\n /** O custo do canal, em uma linha. É o que faz alguém decidir em vez de chutar. */\n readonly hint?: string\n}\n\nexport type NotificationCategoryOption = {\n readonly id: string\n readonly label: string\n readonly hint?: string\n}\n\nexport type NotificationSettingsWorkspaceProps = {\n readonly labels?: Partial<Record<string, string>>\n /** Os canais que ESTE produto oferece — o pacote despacha em cinco e não opina sobre quais usar. */\n readonly channels: readonly NotificationChannelOption[]\n /** Os assuntos que este produto dispara. */\n readonly categories: readonly NotificationCategoryOption[]\n /**\n * Valores de exemplo do preview, por assunto do template. Ausente, o preview mostra campo vazio —\n * que é honesto, mas menos útil para quem está escrevendo o texto.\n */\n readonly previewPayload?: Readonly<Record<string, unknown>>\n /** Traduz `order.status.preparing` no rótulo que o produto usa. Ausente, mostra a chave crua. */\n readonly templateLabelOf?: (template: NotificationTemplate) => string\n /**\n * Campo extra por canal — é onde entra o nome do template aprovado na Meta, que só o WhatsApp tem.\n * Ausente, nenhum campo extra aparece.\n */\n readonly renderChannelFields?: (params: {\n readonly channel: string\n readonly value: string\n readonly onChange: (value: string) => void\n }) => ReactNode\n /** Ações do produto no cabeçalho. */\n readonly renderHeaderActions?: () => ReactNode\n readonly className?: string\n}\n\nexport function NotificationSettingsWorkspace({\n labels: labelsOverride,\n channels,\n categories,\n previewPayload,\n templateLabelOf,\n renderChannelFields,\n renderHeaderActions,\n className,\n}: NotificationSettingsWorkspaceProps) {\n const { messages } = useNotificationContext()\n const label = (key: string): string => labelsOverride?.[key] ?? (messages as Record<string, string>)[key] ?? key\n\n const preferencesQuery = usePreferences()\n const updatePreferences = useUpdatePreferences()\n const editor = useTemplateEditor(previewPayload ? { previewPayload } : {})\n\n /**\n * Preferência ausente é o estado inicial normal — o módulo devolve só o que foi gravado. O default\n * é ligado: comportamento de fábrica é avisar, e um destinatário que não recebeu porque a linha não\n * existia é pior que um que recebeu demais.\n */\n function isEnabled(category: string, channel: string): boolean {\n const row = (preferencesQuery.data ?? []).find(\n (preference) => preference.category === category && preference.channel === channel,\n )\n return row?.enabled ?? true\n }\n\n function toggle(category: string, channel: string): void {\n // Conjunto inteiro: a rota é `PUT` em lote, e enviar só o que mudou apagaria o resto.\n const next: NotificationPreference[] = categories.flatMap((eachCategory) =>\n channels.map((eachChannel) => ({\n category: eachCategory.id,\n channel: eachChannel.id as NotificationPreference['channel'],\n enabled:\n eachCategory.id === category && eachChannel.id === channel\n ? !isEnabled(category, channel)\n : isEnabled(eachCategory.id, eachChannel.id),\n })),\n )\n updatePreferences.mutate(next)\n }\n\n return (\n <div className={`adn-settings ${className ?? ''}`}>\n <header className=\"adn-settings__header\">\n <div>\n <h1 className=\"adn-settings__title\">{label('settings.title')}</h1>\n <p className=\"adn-settings__description\">{label('settings.description')}</p>\n </div>\n {renderHeaderActions?.()}\n </header>\n\n <section className=\"adn-settings__channels\">\n <h2 className=\"adn-settings__section-title\">{label('settings.channelsTitle')}</h2>\n <p className=\"adn-settings__hint\">{label('settings.channelsHint')}</p>\n\n {categories.map((category) => (\n <div key={category.id} className=\"adn-settings__category\">\n <p className=\"adn-settings__category-label\">{category.label}</p>\n {category.hint && <p className=\"adn-settings__hint\">{category.hint}</p>}\n\n <div className=\"adn-settings__channel-grid\">\n {channels.map((channel) => (\n <label key={channel.id} className=\"adn-settings__channel\">\n <input\n type=\"checkbox\"\n checked={isEnabled(category.id, channel.id)}\n disabled={updatePreferences.isPending}\n onChange={() => toggle(category.id, channel.id)}\n />\n <span>\n <span className=\"adn-settings__channel-label\">{channel.label}</span>\n {channel.hint && <span className=\"adn-settings__hint\">{channel.hint}</span>}\n </span>\n </label>\n ))}\n </div>\n </div>\n ))}\n </section>\n\n <div className=\"adn-settings__templates\">\n <section className=\"adn-settings__template-list\">\n <header>\n <h2 className=\"adn-settings__section-title\">{label('settings.templatesTitle')}</h2>\n <p className=\"adn-settings__hint\">{label('settings.templatesHint')}</p>\n </header>\n\n {editor.isLoading && <p className=\"adn-settings__hint\">{label('list.loading')}</p>}\n {!editor.isLoading && editor.templates.length === 0 && (\n <p className=\"adn-settings__hint\">{label('settings.templatesEmpty')}</p>\n )}\n\n <ul>\n {editor.templates.map((template) => (\n <li key={template.id}>\n <button\n type=\"button\"\n onClick={() => editor.select(template)}\n className={editor.selected?.id === template.id ? 'adn-settings__row--active' : undefined}\n >\n <span className=\"adn-settings__row-main\">\n <span className=\"adn-settings__row-title\">{templateLabelOf?.(template) ?? template.key}</span>\n <span className=\"adn-settings__row-body\">{template.body}</span>\n </span>\n <span className={`adn-settings__badge adn-settings__badge--${template.channel}`}>\n {label(`channel.${template.channel}`)}\n </span>\n <span className=\"adn-settings__version\">\n {label('settings.version')}\n {template.version}\n </span>\n </button>\n </li>\n ))}\n </ul>\n </section>\n\n <section className=\"adn-settings__editor\">\n {!editor.draft && <p className=\"adn-settings__hint\">{label('settings.pickTemplate')}</p>}\n\n {editor.draft && (\n <>\n <header className=\"adn-settings__editor-header\">\n <div>\n <h2 className=\"adn-settings__section-title\">\n {editor.selected ? (templateLabelOf?.(editor.selected) ?? editor.selected.key) : ''}\n </h2>\n <p className=\"adn-settings__hint\">\n {editor.draft.channel} · {editor.draft.locale} · {label('settings.version')}\n {editor.selected?.version}\n </p>\n </div>\n <button type=\"button\" onClick={editor.clear}>\n {label('settings.close')}\n </button>\n </header>\n\n <label className=\"adn-settings__field\">\n <span className=\"adn-settings__field-label\">{label('settings.subject')}</span>\n <span className=\"adn-settings__hint\">{label('settings.subjectHint')}</span>\n <input value={editor.draft.subject} onChange={(event) => editor.update({ subject: event.target.value })} />\n </label>\n\n <label className=\"adn-settings__field\">\n <span className=\"adn-settings__field-label\">{label('settings.body')}</span>\n <textarea\n rows={4}\n value={editor.draft.body}\n onChange={(event) => editor.update({ body: event.target.value })}\n />\n </label>\n\n {/* Slot: campo que só um canal tem, e que o pacote não deve conhecer por nome. */}\n {renderChannelFields?.({\n channel: editor.draft.channel,\n value: editor.draft.whatsappTemplateName,\n onChange: (value) => editor.update({ whatsappTemplateName: value }),\n })}\n\n {editor.preview && (\n <div className=\"adn-settings__preview\">\n <p className=\"adn-settings__preview-title\">{label('settings.previewTitle')}</p>\n <p className=\"adn-settings__preview-subject\">{editor.preview.title}</p>\n <p className=\"adn-settings__preview-body\">{editor.preview.body}</p>\n </div>\n )}\n\n {editor.error && <p className=\"adn-settings__error\">{editor.error}</p>}\n\n <div className=\"adn-settings__actions\">\n <button type=\"button\" onClick={editor.save} disabled={!editor.isDirty || editor.isSaving}>\n {editor.isSaving ? label('settings.saving') : label('settings.save')}\n </button>\n {/* Diz por que está desabilitado, em vez de deixar o botão inerte sem explicação. */}\n {!editor.isDirty && <span className=\"adn-settings__hint\">{label('settings.unchanged')}</span>}\n </div>\n </>\n )}\n </section>\n </div>\n </div>\n )\n}\n"],"mappings":"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","names":["clsx","clsx","jsx","jsxs","clsx","jsx","jsxs","clsx","clsx","jsx","jsxs","clsx","jsx","jsxs","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/NotificationBell.tsx","../src/components/NotificationList.tsx","../src/components/NotificationItem.tsx","../src/components/PreferencesPanel.tsx","../src/components/NotificationsWorkspace.tsx","../src/components/NotificationSettingsWorkspace.tsx"],"sourcesContent":["/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n */\n\nimport { Bell } from 'lucide-react'\nimport clsx from 'clsx'\n\nimport { useNotificationContext } from '../NotificationProvider'\nimport { useUnreadCount } from '../hooks/useNotifications'\n\nexport type NotificationBellProps = {\n readonly onClick?: () => void\n readonly className?: string\n /** Acima disso o badge mostra `99+`; um número de 4 dígitos estoura o desenho do badge. */\n readonly maxBadgeCount?: number\n}\n\nconst DEFAULT_MAX_BADGE_COUNT = 99\n\nexport function NotificationBell({\n onClick,\n className,\n maxBadgeCount = DEFAULT_MAX_BADGE_COUNT,\n}: NotificationBellProps) {\n const { messages, theme } = useNotificationContext()\n const { data: unreadCount = 0 } = useUnreadCount()\n\n const hasUnread = unreadCount > 0\n const badgeLabel = unreadCount > maxBadgeCount ? `${maxBadgeCount}+` : String(unreadCount)\n const accessibleLabel = hasUnread\n ? `${messages['bell.label']}: ${unreadCount} ${messages['bell.unreadSuffix']}`\n : messages['bell.label']\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={clsx('adn-bell', theme.rootClassName, className)}\n // Botão só-ícone exige rótulo acessível (regra de ícones, `web.md` §9).\n aria-label={accessibleLabel}\n >\n {/* Decorativo: o rótulo acessível já está no botão, e anunciar o ícone repetiria a ação. */}\n <Bell className=\"adn-bell__icon\" aria-hidden=\"true\" />\n {hasUnread ? (\n // `aria-live` para leitor de tela anunciar a mudança do contador sem o usuário reabrir\n // o menu; `polite` porque notificação nova não deve interromper o que ele está lendo.\n <span className=\"adn-bell__badge\" aria-live=\"polite\">\n {badgeLabel}\n </span>\n ) : null}\n </button>\n )\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n */\n\nimport { CheckCheck, Inbox, RotateCw } from 'lucide-react'\nimport clsx from 'clsx'\nimport type { ReactNode } from 'react'\nimport type { NotificationSummary } from '@adatechnology/notification-contracts'\n\nimport { useNotificationContext } from '../NotificationProvider'\nimport { flattenNotificationPages, useMarkAllAsRead, useNotifications, useUnreadCount } from '../hooks/useNotifications'\nimport { NotificationItem } from './NotificationItem'\n\n/** Três linhas: o bastante para a lista já ter a forma dela antes de ter conteúdo. */\nconst SKELETON_ROWS = [0, 1, 2]\n\nexport type NotificationListProps = {\n readonly category?: string\n readonly onSelect?: (notification: NotificationSummary) => void\n readonly className?: string\n /**\n * Substitui o vazio padrão. Quem decide se está vazio é a lista — o host que desenhava o próprio\n * vazio ao lado dela mostrava \"nada por aqui\" embaixo das notificações que estavam ali.\n */\n readonly renderEmpty?: () => ReactNode\n /** Slot: o host troca a linha sem reimplementar a lista (regra §4.3, slots e overrides). */\n readonly components?: { readonly Item?: typeof NotificationItem }\n}\n\nexport function NotificationList({ category, onSelect, className, renderEmpty, components }: NotificationListProps) {\n const { messages, theme } = useNotificationContext()\n const query = useNotifications({ category })\n const { data: unreadCount = 0 } = useUnreadCount()\n const markAllAsRead = useMarkAllAsRead()\n\n const Item = components?.Item ?? NotificationItem\n const notifications = flattenNotificationPages(query.data?.pages)\n const isEmpty = !query.isPending && !query.isError && notifications.length === 0\n\n return (\n <section className={clsx('adn-list', theme.rootClassName, className)} aria-label={messages['list.title']}>\n <header className=\"adn-list__header\">\n <div className=\"adn-list__heading\">\n <h2 className=\"adn-list__title\">{messages['list.title']}</h2>\n {/* O contador estava só no sino. Quem abriu a tela pelo menu lateral não passou pelo sino,\n e ficava sem saber quantas ainda pedem atenção. */}\n {unreadCount > 0 ? (\n <span className=\"adn-list__count\" role=\"status\" aria-label={`${unreadCount} ${messages['list.unread']}`}>\n {unreadCount}\n </span>\n ) : null}\n </div>\n\n {unreadCount > 0 ? (\n <button\n type=\"button\"\n className=\"adn-list__bulk-action\"\n onClick={() => markAllAsRead.mutate()}\n disabled={markAllAsRead.isPending}\n >\n <CheckCheck className=\"adn-list__bulk-icon\" aria-hidden=\"true\" />\n {messages['list.markAllAsRead']}\n </button>\n ) : null}\n </header>\n\n {/* Esqueleto com a forma da linha real, em vez de \"Carregando…\" centralizado: o texto some e o\n conteúdo entra de altura diferente, e a tela pisca a cada carregamento. */}\n {query.isPending ? (\n <div className=\"adn-list__skeleton\" role=\"status\" aria-label={messages['list.loading']}>\n {SKELETON_ROWS.map((row) => (\n <span key={row} className=\"adn-list__skeleton-row\" />\n ))}\n </div>\n ) : null}\n\n {query.isError ? (\n <div className=\"adn-list__state adn-list__state--error\" role=\"alert\">\n <p>{messages['list.error']}</p>\n <button type=\"button\" className=\"adn-list__retry\" onClick={() => void query.refetch()}>\n <RotateCw className=\"adn-list__retry-icon\" aria-hidden=\"true\" />\n {messages['list.retry']}\n </button>\n </div>\n ) : null}\n\n {isEmpty\n ? (renderEmpty?.() ?? (\n <div className=\"adn-list__state adn-list__state--empty\">\n <Inbox className=\"adn-list__empty-icon\" aria-hidden=\"true\" />\n <p>{messages['list.empty']}</p>\n </div>\n ))\n : null}\n\n {notifications.length > 0 ? (\n <ul className=\"adn-list__items\">\n {notifications.map((notification) => (\n <Item key={notification.id} notification={notification} onSelect={onSelect} />\n ))}\n </ul>\n ) : null}\n\n {query.hasNextPage ? (\n <div className=\"adn-list__footer\">\n <button\n type=\"button\"\n className=\"adn-list__load-more\"\n onClick={() => void query.fetchNextPage()}\n disabled={query.isFetchingNextPage}\n >\n {messages['list.loadMore']}\n </button>\n </div>\n ) : null}\n </section>\n )\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n */\n\nimport { Check, Trash2 } from 'lucide-react'\nimport clsx from 'clsx'\nimport type { NotificationSummary } from '@adatechnology/notification-contracts'\n\nimport { useNotificationContext } from '../NotificationProvider'\nimport { formatNotificationTime, formatNotificationTimestamp } from '../format/notificationTime'\nimport { useDeleteNotification, useMarkAsRead } from '../hooks/useNotifications'\n\nexport type NotificationItemProps = {\n readonly notification: NotificationSummary\n readonly onSelect?: (notification: NotificationSummary) => void\n readonly className?: string\n}\n\nexport function NotificationItem({ notification, onSelect, className }: NotificationItemProps) {\n const { locale, messages } = useNotificationContext()\n const markAsRead = useMarkAsRead()\n const deleteNotification = useDeleteNotification()\n\n const isUnread = notification.readAt === undefined\n\n function handleSelect(): void {\n if (isUnread) markAsRead.mutate(notification.id)\n onSelect?.(notification)\n }\n\n return (\n <li className={clsx('adn-item', isUnread && 'adn-item--unread', className)}>\n {/* Semântico: a linha inteira é clicável e precisa ser alcançável por teclado — `button`\n entrega Enter, Espaço e foco de graça, e um `div` com onClick não (web.md §Acessibilidade). */}\n <button type=\"button\" className=\"adn-item__main\" onClick={handleSelect}>\n <span className=\"adn-item__heading\">\n {/* Marcador à esquerda, na altura do título: sobreposto ao canto, ele cobria a última\n palavra do texto em linha comprida. */}\n {isUnread ? <span className=\"adn-item__unread-dot\" aria-label={messages['item.unread']} /> : null}\n <span className=\"adn-item__title\">{notification.title}</span>\n {/* `<time>` e não `<span>`: a data legível por máquina é o que um leitor de tela e um\n agregador conseguem interpretar; o texto visível é o relativo, que é o que se lê. */}\n <time\n className=\"adn-item__time\"\n dateTime={notification.createdAt}\n title={formatNotificationTimestamp(notification.createdAt, locale)}\n >\n {formatNotificationTime(notification.createdAt, locale, new Date())}\n </time>\n </span>\n <span className=\"adn-item__body\">{notification.body}</span>\n </button>\n\n <div className=\"adn-item__actions\">\n {isUnread ? (\n <button\n type=\"button\"\n className=\"adn-item__action\"\n onClick={() => markAsRead.mutate(notification.id)}\n disabled={markAsRead.isPending}\n aria-label={messages['item.markAsRead']}\n title={messages['item.markAsRead']}\n >\n <Check className=\"adn-item__action-icon\" aria-hidden=\"true\" />\n </button>\n ) : null}\n\n <button\n type=\"button\"\n className=\"adn-item__action adn-item__action--danger\"\n onClick={() => deleteNotification.mutate(notification.id)}\n disabled={deleteNotification.isPending}\n aria-label={messages['item.delete']}\n title={messages['item.delete']}\n >\n {/* Ação destrutiva: ícone reforça o peso antes do clique (regra de ícones). */}\n <Trash2 className=\"adn-item__action-icon\" aria-hidden=\"true\" />\n </button>\n </div>\n </li>\n )\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n */\n\nimport { useState } from 'react'\nimport { Save } from 'lucide-react'\nimport clsx from 'clsx'\nimport type { NotificationPreference } from '@adatechnology/notification-contracts'\n\nimport { useNotificationContext } from '../NotificationProvider'\nimport { usePreferences, useUpdatePreferences } from '../hooks/usePreferences'\n\nexport type PreferencesPanelProps = {\n readonly className?: string\n}\n\nfunction channelLabelKey(channel: string): string {\n return `channel.${channel}`\n}\n\nexport function PreferencesPanel({ className }: PreferencesPanelProps) {\n const { messages, theme } = useNotificationContext()\n const { data: saved = [], isPending } = usePreferences()\n const updatePreferences = useUpdatePreferences()\n\n // Rascunho local só existe entre abrir e salvar: `undefined` significa \"ainda não mexeu\", e é o\n // que faz o painel refletir o servidor sem sobrescrever edição em andamento a cada refetch.\n const [draft, setDraft] = useState<NotificationPreference[] | undefined>(undefined)\n const preferences = draft ?? saved\n\n function toggleChannel(target: NotificationPreference): void {\n setDraft(\n preferences.map((preference) =>\n preference.category === target.category && preference.channel === target.channel\n ? { ...preference, enabled: !preference.enabled }\n : preference,\n ),\n )\n }\n\n function handleSave(): void {\n updatePreferences.mutate(preferences, { onSuccess: () => setDraft(undefined) })\n }\n\n if (isPending) return <p className=\"adn-preferences__state\">{messages['list.loading']}</p>\n\n return (\n <section className={clsx('adn-preferences', theme.rootClassName, className)}>\n <header className=\"adn-preferences__header\">\n <h2 className=\"adn-preferences__title\">{messages['preferences.title']}</h2>\n <p className=\"adn-preferences__description\">{messages['preferences.description']}</p>\n </header>\n\n {preferences.length === 0 ? (\n <p className=\"adn-preferences__state\">{messages['preferences.empty']}</p>\n ) : (\n <ul className=\"adn-preferences__items\">\n {preferences.map((preference) => {\n const inputId = `adn-pref-${preference.category}-${preference.channel}`\n return (\n <li key={inputId} className=\"adn-preferences__item\">\n {/* `label` associado por `htmlFor`: aumenta a área de toque e é o que faz o\n leitor de tela anunciar canal e estado juntos. */}\n <label className=\"adn-preferences__label\" htmlFor={inputId}>\n <input\n id={inputId}\n type=\"checkbox\"\n className=\"adn-preferences__checkbox\"\n checked={preference.enabled}\n onChange={() => toggleChannel(preference)}\n />\n <span className=\"adn-preferences__category\">{preference.category}</span>\n <span className=\"adn-preferences__channel\">\n {messages[channelLabelKey(preference.channel) as keyof typeof messages] ?? preference.channel}\n </span>\n </label>\n\n {preference.quietHoursStart && preference.quietHoursEnd ? (\n <span className=\"adn-preferences__quiet-hours\">\n {messages['preferences.quietHours']} {preference.quietHoursStart}{' '}\n {messages['preferences.quietHoursTo']} {preference.quietHoursEnd}\n </span>\n ) : null}\n </li>\n )\n })}\n </ul>\n )}\n\n <footer className=\"adn-preferences__footer\">\n {/* Ação primária de formulário com convenção clara → ícone (regra de ícones, web.md §9). */}\n <button\n type=\"button\"\n className=\"adn-preferences__save\"\n onClick={handleSave}\n disabled={updatePreferences.isPending || draft === undefined}\n >\n <Save className=\"adn-preferences__save-icon\" aria-hidden=\"true\" />\n {messages['preferences.save']}\n </button>\n\n {updatePreferences.isSuccess && draft === undefined ? (\n <span className=\"adn-preferences__feedback\" role=\"status\">\n {messages['preferences.saved']}\n </span>\n ) : null}\n {updatePreferences.isError ? (\n <span className=\"adn-preferences__feedback adn-preferences__feedback--error\" role=\"alert\">\n {messages['preferences.error']}\n </span>\n ) : null}\n </footer>\n </section>\n )\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n *\n * A tela de notificações COMPOSTA, no molde do `ConversationsWorkspace`.\n *\n * O pacote exportava só as peças (`NotificationList`, `PreferencesPanel`), e o primeiro consumidor\n * remontou o grid à mão — 56 linhas na página da inbox e 221 na de configuração, contra 35 da página\n * de Documentos, que consome workspace. É exatamente o que a regra de módulos plugáveis (§4) rejeita:\n * cada produto remontando o layout é como as telas divergiram antes.\n *\n * Customização por contrato, nunca por fork:\n * - vocabulário → `labels`\n * - UI do produto → slots `renderHeaderActions`, `renderAboveList`, `renderEmpty`\n * - regra de negócio → callbacks (`onSelectNotification`)\n * - **capacidade por ausência**: sem `settingsHref` não aparece link de configuração, sem\n * `showPreferences` não aparece a coluna. Nunca flag `hasX`.\n */\n\nimport type { ReactNode } from 'react'\nimport type { NotificationSummary } from '@adatechnology/notification-contracts'\n\nimport { useNotificationContext } from '../NotificationProvider'\nimport { NotificationList } from './NotificationList'\nimport { PreferencesPanel } from './PreferencesPanel'\n\nexport type NotificationsWorkspaceProps = {\n /** Sobrescreve textos pontuais sem trocar o locale inteiro. */\n readonly labels?: Partial<Record<string, string>>\n /** Filtra a inbox por assunto. Ausente, mostra tudo. */\n readonly category?: string\n /**\n * Coluna de preferências ao lado da inbox.\n *\n * Ligada por padrão porque é o caso comum; um produto que gerencia preferência noutra tela passa\n * `false` e fica só com a inbox, em largura cheia.\n */\n readonly showPreferences?: boolean\n /** Ausente, o link de configuração não aparece — o produto pode não ter essa tela. */\n readonly settingsHref?: string | undefined\n /** Clique numa notificação. Ausente, a linha não é clicável. */\n readonly onSelectNotification?: (notification: NotificationSummary) => void\n /**\n * Substitui o cabeçalho padrão inteiro.\n *\n * O workspace desenha um `<h1>` porque ele é a tela; a página que já tem o título dela passava a\n * ter dois `<h1>` dizendo a mesma palavra, e para leitor de tela duas primeiras manchetes é o\n * mesmo que nenhuma. Ausente, o padrão continua desenhando — slot é substituição, não interruptor.\n */\n readonly renderHeader?: () => ReactNode\n /** Ações do produto no cabeçalho, ao lado do link de configuração. */\n readonly renderHeaderActions?: () => ReactNode\n /** Aviso ou filtro do produto, entre o cabeçalho e a lista. */\n readonly renderAboveList?: () => ReactNode\n /** Substitui o vazio padrão — útil quando o produto sabe explicar por que está vazio. */\n readonly renderEmpty?: () => ReactNode\n readonly className?: string\n}\n\nexport function NotificationsWorkspace({\n labels: labelsOverride,\n category,\n showPreferences = true,\n settingsHref,\n onSelectNotification,\n renderHeader,\n renderHeaderActions,\n renderAboveList,\n renderEmpty,\n className,\n}: NotificationsWorkspaceProps) {\n const { messages } = useNotificationContext()\n const label = (key: string): string => labelsOverride?.[key] ?? (messages as Record<string, string>)[key] ?? key\n\n return (\n <div className={`adn-workspace ${className ?? ''}`}>\n {renderHeader ? (\n renderHeader()\n ) : (\n <header className=\"adn-workspace__header\">\n <div>\n <h1 className=\"adn-workspace__title\">{label('workspace.title')}</h1>\n <p className=\"adn-workspace__description\">{label('workspace.description')}</p>\n </div>\n\n <div className=\"adn-workspace__actions\">\n {renderHeaderActions?.()}\n {/* Capacidade por ausência: sem href, sem link. */}\n {settingsHref && (\n <a href={settingsHref} className=\"adn-button adn-button--outline\">\n {label('workspace.settingsLink')}\n </a>\n )}\n </div>\n </header>\n )}\n\n {renderAboveList?.()}\n\n <div className={showPreferences ? 'adn-workspace__grid' : 'adn-workspace__grid--single'}>\n <section className=\"adn-workspace__inbox\">\n {/* O vazio desce para a lista, que é quem sabe se está vazia. Desenhado aqui, ele aparecia\n ao lado das notificações — \"nada por aqui\" embaixo do que estava ali. */}\n <NotificationList\n {...(category ? { category } : {})}\n {...(onSelectNotification ? { onSelect: onSelectNotification } : {})}\n {...(renderEmpty ? { renderEmpty } : {})}\n />\n </section>\n\n {showPreferences && (\n <aside className=\"adn-workspace__aside\">\n <PreferencesPanel />\n </aside>\n )}\n </div>\n </div>\n )\n}\n","/**\n * Copyright (c) 2026 Ada Technology. MIT License.\n *\n * A tela de configuração COMPOSTA: canais por assunto e editor de mensagem com preview.\n *\n * Substitui as 221 linhas de página + 207 de hook que o primeiro consumidor escreveu. O que sobra\n * para o produto é dizer quais canais e assuntos existem — o resto é layout, e layout duplicado é\n * como as telas divergem.\n *\n * `channels` e `categories` são OBRIGATÓRIOS e vêm do produto porque o pacote não tem opinião sobre\n * eles: uma loja avisa status de pedido por WhatsApp, um banco avisa vencimento por e-mail, e o\n * `hint` de cada canal (\"exige template aprovado\", \"exige aparelho registrado\") é conhecimento do\n * produto sobre a própria operação.\n */\n\nimport { useState } from 'react'\nimport type { ReactNode } from 'react'\nimport type { NotificationPreference, NotificationTemplate } from '@adatechnology/notification-contracts'\n\nimport { useNotificationContext } from '../NotificationProvider'\nimport { usePreferences, useUpdatePreferences } from '../hooks/usePreferences'\nimport { useCategoryPolicies } from '../hooks/useCategoryPolicies'\nimport { useTemplateEditor } from '../hooks/useTemplateEditor'\nimport type { TemplateDraftField } from '../hooks/useTemplateEditor'\n\nexport type NotificationChannelOption = {\n readonly id: string\n readonly label: string\n /** O custo do canal, em uma linha. É o que faz alguém decidir em vez de chutar. */\n readonly hint?: string\n}\n\nexport type NotificationCategoryOption = {\n readonly id: string\n readonly label: string\n readonly hint?: string\n}\n\nexport type NotificationSettingsWorkspaceProps = {\n readonly labels?: Partial<Record<string, string>>\n /** Os canais que ESTE produto oferece — o pacote despacha em cinco e não opina sobre quais usar. */\n readonly channels: readonly NotificationChannelOption[]\n /** Os assuntos que este produto dispara. */\n readonly categories: readonly NotificationCategoryOption[]\n /**\n * Valores de exemplo do preview, por assunto do template. Ausente, o preview mostra campo vazio —\n * que é honesto, mas menos útil para quem está escrevendo o texto.\n */\n readonly previewPayload?: Readonly<Record<string, unknown>>\n /** Traduz `order.status.preparing` no rótulo que o produto usa. Ausente, mostra a chave crua. */\n readonly templateLabelOf?: (template: NotificationTemplate) => string\n /**\n * Campo extra por canal — é onde entra o nome do template aprovado na Meta, que só o WhatsApp tem.\n * Ausente, nenhum campo extra aparece.\n */\n readonly renderChannelFields?: (params: {\n readonly channel: string\n readonly value: string\n readonly onChange: (value: string) => void\n }) => ReactNode\n /** Substitui o cabeçalho padrão — a página que já tem título próprio evita o segundo `<h1>`. */\n readonly renderHeader?: () => ReactNode\n /** Ações do produto no cabeçalho. */\n readonly renderHeaderActions?: () => ReactNode\n readonly className?: string\n}\n\nexport function NotificationSettingsWorkspace({\n labels: labelsOverride,\n channels,\n categories,\n previewPayload,\n templateLabelOf,\n renderChannelFields,\n renderHeader,\n renderHeaderActions,\n className,\n}: NotificationSettingsWorkspaceProps) {\n const { messages } = useNotificationContext()\n const label = (key: string): string => labelsOverride?.[key] ?? (messages as Record<string, string>)[key] ?? key\n\n const preferencesQuery = usePreferences()\n const updatePreferences = useUpdatePreferences()\n const editor = useTemplateEditor({\n ...(previewPayload ? { previewPayload } : {}),\n ...(channels[0] ? { defaultChannel: channels[0].id } : {}),\n })\n\n /**\n * Onde inserir a variável. Guardado no `onSelect` dos campos porque o hook não pode conhecer o\n * DOM — e sem isso o clique na variável só saberia concatenar no fim, que é justamente o lugar\n * errado quando se está corrigindo o meio de uma frase.\n */\n const [cursor, setCursor] = useState<{ field: TemplateDraftField; cursorIndex: number }>({\n field: 'body',\n cursorIndex: 0,\n })\n\n function rememberCursor(field: TemplateDraftField, cursorIndex: number | null): void {\n setCursor({ field, cursorIndex: cursorIndex ?? 0 })\n }\n\n const policies = useCategoryPolicies()\n const [tab, setTab] = useState<'messages' | 'routing'>('messages')\n\n /**\n * Preferência ausente é o estado inicial normal — o módulo devolve só o que foi gravado. O default\n * é ligado: comportamento de fábrica é avisar, e um destinatário que não recebeu porque a linha não\n * existia é pior que um que recebeu demais.\n */\n function isEnabled(category: string, channel: string): boolean {\n const row = (preferencesQuery.data ?? []).find(\n (preference) => preference.category === category && preference.channel === channel,\n )\n return row?.enabled ?? true\n }\n\n function toggle(category: string, channel: string): void {\n // Conjunto inteiro: a rota é `PUT` em lote, e enviar só o que mudou apagaria o resto.\n const next: NotificationPreference[] = categories.flatMap((eachCategory) =>\n channels.map((eachChannel) => ({\n category: eachCategory.id,\n channel: eachChannel.id as NotificationPreference['channel'],\n enabled:\n eachCategory.id === category && eachChannel.id === channel\n ? !isEnabled(category, channel)\n : isEnabled(eachCategory.id, eachChannel.id),\n })),\n )\n updatePreferences.mutate(next)\n }\n\n return (\n <div className={`adn-settings ${className ?? ''}`}>\n {renderHeader ? (\n renderHeader()\n ) : (\n <header className=\"adn-settings__header\">\n <div>\n <h1 className=\"adn-settings__title\">{label('settings.title')}</h1>\n <p className=\"adn-settings__description\">{label('settings.description')}</p>\n </div>\n {renderHeaderActions?.()}\n </header>\n )}\n\n <div className=\"adn-settings__tabs\" role=\"tablist\">\n {(['messages', 'routing'] as const).map((id) => (\n <button\n key={id}\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === id}\n className={tab === id ? 'adn-settings__tab adn-settings__tab--active' : 'adn-settings__tab'}\n onClick={() => setTab(id)}\n >\n {label(`settings.tab.${id}`)}\n </button>\n ))}\n </div>\n\n {tab === 'routing' && (\n <section className=\"adn-settings__policies\">\n <h2 className=\"adn-settings__section-title\">{label('settings.policiesTitle')}</h2>\n <p className=\"adn-settings__hint\">{label('settings.policiesHint')}</p>\n\n {categories.map((category) => (\n <div key={category.id} className=\"adn-settings__category\">\n <p className=\"adn-settings__category-title\">{category.label}</p>\n <div className=\"adn-settings__category-channels\">\n {channels.map((channel) => (\n <label key={channel.id} className=\"adn-settings__toggle\">\n <input\n type=\"checkbox\"\n checked={policies.isAllowed({ category: category.id, channel: channel.id })}\n onChange={() => policies.toggle({ category: category.id, channel: channel.id })}\n />\n <span className=\"adn-settings__channel-label\">{channel.label}</span>\n </label>\n ))}\n </div>\n </div>\n ))}\n\n {policies.error && <p className=\"adn-settings__error\">{policies.error}</p>}\n\n <div className=\"adn-settings__actions\">\n <button type=\"button\" onClick={policies.save} disabled={!policies.isDirty || policies.isSaving}>\n {policies.isSaving ? label('settings.saving') : label('settings.savePolicies')}\n </button>\n {policies.isDirty && (\n <button type=\"button\" onClick={policies.reset}>\n {label('settings.discard')}\n </button>\n )}\n </div>\n </section>\n )}\n\n {tab === 'routing' && (\n <section className=\"adn-settings__channels\">\n <h2 className=\"adn-settings__section-title\">{label('settings.channelsTitle')}</h2>\n <p className=\"adn-settings__hint\">{label('settings.channelsHint')}</p>\n\n {categories.map((category) => (\n <div key={category.id} className=\"adn-settings__category\">\n <p className=\"adn-settings__category-label\">{category.label}</p>\n {category.hint && <p className=\"adn-settings__hint\">{category.hint}</p>}\n\n <div className=\"adn-settings__channel-grid\">\n {channels.map((channel) => (\n <label key={channel.id} className=\"adn-settings__channel\">\n <input\n type=\"checkbox\"\n checked={isEnabled(category.id, channel.id)}\n disabled={updatePreferences.isPending}\n onChange={() => toggle(category.id, channel.id)}\n />\n <span>\n <span className=\"adn-settings__channel-label\">{channel.label}</span>\n {channel.hint && <span className=\"adn-settings__hint\">{channel.hint}</span>}\n </span>\n </label>\n ))}\n </div>\n </div>\n ))}\n </section>\n )}\n\n {tab === 'messages' && (\n <div className=\"adn-settings__templates\">\n <section className=\"adn-settings__template-list\">\n <header className=\"adn-settings__list-header\">\n <div>\n <h2 className=\"adn-settings__section-title\">{label('settings.templatesTitle')}</h2>\n <p className=\"adn-settings__hint\">{label('settings.templatesHint')}</p>\n </div>\n <button type=\"button\" className=\"adn-settings__new\" onClick={editor.startNew}>\n {label('settings.newTemplate')}\n </button>\n </header>\n\n {editor.isLoading && <p className=\"adn-settings__hint\">{label('list.loading')}</p>}\n {!editor.isLoading && editor.templates.length === 0 && (\n <p className=\"adn-settings__hint\">{label('settings.templatesEmpty')}</p>\n )}\n\n <ul>\n {editor.templates.map((template) => (\n <li key={template.id} className=\"adn-settings__row\">\n <button\n type=\"button\"\n onClick={() => editor.select(template)}\n className={editor.selected?.id === template.id ? 'adn-settings__row--active' : undefined}\n >\n <span className=\"adn-settings__row-main\">\n <span className=\"adn-settings__row-title\">{templateLabelOf?.(template) ?? template.key}</span>\n <span className=\"adn-settings__row-body\">{template.body}</span>\n </span>\n <span className={`adn-settings__badge adn-settings__badge--${template.channel}`}>\n {label(`channel.${template.channel}`)}\n </span>\n <span className=\"adn-settings__version\">\n {label('settings.version')}\n {template.version}\n </span>\n </button>\n <button\n type=\"button\"\n className=\"adn-settings__remove\"\n aria-label={`${label('settings.remove')} ${template.key}`}\n disabled={editor.isDeactivating}\n onClick={() => editor.deactivate(template.id)}\n >\n {label('settings.remove')}\n </button>\n </li>\n ))}\n </ul>\n </section>\n\n <section className=\"adn-settings__editor\">\n {!editor.draft && <p className=\"adn-settings__hint\">{label('settings.pickTemplate')}</p>}\n\n {editor.draft && (\n <>\n <header className=\"adn-settings__editor-header\">\n <div>\n <h2 className=\"adn-settings__section-title\">\n {editor.selected ? (templateLabelOf?.(editor.selected) ?? editor.selected.key) : ''}\n </h2>\n <p className=\"adn-settings__hint\">\n {editor.draft.channel} · {editor.draft.locale} · {label('settings.version')}\n {editor.selected?.version}\n </p>\n </div>\n <button type=\"button\" onClick={editor.clear}>\n {label('settings.close')}\n </button>\n </header>\n\n {!editor.isIdentityLocked && (\n <div className=\"adn-settings__identity\">\n <label className=\"adn-settings__field\">\n <span className=\"adn-settings__field-label\">{label('settings.key')}</span>\n <span className=\"adn-settings__hint\">{label('settings.keyHint')}</span>\n <input value={editor.draft.key} onChange={(event) => editor.update({ key: event.target.value })} />\n </label>\n\n <label className=\"adn-settings__field\">\n <span className=\"adn-settings__field-label\">{label('settings.channel')}</span>\n <select\n value={editor.draft.channel}\n onChange={(event) => editor.update({ channel: event.target.value })}\n >\n {channels.map((channel) => (\n <option key={channel.id} value={channel.id}>\n {channel.label}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"adn-settings__field\">\n <span className=\"adn-settings__field-label\">{label('settings.locale')}</span>\n <input\n value={editor.draft.locale}\n onChange={(event) => editor.update({ locale: event.target.value })}\n />\n </label>\n </div>\n )}\n\n {editor.variables.length > 0 && (\n <div className=\"adn-settings__variables\">\n <p className=\"adn-settings__field-label\">{label('settings.variablesTitle')}</p>\n <p className=\"adn-settings__hint\">{label('settings.variablesHint')}</p>\n <ul>\n {editor.variables.map((variable) => {\n const used = editor.variableDiff.used.includes(variable.name)\n const missing = editor.variableDiff.missingRequired.includes(variable.name)\n return (\n <li key={variable.name}>\n <button\n type=\"button\"\n className={[\n 'adn-settings__variable',\n used ? 'adn-settings__variable--used' : '',\n missing ? 'adn-settings__variable--missing' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => editor.insertVariable({ ...cursor, name: variable.name })}\n >\n <span className=\"adn-settings__variable-name\">{`{{${variable.name}}}`}</span>\n <span className=\"adn-settings__hint\">{variable.example}</span>\n </button>\n </li>\n )\n })}\n </ul>\n </div>\n )}\n\n {editor.variableDiff.unknown.length > 0 && (\n <p className=\"adn-settings__error\">\n {label('settings.unknownVariables')} {editor.variableDiff.unknown.join(', ')}\n </p>\n )}\n\n <label className=\"adn-settings__field\">\n <span className=\"adn-settings__field-label\">{label('settings.subject')}</span>\n <span className=\"adn-settings__hint\">{label('settings.subjectHint')}</span>\n <input\n value={editor.draft.subject}\n onChange={(event) => editor.update({ subject: event.target.value })}\n onSelect={(event) => rememberCursor('subject', event.currentTarget.selectionStart)}\n />\n </label>\n\n <label className=\"adn-settings__field\">\n <span className=\"adn-settings__field-label\">{label('settings.body')}</span>\n <textarea\n rows={4}\n value={editor.draft.body}\n onChange={(event) => editor.update({ body: event.target.value })}\n onSelect={(event) => rememberCursor('body', event.currentTarget.selectionStart)}\n />\n </label>\n\n {/* Slot: campo que só um canal tem, e que o pacote não deve conhecer por nome. */}\n {renderChannelFields?.({\n channel: editor.draft.channel,\n value: editor.draft.whatsappTemplateName,\n onChange: (value) => editor.update({ whatsappTemplateName: value }),\n })}\n\n {editor.previews.length > 0 && (\n <div className=\"adn-settings__previews\">\n <p className=\"adn-settings__preview-title\">{label('settings.previewTitle')}</p>\n <div className=\"adn-settings__preview-frames\">\n {editor.previews.map((frame) => (\n <figure key={frame.viewport} className=\"adn-settings__preview\">\n <figcaption className=\"adn-settings__hint\">\n {label(`settings.viewport.${frame.viewport}`)} · {frame.width}px\n </figcaption>\n {/* Largura fixa é o ponto: é ela que revela o corte que só acontece num\n dos dois. O texto sai como nó de texto — nunca innerHTML, mesmo já\n escapado pelo renderer. */}\n <div className=\"adn-settings__preview-frame\" style={{ width: frame.width }}>\n <p className=\"adn-settings__preview-subject\">{frame.rendered.title}</p>\n <p className=\"adn-settings__preview-body\">{frame.rendered.body}</p>\n </div>\n {frame.rendered.constraints\n .filter((constraint) => constraint.exceeded)\n .map((constraint) => (\n <p key={constraint.field} className=\"adn-settings__preview-warning\">\n {label(`settings.constraint.${constraint.field}`)} {constraint.actual}/{constraint.limit}\n </p>\n ))}\n </figure>\n ))}\n </div>\n </div>\n )}\n\n {editor.error && <p className=\"adn-settings__error\">{editor.error}</p>}\n\n <div className=\"adn-settings__actions\">\n <button type=\"button\" onClick={editor.save} disabled={!editor.isDirty || !editor.canSave || editor.isSaving}>\n {editor.isSaving ? label('settings.saving') : label('settings.save')}\n </button>\n {/* Diz por que está desabilitado, em vez de deixar o botão inerte sem explicação. */}\n {!editor.isDirty && <span className=\"adn-settings__hint\">{label('settings.unchanged')}</span>}\n </div>\n </>\n )}\n </section>\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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","names":["clsx","clsx","jsx","jsxs","clsx","jsx","jsxs","clsx","clsx","jsx","jsxs","clsx","jsx","jsxs","useState","jsx","jsxs","useState"]}
|
package/dist/styles.css
CHANGED
|
@@ -67,9 +67,10 @@
|
|
|
67
67
|
.adn-list {
|
|
68
68
|
display: flex;
|
|
69
69
|
flex-direction: column;
|
|
70
|
-
gap: var(--adn-space-2);
|
|
71
70
|
background: var(--adn-color-surface);
|
|
71
|
+
border: 1px solid var(--adn-color-border);
|
|
72
72
|
border-radius: var(--adn-radius);
|
|
73
|
+
overflow: hidden;
|
|
73
74
|
}
|
|
74
75
|
.adn-list__header {
|
|
75
76
|
display: flex;
|
|
@@ -80,11 +81,28 @@
|
|
|
80
81
|
padding: var(--adn-space-3);
|
|
81
82
|
border-bottom: 1px solid var(--adn-color-border);
|
|
82
83
|
}
|
|
84
|
+
.adn-list__heading {
|
|
85
|
+
display: flex;
|
|
86
|
+
align-items: center;
|
|
87
|
+
gap: var(--adn-space-2);
|
|
88
|
+
}
|
|
83
89
|
.adn-list__title {
|
|
84
90
|
margin: 0;
|
|
85
91
|
font-size: 1rem;
|
|
86
92
|
font-weight: 600;
|
|
87
93
|
}
|
|
94
|
+
.adn-list__count {
|
|
95
|
+
min-width: 20px;
|
|
96
|
+
padding: 0 var(--adn-space-1);
|
|
97
|
+
border-radius: 9999px;
|
|
98
|
+
background: color-mix(in srgb, var(--adn-color-accent) 16%, transparent);
|
|
99
|
+
color: var(--adn-color-accent);
|
|
100
|
+
font-size: 0.75rem;
|
|
101
|
+
font-weight: 600;
|
|
102
|
+
line-height: 20px;
|
|
103
|
+
text-align: center;
|
|
104
|
+
font-variant-numeric: tabular-nums;
|
|
105
|
+
}
|
|
88
106
|
.adn-list__bulk-action,
|
|
89
107
|
.adn-list__retry,
|
|
90
108
|
.adn-list__load-more {
|
|
@@ -114,6 +132,38 @@
|
|
|
114
132
|
height: 16px;
|
|
115
133
|
color: currentColor;
|
|
116
134
|
}
|
|
135
|
+
.adn-list__skeleton {
|
|
136
|
+
display: flex;
|
|
137
|
+
flex-direction: column;
|
|
138
|
+
gap: var(--adn-space-3);
|
|
139
|
+
padding: var(--adn-space-3);
|
|
140
|
+
}
|
|
141
|
+
.adn-list__skeleton-row {
|
|
142
|
+
height: var(--adn-touch-target);
|
|
143
|
+
border-radius: var(--adn-radius);
|
|
144
|
+
background:
|
|
145
|
+
linear-gradient(
|
|
146
|
+
90deg,
|
|
147
|
+
color-mix(in srgb, var(--adn-color-muted) 10%, transparent),
|
|
148
|
+
color-mix(in srgb, var(--adn-color-muted) 22%, transparent),
|
|
149
|
+
color-mix(in srgb, var(--adn-color-muted) 10%, transparent));
|
|
150
|
+
background-size: 200% 100%;
|
|
151
|
+
animation: adn-skeleton 1.4s ease-in-out infinite;
|
|
152
|
+
}
|
|
153
|
+
@keyframes adn-skeleton {
|
|
154
|
+
from {
|
|
155
|
+
background-position: 200% 0;
|
|
156
|
+
}
|
|
157
|
+
to {
|
|
158
|
+
background-position: -200% 0;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
.adn-list__footer {
|
|
162
|
+
display: flex;
|
|
163
|
+
justify-content: center;
|
|
164
|
+
padding: var(--adn-space-3);
|
|
165
|
+
border-top: 1px solid var(--adn-color-border);
|
|
166
|
+
}
|
|
117
167
|
.adn-list__items {
|
|
118
168
|
display: flex;
|
|
119
169
|
flex-direction: column;
|
|
@@ -146,9 +196,18 @@
|
|
|
146
196
|
gap: var(--adn-space-2);
|
|
147
197
|
border-bottom: 1px solid var(--adn-color-border);
|
|
148
198
|
}
|
|
199
|
+
.adn-item:last-child {
|
|
200
|
+
border-bottom: none;
|
|
201
|
+
}
|
|
202
|
+
.adn-item:hover {
|
|
203
|
+
background: color-mix(in srgb, var(--adn-color-muted) 8%, transparent);
|
|
204
|
+
}
|
|
149
205
|
.adn-item--unread {
|
|
150
206
|
background: color-mix(in srgb, var(--adn-color-accent) 6%, transparent);
|
|
151
207
|
}
|
|
208
|
+
.adn-item--unread:hover {
|
|
209
|
+
background: color-mix(in srgb, var(--adn-color-accent) 12%, transparent);
|
|
210
|
+
}
|
|
152
211
|
.adn-item__main {
|
|
153
212
|
position: relative;
|
|
154
213
|
display: flex;
|
|
@@ -164,17 +223,37 @@
|
|
|
164
223
|
color: inherit;
|
|
165
224
|
text-align: left;
|
|
166
225
|
}
|
|
226
|
+
.adn-item__heading {
|
|
227
|
+
display: flex;
|
|
228
|
+
align-items: baseline;
|
|
229
|
+
gap: var(--adn-space-2);
|
|
230
|
+
width: 100%;
|
|
231
|
+
}
|
|
167
232
|
.adn-item__title {
|
|
233
|
+
flex: 1;
|
|
234
|
+
min-width: 0;
|
|
168
235
|
font-weight: 600;
|
|
236
|
+
overflow: hidden;
|
|
237
|
+
text-overflow: ellipsis;
|
|
238
|
+
white-space: nowrap;
|
|
239
|
+
}
|
|
240
|
+
.adn-item__time {
|
|
241
|
+
flex-shrink: 0;
|
|
242
|
+
color: var(--adn-color-muted);
|
|
243
|
+
font-size: 0.75rem;
|
|
244
|
+
font-variant-numeric: tabular-nums;
|
|
169
245
|
}
|
|
170
246
|
.adn-item__body {
|
|
171
247
|
color: var(--adn-color-muted);
|
|
172
248
|
font-size: 0.875rem;
|
|
249
|
+
display: -webkit-box;
|
|
250
|
+
-webkit-box-orient: vertical;
|
|
251
|
+
-webkit-line-clamp: 2;
|
|
252
|
+
overflow: hidden;
|
|
173
253
|
}
|
|
174
254
|
.adn-item__unread-dot {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
right: var(--adn-space-2);
|
|
255
|
+
flex-shrink: 0;
|
|
256
|
+
align-self: center;
|
|
178
257
|
width: 8px;
|
|
179
258
|
height: 8px;
|
|
180
259
|
background: var(--adn-color-accent);
|
|
@@ -311,6 +390,9 @@
|
|
|
311
390
|
.adn-list__bulk-action {
|
|
312
391
|
transition: none;
|
|
313
392
|
}
|
|
393
|
+
.adn-list__skeleton-row {
|
|
394
|
+
animation: none;
|
|
395
|
+
}
|
|
314
396
|
}
|
|
315
397
|
.adn-workspace,
|
|
316
398
|
.adn-settings {
|
|
@@ -567,4 +649,107 @@
|
|
|
567
649
|
opacity: 0.5;
|
|
568
650
|
cursor: default;
|
|
569
651
|
}
|
|
652
|
+
.adn-settings__list-header {
|
|
653
|
+
display: flex;
|
|
654
|
+
align-items: flex-start;
|
|
655
|
+
justify-content: space-between;
|
|
656
|
+
gap: var(--adn-space-3, 12px);
|
|
657
|
+
}
|
|
658
|
+
.adn-settings__row {
|
|
659
|
+
display: flex;
|
|
660
|
+
align-items: stretch;
|
|
661
|
+
gap: var(--adn-space-2, 8px);
|
|
662
|
+
}
|
|
663
|
+
.adn-settings__row > button:first-child {
|
|
664
|
+
flex: 1;
|
|
665
|
+
}
|
|
666
|
+
.adn-settings__remove {
|
|
667
|
+
color: var(--adn-color-danger);
|
|
668
|
+
}
|
|
669
|
+
.adn-settings__identity {
|
|
670
|
+
display: grid;
|
|
671
|
+
gap: var(--adn-space-3, 12px);
|
|
672
|
+
grid-template-columns: 1fr;
|
|
673
|
+
}
|
|
674
|
+
.adn-settings__variables ul {
|
|
675
|
+
display: flex;
|
|
676
|
+
flex-wrap: wrap;
|
|
677
|
+
gap: var(--adn-space-2, 8px);
|
|
678
|
+
margin: var(--adn-space-2, 8px) 0 0;
|
|
679
|
+
padding: 0;
|
|
680
|
+
list-style: none;
|
|
681
|
+
}
|
|
682
|
+
.adn-settings__variable {
|
|
683
|
+
display: flex;
|
|
684
|
+
flex-direction: column;
|
|
685
|
+
align-items: flex-start;
|
|
686
|
+
gap: var(--adn-space-1, 4px);
|
|
687
|
+
padding: var(--adn-space-2, 8px);
|
|
688
|
+
border: 1px solid var(--adn-color-border);
|
|
689
|
+
border-radius: var(--adn-radius);
|
|
690
|
+
}
|
|
691
|
+
.adn-settings__variable-name {
|
|
692
|
+
font-family:
|
|
693
|
+
ui-monospace,
|
|
694
|
+
SFMono-Regular,
|
|
695
|
+
Menlo,
|
|
696
|
+
monospace;
|
|
697
|
+
font-size: 0.8125rem;
|
|
698
|
+
}
|
|
699
|
+
.adn-settings__variable--used {
|
|
700
|
+
border-color: var(--adn-color-accent);
|
|
701
|
+
}
|
|
702
|
+
.adn-settings__variable--missing {
|
|
703
|
+
border-style: dashed;
|
|
704
|
+
border-color: var(--adn-color-danger);
|
|
705
|
+
}
|
|
706
|
+
.adn-settings__preview-frames {
|
|
707
|
+
display: flex;
|
|
708
|
+
flex-wrap: wrap;
|
|
709
|
+
gap: var(--adn-space-4, 16px);
|
|
710
|
+
overflow-x: auto;
|
|
711
|
+
margin: 0;
|
|
712
|
+
}
|
|
713
|
+
.adn-settings__preview-frames figure {
|
|
714
|
+
margin: 0;
|
|
715
|
+
}
|
|
716
|
+
.adn-settings__preview-frame {
|
|
717
|
+
max-width: 100%;
|
|
718
|
+
margin-top: var(--adn-space-2, 8px);
|
|
719
|
+
padding: var(--adn-space-3, 12px);
|
|
720
|
+
border: 1px solid var(--adn-color-border);
|
|
721
|
+
border-radius: var(--adn-radius);
|
|
722
|
+
background: color-mix(in srgb, var(--adn-color-muted) 8%, transparent);
|
|
723
|
+
}
|
|
724
|
+
.adn-settings__preview-warning {
|
|
725
|
+
margin: var(--adn-space-1, 4px) 0 0;
|
|
726
|
+
font-size: 0.75rem;
|
|
727
|
+
color: var(--adn-color-danger);
|
|
728
|
+
}
|
|
729
|
+
@media (min-width: 640px) {
|
|
730
|
+
.adn-settings__identity {
|
|
731
|
+
grid-template-columns: 2fr 1fr 1fr;
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
.adn-settings__tabs {
|
|
735
|
+
display: flex;
|
|
736
|
+
gap: var(--adn-space-2, 8px);
|
|
737
|
+
border-bottom: 1px solid var(--adn-color-border);
|
|
738
|
+
}
|
|
739
|
+
.adn-settings__tab {
|
|
740
|
+
padding: var(--adn-space-2, 8px) var(--adn-space-3, 12px);
|
|
741
|
+
border: 0;
|
|
742
|
+
border-bottom: 2px solid transparent;
|
|
743
|
+
background: none;
|
|
744
|
+
color: var(--adn-color-muted);
|
|
745
|
+
}
|
|
746
|
+
.adn-settings__tab--active {
|
|
747
|
+
border-bottom-color: var(--adn-color-accent);
|
|
748
|
+
color: var(--adn-color-text);
|
|
749
|
+
}
|
|
750
|
+
.adn-settings__category-channels {
|
|
751
|
+
display: flex;
|
|
752
|
+
flex-wrap: wrap;
|
|
753
|
+
gap: var(--adn-space-3, 12px);
|
|
754
|
+
}
|
|
570
755
|
/*# sourceMappingURL=styles.css.map */
|
package/dist/styles.css.map
CHANGED
|
@@ -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 gap: var(--adn-space-2);\n background: var(--adn-color-surface);\n border-radius: var(--adn-radius);\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__title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\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__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--unread {\n background: color-mix(in srgb, var(--adn-color-accent) 6%, 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__title {\n font-weight: 600;\n}\n\n.adn-item__body {\n color: var(--adn-color-muted);\n font-size: 0.875rem;\n}\n\n.adn-item__unread-dot {\n position: absolute;\n top: var(--adn-space-3);\n right: var(--adn-space-2);\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\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"],"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, #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":[]}
|