@geenius/seo 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/package.json +16 -3
  2. package/packages/convex/dist/index.d.ts +56 -0
  3. package/packages/convex/dist/index.js +133 -0
  4. package/packages/convex/dist/index.js.map +1 -0
  5. package/packages/react/README.md +1 -1
  6. package/packages/react/dist/index.d.ts +156 -0
  7. package/packages/react/dist/index.js +567 -0
  8. package/packages/react/dist/index.js.map +1 -0
  9. package/packages/react-css/README.md +1 -1
  10. package/packages/react-css/dist/index.cjs +571 -0
  11. package/packages/react-css/dist/index.cjs.map +1 -0
  12. package/packages/react-css/{src/seo.css → dist/index.css} +7 -153
  13. package/packages/react-css/dist/index.css.map +1 -0
  14. package/packages/react-css/dist/index.d.cts +53 -0
  15. package/packages/react-css/dist/index.d.ts +53 -0
  16. package/packages/react-css/dist/index.js +539 -0
  17. package/packages/react-css/dist/index.js.map +1 -0
  18. package/packages/shared/README.md +1 -1
  19. package/packages/shared/dist/index.d.ts +262 -0
  20. package/packages/shared/dist/index.js +381 -0
  21. package/packages/shared/dist/index.js.map +1 -0
  22. package/packages/solidjs/README.md +1 -1
  23. package/packages/solidjs/dist/index.d.ts +133 -0
  24. package/packages/solidjs/dist/index.js +416 -0
  25. package/packages/solidjs/dist/index.js.map +1 -0
  26. package/packages/solidjs-css/README.md +1 -1
  27. package/packages/solidjs-css/dist/index.cjs +399 -0
  28. package/packages/solidjs-css/dist/index.cjs.map +1 -0
  29. package/packages/solidjs-css/{src/seo.css → dist/index.css} +7 -153
  30. package/packages/solidjs-css/dist/index.css.map +1 -0
  31. package/packages/solidjs-css/dist/index.d.cts +53 -0
  32. package/packages/solidjs-css/dist/index.d.ts +53 -0
  33. package/packages/solidjs-css/dist/index.js +367 -0
  34. package/packages/solidjs-css/dist/index.js.map +1 -0
  35. package/.changeset/config.json +0 -11
  36. package/.github/CODEOWNERS +0 -1
  37. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -16
  38. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -11
  39. package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
  40. package/.github/dependabot.yml +0 -11
  41. package/.github/workflows/ci.yml +0 -23
  42. package/.github/workflows/release.yml +0 -29
  43. package/.nvmrc +0 -1
  44. package/.project/ACCOUNT.yaml +0 -4
  45. package/.project/IDEAS.yaml +0 -7
  46. package/.project/PROJECT.yaml +0 -11
  47. package/.project/ROADMAP.yaml +0 -15
  48. package/CODE_OF_CONDUCT.md +0 -16
  49. package/CONTRIBUTING.md +0 -26
  50. package/SECURITY.md +0 -15
  51. package/SUPPORT.md +0 -8
  52. package/packages/convex/package.json +0 -42
  53. package/packages/convex/src/functions.ts +0 -5
  54. package/packages/convex/src/mutations.ts +0 -83
  55. package/packages/convex/src/queries.ts +0 -57
  56. package/packages/convex/src/schema.ts +0 -23
  57. package/packages/convex/tsconfig.json +0 -19
  58. package/packages/convex/tsup.config.ts +0 -18
  59. package/packages/react/package.json +0 -49
  60. package/packages/react/src/components/ArticleJsonLd.tsx +0 -42
  61. package/packages/react/src/components/BreadcrumbsJsonLd.tsx +0 -24
  62. package/packages/react/src/components/MetaEditor.tsx +0 -147
  63. package/packages/react/src/components/SEOHead.tsx +0 -107
  64. package/packages/react/src/components/SEOPreview.tsx +0 -42
  65. package/packages/react/src/components/SEOScoreCard.tsx +0 -51
  66. package/packages/react/src/components/SitemapViewer.tsx +0 -36
  67. package/packages/react/src/components/index.ts +0 -7
  68. package/packages/react/src/hooks/index.ts +0 -4
  69. package/packages/react/src/hooks/useSEO.ts +0 -27
  70. package/packages/react/src/hooks/useSEOAdmin.ts +0 -42
  71. package/packages/react/src/hooks/useSEOScore.ts +0 -7
  72. package/packages/react/src/hooks/useSitemap.ts +0 -8
  73. package/packages/react/src/index.ts +0 -51
  74. package/packages/react/src/index.tsx +0 -11
  75. package/packages/react/src/pages/SEOAdminPage.tsx +0 -101
  76. package/packages/react/src/pages/SEOAnalyticsPage.tsx +0 -96
  77. package/packages/react/src/pages/index.ts +0 -2
  78. package/packages/react/tsconfig.json +0 -19
  79. package/packages/react/tsup.config.ts +0 -12
  80. package/packages/react-css/package.json +0 -36
  81. package/packages/react-css/src/components/ArticleJsonLd.tsx +0 -42
  82. package/packages/react-css/src/components/BreadcrumbsJsonLd.tsx +0 -24
  83. package/packages/react-css/src/components/MetaEditor.tsx +0 -147
  84. package/packages/react-css/src/components/SEOHead.tsx +0 -95
  85. package/packages/react-css/src/components/SEOPreview.tsx +0 -42
  86. package/packages/react-css/src/components/SEOScoreCard.tsx +0 -42
  87. package/packages/react-css/src/components/SitemapViewer.tsx +0 -36
  88. package/packages/react-css/src/components/index.ts +0 -7
  89. package/packages/react-css/src/index.ts +0 -9
  90. package/packages/react-css/src/pages/SEOAdminPage.tsx +0 -88
  91. package/packages/react-css/src/pages/SEOAnalyticsPage.tsx +0 -82
  92. package/packages/react-css/src/pages/index.ts +0 -2
  93. package/packages/react-css/tsup.config.ts +0 -2
  94. package/packages/shared/package.json +0 -42
  95. package/packages/shared/src/__tests__/seo.test.ts +0 -70
  96. package/packages/shared/src/config.ts +0 -297
  97. package/packages/shared/src/index.ts +0 -207
  98. package/packages/shared/tsconfig.json +0 -18
  99. package/packages/shared/tsup.config.ts +0 -11
  100. package/packages/shared/vitest.config.ts +0 -4
  101. package/packages/solidjs/package.json +0 -45
  102. package/packages/solidjs/src/components/ArticleJsonLd.tsx +0 -35
  103. package/packages/solidjs/src/components/BreadcrumbsJsonLd.tsx +0 -24
  104. package/packages/solidjs/src/components/MetaEditor.tsx +0 -155
  105. package/packages/solidjs/src/components/SEOHead.tsx +0 -109
  106. package/packages/solidjs/src/components/SEOPreview.tsx +0 -42
  107. package/packages/solidjs/src/components/SEOScoreCard.tsx +0 -57
  108. package/packages/solidjs/src/components/SitemapViewer.tsx +0 -44
  109. package/packages/solidjs/src/components/index.ts +0 -7
  110. package/packages/solidjs/src/index.ts +0 -11
  111. package/packages/solidjs/src/pages/SEOAdminPage.tsx +0 -104
  112. package/packages/solidjs/src/pages/SEOAnalyticsPage.tsx +0 -102
  113. package/packages/solidjs/src/pages/index.ts +0 -2
  114. package/packages/solidjs/src/primitives/index.ts +0 -4
  115. package/packages/solidjs/src/primitives/useSEO.ts +0 -27
  116. package/packages/solidjs/src/primitives/useSEOAdmin.ts +0 -42
  117. package/packages/solidjs/src/primitives/useSEOScore.ts +0 -7
  118. package/packages/solidjs/src/primitives/useSitemap.ts +0 -8
  119. package/packages/solidjs/tsconfig.json +0 -20
  120. package/packages/solidjs/tsup.config.ts +0 -12
  121. package/packages/solidjs-css/package.json +0 -35
  122. package/packages/solidjs-css/src/index.ts +0 -5
  123. package/packages/solidjs-css/src/primitives/index.ts +0 -1
  124. package/packages/solidjs-css/tsup.config.ts +0 -2
  125. package/pnpm-workspace.yaml +0 -2
  126. package/tsconfig.json +0 -23
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/provider/SeoProvider.tsx","../src/hooks/useSEO.ts","../src/hooks/useSEOAdmin.ts","../src/hooks/useSEOScore.ts","../src/hooks/useSitemap.ts","../src/hooks/useCanonical.ts","../src/hooks/useStructuredData.ts","../src/components/SEOHead.tsx","../src/components/SEOPreview.tsx","../src/components/SEOScoreCard.tsx","../src/components/MetaEditor.tsx","../src/components/SitemapViewer.tsx","../src/components/BreadcrumbsJsonLd.tsx","../src/components/ArticleJsonLd.tsx","../src/components/JsonLd.tsx","../src/pages/SEOAdminPage.tsx","../src/pages/SEOAnalyticsPage.tsx"],"names":["useState","useEffect","useCallback","useMemo","jsx","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext, type ReactNode } from 'react'\nimport type { SEOConfig } from '@geenius/seo-shared'\n\ninterface SeoContextValue {\n config: SEOConfig\n}\n\nconst SeoContext = createContext<SeoContextValue | null>(null)\n\nexport interface SeoProviderProps {\n config: SEOConfig\n children: ReactNode\n}\n\nexport function SeoProvider({ config, children }: SeoProviderProps) {\n return (\n <SeoContext.Provider value={{ config }}>\n {children}\n </SeoContext.Provider>\n )\n}\n\nexport function useSEOContext(): SeoContextValue {\n const ctx = useContext(SeoContext)\n if (!ctx) {\n throw new Error('useSEOContext must be used within a <SeoProvider>')\n }\n return ctx\n}\n","import { useState, useEffect, useCallback } from 'react'\nimport type { SEOMeta } from '@geenius/seo-shared'\n\ninterface UseSEOOptions {\n /** Page path to load SEO metadata for */\n path?: string\n /** Initial metadata (used when no backend is available) */\n initialMeta?: SEOMeta\n}\n\n/**\n * Hook to manage page SEO metadata.\n * Supports both local state and optional Convex backend integration.\n */\nexport function useSEO(options?: UseSEOOptions) {\n const [meta, setMeta] = useState<SEOMeta | null>(options?.initialMeta ?? null)\n const [isLoading, setIsLoading] = useState(false)\n\n const updateMeta = useCallback((newMeta: SEOMeta) => {\n setMeta(newMeta)\n }, [])\n\n useEffect(() => {\n if (!options?.path) return\n // When integrated with Convex, consumers can use:\n // const meta = useQuery(api.seo.queries.getSEOMeta, { path })\n // and pass the result as initialMeta\n setIsLoading(false)\n }, [options?.path])\n\n return { meta, updateMeta, isLoading }\n}\n","import { useState, useEffect, useCallback } from 'react'\nimport type { SEOMeta } from '@geenius/seo-shared'\n\ninterface PageEntry {\n path: string\n meta: SEOMeta\n}\n\nexport interface UseSEOAdminOptions {\n /** Pre-loaded pages (e.g. from Convex useQuery) */\n initialPages?: PageEntry[]\n /** Callback when a page is upserted (e.g. Convex useMutation) */\n onUpsert?: (path: string, meta: SEOMeta) => Promise<void>\n /** Callback when a page is deleted (e.g. Convex useMutation) */\n onDelete?: (path: string) => Promise<void>\n}\n\n/**\n * Hook to manage multiple page SEO metadata entries.\n * Supports optional Convex backend via callback props.\n *\n * @example\n * ```tsx\n * // With Convex:\n * const pages = useQuery(api.seo.queries.listPages, {})\n * const upsertMutation = useMutation(api.seo.mutations.upsertSEOMeta)\n * const deleteMutation = useMutation(api.seo.mutations.deleteSEOMeta)\n *\n * const admin = useSEOAdmin({\n * initialPages: pages,\n * onUpsert: (path, meta) => upsertMutation({ path, meta }),\n * onDelete: (path) => deleteMutation({ path }),\n * })\n * ```\n */\nexport function useSEOAdmin(options?: UseSEOAdminOptions) {\n const [pages, setPages] = useState<PageEntry[]>(options?.initialPages ?? [])\n const [isLoading, setIsLoading] = useState(false)\n\n useEffect(() => {\n if (options?.initialPages) {\n setPages(options.initialPages)\n }\n }, [options?.initialPages])\n\n const upsertMeta = useCallback(async (path: string, meta: SEOMeta) => {\n if (options?.onUpsert) {\n await options.onUpsert(path, meta)\n }\n setPages((prev) => {\n const existing = prev.findIndex((p) => p.path === path)\n if (existing >= 0) {\n const next = [...prev]\n next[existing] = { path, meta }\n return next\n }\n return [...prev, { path, meta }]\n })\n }, [options?.onUpsert])\n\n const deleteMeta = useCallback(async (path: string) => {\n if (options?.onDelete) {\n await options.onDelete(path)\n }\n setPages((prev) => prev.filter((p) => p.path !== path))\n }, [options?.onDelete])\n\n return { pages, upsertMeta, deleteMeta, isLoading }\n}\n","import { useMemo } from 'react'\nimport { calcSEOScore } from '@geenius/seo-shared'\nimport type { SEOMeta } from '@geenius/seo-shared'\n\nexport function useSEOScore(meta: SEOMeta) {\n return useMemo(() => calcSEOScore(meta), [meta])\n}\n","import { useMemo } from 'react'\nimport { generateSitemapXml } from '@geenius/seo-shared'\nimport type { SitemapEntry } from '@geenius/seo-shared'\n\nexport function useSitemap(entries: SitemapEntry[]) {\n const xml = useMemo(() => generateSitemapXml(entries), [entries])\n return { xml }\n}\n","import { useMemo } from 'react'\nimport { buildCanonical } from '@geenius/seo-shared'\nimport { useSEOContext } from '../provider'\n\n/**\n * Returns a canonical URL for the given path using the site URL from SeoProvider.\n * If no path is provided, defaults to the current window location pathname.\n */\nexport function useCanonical(path?: string): string {\n const { config } = useSEOContext()\n\n return useMemo(() => {\n const resolvedPath = path ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\n return buildCanonical(resolvedPath, config.siteUrl)\n }, [path, config.siteUrl])\n}\n","import { useEffect } from 'react'\n\n/**\n * Injects JSON-LD structured data into the document head.\n * Cleans up the script tag on unmount or when data changes.\n */\nexport function useStructuredData(data: Record<string, unknown> | Record<string, unknown>[] | undefined): void {\n useEffect(() => {\n if (!data || (Array.isArray(data) && data.length === 0)) return\n\n const items = Array.isArray(data) ? data : [data]\n const scripts: HTMLScriptElement[] = []\n\n for (const item of items) {\n const script = document.createElement('script')\n script.type = 'application/ld+json'\n script.textContent = JSON.stringify(item)\n document.head.appendChild(script)\n scripts.push(script)\n }\n\n return () => {\n for (const script of scripts) {\n script.remove()\n }\n }\n }, [data])\n}\n","import { useEffect } from 'react'\nimport type { SEOMeta } from '@geenius/seo-shared'\n\ninterface SEOHeadProps {\n meta: SEOMeta\n}\n\nexport function SEOHead({ meta }: SEOHeadProps) {\n useEffect(() => {\n // Set title\n document.title = meta.title\n\n // Set meta tags\n const setMetaTag = (name: string, content: string, isProperty = false) => {\n let tag = document.querySelector(\n `meta[${isProperty ? 'property' : 'name'}=\"${name}\"]`,\n ) as HTMLMetaElement\n if (!tag) {\n tag = document.createElement('meta')\n isProperty ? tag.setAttribute('property', name) : tag.setAttribute('name', name)\n document.head.appendChild(tag)\n }\n tag.content = content\n }\n\n // Description\n setMetaTag('description', meta.description)\n\n // Keywords\n if (meta.keywords.length > 0) {\n setMetaTag('keywords', meta.keywords.join(', '))\n }\n\n // Robots\n if (meta.robots) {\n setMetaTag('robots', meta.robots)\n }\n\n // OG tags\n setMetaTag('og:title', meta.og.title, true)\n setMetaTag('og:description', meta.og.description, true)\n if (meta.og.image) {\n setMetaTag('og:image', meta.og.image, true)\n if (meta.og.imageAlt) {\n setMetaTag('og:image:alt', meta.og.imageAlt, true)\n }\n }\n setMetaTag('og:type', meta.og.type, true)\n setMetaTag('og:url', meta.og.url, true)\n if (meta.og.siteName) {\n setMetaTag('og:site_name', meta.og.siteName, true)\n }\n\n // Twitter tags\n setMetaTag('twitter:card', meta.twitter.card)\n setMetaTag('twitter:title', meta.twitter.title)\n setMetaTag('twitter:description', meta.twitter.description)\n if (meta.twitter.image) {\n setMetaTag('twitter:image', meta.twitter.image)\n }\n if (meta.twitter.creator) {\n setMetaTag('twitter:creator', meta.twitter.creator)\n }\n\n // Canonical\n if (meta.canonical) {\n let canonicalLink = document.querySelector('link[rel=\"canonical\"]') as HTMLLinkElement\n if (!canonicalLink) {\n canonicalLink = document.createElement('link')\n canonicalLink.rel = 'canonical'\n document.head.appendChild(canonicalLink)\n }\n canonicalLink.href = meta.canonical\n }\n\n // Alternates\n if (meta.alternates) {\n Object.entries(meta.alternates).forEach(([lang, url]) => {\n let altLink = document.querySelector(\n `link[rel=\"alternate\"][hreflang=\"${lang}\"]`,\n ) as HTMLLinkElement\n if (!altLink) {\n altLink = document.createElement('link')\n altLink.rel = 'alternate'\n altLink.setAttribute('hreflang', lang)\n document.head.appendChild(altLink)\n }\n altLink.href = url\n })\n }\n\n // JSON-LD\n if (meta.jsonLd && meta.jsonLd.length > 0) {\n meta.jsonLd.forEach((schema) => {\n let script = document.querySelector('script[type=\"application/ld+json\"]') as HTMLScriptElement\n if (!script) {\n script = document.createElement('script')\n script.type = 'application/ld+json'\n document.head.appendChild(script)\n }\n script.textContent = JSON.stringify(schema)\n })\n }\n }, [meta])\n\n return null\n}\n","import type { SEOMeta } from '@geenius/seo-shared'\n\ninterface SEOPreviewProps {\n meta: SEOMeta\n}\n\nexport function SEOPreview({ meta }: SEOPreviewProps) {\n return (\n <div className=\"space-y-6\">\n {/* Google SERP Preview */}\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold text-gray-700\">Google Search Preview</h3>\n <div className=\"bg-white p-4 rounded border border-gray-200\">\n <div className=\"text-xs text-green-700\">{new URL(meta.og.url).hostname}</div>\n <div className=\"text-lg text-blue-600 hover:underline cursor-pointer truncate\">\n {meta.title}\n </div>\n <div className=\"text-sm text-gray-600 line-clamp-2\">{meta.description}</div>\n </div>\n </div>\n\n {/* Social Media Preview */}\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold text-gray-700\">Social Media Preview</h3>\n <div className=\"bg-gray-900 rounded overflow-hidden max-w-sm\">\n {meta.og.image && (\n <img\n src={meta.og.image}\n alt={meta.og.imageAlt || meta.og.title}\n className=\"w-full h-48 object-cover\"\n />\n )}\n <div className=\"p-3 text-white\">\n <div className=\"font-semibold text-sm truncate\">{meta.og.title}</div>\n <div className=\"text-xs text-gray-400 line-clamp-2\">{meta.og.description}</div>\n <div className=\"text-xs text-gray-500 mt-1 truncate\">{meta.og.url}</div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import { useSEOScore } from '../hooks/useSEOScore'\nimport type { SEOMeta } from '@geenius/seo-shared'\n\ninterface SEOScoreCardProps {\n meta: SEOMeta\n}\n\nexport function SEOScoreCard({ meta }: SEOScoreCardProps) {\n const { score, issues } = useSEOScore(meta)\n\n const getScoreColor = () => {\n if (score >= 80) return 'text-green-600'\n if (score >= 50) return 'text-yellow-600'\n return 'text-red-600'\n }\n\n const getBarColor = () => {\n if (score >= 80) return 'bg-green-500'\n if (score >= 50) return 'bg-yellow-500'\n return 'bg-red-500'\n }\n\n return (\n <div className=\"space-y-4 p-4 border border-gray-200 rounded\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"font-semibold text-gray-900\">SEO Score</h3>\n <span className={`text-2xl font-bold ${getScoreColor()}`}>{score}/100</span>\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"h-2 bg-gray-200 rounded overflow-hidden\">\n <div className={`h-full ${getBarColor()} transition-all`} style={{ width: `${score}%` }} />\n </div>\n </div>\n\n {issues.length > 0 && (\n <div className=\"space-y-2\">\n <h4 className=\"text-sm font-semibold text-gray-700\">Issues Found</h4>\n <ul className=\"space-y-1\">\n {issues.map((issue, i) => (\n <li key={i} className=\"text-sm text-red-600 flex items-start\">\n <span className=\"mr-2\">•</span>\n {issue}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n )\n}\n","import { useState } from 'react'\nimport type { SEOMeta } from '@geenius/seo-shared'\n\ninterface MetaEditorProps {\n meta: SEOMeta\n onChange: (meta: SEOMeta) => void\n}\n\nexport function MetaEditor({ meta, onChange }: MetaEditorProps) {\n const [localMeta, setLocalMeta] = useState(meta)\n\n const handleChange = (updates: Partial<SEOMeta>) => {\n const updated = { ...localMeta, ...updates }\n setLocalMeta(updated)\n onChange(updated)\n }\n\n return (\n <div className=\"space-y-6 p-4 border border-gray-200 rounded\">\n {/* Title */}\n <div>\n <label className=\"block text-sm font-semibold text-gray-900 mb-1\">\n Title {localMeta.title.length}/60\n </label>\n <input\n type=\"text\"\n value={localMeta.title}\n onChange={(e) =>\n handleChange({\n title: e.target.value.slice(0, 60),\n })\n }\n className=\"w-full px-3 py-2 border border-gray-300 rounded text-sm\"\n placeholder=\"Page title\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {localMeta.title.length < 30 ? 'Too short' : localMeta.title.length > 60 ? 'Too long' : 'Good length'}\n </p>\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-semibold text-gray-900 mb-1\">\n Description {localMeta.description.length}/160\n </label>\n <textarea\n value={localMeta.description}\n onChange={(e) =>\n handleChange({\n description: e.target.value.slice(0, 160),\n })\n }\n className=\"w-full px-3 py-2 border border-gray-300 rounded text-sm\"\n rows={3}\n placeholder=\"Page description\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {localMeta.description.length < 50 ? 'Too short' : localMeta.description.length > 160 ? 'Too long' : 'Good length'}\n </p>\n </div>\n\n {/* Keywords */}\n <div>\n <label className=\"block text-sm font-semibold text-gray-900 mb-1\">Keywords</label>\n <input\n type=\"text\"\n value={localMeta.keywords.join(', ')}\n onChange={(e) =>\n handleChange({\n keywords: e.target.value.split(',').map((k) => k.trim()),\n })\n }\n className=\"w-full px-3 py-2 border border-gray-300 rounded text-sm\"\n placeholder=\"keyword1, keyword2, keyword3\"\n />\n </div>\n\n {/* Canonical */}\n <div>\n <label className=\"block text-sm font-semibold text-gray-900 mb-1\">Canonical URL</label>\n <input\n type=\"url\"\n value={localMeta.canonical || ''}\n onChange={(e) =>\n handleChange({\n canonical: e.target.value,\n })\n }\n className=\"w-full px-3 py-2 border border-gray-300 rounded text-sm\"\n placeholder=\"https://example.com/page\"\n />\n </div>\n\n {/* OG Image */}\n <div>\n <label className=\"block text-sm font-semibold text-gray-900 mb-1\">OG Image URL</label>\n <input\n type=\"url\"\n value={localMeta.og.image || ''}\n onChange={(e) =>\n handleChange({\n og: { ...localMeta.og, image: e.target.value },\n })\n }\n className=\"w-full px-3 py-2 border border-gray-300 rounded text-sm\"\n placeholder=\"https://example.com/image.jpg\"\n />\n </div>\n\n {/* Twitter Card */}\n <div>\n <label className=\"block text-sm font-semibold text-gray-900 mb-1\">Twitter Card Type</label>\n <select\n value={localMeta.twitter.card}\n onChange={(e) =>\n handleChange({\n twitter: {\n ...localMeta.twitter,\n card: e.target.value as 'summary' | 'summary_large_image',\n },\n })\n }\n className=\"w-full px-3 py-2 border border-gray-300 rounded text-sm\"\n >\n <option value=\"summary\">Summary</option>\n <option value=\"summary_large_image\">Summary Large Image</option>\n </select>\n </div>\n\n {/* Robots */}\n <div>\n <label className=\"block text-sm font-semibold text-gray-900 mb-1\">Robots Directive</label>\n <input\n type=\"text\"\n value={localMeta.robots || ''}\n onChange={(e) =>\n handleChange({\n robots: e.target.value,\n })\n }\n className=\"w-full px-3 py-2 border border-gray-300 rounded text-sm\"\n placeholder=\"index, follow\"\n />\n </div>\n </div>\n )\n}\n","import type { SitemapEntry } from '@geenius/seo-shared'\n\ninterface SitemapViewerProps {\n entries: SitemapEntry[]\n}\n\nexport function SitemapViewer({ entries }: SitemapViewerProps) {\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead className=\"bg-gray-100 border-b\">\n <tr>\n <th className=\"text-left p-3\">URL</th>\n <th className=\"text-left p-3\">Last Modified</th>\n <th className=\"text-left p-3\">Change Frequency</th>\n <th className=\"text-left p-3\">Priority</th>\n </tr>\n </thead>\n <tbody>\n {entries.map((entry, i) => (\n <tr key={i} className=\"border-b hover:bg-gray-50\">\n <td className=\"p-3 font-mono text-xs text-blue-600 break-all\">\n <a href={entry.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {entry.url}\n </a>\n </td>\n <td className=\"p-3 text-gray-600\">{entry.lastmod || '-'}</td>\n <td className=\"p-3 text-gray-600\">{entry.changefreq || '-'}</td>\n <td className=\"p-3 text-gray-600\">{entry.priority || '-'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n","import { useEffect } from 'react'\nimport { breadcrumbSchema } from '@geenius/seo-shared'\n\ninterface BreadcrumbsJsonLdProps {\n items: {\n name: string\n url: string\n }[]\n}\n\nexport function BreadcrumbsJsonLd({ items }: BreadcrumbsJsonLdProps) {\n useEffect(() => {\n const script = document.createElement('script')\n script.type = 'application/ld+json'\n script.textContent = JSON.stringify(breadcrumbSchema(items))\n document.head.appendChild(script)\n\n return () => {\n document.head.removeChild(script)\n }\n }, [items])\n\n return null\n}\n","import { useEffect } from 'react'\nimport { articleSchema } from '@geenius/seo-shared'\n\ninterface ArticleJsonLdProps {\n title: string\n description: string\n author: string\n datePublished: string\n url: string\n image?: string\n}\n\nexport function ArticleJsonLd({\n title,\n description,\n author,\n datePublished,\n url,\n image,\n}: ArticleJsonLdProps) {\n useEffect(() => {\n const script = document.createElement('script')\n script.type = 'application/ld+json'\n script.textContent = JSON.stringify(\n articleSchema({\n title,\n description,\n author,\n datePublished,\n url,\n image,\n }),\n )\n document.head.appendChild(script)\n\n return () => {\n document.head.removeChild(script)\n }\n }, [title, description, author, datePublished, url, image])\n\n return null\n}\n","import { useStructuredData } from '../hooks/useStructuredData'\n\nexport interface JsonLdProps {\n type: string\n data: Record<string, unknown>\n}\n\n/**\n * Renders a JSON-LD structured data script in the document head.\n *\n * @example\n * ```tsx\n * <JsonLd type=\"Article\" data={{\n * headline: 'My Article',\n * author: { '@type': 'Person', name: 'Alice' },\n * datePublished: '2026-03-15',\n * }} />\n * ```\n */\nexport function JsonLd({ type, data }: JsonLdProps) {\n const schema = {\n '@context': 'https://schema.org',\n '@type': type,\n ...data,\n }\n\n useStructuredData(schema)\n\n return null\n}\n","import { useState } from 'react'\nimport { useSEOAdmin } from '../hooks/useSEOAdmin'\nimport { MetaEditor } from '../components/MetaEditor'\nimport { SEOPreview } from '../components/SEOPreview'\nimport { SEOScoreCard } from '../components/SEOScoreCard'\nimport type { SEOMeta } from '@geenius/seo-shared'\n\nexport function SEOAdminPage() {\n const { pages, upsertMeta, deleteMeta, isLoading } = useSEOAdmin()\n const [selectedPath, setSelectedPath] = useState<string | null>(null)\n const [editingMeta, setEditingMeta] = useState<SEOMeta | null>(null)\n\n const currentPage = pages.find((p) => p.path === selectedPath)\n\n const handleSave = async () => {\n if (selectedPath && editingMeta) {\n await upsertMeta(selectedPath, editingMeta)\n setEditingMeta(null)\n }\n }\n\n const handleDelete = async () => {\n if (selectedPath) {\n await deleteMeta(selectedPath)\n setSelectedPath(null)\n setEditingMeta(null)\n }\n }\n\n if (isLoading) return <div className=\"p-4\">Loading...</div>\n\n return (\n <div className=\"max-w-6xl mx-auto p-6\">\n <h1 className=\"text-3xl font-bold mb-6\">SEO Admin</h1>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-4 gap-6\">\n {/* Pages List */}\n <div className=\"lg:col-span-1 border border-gray-200 rounded p-4\">\n <h2 className=\"font-semibold mb-4\">Pages</h2>\n <div className=\"space-y-2\">\n {pages.map((page) => (\n <button\n key={page.path}\n onClick={() => {\n setSelectedPath(page.path)\n setEditingMeta(page.meta)\n }}\n className={`w-full text-left p-2 rounded text-sm transition ${\n selectedPath === page.path\n ? 'bg-blue-100 text-blue-900'\n : 'hover:bg-gray-100'\n }`}\n >\n {page.path || '/'}\n </button>\n ))}\n </div>\n </div>\n\n {/* Editor and Preview */}\n {currentPage && editingMeta && (\n <div className=\"lg:col-span-3 space-y-6\">\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n <div>\n <h2 className=\"font-semibold mb-4\">Edit Metadata</h2>\n <MetaEditor\n meta={editingMeta}\n onChange={setEditingMeta}\n />\n </div>\n\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"font-semibold mb-4\">Preview</h2>\n <SEOPreview meta={editingMeta} />\n </div>\n\n <SEOScoreCard meta={editingMeta} />\n </div>\n </div>\n\n <div className=\"flex gap-2\">\n <button\n onClick={handleSave}\n className=\"px-4 py-2 bg-green-600 text-white rounded hover:bg-green-700\"\n >\n Save\n </button>\n <button\n onClick={handleDelete}\n className=\"px-4 py-2 bg-red-600 text-white rounded hover:bg-red-700\"\n >\n Delete\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { useState, useEffect } from 'react'\n\ninterface AnalyticsSummary {\n path: string\n views: number\n avgTimeOnPage: number\n bounceRate: number\n}\n\nexport function SEOAnalyticsPage() {\n const [topPages, setTopPages] = useState<AnalyticsSummary[]>([])\n const [isLoading, setIsLoading] = useState(false)\n\n useEffect(() => {\n setIsLoading(true)\n // Placeholder for Convex query integration\n // const result = await client.query(api.queries.getTopPages, { limit: 10 })\n // setTopPages(result)\n setIsLoading(false)\n }, [])\n\n if (isLoading) return <div className=\"p-4\">Loading...</div>\n\n return (\n <div className=\"max-w-6xl mx-auto p-6\">\n <h1 className=\"text-3xl font-bold mb-6\">SEO Analytics</h1>\n\n <div className=\"space-y-6\">\n {/* Top Pages */}\n <div className=\"border border-gray-200 rounded p-4\">\n <h2 className=\"font-semibold mb-4\">Top Pages by Views</h2>\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead className=\"bg-gray-100 border-b\">\n <tr>\n <th className=\"text-left p-3\">Page</th>\n <th className=\"text-right p-3\">Views</th>\n <th className=\"text-right p-3\">Avg Time (s)</th>\n <th className=\"text-right p-3\">Bounce Rate</th>\n </tr>\n </thead>\n <tbody>\n {topPages.map((page, i) => (\n <tr key={i} className=\"border-b hover:bg-gray-50\">\n <td className=\"p-3 font-mono text-xs\">{page.path}</td>\n <td className=\"p-3 text-right\">{page.views.toLocaleString()}</td>\n <td className=\"p-3 text-right\">{page.avgTimeOnPage.toFixed(1)}</td>\n <td className=\"p-3 text-right\">{(page.bounceRate * 100).toFixed(1)}%</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {topPages.length === 0 && (\n <p className=\"text-center text-gray-500 py-8\">No analytics data available</p>\n )}\n </div>\n\n {/* Analytics Summary */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"border border-gray-200 rounded p-4\">\n <h3 className=\"text-sm text-gray-600 mb-1\">Total Views</h3>\n <p className=\"text-2xl font-bold\">\n {topPages.reduce((sum, p) => sum + p.views, 0).toLocaleString()}\n </p>\n </div>\n\n <div className=\"border border-gray-200 rounded p-4\">\n <h3 className=\"text-sm text-gray-600 mb-1\">Average Time on Page</h3>\n <p className=\"text-2xl font-bold\">\n {topPages.length > 0\n ? (topPages.reduce((sum, p) => sum + p.avgTimeOnPage, 0) / topPages.length).toFixed(1)\n : '0'}\n s\n </p>\n </div>\n\n <div className=\"border border-gray-200 rounded p-4\">\n <h3 className=\"text-sm text-gray-600 mb-1\">Average Bounce Rate</h3>\n <p className=\"text-2xl font-bold\">\n {topPages.length > 0\n ? (\n (topPages.reduce((sum, p) => sum + p.bounceRate, 0) / topPages.length) *\n 100\n ).toFixed(1)\n : '0'}\n %\n </p>\n </div>\n </div>\n </div>\n </div>\n )\n}\n"]}
@@ -1 +1 @@
1
- # ✦ @geenius-seo/react-css\n\n> A premium module for the Geenius Boilerplate Ecosystem.\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius-seo/react-css\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius-seo/react-css';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n
1
+ # ✦ @geenius/seo-react-css\n\n> A premium module for the Geenius Boilerplate Ecosystem.\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius/seo-react-css\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius/seo-react-css';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n