@geenius/seo 0.1.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 (103) hide show
  1. package/.changeset/config.json +11 -0
  2. package/.github/CODEOWNERS +1 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +16 -0
  4. package/.github/ISSUE_TEMPLATE/feature_request.md +11 -0
  5. package/.github/PULL_REQUEST_TEMPLATE.md +10 -0
  6. package/.github/dependabot.yml +11 -0
  7. package/.github/workflows/ci.yml +23 -0
  8. package/.github/workflows/release.yml +29 -0
  9. package/.nvmrc +1 -0
  10. package/.project/ACCOUNT.yaml +4 -0
  11. package/.project/IDEAS.yaml +7 -0
  12. package/.project/PROJECT.yaml +11 -0
  13. package/.project/ROADMAP.yaml +15 -0
  14. package/CHANGELOG.md +8 -0
  15. package/CODE_OF_CONDUCT.md +16 -0
  16. package/CONTRIBUTING.md +26 -0
  17. package/LICENSE +21 -0
  18. package/README.md +1 -0
  19. package/SECURITY.md +15 -0
  20. package/SUPPORT.md +8 -0
  21. package/package.json +75 -0
  22. package/packages/convex/package.json +42 -0
  23. package/packages/convex/src/functions.ts +5 -0
  24. package/packages/convex/src/mutations.ts +83 -0
  25. package/packages/convex/src/queries.ts +57 -0
  26. package/packages/convex/src/schema.ts +23 -0
  27. package/packages/convex/tsconfig.json +19 -0
  28. package/packages/convex/tsup.config.ts +18 -0
  29. package/packages/react/README.md +1 -0
  30. package/packages/react/package.json +49 -0
  31. package/packages/react/src/components/ArticleJsonLd.tsx +42 -0
  32. package/packages/react/src/components/BreadcrumbsJsonLd.tsx +24 -0
  33. package/packages/react/src/components/MetaEditor.tsx +147 -0
  34. package/packages/react/src/components/SEOHead.tsx +107 -0
  35. package/packages/react/src/components/SEOPreview.tsx +42 -0
  36. package/packages/react/src/components/SEOScoreCard.tsx +51 -0
  37. package/packages/react/src/components/SitemapViewer.tsx +36 -0
  38. package/packages/react/src/components/index.ts +7 -0
  39. package/packages/react/src/hooks/index.ts +4 -0
  40. package/packages/react/src/hooks/useSEO.ts +27 -0
  41. package/packages/react/src/hooks/useSEOAdmin.ts +42 -0
  42. package/packages/react/src/hooks/useSEOScore.ts +7 -0
  43. package/packages/react/src/hooks/useSitemap.ts +8 -0
  44. package/packages/react/src/index.ts +51 -0
  45. package/packages/react/src/index.tsx +11 -0
  46. package/packages/react/src/pages/SEOAdminPage.tsx +101 -0
  47. package/packages/react/src/pages/SEOAnalyticsPage.tsx +96 -0
  48. package/packages/react/src/pages/index.ts +2 -0
  49. package/packages/react/tsconfig.json +19 -0
  50. package/packages/react/tsup.config.ts +12 -0
  51. package/packages/react-css/README.md +1 -0
  52. package/packages/react-css/package.json +36 -0
  53. package/packages/react-css/src/components/ArticleJsonLd.tsx +42 -0
  54. package/packages/react-css/src/components/BreadcrumbsJsonLd.tsx +24 -0
  55. package/packages/react-css/src/components/MetaEditor.tsx +147 -0
  56. package/packages/react-css/src/components/SEOHead.tsx +95 -0
  57. package/packages/react-css/src/components/SEOPreview.tsx +42 -0
  58. package/packages/react-css/src/components/SEOScoreCard.tsx +42 -0
  59. package/packages/react-css/src/components/SitemapViewer.tsx +36 -0
  60. package/packages/react-css/src/components/index.ts +7 -0
  61. package/packages/react-css/src/index.ts +9 -0
  62. package/packages/react-css/src/pages/SEOAdminPage.tsx +88 -0
  63. package/packages/react-css/src/pages/SEOAnalyticsPage.tsx +82 -0
  64. package/packages/react-css/src/pages/index.ts +2 -0
  65. package/packages/react-css/src/seo.css +650 -0
  66. package/packages/react-css/tsup.config.ts +2 -0
  67. package/packages/shared/README.md +1 -0
  68. package/packages/shared/package.json +42 -0
  69. package/packages/shared/src/__tests__/seo.test.ts +70 -0
  70. package/packages/shared/src/config.ts +297 -0
  71. package/packages/shared/src/index.ts +207 -0
  72. package/packages/shared/tsconfig.json +18 -0
  73. package/packages/shared/tsup.config.ts +11 -0
  74. package/packages/shared/vitest.config.ts +4 -0
  75. package/packages/solidjs/README.md +1 -0
  76. package/packages/solidjs/package.json +45 -0
  77. package/packages/solidjs/src/components/ArticleJsonLd.tsx +35 -0
  78. package/packages/solidjs/src/components/BreadcrumbsJsonLd.tsx +24 -0
  79. package/packages/solidjs/src/components/MetaEditor.tsx +155 -0
  80. package/packages/solidjs/src/components/SEOHead.tsx +109 -0
  81. package/packages/solidjs/src/components/SEOPreview.tsx +42 -0
  82. package/packages/solidjs/src/components/SEOScoreCard.tsx +57 -0
  83. package/packages/solidjs/src/components/SitemapViewer.tsx +44 -0
  84. package/packages/solidjs/src/components/index.ts +7 -0
  85. package/packages/solidjs/src/index.ts +11 -0
  86. package/packages/solidjs/src/pages/SEOAdminPage.tsx +104 -0
  87. package/packages/solidjs/src/pages/SEOAnalyticsPage.tsx +102 -0
  88. package/packages/solidjs/src/pages/index.ts +2 -0
  89. package/packages/solidjs/src/primitives/index.ts +4 -0
  90. package/packages/solidjs/src/primitives/useSEO.ts +27 -0
  91. package/packages/solidjs/src/primitives/useSEOAdmin.ts +42 -0
  92. package/packages/solidjs/src/primitives/useSEOScore.ts +7 -0
  93. package/packages/solidjs/src/primitives/useSitemap.ts +8 -0
  94. package/packages/solidjs/tsconfig.json +20 -0
  95. package/packages/solidjs/tsup.config.ts +12 -0
  96. package/packages/solidjs-css/README.md +1 -0
  97. package/packages/solidjs-css/package.json +35 -0
  98. package/packages/solidjs-css/src/index.ts +5 -0
  99. package/packages/solidjs-css/src/primitives/index.ts +1 -0
  100. package/packages/solidjs-css/src/seo.css +650 -0
  101. package/packages/solidjs-css/tsup.config.ts +2 -0
  102. package/pnpm-workspace.yaml +2 -0
  103. package/tsconfig.json +23 -0
@@ -0,0 +1,650 @@
1
+ /* geenius-seo BEM Components with OKLCH Design Tokens */
2
+
3
+ :root {
4
+ /* Color Palette */
5
+ --seo-bg: oklch(0.10 0.01 250);
6
+ --seo-surface: oklch(0.13 0.01 250);
7
+ --seo-surface-2: oklch(0.16 0.01 250);
8
+ --seo-surface-3: oklch(0.19 0.01 250);
9
+ --seo-border: oklch(0.22 0.01 250);
10
+ --seo-border-2: oklch(0.28 0.01 250);
11
+ --seo-text: oklch(0.95 0.01 250);
12
+ --seo-text-secondary: oklch(0.75 0.01 250);
13
+ --seo-text-muted: oklch(0.65 0.01 250);
14
+ --seo-text-dim: oklch(0.55 0.01 250);
15
+
16
+ /* Accent Colors */
17
+ --seo-accent: oklch(0.65 0.20 265);
18
+ --seo-accent-light: oklch(0.75 0.15 265);
19
+ --seo-accent-dark: oklch(0.55 0.22 265);
20
+
21
+ /* SEO Score Colors */
22
+ --seo-score-good: oklch(0.72 0.20 145);
23
+ --seo-score-fair: oklch(0.78 0.18 75);
24
+ --seo-score-poor: oklch(0.60 0.25 25);
25
+
26
+ /* Google Preview */
27
+ --seo-google-url: oklch(0.55 0.15 155);
28
+ --seo-google-title: oklch(0.65 0.20 265);
29
+ --seo-google-desc: oklch(0.50 0.05 0);
30
+
31
+ /* Social Preview */
32
+ --seo-social-bg: oklch(0.08 0.01 250);
33
+ --seo-social-text: oklch(1.0 0 0);
34
+
35
+ /* Spacing & Sizing */
36
+ --seo-radius: 0.75rem;
37
+ --seo-radius-lg: 1rem;
38
+ --seo-radius-sm: 0.5rem;
39
+ --seo-shadow: 0 4px 24px oklch(0 0 0 / 0.4);
40
+ --seo-shadow-sm: 0 2px 8px oklch(0 0 0 / 0.3);
41
+ --seo-shadow-lg: 0 12px 48px oklch(0 0 0 / 0.5);
42
+ --seo-transition: 200ms ease;
43
+ --seo-gap: 1.5rem;
44
+ --seo-gap-lg: 2rem;
45
+ --seo-gap-sm: 0.75rem;
46
+ }
47
+
48
+ /* ────────────────────────────────────────────────────────────────── */
49
+ /* SEO HEAD (Hidden Utility) */
50
+ /* ────────────────────────────────────────────────────────────────── */
51
+
52
+ .seo__head {
53
+ display: none;
54
+ }
55
+
56
+ /* ────────────────────────────────────────────────────────────────── */
57
+ /* SEO PREVIEW */
58
+ /* ────────────────────────────────────────────────────────────────── */
59
+
60
+ .seo__preview {
61
+ display: flex;
62
+ flex-direction: column;
63
+ gap: var(--seo-gap);
64
+ }
65
+
66
+ .seo__preview-google {
67
+ border: 1px solid var(--seo-border);
68
+ border-radius: var(--seo-radius);
69
+ background: var(--seo-surface);
70
+ padding: 1rem;
71
+ }
72
+
73
+ .seo__preview-google-url {
74
+ font-size: 0.75rem;
75
+ color: var(--seo-google-url);
76
+ margin-bottom: 0.5rem;
77
+ text-decoration: none;
78
+ }
79
+
80
+ .seo__preview-google-title {
81
+ font-size: 1.125rem;
82
+ color: var(--seo-google-title);
83
+ text-decoration: underline;
84
+ cursor: pointer;
85
+ margin-bottom: 0.5rem;
86
+ overflow: hidden;
87
+ text-overflow: ellipsis;
88
+ white-space: nowrap;
89
+ font-weight: 500;
90
+ }
91
+
92
+ .seo__preview-google-title:hover {
93
+ color: var(--seo-accent-light);
94
+ }
95
+
96
+ .seo__preview-google-desc {
97
+ font-size: 0.875rem;
98
+ color: var(--seo-google-desc);
99
+ display: -webkit-box;
100
+ -webkit-line-clamp: 2;
101
+ -webkit-box-orient: vertical;
102
+ overflow: hidden;
103
+ }
104
+
105
+ .seo__preview-social {
106
+ background: var(--seo-social-bg);
107
+ border-radius: var(--seo-radius);
108
+ overflow: hidden;
109
+ max-width: 28rem;
110
+ }
111
+
112
+ .seo__preview-social-image {
113
+ width: 100%;
114
+ height: 12rem;
115
+ object-fit: cover;
116
+ display: block;
117
+ }
118
+
119
+ .seo__preview-social-info {
120
+ padding: 0.75rem;
121
+ color: var(--seo-social-text);
122
+ }
123
+
124
+ .seo__preview-social-title {
125
+ font-weight: 600;
126
+ font-size: 0.875rem;
127
+ overflow: hidden;
128
+ text-overflow: ellipsis;
129
+ white-space: nowrap;
130
+ margin-bottom: 0.25rem;
131
+ }
132
+
133
+ .seo__preview-social-desc {
134
+ font-size: 0.75rem;
135
+ color: oklch(0.7 0.01 0 / 0.8);
136
+ display: -webkit-box;
137
+ -webkit-line-clamp: 2;
138
+ -webkit-box-orient: vertical;
139
+ overflow: hidden;
140
+ margin-bottom: 0.25rem;
141
+ }
142
+
143
+ .seo__preview-social-url {
144
+ font-size: 0.75rem;
145
+ color: oklch(0.6 0.01 0 / 0.7);
146
+ overflow: hidden;
147
+ text-overflow: ellipsis;
148
+ white-space: nowrap;
149
+ }
150
+
151
+ /* ────────────────────────────────────────────────────────────────── */
152
+ /* SEO SCORE CARD */
153
+ /* ────────────────────────────────────────────────────────────────── */
154
+
155
+ .seo__score-card {
156
+ border: 1px solid var(--seo-border);
157
+ border-radius: var(--seo-radius);
158
+ background: var(--seo-surface);
159
+ padding: 1rem;
160
+ display: flex;
161
+ flex-direction: column;
162
+ gap: 1rem;
163
+ }
164
+
165
+ .seo__score-card-header {
166
+ display: flex;
167
+ align-items: center;
168
+ justify-content: space-between;
169
+ }
170
+
171
+ .seo__score-card-title {
172
+ font-weight: 600;
173
+ color: var(--seo-text);
174
+ font-size: 0.875rem;
175
+ }
176
+
177
+ .seo__score-number {
178
+ font-size: 1.5rem;
179
+ font-weight: 700;
180
+ }
181
+
182
+ .seo__score-number--good {
183
+ color: var(--seo-score-good);
184
+ }
185
+
186
+ .seo__score-number--fair {
187
+ color: var(--seo-score-fair);
188
+ }
189
+
190
+ .seo__score-number--poor {
191
+ color: var(--seo-score-poor);
192
+ }
193
+
194
+ .seo__score-bar {
195
+ height: 0.5rem;
196
+ background: var(--seo-surface-2);
197
+ border-radius: 9999px;
198
+ overflow: hidden;
199
+ }
200
+
201
+ .seo__score-bar-fill {
202
+ height: 100%;
203
+ border-radius: 9999px;
204
+ transition: width var(--seo-transition);
205
+ }
206
+
207
+ .seo__score-bar-fill--good {
208
+ background: var(--seo-score-good);
209
+ }
210
+
211
+ .seo__score-bar-fill--fair {
212
+ background: var(--seo-score-fair);
213
+ }
214
+
215
+ .seo__score-bar-fill--poor {
216
+ background: var(--seo-score-poor);
217
+ }
218
+
219
+ .seo__issue-list {
220
+ display: flex;
221
+ flex-direction: column;
222
+ gap: 0.5rem;
223
+ }
224
+
225
+ .seo__issue-list-title {
226
+ font-weight: 600;
227
+ font-size: 0.75rem;
228
+ color: var(--seo-text);
229
+ text-transform: uppercase;
230
+ letter-spacing: 0.05em;
231
+ }
232
+
233
+ .seo__issue-item {
234
+ font-size: 0.75rem;
235
+ color: var(--seo-score-poor);
236
+ display: flex;
237
+ align-items: flex-start;
238
+ gap: 0.5rem;
239
+ }
240
+
241
+ .seo__issue-item-bullet {
242
+ flex-shrink: 0;
243
+ }
244
+
245
+ /* ────────────────────────────────────────────────────────────────── */
246
+ /* META EDITOR */
247
+ /* ────────────────────────────────────────────────────────────────── */
248
+
249
+ .seo__meta-editor {
250
+ border: 1px solid var(--seo-border);
251
+ border-radius: var(--seo-radius);
252
+ background: var(--seo-surface);
253
+ padding: 1rem;
254
+ display: flex;
255
+ flex-direction: column;
256
+ gap: 1.5rem;
257
+ }
258
+
259
+ .seo__meta-field {
260
+ display: flex;
261
+ flex-direction: column;
262
+ gap: 0.5rem;
263
+ }
264
+
265
+ .seo__meta-field-label {
266
+ font-weight: 600;
267
+ color: var(--seo-text);
268
+ font-size: 0.875rem;
269
+ }
270
+
271
+ .seo__meta-field-input,
272
+ .seo__meta-field-textarea,
273
+ .seo__meta-field-select {
274
+ width: 100%;
275
+ padding: 0.75rem;
276
+ border: 1px solid var(--seo-border);
277
+ border-radius: var(--seo-radius-sm);
278
+ background: var(--seo-surface-2);
279
+ color: var(--seo-text);
280
+ font-size: 0.875rem;
281
+ font-family: inherit;
282
+ transition: border-color var(--seo-transition), background-color var(--seo-transition);
283
+ }
284
+
285
+ .seo__meta-field-input:focus,
286
+ .seo__meta-field-textarea:focus,
287
+ .seo__meta-field-select:focus {
288
+ outline: none;
289
+ border-color: var(--seo-accent);
290
+ background: var(--seo-surface-3);
291
+ box-shadow: 0 0 0 3px oklch(0.65 0.20 265 / 0.2);
292
+ }
293
+
294
+ .seo__meta-field-textarea {
295
+ resize: vertical;
296
+ min-height: 6rem;
297
+ font-family: inherit;
298
+ }
299
+
300
+ .seo__meta-char-count {
301
+ font-size: 0.75rem;
302
+ color: var(--seo-text-muted);
303
+ }
304
+
305
+ .seo__meta-char-count--over {
306
+ color: var(--seo-score-poor);
307
+ font-weight: 600;
308
+ }
309
+
310
+ /* ────────────────────────────────────────────────────────────────── */
311
+ /* SITEMAP TABLE */
312
+ /* ────────────────────────────────────────────────────────────────── */
313
+
314
+ .seo__sitemap-table {
315
+ width: 100%;
316
+ font-size: 0.875rem;
317
+ border-collapse: collapse;
318
+ background: var(--seo-surface);
319
+ }
320
+
321
+ .seo__sitemap-table-head {
322
+ background: var(--seo-surface-2);
323
+ border-bottom: 1px solid var(--seo-border);
324
+ }
325
+
326
+ .seo__sitemap-table-header {
327
+ padding: 0.75rem;
328
+ text-align: left;
329
+ font-weight: 600;
330
+ color: var(--seo-text);
331
+ font-size: 0.75rem;
332
+ text-transform: uppercase;
333
+ letter-spacing: 0.05em;
334
+ }
335
+
336
+ .seo__sitemap-row {
337
+ border-bottom: 1px solid var(--seo-border-2);
338
+ transition: background-color var(--seo-transition);
339
+ }
340
+
341
+ .seo__sitemap-row:hover {
342
+ background: var(--seo-surface-2);
343
+ }
344
+
345
+ .seo__sitemap-cell {
346
+ padding: 0.75rem;
347
+ color: var(--seo-text);
348
+ }
349
+
350
+ .seo__sitemap-url {
351
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
352
+ font-size: 0.75rem;
353
+ color: var(--seo-accent);
354
+ text-decoration: none;
355
+ word-break: break-all;
356
+ }
357
+
358
+ .seo__sitemap-url:hover {
359
+ text-decoration: underline;
360
+ }
361
+
362
+ .seo__sitemap-cell-muted {
363
+ color: var(--seo-text-muted);
364
+ }
365
+
366
+ /* ────────────────────────────────────────────────────────────────── */
367
+ /* BREADCRUMBS JSON-LD */
368
+ /* ────────────────────────────────────────────────────────────────── */
369
+
370
+ .seo__breadcrumbs {
371
+ display: none;
372
+ }
373
+
374
+ /* ────────────────────────────────────────────────────────────────── */
375
+ /* ARTICLE JSON-LD */
376
+ /* ────────────────────────────────────────────────────────────────── */
377
+
378
+ .seo__article-jsonld {
379
+ display: none;
380
+ }
381
+
382
+ /* ────────────────────────────────────────────────────────────────── */
383
+ /* BUTTONS */
384
+ /* ────────────────────────────────────────────────────────────────── */
385
+
386
+ .seo__button {
387
+ padding: 0.5rem 1rem;
388
+ border: none;
389
+ border-radius: var(--seo-radius-sm);
390
+ font-size: 0.875rem;
391
+ font-weight: 600;
392
+ cursor: pointer;
393
+ transition: all var(--seo-transition);
394
+ text-decoration: none;
395
+ display: inline-flex;
396
+ align-items: center;
397
+ justify-content: center;
398
+ gap: 0.5rem;
399
+ }
400
+
401
+ .seo__button:disabled {
402
+ opacity: 0.5;
403
+ cursor: not-allowed;
404
+ }
405
+
406
+ .seo__button--primary {
407
+ background: var(--seo-accent);
408
+ color: var(--seo-text);
409
+ }
410
+
411
+ .seo__button--primary:hover:not(:disabled) {
412
+ background: var(--seo-accent-light);
413
+ box-shadow: var(--seo-shadow-sm);
414
+ }
415
+
416
+ .seo__button--success {
417
+ background: var(--seo-score-good);
418
+ color: var(--seo-text);
419
+ }
420
+
421
+ .seo__button--success:hover:not(:disabled) {
422
+ background: oklch(0.78 0.22 145);
423
+ box-shadow: var(--seo-shadow-sm);
424
+ }
425
+
426
+ .seo__button--danger {
427
+ background: var(--seo-score-poor);
428
+ color: var(--seo-text);
429
+ }
430
+
431
+ .seo__button--danger:hover:not(:disabled) {
432
+ background: oklch(0.65 0.28 25);
433
+ box-shadow: var(--seo-shadow-sm);
434
+ }
435
+
436
+ .seo__button--secondary {
437
+ background: var(--seo-surface-2);
438
+ color: var(--seo-text);
439
+ border: 1px solid var(--seo-border);
440
+ }
441
+
442
+ .seo__button--secondary:hover:not(:disabled) {
443
+ background: var(--seo-surface-3);
444
+ border-color: var(--seo-accent);
445
+ }
446
+
447
+ /* ────────────────────────────────────────────────────────────────── */
448
+ /* ADMIN PAGE */
449
+ /* ────────────────────────────────────────────────────────────────── */
450
+
451
+ .seo__admin-container {
452
+ max-width: 90rem;
453
+ margin: 0 auto;
454
+ padding: var(--seo-gap);
455
+ }
456
+
457
+ .seo__admin-title {
458
+ font-size: 1.875rem;
459
+ font-weight: 700;
460
+ color: var(--seo-text);
461
+ margin-bottom: var(--seo-gap);
462
+ }
463
+
464
+ .seo__admin-grid {
465
+ display: grid;
466
+ grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr));
467
+ gap: var(--seo-gap);
468
+ }
469
+
470
+ .seo__admin-sidebar {
471
+ border: 1px solid var(--seo-border);
472
+ border-radius: var(--seo-radius);
473
+ background: var(--seo-surface);
474
+ padding: 1rem;
475
+ }
476
+
477
+ .seo__admin-sidebar-title {
478
+ font-weight: 600;
479
+ color: var(--seo-text);
480
+ margin-bottom: 1rem;
481
+ font-size: 0.875rem;
482
+ }
483
+
484
+ .seo__admin-page-list {
485
+ display: flex;
486
+ flex-direction: column;
487
+ gap: 0.5rem;
488
+ }
489
+
490
+ .seo__admin-page-button {
491
+ padding: 0.5rem;
492
+ border: none;
493
+ border-radius: var(--seo-radius-sm);
494
+ background: transparent;
495
+ color: var(--seo-text);
496
+ text-align: left;
497
+ cursor: pointer;
498
+ font-size: 0.875rem;
499
+ transition: all var(--seo-transition);
500
+ }
501
+
502
+ .seo__admin-page-button:hover {
503
+ background: var(--seo-surface-2);
504
+ }
505
+
506
+ .seo__admin-page-button--active {
507
+ background: var(--seo-accent);
508
+ color: var(--seo-bg);
509
+ font-weight: 600;
510
+ }
511
+
512
+ .seo__admin-editor {
513
+ display: grid;
514
+ grid-template-columns: repeat(auto-fit, minmax(25rem, 1fr));
515
+ gap: var(--seo-gap);
516
+ }
517
+
518
+ .seo__admin-actions {
519
+ display: flex;
520
+ gap: 0.75rem;
521
+ margin-top: var(--seo-gap);
522
+ }
523
+
524
+ /* ────────────────────────────────────────────────────────────────── */
525
+ /* ANALYTICS PAGE */
526
+ /* ────────────────────────────────────────────────────────────────── */
527
+
528
+ .seo__analytics-container {
529
+ max-width: 90rem;
530
+ margin: 0 auto;
531
+ padding: var(--seo-gap);
532
+ }
533
+
534
+ .seo__analytics-title {
535
+ font-size: 1.875rem;
536
+ font-weight: 700;
537
+ color: var(--seo-text);
538
+ margin-bottom: var(--seo-gap);
539
+ }
540
+
541
+ .seo__analytics-table-wrapper {
542
+ border: 1px solid var(--seo-border);
543
+ border-radius: var(--seo-radius);
544
+ overflow: hidden;
545
+ }
546
+
547
+ .seo__analytics-summary {
548
+ display: grid;
549
+ grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
550
+ gap: 1rem;
551
+ margin-top: var(--seo-gap);
552
+ }
553
+
554
+ .seo__analytics-card {
555
+ border: 1px solid var(--seo-border);
556
+ border-radius: var(--seo-radius);
557
+ background: var(--seo-surface);
558
+ padding: 1rem;
559
+ }
560
+
561
+ .seo__analytics-card-label {
562
+ font-size: 0.75rem;
563
+ color: var(--seo-text-muted);
564
+ margin-bottom: 0.5rem;
565
+ text-transform: uppercase;
566
+ letter-spacing: 0.05em;
567
+ }
568
+
569
+ .seo__analytics-card-value {
570
+ font-size: 1.5rem;
571
+ font-weight: 700;
572
+ color: var(--seo-accent);
573
+ }
574
+
575
+ /* ────────────────────────────────────────────────────────────────── */
576
+ /* RESPONSIVE */
577
+ /* ────────────────────────────────────────────────────────────────── */
578
+
579
+ @media (max-width: 768px) {
580
+ :root {
581
+ --seo-gap: 1rem;
582
+ }
583
+
584
+ .seo__admin-grid {
585
+ grid-template-columns: 1fr;
586
+ }
587
+
588
+ .seo__admin-editor {
589
+ grid-template-columns: 1fr;
590
+ }
591
+
592
+ .seo__analytics-summary {
593
+ grid-template-columns: 1fr;
594
+ }
595
+
596
+ .seo__sitemap-table {
597
+ font-size: 0.75rem;
598
+ }
599
+
600
+ .seo__sitemap-cell {
601
+ padding: 0.5rem;
602
+ }
603
+
604
+ .seo__preview-social {
605
+ max-width: 100%;
606
+ }
607
+ }
608
+
609
+ /* ────────────────────────────────────────────────────────────────── */
610
+ /* UTILITY CLASSES */
611
+ /* ────────────────────────────────────────────────────────────────── */
612
+
613
+ .seo__container {
614
+ max-width: 90rem;
615
+ margin: 0 auto;
616
+ padding: var(--seo-gap);
617
+ }
618
+
619
+ .seo__section {
620
+ margin-bottom: var(--seo-gap-lg);
621
+ }
622
+
623
+ .seo__grid {
624
+ display: grid;
625
+ gap: var(--seo-gap);
626
+ }
627
+
628
+ .seo__grid-2 {
629
+ grid-template-columns: repeat(auto-fit, minmax(25rem, 1fr));
630
+ }
631
+
632
+ .seo__grid-3 {
633
+ grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr));
634
+ }
635
+
636
+ .seo__space-y {
637
+ display: flex;
638
+ flex-direction: column;
639
+ gap: var(--seo-gap);
640
+ }
641
+
642
+ .seo__space-y-sm {
643
+ display: flex;
644
+ flex-direction: column;
645
+ gap: var(--seo-gap-sm);
646
+ }
647
+
648
+ .seo__hidden {
649
+ display: none !important;
650
+ }
@@ -0,0 +1,2 @@
1
+ import { defineConfig } from 'tsup'
2
+ export default defineConfig({ entry: ['src/index.ts'], format: ['cjs', 'esm'], dts: true, clean: true, sourcemap: true, external: ['react'] })
@@ -0,0 +1 @@
1
+ # ✦ @geenius-seo/shared\n\n> Geenius Seo — Shared types & Convex schema\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/shared\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius-seo/shared';\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
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@geenius-seo/shared",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "description": "Geenius Seo \u2014 Shared types & Convex schema",
7
+ "author": "Antigravity HQ",
8
+ "license": "MIT",
9
+ "publishConfig": {
10
+ "access": "public"
11
+ },
12
+ "main": "./dist/index.js",
13
+ "module": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "src"
24
+ ],
25
+ "scripts": {
26
+ "build": "tsup",
27
+ "clean": "rm -rf dist",
28
+ "type-check": "tsc --noEmit",
29
+ "prepublishOnly": "pnpm clean && pnpm build",
30
+ "test": "vitest run",
31
+ "test:watch": "vitest",
32
+ "test:coverage": "vitest run --coverage"
33
+ },
34
+ "devDependencies": {
35
+ "tsup": "^8.5.1",
36
+ "typescript": "~6.0.2",
37
+ "vitest": "^4.0.0"
38
+ },
39
+ "engines": {
40
+ "node": ">=20.0.0"
41
+ }
42
+ }