create-nymbal-app 0.3.0 → 0.5.0

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 (167) hide show
  1. package/dist/index.d.ts +2 -1
  2. package/dist/index.js +14 -12
  3. package/dist/index.js.map +1 -1
  4. package/package.json +5 -4
  5. package/scaffold/project/astro/src/pages/index.astro +13 -15
  6. package/scaffold/templates/astro/_dot.node-version +1 -1
  7. package/scaffold/templates/astro/astro.config.mjs +23 -0
  8. package/scaffold/templates/astro/package.json +26 -27
  9. package/scaffold/templates/astro/src/components/SkipNav.astro +3 -1
  10. package/scaffold/templates/astro/src/elements/index.ts +11 -0
  11. package/scaffold/templates/astro/src/layouts/BaseLayout.astro +15 -4
  12. package/scaffold/templates/astro/src/lib/api.ts +126 -20
  13. package/scaffold/templates/astro/src/lib/chrome.ts +59 -0
  14. package/scaffold/templates/astro/src/lib/client.ts +4 -2
  15. package/scaffold/templates/astro/src/lib/fragments.ts +48 -0
  16. package/scaffold/templates/astro/src/lib/server-elements.ts +5 -0
  17. package/scaffold/templates/astro/src/middleware.ts +37 -0
  18. package/scaffold/templates/astro/src/pages/account/addresses.astro +5 -97
  19. package/scaffold/templates/astro/src/pages/account/login.astro +7 -34
  20. package/scaffold/templates/astro/src/pages/account/profile.astro +6 -56
  21. package/scaffold/templates/astro/src/pages/account/register.astro +7 -73
  22. package/scaffold/templates/astro/src/pages/cart.astro +14 -7
  23. package/scaffold/templates/astro/src/pages/category/[slug].astro +41 -26
  24. package/scaffold/templates/astro/src/pages/checkout.astro +34 -90
  25. package/scaffold/templates/astro/src/pages/fragments/footer.astro +5 -2
  26. package/scaffold/templates/astro/src/pages/fragments/header.astro +12 -2
  27. package/scaffold/templates/astro/src/pages/fragments/nav.astro +8 -5
  28. package/scaffold/templates/astro/src/pages/fragments/product/[slug].astro +9 -10
  29. package/scaffold/templates/astro/src/pages/index.astro +18 -15
  30. package/scaffold/templates/astro/src/pages/order/[orderNumber].astro +22 -44
  31. package/scaffold/templates/astro/src/pages/product/[slug].astro +46 -29
  32. package/scaffold/templates/astro/src/pages/products/index.astro +40 -26
  33. package/scaffold/templates/astro/src/pages/search.astro +13 -8
  34. package/scaffold/templates/astro/src/scripts/init-client.ts +14 -0
  35. package/scaffold/templates/astro/src/scripts/pdp.ts +47 -53
  36. package/scaffold/templates/astro/src/scripts/plp.ts +21 -98
  37. package/scaffold/templates/astro/src/scripts/search.ts +19 -120
  38. package/scaffold/templates/astro/src/scripts/signed-in-redirect.ts +4 -0
  39. package/scaffold/templates/astro/src/styles/global.css +49 -45
  40. package/scaffold/templates/astro/src/styles/pages/account.css +0 -90
  41. package/scaffold/templates/astro/src/styles/pages/confirmation.css +6 -0
  42. package/scaffold/templates/astro/src/styles/pages/home.css +9 -100
  43. package/scaffold/templates/astro/src/styles/pages/pdp.css +5 -167
  44. package/scaffold/templates/astro/src/styles/pages/plp.css +3 -42
  45. package/scaffold/templates/astro/src/styles/pages/search.css +13 -100
  46. package/scaffold/templates/astro/src/styles/tokens.css +56 -0
  47. package/scaffold/templates/nextjs/_dot.node-version +1 -1
  48. package/scaffold/templates/nextjs/app/(catalog)/category/[slug]/page.tsx +74 -0
  49. package/scaffold/templates/nextjs/app/(catalog)/home/[key]/page.tsx +80 -0
  50. package/scaffold/templates/nextjs/app/(catalog)/layout.tsx +13 -0
  51. package/scaffold/templates/nextjs/app/(catalog)/not-found.tsx +7 -0
  52. package/scaffold/templates/nextjs/app/(catalog)/product/[slug]/page.tsx +182 -0
  53. package/scaffold/templates/nextjs/app/(catalog)/products/page.tsx +62 -0
  54. package/scaffold/templates/nextjs/app/(catalog)/search/SearchView.tsx +90 -0
  55. package/scaffold/templates/nextjs/app/(catalog)/search/page.tsx +46 -0
  56. package/scaffold/templates/nextjs/app/(shopper)/account/addresses/AddressesView.tsx +5 -0
  57. package/scaffold/templates/nextjs/app/(shopper)/account/addresses/page.tsx +17 -0
  58. package/scaffold/templates/nextjs/app/(shopper)/account/login/LoginView.tsx +28 -0
  59. package/scaffold/templates/nextjs/app/(shopper)/account/login/page.tsx +23 -0
  60. package/scaffold/templates/nextjs/app/(shopper)/account/profile/ProfileView.tsx +5 -0
  61. package/scaffold/templates/nextjs/app/(shopper)/account/profile/page.tsx +20 -0
  62. package/scaffold/templates/nextjs/app/(shopper)/account/register/RegisterView.tsx +26 -0
  63. package/scaffold/templates/nextjs/app/(shopper)/account/register/page.tsx +11 -0
  64. package/scaffold/templates/nextjs/app/(shopper)/cart/CartView.tsx +5 -0
  65. package/scaffold/templates/nextjs/app/(shopper)/cart/page.tsx +22 -0
  66. package/scaffold/templates/nextjs/app/(shopper)/checkout/CheckoutView.tsx +27 -0
  67. package/scaffold/templates/nextjs/app/(shopper)/checkout/page.tsx +39 -0
  68. package/scaffold/templates/nextjs/app/(shopper)/layout.tsx +12 -0
  69. package/scaffold/templates/nextjs/app/{order → (shopper)/order}/[orderNumber]/page.tsx +24 -5
  70. package/scaffold/templates/nextjs/app/error.tsx +3 -7
  71. package/scaffold/templates/nextjs/app/fragments/footer/route.ts +13 -0
  72. package/scaffold/templates/nextjs/app/fragments/header/[key]/route.ts +18 -0
  73. package/scaffold/templates/nextjs/app/fragments/nav/[key]/route.ts +23 -0
  74. package/scaffold/templates/nextjs/app/fragments/product/[slug]/route.ts +22 -0
  75. package/scaffold/templates/nextjs/app/globals.css +5 -23
  76. package/scaffold/templates/nextjs/app/layout.tsx +8 -5
  77. package/scaffold/templates/nextjs/app/not-found.tsx +9 -33
  78. package/scaffold/templates/nextjs/app/tokens.css +56 -0
  79. package/scaffold/templates/nextjs/components/client/ListingControls.tsx +87 -0
  80. package/scaffold/templates/nextjs/components/client/NymbalSetup.tsx +48 -6
  81. package/scaffold/templates/nextjs/components/client/ProductInteractive.tsx +64 -28
  82. package/scaffold/templates/nextjs/components/client/elements.tsx +15 -0
  83. package/scaffold/templates/nextjs/components/server/Header.tsx +33 -97
  84. package/scaffold/templates/nextjs/components/server/NotFoundView.tsx +39 -0
  85. package/scaffold/templates/nextjs/components/server/SkipNav.tsx +7 -3
  86. package/scaffold/templates/nextjs/elements/index.ts +12 -0
  87. package/scaffold/templates/nextjs/lib/api.ts +162 -46
  88. package/scaffold/templates/nextjs/lib/chrome.ts +40 -0
  89. package/scaffold/templates/nextjs/lib/client.ts +3 -0
  90. package/scaffold/templates/nextjs/lib/fragments.ts +16 -0
  91. package/scaffold/templates/nextjs/lib/header.ts +39 -0
  92. package/scaffold/templates/nextjs/lib/render.ts +14 -0
  93. package/scaffold/templates/nextjs/next.config.mjs +32 -0
  94. package/scaffold/templates/nextjs/package.json +28 -29
  95. package/scaffold/templates/nextjs/styles/pages/account.module.css +0 -70
  96. package/scaffold/templates/nextjs/styles/pages/confirmation.module.css +6 -85
  97. package/scaffold/templates/nextjs/styles/pages/home.module.css +2 -103
  98. package/scaffold/templates/nextjs/styles/pages/pdp.module.css +3 -179
  99. package/scaffold/templates/nextjs/styles/pages/plp.module.css +8 -141
  100. package/scaffold/templates/nextjs/styles/pages/search.module.css +8 -128
  101. package/scaffold/templates/nextjs/tsconfig.dist.json +5 -0
  102. package/scaffold/templates/astro/src/components/AddressForm.astro +0 -107
  103. package/scaffold/templates/astro/src/components/Breadcrumb.astro +0 -20
  104. package/scaffold/templates/astro/src/components/CategoryNav.astro +0 -27
  105. package/scaffold/templates/astro/src/components/CheckoutSteps.astro +0 -29
  106. package/scaffold/templates/astro/src/components/Footer.astro +0 -108
  107. package/scaffold/templates/astro/src/components/Header.astro +0 -192
  108. package/scaffold/templates/astro/src/components/ImageGallery.astro +0 -42
  109. package/scaffold/templates/astro/src/components/OrderSummary.astro +0 -53
  110. package/scaffold/templates/astro/src/components/Pagination.astro +0 -13
  111. package/scaffold/templates/astro/src/components/PriceDisplay.astro +0 -25
  112. package/scaffold/templates/astro/src/components/ProductCard.astro +0 -44
  113. package/scaffold/templates/astro/src/components/RelatedProducts.astro +0 -28
  114. package/scaffold/templates/astro/src/components/ReviewForm.astro +0 -74
  115. package/scaffold/templates/astro/src/components/ReviewList.astro +0 -41
  116. package/scaffold/templates/astro/src/components/SortDropdown.astro +0 -26
  117. package/scaffold/templates/astro/src/components/StockBadge.astro +0 -32
  118. package/scaffold/templates/astro/src/scripts/auth-forms.ts +0 -82
  119. package/scaffold/templates/astro/src/scripts/cart-page.ts +0 -143
  120. package/scaffold/templates/astro/src/scripts/checkout.ts +0 -272
  121. package/scaffold/templates/astro/src/scripts/image-gallery.ts +0 -22
  122. package/scaffold/templates/astro/src/scripts/profile-form.ts +0 -57
  123. package/scaffold/templates/astro/src/scripts/review-form.ts +0 -27
  124. package/scaffold/templates/astro/src/styles/pages/cart.css +0 -243
  125. package/scaffold/templates/astro/src/styles/pages/checkout.css +0 -270
  126. package/scaffold/templates/nextjs/app/account/addresses/page.tsx +0 -10
  127. package/scaffold/templates/nextjs/app/account/login/page.tsx +0 -23
  128. package/scaffold/templates/nextjs/app/account/profile/page.tsx +0 -10
  129. package/scaffold/templates/nextjs/app/account/register/page.tsx +0 -10
  130. package/scaffold/templates/nextjs/app/cart/page.tsx +0 -10
  131. package/scaffold/templates/nextjs/app/category/[slug]/page.tsx +0 -58
  132. package/scaffold/templates/nextjs/app/checkout/page.tsx +0 -10
  133. package/scaffold/templates/nextjs/app/page.tsx +0 -63
  134. package/scaffold/templates/nextjs/app/product/[slug]/page.tsx +0 -111
  135. package/scaffold/templates/nextjs/app/products/page.tsx +0 -40
  136. package/scaffold/templates/nextjs/app/search/page.tsx +0 -24
  137. package/scaffold/templates/nextjs/components/client/AddressManager.tsx +0 -181
  138. package/scaffold/templates/nextjs/components/client/CartPage.tsx +0 -120
  139. package/scaffold/templates/nextjs/components/client/CheckoutForm.tsx +0 -523
  140. package/scaffold/templates/nextjs/components/client/ImageGallery.tsx +0 -68
  141. package/scaffold/templates/nextjs/components/client/LoginForm.tsx +0 -89
  142. package/scaffold/templates/nextjs/components/client/MiniCartWrapper.tsx +0 -12
  143. package/scaffold/templates/nextjs/components/client/ProductGrid.tsx +0 -148
  144. package/scaffold/templates/nextjs/components/client/ProfileForm.tsx +0 -112
  145. package/scaffold/templates/nextjs/components/client/RegisterForm.tsx +0 -131
  146. package/scaffold/templates/nextjs/components/client/ReviewForm.tsx +0 -116
  147. package/scaffold/templates/nextjs/components/client/SearchBarWrapper.tsx +0 -27
  148. package/scaffold/templates/nextjs/components/client/SearchResults.tsx +0 -141
  149. package/scaffold/templates/nextjs/components/client/SortDropdown.tsx +0 -35
  150. package/scaffold/templates/nextjs/components/server/Breadcrumb.tsx +0 -36
  151. package/scaffold/templates/nextjs/components/server/CategoryNav.tsx +0 -29
  152. package/scaffold/templates/nextjs/components/server/CheckoutSteps.tsx +0 -60
  153. package/scaffold/templates/nextjs/components/server/Footer.module.css +0 -64
  154. package/scaffold/templates/nextjs/components/server/Footer.tsx +0 -79
  155. package/scaffold/templates/nextjs/components/server/Header.module.css +0 -147
  156. package/scaffold/templates/nextjs/components/server/OrderSummary.tsx +0 -79
  157. package/scaffold/templates/nextjs/components/server/PriceDisplay.tsx +0 -31
  158. package/scaffold/templates/nextjs/components/server/ProductCard.tsx +0 -59
  159. package/scaffold/templates/nextjs/components/server/RelatedProducts.tsx +0 -31
  160. package/scaffold/templates/nextjs/components/server/ReviewList.tsx +0 -62
  161. package/scaffold/templates/nextjs/components/server/StockBadge.tsx +0 -19
  162. package/scaffold/templates/nextjs/styles/pages/cart.module.css +0 -240
  163. package/scaffold/templates/nextjs/styles/pages/checkout.module.css +0 -404
  164. /package/scaffold/templates/nextjs/app/{account → (shopper)/account}/layout.tsx +0 -0
  165. /package/scaffold/templates/nextjs/app/{account → (shopper)/account}/orders/[orderNumber]/page.tsx +0 -0
  166. /package/scaffold/templates/nextjs/app/{account → (shopper)/account}/orders/page.tsx +0 -0
  167. /package/scaffold/templates/nextjs/app/{account → (shopper)/account}/page.tsx +0 -0
@@ -45,6 +45,14 @@
45
45
  border-radius: var(--nymbal-radius-lg);
46
46
  }
47
47
 
48
+ /* Below the sidebar's breakpoint the filters wait behind the toggle: open by default, they sat above the grid and
49
+ pushed it down when the filter element rendered its facets after hydration. */
50
+ @media (max-width: 1023px) {
51
+ .filterSection {
52
+ display: none;
53
+ }
54
+ }
55
+
48
56
  .filterTitle {
49
57
  font-size: var(--nymbal-font-size-sm);
50
58
  font-weight: var(--nymbal-font-weight-bold);
@@ -113,151 +121,10 @@
113
121
  flex-wrap: wrap;
114
122
  }
115
123
 
116
- .resultCount {
117
- font-size: var(--nymbal-font-size-sm);
118
- color: var(--nymbal-color-text-muted);
119
- }
120
-
121
124
  .sortSelect {
122
- padding: 0.5rem 0.75rem;
123
- font-size: var(--nymbal-font-size-sm);
124
- border: 1px solid var(--nymbal-color-border);
125
- border-radius: var(--nymbal-radius-md);
126
- background: var(--nymbal-color-surface);
127
- color: var(--nymbal-color-text);
128
- cursor: pointer;
129
- min-width: 10rem;
130
- }
131
-
132
- .sortSelect:focus {
133
- outline: none;
134
- border-color: var(--nymbal-color-accent);
135
- box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.15);
136
- }
137
-
138
- /* ── Product Grid ─────────────────────────────────────────────────── */
139
-
140
- .grid {
141
- display: grid;
142
- grid-template-columns: 1fr;
143
- gap: var(--nymbal-spacing-md);
144
- }
145
-
146
- @media (min-width: 640px) {
147
- .grid {
148
- grid-template-columns: repeat(2, 1fr);
149
- }
150
- }
151
-
152
- @media (min-width: 1024px) {
153
- .grid {
154
- grid-template-columns: repeat(3, 1fr);
155
- }
156
- }
157
-
158
- .productCard {
159
- display: flex;
160
- flex-direction: column;
161
- background: var(--nymbal-color-surface);
162
- border: 1px solid var(--nymbal-color-border);
163
- border-radius: var(--nymbal-radius-lg);
164
- overflow: hidden;
165
- text-decoration: none;
166
- color: var(--nymbal-color-text);
167
- transition: box-shadow var(--nymbal-transition-fast),
168
- transform var(--nymbal-transition-fast);
169
- }
170
-
171
- .productCard:hover {
172
- box-shadow: var(--nymbal-shadow-md);
173
- transform: translateY(-2px);
174
- text-decoration: none;
175
- color: var(--nymbal-color-text);
176
- }
177
-
178
- .productImage {
179
- aspect-ratio: 1;
180
- background-color: #f4f4f5;
181
- overflow: hidden;
182
- }
183
-
184
- .productImage img {
185
125
  width: 100%;
186
- height: 100%;
187
- object-fit: cover;
188
126
  }
189
127
 
190
- .productInfo {
191
- padding: var(--nymbal-spacing-md);
192
- display: flex;
193
- flex-direction: column;
194
- gap: var(--nymbal-spacing-xs);
195
- }
196
-
197
- .productName {
198
- font-size: var(--nymbal-font-size-sm);
199
- font-weight: var(--nymbal-font-weight-medium);
200
- }
201
-
202
- .productPrice {
203
- font-size: var(--nymbal-font-size-sm);
204
- font-weight: var(--nymbal-font-weight-bold);
205
- }
206
-
207
- /* ── Pagination ───────────────────────────────────────────────────── */
208
-
209
- .pagination {
210
- display: flex;
211
- align-items: center;
212
- justify-content: center;
213
- gap: var(--nymbal-spacing-sm);
214
- margin-top: var(--nymbal-spacing-xl);
215
- }
216
-
217
- .loadMore {
218
- padding: 0.625rem 2rem;
219
- font-size: var(--nymbal-font-size-sm);
220
- font-weight: var(--nymbal-font-weight-medium);
221
- color: var(--nymbal-color-primary);
222
- background: var(--nymbal-color-surface);
223
- border: 1px solid var(--nymbal-color-border);
224
- border-radius: var(--nymbal-radius-md);
225
- cursor: pointer;
226
- transition: background-color var(--nymbal-transition-fast),
227
- border-color var(--nymbal-transition-fast);
228
- }
229
-
230
- .loadMore:hover {
231
- background-color: #f4f4f5;
232
- border-color: var(--nymbal-color-primary);
233
- }
234
-
235
- .loadMore:disabled {
236
- opacity: 0.5;
237
- cursor: not-allowed;
238
- }
239
-
240
- /* ── Empty State ──────────────────────────────────────────────────── */
241
-
242
- .empty {
243
- text-align: center;
244
- padding: var(--nymbal-spacing-xl);
245
- color: var(--nymbal-color-text-muted);
246
- }
247
-
248
- .emptyTitle {
249
- font-size: var(--nymbal-font-size-lg);
250
- font-weight: var(--nymbal-font-weight-medium);
251
- margin-bottom: var(--nymbal-spacing-sm);
252
- color: var(--nymbal-color-text);
253
- }
254
-
255
- .emptyText {
256
- font-size: var(--nymbal-font-size-sm);
257
- }
258
-
259
- /* ── Mobile filter toggle ─────────────────────────────────────────── */
260
-
261
128
  .mobileFilterToggle {
262
129
  display: block;
263
130
  width: 100%;
@@ -14,142 +14,22 @@
14
14
  margin-bottom: var(--nymbal-spacing-sm);
15
15
  }
16
16
 
17
- .queryText {
18
- font-size: var(--nymbal-font-size-sm);
19
- color: var(--nymbal-color-text-muted);
20
- }
21
-
22
- .queryTerm {
23
- font-weight: var(--nymbal-font-weight-medium);
24
- color: var(--nymbal-color-text);
25
- }
17
+ /* ── Category filter beside the results ──────────────────────────── */
26
18
 
27
- .resultCount {
28
- font-size: var(--nymbal-font-size-sm);
29
- color: var(--nymbal-color-text-muted);
30
- margin-bottom: var(--nymbal-spacing-md);
31
- }
32
-
33
- /* ── Search Input ─────────────────────────────────────────────────── */
34
-
35
- .searchInputWrapper {
36
- max-width: 32rem;
37
- margin-bottom: var(--nymbal-spacing-xl);
38
- }
39
-
40
- /* ── Results Grid ─────────────────────────────────────────────────── */
41
-
42
- .grid {
19
+ .layout {
43
20
  display: grid;
44
21
  grid-template-columns: 1fr;
45
- gap: var(--nymbal-spacing-md);
22
+ gap: var(--nymbal-spacing-lg);
46
23
  }
47
24
 
48
- @media (min-width: 640px) {
49
- .grid {
50
- grid-template-columns: repeat(2, 1fr);
25
+ @media (min-width: 769px) {
26
+ .layout {
27
+ grid-template-columns: 240px minmax(0, 1fr);
51
28
  }
52
29
  }
53
30
 
54
- @media (min-width: 1024px) {
55
- .grid {
56
- grid-template-columns: repeat(4, 1fr);
57
- }
58
- }
59
-
60
- .productCard {
61
- display: flex;
62
- flex-direction: column;
63
- background: var(--nymbal-color-surface);
64
- border: 1px solid var(--nymbal-color-border);
65
- border-radius: var(--nymbal-radius-lg);
66
- overflow: hidden;
67
- text-decoration: none;
68
- color: var(--nymbal-color-text);
69
- transition: box-shadow var(--nymbal-transition-fast),
70
- transform var(--nymbal-transition-fast);
71
- }
72
-
73
- .productCard:hover {
74
- box-shadow: var(--nymbal-shadow-md);
75
- transform: translateY(-2px);
76
- text-decoration: none;
77
- color: var(--nymbal-color-text);
78
- }
79
-
80
- .productImage {
81
- aspect-ratio: 1;
82
- background-color: #f4f4f5;
83
- overflow: hidden;
84
- }
85
-
86
- .productImage img {
87
- width: 100%;
88
- height: 100%;
89
- object-fit: cover;
90
- }
91
-
92
- .productInfo {
93
- padding: var(--nymbal-spacing-md);
94
- display: flex;
95
- flex-direction: column;
96
- gap: var(--nymbal-spacing-xs);
97
- }
98
-
99
- .productName {
100
- font-size: var(--nymbal-font-size-sm);
101
- font-weight: var(--nymbal-font-weight-medium);
102
- }
103
-
104
- .productPrice {
105
- font-size: var(--nymbal-font-size-sm);
106
- font-weight: var(--nymbal-font-weight-bold);
107
- }
108
-
109
- /* ── Empty State ──────────────────────────────────────────────────── */
110
-
111
- .empty {
112
- text-align: center;
113
- padding: 4rem var(--nymbal-spacing-lg);
114
- }
115
-
116
- .emptyIcon {
117
- display: inline-flex;
118
- align-items: center;
119
- justify-content: center;
120
- width: 4rem;
121
- height: 4rem;
122
- border-radius: 50%;
123
- background-color: #f4f4f5;
124
- color: var(--nymbal-color-text-muted);
125
- margin-bottom: var(--nymbal-spacing-md);
126
- }
127
-
128
- .emptyIcon svg {
129
- width: 2rem;
130
- height: 2rem;
131
- }
132
-
133
- .emptyTitle {
134
- font-size: var(--nymbal-font-size-lg);
135
- font-weight: var(--nymbal-font-weight-medium);
136
- margin-bottom: var(--nymbal-spacing-sm);
137
- }
138
-
139
- .emptyText {
140
- font-size: var(--nymbal-font-size-sm);
141
- color: var(--nymbal-color-text-muted);
142
- max-width: 24rem;
143
- margin-inline: auto;
144
- }
145
-
146
- /* ── Loading ──────────────────────────────────────────────────────── */
147
-
148
- .loading {
149
- display: flex;
150
- align-items: center;
151
- justify-content: center;
152
- min-height: 16rem;
31
+ .sidebar {
32
+ align-self: start;
153
33
  }
154
34
 
155
35
  /* ── Suggestions ──────────────────────────────────────────────────── */
@@ -0,0 +1,5 @@
1
+ {
2
+ // The tsconfig of a build into NYMBAL_NEXT_DIST_DIR (next.config.mjs). Next adds a build's dist directory to the
3
+ // tsconfig it type-checks with, unless that one extends another; so tsconfig.json keeps only `.next`.
4
+ "extends": "./tsconfig.json"
5
+ }
@@ -1,107 +0,0 @@
1
- ---
2
- import '../styles/pages/checkout.css'
3
-
4
- interface Props {
5
- id: string
6
- }
7
-
8
- const { id } = Astro.props
9
- ---
10
-
11
- <div class="address-grid" data-testid={`${id}-form`}>
12
- <div class="form-group">
13
- <label for={`${id}-firstName`}>First Name</label>
14
- <input
15
- type="text"
16
- id={`${id}-firstName`}
17
- name="firstName"
18
- required
19
- autocomplete="given-name"
20
- data-testid={`${id}-firstName`}
21
- />
22
- </div>
23
-
24
- <div class="form-group">
25
- <label for={`${id}-lastName`}>Last Name</label>
26
- <input
27
- type="text"
28
- id={`${id}-lastName`}
29
- name="lastName"
30
- required
31
- autocomplete="family-name"
32
- data-testid={`${id}-lastName`}
33
- />
34
- </div>
35
-
36
- <div class="form-group full-width">
37
- <label for={`${id}-addressLine1`}>Address Line 1</label>
38
- <input
39
- type="text"
40
- id={`${id}-addressLine1`}
41
- name="addressLine1"
42
- required
43
- autocomplete="address-line1"
44
- data-testid={`${id}-addressLine1`}
45
- />
46
- </div>
47
-
48
- <div class="form-group full-width">
49
- <label for={`${id}-addressLine2`}>Address Line 2 (optional)</label>
50
- <input
51
- type="text"
52
- id={`${id}-addressLine2`}
53
- name="addressLine2"
54
- autocomplete="address-line2"
55
- data-testid={`${id}-addressLine2`}
56
- />
57
- </div>
58
-
59
- <div class="form-group">
60
- <label for={`${id}-city`}>City</label>
61
- <input
62
- type="text"
63
- id={`${id}-city`}
64
- name="city"
65
- required
66
- autocomplete="address-level2"
67
- data-testid={`${id}-city`}
68
- />
69
- </div>
70
-
71
- <div class="form-group">
72
- <label for={`${id}-region`}>State / County</label>
73
- <input
74
- type="text"
75
- id={`${id}-region`}
76
- name="region"
77
- required
78
- autocomplete="address-level1"
79
- data-testid={`${id}-region`}
80
- />
81
- </div>
82
-
83
- <div class="form-group">
84
- <label for={`${id}-postalCode`}>Postcode</label>
85
- <input
86
- type="text"
87
- id={`${id}-postalCode`}
88
- name="postalCode"
89
- required
90
- autocomplete="postal-code"
91
- data-testid={`${id}-postalCode`}
92
- />
93
- </div>
94
-
95
- <div class="form-group">
96
- <label for={`${id}-country`}>Country (2-letter code)</label>
97
- <input
98
- type="text"
99
- id={`${id}-country`}
100
- name="country"
101
- required
102
- autocomplete="country"
103
- placeholder="GB"
104
- data-testid={`${id}-country`}
105
- />
106
- </div>
107
- </div>
@@ -1,20 +0,0 @@
1
- ---
2
- interface Props {
3
- items: Array<{ label: string; href?: string }>
4
- }
5
-
6
- const { items } = Astro.props
7
- ---
8
-
9
- <nav class="pdp-breadcrumbs" aria-label="Breadcrumb" data-testid="breadcrumb">
10
- {items.map((item, index) => (
11
- <>
12
- {index > 0 && <span class="separator" aria-hidden="true">/</span>}
13
- {item.href && index < items.length - 1 ? (
14
- <a href={item.href}>{item.label}</a>
15
- ) : (
16
- <span class="current" aria-current="page">{item.label}</span>
17
- )}
18
- </>
19
- ))}
20
- </nav>
@@ -1,27 +0,0 @@
1
- ---
2
- import '../styles/pages/home.css'
3
- import type { Category } from '@nymbalhq/types'
4
-
5
- interface Props {
6
- categories: Category[]
7
- }
8
-
9
- const { categories } = Astro.props
10
- ---
11
-
12
- <div class="category-grid">
13
- {categories.map((cat) => (
14
- <a
15
- href={`/category/${cat.slug}`}
16
- class="category-card"
17
- data-testid={`category-${cat.slug}`}
18
- >
19
- <span class="category-card-name">{cat.name}</span>
20
- {cat.description && (
21
- <span class="category-card-description" style="font-size: var(--nymbal-font-size-xs, 0.75rem); color: var(--nymbal-color-text-muted, #71717a); margin-top: var(--nymbal-spacing-xs, 0.25rem);">
22
- {cat.description}
23
- </span>
24
- )}
25
- </a>
26
- ))}
27
- </div>
@@ -1,29 +0,0 @@
1
- ---
2
- import '../styles/pages/checkout.css'
3
-
4
- interface Props {
5
- currentStep: 'contact' | 'shipping' | 'payment'
6
- }
7
-
8
- const { currentStep } = Astro.props
9
- const steps = ['contact', 'shipping', 'payment'] as const
10
- const stepLabels = { contact: 'Contact', shipping: 'Shipping', payment: 'Payment' }
11
- const currentIndex = steps.indexOf(currentStep)
12
- ---
13
-
14
- <div class="checkout-steps" data-testid="checkout-steps">
15
- {steps.map((step, index) => {
16
- const isCompleted = index < currentIndex
17
- const isActive = step === currentStep
18
- const stepClass = isCompleted ? 'checkout-step completed' : isActive ? 'checkout-step active' : 'checkout-step'
19
- const dividerClass = index < currentIndex ? 'checkout-step-divider completed' : 'checkout-step-divider'
20
- return (
21
- <>
22
- {index > 0 && <div class={dividerClass} aria-hidden="true"></div>}
23
- <div class={stepClass} data-testid={`checkout-step-${step}`}>
24
- <span>{stepLabels[step]}</span>
25
- </div>
26
- </>
27
- )
28
- })}
29
- </div>
@@ -1,108 +0,0 @@
1
- ---
2
- const currentYear = new Date().getFullYear()
3
- ---
4
- <footer class="site-footer" data-testid="site-footer">
5
- <div class="footer-container container">
6
- <div class="footer-grid">
7
- <div class="footer-column">
8
- <h2 class="footer-heading">Shop</h2>
9
- <ul class="footer-links">
10
- <li><a href="/products">All Products</a></li>
11
- <li><a href="/category/apparel">Apparel</a></li>
12
- <li><a href="/category/home">Home</a></li>
13
- <li><a href="/category/electronics">Electronics</a></li>
14
- <li><a href="/category/books">Books</a></li>
15
- </ul>
16
- </div>
17
-
18
- <div class="footer-column">
19
- <h2 class="footer-heading">Account</h2>
20
- <ul class="footer-links">
21
- <li><a href="/account/login">Login</a></li>
22
- <li><a href="/account/register">Register</a></li>
23
- <li><a href="/account/orders">Orders</a></li>
24
- </ul>
25
- </div>
26
-
27
- <div class="footer-column">
28
- <h2 class="footer-heading">About</h2>
29
- <p class="footer-about">
30
- Nymbal is a modern headless commerce platform built for developers.
31
- Fast, flexible, and fully customisable.
32
- </p>
33
- </div>
34
- </div>
35
-
36
- <div class="footer-bottom">
37
- <p>&copy; {currentYear} Nymbal. All rights reserved.</p>
38
- </div>
39
- </div>
40
- </footer>
41
-
42
- <style>
43
- .site-footer {
44
- background-color: var(--nymbal-color-primary, #18181b);
45
- color: var(--nymbal-color-text-inverse, #fff);
46
- margin-top: auto;
47
- }
48
-
49
- .footer-container {
50
- padding-block: 3rem var(--nymbal-spacing-lg, 1.5rem);
51
- }
52
-
53
- .footer-grid {
54
- display: grid;
55
- grid-template-columns: 1fr;
56
- gap: var(--nymbal-spacing-xl, 2rem);
57
- margin-bottom: var(--nymbal-spacing-xl, 2rem);
58
- }
59
-
60
- @media (min-width: 641px) {
61
- .footer-grid {
62
- grid-template-columns: repeat(3, 1fr);
63
- }
64
- }
65
-
66
- .footer-heading {
67
- font-size: var(--nymbal-font-size-sm, 0.875rem);
68
- font-weight: var(--nymbal-font-weight-bold, 700);
69
- text-transform: uppercase;
70
- letter-spacing: 0.05em;
71
- margin-bottom: var(--nymbal-spacing-md, 1rem);
72
- color: var(--nymbal-color-text-inverse, #fff);
73
- }
74
-
75
- .footer-links {
76
- display: flex;
77
- flex-direction: column;
78
- gap: var(--nymbal-spacing-sm, 0.5rem);
79
- }
80
-
81
- .footer-links a {
82
- font-size: var(--nymbal-font-size-sm, 0.875rem);
83
- color: rgba(255, 255, 255, 0.7);
84
- text-decoration: none;
85
- transition: color var(--nymbal-transition-fast, 150ms) ease;
86
- }
87
-
88
- .footer-links a:hover {
89
- color: var(--nymbal-color-text-inverse, #fff);
90
- }
91
-
92
- .footer-about {
93
- font-size: var(--nymbal-font-size-sm, 0.875rem);
94
- color: rgba(255, 255, 255, 0.7);
95
- line-height: 1.6;
96
- max-width: 28ch;
97
- }
98
-
99
- .footer-bottom {
100
- border-top: 1px solid rgba(255, 255, 255, 0.1);
101
- padding-top: var(--nymbal-spacing-lg, 1.5rem);
102
- }
103
-
104
- .footer-bottom p {
105
- font-size: var(--nymbal-font-size-xs, 0.75rem);
106
- color: rgba(255, 255, 255, 0.5);
107
- }
108
- </style>