@underpeaks/generator-nextjs 1.0.27 → 1.0.29

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 (105) hide show
  1. package/dist/components/media/edit/nxf_audio_upload.d.ts +2 -0
  2. package/dist/components/media/edit/nxf_audio_upload.d.ts.map +1 -1
  3. package/dist/components/media/edit/nxf_audio_upload.js +68 -0
  4. package/dist/components/media/edit/nxf_audio_upload.js.map +1 -1
  5. package/dist/components/numeric/display/nxf_formatted_currency.d.ts +2 -0
  6. package/dist/components/numeric/display/nxf_formatted_currency.d.ts.map +1 -1
  7. package/dist/components/numeric/display/nxf_formatted_currency.js +29 -0
  8. package/dist/components/numeric/display/nxf_formatted_currency.js.map +1 -1
  9. package/dist/components/registry-display.d.ts +5 -0
  10. package/dist/components/registry-display.d.ts.map +1 -0
  11. package/dist/components/registry-display.js +116 -0
  12. package/dist/components/registry-display.js.map +1 -0
  13. package/dist/components/registry-edit.d.ts +5 -0
  14. package/dist/components/registry-edit.d.ts.map +1 -0
  15. package/dist/components/registry-edit.js +156 -0
  16. package/dist/components/registry-edit.js.map +1 -0
  17. package/dist/generator.d.ts +13 -1
  18. package/dist/generator.d.ts.map +1 -1
  19. package/dist/generator.js +105 -32
  20. package/dist/generator.js.map +1 -1
  21. package/dist/templates/page-blog-post.d.ts +3 -0
  22. package/dist/templates/page-blog-post.d.ts.map +1 -0
  23. package/dist/templates/page-blog-post.js +63 -0
  24. package/dist/templates/page-blog-post.js.map +1 -0
  25. package/dist/templates/page-calendar.d.ts +3 -0
  26. package/dist/templates/page-calendar.d.ts.map +1 -0
  27. package/dist/templates/page-calendar.js +66 -0
  28. package/dist/templates/page-calendar.js.map +1 -0
  29. package/dist/templates/page-cart.d.ts +3 -0
  30. package/dist/templates/page-cart.d.ts.map +1 -0
  31. package/dist/templates/page-cart.js +37 -0
  32. package/dist/templates/page-cart.js.map +1 -0
  33. package/dist/templates/page-chat.d.ts +3 -0
  34. package/dist/templates/page-chat.d.ts.map +1 -0
  35. package/dist/templates/page-chat.js +65 -0
  36. package/dist/templates/page-chat.js.map +1 -0
  37. package/dist/templates/page-checkout.d.ts +3 -0
  38. package/dist/templates/page-checkout.d.ts.map +1 -0
  39. package/dist/templates/page-checkout.js +57 -0
  40. package/dist/templates/page-checkout.js.map +1 -0
  41. package/dist/templates/page-contact.d.ts +3 -0
  42. package/dist/templates/page-contact.d.ts.map +1 -0
  43. package/dist/templates/page-contact.js +86 -0
  44. package/dist/templates/page-contact.js.map +1 -0
  45. package/dist/templates/page-custom.d.ts +3 -0
  46. package/dist/templates/page-custom.d.ts.map +1 -0
  47. package/dist/templates/page-custom.js +31 -0
  48. package/dist/templates/page-custom.js.map +1 -0
  49. package/dist/templates/page-dashboard.d.ts +3 -0
  50. package/dist/templates/page-dashboard.d.ts.map +1 -0
  51. package/dist/templates/page-dashboard.js +63 -0
  52. package/dist/templates/page-dashboard.js.map +1 -0
  53. package/dist/templates/page-feed.d.ts +3 -0
  54. package/dist/templates/page-feed.d.ts.map +1 -0
  55. package/dist/templates/page-feed.js +68 -0
  56. package/dist/templates/page-feed.js.map +1 -0
  57. package/dist/templates/page-gallery.d.ts +3 -0
  58. package/dist/templates/page-gallery.d.ts.map +1 -0
  59. package/dist/templates/page-gallery.js +67 -0
  60. package/dist/templates/page-gallery.js.map +1 -0
  61. package/dist/templates/page-invoice.d.ts +3 -0
  62. package/dist/templates/page-invoice.d.ts.map +1 -0
  63. package/dist/templates/page-invoice.js +70 -0
  64. package/dist/templates/page-invoice.js.map +1 -0
  65. package/dist/templates/page-kanban.d.ts +3 -0
  66. package/dist/templates/page-kanban.d.ts.map +1 -0
  67. package/dist/templates/page-kanban.js +72 -0
  68. package/dist/templates/page-kanban.js.map +1 -0
  69. package/dist/templates/page-map.d.ts +3 -0
  70. package/dist/templates/page-map.d.ts.map +1 -0
  71. package/dist/templates/page-map.js +33 -0
  72. package/dist/templates/page-map.js.map +1 -0
  73. package/dist/templates/page-messages.d.ts +3 -0
  74. package/dist/templates/page-messages.d.ts.map +1 -0
  75. package/dist/templates/page-messages.js +31 -0
  76. package/dist/templates/page-messages.js.map +1 -0
  77. package/dist/templates/page-otp-entry.d.ts +3 -0
  78. package/dist/templates/page-otp-entry.d.ts.map +1 -0
  79. package/dist/templates/page-otp-entry.js +85 -0
  80. package/dist/templates/page-otp-entry.js.map +1 -0
  81. package/dist/templates/page-otp-request.d.ts +3 -0
  82. package/dist/templates/page-otp-request.d.ts.map +1 -0
  83. package/dist/templates/page-otp-request.js +70 -0
  84. package/dist/templates/page-otp-request.js.map +1 -0
  85. package/dist/templates/page-profile.d.ts +3 -0
  86. package/dist/templates/page-profile.d.ts.map +1 -0
  87. package/dist/templates/page-profile.js +68 -0
  88. package/dist/templates/page-profile.js.map +1 -0
  89. package/dist/templates/page-search.d.ts +3 -0
  90. package/dist/templates/page-search.d.ts.map +1 -0
  91. package/dist/templates/page-search.js +74 -0
  92. package/dist/templates/page-search.js.map +1 -0
  93. package/dist/templates/page-settings.d.ts +3 -0
  94. package/dist/templates/page-settings.d.ts.map +1 -0
  95. package/dist/templates/page-settings.js +76 -0
  96. package/dist/templates/page-settings.js.map +1 -0
  97. package/dist/templates/page-wallet.d.ts +3 -0
  98. package/dist/templates/page-wallet.d.ts.map +1 -0
  99. package/dist/templates/page-wallet.js +44 -0
  100. package/dist/templates/page-wallet.js.map +1 -0
  101. package/package.json +1 -1
  102. package/dist/templates/page-remaining.d.ts +0 -3
  103. package/dist/templates/page-remaining.d.ts.map +0 -1
  104. package/dist/templates/page-remaining.js +0 -870
  105. package/dist/templates/page-remaining.js.map +0 -1
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-map.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateMapPage = generateMapPage;
5
+ function generateMapPage(page) {
6
+ const routePath = page.slug.replace(/^\//, '');
7
+ const lines = [];
8
+ lines.push(`// GENERATED BY UNDERPEAKS CODEGEN v1.0.0`);
9
+ lines.push(`// Page: ${page.name} — map`);
10
+ lines.push(`// Presentation layer — generated once, you own this file.`);
11
+ lines.push(`// Regenerate: nxf generate nextjs --include-views`);
12
+ lines.push(``);
13
+ lines.push(`export default function MapPage() {`);
14
+ lines.push(` return (`);
15
+ lines.push(` <div className="container mx-auto px-4 py-8">`);
16
+ lines.push(` <h1 className="text-2xl font-bold mb-6">Map</h1>`);
17
+ lines.push(` <div className="bg-gray-100 rounded-xl h-96 flex items-center justify-center">`);
18
+ lines.push(` <div className="text-center text-gray-400">`);
19
+ lines.push(` <div className="text-5xl mb-3">🗺️</div>`);
20
+ lines.push(` <p className="font-medium">Map placeholder</p>`);
21
+ lines.push(` <p className="text-sm mt-1">Add @react-google-maps/api or mapbox-gl to implement.</p>`);
22
+ lines.push(` </div>`);
23
+ lines.push(` </div>`);
24
+ lines.push(` </div>`);
25
+ lines.push(` )`);
26
+ lines.push(`}`);
27
+ return {
28
+ path: `app/(presentation)/${routePath}/page.tsx`,
29
+ content: lines.join('\n'),
30
+ category: 'customizable',
31
+ };
32
+ }
33
+ //# sourceMappingURL=page-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-map.js","sourceRoot":"","sources":["../../src/templates/page-map.ts"],"names":[],"mappings":";AAAA,+EAA+E;;AAI/E,0CA8BC;AA9BD,SAAgB,eAAe,CAAC,IAAa;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAE9C,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA;IACvD,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAA;IACzC,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;IACxE,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAA;IAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;IACjD,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACxB,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAA;IAC/D,KAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAA;IACpE,KAAK,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAA;IAClG,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAA;IACjE,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAA;IAChE,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAA;IACtE,KAAK,CAAC,IAAI,CAAC,iGAAiG,CAAC,CAAA;IAC7G,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAC5B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEf,OAAO;QACL,IAAI,EAAM,sBAAsB,SAAS,WAAW;QACpD,OAAO,EAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,QAAQ,EAAE,cAAc;KACzB,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateMessagesPage(page: PageDef): GeneratedFile;
3
+ //# sourceMappingURL=page-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-messages.d.ts","sourceRoot":"","sources":["../../src/templates/page-messages.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAExE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CA4BjE"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-messages.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateMessagesPage = generateMessagesPage;
5
+ function generateMessagesPage(page) {
6
+ const routePath = page.slug.replace(/^\//, '');
7
+ const lines = [];
8
+ lines.push(`// GENERATED BY UNDERPEAKS CODEGEN v1.0.0`);
9
+ lines.push(`// Page: ${page.name} — messages`);
10
+ lines.push(`// Presentation layer — generated once, you own this file.`);
11
+ lines.push(`// Regenerate: nxf generate nextjs --include-views`);
12
+ lines.push(``);
13
+ lines.push(`export default function MessagesPage() {`);
14
+ lines.push(` return (`);
15
+ lines.push(` <div className="container mx-auto px-4 py-8 max-w-2xl">`);
16
+ lines.push(` <h1 className="text-2xl font-bold mb-6">Messages</h1>`);
17
+ lines.push(` <div className="bg-white border border-gray-200 rounded-xl p-8 text-center">`);
18
+ lines.push(` <div className="text-5xl mb-4">💬</div>`);
19
+ lines.push(` <p className="text-gray-500">No messages yet</p>`);
20
+ lines.push(` <p className="text-sm text-gray-400 mt-1">Start a conversation to see messages here.</p>`);
21
+ lines.push(` </div>`);
22
+ lines.push(` </div>`);
23
+ lines.push(` )`);
24
+ lines.push(`}`);
25
+ return {
26
+ path: `app/(presentation)/${routePath}/page.tsx`,
27
+ content: lines.join('\n'),
28
+ category: 'customizable',
29
+ };
30
+ }
31
+ //# sourceMappingURL=page-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-messages.js","sourceRoot":"","sources":["../../src/templates/page-messages.ts"],"names":[],"mappings":";AAAA,oFAAoF;;AAIpF,oDA4BC;AA5BD,SAAgB,oBAAoB,CAAC,IAAa;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAE9C,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA;IACvD,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,aAAa,CAAC,CAAA;IAC9C,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;IACxE,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAA;IAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;IACtD,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACxB,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;IACzE,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;IACzE,KAAK,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAA;IAChG,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;IAC7D,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAA;IACtE,KAAK,CAAC,IAAI,CAAC,kGAAkG,CAAC,CAAA;IAC9G,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEf,OAAO;QACL,IAAI,EAAM,sBAAsB,SAAS,WAAW;QACpD,OAAO,EAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,QAAQ,EAAE,cAAc;KACzB,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateOtpEntryPage(page: PageDef): GeneratedFile;
3
+ //# sourceMappingURL=page-otp-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-otp-entry.d.ts","sourceRoot":"","sources":["../../src/templates/page-otp-entry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAExE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAkFjE"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-otp-entry.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateOtpEntryPage = generateOtpEntryPage;
5
+ function generateOtpEntryPage(page) {
6
+ const routePath = page.slug.replace(/^\//, '');
7
+ const lines = [];
8
+ lines.push(`// GENERATED BY UNDERPEAKS CODEGEN v1.0.0`);
9
+ lines.push(`// Page: ${page.name} — otp_entry`);
10
+ lines.push(`// Presentation layer — generated once, you own this file.`);
11
+ lines.push(`// Regenerate: nxf generate nextjs --include-views`);
12
+ lines.push(``);
13
+ lines.push(`'use client'`);
14
+ lines.push(`import { useState, useRef } from 'react'`);
15
+ lines.push(`import { useRouter,`);
16
+ lines.push(` useSearchParams } from 'next/navigation'`);
17
+ lines.push(``);
18
+ lines.push(`export default function OtpEntryPage() {`);
19
+ lines.push(` const router = useRouter()`);
20
+ lines.push(` const searchParams = useSearchParams()`);
21
+ lines.push(` const phone = searchParams.get('phone') ?? ''`);
22
+ lines.push(` const [otp, setOtp] = useState(Array(6).fill(''))`);
23
+ lines.push(` const [loading, setLoading] = useState(false)`);
24
+ lines.push(` const [error, setError] = useState<string | null>(null)`);
25
+ lines.push(` const inputRefs = Array.from({ length: 6 }, () => useRef<HTMLInputElement>(null))`);
26
+ lines.push(``);
27
+ lines.push(` function handleChange(i: number, value: string) {`);
28
+ lines.push(` if (!/^[0-9]?$/.test(value)) return`);
29
+ lines.push(` const next = [...otp]`);
30
+ lines.push(` next[i] = value`);
31
+ lines.push(` setOtp(next)`);
32
+ lines.push(` if (value && i < 5) inputRefs[i + 1].current?.focus()`);
33
+ lines.push(` if (!value && i > 0) inputRefs[i - 1].current?.focus()`);
34
+ lines.push(` if (next.every((d) => d !== '') && i === 5) verify(next.join(''))`);
35
+ lines.push(` }`);
36
+ lines.push(``);
37
+ lines.push(` async function verify(code: string) {`);
38
+ lines.push(` setLoading(true)`);
39
+ lines.push(` setError(null)`);
40
+ lines.push(` try {`);
41
+ lines.push(` const res = await fetch('/api/auth/otp/verify', {`);
42
+ lines.push(` method: 'POST',`);
43
+ lines.push(` headers: { 'Content-Type': 'application/json' },`);
44
+ lines.push(` body: JSON.stringify({ phone, otp: code }),`);
45
+ lines.push(` })`);
46
+ lines.push(` if (!res.ok) throw new Error('Invalid OTP')`);
47
+ lines.push(` router.push('/')`);
48
+ lines.push(` } catch (err: any) {`);
49
+ lines.push(` setError(err.message)`);
50
+ lines.push(` setOtp(Array(6).fill(''))`);
51
+ lines.push(` inputRefs[0].current?.focus()`);
52
+ lines.push(` } finally {`);
53
+ lines.push(` setLoading(false)`);
54
+ lines.push(` }`);
55
+ lines.push(` }`);
56
+ lines.push(``);
57
+ lines.push(` return (`);
58
+ lines.push(` <div className="min-h-screen flex items-center justify-center bg-gray-50 px-4">`);
59
+ lines.push(` <div className="w-full max-w-sm text-center">`);
60
+ lines.push(` <div className="text-5xl mb-4">🔒</div>`);
61
+ lines.push(` <h1 className="text-2xl font-bold mb-2">Verification Code</h1>`);
62
+ lines.push(` <p className="text-gray-500 mb-8 text-sm">Enter the 6-digit code sent to {phone}</p>`);
63
+ lines.push(` <div className="flex justify-center gap-2 mb-6">`);
64
+ lines.push(` {otp.map((digit, i) => (`);
65
+ lines.push(` <input key={i} ref={inputRefs[i]} type="text" inputMode="numeric"`);
66
+ lines.push(` value={digit} onChange={(e) => handleChange(i, e.target.value)} maxLength={1}`);
67
+ lines.push(` className="w-12 h-14 text-center text-xl font-bold border border-gray-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-black" />`);
68
+ lines.push(` ))}`);
69
+ lines.push(` </div>`);
70
+ lines.push(` {error && <p className="text-sm text-red-500 mb-4">{error}</p>}`);
71
+ lines.push(` <button onClick={() => verify(otp.join(''))} disabled={loading || otp.some((d) => !d)}`);
72
+ lines.push(` className="w-full py-2.5 bg-black text-white rounded-lg text-sm font-medium hover:bg-gray-800 disabled:opacity-40 transition">`);
73
+ lines.push(` {loading ? 'Verifying...' : 'Verify'}`);
74
+ lines.push(` </button>`);
75
+ lines.push(` </div>`);
76
+ lines.push(` </div>`);
77
+ lines.push(` )`);
78
+ lines.push(`}`);
79
+ return {
80
+ path: `app/(presentation)/${routePath}/page.tsx`,
81
+ content: lines.join('\n'),
82
+ category: 'customizable',
83
+ };
84
+ }
85
+ //# sourceMappingURL=page-otp-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-otp-entry.js","sourceRoot":"","sources":["../../src/templates/page-otp-entry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateOtpRequestPage(page: PageDef): GeneratedFile;
3
+ //# sourceMappingURL=page-otp-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-otp-request.d.ts","sourceRoot":"","sources":["../../src/templates/page-otp-request.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAExE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAmEnE"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-otp-request.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateOtpRequestPage = generateOtpRequestPage;
5
+ function generateOtpRequestPage(page) {
6
+ const routePath = page.slug.replace(/^\//, '');
7
+ const lines = [];
8
+ lines.push(`// GENERATED BY UNDERPEAKS CODEGEN v1.0.0`);
9
+ lines.push(`// Page: ${page.name} — otp_request`);
10
+ lines.push(`// Presentation layer — generated once, you own this file.`);
11
+ lines.push(`// Regenerate: nxf generate nextjs --include-views`);
12
+ lines.push(``);
13
+ lines.push(`'use client'`);
14
+ lines.push(`import { useState } from 'react'`);
15
+ lines.push(`import { useRouter } from 'next/navigation'`);
16
+ lines.push(``);
17
+ lines.push(`export default function OtpRequestPage() {`);
18
+ lines.push(` const router = useRouter()`);
19
+ lines.push(` const [phone, setPhone] = useState('')`);
20
+ lines.push(` const [loading, setLoading] = useState(false)`);
21
+ lines.push(` const [error, setError] = useState<string | null>(null)`);
22
+ lines.push(``);
23
+ lines.push(` async function handleSubmit(e: React.FormEvent) {`);
24
+ lines.push(` e.preventDefault()`);
25
+ lines.push(` setLoading(true)`);
26
+ lines.push(` setError(null)`);
27
+ lines.push(` try {`);
28
+ lines.push(` const res = await fetch('/api/auth/otp/request', {`);
29
+ lines.push(` method: 'POST',`);
30
+ lines.push(` headers: { 'Content-Type': 'application/json' },`);
31
+ lines.push(` body: JSON.stringify({ phone }),`);
32
+ lines.push(` })`);
33
+ lines.push(` if (!res.ok) throw new Error('Failed to send OTP')`);
34
+ lines.push(` router.push(\`/otp-entry?phone=\${encodeURIComponent(phone)}\`)`);
35
+ lines.push(` } catch (err: any) {`);
36
+ lines.push(` setError(err.message)`);
37
+ lines.push(` } finally {`);
38
+ lines.push(` setLoading(false)`);
39
+ lines.push(` }`);
40
+ lines.push(` }`);
41
+ lines.push(``);
42
+ lines.push(` return (`);
43
+ lines.push(` <div className="min-h-screen flex items-center justify-center bg-gray-50 px-4">`);
44
+ lines.push(` <div className="w-full max-w-sm text-center">`);
45
+ lines.push(` <div className="text-5xl mb-4">📱</div>`);
46
+ lines.push(` <h1 className="text-2xl font-bold mb-2">Verify Phone</h1>`);
47
+ lines.push(` <p className="text-gray-500 mb-8 text-sm">We will send you a one-time verification code.</p>`);
48
+ lines.push(` <form onSubmit={handleSubmit} className="bg-white border border-gray-200 rounded-xl p-6 flex flex-col gap-4 text-left">`);
49
+ lines.push(` <div className="flex flex-col gap-1">`);
50
+ lines.push(` <label className="text-sm font-medium text-gray-700">Phone Number</label>`);
51
+ lines.push(` <input type="tel" value={phone} onChange={(e) => setPhone(e.target.value)} required`);
52
+ lines.push(` className="px-3 py-2 border border-gray-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-black" />`);
53
+ lines.push(` </div>`);
54
+ lines.push(` {error && <p className="text-sm text-red-500">{error}</p>}`);
55
+ lines.push(` <button type="submit" disabled={loading}`);
56
+ lines.push(` className="py-2.5 bg-black text-white rounded-lg text-sm font-medium hover:bg-gray-800 disabled:opacity-40 transition">`);
57
+ lines.push(` {loading ? 'Sending...' : 'Send OTP'}`);
58
+ lines.push(` </button>`);
59
+ lines.push(` </form>`);
60
+ lines.push(` </div>`);
61
+ lines.push(` </div>`);
62
+ lines.push(` )`);
63
+ lines.push(`}`);
64
+ return {
65
+ path: `app/(presentation)/${routePath}/page.tsx`,
66
+ content: lines.join('\n'),
67
+ category: 'customizable',
68
+ };
69
+ }
70
+ //# sourceMappingURL=page-otp-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-otp-request.js","sourceRoot":"","sources":["../../src/templates/page-otp-request.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Model, PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateProfilePage(page: PageDef, model?: Model): GeneratedFile;
3
+ //# sourceMappingURL=page-profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-profile.d.ts","sourceRoot":"","sources":["../../src/templates/page-profile.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG/E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,aAAa,CAgE/E"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-profile.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateProfilePage = generateProfilePage;
5
+ const generator_core_1 = require("@underpeaks/generator-core");
6
+ function generateProfilePage(page, model) {
7
+ const routePath = page.slug.replace(/^\//, '');
8
+ const className = model ? (0, generator_core_1.modelToClassName)(model.name) : 'Item';
9
+ const fileName = model ? (0, generator_core_1.modelToFileName)(model.name) : 'item';
10
+ const pk = model ? (0, generator_core_1.getPrimaryKey)(model) : null;
11
+ const pkName = pk?.name ?? 'id';
12
+ const columns = model ? (0, generator_core_1.getVisibleColumns)(model) : [];
13
+ const lines = [];
14
+ lines.push(`// GENERATED BY UNDERPEAKS CODEGEN v1.0.0`);
15
+ lines.push(`// Page: ${page.name} — profile`);
16
+ lines.push(`// Presentation layer — generated once, you own this file.`);
17
+ lines.push(`// Regenerate: nxf generate nextjs --include-views`);
18
+ lines.push(``);
19
+ lines.push(`import type { ${className} } from '../../../../generated/types/${fileName}.types'`);
20
+ lines.push(`import { notFound } from 'next/navigation'`);
21
+ lines.push(`import Link from 'next/link'`);
22
+ lines.push(``);
23
+ lines.push(`async function getItem(id: string): Promise<${className} | null> {`);
24
+ lines.push(` const res = await fetch(\`\${process.env.NEXT_PUBLIC_APP_URL}/api/${fileName}/\${id}\`, { cache: 'no-store' })`);
25
+ lines.push(` if (res.status === 404) return null`);
26
+ lines.push(` const json = await res.json()`);
27
+ lines.push(` return json.data`);
28
+ lines.push(`}`);
29
+ lines.push(``);
30
+ lines.push(`interface Props { params: Promise<{ ${pkName}: string }> }`);
31
+ lines.push(``);
32
+ lines.push(`export default async function ProfilePage({ params }: Props) {`);
33
+ lines.push(` const { ${pkName} } = await params`);
34
+ lines.push(` const item = await getItem(${pkName})`);
35
+ lines.push(` if (!item) notFound()`);
36
+ lines.push(` return (`);
37
+ lines.push(` <div className="container mx-auto px-4 py-8 max-w-2xl">`);
38
+ lines.push(` <div className="bg-white border border-gray-200 rounded-xl overflow-hidden">`);
39
+ lines.push(` <div className="h-32 bg-gray-100" />`);
40
+ lines.push(` <div className="px-6 pb-6">`);
41
+ lines.push(` <div className="-mt-12 mb-4">`);
42
+ lines.push(` <div className="w-24 h-24 rounded-full bg-gray-200 border-4 border-white flex items-center justify-center text-3xl">👤</div>`);
43
+ lines.push(` </div>`);
44
+ for (const col of columns) {
45
+ const label = col.name.replaceAll('_', ' ');
46
+ lines.push(` <div className="flex items-center justify-between py-3 border-b border-gray-100">`);
47
+ lines.push(` <span className="text-sm text-gray-500 capitalize">${label}</span>`);
48
+ lines.push(` <span className="text-sm font-medium">{item.${col.name}?.toString() ?? '—'}</span>`);
49
+ lines.push(` </div>`);
50
+ }
51
+ lines.push(` <div className="mt-4">`);
52
+ lines.push(` <Link href={\`/${routePath}/\${item.${pkName}}/edit\`}`);
53
+ lines.push(` className="px-4 py-2 border border-gray-200 rounded-lg text-sm font-medium hover:bg-gray-50 transition">`);
54
+ lines.push(` Edit Profile`);
55
+ lines.push(` </Link>`);
56
+ lines.push(` </div>`);
57
+ lines.push(` </div>`);
58
+ lines.push(` </div>`);
59
+ lines.push(` </div>`);
60
+ lines.push(` )`);
61
+ lines.push(`}`);
62
+ return {
63
+ path: `app/(presentation)/${routePath}/[${pkName}]/page.tsx`,
64
+ content: lines.join('\n'),
65
+ category: 'customizable',
66
+ };
67
+ }
68
+ //# sourceMappingURL=page-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-profile.js","sourceRoot":"","sources":["../../src/templates/page-profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Model, PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateSearchPage(page: PageDef, model?: Model): GeneratedFile;
3
+ //# sourceMappingURL=page-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-search.d.ts","sourceRoot":"","sources":["../../src/templates/page-search.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG/E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,aAAa,CAsE9E"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-search.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateSearchPage = generateSearchPage;
5
+ const generator_core_1 = require("@underpeaks/generator-core");
6
+ function generateSearchPage(page, model) {
7
+ const routePath = page.slug.replace(/^\//, '');
8
+ const className = model ? (0, generator_core_1.modelToClassName)(model.name) : 'Item';
9
+ const fileName = model ? (0, generator_core_1.modelToFileName)(model.name) : 'item';
10
+ const pk = model ? (0, generator_core_1.getPrimaryKey)(model) : null;
11
+ const pkName = pk?.name ?? 'id';
12
+ const columns = model ? (0, generator_core_1.getVisibleColumns)(model) : [];
13
+ const titleField = columns.find((c) => c.name.includes('name') || c.name.includes('title'))?.name ?? columns[0]?.name ?? pkName;
14
+ const modelSlug = model ? model.name.replace('nxf_', '').replace(/_/g, '-') : fileName;
15
+ const lines = [];
16
+ lines.push(`// GENERATED BY UNDERPEAKS CODEGEN v1.0.0`);
17
+ lines.push(`// Page: ${page.name} — search`);
18
+ lines.push(`// Presentation layer — generated once, you own this file.`);
19
+ lines.push(`// Regenerate: nxf generate nextjs --include-views`);
20
+ lines.push(``);
21
+ lines.push(`'use client'`);
22
+ lines.push(`import { useState } from 'react'`);
23
+ lines.push(`import Link from 'next/link'`);
24
+ lines.push(`import type { ${className} } from '../../../generated/types/${fileName}.types'`);
25
+ lines.push(``);
26
+ lines.push(`export default function SearchPage() {`);
27
+ lines.push(` const [query, setQuery] = useState('')`);
28
+ lines.push(` const [results, setResults] = useState<${className}[]>([])`);
29
+ lines.push(` const [loading, setLoading] = useState(false)`);
30
+ lines.push(``);
31
+ lines.push(` async function search(q: string) {`);
32
+ lines.push(` setQuery(q)`);
33
+ lines.push(` if (!q.trim()) { setResults([]); return }`);
34
+ lines.push(` setLoading(true)`);
35
+ lines.push(` try {`);
36
+ lines.push(` const res = await fetch(\`/api/${modelSlug}?search=\${encodeURIComponent(q)}\`)`);
37
+ lines.push(` const json = await res.json()`);
38
+ lines.push(` setResults(json.data ?? [])`);
39
+ lines.push(` } finally {`);
40
+ lines.push(` setLoading(false)`);
41
+ lines.push(` }`);
42
+ lines.push(` }`);
43
+ lines.push(``);
44
+ lines.push(` return (`);
45
+ lines.push(` <div className="container mx-auto px-4 py-8 max-w-2xl">`);
46
+ lines.push(` <div className="flex items-center gap-3 bg-white border border-gray-200 rounded-xl px-4 py-3 mb-6">`);
47
+ lines.push(` <span className="text-gray-400">🔍</span>`);
48
+ lines.push(` <input value={query} onChange={(e) => search(e.target.value)} placeholder="Search..."`);
49
+ lines.push(` className="flex-1 text-sm focus:outline-none" autoFocus />`);
50
+ lines.push(` {query && <button onClick={() => { setQuery(''); setResults([]) }} className="text-gray-400 hover:text-gray-600">✕</button>}`);
51
+ lines.push(` </div>`);
52
+ lines.push(` {loading && <p className="text-center text-gray-400 text-sm">Searching...</p>}`);
53
+ lines.push(` {!loading && query && results.length === 0 && (`);
54
+ lines.push(` <p className="text-center text-gray-400 text-sm">No results for &quot;{query}&quot;</p>`);
55
+ lines.push(` )}`);
56
+ lines.push(` <div className="flex flex-col gap-2">`);
57
+ lines.push(` {results.map((item) => (`);
58
+ lines.push(` <Link key={item.${pkName}} href={\`/${routePath}/\${item.${pkName}}\`}`);
59
+ lines.push(` className="flex items-center justify-between px-4 py-3 bg-white border border-gray-200 rounded-xl hover:border-gray-400 transition">`);
60
+ lines.push(` <span className="text-sm font-medium">{item.${titleField}?.toString() ?? '—'}</span>`);
61
+ lines.push(` <span className="text-gray-400">›</span>`);
62
+ lines.push(` </Link>`);
63
+ lines.push(` ))}`);
64
+ lines.push(` </div>`);
65
+ lines.push(` </div>`);
66
+ lines.push(` )`);
67
+ lines.push(`}`);
68
+ return {
69
+ path: `app/(presentation)/${routePath}/page.tsx`,
70
+ content: lines.join('\n'),
71
+ category: 'customizable',
72
+ };
73
+ }
74
+ //# sourceMappingURL=page-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-search.js","sourceRoot":"","sources":["../../src/templates/page-search.ts"],"names":[],"mappings":";AAAA,kFAAkF;;AAKlF,gDAsEC;AAxED,+DAAgH;AAEhH,SAAgB,kBAAkB,CAAC,IAAa,EAAE,KAAa;IAC7D,MAAM,SAAS,GAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAC/C,MAAM,SAAS,GAAI,KAAK,CAAC,CAAC,CAAC,IAAA,iCAAgB,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAChE,MAAM,QAAQ,GAAK,KAAK,CAAC,CAAC,CAAC,IAAA,gCAAe,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAC/D,MAAM,EAAE,GAAW,KAAK,CAAC,CAAC,CAAC,IAAA,8BAAa,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACtD,MAAM,MAAM,GAAO,EAAE,EAAE,IAAI,IAAI,IAAI,CAAA;IACnC,MAAM,OAAO,GAAM,KAAK,CAAC,CAAC,CAAC,IAAA,kCAAiB,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,MAAM,CAAA;IAC/H,MAAM,SAAS,GAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;IAEvF,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA;IACvD,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,WAAW,CAAC,CAAA;IAC5C,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;IACxE,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAA;IAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;IAC9C,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;IAClD,KAAK,CAAC,IAAI,CAAC,iBAAiB,SAAS,qCAAqC,QAAQ,SAAS,CAAC,CAAA;IAC5F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAA;IACpD,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAA;IAC1D,KAAK,CAAC,IAAI,CAAC,4CAA4C,SAAS,SAAS,CAAC,CAAA;IAC1E,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;IAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;IAClD,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC7B,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAA;IAC3D,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;IAClC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACvB,KAAK,CAAC,IAAI,CAAC,wCAAwC,SAAS,sCAAsC,CAAC,CAAA;IACnG,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;IACjD,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;IAC/C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC7B,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;IACrC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACnB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACxB,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;IACzE,KAAK,CAAC,IAAI,CAAC,2GAA2G,CAAC,CAAA;IACvH,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAA;IAC/D,KAAK,CAAC,IAAI,CAAC,+FAA+F,CAAC,CAAA;IAC3G,KAAK,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAA;IAClF,KAAK,CAAC,IAAI,CAAC,sIAAsI,CAAC,CAAA;IAClJ,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAA;IAClG,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAA;IACnE,KAAK,CAAC,IAAI,CAAC,iGAAiG,CAAC,CAAA;IAC7G,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACtB,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAA;IACzD,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;IAC9C,KAAK,CAAC,IAAI,CAAC,6BAA6B,MAAM,cAAc,SAAS,YAAY,MAAM,MAAM,CAAC,CAAA;IAC9F,KAAK,CAAC,IAAI,CAAC,kJAAkJ,CAAC,CAAA;IAC9J,KAAK,CAAC,IAAI,CAAC,2DAA2D,UAAU,6BAA6B,CAAC,CAAA;IAC9G,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAA;IAClE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAC/B,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACzB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEf,OAAO;QACL,IAAI,EAAM,sBAAsB,SAAS,WAAW;QACpD,OAAO,EAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,QAAQ,EAAE,cAAc;KACzB,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateSettingsPage(page: PageDef): GeneratedFile;
3
+ //# sourceMappingURL=page-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-settings.d.ts","sourceRoot":"","sources":["../../src/templates/page-settings.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAExE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAyEjE"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-settings.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateSettingsPage = generateSettingsPage;
5
+ function generateSettingsPage(page) {
6
+ const routePath = page.slug.replace(/^\//, '');
7
+ const lines = [];
8
+ lines.push(`// GENERATED BY UNDERPEAKS CODEGEN v1.0.0`);
9
+ lines.push(`// Page: ${page.name} — settings`);
10
+ lines.push(`// Presentation layer — generated once, you own this file.`);
11
+ lines.push(`// Regenerate: nxf generate nextjs --include-views`);
12
+ lines.push(``);
13
+ lines.push(`'use client'`);
14
+ lines.push(`import { useState } from 'react'`);
15
+ lines.push(``);
16
+ lines.push(`export default function SettingsPage() {`);
17
+ lines.push(` const [notifications, setNotifications] = useState(true)`);
18
+ lines.push(` const [darkMode, setDarkMode] = useState(false)`);
19
+ lines.push(``);
20
+ lines.push(` return (`);
21
+ lines.push(` <div className="container mx-auto px-4 py-8 max-w-2xl">`);
22
+ lines.push(` <h1 className="text-2xl font-bold mb-6">Settings</h1>`);
23
+ lines.push(` <div className="flex flex-col gap-4">`);
24
+ lines.push(``);
25
+ lines.push(` <div className="bg-white border border-gray-200 rounded-xl overflow-hidden">`);
26
+ lines.push(` <div className="px-6 py-3 bg-gray-50 border-b border-gray-100">`);
27
+ lines.push(` <p className="text-xs font-semibold text-gray-500 uppercase tracking-wider">Account</p>`);
28
+ lines.push(` </div>`);
29
+ lines.push(` <div className="divide-y divide-gray-100">`);
30
+ lines.push(` <div className="flex items-center justify-between px-6 py-4 hover:bg-gray-50 cursor-pointer">`);
31
+ lines.push(` <span className="text-sm">Profile</span>`);
32
+ lines.push(` <span className="text-gray-400">›</span>`);
33
+ lines.push(` </div>`);
34
+ lines.push(` <div className="flex items-center justify-between px-6 py-4 hover:bg-gray-50 cursor-pointer">`);
35
+ lines.push(` <span className="text-sm">Change Password</span>`);
36
+ lines.push(` <span className="text-gray-400">›</span>`);
37
+ lines.push(` </div>`);
38
+ lines.push(` </div>`);
39
+ lines.push(` </div>`);
40
+ lines.push(``);
41
+ lines.push(` <div className="bg-white border border-gray-200 rounded-xl overflow-hidden">`);
42
+ lines.push(` <div className="px-6 py-3 bg-gray-50 border-b border-gray-100">`);
43
+ lines.push(` <p className="text-xs font-semibold text-gray-500 uppercase tracking-wider">Preferences</p>`);
44
+ lines.push(` </div>`);
45
+ lines.push(` <div className="divide-y divide-gray-100">`);
46
+ lines.push(` <div className="flex items-center justify-between px-6 py-4">`);
47
+ lines.push(` <span className="text-sm">Notifications</span>`);
48
+ lines.push(` <button onClick={() => setNotifications((v) => !v)}`);
49
+ lines.push(` className={\`w-10 h-6 rounded-full transition-colors \${notifications ? 'bg-black' : 'bg-gray-200'}\`}>`);
50
+ lines.push(` <span className={\`block w-4 h-4 bg-white rounded-full shadow transition-transform mx-1 \${notifications ? 'translate-x-4' : 'translate-x-0'}\`} />`);
51
+ lines.push(` </button>`);
52
+ lines.push(` </div>`);
53
+ lines.push(` <div className="flex items-center justify-between px-6 py-4">`);
54
+ lines.push(` <span className="text-sm">Dark Mode</span>`);
55
+ lines.push(` <button onClick={() => setDarkMode((v) => !v)}`);
56
+ lines.push(` className={\`w-10 h-6 rounded-full transition-colors \${darkMode ? 'bg-black' : 'bg-gray-200'}\`}>`);
57
+ lines.push(` <span className={\`block w-4 h-4 bg-white rounded-full shadow transition-transform mx-1 \${darkMode ? 'translate-x-4' : 'translate-x-0'}\`} />`);
58
+ lines.push(` </button>`);
59
+ lines.push(` </div>`);
60
+ lines.push(` </div>`);
61
+ lines.push(` </div>`);
62
+ lines.push(``);
63
+ lines.push(` <button className="w-full py-3 border border-red-200 text-red-500 rounded-xl text-sm font-medium hover:bg-red-50 transition">`);
64
+ lines.push(` Sign Out`);
65
+ lines.push(` </button>`);
66
+ lines.push(` </div>`);
67
+ lines.push(` </div>`);
68
+ lines.push(` )`);
69
+ lines.push(`}`);
70
+ return {
71
+ path: `app/(presentation)/${routePath}/page.tsx`,
72
+ content: lines.join('\n'),
73
+ category: 'customizable',
74
+ };
75
+ }
76
+ //# sourceMappingURL=page-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-settings.js","sourceRoot":"","sources":["../../src/templates/page-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateWalletPage(page: PageDef): GeneratedFile;
3
+ //# sourceMappingURL=page-wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-wallet.d.ts","sourceRoot":"","sources":["../../src/templates/page-wallet.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAExE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAyC/D"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-wallet.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateWalletPage = generateWalletPage;
5
+ function generateWalletPage(page) {
6
+ const routePath = page.slug.replace(/^\//, '');
7
+ const lines = [];
8
+ lines.push(`// GENERATED BY UNDERPEAKS CODEGEN v1.0.0`);
9
+ lines.push(`// Page: ${page.name} — wallet`);
10
+ lines.push(`// Presentation layer — generated once, you own this file.`);
11
+ lines.push(`// Regenerate: nxf generate nextjs --include-views`);
12
+ lines.push(``);
13
+ lines.push(`export default function WalletPage() {`);
14
+ lines.push(` return (`);
15
+ lines.push(` <div className="container mx-auto px-4 py-8 max-w-lg">`);
16
+ lines.push(` <h1 className="text-2xl font-bold mb-6">Wallet</h1>`);
17
+ lines.push(` <div className="bg-black text-white rounded-2xl p-8 mb-6">`);
18
+ lines.push(` <p className="text-sm text-gray-300">Available Balance</p>`);
19
+ lines.push(` <p className="text-4xl font-bold mt-1">$0.00</p>`);
20
+ lines.push(` <div className="flex gap-4 mt-6">`);
21
+ lines.push(` {['Add', 'Send', 'History'].map((action) => (`);
22
+ lines.push(` <button key={action} className="flex flex-col items-center gap-1">`);
23
+ lines.push(` <div className="w-10 h-10 rounded-full bg-white/20 flex items-center justify-center">`);
24
+ lines.push(` {action === 'Add' ? '+' : action === 'Send' ? '↑' : '≡'}`);
25
+ lines.push(` </div>`);
26
+ lines.push(` <span className="text-xs text-gray-300">{action}</span>`);
27
+ lines.push(` </button>`);
28
+ lines.push(` ))}`);
29
+ lines.push(` </div>`);
30
+ lines.push(` </div>`);
31
+ lines.push(` <div className="bg-white border border-gray-200 rounded-xl p-6">`);
32
+ lines.push(` <h2 className="font-semibold mb-4">Recent Transactions</h2>`);
33
+ lines.push(` <p className="text-sm text-gray-400 text-center py-8">No transactions yet.</p>`);
34
+ lines.push(` </div>`);
35
+ lines.push(` </div>`);
36
+ lines.push(` )`);
37
+ lines.push(`}`);
38
+ return {
39
+ path: `app/(presentation)/${routePath}/page.tsx`,
40
+ content: lines.join('\n'),
41
+ category: 'customizable',
42
+ };
43
+ }
44
+ //# sourceMappingURL=page-wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-wallet.js","sourceRoot":"","sources":["../../src/templates/page-wallet.ts"],"names":[],"mappings":";AAAA,kFAAkF;;AAIlF,gDAyCC;AAzCD,SAAgB,kBAAkB,CAAC,IAAa;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAE9C,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA;IACvD,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,WAAW,CAAC,CAAA;IAC5C,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;IACxE,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAA;IAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAA;IACpD,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACxB,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;IACxE,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAA;IACvE,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAA;IAC9E,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAA;IAChF,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAA;IACtE,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA;IACvD,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAA;IACrE,KAAK,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAA;IAC5F,KAAK,CAAC,IAAI,CAAC,qGAAqG,CAAC,CAAA;IACjH,KAAK,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAA;IACtF,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;IAClC,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAA;IACnF,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;IACnC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC3B,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAC5B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAA;IACpF,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAA;IACjF,KAAK,CAAC,IAAI,CAAC,wFAAwF,CAAC,CAAA;IACpG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEf,OAAO;QACL,IAAI,EAAM,sBAAsB,SAAS,WAAW;QACpD,OAAO,EAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,QAAQ,EAAE,cAAc;KACzB,CAAA;AACH,CAAC"}