sanity-plugin-seofields 1.5.0 → 1.5.2
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/SeoHealthDashboard-KPBNXSL4.cjs +10 -0
- package/dist/{SeoHealthDashboard-3VBITMWT.cjs.map → SeoHealthDashboard-KPBNXSL4.cjs.map} +1 -1
- package/dist/SeoHealthDashboard-QKVB5HK3.js +4 -0
- package/dist/{SeoHealthDashboard-BNJBRQVN.js.map → SeoHealthDashboard-QKVB5HK3.js.map} +1 -1
- package/dist/{SeoHealthTool-MQBE5YGN.js → SeoHealthTool-EPPOEDTW.js} +3 -3
- package/dist/{SeoHealthTool-MQBE5YGN.js.map → SeoHealthTool-EPPOEDTW.js.map} +1 -1
- package/dist/{SeoHealthTool-4P6JST5S.cjs → SeoHealthTool-ON3SRXCF.cjs} +4 -4
- package/dist/{SeoHealthTool-4P6JST5S.cjs.map → SeoHealthTool-ON3SRXCF.cjs.map} +1 -1
- package/dist/chunk-G2SVI2SP.cjs +2043 -0
- package/dist/chunk-G2SVI2SP.cjs.map +1 -0
- package/dist/chunk-UCVSMPEJ.js +2037 -0
- package/dist/chunk-UCVSMPEJ.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/index.cjs +19 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +30 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +19 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/SeoHealthDashboard-3VBITMWT.cjs +0 -10
- package/dist/SeoHealthDashboard-BNJBRQVN.js +0 -4
- package/dist/chunk-DYVCCQHT.cjs +0 -1400
- package/dist/chunk-DYVCCQHT.cjs.map +0 -1
- package/dist/chunk-WUIZN7VI.js +0 -1394
- package/dist/chunk-WUIZN7VI.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/SeoHealthDashboard.tsx"],"names":["styled","keyframes","css","jsxs","jsx","useWorkspace","useIntentLink","usePaneRouter","Fragment","__spreadProps","useMemo","useClient","useState","useRef","useEffect","useCallback","e"],"mappings":"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","file":"chunk-G2SVI2SP.cjs","sourcesContent":["import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {useClient, useWorkspace} from 'sanity'\nimport {useIntentLink} from 'sanity/router'\nimport {usePaneRouter} from 'sanity/structure'\nimport styled, {css, keyframes} from 'styled-components'\n\nimport {DeprecationWarning, DocumentWithSeoHealth, SeoHealthMetrics} from '../types'\n\ntype ThemeMode = 'light' | 'dark' | 'system'\n\nconst themeVars = {\n light: {\n '--seo-bg': '#f0f2f5',\n '--seo-card-bg': '#ffffff',\n '--seo-text-primary': '#1f2937',\n '--seo-text-secondary': '#6b7280',\n '--seo-text-muted': '#9ca3af',\n '--seo-border': '#e5e7eb',\n '--seo-border-light': '#f3f4f6',\n '--seo-input-bg': '#f9fafb',\n '--seo-header-bg': '#f9fafb',\n '--seo-accent': '#6366f1',\n '--seo-accent-hover': '#4f46e5',\n '--seo-link': '#4f46e5',\n '--seo-link-hover': '#4338ca',\n '--seo-hover-bg': '#fafafa',\n '--seo-shadow': 'rgba(0, 0, 0, 0.07)',\n '--seo-shadow-hover': 'rgba(0, 0, 0, 0.1)',\n '--seo-focus-ring': 'rgba(99, 102, 241, 0.1)',\n '--seo-issue-color': '#ef4444',\n '--seo-more-issues': '#6b7280',\n '--seo-more-issues-hover': '#374151',\n '--seo-popover-bg': '#1f2937',\n '--seo-popover-text': '#ffffff',\n '--seo-spinner-track': '#e5e7eb',\n '--seo-spinner-fill': '#6366f1',\n '--seo-btn-bg': '#ffffff',\n '--seo-btn-text': '#374151',\n '--seo-btn-border': '#d1d5db',\n '--seo-btn-hover-bg': '#f3f4f6',\n '--seo-btn-hover-border': '#9ca3af',\n '--seo-select-arrow': '%236b7280',\n '--seo-score-excellent-bg': '#d1fae5',\n '--seo-score-excellent-text': '#065f46',\n '--seo-score-good-bg': '#fef3c7',\n '--seo-score-good-text': '#92400e',\n '--seo-score-fair-bg': '#ffedd5',\n '--seo-score-fair-text': '#9a3412',\n '--seo-score-poor-bg': '#fee2e2',\n '--seo-score-poor-text': '#991b1b',\n '--seo-preview-bg': '#fef3c7',\n '--seo-preview-text': '#92400e',\n '--seo-deprecation-bg': '#fffbeb',\n '--seo-deprecation-border': '#fcd34d',\n '--seo-deprecation-text': '#78350f',\n '--seo-deprecation-link': '#92400e',\n '--seo-upgrade-bg': '#ffffff',\n '--seo-upgrade-border': '#e5e7eb',\n '--seo-upgrade-code-bg': '#f3f4f6',\n '--seo-upgrade-code-text': '#374151',\n '--seo-upgrade-code-border': '#e5e7eb',\n '--seo-warning-bg': '#fef3c7',\n '--seo-warning-border': '#fcd34d',\n '--seo-warning-text': '#92400e',\n '--seo-theme-picker-bg': '#ffffff',\n '--seo-theme-picker-border': '#e5e7eb',\n '--seo-theme-picker-active': '#f0f0ff',\n '--seo-theme-picker-active-border': '#6366f1',\n } as Record<string, string>,\n dark: {\n '--seo-bg': '#1a1b1e',\n '--seo-card-bg': '#25262b',\n '--seo-text-primary': '#c9cdd3',\n '--seo-text-secondary': '#8b919a',\n '--seo-text-muted': '#6b7280',\n '--seo-border': '#373a40',\n '--seo-border-light': '#2c2e33',\n '--seo-input-bg': '#2c2e33',\n '--seo-header-bg': '#2c2e33',\n '--seo-accent': '#818cf8',\n '--seo-accent-hover': '#6366f1',\n '--seo-link': '#818cf8',\n '--seo-link-hover': '#a5b4fc',\n '--seo-hover-bg': '#2c2e33',\n '--seo-shadow': 'rgba(0, 0, 0, 0.25)',\n '--seo-shadow-hover': 'rgba(0, 0, 0, 0.35)',\n '--seo-focus-ring': 'rgba(129, 140, 248, 0.15)',\n '--seo-issue-color': '#f87171',\n '--seo-more-issues': '#8b919a',\n '--seo-more-issues-hover': '#c9cdd3',\n '--seo-popover-bg': '#373a40',\n '--seo-popover-text': '#e5e7eb',\n '--seo-spinner-track': '#373a40',\n '--seo-spinner-fill': '#818cf8',\n '--seo-btn-bg': '#2c2e33',\n '--seo-btn-text': '#c9cdd3',\n '--seo-btn-border': '#373a40',\n '--seo-btn-hover-bg': '#373a40',\n '--seo-btn-hover-border': '#4b5058',\n '--seo-select-arrow': '%238b919a',\n '--seo-score-excellent-bg': '#064e3b',\n '--seo-score-excellent-text': '#6ee7b7',\n '--seo-score-good-bg': '#78350f',\n '--seo-score-good-text': '#fcd34d',\n '--seo-score-fair-bg': '#7c2d12',\n '--seo-score-fair-text': '#fdba74',\n '--seo-score-poor-bg': '#7f1d1d',\n '--seo-score-poor-text': '#fca5a5',\n '--seo-preview-bg': '#78350f',\n '--seo-preview-text': '#fcd34d',\n '--seo-deprecation-bg': '#422006',\n '--seo-deprecation-border': '#a16207',\n '--seo-deprecation-text': '#fcd34d',\n '--seo-deprecation-link': '#fbbf24',\n '--seo-upgrade-bg': '#25262b',\n '--seo-upgrade-border': '#373a40',\n '--seo-upgrade-code-bg': '#2c2e33',\n '--seo-upgrade-code-text': '#c9cdd3',\n '--seo-upgrade-code-border': '#373a40',\n '--seo-warning-bg': '#422006',\n '--seo-warning-border': '#a16207',\n '--seo-warning-text': '#fcd34d',\n '--seo-theme-picker-bg': '#25262b',\n '--seo-theme-picker-border': '#373a40',\n '--seo-theme-picker-active': '#2d2d44',\n '--seo-theme-picker-active-border': '#818cf8',\n } as Record<string, string>,\n}\n\nconst DashboardContainer = styled.div`\n width: 100%;\n min-height: 100%;\n background: var(--seo-bg);\n padding: 28px 32px;\n box-sizing: border-box;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n color: var(--seo-text-primary);\n`\n\nconst PageHeader = styled.div`\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 28px;\n`\n\nconst PageTitle = styled.h1`\n margin: 0 0 6px 0;\n font-size: 22px;\n font-weight: 700;\n color: var(--seo-text-primary);\n letter-spacing: -0.3px;\n display: flex;\n align-items: center;\n gap: 10px;\n`\n\nconst PreviewBadge = styled.span`\n display: inline-block;\n background: var(--seo-preview-bg);\n color: var(--seo-preview-text);\n font-size: 11px;\n font-weight: 600;\n padding: 4px 8px;\n border-radius: 4px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-left: 8px;\n`\n\nconst PageSubtitle = styled.p`\n margin: 0;\n font-size: 13px;\n color: var(--seo-text-secondary);\n`\n\nconst StatsGrid = styled.div`\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));\n gap: 14px;\n margin-bottom: 20px;\n`\n\nconst StatCard = styled.div<{$accent?: string}>`\n background: var(--seo-card-bg);\n border-radius: 10px;\n padding: 16px 18px;\n box-shadow:\n 0 1px 3px var(--seo-shadow),\n 0 1px 2px var(--seo-shadow);\n border-left: ${(p) => (p.$accent ? `4px solid ${p.$accent}` : '4px solid transparent')};\n transition: box-shadow 0.15s ease;\n\n &:hover {\n box-shadow: 0 4px 12px var(--seo-shadow-hover);\n }\n`\n\nconst StatLabel = styled.div`\n font-size: 11px;\n font-weight: 500;\n color: var(--seo-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n`\n\nconst StatValue = styled.div`\n font-size: 26px;\n font-weight: 700;\n color: var(--seo-text-primary);\n line-height: 1;\n`\n\nconst ControlsBar = styled.div`\n background: var(--seo-card-bg);\n border-radius: 10px;\n padding: 14px 18px;\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n margin-bottom: 20px;\n box-shadow: 0 1px 3px var(--seo-shadow);\n`\n\nconst SearchWrapper = styled.div`\n position: relative;\n flex: 1;\n min-width: 220px;\n`\n\nconst SearchIconSvg = styled.span`\n position: absolute;\n left: 11px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--seo-text-muted);\n display: flex;\n align-items: center;\n pointer-events: none;\n`\n\nconst SearchInput = styled.input`\n width: 100%;\n height: 36px;\n padding: 0 12px 0 34px;\n border: 1px solid var(--seo-border);\n border-radius: 7px;\n font-size: 13px;\n color: var(--seo-text-primary);\n background: var(--seo-input-bg);\n box-sizing: border-box;\n outline: none;\n transition:\n border-color 0.15s,\n background 0.15s;\n\n &::placeholder {\n color: var(--seo-text-muted);\n }\n\n &:focus {\n border-color: var(--seo-accent);\n background: var(--seo-card-bg);\n box-shadow: 0 0 0 3px var(--seo-focus-ring);\n }\n`\n\nconst StyledSelect = styled.select`\n height: 36px;\n padding: 0 32px 0 12px;\n border: 1px solid var(--seo-border);\n border-radius: 7px;\n font-size: 13px;\n color: var(--seo-text-secondary);\n background: var(--seo-input-bg)\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%236b7280' d='M6 8L1 3h10z'/%3E%3C/svg%3E\")\n no-repeat right 10px center;\n appearance: none;\n outline: none;\n cursor: pointer;\n transition: border-color 0.15s;\n\n &:focus {\n border-color: var(--seo-accent);\n background-color: var(--seo-card-bg);\n box-shadow: 0 0 0 3px var(--seo-focus-ring);\n }\n`\n\nconst TableCard = styled.div`\n background: var(--seo-card-bg);\n border-radius: 10px;\n box-shadow: 0 1px 3px var(--seo-shadow);\n overflow: hidden;\n`\n\nconst TableHeader = styled.div`\n display: flex;\n align-items: center;\n padding: 11px 20px;\n background: var(--seo-header-bg);\n border-bottom: 1px solid var(--seo-border);\n font-size: 11px;\n font-weight: 600;\n color: var(--seo-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n gap: 12px;\n`\n\nconst TableRow = styled.div`\n display: flex;\n align-items: center;\n padding: 13px 20px;\n border-bottom: 1px solid var(--seo-border-light);\n gap: 12px;\n transition: background 0.1s;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: var(--seo-hover-bg);\n }\n`\n\nconst ColTitle = styled.div`\n flex: 2;\n min-width: 0;\n`\n\nconst TitleWrapper = styled.div`\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n min-width: 0;\n`\n\n/* Constrains the title + doc-id block so text-overflow works inside flex */\nconst TitleCell = styled.div`\n min-width: 0;\n overflow: hidden;\n flex: 1;\n`\n\nconst ColType = styled.div`\n flex: 0.8;\n min-width: 80px;\n`\n\nconst ColScore = styled.div`\n flex: 0.6;\n min-width: 70px;\n`\n\nconst ColIssues = styled.div`\n flex: 2;\n min-width: 0;\n`\n\nconst DocTitleLink = styled.a`\n font-size: 13px;\n font-weight: 600;\n color: var(--seo-link);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-decoration: none;\n display: block;\n transition: color 0.15s;\n\n &:hover {\n color: var(--seo-link-hover);\n text-decoration: underline;\n }\n`\n\nconst DocId = styled.div`\n font-size: 11px;\n color: var(--seo-text-muted);\n margin-top: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n`\n\nconst TypeBadge = styled.span<{$bgColor?: string; $textColor?: string}>`\n display: inline-block;\n padding: 3px 8px;\n border-radius: 5px;\n font-size: 11px;\n font-weight: 500;\n background: ${(p) => p.$bgColor || '#ede9fe'};\n color: ${(p) => p.$textColor || '#5b21b6'};\n`\n\nconst TypeText = styled.span`\n font-size: 12px;\n font-weight: 500;\n color: var(--seo-text-secondary);\n`\n\nconst CustomBadge = styled.span<{$bgColor?: string; $textColor?: string; $fontSize?: string}>`\n display: inline-block;\n padding: 2px 6px;\n border-radius: 4px;\n font-size: ${(p) => p.$fontSize || '10px'};\n font-weight: 600;\n background: ${(p) => p.$bgColor || '#e0e7ff'};\n color: ${(p) => p.$textColor || '#3730a3'};\n white-space: nowrap;\n`\n\nconst ScoreBadge = styled.span<{$score: number}>`\n display: inline-block;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 700;\n background: ${(p) => {\n if (p.$score >= 80) return 'var(--seo-score-excellent-bg)'\n if (p.$score >= 60) return 'var(--seo-score-good-bg)'\n if (p.$score >= 40) return 'var(--seo-score-fair-bg)'\n return 'var(--seo-score-poor-bg)'\n }};\n color: ${(p) => {\n if (p.$score >= 80) return 'var(--seo-score-excellent-text)'\n if (p.$score >= 60) return 'var(--seo-score-good-text)'\n if (p.$score >= 40) return 'var(--seo-score-fair-text)'\n return 'var(--seo-score-poor-text)'\n }};\n`\n\nconst IssueTag = styled.div`\n font-size: 11px;\n color: var(--seo-issue-color);\n line-height: 1.5;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n`\n\nconst NonStringTitleWarning = styled.div`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n margin-top: 4px;\n padding: 2px 7px;\n border-radius: 4px;\n background: var(--seo-warning-bg);\n border: 1px solid var(--seo-warning-border);\n font-size: 10px;\n font-weight: 600;\n color: var(--seo-warning-text);\n line-height: 1.4;\n cursor: default;\n white-space: normal;\n`\n\nconst MoreIssues = styled.div`\n font-size: 11px;\n color: var(--seo-more-issues);\n cursor: pointer;\n transition: color 0.15s;\n\n &:hover {\n color: var(--seo-more-issues-hover);\n }\n`\n\nconst MoreIssuesWrapper = styled.div`\n position: relative;\n display: inline-block;\n`\n\nconst IssuesPopover = styled.div<{\n $left?: number\n}>`\n position: fixed;\n bottom: auto;\n left: 0;\n transform: translateY(calc(-100% - 14px));\n background: var(--seo-popover-bg);\n color: var(--seo-popover-text);\n padding: 12px;\n border-radius: 8px;\n font-size: 12px;\n z-index: 50;\n box-shadow: 0 10px 25px var(--seo-shadow-hover);\n width: 280px;\n word-break: break-word;\n line-height: 1.5;\n\n &::after {\n content: '';\n position: absolute;\n bottom: -6px;\n left: 12px;\n width: 0;\n height: 0;\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-top: 6px solid var(--seo-popover-bg);\n }\n`\n\nconst PopoverIssueItem = styled.div`\n display: flex;\n gap: 6px;\n margin-bottom: 6px;\n\n &:last-child {\n margin-bottom: 0;\n }\n`\n\nconst UpgradeContainer = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100%;\n padding: 60px 24px;\n`\n\nconst UpgradeBox = styled.div`\n background: var(--seo-upgrade-bg);\n border-radius: 16px;\n padding: 48px 40px;\n max-width: 480px;\n width: 100%;\n text-align: center;\n box-shadow:\n 0 4px 24px var(--seo-shadow),\n 0 1px 4px var(--seo-shadow);\n border: 1px solid var(--seo-upgrade-border);\n`\n\nconst UpgradeLock = styled.div`\n font-size: 40px;\n margin-bottom: 16px;\n`\n\nconst UpgradeTitle = styled.h2`\n margin: 0 0 10px;\n font-size: 20px;\n font-weight: 700;\n color: var(--seo-text-primary);\n`\n\nconst UpgradeText = styled.p`\n margin: 0 0 20px;\n font-size: 14px;\n color: var(--seo-text-secondary);\n line-height: 1.6;\n`\n\nconst UpgradeCode = styled.pre`\n background: var(--seo-upgrade-code-bg);\n border-radius: 8px;\n padding: 14px 16px;\n font-size: 12px;\n color: var(--seo-upgrade-code-text);\n text-align: left;\n margin: 0 0 24px;\n overflow-x: auto;\n line-height: 1.6;\n border: 1px solid var(--seo-upgrade-code-border);\n`\n\nconst UpgradeButton = styled.a`\n display: inline-block;\n background: var(--seo-accent);\n color: #ffffff;\n font-size: 14px;\n font-weight: 600;\n padding: 10px 24px;\n border-radius: 8px;\n text-decoration: none;\n transition: background 0.15s;\n\n &:hover {\n background: var(--seo-accent-hover);\n }\n`\n\nconst ReloadButton = styled.button`\n display: inline-block;\n background: transparent;\n color: var(--seo-text-secondary);\n font-size: 13px;\n font-weight: 500;\n padding: 8px 20px;\n border-radius: 8px;\n border: 1px solid var(--seo-btn-border);\n cursor: pointer;\n margin-top: 10px;\n transition:\n background 0.15s,\n color 0.15s,\n border-color 0.15s;\n\n &:hover {\n background: var(--seo-btn-hover-bg);\n color: var(--seo-text-primary);\n border-color: var(--seo-btn-hover-border);\n }\n`\n\nconst spin = keyframes`\n to { transform: rotate(360deg); }\n`\n\nconst DashboardRefreshButton = styled.button<{$spinning?: boolean}>`\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: var(--seo-btn-bg);\n color: var(--seo-btn-text);\n font-size: 13px;\n font-weight: 500;\n padding: 8px 14px;\n border-radius: 8px;\n border: 1px solid var(--seo-btn-border);\n cursor: pointer;\n flex-shrink: 0;\n transition:\n background 0.15s,\n color 0.15s,\n border-color 0.15s,\n box-shadow 0.15s;\n box-shadow: 0 1px 2px var(--seo-shadow);\n\n svg {\n animation: ${(p) =>\n p.$spinning\n ? css`\n ${spin} 0.7s linear infinite\n `\n : 'none'};\n }\n\n &:hover {\n background: var(--seo-btn-hover-bg);\n border-color: var(--seo-btn-hover-border);\n box-shadow: 0 2px 6px var(--seo-shadow);\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n`\n\nconst ThemeSwitcher = styled.div`\n display: inline-flex;\n align-items: center;\n gap: 3px;\n background: var(--seo-theme-picker-bg);\n border: 1px solid var(--seo-theme-picker-border);\n border-radius: 9px;\n padding: 3px;\n flex-shrink: 0;\n box-shadow: 0 1px 3px var(--seo-shadow);\n`\n\nconst getThemeButtonActiveStyles = (theme: 'light' | 'dark' | 'system') => {\n switch (theme) {\n case 'light':\n return css`\n background: #fff4ed;\n border: 1.5px solid #f97316;\n color: #ea6c0a;\n box-shadow:\n 0 0 0 2px rgba(249, 115, 22, 0.15),\n 0 1px 3px rgba(0, 0, 0, 0.08);\n `\n case 'dark':\n return css`\n background: #eff6ff;\n border: 1.5px solid #3b82f6;\n color: #2563eb;\n box-shadow:\n 0 0 0 2px rgba(59, 130, 246, 0.15),\n 0 1px 3px rgba(0, 0, 0, 0.08);\n `\n case 'system':\n return css`\n background: #f0fdf4;\n border: 1.5px solid #22c55e;\n color: #16a34a;\n box-shadow:\n 0 0 0 2px rgba(34, 197, 94, 0.15),\n 0 1px 3px rgba(0, 0, 0, 0.08);\n `\n default:\n return css`\n background: #f0fdf4;\n border: 1.5px solid #22c55e;\n color: #16a34a;\n box-shadow:\n 0 0 0 2px rgba(34, 197, 94, 0.15),\n 0 1px 3px rgba(0, 0, 0, 0.08);\n `\n }\n}\n\nconst getThemeButtonHoverStyles = (theme: 'light' | 'dark' | 'system') => {\n switch (theme) {\n case 'light':\n return css`\n background: #fff4ed;\n border-color: rgba(249, 115, 22, 0.2);\n color: #ea6c0a;\n `\n case 'dark':\n return css`\n background: #eff6ff;\n border-color: rgba(59, 130, 246, 0.2);\n color: #2563eb;\n `\n case 'system':\n return css`\n background: #f0fdf4;\n border-color: rgba(34, 197, 94, 0.2);\n color: #16a34a;\n `\n default:\n return css`\n background: #f0fdf4;\n border-color: rgba(34, 197, 94, 0.2);\n color: #16a34a;\n `\n }\n}\n\nconst ThemeButton = styled.button<{$active?: boolean; $theme: 'light' | 'dark' | 'system'}>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 28px;\n border-radius: 6px;\n position: relative;\n cursor: pointer;\n padding: 0;\n transition:\n background 0.18s,\n color 0.18s,\n border-color 0.18s,\n box-shadow 0.18s;\n\n /* Per-theme active colours */\n ${(p) =>\n p.$active\n ? getThemeButtonActiveStyles(p.$theme)\n : css`\n background: transparent;\n border: 1.5px solid transparent;\n color: var(--seo-text-muted);\n `}\n\n &:hover {\n ${(p) => (p.$active ? '' : getThemeButtonHoverStyles(p.$theme))}\n }\n\n svg {\n width: 14px;\n height: 14px;\n }\n`\n\nconst SunIcon: React.FC = () => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"5\" />\n <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\" />\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\" />\n <line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\" />\n <line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\" />\n <line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\" />\n <line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\" />\n <line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\" />\n <line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\" />\n </svg>\n)\n\nconst MoonIcon: React.FC = () => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" />\n </svg>\n)\n\nconst MonitorIcon: React.FC = () => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\" />\n <line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\" />\n <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\" />\n </svg>\n)\n\n// Sub-component so useIntentLink can be called at the top level of a component (not inside .map)\nconst DocTitleAnchor: React.FC<{\n id: string\n type: string\n structureTool?: string\n children: React.ReactNode\n}> = ({id, type, structureTool, children}) => {\n const {basePath} = useWorkspace()\n const {onClick: intentOnClick, href: intentHref} = useIntentLink({\n intent: 'edit',\n params: {id, type},\n })\n // When a specific structure tool name is provided, build a tool-scoped intent URL so that\n // Sanity routes directly to that tool instead of letting the router pick the first match.\n const href = structureTool\n ? `${basePath}/${structureTool}/intent/edit/id=${id};type=${type}/`\n : intentHref\n const onClick = structureTool ? undefined : intentOnClick\n return (\n <DocTitleLink href={href} onClick={onClick} title=\"Open document\">\n {children}\n </DocTitleLink>\n )\n}\n\n// Wrapper that applies DocTitleLink styles to the ChildLink <a> rendered by Sanity's pane router\nconst PaneLinkWrapper = styled.span`\n display: block;\n min-width: 0;\n overflow: hidden;\n\n a {\n font-size: 13px;\n font-weight: 600;\n color: var(--seo-link);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-decoration: none;\n display: block;\n transition: color 0.15s;\n\n &:hover {\n color: var(--seo-link-hover);\n text-decoration: underline;\n }\n }\n`\n\n// Sub-component for desk-structure split-pane navigation.\n// Uses ChildLink from usePaneRouter to open the document editor to the right\n// while keeping the SEO Health pane visible on the left.\nconst DocTitleAnchorPane: React.FC<{id: string; type: string; children: React.ReactNode}> = ({\n id,\n type,\n children,\n}) => {\n const {ChildLink} = usePaneRouter()\n return (\n <PaneLinkWrapper>\n <ChildLink childId={id} childParameters={{type}}>\n {children}\n </ChildLink>\n </PaneLinkWrapper>\n )\n}\n\n// Sub-component to safely call docBadge outside a .map expression\nconst DocBadgeRenderer: React.FC<{\n doc: DocumentWithSeoHealth & Record<string, unknown>\n docBadge: (\n doc: DocumentWithSeoHealth & Record<string, unknown>,\n ) => {label: string; bgColor?: string; textColor?: string; fontSize?: string} | undefined\n}> = ({doc, docBadge}) => {\n const badge = docBadge(doc)\n if (!badge) return null\n return (\n <CustomBadge $bgColor={badge.bgColor} $textColor={badge.textColor} $fontSize={badge.fontSize}>\n {badge.label}\n </CustomBadge>\n )\n}\n\nconst Spinner = styled.div`\n width: 28px;\n height: 28px;\n border: 3px solid var(--seo-spinner-track);\n border-top-color: var(--seo-spinner-fill);\n border-radius: 50%;\n animation: ${spin} 0.7s linear infinite;\n margin: 0 auto 12px;\n`\n\nconst LoadingState = styled.div`\n padding: 48px 24px;\n text-align: center;\n color: var(--seo-text-secondary);\n font-size: 13px;\n`\n\nconst EmptyState = styled.div`\n padding: 48px 24px;\n text-align: center;\n color: var(--seo-text-muted);\n font-size: 13px;\n`\n\nconst DeprecationBanner = styled.div`\n background: var(--seo-deprecation-bg);\n border: 1px solid var(--seo-deprecation-border);\n border-radius: 8px;\n padding: 10px 14px;\n font-size: 12px;\n color: var(--seo-deprecation-text);\n margin-bottom: 16px;\n line-height: 1.6;\n`\n\nconst DeprecationBannerLink = styled.a`\n color: var(--seo-deprecation-link);\n font-weight: 600;\n text-decoration: underline;\n &:hover {\n color: var(--seo-deprecation-text);\n }\n`\n\nconst ExportButton = styled.button`\n display: inline-flex;\n align-items: center;\n gap: 5px;\n background: var(--seo-btn-bg);\n color: var(--seo-btn-text);\n font-size: 12px;\n font-weight: 500;\n padding: 6px 11px;\n border-radius: 7px;\n border: 1px solid var(--seo-btn-border);\n cursor: pointer;\n flex-shrink: 0;\n transition:\n background 0.15s,\n color 0.15s,\n border-color 0.15s;\n\n &:hover {\n background: var(--seo-btn-hover-bg);\n border-color: var(--seo-btn-hover-border);\n }\n`\n\nconst PaginationBar = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 10px;\n background: var(--seo-card-bg);\n border-top: 1px solid var(--seo-border);\n padding: 10px 20px;\n font-size: 12px;\n color: var(--seo-text-secondary);\n`\n\nconst PaginationCenter = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n`\n\nconst PaginationButton = styled.button`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border-radius: 6px;\n border: 1px solid var(--seo-border);\n background: var(--seo-btn-bg);\n color: var(--seo-btn-text);\n font-size: 13px;\n cursor: pointer;\n transition:\n background 0.15s,\n border-color 0.15s;\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n &:not(:disabled):hover {\n background: var(--seo-btn-hover-bg);\n border-color: var(--seo-btn-hover-border);\n }\n`\n\nconst StatsRow = styled.div`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 6px;\n margin-bottom: 20px;\n`\n\nconst StatPill = styled.span`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 8px 12px;\n border-radius: 10px;\n font-size: 12px;\n font-weight: 600;\n background: var(--seo-card-bg);\n border: 1px solid var(--seo-border);\n color: var(--seo-text-secondary);\n`\n\n/**\n * Color palette for dynamic document type badges\n * Colors are randomly assigned based on type hash for visual variety\n * while maintaining consistency across sessions\n */\nconst TYPE_COLOR_PALETTE: Array<{bg: string; text: string}> = [\n {bg: '#dbeafe', text: '#0c4a6e'}, // Blue\n {bg: '#dcfce7', text: '#14532d'}, // Green\n {bg: '#fce7f3', text: '#500724'}, // Pink\n {bg: '#fed7aa', text: '#7c2d12'}, // Orange\n {bg: '#e9d5ff', text: '#581c87'}, // Purple\n {bg: '#f3e8ff', text: '#3f0f5c'}, // Deep Purple\n {bg: '#ccfbf1', text: '#134e4a'}, // Teal\n {bg: '#ddd6fe', text: '#3730a3'}, // Indigo\n {bg: '#fca5a5', text: '#7f1d1d'}, // Red\n {bg: '#a7f3d0', text: '#065f46'}, // Emerald\n {bg: '#fbbf24', text: '#78350f'}, // Amber\n {bg: '#c4b5fd', text: '#3b0764'}, // Violet\n {bg: '#f0fdf4', text: '#15803d'}, // Light Green\n {bg: '#fef2f2', text: '#991b1b'}, // Light Red\n {bg: '#f5f3ff', text: '#5b21b6'}, // Light Purple\n {bg: '#fffbeb', text: '#92400e'}, // Light Amber\n]\n\n/**\n * Get dynamic color for a document type based on type name hash\n * Same type always gets the same color, but assignment is not fixed\n */\nconst getTypeColor = (type: string): {bg: string; text: string} => {\n // Generate consistent hash from type string using simple arithmetic\n let hash = 0\n for (let i = 0; i < type.length; i += 1) {\n const char = type.charCodeAt(i)\n hash = Math.abs(hash * 31 + char)\n }\n\n // Use modulo to get index within palette range\n const colorIndex = hash % TYPE_COLOR_PALETTE.length\n return TYPE_COLOR_PALETTE[colorIndex]\n}\n\nconst getStatusCategory = (score: number): SeoHealthMetrics['status'] => {\n if (score >= 80) return 'excellent'\n if (score >= 60) return 'good'\n if (score >= 40) return 'fair'\n if (score > 0) return 'poor'\n return 'missing'\n}\n\ninterface RenderLicenseState {\n licenseKey?: string\n validateLicense: (forceRefresh?: boolean) => Promise<void>\n}\n\nconst RenderLicenseLoading: React.FC<{text?: React.ReactNode}> = ({text}) => (\n <LoadingState style={{padding: '80px 24px'}}>\n <Spinner />\n {text ?? 'Verifying license…'}\n </LoadingState>\n)\n\nconst RenderLicenseInvalid: React.FC<RenderLicenseState> = ({licenseKey, validateLicense}) => (\n <UpgradeContainer>\n <UpgradeBox>\n {licenseKey ? (\n <>\n <UpgradeLock>❌</UpgradeLock>\n <UpgradeTitle>Invalid License Key</UpgradeTitle>\n <UpgradeText>\n The license key you provided is invalid or has been revoked. Please check your key and\n update it in the plugin config.\n </UpgradeText>\n <UpgradeCode>{`seofields({\n healthDashboard: {\n licenseKey: 'YOUR_LICENSE_KEY', // ← replace with a valid key\n },\n })`}</UpgradeCode>\n <UpgradeButton\n href=\"https://sanity-plugin-seofields.thehardik.in\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Get a New License Key →\n </UpgradeButton>\n <br />\n {/* eslint-disable-next-line react/jsx-no-bind */}\n <ReloadButton onClick={() => validateLicense(true)}>\n Click here If You Just Updated Your Key\n </ReloadButton>\n </>\n ) : (\n <>\n <UpgradeLock>🔒</UpgradeLock>\n <UpgradeTitle>SEO Health Dashboard</UpgradeTitle>\n <UpgradeText>\n This feature requires a license key. Add your key to the plugin config to unlock the\n full dashboard.\n </UpgradeText>\n <UpgradeCode>{`// sanity.config.ts\n import { seofields } from 'sanity-plugin-seofields'\n \n export default defineConfig({\n plugins: [\n seofields({\n healthDashboard: {\n licenseKey: 'SEOF-XXXX-XXXX-XXXX',\n },\n }),\n ],\n })`}</UpgradeCode>\n <UpgradeButton\n href=\"https://sanity-plugin-seofields.thehardik.in\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Get a License Key →\n </UpgradeButton>\n </>\n )}\n </UpgradeBox>\n </UpgradeContainer>\n)\n\nconst scoreMetaTitle = (title?: string): {score: number; issues: string[]} => {\n const issues: string[] = []\n let score = 0\n\n if (title && title.length >= 50 && title.length <= 60) {\n score = 15\n } else if (title && title.length > 0) {\n score = 10\n if (title.length < 50) issues.push('Meta title too short (< 50 chars)')\n if (title.length > 60) issues.push('Meta title too long (> 60 chars)')\n } else {\n issues.push('Missing meta title')\n }\n\n return {score, issues}\n}\n\nconst scoreMetaDescription = (description?: string): {score: number; issues: string[]} => {\n const issues: string[] = []\n let score = 0\n\n if (description && description.length >= 120 && description.length <= 160) {\n score = 15\n } else if (description && description.length > 0) {\n score = 10\n if (description.length < 120) issues.push('Meta description too short (< 120 chars)')\n if (description.length > 160) issues.push('Meta description too long (> 160 chars)')\n } else {\n issues.push('Missing meta description')\n }\n\n return {score, issues}\n}\n\nconst scoreOpenGraph = (openGraph?: Record<string, unknown>): {score: number; issues: string[]} => {\n const issues: string[] = []\n let score = 0\n\n if (openGraph) {\n if (openGraph.title) score += 6\n else issues.push('Missing OG title')\n\n if (openGraph.description) score += 6\n else issues.push('Missing OG description')\n\n if (openGraph.image) score += 6\n else issues.push('Missing OG image')\n\n if (openGraph.type) score += 7\n else issues.push('Missing OG type')\n } else {\n issues.push('Open Graph not configured')\n }\n\n return {score, issues}\n}\n\nconst scoreTwitterCard = (twitter?: Record<string, unknown>): {score: number; issues: string[]} => {\n const issues: string[] = []\n let score = 0\n\n if (twitter) {\n if (twitter.title) score += 5\n else issues.push('Missing Twitter title')\n\n if (twitter.description) score += 5\n else issues.push('Missing Twitter description')\n\n if (twitter.image) score += 5\n else issues.push('Missing Twitter image')\n } else {\n issues.push('Twitter Card not configured')\n }\n\n return {score, issues}\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst calculateHealthScore = (doc: any): SeoHealthMetrics => {\n if (!doc.seo) {\n return {score: 0, status: 'missing', issues: ['SEO fields not configured']}\n }\n\n const {title, description, keywords, robots, canonicalUrl, openGraph, twitter} = doc.seo\n let score = 0\n const issues: string[] = []\n\n const titleResult = scoreMetaTitle(title)\n score += titleResult.score\n issues.push(...titleResult.issues)\n\n const descResult = scoreMetaDescription(description)\n score += descResult.score\n issues.push(...descResult.issues)\n\n // Image\n if (doc.seo.metaImage) score += 10\n else issues.push('Missing meta image')\n\n // Keywords\n if (keywords && keywords.length > 0) score += 10\n else issues.push('No keywords defined')\n\n // Robots\n if (robots && !robots.noIndex) score += 5\n else if (!robots) score += 5\n\n // Canonical URL\n if (canonicalUrl) score += 0 // bonus, not counted in base\n\n const ogResult = scoreOpenGraph(openGraph)\n score += ogResult.score\n issues.push(...ogResult.issues)\n\n const twResult = scoreTwitterCard(twitter)\n score += twResult.score\n issues.push(...twResult.issues)\n\n // Image Completeness bonus (+5 pts when all three images are present)\n const hasMetaImage = !!doc.seo.metaImage\n const hasOgImage = !!(openGraph && openGraph.image)\n const hasTwitterImage = !!(twitter && twitter.image)\n if (hasMetaImage && hasOgImage && hasTwitterImage) {\n score += 5\n } else {\n const missingImages: string[] = []\n if (!hasMetaImage) missingImages.push('meta image')\n if (!hasOgImage) missingImages.push('OG image')\n if (!hasTwitterImage) missingImages.push('Twitter image')\n issues.push(`Missing images for full score: ${missingImages.join(', ')}`)\n }\n\n const status = getStatusCategory(score)\n return {score, status, issues}\n}\n\nconst resolveTypeLabel = (type: string, typeLabels?: Record<string, string>): string =>\n typeLabels?.[type] ?? type\n\n/**\n * Builds the GROQ projection snippet for the title field.\n * - undefined / 'title' → `title`\n * - 'name' → `\"title\": name`\n * - { post: 'title', product: 'name' } → `\"title\": select(_type == \"post\" => title, _type == \"product\" => name, title)`\n */\nconst buildTitleProjection = (titleField?: string | Record<string, string>): string => {\n if (!titleField || titleField === 'title') return 'title'\n if (typeof titleField === 'string') return `\"title\": ${titleField}`\n const cases = Object.entries(titleField)\n .map(([type, field]) => `_type == \"${type}\" => ${field}`)\n .join(', ')\n return `\"title\": select(${cases}, title)`\n}\n\nexport interface SeoHealthDashboardProps {\n icon?: string\n title?: string\n description?: string\n showTypeColumn?: boolean\n showDocumentId?: boolean\n /**\n * Limit the dashboard to specific document type names.\n * If both queryTypes and customQuery are provided, customQuery takes precedence.\n */\n queryTypes?: string[]\n /**\n * When using `queryTypes`, also filter by `seo != null`.\n * Set to `false` to include documents of those types even without an seo field.\n * Defaults to `true`.\n */\n queryRequireSeo?: boolean\n /**\n * A fully custom GROQ query used to fetch documents.\n * Must return objects with at least: _id, _type, title, seo, _updatedAt\n * Takes precedence over queryTypes.\n */\n customQuery?: string\n /**\n * The Sanity API version to use for the client (e.g. '2023-01-01').\n * Defaults to '2023-01-01'.\n */\n apiVersion?: string\n /**\n * License key for the SEO Health Dashboard.\n * Obtain a key at https://sanity-plugin-seofields.thehardik.in\n */\n licenseKey?: string\n /**\n * Map raw `_type` values to human-readable display labels used in the\n * Type column and the Type filter dropdown.\n * Replaces the deprecated `typeLabels`.\n * Any type without an entry falls back to the raw `_type` string.\n *\n * @example\n * typeDisplayLabels={{ productDrug: 'Products', singleCondition: 'Condition' }}\n */\n typeDisplayLabels?: Record<string, string>\n /**\n * Controls how the type is rendered in the Type column.\n * - `'badge'` (default) — coloured pill, consistent with score badges\n * - `'text'` — plain text, useful for dense layouts\n */\n typeColumnMode?: 'badge' | 'text'\n /**\n * The document field to use as the display title.\n *\n * - `string` — use this field for every document type (e.g. `'name'`)\n * - `Record<string, string>` — per-type mapping; unmapped types fall back to `title`\n *\n * @example\n * // Same field for all types\n * titleField: 'name'\n *\n * @example\n * // Different field per type\n * titleField: { post: 'title', product: 'name', category: 'label' }\n */\n titleField?: string | Record<string, string>\n /**\n * Callback function to render a custom badge next to the document title.\n * Replaces the deprecated `docBadge`.\n * Receives the full document and should return badge data or undefined.\n *\n * @example\n * getDocumentBadge: (doc) => {\n * if (doc.services === 'NHS')\n * return { label: 'NHS', bgColor: '#e0f2fe', textColor: '#0369a1' }\n * if (doc.services === 'Private')\n * return { label: 'Private', bgColor: '#fef3c7', textColor: '#92400e' }\n * }\n */\n getDocumentBadge?: (\n doc: DocumentWithSeoHealth & Record<string, unknown>,\n ) => {label: string; bgColor?: string; textColor?: string; fontSize?: string} | undefined\n /**\n * Custom text shown while the license key is being verified.\n * Defaults to `\"Verifying license…\"`.\n */\n loadingLicense?: React.ReactNode\n /**\n * Custom text shown while documents are being fetched.\n * Defaults to `\"Loading documents…\"`.\n */\n loadingDocuments?: React.ReactNode\n /**\n * Custom text shown when the query returns zero results.\n * Defaults to `\"No documents found\"`.\n */\n noDocuments?: React.ReactNode\n /**\n * Enable preview/demo mode to show dummy data.\n * Useful for testing, documentation, or showcasing the dashboard.\n * When enabled, displays realistic sample documents with various SEO scores.\n * Defaults to `false`.\n */\n previewMode?: boolean\n /**\n * When `true`, clicking a document title opens the document editor as a split\n * pane to the right, keeping the SEO Health pane visible on the left.\n * This uses Sanity's pane router and requires the component to be rendered\n * inside a desk-structure pane context (i.e. via `createSeoHealthPane`).\n *\n * When `false` (default), clicking navigates to the document via the standard\n * intent-link system (full navigation).\n *\n * This is set to `true` automatically by `createSeoHealthPane`.\n */\n openInPane?: boolean\n /**\n * The `name` of the Sanity structure tool that contains the monitored documents.\n * When provided, clicking a document title navigates directly to that tool's\n * intent URL (`/{basePath}/{structureTool}/intent/edit/id=…;type=…/`) instead of\n * using the generic intent resolver, which always picks the first registered tool.\n *\n * Required when you have multiple structure tools and the documents live in a\n * non-default one (e.g. `name: 'common'`).\n *\n * @example\n * structureTool: 'common'\n */\n structureTool?: string\n /**\n * @internal — populated by the plugin when deprecated config keys are detected.\n * Each entry carries the migration hint, the version it was deprecated in, and\n * the matching changelog URL so the banner can group warnings by release.\n */\n _deprecationWarnings?: DeprecationWarning[]\n /**\n * Whether the export (CSV / JSON) feature is enabled.\n * Defaults to `true`.\n */\n exportEnabled?: boolean\n /**\n * Which export formats to offer.\n * Defaults to `['csv', 'json']`.\n */\n exportFormats?: Array<'csv' | 'json'>\n /**\n * Render compact inline stat pills in the header instead of the full stats grid.\n * Defaults to `false`.\n */\n compactStats?: boolean\n}\n\n/**\n * Generate dummy data for preview mode showing various SEO health scenarios\n */\nconst generateDummyData = (): DocumentWithSeoHealth[] => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const dummyDocs: any[] = [\n {\n _id: 'preview-post-1',\n _type: 'post',\n title: 'Getting Started with SEO Best Practices',\n slug: {current: 'getting-started-seo'},\n _updatedAt: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(),\n seo: {\n title: 'Getting Started with SEO Best Practices | My Blog',\n description:\n 'Learn the fundamentals of SEO optimization to improve your website visibility and search rankings.',\n keywords: ['seo', 'best practices', 'optimization'],\n metaImage: {_type: 'image', asset: {_ref: 'image-123', _type: 'reference'}},\n openGraph: {\n title: 'SEO Best Practices Guide',\n description: 'Master SEO optimization',\n image: {_type: 'image', asset: {_ref: 'image-123', _type: 'reference'}, alt: 'SEO Guide'},\n type: 'article',\n },\n twitter: {\n title: 'SEO Best Practices',\n description: 'Learn SEO optimization',\n image: {_type: 'image', asset: {_ref: 'image-123', _type: 'reference'}, alt: 'Guide'},\n card: 'summary_large_image',\n },\n },\n },\n {\n _id: 'preview-post-2',\n _type: 'post',\n title: 'Advanced Analytics Strategy',\n slug: {current: 'advanced-analytics'},\n _updatedAt: new Date(Date.now() - 5 * 24 * 60 * 60 * 1000).toISOString(),\n seo: {\n title: 'Advanced Analytics',\n description: 'Strategy tips',\n keywords: ['analytics', 'data'],\n openGraph: {\n title: 'Analytics Guide',\n },\n },\n },\n {\n _id: 'preview-page-1',\n _type: 'page',\n title: 'About Us',\n slug: {current: 'about'},\n _updatedAt: new Date(Date.now() - 10 * 24 * 60 * 60 * 1000).toISOString(),\n seo: {\n title: 'About',\n keywords: ['company', 'team'],\n metaImage: {_type: 'image', asset: {_ref: 'image-456', _type: 'reference'}},\n },\n },\n {\n _id: 'preview-post-3',\n _type: 'post',\n title: 'Content Marketing Trends for 2024',\n slug: {current: 'content-marketing-trends'},\n _updatedAt: new Date(Date.now() - 1 * 24 * 60 * 60 * 1000).toISOString(),\n seo: {\n title: 'Content Marketing Trends 2024',\n description:\n 'Discover the latest content marketing trends and strategies to engage your audience effectively.',\n keywords: ['content marketing', 'trends', 'strategy', 'engagement'],\n metaImage: {_type: 'image', asset: {_ref: 'image-789', _type: 'reference'}},\n openGraph: {\n title: 'Content Marketing Trends 2024',\n description: 'Latest trends in content marketing',\n image: {_type: 'image', asset: {_ref: 'image-789', _type: 'reference'}, alt: 'Trends'},\n type: 'article',\n },\n twitter: {\n title: 'Content Marketing Trends',\n description: 'Discover the latest trends',\n card: 'summary',\n },\n },\n },\n {\n _id: 'preview-post-4',\n _type: 'product',\n title: 'Pro Plan',\n slug: {current: 'pro-plan'},\n _updatedAt: new Date(Date.now() - 15 * 24 * 60 * 60 * 1000).toISOString(),\n seo: {\n title: 'Pro',\n keywords: ['pricing'],\n },\n },\n {\n _id: 'preview-page-2',\n _type: 'page',\n title: 'Contact',\n slug: {current: 'contact'},\n _updatedAt: new Date(Date.now() - 8 * 24 * 60 * 60 * 1000).toISOString(),\n seo: {\n openGraph: {\n title: 'Get in Touch',\n },\n },\n },\n {\n _id: 'preview-post-5',\n _type: 'post',\n title: 'Mobile Optimization Guide',\n slug: {current: 'mobile-optimization'},\n _updatedAt: new Date(Date.now() - 3 * 24 * 60 * 60 * 1000).toISOString(),\n seo: {\n title: 'Mobile Optimization Guide: Best Practices for Responsive Design',\n description:\n 'Complete guide to mobile optimization including responsive design, performance tips, and user experience best practices for modern web development.',\n keywords: ['mobile', 'optimization', 'responsive', 'performance'],\n metaImage: {_type: 'image', asset: {_ref: 'image-mobile', _type: 'reference'}},\n openGraph: {\n title: 'Mobile Optimization Best Practices',\n description: 'Master mobile web optimization',\n image: {_type: 'image', asset: {_ref: 'image-mobile', _type: 'reference'}, alt: 'Mobile'},\n type: 'article',\n },\n twitter: {\n title: 'Mobile Optimization Tips',\n description: 'Responsive design best practices',\n image: {_type: 'image', asset: {_ref: 'image-mobile', _type: 'reference'}, alt: 'Mobile'},\n card: 'summary_large_image',\n },\n },\n },\n ]\n\n // Calculate health scores and return\n return dummyDocs.map((doc) => ({\n ...doc,\n health: calculateHealthScore(doc),\n }))\n}\n\nconst VALIDATION_ENDPOINT = 'https://sanity-plugin-seofields.thehardik.in/api/validate-license'\nconst CACHE_TTL_MS = 60 * 60 * 1000 // 1 hour\n\nconst SeoHealthDashboard: React.FC<SeoHealthDashboardProps> = ({\n icon = '📊',\n title = 'SEO Health Dashboard',\n description = 'Monitor and optimize SEO fields across all your documents',\n showTypeColumn = true,\n showDocumentId = true,\n queryTypes,\n queryRequireSeo = true,\n customQuery,\n apiVersion = '2023-01-01',\n licenseKey,\n typeDisplayLabels,\n typeColumnMode = 'badge',\n titleField,\n getDocumentBadge,\n loadingLicense,\n loadingDocuments,\n noDocuments,\n previewMode = false,\n openInPane = false,\n structureTool,\n _deprecationWarnings,\n exportEnabled = true,\n exportFormats = ['csv', 'json'],\n compactStats = false,\n}) => {\n // Resolve deprecated prop pairs to their new counterparts, while allowing both to be used simultaneously for backward compatibility.\n const resolvedTypeLabels = typeDisplayLabels\n const resolvedDocBadge = getDocumentBadge\n\n // Collect all deprecation warnings to display in the UI banner\n const allDeprecationWarnings = useMemo(() => _deprecationWarnings ?? [], [_deprecationWarnings])\n\n // Group warnings by version so the banner renders one changelog link per release.\n const deprecationGroups = useMemo(() => {\n const groups = new Map<string, {version: string; changelogUrl: string; keys: string[]}>()\n for (const w of allDeprecationWarnings) {\n if (!groups.has(w.version)) {\n groups.set(w.version, {version: w.version, changelogUrl: w.changelogUrl, keys: []})\n }\n groups.get(w.version)!.keys.push(w.key)\n }\n return Array.from(groups.values())\n }, [allDeprecationWarnings])\n const client = useClient({apiVersion})\n const [licenseStatus, setLicenseStatus] = useState<'loading' | 'valid' | 'invalid'>('loading')\n const [documents, setDocuments] = useState<DocumentWithSeoHealth[]>([])\n const [loading, setLoading] = useState(true)\n const [isRefreshing, setIsRefreshing] = useState(false)\n const [searchQuery, setSearchQuery] = useState('')\n const [filterStatus, setFilterStatus] = useState<string>(() => {\n try {\n return localStorage.getItem('seo-dashboard-filter-status') ?? 'all'\n } catch {\n return 'all'\n }\n })\n const [filterType, setFilterType] = useState<string>(() => {\n try {\n return localStorage.getItem('seo-dashboard-filter-type') ?? 'all'\n } catch {\n return 'all'\n }\n })\n const [sortBy, setSortBy] = useState<'score' | 'title'>('score')\n const [currentPage, setCurrentPage] = useState(1)\n const [pageSize, setPageSize] = useState<number>(() => {\n try {\n const stored = localStorage.getItem('seo-dashboard-page-size')\n return stored ? Number(stored) : 25\n } catch {\n return 25\n }\n })\n const searchInputRef = useRef<HTMLInputElement>(null)\n const [activePopover, setActivePopover] = useState<{\n top: number\n left: number\n issues: string[]\n } | null>(null)\n\n // Theme state\n const [themeMode, setThemeMode] = useState<ThemeMode>(() => {\n try {\n const saved = localStorage.getItem('seo-dashboard-theme')\n if (saved === 'light' || saved === 'dark' || saved === 'system') return saved\n } catch {\n // ignore\n }\n return 'system'\n })\n const [systemPrefersDark, setSystemPrefersDark] = useState(\n () =>\n typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches,\n )\n\n useEffect(() => {\n const mq = window.matchMedia('(prefers-color-scheme: dark)')\n const handler = (e: MediaQueryListEvent) => setSystemPrefersDark(e.matches)\n mq.addEventListener('change', handler)\n return () => mq.removeEventListener('change', handler)\n }, [])\n\n const resolvedTheme = (() => {\n if (themeMode === 'system') {\n return systemPrefersDark ? 'dark' : 'light'\n }\n return themeMode\n })()\n const currentVars = themeVars[resolvedTheme]\n\n const handleThemeChange = useCallback((mode: ThemeMode) => {\n setThemeMode(mode)\n try {\n localStorage.setItem('seo-dashboard-theme', mode)\n } catch {\n // ignore\n }\n }, [])\n\n const handleThemeChangeLight = useCallback(() => handleThemeChange('light'), [handleThemeChange])\n const handleThemeChangeDark = useCallback(() => handleThemeChange('dark'), [handleThemeChange])\n const handleThemeChangeSystem = useCallback(\n () => handleThemeChange('system'),\n [handleThemeChange],\n )\n\n const handleFilterStatusChange = useCallback((value: string) => {\n setFilterStatus(value)\n try {\n localStorage.setItem('seo-dashboard-filter-status', value)\n } catch {\n // ignore\n }\n setCurrentPage(1)\n }, [])\n\n const handleFilterTypeChange = useCallback((value: string) => {\n setFilterType(value)\n try {\n localStorage.setItem('seo-dashboard-filter-type', value)\n } catch {\n // ignore\n }\n setCurrentPage(1)\n }, [])\n\n const validateLicense = useCallback(\n async (forceRefresh = false) => {\n // Preview mode bypasses license validation\n if (previewMode) {\n setLicenseStatus('valid')\n return\n }\n\n // No key provided\n if (!licenseKey) {\n setLicenseStatus('invalid')\n return\n }\n\n const projectId = client.config().projectId ?? ''\n const cacheKey = `seofields_license_${projectId}`\n\n if (forceRefresh) {\n try {\n sessionStorage.removeItem(cacheKey)\n } catch {\n // ignore storage errors\n }\n }\n\n // Check sessionStorage cache\n if (!forceRefresh) {\n try {\n const cached = sessionStorage.getItem(cacheKey)\n if (cached) {\n const {valid, ts} = JSON.parse(cached) as {valid: boolean; ts: number}\n if (Date.now() - ts < CACHE_TTL_MS) {\n setLicenseStatus(valid ? 'valid' : 'invalid')\n return\n }\n }\n } catch {\n // ignore storage errors\n }\n }\n\n setLicenseStatus('loading')\n\n try {\n const res = await fetch(VALIDATION_ENDPOINT, {\n method: 'POST',\n headers: {'Content-Type': 'application/json'},\n body: JSON.stringify({licenseKey, projectId}),\n })\n const valid = res.ok\n setLicenseStatus(valid ? 'valid' : 'invalid')\n try {\n sessionStorage.setItem(cacheKey, JSON.stringify({valid, ts: Date.now()}))\n } catch {\n // ignore storage errors\n }\n } catch {\n // Network error — fail open to avoid blocking legitimate users\n setLicenseStatus('valid')\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [licenseKey, previewMode],\n )\n\n useEffect(() => {\n validateLicense()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [licenseKey, previewMode])\n\n const handleMouseEnterIssues = (el: HTMLDivElement | null, issues: string[]) => {\n if (!el) return\n const rect = el.getBoundingClientRect()\n const popoverWidth = 280\n const viewportWidth = window.innerWidth\n\n // Align popover left edge to trigger left edge, clamp within viewport\n let left = rect.left\n if (left + popoverWidth > viewportWidth - 10) left = viewportWidth - popoverWidth - 10\n if (left < 10) left = 10\n\n setActivePopover({top: rect.top, left, issues})\n }\n\n const JSONStringifiedQueryTypes = JSON.stringify(queryTypes)\n const JSONStringifiedTitleField = JSON.stringify(titleField)\n\n const fetchDocuments = useCallback(\n async (isManualRefresh = false) => {\n try {\n if (isManualRefresh) {\n setIsRefreshing(true)\n } else {\n setLoading(true)\n }\n\n // Use dummy data in preview mode\n if (previewMode) {\n setDocuments(generateDummyData())\n return\n }\n\n let groqQuery: string\n let params: Record<string, unknown> = {}\n\n if (customQuery) {\n // Mode 3: fully custom GROQ (user-provided)\n groqQuery = customQuery\n } else if (queryTypes && queryTypes.length > 0) {\n // Mode 2: filter by specific document types (excluding drafts)\n const seoFilter = queryRequireSeo ? ' && seo != null' : ''\n const titleProj = buildTitleProjection(titleField)\n groqQuery = `*[_type in $types${seoFilter} && !(_id in path(\"drafts.**\"))]{\n _id,\n _type,\n ${titleProj},\n slug,\n seo,\n _updatedAt\n }`\n params = {types: queryTypes}\n } else {\n // Mode 1: default — all documents with an seo field (excluding drafts)\n const titleProj = buildTitleProjection(titleField)\n groqQuery = `*[seo != null && !(_id in path(\"drafts.**\"))]{\n _id,\n _type,\n ${titleProj},\n slug,\n seo,\n _updatedAt\n }`\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = await client.fetch(groqQuery, params, {perspective: 'published'})\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const docsWithHealth: DocumentWithSeoHealth[] = result.map((doc: any) => ({\n ...doc,\n health: calculateHealthScore(doc),\n }))\n\n setDocuments(docsWithHealth)\n } catch (error) {\n console.error('Error fetching documents:', error)\n } finally {\n setLoading(false)\n setIsRefreshing(false)\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n client,\n customQuery,\n queryRequireSeo,\n JSONStringifiedQueryTypes,\n JSONStringifiedTitleField,\n previewMode,\n ],\n )\n\n useEffect(() => {\n fetchDocuments()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n client,\n customQuery,\n queryRequireSeo,\n JSONStringifiedQueryTypes,\n JSONStringifiedTitleField,\n previewMode,\n ])\n\n const handleRefresh = useCallback(() => {\n fetchDocuments(true)\n }, [fetchDocuments])\n\n const uniqueDocumentTypes = useMemo(() => {\n const types = new Set(documents.map((doc) => doc._type))\n return Array.from(types).sort()\n }, [documents])\n\n const filteredAndSortedDocs = useMemo(() => {\n let filtered = documents\n\n if (searchQuery) {\n filtered = filtered.filter(\n (doc) =>\n doc.title?.toLowerCase().includes(searchQuery.toLowerCase()) ||\n doc._id?.toLowerCase().includes(searchQuery.toLowerCase()),\n )\n }\n\n if (filterStatus !== 'all') {\n filtered = filtered.filter((doc) => doc.health.status === filterStatus)\n }\n\n if (filterType !== 'all') {\n filtered = filtered.filter((doc) => doc._type === filterType)\n }\n\n const sorted = [...filtered].sort((a, b) => {\n if (sortBy === 'score') {\n return b.health.score - a.health.score\n }\n return (a.title || '').localeCompare(b.title || '')\n })\n\n return sorted\n }, [documents, searchQuery, filterStatus, filterType, sortBy])\n\n const totalPages = Math.max(1, Math.ceil(filteredAndSortedDocs.length / pageSize))\n\n const paginatedDocs = useMemo(() => {\n const start = (currentPage - 1) * pageSize\n return filteredAndSortedDocs.slice(start, start + pageSize)\n }, [filteredAndSortedDocs, currentPage, pageSize])\n\n const handleExportCSV = useCallback(() => {\n const exportDocs = filteredAndSortedDocs\n const rows = exportDocs.map((doc) => ({\n id: doc._id,\n type: doc._type,\n title: typeof doc.title === 'string' ? doc.title : '',\n score: doc.health.score,\n status: doc.health.status,\n issues: doc.health.issues.join(' | '),\n }))\n const header = 'id,type,title,score,status,issues'\n const csvRows = rows.map((r) =>\n [\n r.id,\n r.type,\n `\"${r.title.replace(/\"/g, '\"\"')}\"`,\n r.score,\n r.status,\n `\"${r.issues.replace(/\"/g, '\"\"')}\"`,\n ].join(','),\n )\n const csv = [header, ...csvRows].join('\\n')\n const blob = new Blob([csv], {type: 'text/csv'})\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'seo-health-export.csv'\n a.click()\n URL.revokeObjectURL(url)\n }, [filteredAndSortedDocs])\n\n const handleExportJSON = useCallback(() => {\n const exportDocs = filteredAndSortedDocs\n const blob = new Blob([JSON.stringify(exportDocs, null, 2)], {\n type: 'application/json',\n })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'seo-health-export.json'\n a.click()\n URL.revokeObjectURL(url)\n }, [filteredAndSortedDocs])\n\n const stats = useMemo(() => {\n const total = documents.length\n const excellent = documents.filter((d) => d.health.score >= 80).length\n const good = documents.filter((d) => d.health.score >= 60 && d.health.score < 80).length\n const fair = documents.filter((d) => d.health.score >= 40 && d.health.score < 60).length\n const poor = documents.filter((d) => d.health.score > 0 && d.health.score < 40).length\n const missing = documents.filter((d) => d.health.score === 0).length\n\n const avgScore =\n total > 0 ? Math.round(documents.reduce((sum, d) => sum + d.health.score, 0) / total) : 0\n\n return {total, excellent, good, fair, poor, missing, avgScore}\n }, [documents])\n\n const handleMouseLeave = useCallback(() => {\n setActivePopover(null)\n }, [])\n\n // Reset to page 1 whenever filters, search, or sort changes\n useEffect(() => {\n setCurrentPage(1)\n }, [searchQuery, filterStatus, filterType, sortBy])\n\n // Keyboard shortcuts\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement\n const isEditable =\n target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable\n\n if (e.key === '/' && !isEditable) {\n e.preventDefault()\n searchInputRef.current?.focus()\n }\n }\n\n window.addEventListener('keydown', onKeyDown)\n return () => window.removeEventListener('keydown', onKeyDown)\n }, [])\n\n const renderDashboardContent = () => (\n <>\n {/* Header */}\n <PageHeader>\n <div>\n <PageTitle>\n <span>\n {icon} {title}\n </span>\n {previewMode && <PreviewBadge>Preview Mode</PreviewBadge>}\n </PageTitle>\n <PageSubtitle>{description}</PageSubtitle>\n </div>\n <div style={{display: 'flex', alignItems: 'center', gap: '10px', flexShrink: 0}}>\n <ThemeSwitcher>\n <ThemeButton\n $theme=\"light\"\n $active={themeMode === 'light'}\n onClick={handleThemeChangeLight}\n title=\"Light theme\"\n >\n <SunIcon />\n </ThemeButton>\n <ThemeButton\n $theme=\"dark\"\n $active={themeMode === 'dark'}\n onClick={handleThemeChangeDark}\n title=\"Dark theme\"\n >\n <MoonIcon />\n </ThemeButton>\n <ThemeButton\n $theme=\"system\"\n $active={themeMode === 'system'}\n onClick={handleThemeChangeSystem}\n title=\"System default\"\n >\n <MonitorIcon />\n </ThemeButton>\n </ThemeSwitcher>\n <DashboardRefreshButton\n onClick={handleRefresh}\n disabled={loading || isRefreshing}\n $spinning={isRefreshing}\n title=\"Refresh documents\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"23 4 23 10 17 10\" />\n <polyline points=\"1 20 1 14 7 14\" />\n <path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\" />\n </svg>\n Refresh\n </DashboardRefreshButton>\n </div>\n </PageHeader>\n {/* Deprecation warning banner */}\n {deprecationGroups.length > 0 && (\n <DeprecationBanner>\n <strong>⚠️ Deprecated config keys detected:</strong>{' '}\n {deprecationGroups.map((group, gi) => (\n <span key={group.version}>\n {group.keys.map((w, i) => (\n <span key={w}>\n <code style={{background: '#fef9c3', padding: '1px 4px', borderRadius: 3}}>\n {w.split('→')[0].trim()}\n </code>\n {' → '}\n <code style={{background: '#dcfce7', padding: '1px 4px', borderRadius: 3}}>\n {w.split('→')[1].trim()}\n </code>\n {i < group.keys.length - 1 ? ' · ' : ''}\n </span>\n ))}{' '}\n (\n <DeprecationBannerLink\n href={group.changelogUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {group.version} changelog\n </DeprecationBannerLink>\n ){gi < deprecationGroups.length - 1 ? ' · ' : ''}\n </span>\n ))}{' '}\n — Please update your config.\n </DeprecationBanner>\n )}\n {/* Stats */}\n {!loading && compactStats && (\n <StatsRow>\n <StatPill>📋 {stats.total}</StatPill>\n <StatPill>🟢 Excellent: {stats.excellent}</StatPill>\n <StatPill>🟡 Good: {stats.good}</StatPill>\n <StatPill>🟠 Fair: {stats.fair}</StatPill>\n <StatPill>🔴 Poor/Missing: {stats.poor + stats.missing}</StatPill>\n <StatPill>📊 Avg: {stats.avgScore}%</StatPill>\n <StatPill>🗂️ Types: {uniqueDocumentTypes.length}</StatPill>\n </StatsRow>\n )}\n {/* Stats Grid */}\n {!loading && !compactStats && (\n <StatsGrid>\n <StatCard>\n <StatLabel>Total Docs</StatLabel>\n <StatValue>{stats.total}</StatValue>\n </StatCard>\n <StatCard>\n <StatLabel>Avg Score</StatLabel>\n <StatValue>{stats.avgScore}%</StatValue>\n </StatCard>\n <StatCard $accent=\"#10b981\">\n <StatLabel>Excellent (80+)</StatLabel>\n <StatValue>{stats.excellent}</StatValue>\n </StatCard>\n <StatCard $accent=\"#f59e0b\">\n <StatLabel>Good (60–79)</StatLabel>\n <StatValue>{stats.good}</StatValue>\n </StatCard>\n <StatCard $accent=\"#f97316\">\n <StatLabel>Fair (40–59)</StatLabel>\n <StatValue>{stats.fair}</StatValue>\n </StatCard>\n <StatCard $accent=\"#ef4444\">\n <StatLabel>Poor / Missing</StatLabel>\n <StatValue>{stats.poor + stats.missing}</StatValue>\n </StatCard>\n </StatsGrid>\n )}\n {/* Controls */}\n <ControlsBar>\n <SearchWrapper>\n <SearchIconSvg>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path\n fillRule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </SearchIconSvg>\n <SearchInput\n ref={searchInputRef}\n placeholder=\"Search documents... (press / to focus)\"\n value={searchQuery}\n // eslint-disable-next-line react/jsx-no-bind\n onChange={(e) => setSearchQuery(e.currentTarget.value)}\n />\n </SearchWrapper>\n <StyledSelect\n value={filterStatus}\n // eslint-disable-next-line react/jsx-no-bind\n onChange={(e) => handleFilterStatusChange(e.currentTarget.value)}\n >\n <option value=\"all\">All Status</option>\n <option value=\"excellent\">Excellent</option>\n <option value=\"good\">Good</option>\n <option value=\"fair\">Fair</option>\n <option value=\"poor\">Poor</option>\n <option value=\"missing\">Missing</option>\n </StyledSelect>\n {uniqueDocumentTypes.length > 1 && (\n <StyledSelect\n value={filterType}\n // eslint-disable-next-line react/jsx-no-bind\n onChange={(e) => handleFilterTypeChange(e.currentTarget.value)}\n >\n <option value=\"all\">All Types</option>\n {uniqueDocumentTypes.map((type) => (\n <option key={type} value={type}>\n {resolveTypeLabel(type, resolvedTypeLabels)}\n </option>\n ))}\n </StyledSelect>\n )}\n <StyledSelect\n value={sortBy}\n // eslint-disable-next-line react/jsx-no-bind\n onChange={(e) => setSortBy(e.currentTarget.value as 'score' | 'title')}\n >\n <option value=\"score\">Sort by Score</option>\n <option value=\"title\">Sort by Title</option>\n </StyledSelect>\n {exportEnabled && exportFormats.includes('csv') && (\n <ExportButton onClick={handleExportCSV} title=\"Export all filtered as CSV\">\n ⬇ CSV\n </ExportButton>\n )}\n {exportEnabled && exportFormats.includes('json') && (\n <ExportButton onClick={handleExportJSON} title=\"Export all filtered as JSON\">\n ⬇ JSON\n </ExportButton>\n )}\n </ControlsBar>\n {/* Documents Table */}\n <TableCard>\n {loading && (\n <LoadingState>\n <Spinner />\n {loadingDocuments ?? 'Loading documents…'}\n </LoadingState>\n )}\n {!loading &&\n (filteredAndSortedDocs.length === 0 ? (\n <EmptyState>{noDocuments ?? 'No documents found'}</EmptyState>\n ) : (\n <>\n <TableHeader>\n <ColTitle>Title</ColTitle>\n {showTypeColumn && <ColType>Type</ColType>}\n <ColScore>Score</ColScore>\n <ColIssues>Top Issues</ColIssues>\n </TableHeader>\n {paginatedDocs.map((doc) => {\n return (\n <TableRow key={doc._id}>\n <ColTitle>\n <TitleWrapper>\n <TitleCell>\n {doc.title !== null && typeof doc.title !== 'string' ? (\n <NonStringTitleWarning title=\"title is not a string — use pt::text(title) in your query.groq projection to convert Portable Text to a plain string\">\n ⚠ title is not a string — use pt::text(title) in query.groq\n </NonStringTitleWarning>\n ) : (\n <>\n {openInPane ? (\n <DocTitleAnchorPane id={doc._id} type={doc._type}>\n {typeof doc.title === 'string'\n ? doc.title || 'Untitled'\n : 'Untitled'}\n </DocTitleAnchorPane>\n ) : (\n <DocTitleAnchor\n id={doc._id}\n type={doc._type}\n structureTool={structureTool}\n >\n {typeof doc.title === 'string'\n ? doc.title || 'Untitled'\n : 'Untitled'}\n </DocTitleAnchor>\n )}\n </>\n )}\n {showDocumentId && <DocId>{doc._id}</DocId>}\n {resolvedDocBadge && (\n <DocBadgeRenderer\n doc={doc as DocumentWithSeoHealth & Record<string, unknown>}\n docBadge={resolvedDocBadge}\n />\n )}\n </TitleCell>\n </TitleWrapper>\n </ColTitle>\n {showTypeColumn && (\n <ColType>\n {typeColumnMode === 'text' ? (\n <TypeText>{resolveTypeLabel(doc._type, resolvedTypeLabels)}</TypeText>\n ) : (\n (() => {\n const typeColor = getTypeColor(doc._type)\n return (\n <TypeBadge $bgColor={typeColor.bg} $textColor={typeColor.text}>\n {resolveTypeLabel(doc._type, resolvedTypeLabels)}\n </TypeBadge>\n )\n })()\n )}\n </ColType>\n )}\n <ColScore>\n <ScoreBadge $score={doc.health.score}>{doc.health.score}%</ScoreBadge>\n </ColScore>\n <ColIssues>\n {doc.health.issues.slice(0, 2).map((issue) => (\n <IssueTag key={`issue-${doc._id}-${issue}`}>• {issue}</IssueTag>\n ))}\n {doc.health.issues.length > 2 && (\n <MoreIssuesWrapper\n // eslint-disable-next-line react/jsx-no-bind\n onMouseEnter={function (e) {\n handleMouseEnterIssues(\n e.currentTarget as HTMLDivElement,\n doc.health.issues.slice(2),\n )\n }}\n onMouseLeave={handleMouseLeave}\n >\n <MoreIssues>+{doc.health.issues.length - 2} more issues</MoreIssues>\n </MoreIssuesWrapper>\n )}\n </ColIssues>\n </TableRow>\n )\n })}\n <PaginationBar>\n <span>\n Showing {Math.min((currentPage - 1) * pageSize + 1, filteredAndSortedDocs.length)}\n –{Math.min(currentPage * pageSize, filteredAndSortedDocs.length)} of{' '}\n {filteredAndSortedDocs.length} documents\n </span>\n <PaginationCenter>\n <PaginationButton\n disabled={currentPage === 1}\n // eslint-disable-next-line react/jsx-no-bind\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\n title=\"Previous page\"\n >\n ‹\n </PaginationButton>\n <span>\n Page {currentPage} of {totalPages}\n </span>\n <PaginationButton\n disabled={currentPage >= totalPages}\n // eslint-disable-next-line react/jsx-no-bind\n onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}\n title=\"Next page\"\n >\n ›\n </PaginationButton>\n </PaginationCenter>\n <div style={{display: 'flex', alignItems: 'center', gap: 6}}>\n <span>Per page:</span>\n <StyledSelect\n value={pageSize}\n style={{height: 30, fontSize: 12, padding: '0 28px 0 8px'}}\n // eslint-disable-next-line react/jsx-no-bind\n onChange={(e) => {\n const size = Number(e.currentTarget.value)\n setPageSize(size)\n try {\n localStorage.setItem('seo-dashboard-page-size', String(size))\n } catch {\n // ignore\n }\n setCurrentPage(1)\n }}\n >\n <option value={25}>25</option>\n <option value={50}>50</option>\n <option value={100}>100</option>\n <option value={200}>200</option>\n </StyledSelect>\n </div>\n </PaginationBar>\n </>\n ))}\n </TableCard>\n {/* Single shared popover rendered outside the table */}\n {activePopover && (\n <IssuesPopover\n style={{\n top: activePopover.top,\n left: activePopover.left,\n transform: 'translateY(calc(-100% - 10px))',\n }}\n >\n {activePopover.issues.map((issue) => (\n <PopoverIssueItem key={issue}>⚠️ {issue}</PopoverIssueItem>\n ))}\n </IssuesPopover>\n )}\n </>\n )\n\n return (\n <DashboardContainer style={currentVars as React.CSSProperties}>\n {licenseStatus === 'loading' && <RenderLicenseLoading text={loadingLicense} />}\n {licenseStatus === 'invalid' && (\n <RenderLicenseInvalid licenseKey={licenseKey} validateLicense={validateLicense} />\n )}\n {licenseStatus === 'valid' && renderDashboardContent()}\n </DashboardContainer>\n )\n}\n\nexport default SeoHealthDashboard\n"]}
|