@kyro-cms/admin 0.1.6 → 0.1.8

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 (179) hide show
  1. package/README.md +149 -51
  2. package/package.json +54 -5
  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 +137 -28
  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 +2155 -770
  11. package/src/components/BrandingHub.tsx +267 -0
  12. package/src/components/BulkActionsBar.tsx +3 -3
  13. package/src/components/CreateView.tsx +4 -4
  14. package/src/components/Dashboard.tsx +393 -0
  15. package/src/components/DetailView.tsx +200 -58
  16. package/src/components/DeveloperCenter.tsx +403 -0
  17. package/src/components/EnhancedListView.tsx +890 -0
  18. package/src/components/GraphQLExplorer.tsx +675 -0
  19. package/src/components/GraphQLPlayground.tsx +627 -0
  20. package/src/components/ListView.tsx +192 -54
  21. package/src/components/MediaGallery.tsx +1569 -0
  22. package/src/components/Modal.tsx +206 -0
  23. package/src/components/RestPlayground.tsx +951 -0
  24. package/src/components/Sidebar.astro +237 -0
  25. package/src/components/ThemeProvider.tsx +8 -2
  26. package/src/components/UserManagement.tsx +204 -0
  27. package/src/components/VersionHistoryPanel.tsx +3 -3
  28. package/src/components/WebhookManager.tsx +608 -0
  29. package/src/components/blocks/AccordionBlock.tsx +65 -0
  30. package/src/components/blocks/ArrayBlock.tsx +84 -0
  31. package/src/components/blocks/BlockEditModal.tsx +363 -0
  32. package/src/components/blocks/ButtonBlock.tsx +64 -0
  33. package/src/components/blocks/ChildBlocksTree.tsx +551 -0
  34. package/src/components/blocks/CodeBlock.tsx +114 -0
  35. package/src/components/blocks/ColumnsBlock.tsx +93 -0
  36. package/src/components/blocks/DividerBlock.tsx +43 -0
  37. package/src/components/blocks/FileBlock.tsx +63 -0
  38. package/src/components/blocks/HeadingBlock.tsx +59 -0
  39. package/src/components/blocks/HeroBlock.tsx +99 -0
  40. package/src/components/blocks/ImageBlock.tsx +82 -0
  41. package/src/components/blocks/LinkBlock.tsx +65 -0
  42. package/src/components/blocks/ListBlock.tsx +60 -0
  43. package/src/components/blocks/ParagraphBlock.tsx +61 -0
  44. package/src/components/blocks/RelationshipBlock.tsx +72 -0
  45. package/src/components/blocks/RichTextBlock.tsx +66 -0
  46. package/src/components/blocks/VStackBlock.tsx +61 -0
  47. package/src/components/blocks/VideoBlock.tsx +65 -0
  48. package/src/components/blocks/index.ts +10 -0
  49. package/src/components/fields/AccordionField.tsx +213 -0
  50. package/src/components/fields/ArrayField.tsx +241 -0
  51. package/src/components/fields/BlocksField.tsx +323 -0
  52. package/src/components/fields/ButtonField.tsx +53 -0
  53. package/src/components/fields/CheckboxField.tsx +18 -8
  54. package/src/components/fields/ChildrenField.tsx +48 -0
  55. package/src/components/fields/CodeField.tsx +294 -0
  56. package/src/components/fields/ColumnsField.tsx +137 -0
  57. package/src/components/fields/DateField.tsx +24 -12
  58. package/src/components/fields/EditorClient.tsx +537 -0
  59. package/src/components/fields/HeadingField.tsx +31 -0
  60. package/src/components/fields/HeroField.tsx +101 -0
  61. package/src/components/fields/JSONField.tsx +341 -0
  62. package/src/components/fields/LinkField.tsx +81 -0
  63. package/src/components/fields/ListField.tsx +74 -0
  64. package/src/components/fields/MarkdownField.tsx +260 -0
  65. package/src/components/fields/NumberField.tsx +25 -13
  66. package/src/components/fields/PortableTextField.tsx +155 -0
  67. package/src/components/fields/PortableTextRenderer.tsx +68 -0
  68. package/src/components/fields/RelationshipBlockField.tsx +233 -0
  69. package/src/components/fields/RelationshipField.tsx +278 -60
  70. package/src/components/fields/SelectField.tsx +28 -16
  71. package/src/components/fields/TextField.tsx +31 -15
  72. package/src/components/fields/UploadField.tsx +613 -0
  73. package/src/components/fields/VideoField.tsx +73 -0
  74. package/src/components/fields/extensions/blockComponents.tsx +247 -0
  75. package/src/components/fields/extensions/blocksStore.ts +273 -0
  76. package/src/components/fields/index.ts +24 -0
  77. package/src/components/index.ts +1 -2
  78. package/src/components/layout/Header.tsx +2 -2
  79. package/src/components/layout/Layout.tsx +3 -3
  80. package/src/components/ui/Badge.tsx +9 -4
  81. package/src/components/ui/BlockDrawer.tsx +79 -0
  82. package/src/components/ui/Button.tsx +1 -1
  83. package/src/components/ui/CommandPalette.tsx +362 -0
  84. package/src/components/ui/CommandPaletteWrapper.tsx +97 -0
  85. package/src/components/ui/Dropdown.tsx +1 -1
  86. package/src/components/ui/Modal.tsx +37 -12
  87. package/src/components/ui/PromptModal.tsx +94 -0
  88. package/src/components/ui/SlidePanel.tsx +43 -16
  89. package/src/components/ui/Toast.tsx +80 -14
  90. package/src/env.d.ts +16 -0
  91. package/src/env.ts +20 -0
  92. package/src/index.ts +0 -1
  93. package/src/layouts/AdminLayout.astro +164 -170
  94. package/src/layouts/AuthLayout.astro +23 -6
  95. package/src/lib/MediaService.ts +541 -0
  96. package/src/lib/api.ts +163 -0
  97. package/src/lib/auth/sqlite-adapter.ts +319 -0
  98. package/src/lib/config.ts +23 -7
  99. package/src/lib/dataStore.ts +188 -73
  100. package/src/lib/date-utils.ts +69 -0
  101. package/src/lib/db/adapter.ts +54 -0
  102. package/src/lib/db/drizzle-mysql-adapter.ts +194 -0
  103. package/src/lib/db/drizzle-mysql-auth-adapter.ts +327 -0
  104. package/src/lib/db/drizzle-postgres-adapter.ts +202 -0
  105. package/src/lib/db/drizzle-postgres-auth-adapter.ts +304 -0
  106. package/src/lib/db/drizzle-sqlite-adapter.ts +227 -0
  107. package/src/lib/db/drizzle-sqlite-auth-adapter.ts +548 -0
  108. package/src/lib/db/index.ts +449 -0
  109. package/src/lib/db/mongodb-adapter.ts +207 -0
  110. package/src/lib/db/mongodb-auth-adapter.ts +305 -0
  111. package/src/lib/db/schema/mysql-auth.ts +113 -0
  112. package/src/lib/db/schema/mysql-content.ts +20 -0
  113. package/src/lib/db/schema/postgres-auth.ts +116 -0
  114. package/src/lib/db/schema/postgres-content.ts +35 -0
  115. package/src/lib/db/schema/postgres-media.ts +52 -0
  116. package/src/lib/db/schema/postgres-settings.ts +11 -0
  117. package/src/lib/db/schema/sqlite-auth.ts +112 -0
  118. package/src/lib/db/schema/sqlite-content.ts +20 -0
  119. package/src/lib/db/version-adapter.ts +248 -0
  120. package/src/lib/graphql/index.ts +1 -0
  121. package/src/lib/graphql/schema.ts +443 -0
  122. package/src/lib/i18n.tsx +353 -0
  123. package/src/lib/rate-limit.ts +267 -0
  124. package/src/lib/slugify.ts +15 -0
  125. package/src/lib/storage.ts +374 -0
  126. package/src/lib/store.ts +85 -0
  127. package/src/lib/validation.ts +250 -0
  128. package/src/middleware.ts +70 -11
  129. package/src/pages/[collection]/[id].astro +178 -122
  130. package/src/pages/[collection]/index.astro +24 -156
  131. package/src/pages/admin/api-explorer.astro +98 -0
  132. package/src/pages/admin/graphql-explorer.astro +40 -0
  133. package/src/pages/admin/graphql.astro +97 -0
  134. package/src/pages/admin/index.astro +200 -139
  135. package/src/pages/admin/keys.astro +8 -0
  136. package/src/pages/admin/rest-playground.astro +44 -0
  137. package/src/pages/admin/webhooks.astro +8 -0
  138. package/src/pages/api/[collection]/[id]/publish.ts +52 -0
  139. package/src/pages/api/[collection]/[id]/unpublish.ts +42 -0
  140. package/src/pages/api/[collection]/[id]/versions.ts +66 -0
  141. package/src/pages/api/[collection]/[id].ts +114 -159
  142. package/src/pages/api/[collection]/index.ts +150 -230
  143. package/src/pages/api/auth/[id].ts +48 -69
  144. package/src/pages/api/auth/audit-logs.ts +20 -43
  145. package/src/pages/api/auth/login.ts +159 -45
  146. package/src/pages/api/auth/logout.ts +42 -24
  147. package/src/pages/api/auth/refresh.ts +119 -0
  148. package/src/pages/api/auth/register.ts +110 -40
  149. package/src/pages/api/auth/users.ts +22 -97
  150. package/src/pages/api/collections.ts +59 -0
  151. package/src/pages/api/globals/[slug]/test.ts +172 -0
  152. package/src/pages/api/globals/[slug].ts +42 -0
  153. package/src/pages/api/graphql.ts +90 -0
  154. package/src/pages/api/health.ts +417 -40
  155. package/src/pages/api/keys/[id].ts +26 -0
  156. package/src/pages/api/keys/index.ts +75 -0
  157. package/src/pages/api/media/[id].ts +309 -0
  158. package/src/pages/api/media/folders.ts +609 -0
  159. package/src/pages/api/media/index.ts +146 -0
  160. package/src/pages/api/media/resize.ts +267 -0
  161. package/src/pages/api/search.ts +82 -0
  162. package/src/pages/api/slug-availability.ts +70 -0
  163. package/src/pages/api/storage-config.ts +20 -0
  164. package/src/pages/api/storage-status.ts +206 -0
  165. package/src/pages/api/upload.ts +334 -0
  166. package/src/pages/api/webhooks/index.ts +71 -0
  167. package/src/pages/audit/index.astro +2 -104
  168. package/src/pages/login.astro +11 -11
  169. package/src/pages/media.astro +10 -0
  170. package/src/pages/preview/[collection]/[id].astro +178 -0
  171. package/src/pages/register.astro +13 -13
  172. package/src/pages/roles/index.astro +21 -21
  173. package/src/pages/settings/[slug].astro +162 -0
  174. package/src/pages/settings/index.astro +9 -0
  175. package/src/pages/users/[id].astro +29 -21
  176. package/src/pages/users/index.astro +22 -17
  177. package/src/pages/users/new.astro +18 -17
  178. package/src/styles/main.css +563 -128
  179. package/src/components/layout/Sidebar.tsx +0 -497
@@ -0,0 +1,98 @@
1
+ ---
2
+ import AdminLayout from '../../layouts/AdminLayout.astro';
3
+ import { ApiExplorer } from '../../components/ApiExplorer';
4
+
5
+ const collectionsResponse = await fetch(`${Astro.url.origin}/api/collections`);
6
+ const collectionsData = await collectionsResponse.json();
7
+ const collections = collectionsData.collections || [];
8
+ ---
9
+
10
+ <AdminLayout title="API Explorer">
11
+ <div class="flex-1 overflow-hidden p-8 pr-12">
12
+ <!-- Header -->
13
+ <div class="mb-6">
14
+ <div class="flex items-center justify-between mb-4">
15
+ <div>
16
+ <h1 class="text-3xl font-black tracking-tighter text-[var(--kyro-text-primary)]">
17
+ API Explorer
18
+ </h1>
19
+ <p class="text-[var(--kyro-text-secondary)] font-bold mt-2 text-sm uppercase tracking-wider">
20
+ Test and explore REST API endpoints interactively
21
+ </p>
22
+ </div>
23
+ <div class="flex items-center gap-3">
24
+ <a
25
+ href="/admin/rest-playground"
26
+ class="flex items-center gap-2 px-4 py-2 bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-primary)] rounded-lg font-bold text-sm hover:bg-[var(--kyro-surface)] transition-all border border-[var(--kyro-border)]"
27
+ >
28
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
29
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" />
30
+ </svg>
31
+ Playground
32
+ </a>
33
+ <a
34
+ href="/api/collections"
35
+ target="_blank"
36
+ class="flex items-center gap-2 px-4 py-2 bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-primary)] rounded-lg font-bold text-sm hover:bg-[var(--kyro-surface)] transition-all border border-[var(--kyro-border)]"
37
+ >
38
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
39
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" />
40
+ </svg>
41
+ Collections JSON
42
+ </a>
43
+ </div>
44
+ </div>
45
+
46
+ <!-- HTTP Methods Legend -->
47
+ <div class="flex items-center gap-4 text-xs">
48
+ <span class="text-[var(--kyro-text-muted)]">Methods:</span>
49
+ <span class="px-2 py-1 bg-green-500/10 text-green-600 rounded font-bold">GET</span>
50
+ <span class="px-2 py-1 bg-blue-500/10 text-blue-600 rounded font-bold">POST</span>
51
+ <span class="px-2 py-1 bg-yellow-500/10 text-yellow-600 rounded font-bold">PATCH</span>
52
+ <span class="px-2 py-1 bg-red-500/10 text-red-600 rounded font-bold">DELETE</span>
53
+ </div>
54
+ </div>
55
+
56
+ <!-- Explorer Component -->
57
+ <div class="surface-tile overflow-hidden p-6">
58
+ <ApiExplorer client:load collections={collections} />
59
+ </div>
60
+
61
+ <!-- Quick Reference -->
62
+ <div class="mt-6 surface-tile p-6">
63
+ <h2 class="text-xl font-black text-[var(--kyro-text-primary)] mb-4">Quick Reference</h2>
64
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 text-sm">
65
+ <div class="bg-[var(--kyro-surface-accent)] rounded-lg p-4">
66
+ <h3 class="font-bold text-[var(--kyro-text-primary)] mb-2">List All</h3>
67
+ <code class="text-xs text-[var(--kyro-text-secondary)] block">GET /api/:collection</code>
68
+ <p class="text-xs text-[var(--kyro-text-muted)] mt-2">Returns all documents with pagination</p>
69
+ </div>
70
+ <div class="bg-[var(--kyro-surface-accent)] rounded-lg p-4">
71
+ <h3 class="font-bold text-[var(--kyro-text-primary)] mb-2">Get One</h3>
72
+ <code class="text-xs text-[var(--kyro-text-secondary)] block">GET /api/:collection/:id</code>
73
+ <p class="text-xs text-[var(--kyro-text-muted)] mt-2">Returns a single document by ID</p>
74
+ </div>
75
+ <div class="bg-[var(--kyro-surface-accent)] rounded-lg p-4">
76
+ <h3 class="font-bold text-[var(--kyro-text-primary)] mb-2">Create</h3>
77
+ <code class="text-xs text-[var(--kyro-text-secondary)] block">POST /api/:collection</code>
78
+ <p class="text-xs text-[var(--kyro-text-muted)] mt-2">Creates a new document</p>
79
+ </div>
80
+ <div class="bg-[var(--kyro-surface-accent)] rounded-lg p-4">
81
+ <h3 class="font-bold text-[var(--kyro-text-primary)] mb-2">Update</h3>
82
+ <code class="text-xs text-[var(--kyro-text-secondary)] block">PATCH /api/:collection/:id</code>
83
+ <p class="text-xs text-[var(--kyro-text-muted)] mt-2">Updates an existing document</p>
84
+ </div>
85
+ <div class="bg-[var(--kyro-surface-accent)] rounded-lg p-4">
86
+ <h3 class="font-bold text-[var(--kyro-text-primary)] mb-2">Delete</h3>
87
+ <code class="text-xs text-[var(--kyro-text-secondary)] block">DELETE /api/:collection/:id</code>
88
+ <p class="text-xs text-[var(--kyro-text-muted)] mt-2">Deletes a document</p>
89
+ </div>
90
+ <div class="bg-[var(--kyro-surface-accent)] rounded-lg p-4">
91
+ <h3 class="font-bold text-[var(--kyro-text-primary)] mb-2">Pagination</h3>
92
+ <code class="text-xs text-[var(--kyro-text-secondary)] block">?page=1&amp;limit=10</code>
93
+ <p class="text-xs text-[var(--kyro-text-muted)] mt-2">Add query params for pagination</p>
94
+ </div>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ </AdminLayout>
@@ -0,0 +1,40 @@
1
+ ---
2
+ import AdminLayout from '../../layouts/AdminLayout.astro';
3
+ import { GraphQLExplorer } from '../../components/GraphQLExplorer';
4
+ ---
5
+
6
+ <AdminLayout title="GraphQL Explorer">
7
+ <div class="flex-1 overflow-hidden p-8 pr-12">
8
+ <!-- Header -->
9
+ <div class="mb-6">
10
+ <div class="flex items-center justify-between mb-4">
11
+ <div>
12
+ <h1 class="text-3xl font-black tracking-tighter text-[var(--kyro-text-primary)]">
13
+ GraphQL Explorer
14
+ </h1>
15
+ <p class="text-[var(--kyro-text-secondary)] font-bold mt-2 text-sm uppercase tracking-wider">
16
+ Schema documentation and type explorer
17
+ </p>
18
+ </div>
19
+ <div class="flex items-center gap-4">
20
+ <a
21
+ href="/admin/graphql"
22
+ class="flex items-center gap-2 px-4 py-2 bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-primary)] rounded-lg font-bold text-sm hover:bg-[var(--kyro-surface)] transition-all border border-[var(--kyro-border)]"
23
+ >
24
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
25
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z" />
26
+ </svg>
27
+ Playground
28
+ </a>
29
+ </div>
30
+ </div>
31
+ </div>
32
+
33
+ <!-- Explorer Container -->
34
+ <div class="h-[calc(100vh-200px)] overflow-hidden">
35
+ <div class="surface-tile h-full overflow-hidden p-6">
36
+ <GraphQLExplorer client:load endpoint="/api/graphql" />
37
+ </div>
38
+ </div>
39
+ </div>
40
+ </AdminLayout>
@@ -0,0 +1,97 @@
1
+ ---
2
+ import AdminLayout from '../../layouts/AdminLayout.astro';
3
+ import { GraphQLPlayground } from '../../components/GraphQLPlayground';
4
+
5
+ const url = Astro.request.url;
6
+ const params = new URL(url).searchParams;
7
+ const initialQuery = params.get('query') || '';
8
+ ---
9
+
10
+ <AdminLayout title="GraphQL Playground">
11
+ <div class="flex-1 overflow-hidden p-8 pr-12">
12
+ <!-- Header -->
13
+ <div class="mb-6">
14
+ <div class="flex items-center justify-between mb-4">
15
+ <div>
16
+ <h1 class="text-3xl font-black tracking-tighter text-[var(--kyro-text-primary)]">
17
+ GraphQL Playground
18
+ </h1>
19
+ <p class="text-[var(--kyro-text-secondary)] font-bold mt-2 text-sm uppercase tracking-wider">
20
+ Interactive GraphQL query editor and explorer
21
+ </p>
22
+ </div>
23
+ <div class="flex items-center gap-4">
24
+ <a
25
+ href="/admin/graphql-explorer"
26
+ class="flex items-center gap-2 px-4 py-2 bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-primary)] rounded-lg font-bold text-sm hover:bg-[var(--kyro-surface)] transition-all border border-[var(--kyro-border)]"
27
+ >
28
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
29
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253" />
30
+ </svg>
31
+ Explorer
32
+ </a>
33
+ <div class="flex items-center gap-2 px-4 py-2 bg-[var(--kyro-surface-accent)] rounded-lg border border-[var(--kyro-border)]">
34
+ <div class="w-2 h-2 rounded-full bg-green-500"></div>
35
+ <span class="text-sm font-bold text-[var(--kyro-text-primary)]">API Active</span>
36
+ </div>
37
+ <a
38
+ href="/api/graphql"
39
+ target="_blank"
40
+ class="flex items-center gap-2 px-4 py-2 bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-primary)] rounded-lg font-bold text-sm hover:bg-[var(--kyro-surface)] transition-all border border-[var(--kyro-border)]"
41
+ >
42
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
43
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" />
44
+ </svg>
45
+ Open Endpoint
46
+ </a>
47
+ </div>
48
+ </div>
49
+
50
+ <!-- Quick Examples -->
51
+ <div class="flex flex-wrap gap-2">
52
+ <button
53
+ onclick="copyToClipboard('{ __schema { types { name } } }')"
54
+ class="px-3 py-1.5 text-xs font-bold text-[var(--kyro-text-secondary)] bg-[var(--kyro-surface-accent)] rounded-lg hover:bg-[var(--kyro-surface)] transition-all border border-[var(--kyro-border)]"
55
+ >
56
+ Introspection
57
+ </button>
58
+ <button
59
+ onclick="copyToClipboard('{ collections { slug name } }')"
60
+ class="px-3 py-1.5 text-xs font-bold text-[var(--kyro-text-secondary)] bg-[var(--kyro-surface-accent)] rounded-lg hover:bg-[var(--kyro-surface)] transition-all border border-[var(--kyro-border)]"
61
+ >
62
+ Collections
63
+ </button>
64
+ <button
65
+ onclick="copyToClipboard('{ ping }')"
66
+ class="px-3 py-1.5 text-xs font-bold text-[var(--kyro-text-secondary)] bg-[var(--kyro-surface-accent)] rounded-lg hover:bg-[var(--kyro-surface)] transition-all border border-[var(--kyro-border)]"
67
+ >
68
+ Ping
69
+ </button>
70
+ <button
71
+ onclick="copyToClipboard('{ posts(page: 1, limit: 10) { docs { id title slug } totalDocs } }')"
72
+ class="px-3 py-1.5 text-xs font-bold text-[var(--kyro-text-secondary)] bg-[var(--kyro-surface-accent)] rounded-lg hover:bg-[var(--kyro-surface)] transition-all border border-[var(--kyro-border)]"
73
+ >
74
+ Posts Query
75
+ </button>
76
+ </div>
77
+ </div>
78
+
79
+ <!-- GraphQL Playground Container -->
80
+ <div class="h-[calc(100vh-280px)] overflow-hidden">
81
+ <GraphQLPlayground client:load endpoint="/api/graphql" initialQuery={initialQuery} />
82
+ </div>
83
+ </div>
84
+
85
+ <script is:inline>
86
+ function copyToClipboard(text) {
87
+ navigator.clipboard.writeText(text);
88
+ }
89
+ </script>
90
+
91
+ <style is:global>
92
+ /* Ensure proper styling for textarea editors */
93
+ .graphiql-container textarea {
94
+ font-family: var(--font-mono) !important;
95
+ }
96
+ </style>
97
+ </AdminLayout>