@stackonward/cli 1.5.2 → 1.6.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.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/resources/components/nuxt/site-source/app/assets/css/site-shell.css +112 -56
- package/dist/resources/components/nuxt/site-source/app/assets/icons/brand/android.svg +10 -0
- package/dist/resources/components/nuxt/site-source/app/assets/icons/brand/apple.svg +3 -0
- package/dist/resources/components/nuxt/site-source/app/assets/icons/brand/whatsapp.svg +5 -0
- package/dist/resources/components/nuxt/site-source/app/components/app/Sidebar.vue +1 -1
- package/dist/resources/components/nuxt/site-source/app/components/checkout/Status.vue +3 -3
- package/dist/resources/components/nuxt/site-source/app/components/consent/Banner.vue +23 -8
- package/dist/resources/components/nuxt/site-source/app/components/content/CallToAction.vue +59 -0
- package/dist/resources/components/nuxt/site-source/app/components/content/Card.vue +35 -0
- package/dist/resources/components/nuxt/site-source/app/components/content/Compatibility.vue +10 -0
- package/dist/resources/components/nuxt/site-source/app/components/content/Faq.vue +56 -0
- package/dist/resources/components/nuxt/site-source/app/components/content/Features.vue +8 -0
- package/dist/resources/components/nuxt/site-source/app/components/content/List.vue +1 -8
- package/dist/resources/components/nuxt/site-source/app/components/content/Reviews.vue +93 -0
- package/dist/resources/components/nuxt/site-source/app/components/countdown/Timer.vue +112 -0
- package/dist/resources/components/nuxt/site-source/app/components/locale/Menu.vue +3 -3
- package/dist/resources/components/nuxt/site-source/app/components/site/BackToTop.vue +30 -23
- package/dist/resources/components/nuxt/site-source/app/components/site/Header.vue +2 -2
- package/dist/resources/components/nuxt/site-source/app/components/steps/Progress.vue +36 -0
- package/dist/resources/components/nuxt/site-source/app/components/steps/Showcase.vue +340 -0
- package/dist/resources/components/nuxt/site-source/app/components/theme/Menu.vue +4 -4
- package/dist/resources/components/nuxt/site-source/app/components/ui/Button.vue +28 -2
- package/dist/resources/components/nuxt/site-source/app/components/ui/GradientBorder.vue +5 -5
- package/dist/resources/components/nuxt/site-source/app/components/ui/Icon.vue +14 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/Image.vue +126 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/Marquee.vue +99 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/Modal.vue +26 -88
- package/dist/resources/components/nuxt/site-source/app/components/ui/Popover.vue +87 -93
- package/dist/resources/components/nuxt/site-source/app/components/ui/Text.vue +84 -12
- package/dist/resources/components/nuxt/site-source/app/components/ui/Video.vue +105 -0
- package/dist/resources/components/nuxt/site-source/app/components/whatsapp/Chat.vue +126 -0
- package/dist/resources/components/nuxt/site-source/app/components/youtube/Embed.vue +286 -73
- package/dist/resources/components/nuxt/site-source/app/composables/useFloatingBottomStack.ts +44 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useNavigation.ts +6 -8
- package/dist/resources/components/nuxt/site-source/app/consent/types.ts +1 -4
- package/dist/resources/components/nuxt/site-source/app/content/types.ts +3 -0
- package/dist/resources/components/nuxt/site-source/app/theme/accordion.ts +5 -4
- package/dist/resources/components/nuxt/site-source/app/theme/breadcrumb.ts +14 -4
- package/dist/resources/components/nuxt/site-source/app/theme/button.ts +138 -28
- package/dist/resources/components/nuxt/site-source/app/theme/carousel.ts +11 -7
- package/dist/resources/components/nuxt/site-source/app/theme/checkbox.ts +9 -3
- package/dist/resources/components/nuxt/site-source/app/theme/drawer.ts +6 -0
- package/dist/resources/components/nuxt/site-source/app/theme/form-field.ts +8 -0
- package/dist/resources/components/nuxt/site-source/app/theme/icon.ts +6 -0
- package/dist/resources/components/nuxt/site-source/app/theme/index.ts +8 -1
- package/dist/resources/components/nuxt/site-source/app/theme/input.ts +34 -18
- package/dist/resources/components/nuxt/site-source/app/theme/modal.ts +9 -5
- package/dist/resources/components/nuxt/site-source/app/theme/pagination.ts +9 -2
- package/dist/resources/components/nuxt/site-source/app/theme/radio-group.ts +7 -0
- package/dist/resources/components/nuxt/site-source/app/theme/select.ts +19 -7
- package/dist/resources/components/nuxt/site-source/app/theme/stepper.ts +15 -6
- package/dist/resources/components/nuxt/site-source/app/theme/textarea.ts +6 -0
- package/dist/resources/components/nuxt/site-source/app/theme/toast.ts +1 -4
- package/dist/resources/components/nuxt/site-source/app/theme/tooltip.ts +5 -1
- package/dist/resources/components/registry.json +133 -45
- package/dist/resources/components/vue/ui/BottomSheet.vue +5 -1
- package/dist/resources/components/vue/ui/ScrollArea.vue +2 -1
- package/dist/resources/registry.json +4 -4
- package/dist/resources/templates/base/.claude/docs/architecture-template.md +2 -1
- package/dist/resources/templates/base/AGENTS.md +7 -0
- package/dist/resources/templates/base/CLAUDE.md +7 -0
- package/dist/resources/templates/nuxt/.claude/docs/stack.md +14 -1
- package/dist/resources/templates/nuxt/.vscode/extensions.json +9 -0
- package/dist/resources/templates/nuxt/.vscode/settings.json +21 -0
- package/dist/resources/templates/nuxt/.zed/settings.json +42 -0
- package/dist/resources/templates/nuxt/DESIGN.md +146 -0
- package/dist/resources/templates/nuxt/README.md +10 -0
- package/dist/resources/templates/nuxt/app/app.config.ts +2 -0
- package/dist/resources/templates/nuxt/app/pages/app/index.vue +9 -7
- package/dist/resources/templates/nuxt/app/pages/index.vue +12 -27
- package/dist/resources/templates/nuxt/app/pages/ui/index.vue +219 -3
- package/dist/resources/templates/nuxt/nuxt.config.ts +2 -4
- package/dist/resources/templates/nuxt/package.json +4 -3
- package/dist/resources/templates/nuxt/stylelint.config.mjs +12 -0
- package/package.json +2 -2
- package/dist/resources/components/nuxt/site-source/app/assets/icons/common/.gitkeep +0 -0
|
@@ -160,8 +160,16 @@
|
|
|
160
160
|
"target": "app/assets/icons/brand/.gitkeep"
|
|
161
161
|
},
|
|
162
162
|
{
|
|
163
|
-
"path": "site-source/app/assets/icons/
|
|
164
|
-
"target": "app/assets/icons/
|
|
163
|
+
"path": "site-source/app/assets/icons/brand/android.svg",
|
|
164
|
+
"target": "app/assets/icons/brand/android.svg"
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"path": "site-source/app/assets/icons/brand/apple.svg",
|
|
168
|
+
"target": "app/assets/icons/brand/apple.svg"
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"path": "site-source/app/assets/icons/brand/whatsapp.svg",
|
|
172
|
+
"target": "app/assets/icons/brand/whatsapp.svg"
|
|
165
173
|
},
|
|
166
174
|
{
|
|
167
175
|
"path": "site-source/app/components/app/Header.vue",
|
|
@@ -176,29 +184,81 @@
|
|
|
176
184
|
"target": "app/components/app/Sidebar.vue"
|
|
177
185
|
},
|
|
178
186
|
{
|
|
179
|
-
"path": "site-source/app/components/
|
|
180
|
-
"target": "app/components/
|
|
187
|
+
"path": "site-source/app/components/checkout/Status.vue",
|
|
188
|
+
"target": "app/components/checkout/Status.vue"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"path": "site-source/app/components/checkout/Summary.vue",
|
|
192
|
+
"target": "app/components/checkout/Summary.vue"
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"path": "site-source/app/components/consent/Banner.vue",
|
|
196
|
+
"target": "app/components/consent/Banner.vue"
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"path": "site-source/app/components/consent/Settings.vue",
|
|
200
|
+
"target": "app/components/consent/Settings.vue"
|
|
181
201
|
},
|
|
182
202
|
{
|
|
183
203
|
"path": "site-source/app/components/content/Article.vue",
|
|
184
204
|
"target": "app/components/content/Article.vue"
|
|
185
205
|
},
|
|
206
|
+
{
|
|
207
|
+
"path": "site-source/app/components/content/CallToAction.vue",
|
|
208
|
+
"target": "app/components/content/CallToAction.vue"
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"path": "site-source/app/components/content/Card.vue",
|
|
212
|
+
"target": "app/components/content/Card.vue"
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"path": "site-source/app/components/content/Compatibility.vue",
|
|
216
|
+
"target": "app/components/content/Compatibility.vue"
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"path": "site-source/app/components/content/Document.vue",
|
|
220
|
+
"target": "app/components/content/Document.vue"
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
"path": "site-source/app/components/content/Faq.vue",
|
|
224
|
+
"target": "app/components/content/Faq.vue"
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"path": "site-source/app/components/content/Features.vue",
|
|
228
|
+
"target": "app/components/content/Features.vue"
|
|
229
|
+
},
|
|
186
230
|
{
|
|
187
231
|
"path": "site-source/app/components/content/List.vue",
|
|
188
232
|
"target": "app/components/content/List.vue"
|
|
189
233
|
},
|
|
190
234
|
{
|
|
191
|
-
"path": "site-source/app/components/
|
|
192
|
-
"target": "app/components/
|
|
235
|
+
"path": "site-source/app/components/content/Reviews.vue",
|
|
236
|
+
"target": "app/components/content/Reviews.vue"
|
|
193
237
|
},
|
|
194
238
|
{
|
|
195
|
-
"path": "site-source/app/components/
|
|
196
|
-
"target": "app/components/
|
|
239
|
+
"path": "site-source/app/components/countdown/Timer.vue",
|
|
240
|
+
"target": "app/components/countdown/Timer.vue"
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"path": "site-source/app/components/feedback/Toast.vue",
|
|
244
|
+
"target": "app/components/feedback/Toast.vue"
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"path": "site-source/app/components/google/SignInButton.vue",
|
|
248
|
+
"target": "app/components/google/SignInButton.vue"
|
|
197
249
|
},
|
|
198
250
|
{
|
|
199
251
|
"path": "site-source/app/components/locale/Menu.vue",
|
|
200
252
|
"target": "app/components/locale/Menu.vue"
|
|
201
253
|
},
|
|
254
|
+
{
|
|
255
|
+
"path": "site-source/app/components/site/BackToTop.vue",
|
|
256
|
+
"target": "app/components/site/BackToTop.vue"
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
"path": "site-source/app/components/site/Brand.vue",
|
|
260
|
+
"target": "app/components/site/Brand.vue"
|
|
261
|
+
},
|
|
202
262
|
{
|
|
203
263
|
"path": "site-source/app/components/site/Footer.vue",
|
|
204
264
|
"target": "app/components/site/Footer.vue"
|
|
@@ -212,16 +272,12 @@
|
|
|
212
272
|
"target": "app/components/site/Shell.vue"
|
|
213
273
|
},
|
|
214
274
|
{
|
|
215
|
-
"path": "site-source/app/components/
|
|
216
|
-
"target": "app/components/
|
|
217
|
-
},
|
|
218
|
-
{
|
|
219
|
-
"path": "site-source/app/components/content/Document.vue",
|
|
220
|
-
"target": "app/components/content/Document.vue"
|
|
275
|
+
"path": "site-source/app/components/steps/Progress.vue",
|
|
276
|
+
"target": "app/components/steps/Progress.vue"
|
|
221
277
|
},
|
|
222
278
|
{
|
|
223
|
-
"path": "site-source/app/components/
|
|
224
|
-
"target": "app/components/
|
|
279
|
+
"path": "site-source/app/components/steps/Showcase.vue",
|
|
280
|
+
"target": "app/components/steps/Showcase.vue"
|
|
225
281
|
},
|
|
226
282
|
{
|
|
227
283
|
"path": "site-source/app/components/theme/Menu.vue",
|
|
@@ -235,6 +291,22 @@
|
|
|
235
291
|
"path": "site-source/app/components/ui/GradientBorder.vue",
|
|
236
292
|
"target": "app/components/ui/GradientBorder.vue"
|
|
237
293
|
},
|
|
294
|
+
{
|
|
295
|
+
"path": "site-source/app/components/ui/Icon.vue",
|
|
296
|
+
"target": "app/components/ui/Icon.vue"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"path": "site-source/app/components/ui/Image.vue",
|
|
300
|
+
"target": "app/components/ui/Image.vue"
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
"path": "site-source/app/components/ui/InfiniteScroll.vue",
|
|
304
|
+
"target": "app/components/ui/InfiniteScroll.vue"
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
"path": "site-source/app/components/ui/Marquee.vue",
|
|
308
|
+
"target": "app/components/ui/Marquee.vue"
|
|
309
|
+
},
|
|
238
310
|
{
|
|
239
311
|
"path": "site-source/app/components/ui/Modal.vue",
|
|
240
312
|
"target": "app/components/ui/Modal.vue"
|
|
@@ -248,20 +320,12 @@
|
|
|
248
320
|
"target": "app/components/ui/Text.vue"
|
|
249
321
|
},
|
|
250
322
|
{
|
|
251
|
-
"path": "site-source/app/components/
|
|
252
|
-
"target": "app/components/
|
|
323
|
+
"path": "site-source/app/components/ui/Video.vue",
|
|
324
|
+
"target": "app/components/ui/Video.vue"
|
|
253
325
|
},
|
|
254
326
|
{
|
|
255
|
-
"path": "site-source/app/components/
|
|
256
|
-
"target": "app/components/
|
|
257
|
-
},
|
|
258
|
-
{
|
|
259
|
-
"path": "site-source/app/components/google/SignInButton.vue",
|
|
260
|
-
"target": "app/components/google/SignInButton.vue"
|
|
261
|
-
},
|
|
262
|
-
{
|
|
263
|
-
"path": "site-source/app/components/ui/InfiniteScroll.vue",
|
|
264
|
-
"target": "app/components/ui/InfiniteScroll.vue"
|
|
327
|
+
"path": "site-source/app/components/whatsapp/Chat.vue",
|
|
328
|
+
"target": "app/components/whatsapp/Chat.vue"
|
|
265
329
|
},
|
|
266
330
|
{
|
|
267
331
|
"path": "site-source/app/components/youtube/Embed.vue",
|
|
@@ -275,6 +339,10 @@
|
|
|
275
339
|
"path": "site-source/app/composables/useConsent.ts",
|
|
276
340
|
"target": "app/composables/useConsent.ts"
|
|
277
341
|
},
|
|
342
|
+
{
|
|
343
|
+
"path": "site-source/app/composables/useFloatingBottomStack.ts",
|
|
344
|
+
"target": "app/composables/useFloatingBottomStack.ts"
|
|
345
|
+
},
|
|
278
346
|
{
|
|
279
347
|
"path": "site-source/app/composables/useGoogleIdentity.ts",
|
|
280
348
|
"target": "app/composables/useGoogleIdentity.ts"
|
|
@@ -295,6 +363,14 @@
|
|
|
295
363
|
"path": "site-source/app/composables/useToasts.ts",
|
|
296
364
|
"target": "app/composables/useToasts.ts"
|
|
297
365
|
},
|
|
366
|
+
{
|
|
367
|
+
"path": "site-source/app/consent/types.ts",
|
|
368
|
+
"target": "app/consent/types.ts"
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
"path": "site-source/app/content/types.ts",
|
|
372
|
+
"target": "app/content/types.ts"
|
|
373
|
+
},
|
|
298
374
|
{
|
|
299
375
|
"path": "site-source/app/layouts/app.vue",
|
|
300
376
|
"target": "app/layouts/app.vue"
|
|
@@ -303,6 +379,10 @@
|
|
|
303
379
|
"path": "site-source/app/layouts/default.vue",
|
|
304
380
|
"target": "app/layouts/default.vue"
|
|
305
381
|
},
|
|
382
|
+
{
|
|
383
|
+
"path": "site-source/app/navigation/types.ts",
|
|
384
|
+
"target": "app/navigation/types.ts"
|
|
385
|
+
},
|
|
306
386
|
{
|
|
307
387
|
"path": "site-source/app/plugins/consent.ts",
|
|
308
388
|
"target": "app/plugins/consent.ts"
|
|
@@ -311,6 +391,10 @@
|
|
|
311
391
|
"path": "site-source/app/plugins/google-identity.client.ts",
|
|
312
392
|
"target": "app/plugins/google-identity.client.ts"
|
|
313
393
|
},
|
|
394
|
+
{
|
|
395
|
+
"path": "site-source/app/site/config.ts",
|
|
396
|
+
"target": "app/site/config.ts"
|
|
397
|
+
},
|
|
314
398
|
{
|
|
315
399
|
"path": "site-source/app/theme/accordion.ts",
|
|
316
400
|
"target": "app/theme/accordion.ts"
|
|
@@ -331,6 +415,18 @@
|
|
|
331
415
|
"path": "site-source/app/theme/checkbox.ts",
|
|
332
416
|
"target": "app/theme/checkbox.ts"
|
|
333
417
|
},
|
|
418
|
+
{
|
|
419
|
+
"path": "site-source/app/theme/drawer.ts",
|
|
420
|
+
"target": "app/theme/drawer.ts"
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
"path": "site-source/app/theme/form-field.ts",
|
|
424
|
+
"target": "app/theme/form-field.ts"
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
"path": "site-source/app/theme/icon.ts",
|
|
428
|
+
"target": "app/theme/icon.ts"
|
|
429
|
+
},
|
|
334
430
|
{
|
|
335
431
|
"path": "site-source/app/theme/index.ts",
|
|
336
432
|
"target": "app/theme/index.ts"
|
|
@@ -347,6 +443,10 @@
|
|
|
347
443
|
"path": "site-source/app/theme/pagination.ts",
|
|
348
444
|
"target": "app/theme/pagination.ts"
|
|
349
445
|
},
|
|
446
|
+
{
|
|
447
|
+
"path": "site-source/app/theme/radio-group.ts",
|
|
448
|
+
"target": "app/theme/radio-group.ts"
|
|
449
|
+
},
|
|
350
450
|
{
|
|
351
451
|
"path": "site-source/app/theme/select.ts",
|
|
352
452
|
"target": "app/theme/select.ts"
|
|
@@ -355,6 +455,10 @@
|
|
|
355
455
|
"path": "site-source/app/theme/stepper.ts",
|
|
356
456
|
"target": "app/theme/stepper.ts"
|
|
357
457
|
},
|
|
458
|
+
{
|
|
459
|
+
"path": "site-source/app/theme/textarea.ts",
|
|
460
|
+
"target": "app/theme/textarea.ts"
|
|
461
|
+
},
|
|
358
462
|
{
|
|
359
463
|
"path": "site-source/app/theme/toast.ts",
|
|
360
464
|
"target": "app/theme/toast.ts"
|
|
@@ -362,25 +466,9 @@
|
|
|
362
466
|
{
|
|
363
467
|
"path": "site-source/app/theme/tooltip.ts",
|
|
364
468
|
"target": "app/theme/tooltip.ts"
|
|
365
|
-
},
|
|
366
|
-
{
|
|
367
|
-
"path": "site-source/app/consent/types.ts",
|
|
368
|
-
"target": "app/consent/types.ts"
|
|
369
|
-
},
|
|
370
|
-
{
|
|
371
|
-
"path": "site-source/app/content/types.ts",
|
|
372
|
-
"target": "app/content/types.ts"
|
|
373
|
-
},
|
|
374
|
-
{
|
|
375
|
-
"path": "site-source/app/navigation/types.ts",
|
|
376
|
-
"target": "app/navigation/types.ts"
|
|
377
|
-
},
|
|
378
|
-
{
|
|
379
|
-
"path": "site-source/app/site/config.ts",
|
|
380
|
-
"target": "app/site/config.ts"
|
|
381
469
|
}
|
|
382
470
|
],
|
|
383
|
-
"dependencies": [],
|
|
471
|
+
"dependencies": ["@stackonward/composables"],
|
|
384
472
|
"devDependencies": [],
|
|
385
473
|
"registryDependencies": [],
|
|
386
474
|
"framework": "nuxt",
|
|
@@ -63,7 +63,11 @@ onBeforeUnmount(() => {
|
|
|
63
63
|
<Teleport to="body">
|
|
64
64
|
<Transition name="bottom-sheet-fade">
|
|
65
65
|
<div v-if="modelValue" class="bottom-sheet" role="presentation">
|
|
66
|
-
<button
|
|
66
|
+
<button
|
|
67
|
+
class="bottom-sheet__overlay"
|
|
68
|
+
aria-label="Close sheet"
|
|
69
|
+
@click="handleOverlayClick"
|
|
70
|
+
/>
|
|
67
71
|
<section class="bottom-sheet__panel" role="dialog" aria-modal="true" :aria-label="title">
|
|
68
72
|
<div v-if="showHandle" class="bottom-sheet__handle" aria-hidden="true" />
|
|
69
73
|
<header v-if="title || description || $slots.header" class="bottom-sheet__header">
|
|
@@ -86,7 +86,8 @@ function pointerUp(event: PointerEvent): void {
|
|
|
86
86
|
defineExpose({
|
|
87
87
|
scrollTo,
|
|
88
88
|
scrollToTop: (smooth = true) => scrollTo(position().x, 0, smooth),
|
|
89
|
-
scrollToBottom: (smooth = true) =>
|
|
89
|
+
scrollToBottom: (smooth = true) =>
|
|
90
|
+
scrollTo(position().x, viewport.value?.scrollHeight ?? 0, smooth),
|
|
90
91
|
getScrollPosition: position,
|
|
91
92
|
});
|
|
92
93
|
</script>
|
|
@@ -15,13 +15,13 @@
|
|
|
15
15
|
"name": "@stackonward/analytics-nuxt",
|
|
16
16
|
"description": "Provider-neutral Nuxt analytics lifecycle",
|
|
17
17
|
"type": "npm",
|
|
18
|
-
"version": "^0.2.
|
|
18
|
+
"version": "^0.2.4"
|
|
19
19
|
},
|
|
20
20
|
"@stackonward/cli": {
|
|
21
21
|
"name": "@stackonward/cli",
|
|
22
22
|
"description": "StackOnward project and resource CLI",
|
|
23
23
|
"type": "npm",
|
|
24
|
-
"version": "^1.
|
|
24
|
+
"version": "^1.6.0"
|
|
25
25
|
},
|
|
26
26
|
"@stackonward/cms-client": {
|
|
27
27
|
"name": "@stackonward/cms-client",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"name": "@stackonward/eslint-config",
|
|
58
58
|
"description": "Shared ESLint configuration",
|
|
59
59
|
"type": "npm",
|
|
60
|
-
"version": "^1.0.
|
|
60
|
+
"version": "^1.0.2"
|
|
61
61
|
},
|
|
62
62
|
"@stackonward/file": {
|
|
63
63
|
"name": "@stackonward/file",
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
"name": "@stackonward/nuxt-site-shell",
|
|
112
112
|
"description": "Brand-free Nuxt product-site shell",
|
|
113
113
|
"type": "layer",
|
|
114
|
-
"version": "^0.3.
|
|
114
|
+
"version": "^0.3.2"
|
|
115
115
|
},
|
|
116
116
|
"@stackonward/onex-cms-client": {
|
|
117
117
|
"name": "@stackonward/onex-cms-client",
|
|
@@ -389,8 +389,9 @@ Adding features to an existing module or making significant changes. Does not re
|
|
|
389
389
|
## 3. Database Changes
|
|
390
390
|
|
|
391
391
|
For each new/modified field:
|
|
392
|
+
|
|
392
393
|
| Column | Type | Nullable | Default | Comment | Table |
|
|
393
|
-
|
|
394
|
+
| ------ | ---- | -------- | ------- | ------- | ----- |
|
|
394
395
|
|
|
395
396
|
Migration SQL:
|
|
396
397
|
|
|
@@ -47,6 +47,12 @@ The selected stack has complete coding rules in `.claude/docs/stack.md`. Shared
|
|
|
47
47
|
|
|
48
48
|
**Read the selected stack and applicable nested `CLAUDE.md` before writing code.**
|
|
49
49
|
|
|
50
|
+
## Visual Design Standards (CRITICAL)
|
|
51
|
+
|
|
52
|
+
For a stack with a visual interface, **MUST** read the design standard identified by `.claude/docs/stack.md` before choosing icons, colors, sizing or component overrides. Use that stack's installed component system, token owner and asset conventions. Icon artwork, accessible labels and interactive target size are separate responsibilities; local size changes must use the existing component contract.
|
|
53
|
+
|
|
54
|
+
**FORBIDDEN**: inventing a second icon library or theme implementation for an existing capability. Non-visual stacks do not acquire UI dependencies or a required design document from this rule.
|
|
55
|
+
|
|
50
56
|
## Technology Stack and Environment
|
|
51
57
|
|
|
52
58
|
Read `package.json`, `.env.example`, configuration consumers and `.claude/docs/stack.md` before changing dependencies or environment variables. A sample variable does not prove that runtime code reads it. Nuxt uses `pnpm dev` / `pnpm preview`; MCP uses `pnpm start:stdio` after build. Never put private credentials in Nuxt public configuration or MCP tool output.
|
|
@@ -423,6 +429,7 @@ Durable standards belong in `.claude/docs/`; concrete designs and evidence belon
|
|
|
423
429
|
|
|
424
430
|
- [ ] Read changed owners, nested rules, dependencies and direct consumers.
|
|
425
431
|
- [ ] Contracts, enum authority, configuration and lifecycle are consistent.
|
|
432
|
+
- [ ] Visual changes follow the installed stack design standard, token/component owner and accessibility contract.
|
|
426
433
|
- [ ] Relevant success, validation, authorization and recovery behavior is verified.
|
|
427
434
|
- [ ] Declared stack checks pass; unavailable checks are reported accurately.
|
|
428
435
|
- [ ] No secrets, dead imports or deferred production code enter the diff.
|
|
@@ -47,6 +47,12 @@ The selected stack has complete coding rules in `.claude/docs/stack.md`. Shared
|
|
|
47
47
|
|
|
48
48
|
**Read the selected stack and applicable nested `CLAUDE.md` before writing code.**
|
|
49
49
|
|
|
50
|
+
## Visual Design Standards (CRITICAL)
|
|
51
|
+
|
|
52
|
+
For a stack with a visual interface, **MUST** read the design standard identified by `.claude/docs/stack.md` before choosing icons, colors, sizing or component overrides. Use that stack's installed component system, token owner and asset conventions. Icon artwork, accessible labels and interactive target size are separate responsibilities; local size changes must use the existing component contract.
|
|
53
|
+
|
|
54
|
+
**FORBIDDEN**: inventing a second icon library or theme implementation for an existing capability. Non-visual stacks do not acquire UI dependencies or a required design document from this rule.
|
|
55
|
+
|
|
50
56
|
## Technology Stack and Environment
|
|
51
57
|
|
|
52
58
|
Read `package.json`, `.env.example`, configuration consumers and `.claude/docs/stack.md` before changing dependencies or environment variables. A sample variable does not prove that runtime code reads it. Nuxt uses `pnpm dev` / `pnpm preview`; MCP uses `pnpm start:stdio` after build. Never put private credentials in Nuxt public configuration or MCP tool output.
|
|
@@ -423,6 +429,7 @@ Durable standards belong in `.claude/docs/`; concrete designs and evidence belon
|
|
|
423
429
|
|
|
424
430
|
- [ ] Read changed owners, nested rules, dependencies and direct consumers.
|
|
425
431
|
- [ ] Contracts, enum authority, configuration and lifecycle are consistent.
|
|
432
|
+
- [ ] Visual changes follow the installed stack design standard, token/component owner and accessibility contract.
|
|
426
433
|
- [ ] Relevant success, validation, authorization and recovery behavior is verified.
|
|
427
434
|
- [ ] Declared stack checks pass; unavailable checks are reported accurately.
|
|
428
435
|
- [ ] No secrets, dead imports or deferred production code enter the diff.
|
|
@@ -132,6 +132,7 @@ Nuxt component directories remain namespaces. `components/site/Header.vue` is `H
|
|
|
132
132
|
| NX-H3 | Per-page hardcoded theme overrides | Existing token/theme owner |
|
|
133
133
|
| NX-H4 | Direct DOM mutation for reactive UI | Vue refs and state |
|
|
134
134
|
| NX-H5 | Global component CSS leaking across routes | Utility classes or scoped owner styles |
|
|
135
|
+
| NX-H6 | Parallel icon libraries/renderers or global SVG overrides | UiIcon, local Lucide, Nuxt UI slots and DESIGN.md |
|
|
135
136
|
| NX-E1 | Business enum metadata copied into pages | Actual backend metadata/generated contract |
|
|
136
137
|
| NX-E2 | Invented `useEnum` endpoint | Use installed owner and declared contract |
|
|
137
138
|
| NX-M1 | Mixed locale persistence formats | Explicit locale boundary mapping |
|
|
@@ -371,6 +372,18 @@ const emit = defineEmits<{ submit: [] }>();
|
|
|
371
372
|
|
|
372
373
|
Use Tailwind utilities and theme tokens. Scoped CSS is for behavior that utilities cannot express cleanly. Dark/light modes must use the same semantic tokens; never fix one page with a hardcoded light background that breaks dark mode.
|
|
373
374
|
|
|
375
|
+
### Icon Design Contract
|
|
376
|
+
|
|
377
|
+
**MUST** read [DESIGN.md](../../DESIGN.md) for icon geometry, the size scale, semantic colors and acceptance. The installed system uses local Lucide functional icons and a separate `brand` collection. `UiIcon` owns standalone `name`, `size?: string | number` and `label?: string`; Nuxt UI controls retain their internal icon slots and use the same provider.
|
|
378
|
+
|
|
379
|
+
The ordinary default is 20px through `app/theme/icon.ts` and `--site-icon-md`. Choose one `size-icon-*` utility or explicit `size` value when the caller requires another size. Preserve source geometry and proportional strokes. Functional colors inherit semantic tokens; brand proportions and identity colors remain asset-owned.
|
|
380
|
+
|
|
381
|
+
✅ `<UiIcon name="i-lucide-search" />` uses the shared default; `<UiIcon name="i-lucide-search" class="size-icon-sm" />` selects a local scale level.
|
|
382
|
+
|
|
383
|
+
❌ A second icon wrapper, handwritten duplicate SVG, mixed functional family, competing `size`/size class or global `svg` style bypasses the design owner.
|
|
384
|
+
|
|
385
|
+
Icon-only controls retain at least 44 × 44px targets and accessible names on the button/link. Decorative icons omit `label`; standalone meaning supplies a localized `label`. Do not communicate status only through color. Keep `fallbackToApi: false`, register local brand assets in `nuxt.config.ts` and verify missing icon names against the installed collection.
|
|
386
|
+
|
|
374
387
|
### Complete Create/Edit Form, Recovery and Close Lifecycle
|
|
375
388
|
|
|
376
389
|
The component below consumes the three owners defined in section VI. It includes a real query-driven list, create/edit entry, typed validation, mutation submission, post-save refresh and failure recovery. All types/functions it imports are defined above or exported by the installed framework. Nuxt UI's `validate` callback avoids adding an uninstalled schema library to this template.
|
|
@@ -664,7 +677,7 @@ Read [Architecture](architecture.md), [Security and Lifecycle](security-lifecycl
|
|
|
664
677
|
- [ ] Private configuration never enters public payloads.
|
|
665
678
|
- [ ] Every visible action maps to a real implementation and error path.
|
|
666
679
|
- [ ] All applicable NX-S/A/T/C/H/E/M/P/U rules are checked.
|
|
667
|
-
- [ ] Design coverage includes children, overlays and loading/empty/error/forbidden states.
|
|
680
|
+
- [ ] Design coverage includes children, overlays, icon sizes/names/targets and loading/empty/error/forbidden states.
|
|
668
681
|
- [ ] `pnpm typecheck` and `pnpm build` pass for code/contract changes.
|
|
669
682
|
- [ ] Browser and network evidence proves the touched interactions.
|
|
670
683
|
- [ ] No uninstalled lint/test/authorization capability is claimed.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
|
3
|
+
"editor.formatOnSave": true,
|
|
4
|
+
"editor.formatOnSaveMode": "file",
|
|
5
|
+
"editor.codeActionsOnSave": {
|
|
6
|
+
"source.fixAll.eslint": "explicit",
|
|
7
|
+
"source.fixAll.stylelint": "explicit"
|
|
8
|
+
},
|
|
9
|
+
"[vue]": {
|
|
10
|
+
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
|
11
|
+
},
|
|
12
|
+
"[typescript]": {
|
|
13
|
+
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
|
14
|
+
},
|
|
15
|
+
"[javascript]": {
|
|
16
|
+
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
|
17
|
+
},
|
|
18
|
+
"eslint.validate": ["javascript", "typescript", "vue"],
|
|
19
|
+
"stylelint.validate": ["css", "vue"],
|
|
20
|
+
"prettier.requireConfig": true
|
|
21
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format_on_save": "on",
|
|
3
|
+
"languages": {
|
|
4
|
+
"Vue": {
|
|
5
|
+
"format_on_save": "on",
|
|
6
|
+
"language_servers": ["...", "eslint"],
|
|
7
|
+
"code_actions_on_format": {
|
|
8
|
+
"source.fixAll.eslint": true
|
|
9
|
+
},
|
|
10
|
+
"formatter": {
|
|
11
|
+
"external": {
|
|
12
|
+
"command": "pnpm",
|
|
13
|
+
"arguments": ["exec", "prettier", "--stdin-filepath", "{buffer_path}"]
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"TypeScript": {
|
|
18
|
+
"format_on_save": "on",
|
|
19
|
+
"code_actions_on_format": {
|
|
20
|
+
"source.fixAll.eslint": true
|
|
21
|
+
},
|
|
22
|
+
"formatter": {
|
|
23
|
+
"external": {
|
|
24
|
+
"command": "pnpm",
|
|
25
|
+
"arguments": ["exec", "prettier", "--stdin-filepath", "{buffer_path}"]
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"JavaScript": {
|
|
30
|
+
"format_on_save": "on",
|
|
31
|
+
"code_actions_on_format": {
|
|
32
|
+
"source.fixAll.eslint": true
|
|
33
|
+
},
|
|
34
|
+
"formatter": {
|
|
35
|
+
"external": {
|
|
36
|
+
"command": "pnpm",
|
|
37
|
+
"arguments": ["exec", "prettier", "--stdin-filepath", "{buffer_path}"]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|