create-next-imagicma 0.1.11 → 0.1.13

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 (96) hide show
  1. package/README.md +0 -2
  2. package/package.json +1 -1
  3. package/template-hono/AGENTS.md +53 -95
  4. package/template-hono/README.md +3 -31
  5. package/template-hono/client/public/imagicma-picker-bridge.js +6 -2
  6. package/template-hono/client/public/imagicma-preview-feedback.js +1 -0
  7. package/template-hono/client/src/lib/imagicma-preview-bridge.ts +1 -1
  8. package/template-hono/client/src/lib/imagicma-preview-picker.ts +130 -28
  9. package/template-hono/vite.config.ts +1 -1
  10. package/template/.env.example +0 -10
  11. package/template/AGENTS.md +0 -225
  12. package/template/README.md +0 -34
  13. package/template/app/_components/DevPreviewShield.tsx +0 -638
  14. package/template/app/api/greeting/route.ts +0 -27
  15. package/template/app/error.tsx +0 -93
  16. package/template/app/favicon.ico +0 -0
  17. package/template/app/globals.css +0 -767
  18. package/template/app/hello/_components/HelloClient.tsx +0 -94
  19. package/template/app/hello/page.tsx +0 -23
  20. package/template/app/layout.tsx +0 -32
  21. package/template/app/page.tsx +0 -27
  22. package/template/app/providers.tsx +0 -25
  23. package/template/components/ui/accordion.tsx +0 -58
  24. package/template/components/ui/alert-dialog.tsx +0 -141
  25. package/template/components/ui/alert.tsx +0 -61
  26. package/template/components/ui/aspect-ratio.tsx +0 -7
  27. package/template/components/ui/avatar.tsx +0 -51
  28. package/template/components/ui/badge.tsx +0 -40
  29. package/template/components/ui/breadcrumb.tsx +0 -117
  30. package/template/components/ui/button.tsx +0 -64
  31. package/template/components/ui/calendar.tsx +0 -72
  32. package/template/components/ui/card.tsx +0 -87
  33. package/template/components/ui/carousel.tsx +0 -262
  34. package/template/components/ui/chart.tsx +0 -365
  35. package/template/components/ui/checkbox.tsx +0 -30
  36. package/template/components/ui/collapsible.tsx +0 -11
  37. package/template/components/ui/command.tsx +0 -153
  38. package/template/components/ui/context-menu.tsx +0 -200
  39. package/template/components/ui/dialog.tsx +0 -122
  40. package/template/components/ui/drawer.tsx +0 -118
  41. package/template/components/ui/dropdown-menu.tsx +0 -200
  42. package/template/components/ui/form.tsx +0 -178
  43. package/template/components/ui/hover-card.tsx +0 -29
  44. package/template/components/ui/input-otp.tsx +0 -71
  45. package/template/components/ui/input.tsx +0 -25
  46. package/template/components/ui/label.tsx +0 -26
  47. package/template/components/ui/menubar.tsx +0 -256
  48. package/template/components/ui/navigation-menu.tsx +0 -130
  49. package/template/components/ui/pagination.tsx +0 -119
  50. package/template/components/ui/popover.tsx +0 -31
  51. package/template/components/ui/progress.tsx +0 -28
  52. package/template/components/ui/radio-group.tsx +0 -44
  53. package/template/components/ui/resizable.tsx +0 -45
  54. package/template/components/ui/scroll-area.tsx +0 -48
  55. package/template/components/ui/select.tsx +0 -160
  56. package/template/components/ui/separator.tsx +0 -31
  57. package/template/components/ui/sheet.tsx +0 -140
  58. package/template/components/ui/sidebar.tsx +0 -732
  59. package/template/components/ui/skeleton.tsx +0 -17
  60. package/template/components/ui/slider.tsx +0 -28
  61. package/template/components/ui/switch.tsx +0 -29
  62. package/template/components/ui/table.tsx +0 -119
  63. package/template/components/ui/tabs.tsx +0 -55
  64. package/template/components/ui/textarea.tsx +0 -24
  65. package/template/components/ui/toast.tsx +0 -129
  66. package/template/components/ui/toaster.tsx +0 -35
  67. package/template/components/ui/toggle-group.tsx +0 -61
  68. package/template/components/ui/toggle.tsx +0 -45
  69. package/template/components/ui/tooltip.tsx +0 -30
  70. package/template/drizzle.config.ts +0 -50
  71. package/template/eslint.config.mjs +0 -18
  72. package/template/gitignore +0 -46
  73. package/template/hooks/use-greeting.ts +0 -15
  74. package/template/hooks/use-mobile.ts +0 -21
  75. package/template/hooks/use-toast.ts +0 -194
  76. package/template/lib/queryClient.ts +0 -59
  77. package/template/lib/theme/default-theme.ts +0 -11
  78. package/template/lib/utils.ts +0 -6
  79. package/template/next.config.ts +0 -8
  80. package/template/package.json +0 -76
  81. package/template/pnpm-lock.yaml +0 -6937
  82. package/template/postcss.config.mjs +0 -7
  83. package/template/process-compose.yaml +0 -13
  84. package/template/public/file.svg +0 -1
  85. package/template/public/globe.svg +0 -1
  86. package/template/public/imagicma-picker-bridge.js +0 -374
  87. package/template/public/next.svg +0 -1
  88. package/template/public/vercel.svg +0 -1
  89. package/template/public/window.svg +0 -1
  90. package/template/server/db.ts +0 -24
  91. package/template/server/storage.ts +0 -41
  92. package/template/shared/routes.ts +0 -13
  93. package/template/shared/schema.ts +0 -17
  94. package/template/tailwind.config.mjs +0 -96
  95. package/template/tsconfig.json +0 -35
  96. package/template/types/pg.d.ts +0 -19
@@ -1,7 +0,0 @@
1
- const config = {
2
- plugins: {
3
- "@tailwindcss/postcss": {},
4
- },
5
- };
6
-
7
- export default config;
@@ -1,13 +0,0 @@
1
- version: "0.5"
2
- log_location: ".imagicma/process-compose.log"
3
-
4
- processes:
5
- web:
6
- command: "pnpm dev"
7
- working_dir: "."
8
- environment:
9
- - "PORT=5000"
10
- availability:
11
- restart: "always"
12
- backoff_seconds: 5
13
- max_restarts: 20
@@ -1 +0,0 @@
1
- <svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
@@ -1 +0,0 @@
1
- <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
@@ -1,374 +0,0 @@
1
- (function () {
2
- var CHANNEL = 'imagicma.preview-picker';
3
- var VERSION = 1;
4
- var MAX_TEXT_LENGTH = 240;
5
- var MAX_SELECTOR_LENGTH = 512;
6
- var PROD_PARENT_ORIGIN = 'https://www.imagicma.cn';
7
- var LOCAL_PARENT_RE = /^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/i;
8
- var LOCAL_IMAGICMA_PARENT_RE = /^https?:\/\/([a-z0-9-]+\.)?local\.imagicma\.cn(:\d+)?$/i;
9
-
10
- var state = {
11
- active: false,
12
- sessionId: '',
13
- nonce: '',
14
- parentOrigin: '',
15
- hoverEl: null,
16
- overlayEl: null,
17
- rafId: 0,
18
- };
19
-
20
- var listenersBound = false;
21
-
22
- function isAllowedParentOrigin(origin) {
23
- if (!origin) return false;
24
- return origin === PROD_PARENT_ORIGIN || LOCAL_PARENT_RE.test(origin) || LOCAL_IMAGICMA_PARENT_RE.test(origin);
25
- }
26
-
27
- function isRecord(value) {
28
- return typeof value === 'object' && value !== null;
29
- }
30
-
31
- function trimText(value) {
32
- return typeof value === 'string' ? value.trim() : '';
33
- }
34
-
35
- function truncateText(value, max) {
36
- if (!value) return '';
37
- return value.length > max ? value.slice(0, max) : value;
38
- }
39
-
40
- function safePostMessage(type, payload) {
41
- if (!state.parentOrigin) return;
42
- if (window.parent === window) return;
43
-
44
- try {
45
- window.parent.postMessage(
46
- {
47
- channel: CHANNEL,
48
- version: VERSION,
49
- type: type,
50
- sessionId: state.sessionId,
51
- nonce: state.nonce,
52
- payload: payload,
53
- },
54
- state.parentOrigin,
55
- );
56
- } catch (_error) {
57
- // Ignore postMessage failures.
58
- }
59
- }
60
-
61
- function ensureOverlay() {
62
- if (state.overlayEl && document.body.contains(state.overlayEl)) return state.overlayEl;
63
- var overlay = document.createElement('div');
64
- overlay.setAttribute('data-imagicma-picker-overlay', 'true');
65
- overlay.style.position = 'fixed';
66
- overlay.style.left = '0';
67
- overlay.style.top = '0';
68
- overlay.style.width = '0';
69
- overlay.style.height = '0';
70
- overlay.style.zIndex = '2147483647';
71
- overlay.style.pointerEvents = 'none';
72
- overlay.style.border = '2px solid #1d4ed8';
73
- overlay.style.background = 'rgba(29, 78, 216, 0.10)';
74
- overlay.style.boxSizing = 'border-box';
75
- overlay.style.display = 'none';
76
- document.body.appendChild(overlay);
77
- state.overlayEl = overlay;
78
- return overlay;
79
- }
80
-
81
- function hideOverlay() {
82
- if (!state.overlayEl) return;
83
- state.overlayEl.style.display = 'none';
84
- }
85
-
86
- function updateOverlay() {
87
- if (!state.active || !state.hoverEl) {
88
- hideOverlay();
89
- return;
90
- }
91
-
92
- var rect = state.hoverEl.getBoundingClientRect();
93
- var overlay = ensureOverlay();
94
- if (rect.width <= 0 || rect.height <= 0) {
95
- overlay.style.display = 'none';
96
- return;
97
- }
98
-
99
- overlay.style.display = 'block';
100
- overlay.style.left = rect.left + 'px';
101
- overlay.style.top = rect.top + 'px';
102
- overlay.style.width = rect.width + 'px';
103
- overlay.style.height = rect.height + 'px';
104
- }
105
-
106
- function queueOverlayUpdate() {
107
- if (state.rafId) return;
108
- state.rafId = window.requestAnimationFrame(function () {
109
- state.rafId = 0;
110
- updateOverlay();
111
- });
112
- }
113
-
114
- function isValidElementTarget(target) {
115
- if (!(target instanceof Element)) return false;
116
- if (state.overlayEl && state.overlayEl.contains(target)) return false;
117
- return true;
118
- }
119
-
120
- function cssEscapeIdent(value) {
121
- if (typeof window.CSS !== 'undefined' && typeof window.CSS.escape === 'function') {
122
- return window.CSS.escape(value);
123
- }
124
- return value.replace(/[^a-zA-Z0-9_-]/g, '\\$&');
125
- }
126
-
127
- function selectorByClassChain(element) {
128
- var tokens = [];
129
- if (element.classList && element.classList.length > 0) {
130
- for (var i = 0; i < element.classList.length && i < 3; i += 1) {
131
- var cls = trimText(element.classList[i]);
132
- if (cls) tokens.push('.' + cssEscapeIdent(cls));
133
- }
134
- }
135
- return tokens.length > 0 ? element.tagName.toLowerCase() + tokens.join('') : '';
136
- }
137
-
138
- function selectorByPath(element) {
139
- var parts = [];
140
- var current = element;
141
- var depth = 0;
142
- while (current && current.nodeType === 1 && depth < 6) {
143
- var part = current.tagName.toLowerCase();
144
- if (current.id) {
145
- part += '#' + cssEscapeIdent(current.id);
146
- parts.unshift(part);
147
- break;
148
- }
149
-
150
- var classSelector = selectorByClassChain(current);
151
- if (classSelector) {
152
- part = classSelector;
153
- } else if (current.parentElement) {
154
- var siblings = current.parentElement.children;
155
- var sameTagIndex = 0;
156
- var sameTagCount = 0;
157
- for (var i = 0; i < siblings.length; i += 1) {
158
- var sibling = siblings[i];
159
- if (sibling.tagName === current.tagName) {
160
- sameTagCount += 1;
161
- if (sibling === current) {
162
- sameTagIndex = sameTagCount;
163
- }
164
- }
165
- }
166
- if (sameTagCount > 1 && sameTagIndex > 0) {
167
- part += ':nth-of-type(' + sameTagIndex + ')';
168
- }
169
- }
170
-
171
- parts.unshift(part);
172
- current = current.parentElement;
173
- depth += 1;
174
- }
175
-
176
- return parts.join(' > ');
177
- }
178
-
179
- function getElementSelector(element) {
180
- if (element.id) {
181
- return '#' + cssEscapeIdent(element.id);
182
- }
183
-
184
- var testId = element.getAttribute('data-testid');
185
- if (testId) {
186
- return '[data-testid="' + testId.replace(/"/g, '\\"') + '"]';
187
- }
188
-
189
- var ariaLabel = element.getAttribute('aria-label');
190
- if (ariaLabel) {
191
- return element.tagName.toLowerCase() + '[aria-label="' + ariaLabel.replace(/"/g, '\\"') + '"]';
192
- }
193
-
194
- var role = element.getAttribute('role');
195
- if (role) {
196
- return element.tagName.toLowerCase() + '[role="' + role.replace(/"/g, '\\"') + '"]';
197
- }
198
-
199
- var byClass = selectorByClassChain(element);
200
- if (byClass) return byClass;
201
-
202
- return selectorByPath(element) || element.tagName.toLowerCase();
203
- }
204
-
205
- function buildSelectionPayload(element) {
206
- var rect = element.getBoundingClientRect();
207
- var selector = truncateText(getElementSelector(element), MAX_SELECTOR_LENGTH);
208
- var textSource = trimText(element.innerText || element.textContent || '');
209
- var attributes = {};
210
-
211
- function putAttr(name, value) {
212
- if (!name || typeof value !== 'string') return;
213
- var key = trimText(name).toLowerCase();
214
- var val = trimText(value);
215
- if (!key || !val) return;
216
- attributes[key] = truncateText(val, 240);
217
- }
218
-
219
- putAttr('id', element.id || '');
220
- putAttr('class', element.className || '');
221
- putAttr('role', element.getAttribute('role') || '');
222
- putAttr('name', element.getAttribute('name') || '');
223
- putAttr('type', element.getAttribute('type') || '');
224
- putAttr('title', element.getAttribute('title') || '');
225
- putAttr('aria-label', element.getAttribute('aria-label') || '');
226
- putAttr('aria-labelledby', element.getAttribute('aria-labelledby') || '');
227
- putAttr('aria-describedby', element.getAttribute('aria-describedby') || '');
228
- putAttr('placeholder', element.getAttribute('placeholder') || '');
229
- putAttr('href', element.getAttribute('href') || '');
230
- putAttr('src', element.getAttribute('src') || '');
231
- putAttr('alt', element.getAttribute('alt') || '');
232
-
233
- if (element.attributes && element.attributes.length > 0) {
234
- for (var i = 0; i < element.attributes.length; i += 1) {
235
- var attr = element.attributes[i];
236
- if (!attr) continue;
237
- var attrName = trimText(attr.name || '').toLowerCase();
238
- if (!attrName) continue;
239
- if (attrName.indexOf('data-') === 0 || attrName.indexOf('aria-') === 0) {
240
- putAttr(attrName, attr.value || '');
241
- }
242
- }
243
- }
244
-
245
- return {
246
- pageUrl: window.location.href,
247
- selector: selector,
248
- tagName: element.tagName.toLowerCase(),
249
- textSnippet: truncateText(textSource, MAX_TEXT_LENGTH),
250
- attributes: attributes,
251
- rect: {
252
- x: Number(rect.left.toFixed(2)),
253
- y: Number(rect.top.toFixed(2)),
254
- width: Number(rect.width.toFixed(2)),
255
- height: Number(rect.height.toFixed(2)),
256
- },
257
- };
258
- }
259
-
260
- function handleMouseMove(event) {
261
- if (!state.active) return;
262
- var target = event.target;
263
- if (!isValidElementTarget(target)) return;
264
- state.hoverEl = target;
265
- queueOverlayUpdate();
266
- }
267
-
268
- function handleScrollOrResize() {
269
- if (!state.active) return;
270
- queueOverlayUpdate();
271
- }
272
-
273
- function handleClickCapture(event) {
274
- if (!state.active) return;
275
- var target = event.target;
276
- if (!isValidElementTarget(target)) return;
277
-
278
- event.preventDefault();
279
- event.stopPropagation();
280
- if (typeof event.stopImmediatePropagation === 'function') {
281
- event.stopImmediatePropagation();
282
- }
283
-
284
- try {
285
- var payload = buildSelectionPayload(target);
286
- safePostMessage('IMAGICMA_PICKER_SELECTED', payload);
287
- } catch (error) {
288
- safePostMessage('IMAGICMA_PICKER_ERROR', {
289
- message: error instanceof Error ? error.message : 'Failed to build selected element payload',
290
- });
291
- }
292
- }
293
-
294
- function bindInteractionListeners() {
295
- if (listenersBound) return;
296
- listenersBound = true;
297
- document.addEventListener('mousemove', handleMouseMove, true);
298
- document.addEventListener('click', handleClickCapture, true);
299
- window.addEventListener('scroll', handleScrollOrResize, true);
300
- window.addEventListener('resize', handleScrollOrResize, true);
301
- }
302
-
303
- function unbindInteractionListeners() {
304
- if (!listenersBound) return;
305
- listenersBound = false;
306
- document.removeEventListener('mousemove', handleMouseMove, true);
307
- document.removeEventListener('click', handleClickCapture, true);
308
- window.removeEventListener('scroll', handleScrollOrResize, true);
309
- window.removeEventListener('resize', handleScrollOrResize, true);
310
- }
311
-
312
- function activatePicking() {
313
- state.active = true;
314
- state.hoverEl = null;
315
- bindInteractionListeners();
316
- document.documentElement.style.cursor = 'crosshair';
317
- document.body.style.cursor = 'crosshair';
318
- safePostMessage('IMAGICMA_PICKER_READY', {
319
- pageUrl: window.location.href,
320
- });
321
- }
322
-
323
- function deactivatePicking() {
324
- state.active = false;
325
- state.hoverEl = null;
326
- if (state.rafId) {
327
- window.cancelAnimationFrame(state.rafId);
328
- state.rafId = 0;
329
- }
330
- hideOverlay();
331
- unbindInteractionListeners();
332
- document.documentElement.style.cursor = '';
333
- document.body.style.cursor = '';
334
- }
335
-
336
- function isValidMessage(data) {
337
- if (!isRecord(data)) return false;
338
- if (data.channel !== CHANNEL) return false;
339
- if (data.version !== VERSION) return false;
340
- if (typeof data.type !== 'string') return false;
341
- if (typeof data.sessionId !== 'string' || data.sessionId.length === 0) return false;
342
- if (typeof data.nonce !== 'string' || data.nonce.length === 0) return false;
343
- return true;
344
- }
345
-
346
- function handleParentMessage(event) {
347
- if (!isAllowedParentOrigin(event.origin)) return;
348
- if (!isValidMessage(event.data)) return;
349
-
350
- var data = event.data;
351
- state.parentOrigin = event.origin;
352
- state.sessionId = data.sessionId;
353
- state.nonce = data.nonce;
354
-
355
- if (data.type === 'IMAGICMA_PICKER_PING') {
356
- safePostMessage('IMAGICMA_PICKER_READY', {
357
- pageUrl: window.location.href,
358
- });
359
- return;
360
- }
361
-
362
- if (data.type === 'IMAGICMA_PICKER_START') {
363
- activatePicking();
364
- return;
365
- }
366
-
367
- if (data.type === 'IMAGICMA_PICKER_STOP') {
368
- deactivatePicking();
369
- }
370
- }
371
-
372
- window.addEventListener('message', handleParentMessage);
373
- window.addEventListener('beforeunload', deactivatePicking);
374
- })();
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
@@ -1 +0,0 @@
1
- <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
@@ -1 +0,0 @@
1
- <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>
@@ -1,24 +0,0 @@
1
- import "server-only";
2
-
3
- import { drizzle } from "drizzle-orm/node-postgres";
4
- import pg from "pg";
5
- import * as schema from "@shared/schema";
6
-
7
- const { Pool } = pg;
8
-
9
- const databaseUrl = process.env.DATABASE_URL;
10
-
11
- declare global {
12
- var __dbPool: InstanceType<typeof Pool> | undefined;
13
- }
14
-
15
- export const pool =
16
- databaseUrl
17
- ? globalThis.__dbPool ?? new Pool({ connectionString: databaseUrl })
18
- : undefined;
19
-
20
- if (databaseUrl && process.env.NODE_ENV !== "production") {
21
- globalThis.__dbPool = pool;
22
- }
23
-
24
- export const db = pool ? drizzle(pool, { schema }) : undefined;
@@ -1,41 +0,0 @@
1
- import "server-only";
2
-
3
- import { messages } from "@shared/schema";
4
- import { db } from "./db";
5
- import { desc } from "drizzle-orm";
6
-
7
- export interface IStorage {
8
- getMessage(): Promise<string>;
9
- }
10
-
11
- export class DatabaseStorage implements IStorage {
12
- async getMessage(): Promise<string> {
13
- if (!db) {
14
- throw new Error(
15
- "DATABASE_URL 未设置:请在 .env.local 中配置 Postgres 连接串,然后执行 `npm run db:push`。",
16
- );
17
- }
18
-
19
- try {
20
- const rows = await db
21
- .select({ content: messages.content })
22
- .from(messages)
23
- .orderBy(desc(messages.id))
24
- .limit(1);
25
-
26
- return rows[0]?.content ?? "Hello from the Backend API!";
27
- } catch (error) {
28
- console.error("DatabaseStorage.getMessage() failed:", error);
29
-
30
- if (error instanceof Error && error.message.includes("DATABASE_URL")) {
31
- throw error;
32
- }
33
-
34
- throw new Error(
35
- "数据库读取失败:请确认已设置 DATABASE_URL,并先执行 `npm run db:push` 创建表结构。",
36
- );
37
- }
38
- }
39
- }
40
-
41
- export const storage = new DatabaseStorage();
@@ -1,13 +0,0 @@
1
- import { z } from "zod";
2
-
3
- export const api = {
4
- greeting: {
5
- get: {
6
- method: "GET",
7
- path: "/api/greeting",
8
- responses: {
9
- 200: z.object({ message: z.string() }),
10
- },
11
- },
12
- },
13
- };
@@ -1,17 +0,0 @@
1
- import { pgTable, text, serial, boolean } from "drizzle-orm/pg-core";
2
- import { createInsertSchema } from "drizzle-zod";
3
- import { z } from "zod";
4
-
5
- export const messages = pgTable("messages", {
6
- id: serial("id").primaryKey(),
7
- content: text("content").notNull(),
8
- isRead: boolean("is_read").default(false),
9
- });
10
-
11
- export const insertMessageSchema = createInsertSchema(messages).pick({
12
- content: true,
13
- isRead: true,
14
- });
15
-
16
- export type Message = typeof messages.$inferSelect;
17
- export type InsertMessage = z.infer<typeof insertMessageSchema>;
@@ -1,96 +0,0 @@
1
- import animate from "tailwindcss-animate";
2
-
3
- /** @type {import("tailwindcss").Config} */
4
- const config = {
5
- darkMode: ["class"],
6
- content: [
7
- "./app/**/*.{ts,tsx}",
8
- "./components/**/*.{ts,tsx}",
9
- "./hooks/**/*.{ts,tsx}",
10
- "./lib/**/*.{ts,tsx}",
11
- "./shared/**/*.{ts,tsx}",
12
- ],
13
- theme: {
14
- extend: {
15
- borderRadius: {
16
- lg: "var(--radius)",
17
- md: "calc(var(--radius) - 2px)",
18
- sm: "calc(var(--radius) - 4px)",
19
- },
20
- colors: {
21
- background: "hsl(var(--background) / <alpha-value>)",
22
- foreground: "hsl(var(--foreground) / <alpha-value>)",
23
- border: "hsl(var(--border) / <alpha-value>)",
24
- input: "hsl(var(--input) / <alpha-value>)",
25
- ring: "hsl(var(--ring) / <alpha-value>)",
26
- card: {
27
- DEFAULT: "hsl(var(--card) / <alpha-value>)",
28
- foreground: "hsl(var(--card-foreground) / <alpha-value>)",
29
- border: "hsl(var(--card-border) / <alpha-value>)",
30
- },
31
- popover: {
32
- DEFAULT: "hsl(var(--popover) / <alpha-value>)",
33
- foreground: "hsl(var(--popover-foreground) / <alpha-value>)",
34
- border: "hsl(var(--popover-border) / <alpha-value>)",
35
- },
36
- primary: {
37
- DEFAULT: "hsl(var(--primary) / <alpha-value>)",
38
- foreground: "hsl(var(--primary-foreground) / <alpha-value>)",
39
- border: "var(--primary-border)",
40
- },
41
- secondary: {
42
- DEFAULT: "hsl(var(--secondary) / <alpha-value>)",
43
- foreground: "hsl(var(--secondary-foreground) / <alpha-value>)",
44
- border: "var(--secondary-border)",
45
- },
46
- muted: {
47
- DEFAULT: "hsl(var(--muted) / <alpha-value>)",
48
- foreground: "hsl(var(--muted-foreground) / <alpha-value>)",
49
- border: "var(--muted-border)",
50
- },
51
- accent: {
52
- DEFAULT: "hsl(var(--accent) / <alpha-value>)",
53
- foreground: "hsl(var(--accent-foreground) / <alpha-value>)",
54
- border: "var(--accent-border)",
55
- },
56
- destructive: {
57
- DEFAULT: "hsl(var(--destructive) / <alpha-value>)",
58
- foreground: "hsl(var(--destructive-foreground) / <alpha-value>)",
59
- border: "var(--destructive-border)",
60
- },
61
- chart: {
62
- "1": "hsl(var(--chart-1) / <alpha-value>)",
63
- "2": "hsl(var(--chart-2) / <alpha-value>)",
64
- "3": "hsl(var(--chart-3) / <alpha-value>)",
65
- "4": "hsl(var(--chart-4) / <alpha-value>)",
66
- "5": "hsl(var(--chart-5) / <alpha-value>)",
67
- },
68
- sidebar: {
69
- DEFAULT: "hsl(var(--sidebar) / <alpha-value>)",
70
- foreground: "hsl(var(--sidebar-foreground) / <alpha-value>)",
71
- border: "hsl(var(--sidebar-border) / <alpha-value>)",
72
- ring: "hsl(var(--sidebar-ring) / <alpha-value>)",
73
- accent: "hsl(var(--accent) / <alpha-value>)",
74
- "accent-foreground": "hsl(var(--accent-foreground) / <alpha-value>)",
75
- },
76
- },
77
- keyframes: {
78
- "accordion-down": {
79
- from: { height: "0" },
80
- to: { height: "var(--radix-accordion-content-height)" },
81
- },
82
- "accordion-up": {
83
- from: { height: "var(--radix-accordion-content-height)" },
84
- to: { height: "0" },
85
- },
86
- },
87
- animation: {
88
- "accordion-down": "accordion-down 0.2s ease-out",
89
- "accordion-up": "accordion-up 0.2s ease-out",
90
- },
91
- },
92
- },
93
- plugins: [animate],
94
- };
95
-
96
- export default config;
@@ -1,35 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2017",
4
- "lib": ["dom", "dom.iterable", "esnext"],
5
- "allowJs": true,
6
- "skipLibCheck": true,
7
- "strict": true,
8
- "noEmit": true,
9
- "esModuleInterop": true,
10
- "module": "esnext",
11
- "moduleResolution": "bundler",
12
- "resolveJsonModule": true,
13
- "isolatedModules": true,
14
- "jsx": "react-jsx",
15
- "incremental": true,
16
- "plugins": [
17
- {
18
- "name": "next"
19
- }
20
- ],
21
- "paths": {
22
- "@/*": ["./*"],
23
- "@shared/*": ["./shared/*"]
24
- }
25
- },
26
- "include": [
27
- "next-env.d.ts",
28
- "**/*.ts",
29
- "**/*.tsx",
30
- ".next/types/**/*.ts",
31
- ".next/dev/types/**/*.ts",
32
- "**/*.mts"
33
- ],
34
- "exclude": ["node_modules"]
35
- }
@@ -1,19 +0,0 @@
1
- declare module "pg" {
2
- export type PoolConfig = {
3
- connectionString?: string;
4
- [key: string]: unknown;
5
- };
6
-
7
- export class Pool {
8
- constructor(config?: PoolConfig);
9
- query: (...args: unknown[]) => Promise<unknown>;
10
- end: () => Promise<void>;
11
- }
12
-
13
- const pg: {
14
- Pool: typeof Pool;
15
- };
16
-
17
- export default pg;
18
- }
19
-