@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
@@ -0,0 +1,165 @@
1
+ import React from "react";
2
+ import {
3
+ useBlockById,
4
+ useBlockActions,
5
+ } from "../fields/extensions/blocksStore";
6
+ import { ChevronRight, X, ExternalLink } from "lucide-react";
7
+
8
+ interface ButtonBlockProps {
9
+ block: any;
10
+ index: number;
11
+ }
12
+
13
+ export const ButtonBlock: React.FC<ButtonBlockProps> = ({ block, index }) => {
14
+ const blockData = useBlockById(block.id);
15
+ const { updateBlock, removeBlock, moveBlock } = useBlockActions();
16
+ const data = blockData?.data ?? block.data ?? {};
17
+
18
+ const handleChange = (field: string, value: any) => {
19
+ updateBlock(block.id, { data: { ...data, [field]: value } });
20
+ };
21
+
22
+ return (
23
+ <div className="block-button border border-[var(--kyro-border)] rounded-md p-4 mb-4 relative group">
24
+ <div className="flex items-center justify-between mb-3">
25
+ <div className="flex items-center gap-2">
26
+ <span className="text-xs font-semibold text-[var(--kyro-text-muted)] uppercase">
27
+ Button
28
+ </span>
29
+ </div>
30
+ <div className="flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity">
31
+ <button type="button"
32
+ onClick={() => moveBlock(block.id, "up")}
33
+ className="p-1 hover:bg-[var(--kyro-surface-accent)] rounded"
34
+ title="Move up"
35
+ >
36
+ <ChevronRight className="w-3 h-3 rotate-[-90deg]" />
37
+ </button>
38
+ <button type="button"
39
+ onClick={() => moveBlock(block.id, "down")}
40
+ className="p-1 hover:bg-[var(--kyro-surface-accent)] rounded"
41
+ title="Move down"
42
+ >
43
+ <ChevronRight className="w-3 h-3" />
44
+ </button>
45
+ <button type="button"
46
+ onClick={() => removeBlock(block.id)}
47
+ className="p-1 hover:bg-[var(--kyro-surface-accent)] rounded"
48
+ title="Remove"
49
+ >
50
+ <X className="w-3 h-3" />
51
+ </button>
52
+ </div>
53
+ </div>
54
+
55
+ <div className="space-y-3">
56
+ <div>
57
+ <label className="text-xs font-medium text-[var(--kyro-text-muted)] mb-1 block">
58
+ Button Text
59
+ </label>
60
+ <input
61
+ type="text"
62
+ value={block.data.text || ""}
63
+ onChange={(e) => handleChange("text", e.target.value)}
64
+ className="w-full px-3 py-2 border border-[var(--kyro-border)] rounded bg-[var(--kyro-surface)] text-[var(--kyro-text-primary)] text-sm"
65
+ placeholder="Click here..."
66
+ />
67
+ </div>
68
+
69
+ <div>
70
+ <label className="text-xs font-medium text-[var(--kyro-text-muted)] mb-1 block">
71
+ URL
72
+ </label>
73
+ <input
74
+ type="url"
75
+ value={block.data.url || ""}
76
+ onChange={(e) => handleChange("url", e.target.value)}
77
+ className="w-full px-3 py-2 border border-[var(--kyro-border)] rounded bg-[var(--kyro-surface)] text-[var(--kyro-text-primary)] text-sm"
78
+ placeholder="https://..."
79
+ />
80
+ </div>
81
+
82
+ <div className="grid grid-cols-3 gap-3">
83
+ <div>
84
+ <label className="text-xs font-medium text-[var(--kyro-text-muted)] mb-1 block">
85
+ Style
86
+ </label>
87
+ <select
88
+ value={block.data.variant || "primary"}
89
+ onChange={(e) => handleChange("variant", e.target.value)}
90
+ className="w-full px-3 py-2 border border-[var(--kyro-border)] rounded bg-[var(--kyro-surface)] text-[var(--kyro-text-primary)] text-sm"
91
+ >
92
+ <option value="primary">Primary</option>
93
+ <option value="secondary">Secondary</option>
94
+ <option value="outline">Outline</option>
95
+ <option value="ghost">Ghost</option>
96
+ </select>
97
+ </div>
98
+ <div>
99
+ <label className="text-xs font-medium text-[var(--kyro-text-muted)] mb-1 block">
100
+ Size
101
+ </label>
102
+ <select
103
+ value={block.data.size || "md"}
104
+ onChange={(e) => handleChange("size", e.target.value)}
105
+ className="w-full px-3 py-2 border border-[var(--kyro-border)] rounded bg-[var(--kyro-surface)] text-[var(--kyro-text-primary)] text-sm"
106
+ >
107
+ <option value="sm">Small</option>
108
+ <option value="md">Medium</option>
109
+ <option value="lg">Large</option>
110
+ </select>
111
+ </div>
112
+ <div>
113
+ <label className="text-xs font-medium text-[var(--kyro-text-muted)] mb-1 block">
114
+ Target
115
+ </label>
116
+ <select
117
+ value={block.data.target || "_self"}
118
+ onChange={(e) => handleChange("target", e.target.value)}
119
+ className="w-full px-3 py-2 border border-[var(--kyro-border)] rounded bg-[var(--kyro-surface)] text-[var(--kyro-text-primary)] text-sm"
120
+ >
121
+ <option value="_self">Same Tab</option>
122
+ <option value="_blank">New Tab</option>
123
+ </select>
124
+ </div>
125
+ </div>
126
+
127
+ <div>
128
+ <label className="text-xs font-medium text-[var(--kyro-text-muted)] mb-1 block">
129
+ Alignment
130
+ </label>
131
+ <select
132
+ value={block.data.align || "left"}
133
+ onChange={(e) => handleChange("align", e.target.value)}
134
+ className="w-full px-3 py-2 border border-[var(--kyro-border)] rounded bg-[var(--kyro-surface)] text-[var(--kyro-text-primary)] text-sm"
135
+ >
136
+ <option value="left">Left</option>
137
+ <option value="center">Center</option>
138
+ <option value="right">Right</option>
139
+ </select>
140
+ </div>
141
+ </div>
142
+
143
+ {/* Preview */}
144
+ <div className="mt-4 p-4 bg-[var(--kyro-surface)] rounded border border-[var(--kyro-border)]">
145
+ <p className="text-xs text-[var(--kyro-text-muted)] mb-2">Preview:</p>
146
+ <button type="button"
147
+ className={`px-4 py-2 rounded font-medium text-sm
148
+ ${block.data.variant === "primary" ? "bg-[var(--kyro-primary)] text-white" : ""}
149
+ ${block.data.variant === "secondary" ? "bg-[var(--kyro-secondary)] text-white" : ""}
150
+ ${block.data.variant === "outline" ? "border border-[var(--kyro-primary)] text-[var(--kyro-primary)] bg-transparent" : ""}
151
+ ${block.data.variant === "ghost" ? "text-[var(--kyro-primary)] bg-transparent" : ""}
152
+ ${block.data.size === "sm" ? "text-xs px-3 py-1" : ""}
153
+ ${block.data.size === "md" ? "text-sm px-4 py-2" : ""}
154
+ ${block.data.size === "lg" ? "text-base px-5 py-3" : ""}
155
+ `}
156
+ >
157
+ {block.data.text || "Button"}
158
+ {block.data.target === "_blank" && (
159
+ <ExternalLink className="w-3 h-3 ml-2 inline" />
160
+ )}
161
+ </button>
162
+ </div>
163
+ </div>
164
+ );
165
+ };