@questpie/admin 0.0.1

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 (203) hide show
  1. package/.turbo/turbo-build.log +108 -0
  2. package/CHANGELOG.md +10 -0
  3. package/README.md +556 -0
  4. package/STATUS.md +917 -0
  5. package/VALIDATION.md +602 -0
  6. package/components.json +24 -0
  7. package/dist/__tests__/setup.mjs +38 -0
  8. package/dist/__tests__/test-utils.mjs +45 -0
  9. package/dist/__tests__/vitest.d.mjs +3 -0
  10. package/dist/components/admin-app.mjs +69 -0
  11. package/dist/components/fields/array-field.mjs +190 -0
  12. package/dist/components/fields/checkbox-field.mjs +34 -0
  13. package/dist/components/fields/custom-field.mjs +32 -0
  14. package/dist/components/fields/date-field.mjs +41 -0
  15. package/dist/components/fields/datetime-field.mjs +42 -0
  16. package/dist/components/fields/email-field.mjs +37 -0
  17. package/dist/components/fields/embedded-collection.mjs +253 -0
  18. package/dist/components/fields/field-types.mjs +1 -0
  19. package/dist/components/fields/field-utils.mjs +10 -0
  20. package/dist/components/fields/field-wrapper.mjs +34 -0
  21. package/dist/components/fields/index.mjs +23 -0
  22. package/dist/components/fields/json-field.mjs +243 -0
  23. package/dist/components/fields/locale-badge.mjs +16 -0
  24. package/dist/components/fields/number-field.mjs +39 -0
  25. package/dist/components/fields/password-field.mjs +37 -0
  26. package/dist/components/fields/relation-field.mjs +104 -0
  27. package/dist/components/fields/relation-picker.mjs +229 -0
  28. package/dist/components/fields/relation-select.mjs +188 -0
  29. package/dist/components/fields/rich-text-editor/index.mjs +897 -0
  30. package/dist/components/fields/select-field.mjs +41 -0
  31. package/dist/components/fields/switch-field.mjs +34 -0
  32. package/dist/components/fields/text-field.mjs +38 -0
  33. package/dist/components/fields/textarea-field.mjs +38 -0
  34. package/dist/components/index.mjs +59 -0
  35. package/dist/components/primitives/checkbox-input.mjs +127 -0
  36. package/dist/components/primitives/date-input.mjs +303 -0
  37. package/dist/components/primitives/index.mjs +12 -0
  38. package/dist/components/primitives/number-input.mjs +104 -0
  39. package/dist/components/primitives/select-input.mjs +177 -0
  40. package/dist/components/primitives/tag-input.mjs +135 -0
  41. package/dist/components/primitives/text-input.mjs +39 -0
  42. package/dist/components/primitives/textarea-input.mjs +37 -0
  43. package/dist/components/primitives/toggle-input.mjs +31 -0
  44. package/dist/components/primitives/types.mjs +12 -0
  45. package/dist/components/ui/accordion.mjs +55 -0
  46. package/dist/components/ui/avatar.mjs +54 -0
  47. package/dist/components/ui/badge.mjs +34 -0
  48. package/dist/components/ui/button.mjs +48 -0
  49. package/dist/components/ui/card.mjs +58 -0
  50. package/dist/components/ui/checkbox.mjs +21 -0
  51. package/dist/components/ui/combobox.mjs +163 -0
  52. package/dist/components/ui/dialog.mjs +95 -0
  53. package/dist/components/ui/dropdown-menu.mjs +138 -0
  54. package/dist/components/ui/field.mjs +113 -0
  55. package/dist/components/ui/input-group.mjs +82 -0
  56. package/dist/components/ui/input.mjs +17 -0
  57. package/dist/components/ui/label.mjs +15 -0
  58. package/dist/components/ui/popover.mjs +56 -0
  59. package/dist/components/ui/scroll-area.mjs +38 -0
  60. package/dist/components/ui/select.mjs +100 -0
  61. package/dist/components/ui/separator.mjs +16 -0
  62. package/dist/components/ui/sheet.mjs +90 -0
  63. package/dist/components/ui/sidebar.mjs +387 -0
  64. package/dist/components/ui/skeleton.mjs +14 -0
  65. package/dist/components/ui/spinner.mjs +16 -0
  66. package/dist/components/ui/switch.mjs +22 -0
  67. package/dist/components/ui/table.mjs +68 -0
  68. package/dist/components/ui/tabs.mjs +48 -0
  69. package/dist/components/ui/textarea.mjs +15 -0
  70. package/dist/components/ui/tooltip.mjs +44 -0
  71. package/dist/config/component-registry.mjs +38 -0
  72. package/dist/config/index.mjs +129 -0
  73. package/dist/hooks/admin-provider.mjs +70 -0
  74. package/dist/hooks/index.mjs +7 -0
  75. package/dist/hooks/store.mjs +178 -0
  76. package/dist/hooks/use-auth.mjs +76 -0
  77. package/dist/hooks/use-collection-db.mjs +146 -0
  78. package/dist/hooks/use-collection.mjs +112 -0
  79. package/dist/hooks/use-global.mjs +46 -0
  80. package/dist/hooks/use-mobile.mjs +20 -0
  81. package/dist/lib/utils.mjs +10 -0
  82. package/dist/styles/index.css +336 -0
  83. package/dist/styles/index.mjs +1 -0
  84. package/dist/utils/index.mjs +9 -0
  85. package/dist/views/auth/auth-layout.mjs +52 -0
  86. package/dist/views/auth/forgot-password-form.mjs +148 -0
  87. package/dist/views/auth/index.mjs +6 -0
  88. package/dist/views/auth/login-form.mjs +156 -0
  89. package/dist/views/auth/reset-password-form.mjs +184 -0
  90. package/dist/views/collection/auto-form-fields.mjs +525 -0
  91. package/dist/views/collection/collection-form.mjs +91 -0
  92. package/dist/views/collection/collection-list.mjs +76 -0
  93. package/dist/views/collection/form-field.mjs +42 -0
  94. package/dist/views/collection/index.mjs +6 -0
  95. package/dist/views/common/index.mjs +4 -0
  96. package/dist/views/common/locale-switcher.mjs +39 -0
  97. package/dist/views/common/version-history.mjs +272 -0
  98. package/dist/views/index.mjs +9 -0
  99. package/dist/views/layout/admin-layout.mjs +40 -0
  100. package/dist/views/layout/admin-router.mjs +95 -0
  101. package/dist/views/layout/admin-sidebar.mjs +63 -0
  102. package/dist/views/layout/index.mjs +5 -0
  103. package/package.json +276 -0
  104. package/src/__tests__/setup.ts +44 -0
  105. package/src/__tests__/test-utils.tsx +49 -0
  106. package/src/__tests__/vitest.d.ts +9 -0
  107. package/src/components/admin-app.tsx +221 -0
  108. package/src/components/fields/array-field.tsx +237 -0
  109. package/src/components/fields/checkbox-field.tsx +47 -0
  110. package/src/components/fields/custom-field.tsx +50 -0
  111. package/src/components/fields/date-field.tsx +65 -0
  112. package/src/components/fields/datetime-field.tsx +67 -0
  113. package/src/components/fields/email-field.tsx +51 -0
  114. package/src/components/fields/embedded-collection.tsx +315 -0
  115. package/src/components/fields/field-types.ts +162 -0
  116. package/src/components/fields/field-utils.ts +6 -0
  117. package/src/components/fields/field-wrapper.tsx +52 -0
  118. package/src/components/fields/index.ts +66 -0
  119. package/src/components/fields/json-field.tsx +440 -0
  120. package/src/components/fields/locale-badge.tsx +15 -0
  121. package/src/components/fields/number-field.tsx +57 -0
  122. package/src/components/fields/password-field.tsx +51 -0
  123. package/src/components/fields/relation-field.tsx +243 -0
  124. package/src/components/fields/relation-picker.tsx +402 -0
  125. package/src/components/fields/relation-select.tsx +327 -0
  126. package/src/components/fields/rich-text-editor/index.tsx +1337 -0
  127. package/src/components/fields/select-field.tsx +61 -0
  128. package/src/components/fields/switch-field.tsx +47 -0
  129. package/src/components/fields/text-field.tsx +55 -0
  130. package/src/components/fields/textarea-field.tsx +55 -0
  131. package/src/components/index.ts +40 -0
  132. package/src/components/primitives/checkbox-input.tsx +193 -0
  133. package/src/components/primitives/date-input.tsx +401 -0
  134. package/src/components/primitives/index.ts +24 -0
  135. package/src/components/primitives/number-input.tsx +132 -0
  136. package/src/components/primitives/select-input.tsx +296 -0
  137. package/src/components/primitives/tag-input.tsx +200 -0
  138. package/src/components/primitives/text-input.tsx +49 -0
  139. package/src/components/primitives/textarea-input.tsx +46 -0
  140. package/src/components/primitives/toggle-input.tsx +36 -0
  141. package/src/components/primitives/types.ts +235 -0
  142. package/src/components/ui/accordion.tsx +72 -0
  143. package/src/components/ui/avatar.tsx +106 -0
  144. package/src/components/ui/badge.tsx +48 -0
  145. package/src/components/ui/button.tsx +53 -0
  146. package/src/components/ui/card.tsx +94 -0
  147. package/src/components/ui/checkbox.tsx +27 -0
  148. package/src/components/ui/combobox.tsx +290 -0
  149. package/src/components/ui/dialog.tsx +151 -0
  150. package/src/components/ui/dropdown-menu.tsx +254 -0
  151. package/src/components/ui/field.tsx +227 -0
  152. package/src/components/ui/input-group.tsx +149 -0
  153. package/src/components/ui/input.tsx +20 -0
  154. package/src/components/ui/label.tsx +18 -0
  155. package/src/components/ui/popover.tsx +88 -0
  156. package/src/components/ui/scroll-area.tsx +53 -0
  157. package/src/components/ui/select.tsx +192 -0
  158. package/src/components/ui/separator.tsx +23 -0
  159. package/src/components/ui/sheet.tsx +127 -0
  160. package/src/components/ui/sidebar.tsx +723 -0
  161. package/src/components/ui/skeleton.tsx +13 -0
  162. package/src/components/ui/spinner.tsx +10 -0
  163. package/src/components/ui/switch.tsx +32 -0
  164. package/src/components/ui/table.tsx +99 -0
  165. package/src/components/ui/tabs.tsx +82 -0
  166. package/src/components/ui/textarea.tsx +18 -0
  167. package/src/components/ui/tooltip.tsx +70 -0
  168. package/src/config/component-registry.ts +190 -0
  169. package/src/config/index.ts +1099 -0
  170. package/src/hooks/README.md +269 -0
  171. package/src/hooks/admin-provider.tsx +110 -0
  172. package/src/hooks/index.ts +41 -0
  173. package/src/hooks/store.ts +248 -0
  174. package/src/hooks/use-auth.ts +168 -0
  175. package/src/hooks/use-collection-db.ts +209 -0
  176. package/src/hooks/use-collection.ts +156 -0
  177. package/src/hooks/use-global.ts +69 -0
  178. package/src/hooks/use-mobile.ts +21 -0
  179. package/src/lib/utils.ts +6 -0
  180. package/src/styles/index.css +340 -0
  181. package/src/utils/index.ts +6 -0
  182. package/src/views/auth/auth-layout.tsx +77 -0
  183. package/src/views/auth/forgot-password-form.tsx +192 -0
  184. package/src/views/auth/index.ts +21 -0
  185. package/src/views/auth/login-form.tsx +229 -0
  186. package/src/views/auth/reset-password-form.tsx +232 -0
  187. package/src/views/collection/auto-form-fields.tsx +982 -0
  188. package/src/views/collection/collection-form.tsx +186 -0
  189. package/src/views/collection/collection-list.tsx +223 -0
  190. package/src/views/collection/form-field.tsx +52 -0
  191. package/src/views/collection/index.ts +15 -0
  192. package/src/views/common/index.ts +8 -0
  193. package/src/views/common/locale-switcher.tsx +45 -0
  194. package/src/views/common/version-history.tsx +406 -0
  195. package/src/views/index.ts +25 -0
  196. package/src/views/layout/admin-layout.tsx +117 -0
  197. package/src/views/layout/admin-router.tsx +206 -0
  198. package/src/views/layout/admin-sidebar.tsx +185 -0
  199. package/src/views/layout/index.ts +12 -0
  200. package/tsconfig.json +13 -0
  201. package/tsconfig.tsbuildinfo +1 -0
  202. package/tsdown.config.ts +13 -0
  203. package/vitest.config.ts +29 -0
package/package.json ADDED
@@ -0,0 +1,276 @@
1
+ {
2
+ "name": "@questpie/admin",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "imports": {
6
+ "#questpie/admin/*": "./src/*"
7
+ },
8
+ "exports": {
9
+ "./__tests__/setup": "./src/__tests__/setup.ts",
10
+ "./__tests__/test-utils": "./src/__tests__/test-utils.tsx",
11
+ "./components": "./src/components/index.ts",
12
+ "./components/admin-app": "./src/components/admin-app.tsx",
13
+ "./components/fields": "./src/components/fields/index.ts",
14
+ "./components/fields/array-field": "./src/components/fields/array-field.tsx",
15
+ "./components/fields/checkbox-field": "./src/components/fields/checkbox-field.tsx",
16
+ "./components/fields/custom-field": "./src/components/fields/custom-field.tsx",
17
+ "./components/fields/date-field": "./src/components/fields/date-field.tsx",
18
+ "./components/fields/datetime-field": "./src/components/fields/datetime-field.tsx",
19
+ "./components/fields/email-field": "./src/components/fields/email-field.tsx",
20
+ "./components/fields/embedded-collection": "./src/components/fields/embedded-collection.tsx",
21
+ "./components/fields/field-types": "./src/components/fields/field-types.ts",
22
+ "./components/fields/field-utils": "./src/components/fields/field-utils.ts",
23
+ "./components/fields/field-wrapper": "./src/components/fields/field-wrapper.tsx",
24
+ "./components/fields/json-field": "./src/components/fields/json-field.tsx",
25
+ "./components/fields/locale-badge": "./src/components/fields/locale-badge.tsx",
26
+ "./components/fields/number-field": "./src/components/fields/number-field.tsx",
27
+ "./components/fields/password-field": "./src/components/fields/password-field.tsx",
28
+ "./components/fields/relation-field": "./src/components/fields/relation-field.tsx",
29
+ "./components/fields/relation-picker": "./src/components/fields/relation-picker.tsx",
30
+ "./components/fields/relation-select": "./src/components/fields/relation-select.tsx",
31
+ "./components/fields/rich-text-editor": "./src/components/fields/rich-text-editor/index.tsx",
32
+ "./components/fields/select-field": "./src/components/fields/select-field.tsx",
33
+ "./components/fields/switch-field": "./src/components/fields/switch-field.tsx",
34
+ "./components/fields/text-field": "./src/components/fields/text-field.tsx",
35
+ "./components/fields/textarea-field": "./src/components/fields/textarea-field.tsx",
36
+ "./components/primitives": "./src/components/primitives/index.ts",
37
+ "./components/primitives/checkbox-input": "./src/components/primitives/checkbox-input.tsx",
38
+ "./components/primitives/date-input": "./src/components/primitives/date-input.tsx",
39
+ "./components/primitives/number-input": "./src/components/primitives/number-input.tsx",
40
+ "./components/primitives/select-input": "./src/components/primitives/select-input.tsx",
41
+ "./components/primitives/tag-input": "./src/components/primitives/tag-input.tsx",
42
+ "./components/primitives/text-input": "./src/components/primitives/text-input.tsx",
43
+ "./components/primitives/textarea-input": "./src/components/primitives/textarea-input.tsx",
44
+ "./components/primitives/toggle-input": "./src/components/primitives/toggle-input.tsx",
45
+ "./components/primitives/types": "./src/components/primitives/types.ts",
46
+ "./components/ui/accordion": "./src/components/ui/accordion.tsx",
47
+ "./components/ui/avatar": "./src/components/ui/avatar.tsx",
48
+ "./components/ui/badge": "./src/components/ui/badge.tsx",
49
+ "./components/ui/button": "./src/components/ui/button.tsx",
50
+ "./components/ui/card": "./src/components/ui/card.tsx",
51
+ "./components/ui/checkbox": "./src/components/ui/checkbox.tsx",
52
+ "./components/ui/combobox": "./src/components/ui/combobox.tsx",
53
+ "./components/ui/dialog": "./src/components/ui/dialog.tsx",
54
+ "./components/ui/dropdown-menu": "./src/components/ui/dropdown-menu.tsx",
55
+ "./components/ui/field": "./src/components/ui/field.tsx",
56
+ "./components/ui/input": "./src/components/ui/input.tsx",
57
+ "./components/ui/input-group": "./src/components/ui/input-group.tsx",
58
+ "./components/ui/label": "./src/components/ui/label.tsx",
59
+ "./components/ui/popover": "./src/components/ui/popover.tsx",
60
+ "./components/ui/scroll-area": "./src/components/ui/scroll-area.tsx",
61
+ "./components/ui/select": "./src/components/ui/select.tsx",
62
+ "./components/ui/separator": "./src/components/ui/separator.tsx",
63
+ "./components/ui/sheet": "./src/components/ui/sheet.tsx",
64
+ "./components/ui/sidebar": "./src/components/ui/sidebar.tsx",
65
+ "./components/ui/skeleton": "./src/components/ui/skeleton.tsx",
66
+ "./components/ui/spinner": "./src/components/ui/spinner.tsx",
67
+ "./components/ui/switch": "./src/components/ui/switch.tsx",
68
+ "./components/ui/table": "./src/components/ui/table.tsx",
69
+ "./components/ui/tabs": "./src/components/ui/tabs.tsx",
70
+ "./components/ui/textarea": "./src/components/ui/textarea.tsx",
71
+ "./components/ui/tooltip": "./src/components/ui/tooltip.tsx",
72
+ "./config": "./src/config/index.ts",
73
+ "./config/component-registry": "./src/config/component-registry.ts",
74
+ "./hooks": "./src/hooks/index.ts",
75
+ "./hooks/admin-provider": "./src/hooks/admin-provider.tsx",
76
+ "./hooks/store": "./src/hooks/store.ts",
77
+ "./hooks/use-auth": "./src/hooks/use-auth.ts",
78
+ "./hooks/use-collection": "./src/hooks/use-collection.ts",
79
+ "./hooks/use-collection-db": "./src/hooks/use-collection-db.ts",
80
+ "./hooks/use-global": "./src/hooks/use-global.ts",
81
+ "./hooks/use-mobile": "./src/hooks/use-mobile.ts",
82
+ "./lib/utils": "./src/lib/utils.ts",
83
+ "./styles": "./src/styles/index.css",
84
+ "./utils": "./src/utils/index.ts",
85
+ "./views": "./src/views/index.ts",
86
+ "./views/auth": "./src/views/auth/index.ts",
87
+ "./views/auth/auth-layout": "./src/views/auth/auth-layout.tsx",
88
+ "./views/auth/forgot-password-form": "./src/views/auth/forgot-password-form.tsx",
89
+ "./views/auth/login-form": "./src/views/auth/login-form.tsx",
90
+ "./views/auth/reset-password-form": "./src/views/auth/reset-password-form.tsx",
91
+ "./views/collection": "./src/views/collection/index.ts",
92
+ "./views/collection/auto-form-fields": "./src/views/collection/auto-form-fields.tsx",
93
+ "./views/collection/collection-form": "./src/views/collection/collection-form.tsx",
94
+ "./views/collection/collection-list": "./src/views/collection/collection-list.tsx",
95
+ "./views/collection/form-field": "./src/views/collection/form-field.tsx",
96
+ "./views/common": "./src/views/common/index.ts",
97
+ "./views/common/locale-switcher": "./src/views/common/locale-switcher.tsx",
98
+ "./views/common/version-history": "./src/views/common/version-history.tsx",
99
+ "./views/layout": "./src/views/layout/index.ts",
100
+ "./views/layout/admin-layout": "./src/views/layout/admin-layout.tsx",
101
+ "./views/layout/admin-router": "./src/views/layout/admin-router.tsx",
102
+ "./views/layout/admin-sidebar": "./src/views/layout/admin-sidebar.tsx",
103
+ "./package.json": "./package.json"
104
+ },
105
+ "scripts": {
106
+ "dev": "tsdown --watch",
107
+ "build": "tsdown",
108
+ "check-types": "tsc --noEmit",
109
+ "test": "vitest run",
110
+ "test:watch": "vitest",
111
+ "test:coverage": "vitest run --coverage"
112
+ },
113
+ "dependencies": {
114
+ "@base-ui/react": "^1.0.0",
115
+ "@fontsource-variable/dm-sans": "^5.2.8",
116
+ "@fontsource-variable/jetbrains-mono": "^5.2.8",
117
+ "@phosphor-icons/react": "^2.1.10",
118
+ "questpie": "workspace:*",
119
+ "@questpie/tanstack-query": "workspace:*",
120
+ "@tailwindcss/vite": "^4.0.6",
121
+ "@tiptap/core": "^2.x",
122
+ "@tiptap/extension-character-count": "^2.x",
123
+ "@tiptap/extension-code-block-lowlight": "^2.x",
124
+ "@tiptap/extension-image": "^2.x",
125
+ "@tiptap/extension-link": "^2.x",
126
+ "@tiptap/extension-placeholder": "^2.x",
127
+ "@tiptap/extension-table": "^2.x",
128
+ "@tiptap/extension-table-cell": "^2.x",
129
+ "@tiptap/extension-table-header": "^2.x",
130
+ "@tiptap/extension-table-row": "^2.x",
131
+ "@tiptap/extension-text-align": "^2.x",
132
+ "@tiptap/extension-underline": "^2.x",
133
+ "@tiptap/react": "^2.x",
134
+ "@tiptap/starter-kit": "^2.x",
135
+ "@tiptap/suggestion": "^2.x",
136
+ "class-variance-authority": "^0.7.1",
137
+ "clsx": "^2.1.1",
138
+ "date-fns": "^4.1.0",
139
+ "jotai": "^2.12.3",
140
+ "lowlight": "^3.x",
141
+ "react-day-picker": "^9.12.0",
142
+ "react-hook-form": "^7.54.0",
143
+ "react-resizable-panels": "^3.0.6",
144
+ "recharts": "2.15.4",
145
+ "shadcn": "^3.6.1",
146
+ "sonner": "^2.0.7",
147
+ "tailwind-merge": "^3.4.0",
148
+ "tailwindcss": "^4.0.6",
149
+ "tippy.js": "^6.3.7",
150
+ "tw-animate-css": "^1.4.0",
151
+ "vaul": "^1.1.2"
152
+ },
153
+ "peerDependencies": {
154
+ "react": "^19.2.0",
155
+ "react-dom": "^19.2.0",
156
+ "@tanstack/react-query": "^5.x",
157
+ "@tanstack/react-table": "^8.x",
158
+ "@tanstack/db": "^0.x",
159
+ "better-auth": "^1.4.0"
160
+ },
161
+ "devDependencies": {
162
+ "@questpie/typescript-config": "workspace:*",
163
+ "@tanstack/db": "^0.1.1",
164
+ "@testing-library/jest-dom": "^6.9.1",
165
+ "@testing-library/react": "^16.3.1",
166
+ "@testing-library/user-event": "^14.6.1",
167
+ "@types/react": "^19.2.0",
168
+ "@types/react-dom": "^19.2.0",
169
+ "@vitejs/plugin-react": "^5.1.2",
170
+ "happy-dom": "^20.1.0",
171
+ "jsdom": "^27.4.0",
172
+ "tsdown": "^0.18.3",
173
+ "typescript": "^5.9.2",
174
+ "vitest": "^4.0.16"
175
+ },
176
+ "publishConfig": {
177
+ "access": "public",
178
+ "exports": {
179
+ "./__tests__/setup": "./dist/__tests__/setup.mjs",
180
+ "./__tests__/test-utils": "./dist/__tests__/test-utils.mjs",
181
+ "./components": "./dist/components/index.mjs",
182
+ "./components/admin-app": "./dist/components/admin-app.mjs",
183
+ "./components/fields": "./dist/components/fields/index.mjs",
184
+ "./components/fields/array-field": "./dist/components/fields/array-field.mjs",
185
+ "./components/fields/checkbox-field": "./dist/components/fields/checkbox-field.mjs",
186
+ "./components/fields/custom-field": "./dist/components/fields/custom-field.mjs",
187
+ "./components/fields/date-field": "./dist/components/fields/date-field.mjs",
188
+ "./components/fields/datetime-field": "./dist/components/fields/datetime-field.mjs",
189
+ "./components/fields/email-field": "./dist/components/fields/email-field.mjs",
190
+ "./components/fields/embedded-collection": "./dist/components/fields/embedded-collection.mjs",
191
+ "./components/fields/field-types": "./dist/components/fields/field-types.mjs",
192
+ "./components/fields/field-utils": "./dist/components/fields/field-utils.mjs",
193
+ "./components/fields/field-wrapper": "./dist/components/fields/field-wrapper.mjs",
194
+ "./components/fields/json-field": "./dist/components/fields/json-field.mjs",
195
+ "./components/fields/locale-badge": "./dist/components/fields/locale-badge.mjs",
196
+ "./components/fields/number-field": "./dist/components/fields/number-field.mjs",
197
+ "./components/fields/password-field": "./dist/components/fields/password-field.mjs",
198
+ "./components/fields/relation-field": "./dist/components/fields/relation-field.mjs",
199
+ "./components/fields/relation-picker": "./dist/components/fields/relation-picker.mjs",
200
+ "./components/fields/relation-select": "./dist/components/fields/relation-select.mjs",
201
+ "./components/fields/rich-text-editor": "./dist/components/fields/rich-text-editor/index.mjs",
202
+ "./components/fields/select-field": "./dist/components/fields/select-field.mjs",
203
+ "./components/fields/switch-field": "./dist/components/fields/switch-field.mjs",
204
+ "./components/fields/text-field": "./dist/components/fields/text-field.mjs",
205
+ "./components/fields/textarea-field": "./dist/components/fields/textarea-field.mjs",
206
+ "./components/primitives": "./dist/components/primitives/index.mjs",
207
+ "./components/primitives/checkbox-input": "./dist/components/primitives/checkbox-input.mjs",
208
+ "./components/primitives/date-input": "./dist/components/primitives/date-input.mjs",
209
+ "./components/primitives/number-input": "./dist/components/primitives/number-input.mjs",
210
+ "./components/primitives/select-input": "./dist/components/primitives/select-input.mjs",
211
+ "./components/primitives/tag-input": "./dist/components/primitives/tag-input.mjs",
212
+ "./components/primitives/text-input": "./dist/components/primitives/text-input.mjs",
213
+ "./components/primitives/textarea-input": "./dist/components/primitives/textarea-input.mjs",
214
+ "./components/primitives/toggle-input": "./dist/components/primitives/toggle-input.mjs",
215
+ "./components/primitives/types": "./dist/components/primitives/types.mjs",
216
+ "./components/ui/accordion": "./dist/components/ui/accordion.mjs",
217
+ "./components/ui/avatar": "./dist/components/ui/avatar.mjs",
218
+ "./components/ui/badge": "./dist/components/ui/badge.mjs",
219
+ "./components/ui/button": "./dist/components/ui/button.mjs",
220
+ "./components/ui/card": "./dist/components/ui/card.mjs",
221
+ "./components/ui/checkbox": "./dist/components/ui/checkbox.mjs",
222
+ "./components/ui/combobox": "./dist/components/ui/combobox.mjs",
223
+ "./components/ui/dialog": "./dist/components/ui/dialog.mjs",
224
+ "./components/ui/dropdown-menu": "./dist/components/ui/dropdown-menu.mjs",
225
+ "./components/ui/field": "./dist/components/ui/field.mjs",
226
+ "./components/ui/input": "./dist/components/ui/input.mjs",
227
+ "./components/ui/input-group": "./dist/components/ui/input-group.mjs",
228
+ "./components/ui/label": "./dist/components/ui/label.mjs",
229
+ "./components/ui/popover": "./dist/components/ui/popover.mjs",
230
+ "./components/ui/scroll-area": "./dist/components/ui/scroll-area.mjs",
231
+ "./components/ui/select": "./dist/components/ui/select.mjs",
232
+ "./components/ui/separator": "./dist/components/ui/separator.mjs",
233
+ "./components/ui/sheet": "./dist/components/ui/sheet.mjs",
234
+ "./components/ui/sidebar": "./dist/components/ui/sidebar.mjs",
235
+ "./components/ui/skeleton": "./dist/components/ui/skeleton.mjs",
236
+ "./components/ui/spinner": "./dist/components/ui/spinner.mjs",
237
+ "./components/ui/switch": "./dist/components/ui/switch.mjs",
238
+ "./components/ui/table": "./dist/components/ui/table.mjs",
239
+ "./components/ui/tabs": "./dist/components/ui/tabs.mjs",
240
+ "./components/ui/textarea": "./dist/components/ui/textarea.mjs",
241
+ "./components/ui/tooltip": "./dist/components/ui/tooltip.mjs",
242
+ "./config": "./dist/config/index.mjs",
243
+ "./config/component-registry": "./dist/config/component-registry.mjs",
244
+ "./hooks": "./dist/hooks/index.mjs",
245
+ "./hooks/admin-provider": "./dist/hooks/admin-provider.mjs",
246
+ "./hooks/store": "./dist/hooks/store.mjs",
247
+ "./hooks/use-auth": "./dist/hooks/use-auth.mjs",
248
+ "./hooks/use-collection": "./dist/hooks/use-collection.mjs",
249
+ "./hooks/use-collection-db": "./dist/hooks/use-collection-db.mjs",
250
+ "./hooks/use-global": "./dist/hooks/use-global.mjs",
251
+ "./hooks/use-mobile": "./dist/hooks/use-mobile.mjs",
252
+ "./lib/utils": "./dist/lib/utils.mjs",
253
+ "./styles": "./dist/styles/index.mjs",
254
+ "./utils": "./dist/utils/index.mjs",
255
+ "./views": "./dist/views/index.mjs",
256
+ "./views/auth": "./dist/views/auth/index.mjs",
257
+ "./views/auth/auth-layout": "./dist/views/auth/auth-layout.mjs",
258
+ "./views/auth/forgot-password-form": "./dist/views/auth/forgot-password-form.mjs",
259
+ "./views/auth/login-form": "./dist/views/auth/login-form.mjs",
260
+ "./views/auth/reset-password-form": "./dist/views/auth/reset-password-form.mjs",
261
+ "./views/collection": "./dist/views/collection/index.mjs",
262
+ "./views/collection/auto-form-fields": "./dist/views/collection/auto-form-fields.mjs",
263
+ "./views/collection/collection-form": "./dist/views/collection/collection-form.mjs",
264
+ "./views/collection/collection-list": "./dist/views/collection/collection-list.mjs",
265
+ "./views/collection/form-field": "./dist/views/collection/form-field.mjs",
266
+ "./views/common": "./dist/views/common/index.mjs",
267
+ "./views/common/locale-switcher": "./dist/views/common/locale-switcher.mjs",
268
+ "./views/common/version-history": "./dist/views/common/version-history.mjs",
269
+ "./views/layout": "./dist/views/layout/index.mjs",
270
+ "./views/layout/admin-layout": "./dist/views/layout/admin-layout.mjs",
271
+ "./views/layout/admin-router": "./dist/views/layout/admin-router.mjs",
272
+ "./views/layout/admin-sidebar": "./dist/views/layout/admin-sidebar.mjs",
273
+ "./package.json": "./package.json"
274
+ }
275
+ }
276
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Vitest setup file for @questpie/admin
3
+ */
4
+
5
+ import * as matchers from "@testing-library/jest-dom/matchers";
6
+ import { cleanup } from "@testing-library/react";
7
+ import { afterEach, expect, vi } from "vitest";
8
+
9
+ // Extend vitest's expect with jest-dom matchers
10
+ expect.extend(matchers);
11
+
12
+ // Cleanup after each test
13
+ afterEach(() => {
14
+ cleanup();
15
+ });
16
+
17
+ // Mock window.matchMedia for responsive components
18
+ Object.defineProperty(window, "matchMedia", {
19
+ writable: true,
20
+ value: vi.fn().mockImplementation((query: string) => ({
21
+ matches: false,
22
+ media: query,
23
+ onchange: null,
24
+ addListener: vi.fn(),
25
+ removeListener: vi.fn(),
26
+ addEventListener: vi.fn(),
27
+ removeEventListener: vi.fn(),
28
+ dispatchEvent: vi.fn(),
29
+ })),
30
+ });
31
+
32
+ // Mock ResizeObserver
33
+ global.ResizeObserver = vi.fn().mockImplementation(() => ({
34
+ observe: vi.fn(),
35
+ unobserve: vi.fn(),
36
+ disconnect: vi.fn(),
37
+ }));
38
+
39
+ // Mock IntersectionObserver
40
+ global.IntersectionObserver = vi.fn().mockImplementation(() => ({
41
+ observe: vi.fn(),
42
+ unobserve: vi.fn(),
43
+ disconnect: vi.fn(),
44
+ }));
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Test utilities for @questpie/admin components
3
+ */
4
+
5
+ import * as React from "react";
6
+ import { render, type RenderOptions } from "@testing-library/react";
7
+ import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
8
+
9
+ /**
10
+ * Create a fresh QueryClient for each test
11
+ */
12
+ function createTestQueryClient() {
13
+ return new QueryClient({
14
+ defaultOptions: {
15
+ queries: {
16
+ retry: false,
17
+ gcTime: 0,
18
+ },
19
+ mutations: {
20
+ retry: false,
21
+ },
22
+ },
23
+ });
24
+ }
25
+
26
+ /**
27
+ * Test wrapper with all required providers
28
+ */
29
+ function TestWrapper({ children }: { children: React.ReactNode }) {
30
+ const [queryClient] = React.useState(() => createTestQueryClient());
31
+
32
+ return (
33
+ <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
34
+ );
35
+ }
36
+
37
+ /**
38
+ * Custom render function that wraps components with test providers
39
+ */
40
+ function customRender(
41
+ ui: React.ReactElement,
42
+ options?: Omit<RenderOptions, "wrapper">,
43
+ ): ReturnType<typeof render> {
44
+ return render(ui, { wrapper: TestWrapper, ...options });
45
+ }
46
+
47
+ // Re-export everything from testing-library
48
+ export * from "@testing-library/react";
49
+ export { customRender as render };
@@ -0,0 +1,9 @@
1
+ import "vitest";
2
+ import type { TestingLibraryMatchers } from "@testing-library/jest-dom/matchers";
3
+
4
+ declare module "vitest" {
5
+ interface Assertion<T = any>
6
+ extends TestingLibraryMatchers<typeof expect.stringContaining, T> {}
7
+ interface AsymmetricMatchersContaining
8
+ extends TestingLibraryMatchers<unknown, unknown> {}
9
+ }
@@ -0,0 +1,221 @@
1
+ /**
2
+ * AdminApp Component
3
+ *
4
+ * MAIN ENTRY POINT - Mount this and you have a complete admin!
5
+ *
6
+ * Minimal usage:
7
+ * <AdminApp client={cmsClient} />
8
+ *
9
+ * Everything else is OPTIONAL customization.
10
+ */
11
+
12
+ import * as React from "react";
13
+ import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
14
+ import type { Questpie } from "questpie";
15
+ import type { QuestpieClient } from "questpie/client";
16
+ import { AdminProvider } from "../hooks/admin-provider";
17
+ import { AdminLayout } from "../views/layout/admin-layout";
18
+ import { AdminRouter } from "../views/layout/admin-router";
19
+ import type { ComponentRegistry } from "../config/component-registry";
20
+ import { mergeComponentRegistry } from "../config/component-registry";
21
+
22
+ export interface AdminAppProps<T extends Questpie<any>> {
23
+ /**
24
+ * CMS client - THE ONLY REQUIRED PROP!
25
+ */
26
+ client: QuestpieClient<T>;
27
+
28
+ /**
29
+ * Admin config (OPTIONAL)
30
+ * If not provided, auto-generates from CMS schema
31
+ */
32
+ config?: {
33
+ app?: {
34
+ brand?: {
35
+ name?: string;
36
+ logo?: React.ComponentType;
37
+ homeRoute?: string;
38
+ };
39
+ locales?: {
40
+ default: string;
41
+ available: string[];
42
+ };
43
+ header?: {
44
+ show?: boolean;
45
+ component?: React.ComponentType;
46
+ };
47
+ footer?: {
48
+ show?: boolean;
49
+ component?: React.ComponentType;
50
+ };
51
+ debug?: {
52
+ showQueryDevtools?: boolean;
53
+ showRouterDevtools?: boolean;
54
+ };
55
+ };
56
+ collections?: Record<string, any>;
57
+ globals?: Record<string, any>;
58
+ pages?: Record<string, any>;
59
+ };
60
+
61
+ /**
62
+ * Component registry (OPTIONAL)
63
+ * Custom field components, layouts, etc.
64
+ */
65
+ registry?: Partial<ComponentRegistry>;
66
+
67
+ /**
68
+ * QueryClient instance (OPTIONAL)
69
+ * If not provided, creates default
70
+ */
71
+ queryClient?: QueryClient;
72
+
73
+ /**
74
+ * Router integration (framework-specific)
75
+ */
76
+ router: {
77
+ /**
78
+ * Link component from your router
79
+ * Example: from TanStack Router, Next.js, React Router
80
+ */
81
+ LinkComponent: React.ComponentType<{
82
+ to: string;
83
+ className?: string;
84
+ children: React.ReactNode;
85
+ activeProps?: { className?: string };
86
+ }>;
87
+
88
+ /**
89
+ * Current route path
90
+ */
91
+ currentPath: string;
92
+
93
+ /**
94
+ * Route segments after /admin
95
+ * Example: for /admin/barbers/123 -> ["barbers", "123"]
96
+ */
97
+ segments: string[];
98
+
99
+ /**
100
+ * Navigate function
101
+ */
102
+ navigate: (path: string) => void;
103
+ };
104
+
105
+ /**
106
+ * Base path for admin routes (OPTIONAL)
107
+ * Default: "/admin"
108
+ */
109
+ basePath?: string;
110
+
111
+ /**
112
+ * Custom dashboard component (OPTIONAL)
113
+ */
114
+ DashboardComponent?: React.ComponentType;
115
+
116
+ /**
117
+ * Custom collection components (OPTIONAL)
118
+ */
119
+ collectionComponents?: Record<
120
+ string,
121
+ {
122
+ List?: React.ComponentType;
123
+ Form?: React.ComponentType;
124
+ }
125
+ >;
126
+
127
+ /**
128
+ * Render custom form fields (OPTIONAL - will be replaced by AutoFormFields)
129
+ */
130
+ renderFormFields?: (collection: string) => React.ReactNode;
131
+ }
132
+
133
+ /**
134
+ * Default QueryClient configuration
135
+ */
136
+ function createDefaultQueryClient() {
137
+ return new QueryClient({
138
+ defaultOptions: {
139
+ queries: {
140
+ staleTime: 60 * 1000, // 1 minute
141
+ refetchOnWindowFocus: false,
142
+ },
143
+ },
144
+ });
145
+ }
146
+
147
+ /**
148
+ * AdminApp Component
149
+ *
150
+ * ONE COMPONENT TO RULE THEM ALL!
151
+ */
152
+ export function AdminApp<T extends Questpie<any>>({
153
+ client,
154
+ config,
155
+ registry,
156
+ queryClient,
157
+ router,
158
+ basePath = "/admin",
159
+ DashboardComponent,
160
+ collectionComponents,
161
+ renderFormFields,
162
+ }: AdminAppProps<T>): React.ReactElement {
163
+ // Create or use provided QueryClient
164
+ const [defaultQueryClient] = React.useState(
165
+ () => queryClient ?? createDefaultQueryClient(),
166
+ );
167
+
168
+ // Merge component registry
169
+ const mergedRegistry = React.useMemo(
170
+ () => mergeComponentRegistry(registry),
171
+ [registry],
172
+ );
173
+
174
+ // Auto-generate config from CMS if not provided
175
+ const finalConfig = React.useMemo(() => {
176
+ if (config) return config;
177
+
178
+ // TODO: Auto-generate from CMS schema
179
+ // For now, return minimal config
180
+ return {
181
+ app: {
182
+ brand: {
183
+ name: "Admin",
184
+ },
185
+ },
186
+ collections: {},
187
+ };
188
+ }, [config]);
189
+
190
+ return (
191
+ <QueryClientProvider client={defaultQueryClient}>
192
+ <AdminProvider
193
+ client={client}
194
+ queryClient={defaultQueryClient}
195
+ locales={finalConfig.app?.locales}
196
+ >
197
+ <AdminLayout
198
+ config={finalConfig}
199
+ activeRoute={router.currentPath}
200
+ LinkComponent={router.LinkComponent}
201
+ >
202
+ <AdminRouter
203
+ config={finalConfig}
204
+ segments={router.segments}
205
+ navigate={router.navigate}
206
+ DashboardComponent={DashboardComponent}
207
+ collectionComponents={collectionComponents}
208
+ renderFormFields={renderFormFields}
209
+ registry={mergedRegistry}
210
+ />
211
+ </AdminLayout>
212
+ </AdminProvider>
213
+
214
+ {/* Optional: Query Devtools */}
215
+ {config?.app?.debug?.showQueryDevtools && (
216
+ // TODO: Add ReactQueryDevtools
217
+ <div />
218
+ )}
219
+ </QueryClientProvider>
220
+ );
221
+ }