@kyro-cms/admin 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/README.md +149 -51
  2. package/package.json +53 -6
  3. package/src/collections/auth/index.ts +2 -2
  4. package/src/collections/portfolio/index.ts +343 -0
  5. package/src/components/ActionBar.tsx +153 -16
  6. package/src/components/Admin.tsx +136 -27
  7. package/src/components/ApiExplorer.tsx +325 -0
  8. package/src/components/ApiKeysManager.tsx +563 -0
  9. package/src/components/AuditLogsPage.tsx +664 -0
  10. package/src/components/AutoForm.tsx +1417 -661
  11. package/src/components/BrandingHub.tsx +267 -0
  12. package/src/components/BulkActionsBar.tsx +3 -3
  13. package/src/components/CreateView.tsx +3 -3
  14. package/src/components/Dashboard.tsx +393 -0
  15. package/src/components/DetailView.tsx +199 -57
  16. package/src/components/DeveloperCenter.tsx +403 -0
  17. package/src/components/EnhancedListView.tsx +786 -0
  18. package/src/components/GraphQLExplorer.tsx +675 -0
  19. package/src/components/GraphQLPlayground.tsx +627 -0
  20. package/src/components/ListView.tsx +191 -53
  21. package/src/components/MediaGallery.tsx +1569 -0
  22. package/src/components/Modal.tsx +149 -0
  23. package/src/components/RestPlayground.tsx +951 -0
  24. package/src/components/Sidebar.astro +237 -0
  25. package/src/components/UserManagement.tsx +204 -0
  26. package/src/components/VersionHistoryPanel.tsx +3 -3
  27. package/src/components/WebhookManager.tsx +608 -0
  28. package/src/components/blocks/AccordionBlock.tsx +97 -0
  29. package/src/components/blocks/ArrayBlock.tsx +75 -0
  30. package/src/components/blocks/BlockEditModal.MARKER +12 -0
  31. package/src/components/blocks/BlockEditModal.tsx +774 -0
  32. package/src/components/blocks/ButtonBlock.tsx +165 -0
  33. package/src/components/blocks/ChildBlocksTree.tsx +551 -0
  34. package/src/components/blocks/CodeBlock.tsx +66 -0
  35. package/src/components/blocks/ColumnsBlock.tsx +151 -0
  36. package/src/components/blocks/DividerBlock.tsx +43 -0
  37. package/src/components/blocks/FileBlock.tsx +64 -0
  38. package/src/components/blocks/HeadingBlock.tsx +81 -0
  39. package/src/components/blocks/HeroBlock.tsx +157 -0
  40. package/src/components/blocks/ImageBlock.tsx +83 -0
  41. package/src/components/blocks/LinkBlock.tsx +71 -0
  42. package/src/components/blocks/ListBlock.tsx +39 -0
  43. package/src/components/blocks/ParagraphBlock.tsx +61 -0
  44. package/src/components/blocks/RelationshipBlock.tsx +279 -0
  45. package/src/components/blocks/VStackBlock.tsx +75 -0
  46. package/src/components/blocks/VideoBlock.tsx +45 -0
  47. package/src/components/blocks/index.ts +10 -0
  48. package/src/components/fields/BlocksField.tsx +323 -0
  49. package/src/components/fields/CheckboxField.tsx +15 -9
  50. package/src/components/fields/CodeField.tsx +234 -0
  51. package/src/components/fields/DateField.tsx +38 -11
  52. package/src/components/fields/EditorClient.tsx +271 -0
  53. package/src/components/fields/FileField.tsx +390 -0
  54. package/src/components/fields/HybridContentField.tsx +109 -0
  55. package/src/components/fields/ImageField.tsx +429 -0
  56. package/src/components/fields/JSONField.tsx +361 -0
  57. package/src/components/fields/MarkdownField.tsx +282 -0
  58. package/src/components/fields/NumberField.tsx +42 -12
  59. package/src/components/fields/PortableTextField.tsx +143 -0
  60. package/src/components/fields/PortableTextRenderer.tsx +68 -0
  61. package/src/components/fields/RelationshipField.tsx +231 -59
  62. package/src/components/fields/SelectField.tsx +25 -15
  63. package/src/components/fields/TextField.tsx +45 -14
  64. package/src/components/fields/extensions/blockComponents.tsx +237 -0
  65. package/src/components/fields/extensions/blocksStore.ts +273 -0
  66. package/src/components/fields/index.ts +13 -0
  67. package/src/components/index.ts +1 -2
  68. package/src/components/layout/Header.tsx +2 -2
  69. package/src/components/layout/Layout.tsx +2 -2
  70. package/src/components/ui/Badge.tsx +9 -4
  71. package/src/components/ui/BlockDrawer.tsx +79 -0
  72. package/src/components/ui/Button.tsx +1 -1
  73. package/src/components/ui/CommandPalette.tsx +362 -0
  74. package/src/components/ui/CommandPaletteWrapper.tsx +97 -0
  75. package/src/components/ui/Dropdown.tsx +1 -1
  76. package/src/components/ui/Modal.tsx +37 -12
  77. package/src/components/ui/PromptModal.tsx +94 -0
  78. package/src/components/ui/SlidePanel.tsx +43 -16
  79. package/src/components/ui/Toast.tsx +80 -14
  80. package/src/env.d.ts +16 -0
  81. package/src/env.ts +20 -0
  82. package/src/index.ts +0 -1
  83. package/src/layouts/AdminLayout.astro +164 -170
  84. package/src/layouts/AuthLayout.astro +23 -6
  85. package/src/lib/MediaService.ts +541 -0
  86. package/src/lib/auth/sqlite-adapter.ts +319 -0
  87. package/src/lib/config.ts +22 -6
  88. package/src/lib/dataStore.ts +132 -74
  89. package/src/lib/db/adapter.ts +54 -0
  90. package/src/lib/db/drizzle-mysql-adapter.ts +194 -0
  91. package/src/lib/db/drizzle-mysql-auth-adapter.ts +327 -0
  92. package/src/lib/db/drizzle-postgres-adapter.ts +202 -0
  93. package/src/lib/db/drizzle-postgres-auth-adapter.ts +304 -0
  94. package/src/lib/db/drizzle-sqlite-adapter.ts +227 -0
  95. package/src/lib/db/drizzle-sqlite-auth-adapter.ts +548 -0
  96. package/src/lib/db/index.ts +449 -0
  97. package/src/lib/db/mongodb-adapter.ts +207 -0
  98. package/src/lib/db/mongodb-auth-adapter.ts +305 -0
  99. package/src/lib/db/schema/mysql-auth.ts +113 -0
  100. package/src/lib/db/schema/mysql-content.ts +20 -0
  101. package/src/lib/db/schema/postgres-auth.ts +116 -0
  102. package/src/lib/db/schema/postgres-content.ts +35 -0
  103. package/src/lib/db/schema/postgres-media.ts +52 -0
  104. package/src/lib/db/schema/postgres-settings.ts +11 -0
  105. package/src/lib/db/schema/sqlite-auth.ts +112 -0
  106. package/src/lib/db/schema/sqlite-content.ts +20 -0
  107. package/src/lib/graphql/index.ts +1 -0
  108. package/src/lib/graphql/schema.ts +443 -0
  109. package/src/lib/rate-limit.ts +267 -0
  110. package/src/lib/storage.ts +374 -0
  111. package/src/lib/store.ts +85 -0
  112. package/src/middleware.ts +70 -11
  113. package/src/pages/[collection]/[id].astro +178 -122
  114. package/src/pages/[collection]/index.astro +24 -156
  115. package/src/pages/admin/api-explorer.astro +98 -0
  116. package/src/pages/admin/graphql-explorer.astro +40 -0
  117. package/src/pages/admin/graphql.astro +97 -0
  118. package/src/pages/admin/index.astro +200 -139
  119. package/src/pages/admin/keys.astro +8 -0
  120. package/src/pages/admin/rest-playground.astro +44 -0
  121. package/src/pages/admin/webhooks.astro +8 -0
  122. package/src/pages/api/[collection]/[id]/publish.ts +44 -0
  123. package/src/pages/api/[collection]/[id]/unpublish.ts +42 -0
  124. package/src/pages/api/[collection]/[id]/versions.ts +36 -0
  125. package/src/pages/api/[collection]/[id].ts +102 -159
  126. package/src/pages/api/[collection]/index.ts +151 -230
  127. package/src/pages/api/auth/[id].ts +48 -69
  128. package/src/pages/api/auth/audit-logs.ts +20 -43
  129. package/src/pages/api/auth/login.ts +159 -45
  130. package/src/pages/api/auth/logout.ts +42 -24
  131. package/src/pages/api/auth/refresh.ts +119 -0
  132. package/src/pages/api/auth/register.ts +110 -40
  133. package/src/pages/api/auth/users.ts +22 -97
  134. package/src/pages/api/collections.ts +59 -0
  135. package/src/pages/api/globals/[slug]/test.ts +172 -0
  136. package/src/pages/api/globals/[slug].ts +42 -0
  137. package/src/pages/api/graphql.ts +90 -0
  138. package/src/pages/api/health.ts +417 -40
  139. package/src/pages/api/keys/[id].ts +26 -0
  140. package/src/pages/api/keys/index.ts +75 -0
  141. package/src/pages/api/media/[id].ts +309 -0
  142. package/src/pages/api/media/folders.ts +609 -0
  143. package/src/pages/api/media/index.ts +146 -0
  144. package/src/pages/api/media/resize.ts +267 -0
  145. package/src/pages/api/search.ts +82 -0
  146. package/src/pages/api/slug-availability.ts +70 -0
  147. package/src/pages/api/storage-config.ts +20 -0
  148. package/src/pages/api/storage-status.ts +206 -0
  149. package/src/pages/api/upload.ts +334 -0
  150. package/src/pages/api/webhooks/index.ts +71 -0
  151. package/src/pages/audit/index.astro +2 -104
  152. package/src/pages/login.astro +11 -11
  153. package/src/pages/media.astro +10 -0
  154. package/src/pages/preview/[collection]/[id].astro +178 -0
  155. package/src/pages/register.astro +13 -13
  156. package/src/pages/roles/index.astro +21 -21
  157. package/src/pages/settings/[slug].astro +162 -0
  158. package/src/pages/settings/index.astro +9 -0
  159. package/src/pages/users/[id].astro +29 -21
  160. package/src/pages/users/index.astro +22 -17
  161. package/src/pages/users/new.astro +18 -17
  162. package/src/styles/main.css +553 -128
  163. package/src/components/layout/Sidebar.tsx +0 -497
@@ -1,4 +1,5 @@
1
1
  @import "tailwindcss";
2
+ @custom-variant dark (&:where(.dark, .dark *));
2
3
 
3
4
  @source "../../src/**/*.{astro,html,js,jsx,ts,tsx}";
4
5
 
@@ -63,23 +64,96 @@
63
64
  /* Dashboard Theme */
64
65
  --kyro-bg: #eaeff2;
65
66
  --kyro-surface: #ffffff;
67
+ --kyro-surface-accent: #f9fafb;
66
68
  --kyro-sidebar-bg: #ffffff;
67
69
  --kyro-sidebar-active: #0b1222;
68
70
  --kyro-sidebar-text: #64748b;
69
71
  --kyro-sidebar-text-active: #ffffff;
70
72
  --kyro-sidebar-border: rgba(0, 0, 0, 0.05);
71
73
 
74
+ /* Semantic Typography */
75
+ --kyro-text-primary: #0b1222;
76
+ --kyro-text-secondary: #64748b;
77
+ --kyro-text-muted: #94a3b8;
78
+
79
+ /* Semantic UI */
80
+ --kyro-border: #f3f4f6;
81
+ --kyro-input-bg: #ffffff;
82
+ --kyro-input-border: #e5e7eb;
83
+
72
84
  /* Elevation & Radius */
73
85
  --kyro-radius-tile: 32px;
74
86
  --kyro-radius-lg: 16px;
75
87
  --kyro-radius-xl: 48px;
76
88
  --kyro-shadow-tile: 0 10px 40px -10px rgba(0, 0, 0, 0.04);
77
89
 
90
+ /* Primary Brand Color */
91
+ --kyro-primary: #0b1222;
92
+ --kyro-primary-hover: #1a2332;
93
+
94
+ /* Success Color */
95
+ --kyro-success: #22c55e;
96
+ --kyro-success-bg: rgba(34, 197, 94, 0.1);
97
+
98
+ /* Danger Color */
99
+ --kyro-danger: #ef4444;
100
+ --kyro-danger-bg: rgba(239, 68, 68, 0.1);
101
+
102
+ /* Border Active */
103
+ --kyro-border-active: #0b1222;
104
+
105
+ /* Secondary Backgrounds */
106
+ --kyro-bg-secondary: #f3f4f6;
107
+
78
108
  /* Layout */
79
109
  --kyro-sidebar-width: 320px;
80
110
  --kyro-header-height: 80px;
81
111
  }
82
112
 
113
+ :root.dark {
114
+ --kyro-bg: #050912;
115
+ --kyro-surface: #0b1222;
116
+ --kyro-surface-accent: #111a2e;
117
+ --kyro-sidebar-bg: #0b1222;
118
+ --kyro-sidebar-active: #ffffff;
119
+ --kyro-sidebar-text: #94a3b8;
120
+ --kyro-sidebar-text-active: #0b1222;
121
+ --kyro-sidebar-border: rgba(255, 255, 255, 0.05);
122
+
123
+ --kyro-text-primary: #ffffff;
124
+ --kyro-text-secondary: #94a3b8;
125
+ --kyro-text-muted: #64748b;
126
+
127
+ --kyro-border: #1a2332;
128
+ --kyro-input-bg: #111a2e;
129
+ --kyro-input-border: #1e293b;
130
+
131
+ --kyro-black: #ffffff;
132
+ --kyro-gray-50: #1a2332;
133
+ --kyro-gray-100: #1e293b;
134
+ --kyro-gray-200: #334155;
135
+
136
+ /* Primary Brand Color (dark) - Use sidebar accent for consistency */
137
+ --kyro-primary: var(--kyro-sidebar-active);
138
+ --kyro-primary-hover: var(--kyro-sidebar-text-active);
139
+
140
+ /* Success Color (dark) */
141
+ --kyro-success: #22c55e;
142
+ --kyro-success-bg: rgba(34, 197, 94, 0.15);
143
+
144
+ /* Danger Color (dark) */
145
+ --kyro-danger: #f87171;
146
+ --kyro-danger-bg: rgba(248, 113, 113, 0.15);
147
+
148
+ /* Border Active (dark) */
149
+ --kyro-border-active: #ffffff;
150
+
151
+ /* Secondary Backgrounds (dark) */
152
+ --kyro-bg-secondary: #111a2e;
153
+
154
+ color-scheme: dark;
155
+ }
156
+
83
157
  @theme {
84
158
  --font-sans: "Serotiva Sans", ui-sans-serif, system-ui, sans-serif;
85
159
 
@@ -98,6 +172,18 @@
98
172
  --radius-xl: var(--kyro-radius-xl);
99
173
 
100
174
  --shadow-tile: var(--kyro-shadow-tile);
175
+
176
+ /* Drawer slide animation */
177
+ --animate-slide-in-from-right: slide-in-from-right 200ms ease-out;
178
+
179
+ @keyframes slide-in-from-right {
180
+ from {
181
+ transform: translateX(100%);
182
+ }
183
+ to {
184
+ transform: translateX(0);
185
+ }
186
+ }
101
187
  }
102
188
 
103
189
  @layer base {
@@ -105,8 +191,20 @@
105
191
  font-family: var(--font-sans);
106
192
  font-size: 14px;
107
193
  line-height: 1.5;
108
- color: #0b1222;
194
+ color: var(--kyro-text-primary);
109
195
  background: var(--kyro-bg);
196
+ transition:
197
+ background-color 300ms ease,
198
+ color 300ms ease;
199
+ }
200
+
201
+ a,
202
+ button,
203
+ [role="button"],
204
+ input[type="button"],
205
+ input[type="submit"],
206
+ input[type="reset"] {
207
+ cursor: pointer;
110
208
  }
111
209
  }
112
210
 
@@ -163,6 +261,12 @@
163
261
  color: var(--kyro-gray-500);
164
262
  }
165
263
 
264
+ .kyro-sidebar-divider {
265
+ height: 1px;
266
+ background: var(--kyro-sidebar-border);
267
+ margin: 12px 20px;
268
+ }
269
+
166
270
  .kyro-sidebar-item {
167
271
  display: flex;
168
272
  align-items: center;
@@ -235,12 +339,14 @@
235
339
  display: flex;
236
340
  flex-direction: column;
237
341
  overflow: hidden;
342
+ pointer-events: auto;
238
343
  }
239
344
 
240
345
  .kyro-admin-content {
241
346
  flex: 1;
242
347
  overflow-y: auto;
243
348
  padding: 24px;
349
+ pointer-events: auto;
244
350
  }
245
351
 
246
352
  /* Buttons — Monochrome */
@@ -250,7 +356,7 @@
250
356
  justify-content: center;
251
357
  gap: 6px;
252
358
  font-weight: 500;
253
- border-radius: 6px;
359
+ border-radius: 9999px;
254
360
  cursor: pointer;
255
361
  transition: all 150ms ease;
256
362
  border: 1px solid transparent;
@@ -281,7 +387,7 @@
281
387
 
282
388
  .kyro-btn-primary {
283
389
  background: var(--kyro-black);
284
- color: white;
390
+ color: var(--kyro-sidebar-text-active);
285
391
  border-color: var(--kyro-black);
286
392
  }
287
393
 
@@ -291,9 +397,9 @@
291
397
  }
292
398
 
293
399
  .kyro-btn-secondary {
294
- background: white;
295
- color: var(--kyro-gray-700);
296
- border-color: var(--kyro-gray-200);
400
+ background: var(--kyro-surface);
401
+ color: var(--kyro-text-primary);
402
+ border-color: var(--kyro-border);
297
403
  }
298
404
 
299
405
  .kyro-btn-secondary:hover:not(:disabled) {
@@ -302,9 +408,9 @@
302
408
  }
303
409
 
304
410
  .kyro-btn-danger {
305
- background: white;
306
- color: var(--kyro-gray-900);
307
- border-color: var(--kyro-gray-900);
411
+ background: var(--kyro-surface);
412
+ color: var(--kyro-text-primary);
413
+ border-color: var(--kyro-text-primary);
308
414
  }
309
415
 
310
416
  .kyro-btn-danger:hover:not(:disabled) {
@@ -319,20 +425,48 @@
319
425
 
320
426
  .kyro-btn-ghost:hover:not(:disabled) {
321
427
  background: var(--kyro-gray-100);
322
- color: var(--kyro-gray-900);
428
+ color: var(--kyro-text-primary);
429
+ }
430
+
431
+ .kyro-btn-success {
432
+ background: #10b981;
433
+ color: white;
434
+ border-color: #10b981;
435
+ }
436
+
437
+ .kyro-btn-success:hover:not(:disabled) {
438
+ background: #059669;
439
+ border-color: #059669;
440
+ }
441
+
442
+ .kyro-btn-success:disabled {
443
+ background: var(--kyro-gray-300);
444
+ border-color: var(--kyro-gray-300);
445
+ color: var(--kyro-gray-500);
446
+ }
447
+
448
+ .kyro-btn-warning {
449
+ background: #f59e0b;
450
+ color: white;
451
+ border-color: #f59e0b;
452
+ }
453
+
454
+ .kyro-btn-warning:hover:not(:disabled) {
455
+ background: #d97706;
456
+ border-color: #d97706;
323
457
  }
324
458
 
325
459
  /* Cards & Tiles */
326
460
  .surface-tile {
327
461
  box-shadow: var(--kyro-shadow-tile);
328
- border: 1px solid rgba(255, 255, 255, 0.8);
462
+ /* border: 1px solid rgba(255, 255, 255, 0.8); */
329
463
  padding: 24px;
330
464
  background: var(--kyro-surface);
331
465
  border-radius: var(--kyro-radius-tile);
332
466
  }
333
467
 
334
468
  .kyro-card {
335
- border: 1px solid #eef2f5;
469
+ border: 1px solid var(--kyro-border);
336
470
  box-shadow: var(--kyro-shadow-tile);
337
471
  padding: 24px;
338
472
  background: var(--kyro-surface);
@@ -349,7 +483,7 @@
349
483
  .kyro-card-title {
350
484
  font-size: 24px;
351
485
  font-weight: 700;
352
- color: #0b1222;
486
+ color: var(--kyro-text-primary);
353
487
  letter-spacing: -0.01em;
354
488
  }
355
489
 
@@ -373,7 +507,7 @@
373
507
  .kyro-list-title {
374
508
  font-size: 18px;
375
509
  font-weight: 600;
376
- color: var(--kyro-gray-900);
510
+ color: var(--kyro-text-primary);
377
511
  }
378
512
 
379
513
  .kyro-table {
@@ -382,7 +516,7 @@
382
516
  background: white;
383
517
  border-radius: 8px;
384
518
  overflow: hidden;
385
- border: 1px solid var(--kyro-gray-200);
519
+ border: 1px solid var(--kyro-border);
386
520
  }
387
521
 
388
522
  .kyro-table th {
@@ -393,7 +527,7 @@
393
527
  letter-spacing: 0.03em;
394
528
  color: var(--kyro-gray-500);
395
529
  background: var(--kyro-gray-50);
396
- border-bottom: 1px solid var(--kyro-gray-200);
530
+ border-bottom: 1px solid var(--kyro-border);
397
531
  text-align: left;
398
532
  }
399
533
 
@@ -401,7 +535,7 @@
401
535
  padding: 14px 16px;
402
536
  border-bottom: 1px solid var(--kyro-gray-100);
403
537
  font-size: 14px;
404
- color: var(--kyro-gray-900);
538
+ color: var(--kyro-text-primary);
405
539
  }
406
540
 
407
541
  .kyro-table tr:last-child td {
@@ -433,11 +567,11 @@
433
567
 
434
568
  .kyro-table-action:hover {
435
569
  background: var(--kyro-gray-100);
436
- color: var(--kyro-gray-900);
570
+ color: var(--kyro-text-primary);
437
571
  }
438
572
 
439
573
  .kyro-table-action.danger:hover {
440
- background: var(--kyro-gray-200);
574
+ background: var(--kyro-surface-accent);
441
575
  color: var(--kyro-black);
442
576
  }
443
577
 
@@ -457,7 +591,7 @@
457
591
  .kyro-empty-title {
458
592
  font-size: 14px;
459
593
  font-weight: 600;
460
- color: var(--kyro-gray-900);
594
+ color: var(--kyro-text-primary);
461
595
  margin-bottom: 4px;
462
596
  }
463
597
 
@@ -485,9 +619,9 @@
485
619
  justify-content: center;
486
620
  width: 36px;
487
621
  height: 36px;
488
- border: 1px solid var(--kyro-gray-200);
489
- background: white;
490
- color: var(--kyro-gray-500);
622
+ border: 1px solid var(--kyro-border);
623
+ background: var(--kyro-surface);
624
+ color: var(--kyro-text-secondary);
491
625
  border-radius: 6px;
492
626
  cursor: pointer;
493
627
  transition: all 150ms ease;
@@ -496,13 +630,13 @@
496
630
 
497
631
  .kyro-detail-back:hover {
498
632
  background: var(--kyro-gray-50);
499
- color: var(--kyro-gray-900);
633
+ color: var(--kyro-text-primary);
500
634
  }
501
635
 
502
636
  .kyro-detail-title {
503
637
  font-size: 18px;
504
638
  font-weight: 600;
505
- color: var(--kyro-gray-900);
639
+ color: var(--kyro-text-primary);
506
640
  }
507
641
 
508
642
  .kyro-detail-meta {
@@ -552,29 +686,29 @@
552
686
 
553
687
  .kyro-meta-value {
554
688
  font-size: 14px;
555
- color: var(--kyro-gray-900);
689
+ color: var(--kyro-text-primary);
556
690
  }
557
691
 
558
692
  /* Forms */
559
693
  .kyro-form {
560
694
  display: flex;
561
695
  flex-direction: column;
562
- gap: 20px;
696
+ gap: 12px;
563
697
  }
564
698
 
565
699
  .kyro-form-field {
566
700
  display: flex;
567
701
  flex-direction: column;
568
- gap: 6px;
702
+ gap: 4px;
569
703
  }
570
704
 
571
705
  .kyro-form-label {
572
- font-size: 13px;
706
+ font-size: 12px;
573
707
  font-weight: 500;
574
- color: var(--kyro-gray-900);
708
+ color: var(--kyro-text-primary);
575
709
  display: flex;
576
710
  align-items: center;
577
- gap: 4px;
711
+ gap: 3px;
578
712
  }
579
713
 
580
714
  .kyro-form-label-required {
@@ -584,14 +718,45 @@
584
718
 
585
719
  .kyro-form-input {
586
720
  width: 100%;
587
- padding: 10px 12px;
588
- font-size: 14px;
589
- color: var(--kyro-gray-900);
590
- background: white;
591
- border: 1px solid var(--kyro-gray-200);
721
+ padding: 6px 10px;
722
+ font-size: 13px;
723
+ color: var(--kyro-text-primary);
724
+ background: var(--kyro-input-bg);
725
+ border: 1px solid var(--kyro-input-border);
592
726
  border-radius: 6px;
593
727
  transition: all 150ms ease;
594
728
  font-family: inherit;
729
+ pointer-events: auto !important;
730
+ position: relative;
731
+ z-index: 1;
732
+ }
733
+
734
+ .kyro-form-input:disabled {
735
+ pointer-events: none !important;
736
+ opacity: 0.5;
737
+ }
738
+
739
+ .kyro-form-input[disabled] {
740
+ pointer-events: none !important;
741
+ opacity: 0.5;
742
+ }
743
+
744
+ textarea.kyro-form-input,
745
+ textarea.kyro-form-textarea {
746
+ pointer-events: auto !important;
747
+ cursor: text;
748
+ }
749
+
750
+ input[type="text"],
751
+ input[type="email"],
752
+ input[type="password"],
753
+ input[type="number"],
754
+ input[type="search"],
755
+ input[type="url"],
756
+ input[type="tel"],
757
+ select.kyro-form-input {
758
+ pointer-events: auto !important;
759
+ cursor: text;
595
760
  }
596
761
 
597
762
  .kyro-form-input:hover {
@@ -601,7 +766,7 @@
601
766
  .kyro-form-input:focus {
602
767
  outline: none;
603
768
  border-color: var(--kyro-black);
604
- box-shadow: 0 0 0 3px rgba(11, 18, 34, 0.08);
769
+ box-shadow: 0 0 0 3px var(--kyro-sidebar-border);
605
770
  }
606
771
 
607
772
  .kyro-form-input::placeholder {
@@ -644,7 +809,7 @@
644
809
 
645
810
  .kyro-form-checkbox-label {
646
811
  font-size: 14px;
647
- color: var(--kyro-gray-900);
812
+ color: var(--kyro-text-primary);
648
813
  }
649
814
 
650
815
  .kyro-form-radio-group {
@@ -673,24 +838,24 @@
673
838
  }
674
839
 
675
840
  .kyro-form-group {
676
- border: 1px solid var(--kyro-gray-200);
841
+ border: 1px solid var(--kyro-border);
677
842
  border-radius: 8px;
678
843
  overflow: hidden;
679
844
  }
680
845
 
681
846
  .kyro-form-group-header {
682
847
  padding: 12px 16px;
683
- background: var(--kyro-gray-50);
684
- border-bottom: 1px solid var(--kyro-gray-200);
848
+ background: var(--kyro-surface-accent);
849
+ border-bottom: 1px solid var(--kyro-border);
685
850
  }
686
851
 
687
852
  .kyro-form-group-title {
688
853
  font-size: 13px;
689
854
  font-weight: 600;
690
- color: var(--kyro-gray-900);
855
+ color: var(--kyro-text-primary);
691
856
  padding: 12px 16px;
692
- background: var(--kyro-gray-50);
693
- border-bottom: 1px solid var(--kyro-gray-200);
857
+ background: var(--kyro-surface-accent);
858
+ border-bottom: 1px solid var(--kyro-border);
694
859
  }
695
860
 
696
861
  .kyro-form-group-fields {
@@ -734,7 +899,7 @@
734
899
  .kyro-form-color {
735
900
  width: 42px;
736
901
  height: 42px;
737
- border: 1px solid var(--kyro-gray-200);
902
+ border: 1px solid var(--kyro-border);
738
903
  border-radius: 6px;
739
904
  cursor: pointer;
740
905
  padding: 2px;
@@ -760,7 +925,7 @@
760
925
 
761
926
  /* Relationship field */
762
927
  .kyro-form-relationship {
763
- border: 1px solid var(--kyro-gray-200);
928
+ border: 1px solid var(--kyro-border);
764
929
  border-radius: 6px;
765
930
  cursor: pointer;
766
931
  transition: all 150ms ease;
@@ -775,8 +940,8 @@
775
940
  display: flex;
776
941
  align-items: center;
777
942
  justify-content: space-between;
778
- background: var(--kyro-gray-50);
779
- border-bottom: 1px solid var(--kyro-gray-200);
943
+ background: var(--kyro-surface-accent);
944
+ border-bottom: 1px solid var(--kyro-border);
780
945
  border-radius: 5px 5px 0 0;
781
946
  }
782
947
 
@@ -791,8 +956,8 @@
791
956
  .kyro-form-relationship-badge {
792
957
  font-size: 10px;
793
958
  padding: 2px 6px;
794
- background: var(--kyro-gray-200);
795
- color: var(--kyro-gray-600);
959
+ background: var(--kyro-gray-100);
960
+ color: var(--kyro-text-secondary);
796
961
  border-radius: 3px;
797
962
  font-weight: 600;
798
963
  }
@@ -800,7 +965,7 @@
800
965
  .kyro-form-relationship-value {
801
966
  padding: 10px 12px;
802
967
  font-size: 14px;
803
- color: var(--kyro-gray-900);
968
+ color: var(--kyro-text-primary);
804
969
  }
805
970
 
806
971
  .kyro-form-relationship-empty {
@@ -809,69 +974,106 @@
809
974
  color: var(--kyro-gray-400);
810
975
  }
811
976
 
812
- /* Array field */
977
+ /* Array field - more compact */
813
978
  .kyro-form-array {
814
979
  display: flex;
815
980
  flex-direction: column;
816
- gap: 12px;
981
+ gap: 6px;
817
982
  }
818
983
 
819
984
  .kyro-form-array-empty {
820
- padding: 32px;
985
+ padding: 12px;
821
986
  text-align: center;
822
- background: white;
823
- border: 2px dashed var(--kyro-gray-200);
824
- border-radius: 8px;
825
- color: var(--kyro-gray-500);
826
- font-size: 13px;
987
+ background: var(--kyro-surface);
988
+ border: 2px dashed var(--kyro-border);
989
+ border-radius: 6px;
990
+ color: var(--kyro-text-muted);
991
+ font-size: 12px;
827
992
  }
828
993
 
829
994
  .kyro-form-array-item {
830
- background: white;
831
- border: 1px solid var(--kyro-gray-200);
832
- border-radius: 8px;
995
+ background: var(--kyro-surface);
996
+ border: 1px solid var(--kyro-border);
997
+ border-radius: 6px;
833
998
  overflow: hidden;
999
+ padding: 6px;
834
1000
  }
835
1001
 
836
1002
  .kyro-form-array-item-header {
837
1003
  display: flex;
838
1004
  align-items: center;
839
1005
  justify-content: space-between;
840
- padding: 10px 12px;
841
- background: var(--kyro-gray-50);
842
- border-bottom: 1px solid var(--kyro-gray-200);
1006
+ padding: 4px 6px;
1007
+ background: var(--kyro-surface-accent);
1008
+ border-bottom: 1px solid var(--kyro-border);
843
1009
  }
844
1010
 
845
1011
  .kyro-form-array-item-number {
846
- font-size: 12px;
1012
+ font-size: 10px;
847
1013
  font-weight: 600;
848
1014
  color: var(--kyro-gray-500);
1015
+ background: var(--kyro-surface);
1016
+ padding: 1px 4px;
1017
+ border-radius: 3px;
849
1018
  }
850
1019
 
851
1020
  .kyro-form-array-item-remove {
852
1021
  display: flex;
853
1022
  align-items: center;
854
1023
  justify-content: center;
855
- width: 24px;
856
- height: 24px;
1024
+ width: 18px;
1025
+ height: 18px;
857
1026
  border: none;
858
1027
  background: transparent;
859
1028
  color: var(--kyro-gray-400);
860
1029
  cursor: pointer;
861
- border-radius: 4px;
1030
+ border-radius: 3px;
862
1031
  transition: all 150ms ease;
863
1032
  }
864
1033
 
865
1034
  .kyro-form-array-item-remove:hover {
866
- background: var(--kyro-gray-200);
867
- color: var(--kyro-black);
1035
+ background: #fee2e2;
1036
+ color: #dc2626;
868
1037
  }
869
1038
 
870
1039
  .kyro-form-array-item-fields {
871
- padding: 16px;
1040
+ padding: 6px;
872
1041
  display: flex;
873
1042
  flex-direction: column;
874
- gap: 12px;
1043
+ gap: 6px;
1044
+ }
1045
+
1046
+ /* Make sub-field labels more compact in arrays */
1047
+ .kyro-form-array-item-fields .kyro-form-label {
1048
+ font-size: 10px;
1049
+ margin-bottom: 1px;
1050
+ }
1051
+
1052
+ .kyro-form-array-item-fields .kyro-form-input {
1053
+ padding: 4px 6px;
1054
+ font-size: 11px;
1055
+ }
1056
+
1057
+ /* Array item add button */
1058
+ .kyro-form-array-add {
1059
+ display: inline-flex;
1060
+ align-items: center;
1061
+ gap: 4px;
1062
+ padding: 6px 10px;
1063
+ font-size: 11px;
1064
+ font-weight: 600;
1065
+ color: var(--kyro-text-secondary);
1066
+ background: var(--kyro-surface-accent);
1067
+ border: 1px dashed var(--kyro-border);
1068
+ border-radius: 6px;
1069
+ cursor: pointer;
1070
+ transition: all 150ms ease;
1071
+ }
1072
+
1073
+ .kyro-form-array-add:hover {
1074
+ background: var(--kyro-surface);
1075
+ border-color: var(--kyro-sidebar-active);
1076
+ color: var(--kyro-sidebar-active);
875
1077
  }
876
1078
 
877
1079
  /* Blocks field */
@@ -884,18 +1086,19 @@
884
1086
  .kyro-form-blocks-empty {
885
1087
  padding: 32px;
886
1088
  text-align: center;
887
- background: white;
888
- border: 2px dashed var(--kyro-gray-200);
1089
+ background: var(--kyro-surface);
1090
+ border: 2px dashed var(--kyro-border);
889
1091
  border-radius: 8px;
890
- color: var(--kyro-gray-500);
1092
+ color: var(--kyro-text-muted);
891
1093
  font-size: 13px;
892
1094
  }
893
1095
 
894
1096
  .kyro-form-block-item {
895
- background: white;
896
- border: 1px solid var(--kyro-gray-200);
1097
+ background: var(--kyro-surface);
1098
+ border: 1px solid var(--kyro-border);
897
1099
  border-radius: 8px;
898
1100
  overflow: hidden;
1101
+ padding: 10px;
899
1102
  }
900
1103
 
901
1104
  .kyro-form-block-item-header {
@@ -903,8 +1106,8 @@
903
1106
  align-items: center;
904
1107
  justify-content: space-between;
905
1108
  padding: 10px 12px;
906
- background: var(--kyro-gray-50);
907
- border-bottom: 1px solid var(--kyro-gray-200);
1109
+ background: var(--kyro-surface-accent);
1110
+ border-bottom: 1px solid var(--kyro-border);
908
1111
  }
909
1112
 
910
1113
  .kyro-form-block-item-type {
@@ -935,7 +1138,7 @@
935
1138
 
936
1139
  .kyro-form-block-item-move:hover,
937
1140
  .kyro-form-block-item-remove:hover {
938
- background: var(--kyro-gray-200);
1141
+ background: var(--kyro-surface-accent);
939
1142
  color: var(--kyro-black);
940
1143
  }
941
1144
 
@@ -973,7 +1176,7 @@
973
1176
  }
974
1177
 
975
1178
  .kyro-form-tab {
976
- border: 1px solid var(--kyro-gray-200);
1179
+ border: 1px solid var(--kyro-border);
977
1180
  border-radius: 8px;
978
1181
  overflow: hidden;
979
1182
  }
@@ -981,10 +1184,10 @@
981
1184
  .kyro-form-tab-title {
982
1185
  font-size: 13px;
983
1186
  font-weight: 600;
984
- color: var(--kyro-gray-900);
1187
+ color: var(--kyro-text-primary);
985
1188
  padding: 10px 16px;
986
- background: var(--kyro-gray-50);
987
- border-bottom: 1px solid var(--kyro-gray-200);
1189
+ background: var(--kyro-surface-accent);
1190
+ border-bottom: 1px solid var(--kyro-border);
988
1191
  margin: 0;
989
1192
  }
990
1193
 
@@ -997,7 +1200,7 @@
997
1200
 
998
1201
  /* Collapsible */
999
1202
  .kyro-form-collapsible {
1000
- border: 1px solid var(--kyro-gray-200);
1203
+ border: 1px solid var(--kyro-border);
1001
1204
  border-radius: 8px;
1002
1205
  overflow: hidden;
1003
1206
  }
@@ -1008,10 +1211,10 @@
1008
1211
  gap: 8px;
1009
1212
  width: 100%;
1010
1213
  padding: 12px 16px;
1011
- background: var(--kyro-gray-50);
1214
+ background: var(--kyro-surface-accent);
1012
1215
  font-size: 13px;
1013
1216
  font-weight: 600;
1014
- color: var(--kyro-gray-900);
1217
+ color: var(--kyro-text-primary);
1015
1218
  border: none;
1016
1219
  cursor: pointer;
1017
1220
  text-align: left;
@@ -1040,23 +1243,23 @@
1040
1243
 
1041
1244
  /* Upload */
1042
1245
  .kyro-form-upload {
1043
- border: 2px dashed var(--kyro-gray-200);
1246
+ border: 2px dashed var(--kyro-border);
1044
1247
  border-radius: 8px;
1045
1248
  padding: 32px;
1046
1249
  text-align: center;
1047
1250
  cursor: pointer;
1048
1251
  transition: all 150ms ease;
1049
- background: white;
1252
+ background: var(--kyro-surface);
1050
1253
  }
1051
1254
 
1052
1255
  .kyro-form-upload:hover,
1053
1256
  .kyro-form-upload-dragging {
1054
1257
  border-color: var(--kyro-black);
1055
- background: var(--kyro-gray-50);
1258
+ background: var(--kyro-surface-accent);
1056
1259
  }
1057
1260
 
1058
1261
  .kyro-form-upload-error {
1059
- border-color: var(--kyro-gray-900);
1262
+ border-color: var(--kyro-black);
1060
1263
  }
1061
1264
 
1062
1265
  .kyro-form-upload-input {
@@ -1092,7 +1295,7 @@
1092
1295
  height: 64px;
1093
1296
  border-radius: 6px;
1094
1297
  object-fit: cover;
1095
- border: 1px solid var(--kyro-gray-200);
1298
+ border: 1px solid var(--kyro-border);
1096
1299
  }
1097
1300
 
1098
1301
  .kyro-form-upload-info {
@@ -1105,7 +1308,7 @@
1105
1308
  .kyro-form-upload-filename {
1106
1309
  font-size: 13px;
1107
1310
  font-weight: 500;
1108
- color: var(--kyro-gray-900);
1311
+ color: var(--kyro-text-primary);
1109
1312
  }
1110
1313
 
1111
1314
  .kyro-form-upload-change {
@@ -1136,27 +1339,27 @@
1136
1339
 
1137
1340
  .kyro-badge-default {
1138
1341
  background: var(--kyro-gray-100);
1139
- color: var(--kyro-gray-600);
1342
+ color: var(--kyro-text-secondary);
1140
1343
  }
1141
1344
 
1142
1345
  .kyro-badge-success {
1143
1346
  background: var(--kyro-gray-100);
1144
- color: var(--kyro-gray-900);
1347
+ color: var(--kyro-text-primary);
1145
1348
  }
1146
1349
 
1147
1350
  .kyro-badge-warning {
1148
1351
  background: var(--kyro-gray-200);
1149
- color: var(--kyro-gray-800);
1352
+ color: var(--kyro-text-primary);
1150
1353
  }
1151
1354
 
1152
1355
  .kyro-badge-danger {
1153
1356
  background: var(--kyro-gray-200);
1154
- color: var(--kyro-gray-900);
1357
+ color: var(--kyro-text-primary);
1155
1358
  }
1156
1359
 
1157
1360
  .kyro-badge-info {
1158
1361
  background: var(--kyro-gray-100);
1159
- color: var(--kyro-gray-700);
1362
+ color: var(--kyro-text-secondary);
1160
1363
  }
1161
1364
 
1162
1365
  /* Toast — Monochrome */
@@ -1169,11 +1372,12 @@
1169
1372
  gap: 12px;
1170
1373
  padding: 14px 18px;
1171
1374
  background: var(--kyro-black);
1172
- color: white;
1375
+ color: var(--kyro-sidebar-text-active);
1173
1376
  border-radius: 8px;
1174
1377
  box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
1175
1378
  animation: toast-in 0.2s ease;
1176
- z-index: 1000;
1379
+ z-index: 9999;
1380
+ pointer-events: auto;
1177
1381
  }
1178
1382
 
1179
1383
  @keyframes toast-in {
@@ -1189,11 +1393,11 @@
1189
1393
  }
1190
1394
 
1191
1395
  .kyro-toast-success {
1192
- border-left: 4px solid var(--kyro-gray-300);
1396
+ border-left: 4px solid var(--kyro-success);
1193
1397
  }
1194
1398
 
1195
1399
  .kyro-toast-error {
1196
- border-left: 4px solid white;
1400
+ border-left: 4px solid #ef4444;
1197
1401
  }
1198
1402
 
1199
1403
  .kyro-toast-warning {
@@ -1212,7 +1416,7 @@
1212
1416
  height: 20px;
1213
1417
  border: none;
1214
1418
  background: transparent;
1215
- color: rgba(255, 255, 255, 0.5);
1419
+ color: var(--kyro-text-muted);
1216
1420
  cursor: pointer;
1217
1421
  margin-left: 8px;
1218
1422
  }
@@ -1227,6 +1431,11 @@
1227
1431
  color: var(--kyro-black);
1228
1432
  }
1229
1433
 
1434
+ /* Alias used by inline upload spinner */
1435
+ .kyro-spin {
1436
+ animation: spin 0.8s linear infinite;
1437
+ }
1438
+
1230
1439
  .kyro-spinner-sm {
1231
1440
  width: 14px;
1232
1441
  height: 14px;
@@ -1268,12 +1477,13 @@
1268
1477
  display: flex;
1269
1478
  align-items: center;
1270
1479
  justify-content: center;
1271
- z-index: 1000;
1480
+ z-index: 9999;
1272
1481
  backdrop-filter: blur(4px);
1482
+ pointer-events: auto;
1273
1483
  }
1274
1484
 
1275
1485
  .kyro-modal {
1276
- background: white;
1486
+ background: var(--kyro-surface);
1277
1487
  border-radius: 10px;
1278
1488
  padding: 24px;
1279
1489
  max-width: 400px;
@@ -1297,12 +1507,12 @@
1297
1507
  margin: 0 0 8px;
1298
1508
  font-size: 18px;
1299
1509
  font-weight: 600;
1300
- color: var(--kyro-gray-900);
1510
+ color: var(--kyro-text-primary);
1301
1511
  }
1302
1512
 
1303
1513
  .kyro-modal p {
1304
1514
  margin: 0 0 16px;
1305
- color: var(--kyro-gray-600);
1515
+ color: var(--kyro-text-secondary);
1306
1516
  font-size: 14px;
1307
1517
  }
1308
1518
 
@@ -1314,7 +1524,7 @@
1314
1524
 
1315
1525
  /* Searchable Relationship Modal */
1316
1526
  .kyro-relation-modal {
1317
- background: white;
1527
+ background: var(--kyro-surface);
1318
1528
  border-radius: 12px;
1319
1529
  max-width: 520px;
1320
1530
  width: 100%;
@@ -1336,7 +1546,7 @@
1336
1546
  .kyro-relation-modal-header h3 {
1337
1547
  font-size: 16px;
1338
1548
  font-weight: 600;
1339
- color: var(--kyro-gray-900);
1549
+ color: var(--kyro-text-primary);
1340
1550
  margin: 0;
1341
1551
  }
1342
1552
 
@@ -1344,9 +1554,9 @@
1344
1554
  width: 100%;
1345
1555
  padding: 10px 12px;
1346
1556
  font-size: 14px;
1347
- color: var(--kyro-gray-900);
1348
- background: var(--kyro-gray-50);
1349
- border: 1px solid var(--kyro-gray-200);
1557
+ color: var(--kyro-text-primary);
1558
+ background: var(--kyro-surface-accent);
1559
+ border: 1px solid var(--kyro-border);
1350
1560
  border-radius: 6px;
1351
1561
  transition: all 150ms ease;
1352
1562
  font-family: inherit;
@@ -1355,8 +1565,8 @@
1355
1565
  .kyro-relation-modal-search:focus {
1356
1566
  outline: none;
1357
1567
  border-color: var(--kyro-black);
1358
- box-shadow: 0 0 0 3px rgba(11, 18, 34, 0.08);
1359
- background: white;
1568
+ box-shadow: 0 0 0 3px var(--kyro-sidebar-border);
1569
+ background: var(--kyro-surface);
1360
1570
  }
1361
1571
 
1362
1572
  .kyro-relation-modal-search::placeholder {
@@ -1377,7 +1587,7 @@
1377
1587
  width: 100%;
1378
1588
  padding: 10px 16px;
1379
1589
  font-size: 14px;
1380
- color: var(--kyro-gray-900);
1590
+ color: var(--kyro-text-primary);
1381
1591
  background: transparent;
1382
1592
  border: none;
1383
1593
  border-radius: 6px;
@@ -1388,12 +1598,12 @@
1388
1598
  }
1389
1599
 
1390
1600
  .kyro-relation-modal-item:hover {
1391
- background: var(--kyro-gray-50);
1601
+ background: var(--kyro-surface-accent);
1392
1602
  }
1393
1603
 
1394
1604
  .kyro-relation-modal-item.selected {
1395
1605
  background: var(--kyro-black);
1396
- color: white;
1606
+ color: var(--kyro-sidebar-text-active);
1397
1607
  }
1398
1608
 
1399
1609
  .kyro-relation-modal-item-id {
@@ -1415,7 +1625,7 @@
1415
1625
 
1416
1626
  .kyro-relation-modal-footer {
1417
1627
  padding: 16px 24px;
1418
- border-top: 1px solid var(--kyro-gray-100);
1628
+ border-top: 1px solid var(--kyro-border);
1419
1629
  display: flex;
1420
1630
  justify-content: flex-end;
1421
1631
  gap: 8px;
@@ -1432,7 +1642,7 @@
1432
1642
  width: 36px;
1433
1643
  height: 36px;
1434
1644
  border-radius: 6px;
1435
- border: 1px solid var(--kyro-gray-200);
1645
+ border: 1px solid var(--kyro-border);
1436
1646
  cursor: pointer;
1437
1647
  padding: 0;
1438
1648
  overflow: hidden;
@@ -1474,7 +1684,7 @@
1474
1684
  .kyro-login-title {
1475
1685
  font-size: 24px;
1476
1686
  font-weight: 700;
1477
- color: var(--kyro-black);
1687
+ color: var(--kyro-text-primary);
1478
1688
  margin: 0 0 8px;
1479
1689
  letter-spacing: -0.02em;
1480
1690
  }
@@ -1500,16 +1710,16 @@
1500
1710
  .kyro-login-form .kyro-form-group label {
1501
1711
  font-size: 13px;
1502
1712
  font-weight: 500;
1503
- color: var(--kyro-gray-900);
1713
+ color: var(--kyro-text-primary);
1504
1714
  }
1505
1715
 
1506
1716
  .kyro-login-form .kyro-form-group input {
1507
1717
  width: 100%;
1508
1718
  padding: 10px 12px;
1509
1719
  font-size: 14px;
1510
- color: var(--kyro-gray-900);
1511
- background: white;
1512
- border: 1px solid var(--kyro-gray-200);
1720
+ color: var(--kyro-text-primary);
1721
+ background: var(--kyro-input-bg);
1722
+ border: 1px solid var(--kyro-input-border);
1513
1723
  border-radius: 6px;
1514
1724
  transition: all 150ms ease;
1515
1725
  font-family: inherit;
@@ -1522,7 +1732,7 @@
1522
1732
  .kyro-login-form .kyro-form-group input:focus {
1523
1733
  outline: none;
1524
1734
  border-color: var(--kyro-black);
1525
- box-shadow: 0 0 0 3px rgba(11, 18, 34, 0.08);
1735
+ box-shadow: 0 0 0 3px var(--kyro-sidebar-border);
1526
1736
  }
1527
1737
 
1528
1738
  .kyro-login-form .kyro-form-group input::placeholder {
@@ -1548,7 +1758,7 @@
1548
1758
  .kyro-login-link {
1549
1759
  background: none;
1550
1760
  border: none;
1551
- color: var(--kyro-black);
1761
+ color: var(--kyro-text-primary);
1552
1762
  font-weight: 600;
1553
1763
  cursor: pointer;
1554
1764
  font-size: 14px;
@@ -1559,6 +1769,7 @@
1559
1769
 
1560
1770
  .kyro-login-link:hover {
1561
1771
  color: var(--kyro-black-hover);
1772
+ text-decoration: none;
1562
1773
  }
1563
1774
 
1564
1775
  /* Sidebar User Info */
@@ -1592,6 +1803,220 @@
1592
1803
 
1593
1804
  .kyro-sidebar-logout:hover {
1594
1805
  color: var(--kyro-black) !important;
1595
- background: var(--kyro-gray-100);
1806
+ background: var(--kyro-surface-accent);
1807
+ }
1808
+ }
1809
+
1810
+ /* ============================================================================
1811
+ PORTABLE TEXT EDITOR
1812
+ Basic styles for Portable Text Editor - handled by component inline styles
1813
+ ============================================================================ */
1814
+
1815
+ /* End of styles */
1816
+
1817
+ .tiptap-editor-wrapper .ProseMirror {
1818
+ outline: none;
1819
+ }
1820
+
1821
+ .tiptap-editor-wrapper .ProseMirror > * + * {
1822
+ margin-top: 0.75em;
1823
+ }
1824
+
1825
+ /* NodeView wrapper isolation - prevents CSS Grid/Flexbox interference */
1826
+ .tiptap-editor-wrapper [data-node-view-wrapper],
1827
+ .tiptap-editor-wrapper [data-node-view-wrapper] * {
1828
+ isolation: isolate;
1829
+ position: relative;
1830
+ }
1831
+
1832
+ /* Block node styles */
1833
+ .tiptap-editor-wrapper .tiptap-hero-block,
1834
+ .tiptap-editor-wrapper .tiptap-heading-block,
1835
+ .tiptap-editor-wrapper .tiptap-paragraph-block,
1836
+ .tiptap-editor-wrapper .tiptap-quote-block,
1837
+ .tiptap-editor-wrapper .tiptap-code-block,
1838
+ .tiptap-editor-wrapper .tiptap-image-block,
1839
+ .tiptap-editor-wrapper .tiptap-video-block,
1840
+ .tiptap-editor-wrapper .tiptap-divider-block,
1841
+ .tiptap-editor-wrapper .tiptap-button-block,
1842
+ .tiptap-editor-wrapper .tiptap-callout-block {
1843
+ position: relative;
1844
+ z-index: 1;
1845
+ }
1846
+
1847
+ /* Layout blocks with proper isolation */
1848
+ .tiptap-editor-wrapper .tiptap-columns-block,
1849
+ .tiptap-editor-wrapper .tiptap-stack-block,
1850
+ .tiptap-editor-wrapper .tiptap-column-block,
1851
+ .tiptap-editor-wrapper .tiptap-group-block,
1852
+ .tiptap-editor-wrapper .tiptap-card-block,
1853
+ .tiptap-editor-wrapper .tiptap-repeater-block,
1854
+ .tiptap-editor-wrapper .tiptap-accordion-block {
1855
+ position: relative;
1856
+ z-index: 1;
1857
+ isolation: isolate;
1858
+ }
1859
+
1860
+ .tiptap-editor-wrapper .tiptap-columns-grid[data-node-view-content] {
1861
+ display: flex;
1862
+ flex-wrap: wrap;
1863
+ gap: 0.75rem;
1864
+ align-items: start;
1865
+ font-size: 0;
1866
+ }
1867
+
1868
+ .tiptap-editor-wrapper .tiptap-columns-grid[data-node-view-content] > * {
1869
+ font-size: 0.875rem;
1870
+ min-width: 0;
1871
+ }
1872
+
1873
+ .tiptap-editor-wrapper .tiptap-columns-grid--1[data-node-view-content] {
1874
+ display: block;
1875
+ }
1876
+
1877
+ .tiptap-editor-wrapper .tiptap-columns-grid--2[data-node-view-content] {
1878
+ display: flex;
1879
+ }
1880
+
1881
+ .tiptap-editor-wrapper .tiptap-columns-grid--3[data-node-view-content] {
1882
+ display: flex;
1883
+ }
1884
+
1885
+ .tiptap-editor-wrapper .tiptap-columns-grid--4[data-node-view-content] {
1886
+ display: flex;
1887
+ }
1888
+
1889
+ .tiptap-editor-wrapper .tiptap-columns-grid--5[data-node-view-content] {
1890
+ display: flex;
1891
+ }
1892
+
1893
+ .tiptap-editor-wrapper .tiptap-columns-grid--6[data-node-view-content] {
1894
+ display: flex;
1895
+ }
1896
+
1897
+ .tiptap-editor-wrapper .tiptap-column-block {
1898
+ display: inline-block;
1899
+ font-size: 0.875rem;
1900
+ flex: 0 0 auto;
1901
+ min-width: 0;
1902
+ height: 100%;
1903
+ vertical-align: top;
1904
+ }
1905
+
1906
+ .tiptap-editor-wrapper .tiptap-column-content[data-node-view-content] {
1907
+ display: block;
1908
+ min-height: 84px;
1909
+ }
1910
+
1911
+ .tiptap-editor-wrapper
1912
+ .tiptap-column-content[data-node-view-content]
1913
+ > *:first-child {
1914
+ margin-top: 0;
1915
+ }
1916
+
1917
+ .tiptap-editor-wrapper
1918
+ .tiptap-column-content[data-node-view-content]
1919
+ > *:last-child {
1920
+ margin-bottom: 0;
1921
+ }
1922
+
1923
+ .tiptap-editor-wrapper .tiptap-stack-block [data-node-view-content],
1924
+ .tiptap-editor-wrapper .tiptap-group-block [data-node-view-content],
1925
+ .tiptap-editor-wrapper .tiptap-card-block [data-node-view-content] {
1926
+ display: contents;
1927
+ }
1928
+
1929
+ .tiptap-editor-wrapper .tiptap-columns-block--1 .tiptap-column-block {
1930
+ width: 100%;
1931
+ flex-basis: 100%;
1932
+ }
1933
+
1934
+ .tiptap-editor-wrapper
1935
+ .tiptap-columns-block--1
1936
+ .tiptap-columns-grid[data-node-view-content]
1937
+ > * {
1938
+ width: 100%;
1939
+ flex: 0 0 100%;
1940
+ }
1941
+
1942
+ .tiptap-editor-wrapper .tiptap-columns-block--2 .tiptap-column-block {
1943
+ width: calc(50% - 0.375rem);
1944
+ flex-basis: calc(50% - 0.375rem);
1945
+ }
1946
+
1947
+ .tiptap-editor-wrapper
1948
+ .tiptap-columns-block--2
1949
+ .tiptap-columns-grid[data-node-view-content]
1950
+ > * {
1951
+ width: calc(50% - 0.375rem);
1952
+ flex: 0 0 calc(50% - 0.375rem);
1953
+ }
1954
+
1955
+ .tiptap-editor-wrapper .tiptap-columns-block--3 .tiptap-column-block {
1956
+ width: calc(33.333% - 0.5rem);
1957
+ flex-basis: calc(33.333% - 0.5rem);
1958
+ }
1959
+
1960
+ .tiptap-editor-wrapper
1961
+ .tiptap-columns-block--3
1962
+ .tiptap-columns-grid[data-node-view-content]
1963
+ > * {
1964
+ width: calc(33.333% - 0.5rem);
1965
+ flex: 0 0 calc(33.333% - 0.5rem);
1966
+ }
1967
+
1968
+ .tiptap-editor-wrapper .tiptap-columns-block--4 .tiptap-column-block {
1969
+ width: calc(25% - 0.5625rem);
1970
+ flex-basis: calc(25% - 0.5625rem);
1971
+ }
1972
+
1973
+ .tiptap-editor-wrapper
1974
+ .tiptap-columns-block--4
1975
+ .tiptap-columns-grid[data-node-view-content]
1976
+ > * {
1977
+ width: calc(25% - 0.5625rem);
1978
+ flex: 0 0 calc(25% - 0.5625rem);
1979
+ }
1980
+
1981
+ .tiptap-editor-wrapper .tiptap-columns-block--5 .tiptap-column-block {
1982
+ width: calc(20% - 0.6rem);
1983
+ flex-basis: calc(20% - 0.6rem);
1984
+ }
1985
+
1986
+ .tiptap-editor-wrapper
1987
+ .tiptap-columns-block--5
1988
+ .tiptap-columns-grid[data-node-view-content]
1989
+ > * {
1990
+ width: calc(20% - 0.6rem);
1991
+ flex: 0 0 calc(20% - 0.6rem);
1992
+ }
1993
+
1994
+ .tiptap-editor-wrapper .tiptap-columns-block--6 .tiptap-column-block {
1995
+ width: calc(16.666% - 0.625rem);
1996
+ flex-basis: calc(16.666% - 0.625rem);
1997
+ }
1998
+
1999
+ .tiptap-editor-wrapper
2000
+ .tiptap-columns-block--6
2001
+ .tiptap-columns-grid[data-node-view-content]
2002
+ > * {
2003
+ width: calc(16.666% - 0.625rem);
2004
+ flex: 0 0 calc(16.666% - 0.625rem);
2005
+ }
2006
+
2007
+ @media (max-width: 720px) {
2008
+ .tiptap-editor-wrapper .tiptap-columns-grid[data-node-view-content] {
2009
+ display: block !important;
1596
2010
  }
1597
2011
  }
2012
+
2013
+ /* Drag handle visibility */
2014
+ .tiptap-editor-wrapper .group:hover .drag-handle,
2015
+ .tiptap-editor-wrapper .group:hover .tiptap-drag-handle {
2016
+ opacity: 1;
2017
+ }
2018
+
2019
+ /* Ensure NodeViews render correctly within ProseMirror */
2020
+ .tiptap-editor-wrapper .ProseMirror .node--component {
2021
+ display: block;
2022
+ }