Skip to content

Commit 7defd91

Browse files
committed
docs: update Ascent documentation to include Vue support and clarify tech stack options
1 parent e71b20f commit 7defd91

File tree

1 file changed

+153
-14
lines changed

1 file changed

+153
-14
lines changed

docs/boring-stack/ascent.md

Lines changed: 153 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ head:
55
content: https://docs.sailscasts.com/boring-stack-social.png
66
title: Ascent
77
titleTemplate: The Boring JavaScript Stack
8-
description: Ascent is a production-ready React SaaS template built on The Boring JavaScript Stack. Ship products with battle-tested technologies and focus on actual real users instead of wrestling with complex build tools.
8+
description: Ascent is a production-ready SaaS template built on The Boring JavaScript Stack. Available with React or Vue frontends. Ship products with battle-tested technologies and focus on actual real users instead of wrestling with complex build tools.
99
prev:
1010
text: Mellow
1111
link: '/boring-stack/mellow'
@@ -19,7 +19,7 @@ editLink: true
1919

2020
**Ship products with battle-tested technologies. Say no to chasing JavaScript trends.**
2121

22-
Ascent is a production-ready React SaaS template built on The Boring JavaScript Stack. Focus on shipping to actual real users instead of wrestling with complex build tools and trendy frameworks.
22+
Ascent is a production-ready SaaS template built on The Boring JavaScript Stack. Available with **React** or **Vue** frontends. Focus on shipping to actual real users instead of wrestling with complex build tools and trendy frameworks.
2323

2424
## The Boring Stack Philosophy
2525

@@ -40,12 +40,24 @@ Ascent is a production-ready React SaaS template built on The Boring JavaScript
4040

4141
### Frontend
4242

43+
Choose between React or Vue for your frontend:
44+
45+
#### React Frontend
46+
4347
- **[React 19](https://react.dev)** - Latest React with modern features and concurrent rendering
4448
- **[Inertia.js](https://inertiajs.com)** - Modern monolith approach eliminating API complexity
4549
- **[PrimeReact](https://primereact.org)** - 80+ production-ready UI components
4650
- **[Tailwind CSS](https://tailwindcss.com)** - Utility-first CSS framework for styling PrimeReact components
4751
- **[Rsbuild](https://rsbuild.dev)** - Fast build tool powered by Rspack (via Sails Shipwright)
4852

53+
#### Vue Frontend
54+
55+
- **[Vue 3](https://vuejs.org)** - Progressive JavaScript framework with Composition API
56+
- **[Inertia.js](https://inertiajs.com)** - Modern monolith approach eliminating API complexity
57+
- **[PrimeVue Volt](https://volt.primevue.org)** - 50+ fully customizable, accessible UI components powered by Unstyled PrimeVue and Tailwind CSS v4
58+
- **[Tailwind CSS v4](https://tailwindcss.com)** - Next-generation utility-first CSS framework
59+
- **[Rsbuild](https://rsbuild.dev)** - Fast build tool powered by Rspack (via Sails Shipwright)
60+
4961
### Development & Build Tools
5062

5163
- **[Sails Hook Shipwright](https://github.com/sailscastshq/sails-hook-shipwright)** - Modern asset pipeline with hot reload
@@ -63,8 +75,11 @@ Ascent is a production-ready React SaaS template built on The Boring JavaScript
6375
### Installation
6476

6577
```bash
66-
# Create new project with Ascent template
78+
# Create new project with Ascent template (React)
6779
npx create-sails@latest my-saas-app --react --ascent
80+
81+
# Or with Vue
82+
npx create-sails@latest my-saas-app --vue --ascent
6883
```
6984

7085
### Quick Start
@@ -137,11 +152,11 @@ Visit `http://localhost:1337` to see your application running!
137152
### UI/UX Features
138153

139154
- **Responsive Design** - Mobile-first responsive layouts
140-
- **PrimeReact + Tailwind** - Rich components styled with utility classes
141-
- **Toast Notifications** - User feedback with PrimeReact Toast
155+
- **Prime UI + Tailwind** - Rich components (PrimeReact or PrimeVue Volt) styled with utility classes
156+
- **Toast Notifications** - User feedback with Prime UI Toast components
142157
- **Loading States** - Comprehensive loading and error states
143158
- **Form Validation** - Client and server-side validation
144-
- **Accessibility** - WCAG-compliant components
159+
- **Accessibility** - WCAG AA compliant components
145160

146161
## Development Commands
147162

@@ -167,12 +182,14 @@ npx sails generate model Product
167182
npx sails generate helper format-date
168183
```
169184

170-
## PrimeReact + Tailwind Usage
185+
## Frontend Examples
171186

172-
Ascent combines PrimeReact's rich components with Tailwind's utility classes:
187+
Ascent combines Prime UI components with Tailwind's utility classes:
173188

174189
### Authentication Form Example
175190

191+
#### React Frontend
192+
176193
```jsx path=null start=null
177194
import { useForm } from '@inertiajs/react'
178195
import { Button } from 'primereact/button'
@@ -238,8 +255,74 @@ export default function LoginForm() {
238255
}
239256
```
240257

258+
#### Vue Frontend
259+
260+
```vue path=null start=null
261+
<script setup>
262+
import { useForm } from '@inertiajs/vue3'
263+
import Button from '@/components/button/Button.vue'
264+
import InputText from '@/components/inputtext/InputText.vue'
265+
import Password from '@/components/password/Password.vue'
266+
import Card from '@/components/card/Card.vue'
267+
268+
const form = useForm({
269+
emailAddress: '',
270+
password: ''
271+
})
272+
273+
function handleSubmit() {
274+
form.post('/login')
275+
}
276+
</script>
277+
278+
<template>
279+
<Card class="mx-auto mt-8 w-full max-w-md">
280+
<template #content>
281+
<form @submit.prevent="handleSubmit" class="space-y-6 p-6">
282+
<h2 class="text-center text-2xl font-bold text-gray-900">
283+
Welcome Back
284+
</h2>
285+
286+
<div class="space-y-4">
287+
<div>
288+
<InputText
289+
v-model="form.emailAddress"
290+
placeholder="Email address"
291+
:class="['w-full', { 'p-invalid': form.errors.emailAddress }]"
292+
/>
293+
<small v-if="form.errors.emailAddress" class="p-error block mt-1">
294+
{{ form.errors.emailAddress }}
295+
</small>
296+
</div>
297+
298+
<div>
299+
<Password
300+
v-model="form.password"
301+
placeholder="Password"
302+
:feedback="false"
303+
toggleMask
304+
class="w-full"
305+
/>
306+
</div>
307+
</div>
308+
309+
<Button
310+
type="submit"
311+
label="Sign In"
312+
class="w-full"
313+
:loading="form.processing"
314+
severity="info"
315+
/>
316+
</form>
317+
</template>
318+
</Card>
319+
</template>
320+
```
321+
241322
### Team Management Table
242323

324+
#### React Frontend
325+
243326
```jsx path=null start=null
244327
import { DataTable } from 'primereact/datatable'
245328
import { Column } from 'primereact/column'
@@ -283,6 +366,60 @@ export default function TeamMembers({ members }) {
283366
}
284367
```
285368

369+
#### Vue Frontend
370+
371+
```vue path=null start=null
372+
<script setup>
373+
import { router } from '@inertiajs/vue3'
374+
import DataTable from '@/components/datatable/DataTable.vue'
375+
import Column from '@/components/column/Column.vue'
376+
import Button from '@/components/button/Button.vue'
377+
import Tag from '@/components/tag/Tag.vue'
378+
379+
defineProps({
380+
members: Array
381+
})
382+
383+
function removeMember(memberId) {
384+
router.delete(`/team/members/${memberId}`)
385+
}
386+
</script>
387+
388+
<template>
389+
<div class="bg-white rounded-lg border">
390+
<DataTable
391+
:value="members"
392+
class="text-sm"
393+
stripedRows
394+
responsiveLayout="scroll"
395+
>
396+
<Column field="user.fullName" header="Name" />
397+
<Column field="user.emailAddress" header="Email" />
398+
<Column header="Role">
399+
<template #body="{ data }">
400+
<Tag
401+
:value="data.role"
402+
:severity="data.role === 'owner' ? 'success' : 'info'"
403+
class="text-xs"
404+
/>
405+
</template>
406+
</Column>
407+
<Column header="Actions">
408+
<template #body="{ data }">
409+
<Button
410+
icon="pi pi-trash"
411+
severity="danger"
412+
text
413+
size="small"
414+
@click="removeMember(data.id)"
415+
/>
416+
</template>
417+
</Column>
418+
</DataTable>
419+
</div>
420+
</template>
421+
```
422+
286423
## Project Structure
287424

288425
```
@@ -292,11 +429,11 @@ my-saas-app/
292429
│ ├── models/ # Database models (User, Team, etc.)
293430
│ ├── helpers/ # Reusable business logic
294431
│ └── policies/ # Authorization middleware
295-
├── assets/js/ # React frontend
432+
├── assets/js/ # Frontend (React or Vue)
296433
│ ├── components/ # Reusable UI components
297434
│ ├── pages/ # Inertia.js pages
298435
│ ├── layouts/ # App layouts
299-
│ └── hooks/ # Custom React hooks
436+
│ └── hooks/ # Custom hooks (React) or composables (Vue)
300437
├── config/ # Sails.js configuration
301438
├── views/ # Email templates
302439
├── content/ # Blog and static content
@@ -368,7 +505,7 @@ Ascent includes a comprehensive `WARP.md` file that provides [Warp](https://warp
368505

369506
### What's in WARP.md
370507

371-
- **Project Architecture** - Complete overview of Sails.js + React + PrimeReact structure
508+
- **Project Architecture** - Complete overview of Sails.js + React/Vue + Prime UI structure
372509
- **Development Patterns** - Established conventions for controllers, models, and components
373510
- **Configuration Guidelines** - Environment setup and deployment patterns
374511
- **Code Examples** - Working patterns for authentication, teams, billing, and more
@@ -383,13 +520,13 @@ With the included WARP.md file, you can ask Warp AI to:
383520
- **Build team management features** that integrate seamlessly
384521
- **Add billing integrations** using your existing Lemon Squeezy setup
385522
- **Debug issues** with understanding of your specific architecture
386-
- **Refactor components** while maintaining PrimeReact + Tailwind patterns
523+
- **Refactor components** while maintaining Prime UI + Tailwind patterns
387524

388525
### Getting Started with Warp
389526

390527
1. **Open your project in [Warp](https://warp.dev)**
391528
2. **Reference the WARP.md file** when asking questions or requesting code generation
392-
3. **Ask context-specific questions** about your Sails.js + React architecture
529+
3. **Ask context-specific questions** about your Sails.js + React/Vue architecture
393530
4. **Request customizations** that follow your established patterns
394531

395532
Example prompts:
@@ -407,5 +544,7 @@ This approach ensures that AI-generated code integrates seamlessly with your exi
407544
- **[Authentication Guide](/boring-stack/authentication)** - Authentication patterns
408545
- **[Sails.js Documentation](https://sailsjs.com/documentation)** - Backend framework guide
409546
- **[Inertia.js Guide](https://inertiajs.com)** - Modern monolith approach
410-
- **[PrimeReact Components](https://primereact.org)** - UI component library
547+
- **[PrimeReact Components](https://primereact.org)** - React UI component library
548+
- **[PrimeVue Volt Components](https://volt.primevue.org)** - Vue UI component library with Tailwind v4
411549
- **[React 19 Documentation](https://react.dev)** - Latest React features
550+
- **[Vue 3 Documentation](https://vuejs.org)** - Progressive JavaScript framework

0 commit comments

Comments
 (0)