docs: add comprehensive Stripe billing guide
All checks were successful
Deploy to Production / Build and Deploy (push) Successful in 4s

Covers architecture, configuration steps, user flows, API routes,
webhooks, pricing, testing with Stripe CLI, production checklist,
and troubleshooting.
This commit is contained in:
Antigravity
2026-05-16 21:10:26 +00:00
parent aa12d2226f
commit bb75b2e763
36 changed files with 2099 additions and 735 deletions

View File

@@ -351,9 +351,9 @@ export const NoteCard = memo(function NoteCard({
refreshNotes(note?.notebookId)
if (!note.isPinned) {
toast.success(t('notes.pinned') || 'Note pinned')
toast.success(t('notes.pinned'))
} else {
toast.info(t('notes.unpinned') || 'Note unpinned')
toast.info(t('notes.unpinned'))
}
})
}
@@ -483,8 +483,8 @@ export const NoteCard = memo(function NoteCard({
{/* Drag Handle - Only visible on mobile/touch devices */}
<div
className="muuri-drag-handle absolute top-2 start-2 z-20 cursor-grab active:cursor-grabbing p-2 md:hidden"
aria-label={t('notes.dragToReorder') || 'Drag to reorder'}
title={t('notes.dragToReorder') || 'Drag to reorder'}
aria-label={t('notes.dragToReorder')}
title={t('notes.dragToReorder')}
>
<GripVertical className="h-5 w-5 text-muted-foreground" />
</div>
@@ -563,7 +563,7 @@ export const NoteCard = memo(function NoteCard({
<DropdownMenuSeparator />
<DropdownMenuItem className="text-muted-foreground" onSelect={() => onCreateSubNotebook?.()}>
<Plus className="h-4 w-4 me-2" />
{t('notebook.createSubNotebook') || 'Nouveau sous-carnet…'}
{t('notebook.createSubNotebook')}
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
@@ -605,7 +605,7 @@ export const NoteCard = memo(function NoteCard({
<button
onClick={handleRemoveFusedBadge}
className="ms-1 opacity-0 group-hover/badge:opacity-100 hover:opacity-100 transition-opacity"
title={t('notes.remove') || 'Remove'}
title={t('notes.remove')}
>
<Trash2 className="h-2.5 w-2.5" />
</button>
@@ -873,13 +873,13 @@ export const NoteCard = memo(function NoteCard({
<AlertDialogHeader>
<AlertDialogTitle>{t('notes.confirmDeleteTitle') || t('notes.delete')}</AlertDialogTitle>
<AlertDialogDescription>
{t('notes.confirmDelete') || 'Are you sure you want to delete this note?'}
{t('notes.confirmDelete')}
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>{t('common.cancel') || 'Cancel'}</AlertDialogCancel>
<AlertDialogCancel>{t('common.cancel')}</AlertDialogCancel>
<AlertDialogAction variant="destructive" onClick={handleDelete}>
{t('notes.delete') || 'Delete'}
{t('notes.delete')}
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>