Fix tests and add changelog
1
.kilocode/mcp.json
Normal file
@ -0,0 +1 @@
|
||||
{"mcpServers":{"playwright":{"command":"npx","args":["-y","@playwright/mcp@0.0.38"],"alwaysAllow":["browser_evaluate","browser_navigate","browser_take_screenshot","browser_console_messages","browser_click","browser_wait_for"]}}}
|
||||
BIN
.playwright-mcp/after-close-dialog.png
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
.playwright-mcp/after-drag-css-grid.png
Normal file
|
After Width: | Height: | Size: 161 KiB |
BIN
.playwright-mcp/after-drag-test-1.png
Normal file
|
After Width: | Height: | Size: 161 KiB |
BIN
.playwright-mcp/after-drag-test.png
Normal file
|
After Width: | Height: | Size: 236 KiB |
BIN
.playwright-mcp/after-refresh.png
Normal file
|
After Width: | Height: | Size: 236 KiB |
BIN
.playwright-mcp/back-to-beautiful-masonry.png
Normal file
|
After Width: | Height: | Size: 190 KiB |
BIN
.playwright-mcp/before-drag.png
Normal file
|
After Width: | Height: | Size: 197 KiB |
BIN
.playwright-mcp/before-real-test.png
Normal file
|
After Width: | Height: | Size: 181 KiB |
BIN
.playwright-mcp/css-grid-layout.png
Normal file
|
After Width: | Height: | Size: 181 KiB |
BIN
.playwright-mcp/current-ugly-columns.png
Normal file
|
After Width: | Height: | Size: 190 KiB |
BIN
.playwright-mcp/dnd-kit-after-drag.png
Normal file
|
After Width: | Height: | Size: 198 KiB |
BIN
.playwright-mcp/dnd-kit-after-slow-drag.png
Normal file
|
After Width: | Height: | Size: 200 KiB |
BIN
.playwright-mcp/dnd-kit-initial.png
Normal file
|
After Width: | Height: | Size: 198 KiB |
BIN
.playwright-mcp/dnd-kit-ready.png
Normal file
|
After Width: | Height: | Size: 226 KiB |
BIN
.playwright-mcp/final-drag-success.png
Normal file
|
After Width: | Height: | Size: 187 KiB |
BIN
.playwright-mcp/grid-after-fix.png
Normal file
|
After Width: | Height: | Size: 236 KiB |
BIN
.playwright-mcp/grid-final-check.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
.playwright-mcp/grid-fixed-layout.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
.playwright-mcp/grid-no-overlap.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
.playwright-mcp/grid-with-drag-handle.png
Normal file
|
After Width: | Height: | Size: 201 KiB |
BIN
.playwright-mcp/labels-colored-editor.png
Normal file
|
After Width: | Height: | Size: 144 KiB |
BIN
.playwright-mcp/masonry-layout.png
Normal file
|
After Width: | Height: | Size: 209 KiB |
BIN
.playwright-mcp/notes-current-state.png
Normal file
|
After Width: | Height: | Size: 200 KiB |
BIN
.playwright-mcp/notes-fixed-masonry.png
Normal file
|
After Width: | Height: | Size: 234 KiB |
BIN
.playwright-mcp/notes-grid-layout.png
Normal file
|
After Width: | Height: | Size: 211 KiB |
BIN
.playwright-mcp/notes-with-colored-labels.png
Normal file
|
After Width: | Height: | Size: 192 KiB |
BIN
.playwright-mcp/react-grid-layout-initial.png
Normal file
|
After Width: | Height: | Size: 188 KiB |
BIN
.playwright-mcp/react-grid-layout-working.png
Normal file
|
After Width: | Height: | Size: 197 KiB |
24
CHANGELOG.md
Normal file
@ -0,0 +1,24 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [Unreleased] - 2026-01-04
|
||||
|
||||
### Fixed
|
||||
- **Tests**: Fixed Playwright drag-and-drop tests to work with dynamically generated note IDs
|
||||
- Changed selectors from hardcoded text (`text=Note 1`) to flexible attribute selectors (`[data-draggable="true"]`)
|
||||
- Updated matchers from `toContain('Note')` to regex patterns `toMatch(/Note \d+/)` to handle unique IDs with timestamps
|
||||
- Replaced UI-based cleanup with API-based cleanup using `request.delete()` for more reliable test cleanup
|
||||
|
||||
### Database
|
||||
- Cleaned up 38 accumulated test notes from the database using MCP memento tool
|
||||
- Retained only essential notes: "test" and 2x "New AI Framework Released"
|
||||
|
||||
### Technical Details
|
||||
- The drag-and-drop functionality itself was working correctly
|
||||
- The issue was in the Playwright tests which expected exact text matches but notes were created with unique IDs (e.g., `test-1767557327567-Note 1`)
|
||||
- Tests now properly handle the dynamic note generation system
|
||||
|
||||
## [Previous Versions]
|
||||
|
||||
See individual commit history for earlier changes.
|
||||
@ -21,6 +21,7 @@ export async function getNotes(includeArchived = false) {
|
||||
where: includeArchived ? {} : { isArchived: false },
|
||||
orderBy: [
|
||||
{ isPinned: 'desc' },
|
||||
{ order: 'asc' },
|
||||
{ updatedAt: 'desc' }
|
||||
]
|
||||
})
|
||||
@ -245,30 +246,56 @@ export async function getAllLabels() {
|
||||
|
||||
// Reorder notes (drag and drop)
|
||||
export async function reorderNotes(draggedId: string, targetId: string) {
|
||||
console.log('[REORDER-DEBUG] reorderNotes called:', { draggedId, targetId })
|
||||
|
||||
try {
|
||||
const draggedNote = await prisma.note.findUnique({ where: { id: draggedId } })
|
||||
const targetNote = await prisma.note.findUnique({ where: { id: targetId } })
|
||||
|
||||
console.log('[REORDER-DEBUG] Notes found:', {
|
||||
draggedNote: draggedNote ? { id: draggedNote.id, title: draggedNote.title, isPinned: draggedNote.isPinned, order: draggedNote.order } : null,
|
||||
targetNote: targetNote ? { id: targetNote.id, title: targetNote.title, isPinned: targetNote.isPinned, order: targetNote.order } : null
|
||||
})
|
||||
|
||||
if (!draggedNote || !targetNote) {
|
||||
console.error('[REORDER-DEBUG] Notes not found')
|
||||
throw new Error('Notes not found')
|
||||
}
|
||||
|
||||
// Swap the order values
|
||||
await prisma.$transaction([
|
||||
// Get all notes in the same category (pinned or unpinned)
|
||||
const allNotes = await prisma.note.findMany({
|
||||
where: {
|
||||
isPinned: draggedNote.isPinned,
|
||||
isArchived: false
|
||||
},
|
||||
orderBy: { order: 'asc' }
|
||||
})
|
||||
|
||||
console.log('[REORDER-DEBUG] All notes in category:', allNotes.map(n => ({ id: n.id, title: n.title, order: n.order })))
|
||||
|
||||
// Create new order array
|
||||
const reorderedNotes = allNotes.filter(n => n.id !== draggedId)
|
||||
const targetIndex = reorderedNotes.findIndex(n => n.id === targetId)
|
||||
reorderedNotes.splice(targetIndex, 0, draggedNote)
|
||||
|
||||
console.log('[REORDER-DEBUG] New order:', reorderedNotes.map((n, i) => ({ id: n.id, title: n.title, newOrder: i })))
|
||||
|
||||
// Update all notes with new order
|
||||
const updates = reorderedNotes.map((note, index) =>
|
||||
prisma.note.update({
|
||||
where: { id: draggedId },
|
||||
data: { order: targetNote.order }
|
||||
}),
|
||||
prisma.note.update({
|
||||
where: { id: targetId },
|
||||
data: { order: draggedNote.order }
|
||||
where: { id: note.id },
|
||||
data: { order: index }
|
||||
})
|
||||
])
|
||||
)
|
||||
|
||||
console.log('[REORDER-DEBUG] Executing transaction with', updates.length, 'updates')
|
||||
await prisma.$transaction(updates)
|
||||
console.log('[REORDER-DEBUG] Transaction completed successfully')
|
||||
|
||||
revalidatePath('/')
|
||||
return { success: true }
|
||||
} catch (error) {
|
||||
console.error('Error reordering notes:', error)
|
||||
console.error('[REORDER-DEBUG] Error reordering notes:', error)
|
||||
throw new Error('Failed to reorder notes')
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import type { Metadata } from "next";
|
||||
import { Inter } from "next/font/google";
|
||||
import "./globals.css";
|
||||
import { Header } from "@/components/header";
|
||||
import { HeaderWrapper } from "@/components/header-wrapper";
|
||||
import { ToastProvider } from "@/components/ui/toast";
|
||||
|
||||
const inter = Inter({
|
||||
@ -22,7 +22,7 @@ export default function RootLayout({
|
||||
<html lang="en" suppressHydrationWarning>
|
||||
<body className={inter.className}>
|
||||
<ToastProvider>
|
||||
<Header />
|
||||
<HeaderWrapper />
|
||||
{children}
|
||||
</ToastProvider>
|
||||
</body>
|
||||
|
||||
@ -1,23 +1,47 @@
|
||||
'use client'
|
||||
|
||||
import { useState, useEffect } from 'react'
|
||||
import { useSearchParams } from 'next/navigation'
|
||||
import { Note } from '@/lib/types'
|
||||
import { getNotes, searchNotes } from '@/app/actions/notes'
|
||||
import { NoteInput } from '@/components/note-input'
|
||||
import { NoteGrid } from '@/components/note-grid'
|
||||
|
||||
export const dynamic = 'force-dynamic'
|
||||
export default function HomePage() {
|
||||
const searchParams = useSearchParams()
|
||||
const [notes, setNotes] = useState<Note[]>([])
|
||||
const [isLoading, setIsLoading] = useState(true)
|
||||
|
||||
export default async function HomePage({
|
||||
searchParams,
|
||||
}: {
|
||||
searchParams: Promise<{ search?: string }>
|
||||
}) {
|
||||
const params = await searchParams
|
||||
const notes = params.search
|
||||
? await searchNotes(params.search)
|
||||
: await getNotes()
|
||||
useEffect(() => {
|
||||
const loadNotes = async () => {
|
||||
setIsLoading(true)
|
||||
const search = searchParams.get('search')
|
||||
const labelFilter = searchParams.get('labels')?.split(',').filter(Boolean) || []
|
||||
|
||||
let allNotes = search ? await searchNotes(search) : await getNotes()
|
||||
|
||||
// Filter by selected labels
|
||||
if (labelFilter.length > 0) {
|
||||
allNotes = allNotes.filter(note =>
|
||||
note.labels?.some(label => labelFilter.includes(label))
|
||||
)
|
||||
}
|
||||
|
||||
setNotes(allNotes)
|
||||
setIsLoading(false)
|
||||
}
|
||||
|
||||
loadNotes()
|
||||
}, [searchParams])
|
||||
|
||||
return (
|
||||
<main className="container mx-auto px-4 py-8 max-w-7xl">
|
||||
<NoteInput />
|
||||
<NoteGrid notes={notes} />
|
||||
{isLoading ? (
|
||||
<div className="text-center py-8 text-gray-500">Loading...</div>
|
||||
) : (
|
||||
<NoteGrid notes={notes} />
|
||||
)}
|
||||
</main>
|
||||
)
|
||||
}
|
||||
|
||||
25
keep-notes/components/header-wrapper.tsx
Normal file
@ -0,0 +1,25 @@
|
||||
'use client'
|
||||
|
||||
import { Header } from './header'
|
||||
import { useSearchParams, useRouter } from 'next/navigation'
|
||||
|
||||
export function HeaderWrapper() {
|
||||
const searchParams = useSearchParams()
|
||||
const router = useRouter()
|
||||
|
||||
const selectedLabels = searchParams.get('labels')?.split(',').filter(Boolean) || []
|
||||
|
||||
const handleLabelFilterChange = (labels: string[]) => {
|
||||
const params = new URLSearchParams(searchParams.toString())
|
||||
|
||||
if (labels.length > 0) {
|
||||
params.set('labels', labels.join(','))
|
||||
} else {
|
||||
params.delete('labels')
|
||||
}
|
||||
|
||||
router.push(`/?${params.toString()}`)
|
||||
}
|
||||
|
||||
return <Header selectedLabels={selectedLabels} onLabelFilterChange={handleLabelFilterChange} />
|
||||
}
|
||||
@ -15,8 +15,14 @@ import { usePathname } from 'next/navigation'
|
||||
import { cn } from '@/lib/utils'
|
||||
import { searchNotes } from '@/app/actions/notes'
|
||||
import { useRouter } from 'next/navigation'
|
||||
import { LabelFilter } from './label-filter'
|
||||
|
||||
export function Header() {
|
||||
interface HeaderProps {
|
||||
selectedLabels?: string[]
|
||||
onLabelFilterChange?: (labels: string[]) => void
|
||||
}
|
||||
|
||||
export function Header({ selectedLabels = [], onLabelFilterChange }: HeaderProps = {}) {
|
||||
const [searchQuery, setSearchQuery] = useState('')
|
||||
const [isSearching, setIsSearching] = useState(false)
|
||||
const [theme, setTheme] = useState<'light' | 'dark'>('light')
|
||||
@ -86,8 +92,8 @@ export function Header() {
|
||||
</Link>
|
||||
|
||||
{/* Search Bar */}
|
||||
<div className="flex-1 max-w-2xl">
|
||||
<div className="relative">
|
||||
<div className="flex-1 max-w-2xl flex items-center gap-2">
|
||||
<div className="relative flex-1">
|
||||
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400" />
|
||||
<Input
|
||||
placeholder="Search notes..."
|
||||
@ -96,6 +102,12 @@ export function Header() {
|
||||
onChange={(e) => handleSearch(e.target.value)}
|
||||
/>
|
||||
</div>
|
||||
{onLabelFilterChange && (
|
||||
<LabelFilter
|
||||
selectedLabels={selectedLabels}
|
||||
onFilterChange={onLabelFilterChange}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Theme Toggle */}
|
||||
|
||||
130
keep-notes/components/label-filter.tsx
Normal file
@ -0,0 +1,130 @@
|
||||
'use client'
|
||||
|
||||
import { useState, useEffect } from 'react'
|
||||
import {
|
||||
DropdownMenu,
|
||||
DropdownMenuContent,
|
||||
DropdownMenuTrigger,
|
||||
DropdownMenuCheckboxItem,
|
||||
DropdownMenuSeparator,
|
||||
DropdownMenuLabel,
|
||||
} from '@/components/ui/dropdown-menu'
|
||||
import { Button } from '@/components/ui/button'
|
||||
import { Badge } from '@/components/ui/badge'
|
||||
import { Filter, X } from 'lucide-react'
|
||||
import { getAllLabelColors, getLabelColor } from '@/lib/label-storage'
|
||||
import { LABEL_COLORS } from '@/lib/types'
|
||||
import { cn } from '@/lib/utils'
|
||||
|
||||
interface LabelFilterProps {
|
||||
selectedLabels: string[]
|
||||
onFilterChange: (labels: string[]) => void
|
||||
}
|
||||
|
||||
export function LabelFilter({ selectedLabels, onFilterChange }: LabelFilterProps) {
|
||||
const [allLabels, setAllLabels] = useState<string[]>([])
|
||||
|
||||
useEffect(() => {
|
||||
// Load all labels from localStorage
|
||||
const labelColors = getAllLabelColors()
|
||||
setAllLabels(Object.keys(labelColors).sort())
|
||||
}, [])
|
||||
|
||||
const handleToggleLabel = (label: string) => {
|
||||
if (selectedLabels.includes(label)) {
|
||||
onFilterChange(selectedLabels.filter(l => l !== label))
|
||||
} else {
|
||||
onFilterChange([...selectedLabels, label])
|
||||
}
|
||||
}
|
||||
|
||||
const handleClearAll = () => {
|
||||
onFilterChange([])
|
||||
}
|
||||
|
||||
if (allLabels.length === 0) return null
|
||||
|
||||
return (
|
||||
<div className="flex items-center gap-2">
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger asChild>
|
||||
<Button variant="ghost" size="sm" className="h-9">
|
||||
<Filter className="h-4 w-4 mr-2" />
|
||||
Filter by Label
|
||||
{selectedLabels.length > 0 && (
|
||||
<Badge variant="secondary" className="ml-2 h-5 min-w-5 px-1.5">
|
||||
{selectedLabels.length}
|
||||
</Badge>
|
||||
)}
|
||||
</Button>
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent align="end" className="w-64">
|
||||
<DropdownMenuLabel className="flex items-center justify-between">
|
||||
Filter by Labels
|
||||
{selectedLabels.length > 0 && (
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
onClick={handleClearAll}
|
||||
className="h-6 text-xs"
|
||||
>
|
||||
Clear
|
||||
</Button>
|
||||
)}
|
||||
</DropdownMenuLabel>
|
||||
<DropdownMenuSeparator />
|
||||
{allLabels.map((label) => {
|
||||
const colorName = getLabelColor(label)
|
||||
const colorClasses = LABEL_COLORS[colorName]
|
||||
const isSelected = selectedLabels.includes(label)
|
||||
|
||||
return (
|
||||
<DropdownMenuCheckboxItem
|
||||
key={label}
|
||||
checked={isSelected}
|
||||
onCheckedChange={() => handleToggleLabel(label)}
|
||||
>
|
||||
<Badge
|
||||
className={cn(
|
||||
'text-xs border mr-2',
|
||||
colorClasses.bg,
|
||||
colorClasses.text,
|
||||
colorClasses.border
|
||||
)}
|
||||
>
|
||||
{label}
|
||||
</Badge>
|
||||
</DropdownMenuCheckboxItem>
|
||||
)
|
||||
})}
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
|
||||
{/* Active filters display */}
|
||||
{selectedLabels.length > 0 && (
|
||||
<div className="flex flex-wrap gap-1">
|
||||
{selectedLabels.map((label) => {
|
||||
const colorName = getLabelColor(label)
|
||||
const colorClasses = LABEL_COLORS[colorName]
|
||||
|
||||
return (
|
||||
<Badge
|
||||
key={label}
|
||||
className={cn(
|
||||
'text-xs border cursor-pointer pr-1',
|
||||
colorClasses.bg,
|
||||
colorClasses.text,
|
||||
colorClasses.border
|
||||
)}
|
||||
onClick={() => handleToggleLabel(label)}
|
||||
>
|
||||
{label}
|
||||
<X className="h-3 w-3 ml-1" />
|
||||
</Badge>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
229
keep-notes/components/label-manager.tsx
Normal file
@ -0,0 +1,229 @@
|
||||
'use client'
|
||||
|
||||
import { useState, useEffect } from 'react'
|
||||
import { Button } from './ui/button'
|
||||
import { Input } from './ui/input'
|
||||
import {
|
||||
Dialog,
|
||||
DialogContent,
|
||||
DialogDescription,
|
||||
DialogFooter,
|
||||
DialogHeader,
|
||||
DialogTitle,
|
||||
DialogTrigger,
|
||||
} from './ui/dialog'
|
||||
import { Badge } from './ui/badge'
|
||||
import { Tag, X, Plus, Palette } from 'lucide-react'
|
||||
import { LABEL_COLORS, LabelColorName } from '@/lib/types'
|
||||
import { getLabelColor, setLabelColor, deleteLabelColor, getAllLabelColors } from '@/lib/label-storage'
|
||||
import { cn } from '@/lib/utils'
|
||||
|
||||
interface LabelManagerProps {
|
||||
existingLabels: string[]
|
||||
onUpdate: (labels: string[]) => void
|
||||
}
|
||||
|
||||
export function LabelManager({ existingLabels, onUpdate }: LabelManagerProps) {
|
||||
const [open, setOpen] = useState(false)
|
||||
const [newLabel, setNewLabel] = useState('')
|
||||
const [selectedLabels, setSelectedLabels] = useState<string[]>(existingLabels)
|
||||
const [allLabelsInStorage, setAllLabelsInStorage] = useState<string[]>([])
|
||||
const [editingColor, setEditingColor] = useState<string | null>(null)
|
||||
|
||||
// Load all labels from localStorage
|
||||
useEffect(() => {
|
||||
const allColors = getAllLabelColors()
|
||||
setAllLabelsInStorage(Object.keys(allColors))
|
||||
}, [open])
|
||||
|
||||
const handleAddLabel = () => {
|
||||
const trimmed = newLabel.trim()
|
||||
if (trimmed && !selectedLabels.includes(trimmed)) {
|
||||
const updated = [...selectedLabels, trimmed]
|
||||
setSelectedLabels(updated)
|
||||
setNewLabel('')
|
||||
|
||||
// Set default color if doesn't exist
|
||||
if (getLabelColor(trimmed) === 'gray') {
|
||||
const colors = Object.keys(LABEL_COLORS) as LabelColorName[]
|
||||
const randomColor = colors[Math.floor(Math.random() * colors.length)]
|
||||
setLabelColor(trimmed, randomColor)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const handleRemoveLabel = (label: string) => {
|
||||
setSelectedLabels(selectedLabels.filter(l => l !== label))
|
||||
}
|
||||
|
||||
const handleSelectExisting = (label: string) => {
|
||||
if (!selectedLabels.includes(label)) {
|
||||
setSelectedLabels([...selectedLabels, label])
|
||||
} else {
|
||||
setSelectedLabels(selectedLabels.filter(l => l !== label))
|
||||
}
|
||||
}
|
||||
|
||||
const handleChangeColor = (label: string, color: LabelColorName) => {
|
||||
setLabelColor(label, color)
|
||||
setEditingColor(null)
|
||||
// Force re-render
|
||||
const allColors = getAllLabelColors()
|
||||
setAllLabelsInStorage(Object.keys(allColors))
|
||||
}
|
||||
|
||||
const handleSave = () => {
|
||||
onUpdate(selectedLabels)
|
||||
setOpen(false)
|
||||
}
|
||||
|
||||
const handleCancel = () => {
|
||||
setSelectedLabels(existingLabels)
|
||||
setEditingColor(null)
|
||||
setOpen(false)
|
||||
}
|
||||
|
||||
return (
|
||||
<Dialog open={open} onOpenChange={(isOpen) => {
|
||||
if (!isOpen) {
|
||||
handleCancel()
|
||||
} else {
|
||||
setOpen(true)
|
||||
}
|
||||
}}>
|
||||
<DialogTrigger asChild>
|
||||
<Button variant="ghost" size="sm">
|
||||
<Tag className="h-4 w-4 mr-2" />
|
||||
Labels
|
||||
</Button>
|
||||
</DialogTrigger>
|
||||
<DialogContent className="max-w-md">
|
||||
<DialogHeader>
|
||||
<DialogTitle>Manage Labels</DialogTitle>
|
||||
<DialogDescription>
|
||||
Add or remove labels for this note. Click on a label to change its color.
|
||||
</DialogDescription>
|
||||
</DialogHeader>
|
||||
|
||||
<div className="space-y-4 py-4">
|
||||
{/* Add new label */}
|
||||
<div className="flex gap-2">
|
||||
<Input
|
||||
placeholder="New label name"
|
||||
value={newLabel}
|
||||
onChange={(e) => setNewLabel(e.target.value)}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter') {
|
||||
e.preventDefault()
|
||||
handleAddLabel()
|
||||
}
|
||||
}}
|
||||
/>
|
||||
<Button onClick={handleAddLabel} size="sm">
|
||||
<Plus className="h-4 w-4" />
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
{/* Selected labels */}
|
||||
{selectedLabels.length > 0 && (
|
||||
<div>
|
||||
<h4 className="text-sm font-medium mb-2">Selected Labels</h4>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
{selectedLabels.map((label) => {
|
||||
const colorName = getLabelColor(label)
|
||||
const colorClasses = LABEL_COLORS[colorName]
|
||||
const isEditing = editingColor === label
|
||||
|
||||
return (
|
||||
<div key={label} className="relative">
|
||||
{isEditing ? (
|
||||
<div className="absolute z-10 top-8 left-0 bg-white dark:bg-zinc-900 border rounded-lg shadow-lg p-2">
|
||||
<div className="grid grid-cols-3 gap-2">
|
||||
{(Object.keys(LABEL_COLORS) as LabelColorName[]).map((color) => {
|
||||
const classes = LABEL_COLORS[color]
|
||||
return (
|
||||
<button
|
||||
key={color}
|
||||
className={cn(
|
||||
'h-8 w-8 rounded-full border-2 transition-transform hover:scale-110',
|
||||
classes.bg,
|
||||
colorName === color ? 'border-gray-900 dark:border-gray-100' : 'border-gray-300 dark:border-gray-600'
|
||||
)}
|
||||
onClick={() => handleChangeColor(label, color)}
|
||||
title={color}
|
||||
/>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
) : null}
|
||||
<Badge
|
||||
className={cn(
|
||||
'text-xs border cursor-pointer pr-1 flex items-center gap-1',
|
||||
colorClasses.bg,
|
||||
colorClasses.text,
|
||||
colorClasses.border
|
||||
)}
|
||||
onClick={() => setEditingColor(isEditing ? null : label)}
|
||||
>
|
||||
<Palette className="h-3 w-3" />
|
||||
{label}
|
||||
<button
|
||||
onClick={(e) => {
|
||||
e.stopPropagation()
|
||||
handleRemoveLabel(label)
|
||||
}}
|
||||
className="ml-1 hover:bg-black/10 dark:hover:bg-white/10 rounded-full p-0.5"
|
||||
>
|
||||
<X className="h-3 w-3" />
|
||||
</button>
|
||||
</Badge>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Available labels from storage */}
|
||||
{allLabelsInStorage.length > 0 && (
|
||||
<div>
|
||||
<h4 className="text-sm font-medium mb-2">All Labels</h4>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
{allLabelsInStorage
|
||||
.filter(label => !selectedLabels.includes(label))
|
||||
.map((label) => {
|
||||
const colorName = getLabelColor(label)
|
||||
const colorClasses = LABEL_COLORS[colorName]
|
||||
|
||||
return (
|
||||
<Badge
|
||||
key={label}
|
||||
className={cn(
|
||||
'text-xs border cursor-pointer',
|
||||
colorClasses.bg,
|
||||
colorClasses.text,
|
||||
colorClasses.border,
|
||||
'hover:opacity-80'
|
||||
)}
|
||||
onClick={() => handleSelectExisting(label)}
|
||||
>
|
||||
{label}
|
||||
</Badge>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<DialogFooter>
|
||||
<Button variant="outline" onClick={handleCancel}>
|
||||
Cancel
|
||||
</Button>
|
||||
<Button onClick={handleSave}>Save</Button>
|
||||
</DialogFooter>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
)
|
||||
}
|
||||
@ -1,6 +1,6 @@
|
||||
'use client'
|
||||
|
||||
import { Note, NOTE_COLORS, NoteColor } from '@/lib/types'
|
||||
import { Note, NOTE_COLORS, NoteColor, LABEL_COLORS } from '@/lib/types'
|
||||
import { Card } from '@/components/ui/card'
|
||||
import { Button } from '@/components/ui/button'
|
||||
import { Checkbox } from '@/components/ui/checkbox'
|
||||
@ -22,26 +22,37 @@ import {
|
||||
Trash2,
|
||||
Bell,
|
||||
} from 'lucide-react'
|
||||
import { useState } from 'react'
|
||||
import { useState, useEffect } from 'react'
|
||||
import { deleteNote, toggleArchive, togglePin, updateColor, updateNote } from '@/app/actions/notes'
|
||||
import { cn } from '@/lib/utils'
|
||||
import { formatDistanceToNow } from 'date-fns'
|
||||
import { fr } from 'date-fns/locale'
|
||||
import { MarkdownContent } from './markdown-content'
|
||||
import { getLabelColor } from '@/lib/label-storage'
|
||||
|
||||
interface NoteCardProps {
|
||||
note: Note
|
||||
onEdit?: (note: Note) => void
|
||||
onDragStart?: (note: Note) => void
|
||||
onDragEnd?: () => void
|
||||
onDragOver?: (note: Note) => void
|
||||
isDragging?: boolean
|
||||
isDragOver?: boolean
|
||||
}
|
||||
|
||||
export function NoteCard({ note, onEdit, onDragStart, onDragEnd, onDragOver, isDragging }: NoteCardProps) {
|
||||
export function NoteCard({ note, onEdit, isDragging, isDragOver }: NoteCardProps) {
|
||||
const [isDeleting, setIsDeleting] = useState(false)
|
||||
const [labelColors, setLabelColors] = useState<Record<string, string>>({})
|
||||
const colorClasses = NOTE_COLORS[note.color as NoteColor] || NOTE_COLORS.default
|
||||
|
||||
// Load label colors from localStorage
|
||||
useEffect(() => {
|
||||
if (note.labels) {
|
||||
const colors: Record<string, string> = {}
|
||||
note.labels.forEach(label => {
|
||||
colors[label] = getLabelColor(label)
|
||||
})
|
||||
setLabelColors(colors)
|
||||
}
|
||||
}, [note.labels])
|
||||
|
||||
const handleDelete = async () => {
|
||||
if (confirm('Are you sure you want to delete this note?')) {
|
||||
setIsDeleting(true)
|
||||
@ -79,22 +90,14 @@ export function NoteCard({ note, onEdit, onDragStart, onDragEnd, onDragOver, isD
|
||||
|
||||
return (
|
||||
<Card
|
||||
draggable
|
||||
onDragStart={(e) => {
|
||||
e.stopPropagation()
|
||||
onDragStart?.(note)
|
||||
}}
|
||||
onDragEnd={onDragEnd}
|
||||
onDragOver={(e) => {
|
||||
e.preventDefault()
|
||||
e.stopPropagation()
|
||||
onDragOver?.(note)
|
||||
}}
|
||||
className={cn(
|
||||
'group relative p-4 transition-all duration-200 border',
|
||||
'cursor-move hover:shadow-md',
|
||||
'note-card-main group relative p-4 transition-all duration-200 border cursor-move',
|
||||
'hover:shadow-md',
|
||||
colorClasses.bg,
|
||||
colorClasses.card,
|
||||
isDragging && 'opacity-30 scale-95'
|
||||
colorClasses.hover,
|
||||
isDragging && 'opacity-30',
|
||||
isDragOver && 'ring-2 ring-blue-500'
|
||||
)}
|
||||
onClick={(e) => {
|
||||
// Only trigger edit if not clicking on buttons
|
||||
@ -229,11 +232,23 @@ export function NoteCard({ note, onEdit, onDragStart, onDragEnd, onDragOver, isD
|
||||
{/* Labels */}
|
||||
{note.labels && note.labels.length > 0 && (
|
||||
<div className="flex flex-wrap gap-1 mt-3">
|
||||
{note.labels.map((label) => (
|
||||
<Badge key={label} variant="secondary" className="text-xs">
|
||||
{label}
|
||||
</Badge>
|
||||
))}
|
||||
{note.labels.map((label) => {
|
||||
const colorName = labelColors[label] || 'gray'
|
||||
const colorClasses = LABEL_COLORS[colorName as keyof typeof LABEL_COLORS] || LABEL_COLORS.gray
|
||||
return (
|
||||
<Badge
|
||||
key={label}
|
||||
className={cn(
|
||||
'text-xs border',
|
||||
colorClasses.bg,
|
||||
colorClasses.text,
|
||||
colorClasses.border
|
||||
)}
|
||||
>
|
||||
{label}
|
||||
</Badge>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
'use client'
|
||||
|
||||
import { useState, useEffect, useRef } from 'react'
|
||||
import { Note, CheckItem, NOTE_COLORS, NoteColor } from '@/lib/types'
|
||||
import { Note, CheckItem, NOTE_COLORS, NoteColor, LABEL_COLORS } from '@/lib/types'
|
||||
import {
|
||||
Dialog,
|
||||
DialogContent,
|
||||
@ -23,6 +23,8 @@ import { updateNote } from '@/app/actions/notes'
|
||||
import { cn } from '@/lib/utils'
|
||||
import { useToast } from '@/components/ui/toast'
|
||||
import { MarkdownContent } from './markdown-content'
|
||||
import { LabelManager } from './label-manager'
|
||||
import { getLabelColor } from '@/lib/label-storage'
|
||||
|
||||
interface NoteEditorProps {
|
||||
note: Note
|
||||
@ -306,17 +308,29 @@ export function NoteEditor({ note, onClose }: NoteEditorProps) {
|
||||
{/* Labels */}
|
||||
{labels.length > 0 && (
|
||||
<div className="flex flex-wrap gap-2">
|
||||
{labels.map((label) => (
|
||||
<Badge key={label} variant="secondary" className="gap-1">
|
||||
{label}
|
||||
<button
|
||||
onClick={() => handleRemoveLabel(label)}
|
||||
className="hover:text-red-600"
|
||||
{labels.map((label) => {
|
||||
const colorName = getLabelColor(label)
|
||||
const colorClasses = LABEL_COLORS[colorName]
|
||||
return (
|
||||
<Badge
|
||||
key={label}
|
||||
className={cn(
|
||||
'gap-1 border',
|
||||
colorClasses.bg,
|
||||
colorClasses.text,
|
||||
colorClasses.border
|
||||
)}
|
||||
>
|
||||
<X className="h-3 w-3" />
|
||||
</button>
|
||||
</Badge>
|
||||
))}
|
||||
{label}
|
||||
<button
|
||||
onClick={() => handleRemoveLabel(label)}
|
||||
className="hover:text-red-600"
|
||||
>
|
||||
<X className="h-3 w-3" />
|
||||
</button>
|
||||
</Badge>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
|
||||
@ -370,31 +384,10 @@ export function NoteEditor({ note, onClose }: NoteEditorProps) {
|
||||
</DropdownMenu>
|
||||
|
||||
{/* Label Manager */}
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger asChild>
|
||||
<Button variant="ghost" size="sm" title="Add label">
|
||||
<Tag className="h-4 w-4" />
|
||||
</Button>
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent className="w-64">
|
||||
<div className="p-2 space-y-2">
|
||||
<Input
|
||||
placeholder="Enter label name"
|
||||
value={newLabel}
|
||||
onChange={(e) => setNewLabel(e.target.value)}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter') {
|
||||
e.preventDefault()
|
||||
handleAddLabel()
|
||||
}
|
||||
}}
|
||||
/>
|
||||
<Button size="sm" onClick={handleAddLabel} className="w-full">
|
||||
Add Label
|
||||
</Button>
|
||||
</div>
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
<LabelManager
|
||||
existingLabels={labels}
|
||||
onUpdate={setLabels}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="flex gap-2">
|
||||
|
||||
@ -2,93 +2,257 @@
|
||||
|
||||
import { Note } from '@/lib/types'
|
||||
import { NoteCard } from './note-card'
|
||||
import { useState } from 'react'
|
||||
import { useState, useMemo, useEffect } from 'react'
|
||||
import { NoteEditor } from './note-editor'
|
||||
import { reorderNotes } from '@/app/actions/notes'
|
||||
import { reorderNotes, getNotes } from '@/app/actions/notes'
|
||||
import {
|
||||
DndContext,
|
||||
DragEndEvent,
|
||||
DragOverlay,
|
||||
DragStartEvent,
|
||||
MouseSensor,
|
||||
TouchSensor,
|
||||
useSensor,
|
||||
useSensors,
|
||||
closestCenter,
|
||||
PointerSensor,
|
||||
} from '@dnd-kit/core'
|
||||
import {
|
||||
SortableContext,
|
||||
rectSortingStrategy,
|
||||
useSortable,
|
||||
arrayMove,
|
||||
} from '@dnd-kit/sortable'
|
||||
import { CSS } from '@dnd-kit/utilities'
|
||||
import { useRouter } from 'next/navigation'
|
||||
|
||||
interface NoteGridProps {
|
||||
notes: Note[]
|
||||
}
|
||||
|
||||
function SortableNote({ note, onEdit }: { note: Note; onEdit: (note: Note) => void }) {
|
||||
const {
|
||||
attributes,
|
||||
listeners,
|
||||
setNodeRef,
|
||||
transform,
|
||||
transition,
|
||||
isDragging,
|
||||
} = useSortable({ id: note.id })
|
||||
|
||||
const style = {
|
||||
transform: CSS.Transform.toString(transform),
|
||||
transition,
|
||||
opacity: isDragging ? 0.5 : 1,
|
||||
zIndex: isDragging ? 1000 : 1,
|
||||
}
|
||||
|
||||
return (
|
||||
<div
|
||||
ref={setNodeRef}
|
||||
style={style}
|
||||
{...attributes}
|
||||
{...listeners}
|
||||
data-note-id={note.id}
|
||||
data-draggable="true"
|
||||
>
|
||||
<NoteCard note={note} onEdit={onEdit} isDragging={isDragging} />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export function NoteGrid({ notes }: NoteGridProps) {
|
||||
const router = useRouter()
|
||||
const [editingNote, setEditingNote] = useState<Note | null>(null)
|
||||
const [draggedNote, setDraggedNote] = useState<Note | null>(null)
|
||||
const [dragOverNote, setDragOverNote] = useState<Note | null>(null)
|
||||
const [activeId, setActiveId] = useState<string | null>(null)
|
||||
const [localPinnedNotes, setLocalPinnedNotes] = useState<Note[]>([])
|
||||
const [localUnpinnedNotes, setLocalUnpinnedNotes] = useState<Note[]>([])
|
||||
|
||||
const pinnedNotes = notes.filter(note => note.isPinned).sort((a, b) => a.order - b.order)
|
||||
const unpinnedNotes = notes.filter(note => !note.isPinned).sort((a, b) => a.order - b.order)
|
||||
// Sync local state with props
|
||||
useEffect(() => {
|
||||
setLocalPinnedNotes(notes.filter(note => note.isPinned).sort((a, b) => a.order - b.order))
|
||||
setLocalUnpinnedNotes(notes.filter(note => !note.isPinned).sort((a, b) => a.order - b.order))
|
||||
}, [notes])
|
||||
|
||||
const handleDragStart = (note: Note) => {
|
||||
setDraggedNote(note)
|
||||
const sensors = useSensors(
|
||||
useSensor(PointerSensor, {
|
||||
activationConstraint: {
|
||||
distance: 8,
|
||||
},
|
||||
}),
|
||||
useSensor(MouseSensor, {
|
||||
activationConstraint: {
|
||||
distance: 8,
|
||||
},
|
||||
}),
|
||||
useSensor(TouchSensor, {
|
||||
activationConstraint: {
|
||||
delay: 200,
|
||||
tolerance: 6,
|
||||
},
|
||||
})
|
||||
)
|
||||
|
||||
const handleDragStart = (event: DragStartEvent) => {
|
||||
console.log('[DND-DEBUG] Drag started:', {
|
||||
activeId: event.active.id,
|
||||
activeData: event.active.data.current
|
||||
})
|
||||
setActiveId(event.active.id as string)
|
||||
}
|
||||
|
||||
const handleDragEnd = async () => {
|
||||
if (draggedNote && dragOverNote && draggedNote.id !== dragOverNote.id) {
|
||||
// Reorder notes
|
||||
const sourceIndex = notes.findIndex(n => n.id === draggedNote.id)
|
||||
const targetIndex = notes.findIndex(n => n.id === dragOverNote.id)
|
||||
const handleDragEnd = async (event: DragEndEvent) => {
|
||||
const { active, over } = event
|
||||
console.log('[DND-DEBUG] Drag ended:', {
|
||||
activeId: active.id,
|
||||
overId: over?.id,
|
||||
hasOver: !!over
|
||||
})
|
||||
setActiveId(null)
|
||||
|
||||
if (!over || active.id === over.id) {
|
||||
console.log('[DND-DEBUG] Drag cancelled: no valid drop target or same element')
|
||||
return
|
||||
}
|
||||
|
||||
const activeIdStr = active.id as string
|
||||
const overIdStr = over.id as string
|
||||
|
||||
// Determine which section the dragged note belongs to
|
||||
const isInPinned = localPinnedNotes.some(n => n.id === activeIdStr)
|
||||
const targetIsInPinned = localPinnedNotes.some(n => n.id === overIdStr)
|
||||
|
||||
console.log('[DND-DEBUG] Section check:', {
|
||||
activeIdStr,
|
||||
overIdStr,
|
||||
isInPinned,
|
||||
targetIsInPinned,
|
||||
pinnedNotesCount: localPinnedNotes.length,
|
||||
unpinnedNotesCount: localUnpinnedNotes.length
|
||||
})
|
||||
|
||||
// Only allow reordering within the same section
|
||||
if (isInPinned !== targetIsInPinned) {
|
||||
console.log('[DND-DEBUG] Drag cancelled: crossing sections (pinned/unpinned)')
|
||||
return
|
||||
}
|
||||
|
||||
if (isInPinned) {
|
||||
// Reorder pinned notes
|
||||
const oldIndex = localPinnedNotes.findIndex(n => n.id === activeIdStr)
|
||||
const newIndex = localPinnedNotes.findIndex(n => n.id === overIdStr)
|
||||
|
||||
await reorderNotes(draggedNote.id, dragOverNote.id)
|
||||
console.log('[DND-DEBUG] Pinned reorder:', { oldIndex, newIndex })
|
||||
|
||||
if (oldIndex !== -1 && newIndex !== -1) {
|
||||
const newOrder = arrayMove(localPinnedNotes, oldIndex, newIndex)
|
||||
setLocalPinnedNotes(newOrder)
|
||||
console.log('[DND-DEBUG] Calling reorderNotes for pinned notes')
|
||||
await reorderNotes(activeIdStr, overIdStr)
|
||||
|
||||
// Refresh notes from server to sync state
|
||||
console.log('[DND-DEBUG] Refreshing notes from server after reorder')
|
||||
await refreshNotesFromServer()
|
||||
} else {
|
||||
console.log('[DND-DEBUG] Invalid indices for pinned reorder')
|
||||
}
|
||||
} else {
|
||||
// Reorder unpinned notes
|
||||
const oldIndex = localUnpinnedNotes.findIndex(n => n.id === activeIdStr)
|
||||
const newIndex = localUnpinnedNotes.findIndex(n => n.id === overIdStr)
|
||||
|
||||
console.log('[DND-DEBUG] Unpinned reorder:', { oldIndex, newIndex })
|
||||
|
||||
if (oldIndex !== -1 && newIndex !== -1) {
|
||||
const newOrder = arrayMove(localUnpinnedNotes, oldIndex, newIndex)
|
||||
setLocalUnpinnedNotes(newOrder)
|
||||
console.log('[DND-DEBUG] Calling reorderNotes for unpinned notes')
|
||||
await reorderNotes(activeIdStr, overIdStr)
|
||||
|
||||
// Refresh notes from server to sync state
|
||||
console.log('[DND-DEBUG] Refreshing notes from server after reorder')
|
||||
await refreshNotesFromServer()
|
||||
} else {
|
||||
console.log('[DND-DEBUG] Invalid indices for unpinned reorder')
|
||||
}
|
||||
}
|
||||
setDraggedNote(null)
|
||||
setDragOverNote(null)
|
||||
}
|
||||
|
||||
const handleDragOver = (note: Note) => {
|
||||
if (draggedNote && draggedNote.id !== note.id) {
|
||||
setDragOverNote(note)
|
||||
}
|
||||
// Function to refresh notes from server without full page reload
|
||||
const refreshNotesFromServer = async () => {
|
||||
console.log('[DND-DEBUG] Fetching fresh notes from server...')
|
||||
const freshNotes = await getNotes()
|
||||
console.log('[DND-DEBUG] Received fresh notes:', freshNotes.length)
|
||||
|
||||
// Update local state with fresh data
|
||||
const pinned = freshNotes.filter(note => note.isPinned).sort((a, b) => a.order - b.order)
|
||||
const unpinned = freshNotes.filter(note => !note.isPinned).sort((a, b) => a.order - b.order)
|
||||
|
||||
setLocalPinnedNotes(pinned)
|
||||
setLocalUnpinnedNotes(unpinned)
|
||||
|
||||
console.log('[DND-DEBUG] Local state updated with fresh server data')
|
||||
}
|
||||
|
||||
// Find active note from either section
|
||||
const activeNote = activeId
|
||||
? localPinnedNotes.find(n => n.id === activeId) || localUnpinnedNotes.find(n => n.id === activeId)
|
||||
: null
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="space-y-8">
|
||||
{pinnedNotes.length > 0 && (
|
||||
<div>
|
||||
<h2 className="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide mb-3 px-2">
|
||||
Pinned
|
||||
</h2>
|
||||
<div className="columns-1 sm:columns-2 lg:columns-3 xl:columns-4 2xl:columns-5 gap-4 space-y-4">
|
||||
{pinnedNotes.map(note => (
|
||||
<div key={note.id} className="break-inside-avoid mb-4">
|
||||
<NoteCard
|
||||
note={note}
|
||||
onEdit={setEditingNote}
|
||||
onDragStart={handleDragStart}
|
||||
onDragEnd={handleDragEnd}
|
||||
onDragOver={handleDragOver}
|
||||
isDragging={draggedNote?.id === note.id}
|
||||
/>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{unpinnedNotes.length > 0 && (
|
||||
<div>
|
||||
{pinnedNotes.length > 0 && (
|
||||
<DndContext
|
||||
sensors={sensors}
|
||||
collisionDetection={closestCenter}
|
||||
onDragStart={handleDragStart}
|
||||
onDragEnd={handleDragEnd}
|
||||
>
|
||||
{localPinnedNotes.length > 0 && (
|
||||
<div>
|
||||
<h2 className="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide mb-3 px-2">
|
||||
Others
|
||||
Pinned
|
||||
</h2>
|
||||
)}
|
||||
<div className="columns-1 sm:columns-2 lg:columns-3 xl:columns-4 2xl:columns-5 gap-4 space-y-4">
|
||||
{unpinnedNotes.map(note => (
|
||||
<div key={note.id} className="break-inside-avoid mb-4">
|
||||
<NoteCard
|
||||
note={note}
|
||||
onEdit={setEditingNote}
|
||||
onDragStart={handleDragStart}
|
||||
onDragEnd={handleDragEnd}
|
||||
onDragOver={handleDragOver}
|
||||
isDragging={draggedNote?.id === note.id}
|
||||
/>
|
||||
<SortableContext items={localPinnedNotes.map(n => n.id)} strategy={rectSortingStrategy}>
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5 gap-4 auto-rows-max">
|
||||
{localPinnedNotes.map((note) => (
|
||||
<SortableNote key={note.id} note={note} onEdit={setEditingNote} />
|
||||
))}
|
||||
</div>
|
||||
))}
|
||||
</SortableContext>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
)}
|
||||
|
||||
{localUnpinnedNotes.length > 0 && (
|
||||
<div>
|
||||
{localPinnedNotes.length > 0 && (
|
||||
<h2 className="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide mb-3 px-2">
|
||||
Others
|
||||
</h2>
|
||||
)}
|
||||
<SortableContext items={localUnpinnedNotes.map(n => n.id)} strategy={rectSortingStrategy}>
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5 gap-4 auto-rows-max">
|
||||
{localUnpinnedNotes.map((note) => (
|
||||
<SortableNote key={note.id} note={note} onEdit={setEditingNote} />
|
||||
))}
|
||||
</div>
|
||||
</SortableContext>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<DragOverlay>
|
||||
{activeNote ? (
|
||||
<div className="opacity-90 rotate-2 scale-105 shadow-2xl">
|
||||
<NoteCard
|
||||
note={activeNote}
|
||||
onEdit={() => {}}
|
||||
isDragging={true}
|
||||
/>
|
||||
</div>
|
||||
) : null}
|
||||
</DragOverlay>
|
||||
</DndContext>
|
||||
|
||||
{notes.length === 0 && (
|
||||
<div className="text-center py-16">
|
||||
<p className="text-gray-500 dark:text-gray-400 text-lg">No notes yet</p>
|
||||
@ -98,10 +262,7 @@ export function NoteGrid({ notes }: NoteGridProps) {
|
||||
</div>
|
||||
|
||||
{editingNote && (
|
||||
<NoteEditor
|
||||
note={editingNote}
|
||||
onClose={() => setEditingNote(null)}
|
||||
/>
|
||||
<NoteEditor note={editingNote} onClose={() => setEditingNote(null)} />
|
||||
)}
|
||||
</>
|
||||
)
|
||||
|
||||
57
keep-notes/lib/label-storage.ts
Normal file
@ -0,0 +1,57 @@
|
||||
import { LabelColorName } from './types'
|
||||
|
||||
const STORAGE_KEY = 'memento-label-colors'
|
||||
|
||||
// Store label colors in localStorage
|
||||
export function getLabelColor(label: string): LabelColorName {
|
||||
if (typeof window === 'undefined') return 'gray'
|
||||
|
||||
try {
|
||||
const stored = localStorage.getItem(STORAGE_KEY)
|
||||
if (!stored) return 'gray'
|
||||
|
||||
const colors = JSON.parse(stored) as Record<string, LabelColorName>
|
||||
return colors[label] || 'gray'
|
||||
} catch {
|
||||
return 'gray'
|
||||
}
|
||||
}
|
||||
|
||||
export function setLabelColor(label: string, color: LabelColorName) {
|
||||
if (typeof window === 'undefined') return
|
||||
|
||||
try {
|
||||
const stored = localStorage.getItem(STORAGE_KEY)
|
||||
const colors = stored ? JSON.parse(stored) as Record<string, LabelColorName> : {}
|
||||
colors[label] = color
|
||||
localStorage.setItem(STORAGE_KEY, JSON.stringify(colors))
|
||||
} catch (error) {
|
||||
console.error('Failed to save label color:', error)
|
||||
}
|
||||
}
|
||||
|
||||
export function getAllLabelColors(): Record<string, LabelColorName> {
|
||||
if (typeof window === 'undefined') return {}
|
||||
|
||||
try {
|
||||
const stored = localStorage.getItem(STORAGE_KEY)
|
||||
return stored ? JSON.parse(stored) : {}
|
||||
} catch {
|
||||
return {}
|
||||
}
|
||||
}
|
||||
|
||||
export function deleteLabelColor(label: string) {
|
||||
if (typeof window === 'undefined') return
|
||||
|
||||
try {
|
||||
const stored = localStorage.getItem(STORAGE_KEY)
|
||||
if (!stored) return
|
||||
|
||||
const colors = JSON.parse(stored) as Record<string, LabelColorName>
|
||||
delete colors[label]
|
||||
localStorage.setItem(STORAGE_KEY, JSON.stringify(colors))
|
||||
} catch (error) {
|
||||
console.error('Failed to delete label color:', error)
|
||||
}
|
||||
}
|
||||
@ -24,6 +24,25 @@ export interface Note {
|
||||
updatedAt: Date;
|
||||
}
|
||||
|
||||
export interface LabelWithColor {
|
||||
name: string;
|
||||
color: LabelColorName;
|
||||
}
|
||||
|
||||
export const LABEL_COLORS = {
|
||||
gray: { bg: 'bg-gray-100 dark:bg-gray-800', text: 'text-gray-700 dark:text-gray-300', border: 'border-gray-300 dark:border-gray-600' },
|
||||
red: { bg: 'bg-red-100 dark:bg-red-900/30', text: 'text-red-700 dark:text-red-300', border: 'border-red-300 dark:border-red-600' },
|
||||
orange: { bg: 'bg-orange-100 dark:bg-orange-900/30', text: 'text-orange-700 dark:text-orange-300', border: 'border-orange-300 dark:border-orange-600' },
|
||||
yellow: { bg: 'bg-yellow-100 dark:bg-yellow-900/30', text: 'text-yellow-700 dark:text-yellow-300', border: 'border-yellow-300 dark:border-yellow-600' },
|
||||
green: { bg: 'bg-green-100 dark:bg-green-900/30', text: 'text-green-700 dark:text-green-300', border: 'border-green-300 dark:border-green-600' },
|
||||
teal: { bg: 'bg-teal-100 dark:bg-teal-900/30', text: 'text-teal-700 dark:text-teal-300', border: 'border-teal-300 dark:border-teal-600' },
|
||||
blue: { bg: 'bg-blue-100 dark:bg-blue-900/30', text: 'text-blue-700 dark:text-blue-300', border: 'border-blue-300 dark:border-blue-600' },
|
||||
purple: { bg: 'bg-purple-100 dark:bg-purple-900/30', text: 'text-purple-700 dark:text-purple-300', border: 'border-purple-300 dark:border-purple-600' },
|
||||
pink: { bg: 'bg-pink-100 dark:bg-pink-900/30', text: 'text-pink-700 dark:text-pink-300', border: 'border-pink-300 dark:border-pink-600' },
|
||||
}
|
||||
|
||||
export type LabelColorName = keyof typeof LABEL_COLORS
|
||||
|
||||
export const NOTE_COLORS = {
|
||||
default: {
|
||||
bg: 'bg-white dark:bg-zinc-900',
|
||||
|
||||
170
keep-notes/package-lock.json
generated
@ -9,6 +9,9 @@
|
||||
"version": "0.1.0",
|
||||
"dependencies": {
|
||||
"@auth/prisma-adapter": "^2.11.1",
|
||||
"@dnd-kit/core": "^6.3.1",
|
||||
"@dnd-kit/sortable": "^10.0.0",
|
||||
"@dnd-kit/utilities": "^3.2.2",
|
||||
"@libsql/client": "^0.15.15",
|
||||
"@prisma/adapter-better-sqlite3": "^7.2.0",
|
||||
"@prisma/adapter-libsql": "^7.2.0",
|
||||
@ -31,7 +34,9 @@
|
||||
"prisma": "5.22.0",
|
||||
"react": "19.2.3",
|
||||
"react-dom": "19.2.3",
|
||||
"react-grid-layout": "^2.2.2",
|
||||
"react-markdown": "^10.1.0",
|
||||
"react-masonry-css": "^1.0.16",
|
||||
"remark-gfm": "^4.0.1",
|
||||
"tailwind-merge": "^3.4.0"
|
||||
},
|
||||
@ -101,6 +106,60 @@
|
||||
"@prisma/client": ">=2.26.0 || >=3 || >=4 || >=5 || >=6"
|
||||
}
|
||||
},
|
||||
"node_modules/@dnd-kit/accessibility": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz",
|
||||
"integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"tslib": "^2.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=16.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@dnd-kit/core": {
|
||||
"version": "6.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz",
|
||||
"integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@dnd-kit/accessibility": "^3.1.1",
|
||||
"@dnd-kit/utilities": "^3.2.2",
|
||||
"tslib": "^2.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=16.8.0",
|
||||
"react-dom": ">=16.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@dnd-kit/sortable": {
|
||||
"version": "10.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz",
|
||||
"integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@dnd-kit/utilities": "^3.2.2",
|
||||
"tslib": "^2.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@dnd-kit/core": "^6.3.0",
|
||||
"react": ">=16.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@dnd-kit/utilities": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz",
|
||||
"integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"tslib": "^2.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=16.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@emnapi/runtime": {
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.0.tgz",
|
||||
@ -2956,6 +3015,12 @@
|
||||
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/fast-equals": {
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz",
|
||||
"integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/fetch-blob": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
|
||||
@ -3208,6 +3273,12 @@
|
||||
"integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==",
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/js-tokens": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
|
||||
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/libsql": {
|
||||
"version": "0.5.22",
|
||||
"resolved": "https://registry.npmjs.org/libsql/-/libsql-0.5.22.tgz",
|
||||
@ -3520,6 +3591,18 @@
|
||||
"url": "https://github.com/sponsors/wooorm"
|
||||
}
|
||||
},
|
||||
"node_modules/loose-envify": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
|
||||
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"js-tokens": "^3.0.0 || ^4.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"loose-envify": "cli.js"
|
||||
}
|
||||
},
|
||||
"node_modules/lucide-react": {
|
||||
"version": "0.562.0",
|
||||
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.562.0.tgz",
|
||||
@ -4635,6 +4718,15 @@
|
||||
"url": "https://github.com/sponsors/panva"
|
||||
}
|
||||
},
|
||||
"node_modules/object-assign": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
||||
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
@ -4823,6 +4915,17 @@
|
||||
"integrity": "sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/prop-types": {
|
||||
"version": "15.8.1",
|
||||
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
|
||||
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"loose-envify": "^1.4.0",
|
||||
"object-assign": "^4.1.1",
|
||||
"react-is": "^16.13.1"
|
||||
}
|
||||
},
|
||||
"node_modules/property-information": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
|
||||
@ -4881,6 +4984,44 @@
|
||||
"react": "^19.2.3"
|
||||
}
|
||||
},
|
||||
"node_modules/react-draggable": {
|
||||
"version": "4.5.0",
|
||||
"resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.5.0.tgz",
|
||||
"integrity": "sha512-VC+HBLEZ0XJxnOxVAZsdRi8rD04Iz3SiiKOoYzamjylUcju/hP9np/aZdLHf/7WOD268WMoNJMvYfB5yAK45cw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"clsx": "^2.1.1",
|
||||
"prop-types": "^15.8.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">= 16.3.0",
|
||||
"react-dom": ">= 16.3.0"
|
||||
}
|
||||
},
|
||||
"node_modules/react-grid-layout": {
|
||||
"version": "2.2.2",
|
||||
"resolved": "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-2.2.2.tgz",
|
||||
"integrity": "sha512-yNo9pxQWoxHWRAwHGSVT4DEGELYPyQ7+q9lFclb5jcqeFzva63/2F72CryS/jiTIr/SBIlTaDdyjqH+ODg8oBw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"clsx": "^2.1.1",
|
||||
"fast-equals": "^4.0.3",
|
||||
"prop-types": "^15.8.1",
|
||||
"react-draggable": "^4.4.6",
|
||||
"react-resizable": "^3.0.5",
|
||||
"resize-observer-polyfill": "^1.5.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">= 16.3.0",
|
||||
"react-dom": ">= 16.3.0"
|
||||
}
|
||||
},
|
||||
"node_modules/react-is": {
|
||||
"version": "16.13.1",
|
||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
|
||||
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/react-markdown": {
|
||||
"version": "10.1.0",
|
||||
"resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz",
|
||||
@ -4908,6 +5049,15 @@
|
||||
"react": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/react-masonry-css": {
|
||||
"version": "1.0.16",
|
||||
"resolved": "https://registry.npmjs.org/react-masonry-css/-/react-masonry-css-1.0.16.tgz",
|
||||
"integrity": "sha512-KSW0hR2VQmltt/qAa3eXOctQDyOu7+ZBevtKgpNDSzT7k5LA/0XntNa9z9HKCdz3QlxmJHglTZ18e4sX4V8zZQ==",
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"react": ">=16.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/react-remove-scroll": {
|
||||
"version": "2.7.2",
|
||||
"resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
|
||||
@ -4955,6 +5105,20 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/react-resizable": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-3.1.3.tgz",
|
||||
"integrity": "sha512-liJBNayhX7qA4tBJiBD321FDhJxgGTJ07uzH5zSORXoE8h7PyEZ8mLqmosST7ppf6C4zUsbd2gzDMmBCfFp9Lw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"prop-types": "15.x",
|
||||
"react-draggable": "^4.5.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">= 16.3",
|
||||
"react-dom": ">= 16.3"
|
||||
}
|
||||
},
|
||||
"node_modules/react-style-singleton": {
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
|
||||
@ -5057,6 +5221,12 @@
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
},
|
||||
"node_modules/resize-observer-polyfill": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
|
||||
"integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/safe-buffer": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
||||
|
||||
@ -12,6 +12,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@auth/prisma-adapter": "^2.11.1",
|
||||
"@dnd-kit/core": "^6.3.1",
|
||||
"@dnd-kit/sortable": "^10.0.0",
|
||||
"@dnd-kit/utilities": "^3.2.2",
|
||||
"@libsql/client": "^0.15.15",
|
||||
"@prisma/adapter-better-sqlite3": "^7.2.0",
|
||||
"@prisma/adapter-libsql": "^7.2.0",
|
||||
@ -34,7 +37,9 @@
|
||||
"prisma": "5.22.0",
|
||||
"react": "19.2.3",
|
||||
"react-dom": "19.2.3",
|
||||
"react-grid-layout": "^2.2.2",
|
||||
"react-markdown": "^10.1.0",
|
||||
"react-masonry-css": "^1.0.16",
|
||||
"remark-gfm": "^4.0.1",
|
||||
"tailwind-merge": "^3.4.0"
|
||||
},
|
||||
|
||||
@ -0,0 +1,478 @@
|
||||
# Page snapshot
|
||||
|
||||
```yaml
|
||||
- generic [active] [ref=e1]:
|
||||
- banner [ref=e2]:
|
||||
- generic [ref=e3]:
|
||||
- link "Memento" [ref=e4] [cursor=pointer]:
|
||||
- /url: /
|
||||
- img [ref=e5]
|
||||
- generic [ref=e8]: Memento
|
||||
- generic [ref=e10]:
|
||||
- img [ref=e11]
|
||||
- textbox "Search notes..." [ref=e14]
|
||||
- button [ref=e15]:
|
||||
- img
|
||||
- navigation [ref=e16]:
|
||||
- link "Notes" [ref=e17] [cursor=pointer]:
|
||||
- /url: /
|
||||
- img [ref=e18]
|
||||
- text: Notes
|
||||
- link "Archive" [ref=e21] [cursor=pointer]:
|
||||
- /url: /archive
|
||||
- img [ref=e22]
|
||||
- text: Archive
|
||||
- main [ref=e25]:
|
||||
- generic [ref=e27]:
|
||||
- textbox "Take a note..." [ref=e28]
|
||||
- button "New checklist" [ref=e29]:
|
||||
- img
|
||||
- generic [ref=e30]:
|
||||
- generic [ref=e31]:
|
||||
- heading "Pinned" [level=2] [ref=e32]
|
||||
- button "Updated Note avec image il y a environ 8 heures" [ref=e34]:
|
||||
- generic [ref=e35]:
|
||||
- img [ref=e36]
|
||||
- heading "Updated" [level=3] [ref=e38]
|
||||
- paragraph [ref=e39]: Note avec image
|
||||
- generic [ref=e40]: il y a environ 8 heures
|
||||
- generic [ref=e41]:
|
||||
- button "Unpin" [ref=e42]:
|
||||
- img
|
||||
- button "Change color" [ref=e43]:
|
||||
- img
|
||||
- button [ref=e44]:
|
||||
- img
|
||||
- generic [ref=e45]:
|
||||
- heading "Others" [level=2] [ref=e46]
|
||||
- generic [ref=e47]:
|
||||
- button "test-1767557334587-Note 4 test-1767557334587-Content 4 il y a moins d’une minute" [ref=e48]:
|
||||
- generic [ref=e49]:
|
||||
- heading "test-1767557334587-Note 4" [level=3] [ref=e50]
|
||||
- paragraph [ref=e51]: test-1767557334587-Content 4
|
||||
- generic [ref=e52]: il y a moins d’une minute
|
||||
- generic [ref=e53]:
|
||||
- button "Pin" [ref=e54]:
|
||||
- img
|
||||
- button "Change color" [ref=e55]:
|
||||
- img
|
||||
- button [ref=e56]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 3 test-1767557334587-Content 3 il y a moins d’une minute" [ref=e57]:
|
||||
- generic [ref=e58]:
|
||||
- heading "test-1767557334587-Note 3" [level=3] [ref=e59]
|
||||
- paragraph [ref=e60]: test-1767557334587-Content 3
|
||||
- generic [ref=e61]: il y a moins d’une minute
|
||||
- generic [ref=e62]:
|
||||
- button "Pin" [ref=e63]:
|
||||
- img
|
||||
- button "Change color" [ref=e64]:
|
||||
- img
|
||||
- button [ref=e65]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 2 test-1767557334587-Content 2 il y a moins d’une minute" [ref=e66]:
|
||||
- generic [ref=e67]:
|
||||
- heading "test-1767557334587-Note 2" [level=3] [ref=e68]
|
||||
- paragraph [ref=e69]: test-1767557334587-Content 2
|
||||
- generic [ref=e70]: il y a moins d’une minute
|
||||
- generic [ref=e71]:
|
||||
- button "Pin" [ref=e72]:
|
||||
- img
|
||||
- button "Change color" [ref=e73]:
|
||||
- img
|
||||
- button [ref=e74]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 1 test-1767557334587-Content 1 il y a moins d’une minute" [ref=e75]:
|
||||
- generic [ref=e76]:
|
||||
- heading "test-1767557334587-Note 1" [level=3] [ref=e77]
|
||||
- paragraph [ref=e78]: test-1767557334587-Content 1
|
||||
- generic [ref=e79]: il y a moins d’une minute
|
||||
- generic [ref=e80]:
|
||||
- button "Pin" [ref=e81]:
|
||||
- img
|
||||
- button "Change color" [ref=e82]:
|
||||
- img
|
||||
- button [ref=e83]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 4 test-1767557330820-Content 4 il y a moins d’une minute" [ref=e84]:
|
||||
- generic [ref=e85]:
|
||||
- heading "test-1767557330820-Note 4" [level=3] [ref=e86]
|
||||
- paragraph [ref=e87]: test-1767557330820-Content 4
|
||||
- generic [ref=e88]: il y a moins d’une minute
|
||||
- generic [ref=e89]:
|
||||
- button "Pin" [ref=e90]:
|
||||
- img
|
||||
- button "Change color" [ref=e91]:
|
||||
- img
|
||||
- button [ref=e92]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 3 test-1767557330820-Content 3 il y a moins d’une minute" [ref=e93]:
|
||||
- generic [ref=e94]:
|
||||
- heading "test-1767557330820-Note 3" [level=3] [ref=e95]
|
||||
- paragraph [ref=e96]: test-1767557330820-Content 3
|
||||
- generic [ref=e97]: il y a moins d’une minute
|
||||
- generic [ref=e98]:
|
||||
- button "Pin" [ref=e99]:
|
||||
- img
|
||||
- button "Change color" [ref=e100]:
|
||||
- img
|
||||
- button [ref=e101]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 2 test-1767557330820-Content 2 il y a moins d’une minute" [ref=e102]:
|
||||
- generic [ref=e103]:
|
||||
- heading "test-1767557330820-Note 2" [level=3] [ref=e104]
|
||||
- paragraph [ref=e105]: test-1767557330820-Content 2
|
||||
- generic [ref=e106]: il y a moins d’une minute
|
||||
- generic [ref=e107]:
|
||||
- button "Pin" [ref=e108]:
|
||||
- img
|
||||
- button "Change color" [ref=e109]:
|
||||
- img
|
||||
- button [ref=e110]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 1 test-1767557330820-Content 1 il y a moins d’une minute" [ref=e111]:
|
||||
- generic [ref=e112]:
|
||||
- heading "test-1767557330820-Note 1" [level=3] [ref=e113]
|
||||
- paragraph [ref=e114]: test-1767557330820-Content 1
|
||||
- generic [ref=e115]: il y a moins d’une minute
|
||||
- generic [ref=e116]:
|
||||
- button "Pin" [ref=e117]:
|
||||
- img
|
||||
- button "Change color" [ref=e118]:
|
||||
- img
|
||||
- button [ref=e119]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 4 test-1767557327567-Content 4 il y a moins d’une minute" [ref=e120]:
|
||||
- generic [ref=e121]:
|
||||
- heading "test-1767557327567-Note 4" [level=3] [ref=e122]
|
||||
- paragraph [ref=e123]: test-1767557327567-Content 4
|
||||
- generic [ref=e124]: il y a moins d’une minute
|
||||
- generic [ref=e125]:
|
||||
- button "Pin" [ref=e126]:
|
||||
- img
|
||||
- button "Change color" [ref=e127]:
|
||||
- img
|
||||
- button [ref=e128]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 3 test-1767557327567-Content 3 il y a moins d’une minute" [ref=e129]:
|
||||
- generic [ref=e130]:
|
||||
- heading "test-1767557327567-Note 3" [level=3] [ref=e131]
|
||||
- paragraph [ref=e132]: test-1767557327567-Content 3
|
||||
- generic [ref=e133]: il y a moins d’une minute
|
||||
- generic [ref=e134]:
|
||||
- button "Pin" [ref=e135]:
|
||||
- img
|
||||
- button "Change color" [ref=e136]:
|
||||
- img
|
||||
- button [ref=e137]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 2 test-1767557327567-Content 2 il y a moins d’une minute" [ref=e138]:
|
||||
- generic [ref=e139]:
|
||||
- heading "test-1767557327567-Note 2" [level=3] [ref=e140]
|
||||
- paragraph [ref=e141]: test-1767557327567-Content 2
|
||||
- generic [ref=e142]: il y a moins d’une minute
|
||||
- generic [ref=e143]:
|
||||
- button "Pin" [ref=e144]:
|
||||
- img
|
||||
- button "Change color" [ref=e145]:
|
||||
- img
|
||||
- button [ref=e146]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 1 test-1767557327567-Content 1 il y a moins d’une minute" [ref=e147]:
|
||||
- generic [ref=e148]:
|
||||
- heading "test-1767557327567-Note 1" [level=3] [ref=e149]
|
||||
- paragraph [ref=e150]: test-1767557327567-Content 1
|
||||
- generic [ref=e151]: il y a moins d’une minute
|
||||
- generic [ref=e152]:
|
||||
- button "Pin" [ref=e153]:
|
||||
- img
|
||||
- button "Change color" [ref=e154]:
|
||||
- img
|
||||
- button [ref=e155]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 4 test-1767557324248-Content 4 il y a moins d’une minute" [ref=e156]:
|
||||
- generic [ref=e157]:
|
||||
- heading "test-1767557324248-Note 4" [level=3] [ref=e158]
|
||||
- paragraph [ref=e159]: test-1767557324248-Content 4
|
||||
- generic [ref=e160]: il y a moins d’une minute
|
||||
- generic [ref=e161]:
|
||||
- button "Pin" [ref=e162]:
|
||||
- img
|
||||
- button "Change color" [ref=e163]:
|
||||
- img
|
||||
- button [ref=e164]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 3 test-1767557324248-Content 3 il y a moins d’une minute" [ref=e165]:
|
||||
- generic [ref=e166]:
|
||||
- heading "test-1767557324248-Note 3" [level=3] [ref=e167]
|
||||
- paragraph [ref=e168]: test-1767557324248-Content 3
|
||||
- generic [ref=e169]: il y a moins d’une minute
|
||||
- generic [ref=e170]:
|
||||
- button "Pin" [ref=e171]:
|
||||
- img
|
||||
- button "Change color" [ref=e172]:
|
||||
- img
|
||||
- button [ref=e173]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 2 test-1767557324248-Content 2 il y a moins d’une minute" [ref=e174]:
|
||||
- generic [ref=e175]:
|
||||
- heading "test-1767557324248-Note 2" [level=3] [ref=e176]
|
||||
- paragraph [ref=e177]: test-1767557324248-Content 2
|
||||
- generic [ref=e178]: il y a moins d’une minute
|
||||
- generic [ref=e179]:
|
||||
- button "Pin" [ref=e180]:
|
||||
- img
|
||||
- button "Change color" [ref=e181]:
|
||||
- img
|
||||
- button [ref=e182]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 1 test-1767557324248-Content 1 il y a moins d’une minute" [ref=e183]:
|
||||
- generic [ref=e184]:
|
||||
- heading "test-1767557324248-Note 1" [level=3] [ref=e185]
|
||||
- paragraph [ref=e186]: test-1767557324248-Content 1
|
||||
- generic [ref=e187]: il y a moins d’une minute
|
||||
- generic [ref=e188]:
|
||||
- button "Pin" [ref=e189]:
|
||||
- img
|
||||
- button "Change color" [ref=e190]:
|
||||
- img
|
||||
- button [ref=e191]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e192]:
|
||||
- generic [ref=e193]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e194]
|
||||
- paragraph [ref=e195]: This note will have a reminder
|
||||
- generic [ref=e196]: il y a 26 minutes
|
||||
- generic [ref=e197]:
|
||||
- button "Pin" [ref=e198]:
|
||||
- img
|
||||
- button "Change color" [ref=e199]:
|
||||
- img
|
||||
- button [ref=e200]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e201]:
|
||||
- generic [ref=e202]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e203]
|
||||
- paragraph [ref=e204]: This note will have a reminder
|
||||
- generic [ref=e205]: il y a 26 minutes
|
||||
- generic [ref=e206]:
|
||||
- button "Pin" [ref=e207]:
|
||||
- img
|
||||
- button "Change color" [ref=e208]:
|
||||
- img
|
||||
- button [ref=e209]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e210]:
|
||||
- generic [ref=e211]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e212]
|
||||
- paragraph [ref=e213]: This note will have a reminder
|
||||
- generic [ref=e214]: il y a 26 minutes
|
||||
- generic [ref=e215]:
|
||||
- button "Pin" [ref=e216]:
|
||||
- img
|
||||
- button "Change color" [ref=e217]:
|
||||
- img
|
||||
- button [ref=e218]:
|
||||
- img
|
||||
- button "Test note il y a 26 minutes" [ref=e219]:
|
||||
- generic [ref=e220]:
|
||||
- paragraph [ref=e221]: Test note
|
||||
- generic [ref=e222]: il y a 26 minutes
|
||||
- generic [ref=e223]:
|
||||
- button "Pin" [ref=e224]:
|
||||
- img
|
||||
- button "Change color" [ref=e225]:
|
||||
- img
|
||||
- button [ref=e226]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e227]:
|
||||
- generic [ref=e228]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e229]
|
||||
- paragraph [ref=e230]: This note will have a reminder
|
||||
- generic [ref=e231]: il y a 26 minutes
|
||||
- generic [ref=e232]:
|
||||
- button "Pin" [ref=e233]:
|
||||
- img
|
||||
- button "Change color" [ref=e234]:
|
||||
- img
|
||||
- button [ref=e235]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e236]:
|
||||
- generic [ref=e237]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e238]
|
||||
- paragraph [ref=e239]: This note will have a reminder
|
||||
- generic [ref=e240]: il y a 26 minutes
|
||||
- generic [ref=e241]:
|
||||
- button "Pin" [ref=e242]:
|
||||
- img
|
||||
- button "Change color" [ref=e243]:
|
||||
- img
|
||||
- button [ref=e244]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e245]:
|
||||
- generic [ref=e246]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e247]
|
||||
- paragraph [ref=e248]: This note will have a reminder
|
||||
- generic [ref=e249]: il y a 26 minutes
|
||||
- generic [ref=e250]:
|
||||
- button "Pin" [ref=e251]:
|
||||
- img
|
||||
- button "Change color" [ref=e252]:
|
||||
- img
|
||||
- button [ref=e253]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e254]:
|
||||
- generic [ref=e255]:
|
||||
- img [ref=e256]
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e259]
|
||||
- paragraph [ref=e260]: This note will have a reminder
|
||||
- generic [ref=e261]: il y a 26 minutes
|
||||
- generic [ref=e262]:
|
||||
- button "Pin" [ref=e263]:
|
||||
- img
|
||||
- button "Change color" [ref=e264]:
|
||||
- img
|
||||
- button [ref=e265]:
|
||||
- img
|
||||
- button "test sample file il y a environ 5 heures" [ref=e266]:
|
||||
- generic [ref=e267]:
|
||||
- heading "test" [level=3] [ref=e268]
|
||||
- paragraph [ref=e270]: sample file
|
||||
- generic [ref=e271]: il y a environ 5 heures
|
||||
- generic [ref=e272]:
|
||||
- button "Pin" [ref=e273]:
|
||||
- img
|
||||
- button "Change color" [ref=e274]:
|
||||
- img
|
||||
- button [ref=e275]:
|
||||
- img
|
||||
- 'button "New AI Framework Released Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d''un framework pour l''IA - Optimisation de l''entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l''inférence en temps réel Tags: framework, mlops, gpu, ai, tech tech ai framework mlops gpu il y a environ 5 heures" [ref=e276]':
|
||||
- generic [ref=e277]:
|
||||
- heading "New AI Framework Released" [level=3] [ref=e278]
|
||||
- paragraph [ref=e279]: "Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d'un framework pour l'IA - Optimisation de l'entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l'inférence en temps réel Tags: framework, mlops, gpu, ai, tech"
|
||||
- generic [ref=e280]:
|
||||
- generic [ref=e281]: tech
|
||||
- generic [ref=e282]: ai
|
||||
- generic [ref=e283]: framework
|
||||
- generic [ref=e284]: mlops
|
||||
- generic [ref=e285]: gpu
|
||||
- generic [ref=e286]: il y a environ 5 heures
|
||||
- generic [ref=e287]:
|
||||
- button "Pin" [ref=e288]:
|
||||
- img
|
||||
- button "Change color" [ref=e289]:
|
||||
- img
|
||||
- button [ref=e290]:
|
||||
- img
|
||||
- button "Test Image API Note avec image il y a environ 8 heures" [ref=e291]:
|
||||
- generic [ref=e292]:
|
||||
- heading "Test Image API" [level=3] [ref=e293]
|
||||
- paragraph [ref=e295]: Note avec image
|
||||
- generic [ref=e296]: il y a environ 8 heures
|
||||
- generic [ref=e297]:
|
||||
- button "Pin" [ref=e298]:
|
||||
- img
|
||||
- button "Change color" [ref=e299]:
|
||||
- img
|
||||
- button [ref=e300]:
|
||||
- img
|
||||
- button "Test Markdown Titre Modifié Sous-titre édité Liste modifiée 1 Liste modifiée 2 Nouvelle liste 3 Texte gras modifié et italique édité console.log(\"Code modifié avec succès!\") il y a environ 5 heures" [ref=e301]:
|
||||
- generic [ref=e302]:
|
||||
- heading "Test Markdown" [level=3] [ref=e303]
|
||||
- generic [ref=e305]:
|
||||
- heading "Titre Modifié" [level=1] [ref=e306]
|
||||
- heading "Sous-titre édité" [level=2] [ref=e307]
|
||||
- list [ref=e308]:
|
||||
- listitem [ref=e309]: Liste modifiée 1
|
||||
- listitem [ref=e310]: Liste modifiée 2
|
||||
- listitem [ref=e311]: Nouvelle liste 3
|
||||
- paragraph [ref=e312]:
|
||||
- strong [ref=e313]: Texte gras modifié
|
||||
- text: et
|
||||
- emphasis [ref=e314]: italique édité
|
||||
- code [ref=e316]: console.log("Code modifié avec succès!")
|
||||
- generic [ref=e317]: il y a environ 5 heures
|
||||
- generic [ref=e318]:
|
||||
- button "Pin" [ref=e319]:
|
||||
- img
|
||||
- button "Change color" [ref=e320]:
|
||||
- img
|
||||
- button [ref=e321]:
|
||||
- img
|
||||
- button "Test Image Avec image il y a environ 8 heures" [ref=e322]:
|
||||
- generic [ref=e323]:
|
||||
- heading "Test Image" [level=3] [ref=e324]
|
||||
- paragraph [ref=e325]: Avec image
|
||||
- generic [ref=e326]: il y a environ 8 heures
|
||||
- generic [ref=e327]:
|
||||
- button "Pin" [ref=e328]:
|
||||
- img
|
||||
- button "Change color" [ref=e329]:
|
||||
- img
|
||||
- button [ref=e330]:
|
||||
- img
|
||||
- 'button "New AI Framework Released Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu tech ai framework mlops gpu il y a environ 6 heures" [ref=e331]':
|
||||
- generic [ref=e332]:
|
||||
- heading "New AI Framework Released" [level=3] [ref=e333]
|
||||
- paragraph [ref=e334]: "Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu"
|
||||
- generic [ref=e335]:
|
||||
- generic [ref=e336]: tech
|
||||
- generic [ref=e337]: ai
|
||||
- generic [ref=e338]: framework
|
||||
- generic [ref=e339]: mlops
|
||||
- generic [ref=e340]: gpu
|
||||
- generic [ref=e341]: il y a environ 6 heures
|
||||
- generic [ref=e342]:
|
||||
- button "Pin" [ref=e343]:
|
||||
- img
|
||||
- button "Change color" [ref=e344]:
|
||||
- img
|
||||
- button [ref=e345]:
|
||||
- img
|
||||
- button "Test Note This is my first note to test the Google Keep clone! il y a environ 10 heures" [ref=e346]:
|
||||
- generic [ref=e347]:
|
||||
- img [ref=e348]
|
||||
- heading "Test Note" [level=3] [ref=e351]
|
||||
- paragraph [ref=e352]: This is my first note to test the Google Keep clone!
|
||||
- generic [ref=e353]: il y a environ 10 heures
|
||||
- generic [ref=e354]:
|
||||
- button "Pin" [ref=e355]:
|
||||
- img
|
||||
- button "Change color" [ref=e356]:
|
||||
- img
|
||||
- button [ref=e357]:
|
||||
- img
|
||||
- button "Titre Modifié Contenu modifié avec succès! il y a environ 5 heures" [ref=e358]:
|
||||
- generic [ref=e359]:
|
||||
- heading "Titre Modifié" [level=3] [ref=e360]
|
||||
- paragraph [ref=e361]: Contenu modifié avec succès!
|
||||
- generic [ref=e362]: il y a environ 5 heures
|
||||
- generic [ref=e363]:
|
||||
- button "Pin" [ref=e364]:
|
||||
- img
|
||||
- button "Change color" [ref=e365]:
|
||||
- img
|
||||
- button [ref=e366]:
|
||||
- img
|
||||
- status [ref=e367]
|
||||
- generic [ref=e368]:
|
||||
- generic [ref=e369]:
|
||||
- generic [ref=e370]: Note created successfully
|
||||
- button [ref=e371]:
|
||||
- img [ref=e372]
|
||||
- generic [ref=e375]:
|
||||
- generic [ref=e376]: Note created successfully
|
||||
- button [ref=e377]:
|
||||
- img [ref=e378]
|
||||
- generic [ref=e381]:
|
||||
- generic [ref=e382]: Note created successfully
|
||||
- button [ref=e383]:
|
||||
- img [ref=e384]
|
||||
- generic [ref=e387]:
|
||||
- generic [ref=e388]: Note created successfully
|
||||
- button [ref=e389]:
|
||||
- img [ref=e390]
|
||||
- button "Open Next.js Dev Tools" [ref=e398] [cursor=pointer]:
|
||||
- img [ref=e399]
|
||||
- alert [ref=e402]
|
||||
```
|
||||
@ -0,0 +1,509 @@
|
||||
# Page snapshot
|
||||
|
||||
```yaml
|
||||
- generic [active] [ref=e1]:
|
||||
- banner [ref=e2]:
|
||||
- generic [ref=e3]:
|
||||
- link "Memento" [ref=e4] [cursor=pointer]:
|
||||
- /url: /
|
||||
- img [ref=e5]
|
||||
- generic [ref=e8]: Memento
|
||||
- generic [ref=e10]:
|
||||
- img [ref=e11]
|
||||
- textbox "Search notes..." [ref=e14]
|
||||
- button [ref=e15]:
|
||||
- img
|
||||
- navigation [ref=e16]:
|
||||
- link "Notes" [ref=e17] [cursor=pointer]:
|
||||
- /url: /
|
||||
- img [ref=e18]
|
||||
- text: Notes
|
||||
- link "Archive" [ref=e21] [cursor=pointer]:
|
||||
- /url: /archive
|
||||
- img [ref=e22]
|
||||
- text: Archive
|
||||
- main [ref=e25]:
|
||||
- generic [ref=e27]:
|
||||
- textbox "Take a note..." [ref=e28]
|
||||
- button "New checklist" [ref=e29]:
|
||||
- img
|
||||
- generic [ref=e30]:
|
||||
- generic [ref=e31]:
|
||||
- heading "Pinned" [level=2] [ref=e32]
|
||||
- button "Updated Note avec image il y a environ 8 heures" [ref=e34]:
|
||||
- generic [ref=e35]:
|
||||
- img [ref=e36]
|
||||
- heading "Updated" [level=3] [ref=e38]
|
||||
- paragraph [ref=e39]: Note avec image
|
||||
- generic [ref=e40]: il y a environ 8 heures
|
||||
- generic [ref=e41]:
|
||||
- button "Unpin" [ref=e42]:
|
||||
- img
|
||||
- button "Change color" [ref=e43]:
|
||||
- img
|
||||
- button [ref=e44]:
|
||||
- img
|
||||
- generic [ref=e45]:
|
||||
- heading "Others" [level=2] [ref=e46]
|
||||
- generic [ref=e47]:
|
||||
- button "test-1767557339218-Note 4 test-1767557339218-Content 4 il y a moins d’une minute" [ref=e48]:
|
||||
- generic [ref=e49]:
|
||||
- heading "test-1767557339218-Note 4" [level=3] [ref=e50]
|
||||
- paragraph [ref=e51]: test-1767557339218-Content 4
|
||||
- generic [ref=e52]: il y a moins d’une minute
|
||||
- generic [ref=e53]:
|
||||
- button "Pin" [ref=e54]:
|
||||
- img
|
||||
- button "Change color" [ref=e55]:
|
||||
- img
|
||||
- button [ref=e56]:
|
||||
- img
|
||||
- button "test-1767557339218-Note 3 test-1767557339218-Content 3 il y a moins d’une minute" [ref=e57]:
|
||||
- generic [ref=e58]:
|
||||
- heading "test-1767557339218-Note 3" [level=3] [ref=e59]
|
||||
- paragraph [ref=e60]: test-1767557339218-Content 3
|
||||
- generic [ref=e61]: il y a moins d’une minute
|
||||
- generic [ref=e62]:
|
||||
- button "Pin" [ref=e63]:
|
||||
- img
|
||||
- button "Change color" [ref=e64]:
|
||||
- img
|
||||
- button [ref=e65]:
|
||||
- img
|
||||
- button "test-1767557339218-Note 2 test-1767557339218-Content 2 il y a moins d’une minute" [ref=e66]:
|
||||
- generic [ref=e67]:
|
||||
- heading "test-1767557339218-Note 2" [level=3] [ref=e68]
|
||||
- paragraph [ref=e69]: test-1767557339218-Content 2
|
||||
- generic [ref=e70]: il y a moins d’une minute
|
||||
- generic [ref=e71]:
|
||||
- button "Pin" [ref=e72]:
|
||||
- img
|
||||
- button "Change color" [ref=e73]:
|
||||
- img
|
||||
- button [ref=e74]:
|
||||
- img
|
||||
- button "test-1767557339218-Note 1 test-1767557339218-Content 1 il y a moins d’une minute" [ref=e75]:
|
||||
- generic [ref=e76]:
|
||||
- heading "test-1767557339218-Note 1" [level=3] [ref=e77]
|
||||
- paragraph [ref=e78]: test-1767557339218-Content 1
|
||||
- generic [ref=e79]: il y a moins d’une minute
|
||||
- generic [ref=e80]:
|
||||
- button "Pin" [ref=e81]:
|
||||
- img
|
||||
- button "Change color" [ref=e82]:
|
||||
- img
|
||||
- button [ref=e83]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 4 test-1767557334587-Content 4 il y a moins d’une minute" [ref=e84]:
|
||||
- generic [ref=e85]:
|
||||
- heading "test-1767557334587-Note 4" [level=3] [ref=e86]
|
||||
- paragraph [ref=e87]: test-1767557334587-Content 4
|
||||
- generic [ref=e88]: il y a moins d’une minute
|
||||
- generic [ref=e89]:
|
||||
- button "Pin" [ref=e90]:
|
||||
- img
|
||||
- button "Change color" [ref=e91]:
|
||||
- img
|
||||
- button [ref=e92]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 3 test-1767557334587-Content 3 il y a moins d’une minute" [ref=e93]:
|
||||
- generic [ref=e94]:
|
||||
- heading "test-1767557334587-Note 3" [level=3] [ref=e95]
|
||||
- paragraph [ref=e96]: test-1767557334587-Content 3
|
||||
- generic [ref=e97]: il y a moins d’une minute
|
||||
- generic [ref=e98]:
|
||||
- button "Pin" [ref=e99]:
|
||||
- img
|
||||
- button "Change color" [ref=e100]:
|
||||
- img
|
||||
- button [ref=e101]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 2 test-1767557334587-Content 2 il y a moins d’une minute" [ref=e102]:
|
||||
- generic [ref=e103]:
|
||||
- heading "test-1767557334587-Note 2" [level=3] [ref=e104]
|
||||
- paragraph [ref=e105]: test-1767557334587-Content 2
|
||||
- generic [ref=e106]: il y a moins d’une minute
|
||||
- generic [ref=e107]:
|
||||
- button "Pin" [ref=e108]:
|
||||
- img
|
||||
- button "Change color" [ref=e109]:
|
||||
- img
|
||||
- button [ref=e110]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 1 test-1767557334587-Content 1 il y a moins d’une minute" [ref=e111]:
|
||||
- generic [ref=e112]:
|
||||
- heading "test-1767557334587-Note 1" [level=3] [ref=e113]
|
||||
- paragraph [ref=e114]: test-1767557334587-Content 1
|
||||
- generic [ref=e115]: il y a moins d’une minute
|
||||
- generic [ref=e116]:
|
||||
- button "Pin" [ref=e117]:
|
||||
- img
|
||||
- button "Change color" [ref=e118]:
|
||||
- img
|
||||
- button [ref=e119]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 4 test-1767557330820-Content 4 il y a moins d’une minute" [ref=e120]:
|
||||
- generic [ref=e121]:
|
||||
- heading "test-1767557330820-Note 4" [level=3] [ref=e122]
|
||||
- paragraph [ref=e123]: test-1767557330820-Content 4
|
||||
- generic [ref=e124]: il y a moins d’une minute
|
||||
- generic [ref=e125]:
|
||||
- button "Pin" [ref=e126]:
|
||||
- img
|
||||
- button "Change color" [ref=e127]:
|
||||
- img
|
||||
- button [ref=e128]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 3 test-1767557330820-Content 3 il y a moins d’une minute" [ref=e129]:
|
||||
- generic [ref=e130]:
|
||||
- heading "test-1767557330820-Note 3" [level=3] [ref=e131]
|
||||
- paragraph [ref=e132]: test-1767557330820-Content 3
|
||||
- generic [ref=e133]: il y a moins d’une minute
|
||||
- generic [ref=e134]:
|
||||
- button "Pin" [ref=e135]:
|
||||
- img
|
||||
- button "Change color" [ref=e136]:
|
||||
- img
|
||||
- button [ref=e137]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 2 test-1767557330820-Content 2 il y a moins d’une minute" [ref=e138]:
|
||||
- generic [ref=e139]:
|
||||
- heading "test-1767557330820-Note 2" [level=3] [ref=e140]
|
||||
- paragraph [ref=e141]: test-1767557330820-Content 2
|
||||
- generic [ref=e142]: il y a moins d’une minute
|
||||
- generic [ref=e143]:
|
||||
- button "Pin" [ref=e144]:
|
||||
- img
|
||||
- button "Change color" [ref=e145]:
|
||||
- img
|
||||
- button [ref=e146]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 1 test-1767557330820-Content 1 il y a moins d’une minute" [ref=e147]:
|
||||
- generic [ref=e148]:
|
||||
- heading "test-1767557330820-Note 1" [level=3] [ref=e149]
|
||||
- paragraph [ref=e150]: test-1767557330820-Content 1
|
||||
- generic [ref=e151]: il y a moins d’une minute
|
||||
- generic [ref=e152]:
|
||||
- button "Pin" [ref=e153]:
|
||||
- img
|
||||
- button "Change color" [ref=e154]:
|
||||
- img
|
||||
- button [ref=e155]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 4 test-1767557327567-Content 4 il y a moins d’une minute" [ref=e156]:
|
||||
- generic [ref=e157]:
|
||||
- heading "test-1767557327567-Note 4" [level=3] [ref=e158]
|
||||
- paragraph [ref=e159]: test-1767557327567-Content 4
|
||||
- generic [ref=e160]: il y a moins d’une minute
|
||||
- generic [ref=e161]:
|
||||
- button "Pin" [ref=e162]:
|
||||
- img
|
||||
- button "Change color" [ref=e163]:
|
||||
- img
|
||||
- button [ref=e164]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 3 test-1767557327567-Content 3 il y a moins d’une minute" [ref=e165]:
|
||||
- generic [ref=e166]:
|
||||
- heading "test-1767557327567-Note 3" [level=3] [ref=e167]
|
||||
- paragraph [ref=e168]: test-1767557327567-Content 3
|
||||
- generic [ref=e169]: il y a moins d’une minute
|
||||
- generic [ref=e170]:
|
||||
- button "Pin" [ref=e171]:
|
||||
- img
|
||||
- button "Change color" [ref=e172]:
|
||||
- img
|
||||
- button [ref=e173]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 2 test-1767557327567-Content 2 il y a moins d’une minute" [ref=e174]:
|
||||
- generic [ref=e175]:
|
||||
- heading "test-1767557327567-Note 2" [level=3] [ref=e176]
|
||||
- paragraph [ref=e177]: test-1767557327567-Content 2
|
||||
- generic [ref=e178]: il y a moins d’une minute
|
||||
- generic [ref=e179]:
|
||||
- button "Pin" [ref=e180]:
|
||||
- img
|
||||
- button "Change color" [ref=e181]:
|
||||
- img
|
||||
- button [ref=e182]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 1 test-1767557327567-Content 1 il y a moins d’une minute" [ref=e183]:
|
||||
- generic [ref=e184]:
|
||||
- heading "test-1767557327567-Note 1" [level=3] [ref=e185]
|
||||
- paragraph [ref=e186]: test-1767557327567-Content 1
|
||||
- generic [ref=e187]: il y a moins d’une minute
|
||||
- generic [ref=e188]:
|
||||
- button "Pin" [ref=e189]:
|
||||
- img
|
||||
- button "Change color" [ref=e190]:
|
||||
- img
|
||||
- button [ref=e191]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 4 test-1767557324248-Content 4 il y a moins d’une minute" [ref=e192]:
|
||||
- generic [ref=e193]:
|
||||
- heading "test-1767557324248-Note 4" [level=3] [ref=e194]
|
||||
- paragraph [ref=e195]: test-1767557324248-Content 4
|
||||
- generic [ref=e196]: il y a moins d’une minute
|
||||
- generic [ref=e197]:
|
||||
- button "Pin" [ref=e198]:
|
||||
- img
|
||||
- button "Change color" [ref=e199]:
|
||||
- img
|
||||
- button [ref=e200]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 3 test-1767557324248-Content 3 il y a moins d’une minute" [ref=e201]:
|
||||
- generic [ref=e202]:
|
||||
- heading "test-1767557324248-Note 3" [level=3] [ref=e203]
|
||||
- paragraph [ref=e204]: test-1767557324248-Content 3
|
||||
- generic [ref=e205]: il y a moins d’une minute
|
||||
- generic [ref=e206]:
|
||||
- button "Pin" [ref=e207]:
|
||||
- img
|
||||
- button "Change color" [ref=e208]:
|
||||
- img
|
||||
- button [ref=e209]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 2 test-1767557324248-Content 2 il y a moins d’une minute" [ref=e210]:
|
||||
- generic [ref=e211]:
|
||||
- heading "test-1767557324248-Note 2" [level=3] [ref=e212]
|
||||
- paragraph [ref=e213]: test-1767557324248-Content 2
|
||||
- generic [ref=e214]: il y a moins d’une minute
|
||||
- generic [ref=e215]:
|
||||
- button "Pin" [ref=e216]:
|
||||
- img
|
||||
- button "Change color" [ref=e217]:
|
||||
- img
|
||||
- button [ref=e218]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 1 test-1767557324248-Content 1 il y a moins d’une minute" [ref=e219]:
|
||||
- generic [ref=e220]:
|
||||
- heading "test-1767557324248-Note 1" [level=3] [ref=e221]
|
||||
- paragraph [ref=e222]: test-1767557324248-Content 1
|
||||
- generic [ref=e223]: il y a moins d’une minute
|
||||
- generic [ref=e224]:
|
||||
- button "Pin" [ref=e225]:
|
||||
- img
|
||||
- button "Change color" [ref=e226]:
|
||||
- img
|
||||
- button [ref=e227]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e228]:
|
||||
- generic [ref=e229]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e230]
|
||||
- paragraph [ref=e231]: This note will have a reminder
|
||||
- generic [ref=e232]: il y a 26 minutes
|
||||
- generic [ref=e233]:
|
||||
- button "Pin" [ref=e234]:
|
||||
- img
|
||||
- button "Change color" [ref=e235]:
|
||||
- img
|
||||
- button [ref=e236]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e237]:
|
||||
- generic [ref=e238]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e239]
|
||||
- paragraph [ref=e240]: This note will have a reminder
|
||||
- generic [ref=e241]: il y a 26 minutes
|
||||
- generic [ref=e242]:
|
||||
- button "Pin" [ref=e243]:
|
||||
- img
|
||||
- button "Change color" [ref=e244]:
|
||||
- img
|
||||
- button [ref=e245]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e246]:
|
||||
- generic [ref=e247]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e248]
|
||||
- paragraph [ref=e249]: This note will have a reminder
|
||||
- generic [ref=e250]: il y a 26 minutes
|
||||
- generic [ref=e251]:
|
||||
- button "Pin" [ref=e252]:
|
||||
- img
|
||||
- button "Change color" [ref=e253]:
|
||||
- img
|
||||
- button [ref=e254]:
|
||||
- img
|
||||
- button "Test note il y a 26 minutes" [ref=e255]:
|
||||
- generic [ref=e256]:
|
||||
- paragraph [ref=e257]: Test note
|
||||
- generic [ref=e258]: il y a 26 minutes
|
||||
- generic [ref=e259]:
|
||||
- button "Pin" [ref=e260]:
|
||||
- img
|
||||
- button "Change color" [ref=e261]:
|
||||
- img
|
||||
- button [ref=e262]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e263]:
|
||||
- generic [ref=e264]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e265]
|
||||
- paragraph [ref=e266]: This note will have a reminder
|
||||
- generic [ref=e267]: il y a 26 minutes
|
||||
- generic [ref=e268]:
|
||||
- button "Pin" [ref=e269]:
|
||||
- img
|
||||
- button "Change color" [ref=e270]:
|
||||
- img
|
||||
- button [ref=e271]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e272]:
|
||||
- generic [ref=e273]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e274]
|
||||
- paragraph [ref=e275]: This note will have a reminder
|
||||
- generic [ref=e276]: il y a 26 minutes
|
||||
- generic [ref=e277]:
|
||||
- button "Pin" [ref=e278]:
|
||||
- img
|
||||
- button "Change color" [ref=e279]:
|
||||
- img
|
||||
- button [ref=e280]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e281]:
|
||||
- generic [ref=e282]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e283]
|
||||
- paragraph [ref=e284]: This note will have a reminder
|
||||
- generic [ref=e285]: il y a 26 minutes
|
||||
- generic [ref=e286]:
|
||||
- button "Pin" [ref=e287]:
|
||||
- img
|
||||
- button "Change color" [ref=e288]:
|
||||
- img
|
||||
- button [ref=e289]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e290]:
|
||||
- generic [ref=e291]:
|
||||
- img [ref=e292]
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e295]
|
||||
- paragraph [ref=e296]: This note will have a reminder
|
||||
- generic [ref=e297]: il y a 26 minutes
|
||||
- generic [ref=e298]:
|
||||
- button "Pin" [ref=e299]:
|
||||
- img
|
||||
- button "Change color" [ref=e300]:
|
||||
- img
|
||||
- button [ref=e301]:
|
||||
- img
|
||||
- button "test sample file il y a environ 5 heures" [ref=e302]:
|
||||
- generic [ref=e303]:
|
||||
- heading "test" [level=3] [ref=e304]
|
||||
- paragraph [ref=e306]: sample file
|
||||
- generic [ref=e307]: il y a environ 5 heures
|
||||
- generic [ref=e308]:
|
||||
- button "Pin" [ref=e309]:
|
||||
- img
|
||||
- button "Change color" [ref=e310]:
|
||||
- img
|
||||
- button [ref=e311]:
|
||||
- img
|
||||
- 'button "New AI Framework Released Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d''un framework pour l''IA - Optimisation de l''entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l''inférence en temps réel Tags: framework, mlops, gpu, ai, tech tech ai framework mlops gpu il y a environ 5 heures" [ref=e312]':
|
||||
- generic [ref=e313]:
|
||||
- heading "New AI Framework Released" [level=3] [ref=e314]
|
||||
- paragraph [ref=e315]: "Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d'un framework pour l'IA - Optimisation de l'entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l'inférence en temps réel Tags: framework, mlops, gpu, ai, tech"
|
||||
- generic [ref=e316]:
|
||||
- generic [ref=e317]: tech
|
||||
- generic [ref=e318]: ai
|
||||
- generic [ref=e319]: framework
|
||||
- generic [ref=e320]: mlops
|
||||
- generic [ref=e321]: gpu
|
||||
- generic [ref=e322]: il y a environ 5 heures
|
||||
- generic [ref=e323]:
|
||||
- button "Pin" [ref=e324]:
|
||||
- img
|
||||
- button "Change color" [ref=e325]:
|
||||
- img
|
||||
- button [ref=e326]:
|
||||
- img
|
||||
- button "Test Image API Note avec image il y a environ 8 heures" [ref=e327]:
|
||||
- generic [ref=e328]:
|
||||
- heading "Test Image API" [level=3] [ref=e329]
|
||||
- paragraph [ref=e331]: Note avec image
|
||||
- generic [ref=e332]: il y a environ 8 heures
|
||||
- generic [ref=e333]:
|
||||
- button "Pin" [ref=e334]:
|
||||
- img
|
||||
- button "Change color" [ref=e335]:
|
||||
- img
|
||||
- button [ref=e336]:
|
||||
- img
|
||||
- button "Test Markdown Titre Modifié Sous-titre édité Liste modifiée 1 Liste modifiée 2 Nouvelle liste 3 Texte gras modifié et italique édité console.log(\"Code modifié avec succès!\") il y a environ 5 heures" [ref=e337]:
|
||||
- generic [ref=e338]:
|
||||
- heading "Test Markdown" [level=3] [ref=e339]
|
||||
- generic [ref=e341]:
|
||||
- heading "Titre Modifié" [level=1] [ref=e342]
|
||||
- heading "Sous-titre édité" [level=2] [ref=e343]
|
||||
- list [ref=e344]:
|
||||
- listitem [ref=e345]: Liste modifiée 1
|
||||
- listitem [ref=e346]: Liste modifiée 2
|
||||
- listitem [ref=e347]: Nouvelle liste 3
|
||||
- paragraph [ref=e348]:
|
||||
- strong [ref=e349]: Texte gras modifié
|
||||
- text: et
|
||||
- emphasis [ref=e350]: italique édité
|
||||
- code [ref=e352]: console.log("Code modifié avec succès!")
|
||||
- generic [ref=e353]: il y a environ 5 heures
|
||||
- generic [ref=e354]:
|
||||
- button "Pin" [ref=e355]:
|
||||
- img
|
||||
- button "Change color" [ref=e356]:
|
||||
- img
|
||||
- button [ref=e357]:
|
||||
- img
|
||||
- button "Test Image Avec image il y a environ 8 heures" [ref=e358]:
|
||||
- generic [ref=e359]:
|
||||
- heading "Test Image" [level=3] [ref=e360]
|
||||
- paragraph [ref=e361]: Avec image
|
||||
- generic [ref=e362]: il y a environ 8 heures
|
||||
- generic [ref=e363]:
|
||||
- button "Pin" [ref=e364]:
|
||||
- img
|
||||
- button "Change color" [ref=e365]:
|
||||
- img
|
||||
- button [ref=e366]:
|
||||
- img
|
||||
- 'button "New AI Framework Released Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu tech ai framework mlops gpu il y a environ 6 heures" [ref=e367]':
|
||||
- generic [ref=e368]:
|
||||
- heading "New AI Framework Released" [level=3] [ref=e369]
|
||||
- paragraph [ref=e370]: "Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu"
|
||||
- generic [ref=e371]:
|
||||
- generic [ref=e372]: tech
|
||||
- generic [ref=e373]: ai
|
||||
- generic [ref=e374]: framework
|
||||
- generic [ref=e375]: mlops
|
||||
- generic [ref=e376]: gpu
|
||||
- generic [ref=e377]: il y a environ 6 heures
|
||||
- generic [ref=e378]:
|
||||
- button "Pin" [ref=e379]:
|
||||
- img
|
||||
- button "Change color" [ref=e380]:
|
||||
- img
|
||||
- button [ref=e381]:
|
||||
- img
|
||||
- button "Test Note This is my first note to test the Google Keep clone! il y a environ 10 heures" [ref=e382]:
|
||||
- generic [ref=e383]:
|
||||
- img [ref=e384]
|
||||
- heading "Test Note" [level=3] [ref=e387]
|
||||
- paragraph [ref=e388]: This is my first note to test the Google Keep clone!
|
||||
- generic [ref=e389]: il y a environ 10 heures
|
||||
- generic [ref=e390]:
|
||||
- button "Pin" [ref=e391]:
|
||||
- img
|
||||
- button "Change color" [ref=e392]:
|
||||
- img
|
||||
- button [ref=e393]:
|
||||
- img
|
||||
- button "Titre Modifié Contenu modifié avec succès! il y a environ 5 heures" [ref=e394]:
|
||||
- generic [ref=e395]:
|
||||
- heading "Titre Modifié" [level=3] [ref=e396]
|
||||
- paragraph [ref=e397]: Contenu modifié avec succès!
|
||||
- generic [ref=e398]: il y a environ 5 heures
|
||||
- generic [ref=e399]:
|
||||
- button "Pin" [ref=e400]:
|
||||
- img
|
||||
- button "Change color" [ref=e401]:
|
||||
- img
|
||||
- button [ref=e402]:
|
||||
- img
|
||||
- status [ref=e403]
|
||||
- button "Open Next.js Dev Tools" [ref=e409] [cursor=pointer]:
|
||||
- img [ref=e410]
|
||||
- alert [ref=e413]
|
||||
```
|
||||
@ -0,0 +1,557 @@
|
||||
# Page snapshot
|
||||
|
||||
```yaml
|
||||
- generic [active] [ref=e1]:
|
||||
- banner [ref=e2]:
|
||||
- generic [ref=e3]:
|
||||
- link "Memento" [ref=e4] [cursor=pointer]:
|
||||
- /url: /
|
||||
- img [ref=e5]
|
||||
- generic [ref=e8]: Memento
|
||||
- generic [ref=e10]:
|
||||
- img [ref=e11]
|
||||
- textbox "Search notes..." [ref=e14]
|
||||
- button [ref=e15]:
|
||||
- img
|
||||
- navigation [ref=e16]:
|
||||
- link "Notes" [ref=e17] [cursor=pointer]:
|
||||
- /url: /
|
||||
- img [ref=e18]
|
||||
- text: Notes
|
||||
- link "Archive" [ref=e21] [cursor=pointer]:
|
||||
- /url: /archive
|
||||
- img [ref=e22]
|
||||
- text: Archive
|
||||
- main [ref=e25]:
|
||||
- generic [ref=e27]:
|
||||
- textbox "Take a note..." [ref=e28]
|
||||
- button "New checklist" [ref=e29]:
|
||||
- img
|
||||
- generic [ref=e30]:
|
||||
- generic [ref=e31]:
|
||||
- heading "Pinned" [level=2] [ref=e32]
|
||||
- button "Updated Note avec image il y a environ 8 heures" [ref=e34]:
|
||||
- generic [ref=e35]:
|
||||
- img [ref=e36]
|
||||
- heading "Updated" [level=3] [ref=e38]
|
||||
- paragraph [ref=e39]: Note avec image
|
||||
- generic [ref=e40]: il y a environ 8 heures
|
||||
- generic [ref=e41]:
|
||||
- button "Unpin" [ref=e42]:
|
||||
- img
|
||||
- button "Change color" [ref=e43]:
|
||||
- img
|
||||
- button [ref=e44]:
|
||||
- img
|
||||
- generic [ref=e45]:
|
||||
- heading "Others" [level=2] [ref=e46]
|
||||
- generic [ref=e47]:
|
||||
- button "test-1767557370056-Note 4 test-1767557370056-Content 4 il y a moins d’une minute" [ref=e48]:
|
||||
- generic [ref=e49]:
|
||||
- heading "test-1767557370056-Note 4" [level=3] [ref=e50]
|
||||
- paragraph [ref=e51]: test-1767557370056-Content 4
|
||||
- generic [ref=e52]: il y a moins d’une minute
|
||||
- generic [ref=e53]:
|
||||
- button "Pin" [ref=e54]:
|
||||
- img
|
||||
- button "Change color" [ref=e55]:
|
||||
- img
|
||||
- button [ref=e56]:
|
||||
- img
|
||||
- button "test-1767557370056-Note 3 test-1767557370056-Content 3 il y a moins d’une minute" [ref=e57]:
|
||||
- generic [ref=e58]:
|
||||
- heading "test-1767557370056-Note 3" [level=3] [ref=e59]
|
||||
- paragraph [ref=e60]: test-1767557370056-Content 3
|
||||
- generic [ref=e61]: il y a moins d’une minute
|
||||
- generic [ref=e62]:
|
||||
- button "Pin" [ref=e63]:
|
||||
- img
|
||||
- button "Change color" [ref=e64]:
|
||||
- img
|
||||
- button [ref=e65]:
|
||||
- img
|
||||
- button "test-1767557370056-Note 2 test-1767557370056-Content 2 il y a moins d’une minute" [ref=e66]:
|
||||
- generic [ref=e67]:
|
||||
- heading "test-1767557370056-Note 2" [level=3] [ref=e68]
|
||||
- paragraph [ref=e69]: test-1767557370056-Content 2
|
||||
- generic [ref=e70]: il y a moins d’une minute
|
||||
- generic [ref=e71]:
|
||||
- button "Pin" [ref=e72]:
|
||||
- img
|
||||
- button "Change color" [ref=e73]:
|
||||
- img
|
||||
- button [ref=e74]:
|
||||
- img
|
||||
- button "test-1767557370056-Note 1 test-1767557370056-Content 1 il y a moins d’une minute" [ref=e75]:
|
||||
- generic [ref=e76]:
|
||||
- heading "test-1767557370056-Note 1" [level=3] [ref=e77]
|
||||
- paragraph [ref=e78]: test-1767557370056-Content 1
|
||||
- generic [ref=e79]: il y a moins d’une minute
|
||||
- generic [ref=e80]:
|
||||
- button "Pin" [ref=e81]:
|
||||
- img
|
||||
- button "Change color" [ref=e82]:
|
||||
- img
|
||||
- button [ref=e83]:
|
||||
- img
|
||||
- button "test-1767557339218-Note 4 test-1767557339218-Content 4 il y a 1 minute" [ref=e84]:
|
||||
- generic [ref=e85]:
|
||||
- heading "test-1767557339218-Note 4" [level=3] [ref=e86]
|
||||
- paragraph [ref=e87]: test-1767557339218-Content 4
|
||||
- generic [ref=e88]: il y a 1 minute
|
||||
- generic [ref=e89]:
|
||||
- button "Pin" [ref=e90]:
|
||||
- img
|
||||
- button "Change color" [ref=e91]:
|
||||
- img
|
||||
- button [ref=e92]:
|
||||
- img
|
||||
- button "test-1767557339218-Note 3 test-1767557339218-Content 3 il y a 1 minute" [ref=e93]:
|
||||
- generic [ref=e94]:
|
||||
- heading "test-1767557339218-Note 3" [level=3] [ref=e95]
|
||||
- paragraph [ref=e96]: test-1767557339218-Content 3
|
||||
- generic [ref=e97]: il y a 1 minute
|
||||
- generic [ref=e98]:
|
||||
- button "Pin" [ref=e99]:
|
||||
- img
|
||||
- button "Change color" [ref=e100]:
|
||||
- img
|
||||
- button [ref=e101]:
|
||||
- img
|
||||
- button "test-1767557339218-Note 2 test-1767557339218-Content 2 il y a 1 minute" [ref=e102]:
|
||||
- generic [ref=e103]:
|
||||
- heading "test-1767557339218-Note 2" [level=3] [ref=e104]
|
||||
- paragraph [ref=e105]: test-1767557339218-Content 2
|
||||
- generic [ref=e106]: il y a 1 minute
|
||||
- generic [ref=e107]:
|
||||
- button "Pin" [ref=e108]:
|
||||
- img
|
||||
- button "Change color" [ref=e109]:
|
||||
- img
|
||||
- button [ref=e110]:
|
||||
- img
|
||||
- button "test-1767557339218-Note 1 test-1767557339218-Content 1 il y a 1 minute" [ref=e111]:
|
||||
- generic [ref=e112]:
|
||||
- heading "test-1767557339218-Note 1" [level=3] [ref=e113]
|
||||
- paragraph [ref=e114]: test-1767557339218-Content 1
|
||||
- generic [ref=e115]: il y a 1 minute
|
||||
- generic [ref=e116]:
|
||||
- button "Pin" [ref=e117]:
|
||||
- img
|
||||
- button "Change color" [ref=e118]:
|
||||
- img
|
||||
- button [ref=e119]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 4 test-1767557334587-Content 4 il y a 1 minute" [ref=e120]:
|
||||
- generic [ref=e121]:
|
||||
- heading "test-1767557334587-Note 4" [level=3] [ref=e122]
|
||||
- paragraph [ref=e123]: test-1767557334587-Content 4
|
||||
- generic [ref=e124]: il y a 1 minute
|
||||
- generic [ref=e125]:
|
||||
- button "Pin" [ref=e126]:
|
||||
- img
|
||||
- button "Change color" [ref=e127]:
|
||||
- img
|
||||
- button [ref=e128]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 3 test-1767557334587-Content 3 il y a 1 minute" [ref=e129]:
|
||||
- generic [ref=e130]:
|
||||
- heading "test-1767557334587-Note 3" [level=3] [ref=e131]
|
||||
- paragraph [ref=e132]: test-1767557334587-Content 3
|
||||
- generic [ref=e133]: il y a 1 minute
|
||||
- generic [ref=e134]:
|
||||
- button "Pin" [ref=e135]:
|
||||
- img
|
||||
- button "Change color" [ref=e136]:
|
||||
- img
|
||||
- button [ref=e137]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 2 test-1767557334587-Content 2 il y a 1 minute" [ref=e138]:
|
||||
- generic [ref=e139]:
|
||||
- heading "test-1767557334587-Note 2" [level=3] [ref=e140]
|
||||
- paragraph [ref=e141]: test-1767557334587-Content 2
|
||||
- generic [ref=e142]: il y a 1 minute
|
||||
- generic [ref=e143]:
|
||||
- button "Pin" [ref=e144]:
|
||||
- img
|
||||
- button "Change color" [ref=e145]:
|
||||
- img
|
||||
- button [ref=e146]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 1 test-1767557334587-Content 1 il y a 1 minute" [ref=e147]:
|
||||
- generic [ref=e148]:
|
||||
- heading "test-1767557334587-Note 1" [level=3] [ref=e149]
|
||||
- paragraph [ref=e150]: test-1767557334587-Content 1
|
||||
- generic [ref=e151]: il y a 1 minute
|
||||
- generic [ref=e152]:
|
||||
- button "Pin" [ref=e153]:
|
||||
- img
|
||||
- button "Change color" [ref=e154]:
|
||||
- img
|
||||
- button [ref=e155]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 4 test-1767557330820-Content 4 il y a 1 minute" [ref=e156]:
|
||||
- generic [ref=e157]:
|
||||
- heading "test-1767557330820-Note 4" [level=3] [ref=e158]
|
||||
- paragraph [ref=e159]: test-1767557330820-Content 4
|
||||
- generic [ref=e160]: il y a 1 minute
|
||||
- generic [ref=e161]:
|
||||
- button "Pin" [ref=e162]:
|
||||
- img
|
||||
- button "Change color" [ref=e163]:
|
||||
- img
|
||||
- button [ref=e164]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 3 test-1767557330820-Content 3 il y a 1 minute" [ref=e165]:
|
||||
- generic [ref=e166]:
|
||||
- heading "test-1767557330820-Note 3" [level=3] [ref=e167]
|
||||
- paragraph [ref=e168]: test-1767557330820-Content 3
|
||||
- generic [ref=e169]: il y a 1 minute
|
||||
- generic [ref=e170]:
|
||||
- button "Pin" [ref=e171]:
|
||||
- img
|
||||
- button "Change color" [ref=e172]:
|
||||
- img
|
||||
- button [ref=e173]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 2 test-1767557330820-Content 2 il y a 1 minute" [ref=e174]:
|
||||
- generic [ref=e175]:
|
||||
- heading "test-1767557330820-Note 2" [level=3] [ref=e176]
|
||||
- paragraph [ref=e177]: test-1767557330820-Content 2
|
||||
- generic [ref=e178]: il y a 1 minute
|
||||
- generic [ref=e179]:
|
||||
- button "Pin" [ref=e180]:
|
||||
- img
|
||||
- button "Change color" [ref=e181]:
|
||||
- img
|
||||
- button [ref=e182]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 1 test-1767557330820-Content 1 il y a 1 minute" [ref=e183]:
|
||||
- generic [ref=e184]:
|
||||
- heading "test-1767557330820-Note 1" [level=3] [ref=e185]
|
||||
- paragraph [ref=e186]: test-1767557330820-Content 1
|
||||
- generic [ref=e187]: il y a 1 minute
|
||||
- generic [ref=e188]:
|
||||
- button "Pin" [ref=e189]:
|
||||
- img
|
||||
- button "Change color" [ref=e190]:
|
||||
- img
|
||||
- button [ref=e191]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 4 test-1767557327567-Content 4 il y a 1 minute" [ref=e192]:
|
||||
- generic [ref=e193]:
|
||||
- heading "test-1767557327567-Note 4" [level=3] [ref=e194]
|
||||
- paragraph [ref=e195]: test-1767557327567-Content 4
|
||||
- generic [ref=e196]: il y a 1 minute
|
||||
- generic [ref=e197]:
|
||||
- button "Pin" [ref=e198]:
|
||||
- img
|
||||
- button "Change color" [ref=e199]:
|
||||
- img
|
||||
- button [ref=e200]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 3 test-1767557327567-Content 3 il y a 1 minute" [ref=e201]:
|
||||
- generic [ref=e202]:
|
||||
- heading "test-1767557327567-Note 3" [level=3] [ref=e203]
|
||||
- paragraph [ref=e204]: test-1767557327567-Content 3
|
||||
- generic [ref=e205]: il y a 1 minute
|
||||
- generic [ref=e206]:
|
||||
- button "Pin" [ref=e207]:
|
||||
- img
|
||||
- button "Change color" [ref=e208]:
|
||||
- img
|
||||
- button [ref=e209]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 2 test-1767557327567-Content 2 il y a 1 minute" [ref=e210]:
|
||||
- generic [ref=e211]:
|
||||
- heading "test-1767557327567-Note 2" [level=3] [ref=e212]
|
||||
- paragraph [ref=e213]: test-1767557327567-Content 2
|
||||
- generic [ref=e214]: il y a 1 minute
|
||||
- generic [ref=e215]:
|
||||
- button "Pin" [ref=e216]:
|
||||
- img
|
||||
- button "Change color" [ref=e217]:
|
||||
- img
|
||||
- button [ref=e218]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 1 test-1767557327567-Content 1 il y a 1 minute" [ref=e219]:
|
||||
- generic [ref=e220]:
|
||||
- heading "test-1767557327567-Note 1" [level=3] [ref=e221]
|
||||
- paragraph [ref=e222]: test-1767557327567-Content 1
|
||||
- generic [ref=e223]: il y a 1 minute
|
||||
- generic [ref=e224]:
|
||||
- button "Pin" [ref=e225]:
|
||||
- img
|
||||
- button "Change color" [ref=e226]:
|
||||
- img
|
||||
- button [ref=e227]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 4 test-1767557324248-Content 4 il y a 1 minute" [ref=e228]:
|
||||
- generic [ref=e229]:
|
||||
- heading "test-1767557324248-Note 4" [level=3] [ref=e230]
|
||||
- paragraph [ref=e231]: test-1767557324248-Content 4
|
||||
- generic [ref=e232]: il y a 1 minute
|
||||
- generic [ref=e233]:
|
||||
- button "Pin" [ref=e234]:
|
||||
- img
|
||||
- button "Change color" [ref=e235]:
|
||||
- img
|
||||
- button [ref=e236]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 3 test-1767557324248-Content 3 il y a 1 minute" [ref=e237]:
|
||||
- generic [ref=e238]:
|
||||
- heading "test-1767557324248-Note 3" [level=3] [ref=e239]
|
||||
- paragraph [ref=e240]: test-1767557324248-Content 3
|
||||
- generic [ref=e241]: il y a 1 minute
|
||||
- generic [ref=e242]:
|
||||
- button "Pin" [ref=e243]:
|
||||
- img
|
||||
- button "Change color" [ref=e244]:
|
||||
- img
|
||||
- button [ref=e245]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 2 test-1767557324248-Content 2 il y a 1 minute" [ref=e246]:
|
||||
- generic [ref=e247]:
|
||||
- heading "test-1767557324248-Note 2" [level=3] [ref=e248]
|
||||
- paragraph [ref=e249]: test-1767557324248-Content 2
|
||||
- generic [ref=e250]: il y a 1 minute
|
||||
- generic [ref=e251]:
|
||||
- button "Pin" [ref=e252]:
|
||||
- img
|
||||
- button "Change color" [ref=e253]:
|
||||
- img
|
||||
- button [ref=e254]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 1 test-1767557324248-Content 1 il y a 1 minute" [ref=e255]:
|
||||
- generic [ref=e256]:
|
||||
- heading "test-1767557324248-Note 1" [level=3] [ref=e257]
|
||||
- paragraph [ref=e258]: test-1767557324248-Content 1
|
||||
- generic [ref=e259]: il y a 1 minute
|
||||
- generic [ref=e260]:
|
||||
- button "Pin" [ref=e261]:
|
||||
- img
|
||||
- button "Change color" [ref=e262]:
|
||||
- img
|
||||
- button [ref=e263]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e264]:
|
||||
- generic [ref=e265]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e266]
|
||||
- paragraph [ref=e267]: This note will have a reminder
|
||||
- generic [ref=e268]: il y a 27 minutes
|
||||
- generic [ref=e269]:
|
||||
- button "Pin" [ref=e270]:
|
||||
- img
|
||||
- button "Change color" [ref=e271]:
|
||||
- img
|
||||
- button [ref=e272]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e273]:
|
||||
- generic [ref=e274]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e275]
|
||||
- paragraph [ref=e276]: This note will have a reminder
|
||||
- generic [ref=e277]: il y a 27 minutes
|
||||
- generic [ref=e278]:
|
||||
- button "Pin" [ref=e279]:
|
||||
- img
|
||||
- button "Change color" [ref=e280]:
|
||||
- img
|
||||
- button [ref=e281]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e282]:
|
||||
- generic [ref=e283]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e284]
|
||||
- paragraph [ref=e285]: This note will have a reminder
|
||||
- generic [ref=e286]: il y a 27 minutes
|
||||
- generic [ref=e287]:
|
||||
- button "Pin" [ref=e288]:
|
||||
- img
|
||||
- button "Change color" [ref=e289]:
|
||||
- img
|
||||
- button [ref=e290]:
|
||||
- img
|
||||
- button "Test note il y a 26 minutes" [ref=e291]:
|
||||
- generic [ref=e292]:
|
||||
- paragraph [ref=e293]: Test note
|
||||
- generic [ref=e294]: il y a 26 minutes
|
||||
- generic [ref=e295]:
|
||||
- button "Pin" [ref=e296]:
|
||||
- img
|
||||
- button "Change color" [ref=e297]:
|
||||
- img
|
||||
- button [ref=e298]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e299]:
|
||||
- generic [ref=e300]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e301]
|
||||
- paragraph [ref=e302]: This note will have a reminder
|
||||
- generic [ref=e303]: il y a 27 minutes
|
||||
- generic [ref=e304]:
|
||||
- button "Pin" [ref=e305]:
|
||||
- img
|
||||
- button "Change color" [ref=e306]:
|
||||
- img
|
||||
- button [ref=e307]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e308]:
|
||||
- generic [ref=e309]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e310]
|
||||
- paragraph [ref=e311]: This note will have a reminder
|
||||
- generic [ref=e312]: il y a 27 minutes
|
||||
- generic [ref=e313]:
|
||||
- button "Pin" [ref=e314]:
|
||||
- img
|
||||
- button "Change color" [ref=e315]:
|
||||
- img
|
||||
- button [ref=e316]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e317]:
|
||||
- generic [ref=e318]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e319]
|
||||
- paragraph [ref=e320]: This note will have a reminder
|
||||
- generic [ref=e321]: il y a 27 minutes
|
||||
- generic [ref=e322]:
|
||||
- button "Pin" [ref=e323]:
|
||||
- img
|
||||
- button "Change color" [ref=e324]:
|
||||
- img
|
||||
- button [ref=e325]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e326]:
|
||||
- generic [ref=e327]:
|
||||
- img [ref=e328]
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e331]
|
||||
- paragraph [ref=e332]: This note will have a reminder
|
||||
- generic [ref=e333]: il y a 27 minutes
|
||||
- generic [ref=e334]:
|
||||
- button "Pin" [ref=e335]:
|
||||
- img
|
||||
- button "Change color" [ref=e336]:
|
||||
- img
|
||||
- button [ref=e337]:
|
||||
- img
|
||||
- button "test sample file il y a environ 5 heures" [ref=e338]:
|
||||
- generic [ref=e339]:
|
||||
- heading "test" [level=3] [ref=e340]
|
||||
- paragraph [ref=e342]: sample file
|
||||
- generic [ref=e343]: il y a environ 5 heures
|
||||
- generic [ref=e344]:
|
||||
- button "Pin" [ref=e345]:
|
||||
- img
|
||||
- button "Change color" [ref=e346]:
|
||||
- img
|
||||
- button [ref=e347]:
|
||||
- img
|
||||
- 'button "New AI Framework Released Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d''un framework pour l''IA - Optimisation de l''entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l''inférence en temps réel Tags: framework, mlops, gpu, ai, tech tech ai framework mlops gpu il y a environ 5 heures" [ref=e348]':
|
||||
- generic [ref=e349]:
|
||||
- heading "New AI Framework Released" [level=3] [ref=e350]
|
||||
- paragraph [ref=e351]: "Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d'un framework pour l'IA - Optimisation de l'entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l'inférence en temps réel Tags: framework, mlops, gpu, ai, tech"
|
||||
- generic [ref=e352]:
|
||||
- generic [ref=e353]: tech
|
||||
- generic [ref=e354]: ai
|
||||
- generic [ref=e355]: framework
|
||||
- generic [ref=e356]: mlops
|
||||
- generic [ref=e357]: gpu
|
||||
- generic [ref=e358]: il y a environ 5 heures
|
||||
- generic [ref=e359]:
|
||||
- button "Pin" [ref=e360]:
|
||||
- img
|
||||
- button "Change color" [ref=e361]:
|
||||
- img
|
||||
- button [ref=e362]:
|
||||
- img
|
||||
- button "Test Image API Note avec image il y a environ 8 heures" [ref=e363]:
|
||||
- generic [ref=e364]:
|
||||
- heading "Test Image API" [level=3] [ref=e365]
|
||||
- paragraph [ref=e367]: Note avec image
|
||||
- generic [ref=e368]: il y a environ 8 heures
|
||||
- generic [ref=e369]:
|
||||
- button "Pin" [ref=e370]:
|
||||
- img
|
||||
- button "Change color" [ref=e371]:
|
||||
- img
|
||||
- button [ref=e372]:
|
||||
- img
|
||||
- button "Test Markdown Titre Modifié Sous-titre édité Liste modifiée 1 Liste modifiée 2 Nouvelle liste 3 Texte gras modifié et italique édité console.log(\"Code modifié avec succès!\") il y a environ 5 heures" [ref=e373]:
|
||||
- generic [ref=e374]:
|
||||
- heading "Test Markdown" [level=3] [ref=e375]
|
||||
- generic [ref=e377]:
|
||||
- heading "Titre Modifié" [level=1] [ref=e378]
|
||||
- heading "Sous-titre édité" [level=2] [ref=e379]
|
||||
- list [ref=e380]:
|
||||
- listitem [ref=e381]: Liste modifiée 1
|
||||
- listitem [ref=e382]: Liste modifiée 2
|
||||
- listitem [ref=e383]: Nouvelle liste 3
|
||||
- paragraph [ref=e384]:
|
||||
- strong [ref=e385]: Texte gras modifié
|
||||
- text: et
|
||||
- emphasis [ref=e386]: italique édité
|
||||
- code [ref=e388]: console.log("Code modifié avec succès!")
|
||||
- generic [ref=e389]: il y a environ 5 heures
|
||||
- generic [ref=e390]:
|
||||
- button "Pin" [ref=e391]:
|
||||
- img
|
||||
- button "Change color" [ref=e392]:
|
||||
- img
|
||||
- button [ref=e393]:
|
||||
- img
|
||||
- button "Test Image Avec image il y a environ 8 heures" [ref=e394]:
|
||||
- generic [ref=e395]:
|
||||
- heading "Test Image" [level=3] [ref=e396]
|
||||
- paragraph [ref=e397]: Avec image
|
||||
- generic [ref=e398]: il y a environ 8 heures
|
||||
- generic [ref=e399]:
|
||||
- button "Pin" [ref=e400]:
|
||||
- img
|
||||
- button "Change color" [ref=e401]:
|
||||
- img
|
||||
- button [ref=e402]:
|
||||
- img
|
||||
- 'button "New AI Framework Released Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu tech ai framework mlops gpu il y a environ 6 heures" [ref=e403]':
|
||||
- generic [ref=e404]:
|
||||
- heading "New AI Framework Released" [level=3] [ref=e405]
|
||||
- paragraph [ref=e406]: "Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu"
|
||||
- generic [ref=e407]:
|
||||
- generic [ref=e408]: tech
|
||||
- generic [ref=e409]: ai
|
||||
- generic [ref=e410]: framework
|
||||
- generic [ref=e411]: mlops
|
||||
- generic [ref=e412]: gpu
|
||||
- generic [ref=e413]: il y a environ 6 heures
|
||||
- generic [ref=e414]:
|
||||
- button "Pin" [ref=e415]:
|
||||
- img
|
||||
- button "Change color" [ref=e416]:
|
||||
- img
|
||||
- button [ref=e417]:
|
||||
- img
|
||||
- button "Test Note This is my first note to test the Google Keep clone! il y a environ 10 heures" [ref=e418]:
|
||||
- generic [ref=e419]:
|
||||
- img [ref=e420]
|
||||
- heading "Test Note" [level=3] [ref=e423]
|
||||
- paragraph [ref=e424]: This is my first note to test the Google Keep clone!
|
||||
- generic [ref=e425]: il y a environ 10 heures
|
||||
- generic [ref=e426]:
|
||||
- button "Pin" [ref=e427]:
|
||||
- img
|
||||
- button "Change color" [ref=e428]:
|
||||
- img
|
||||
- button [ref=e429]:
|
||||
- img
|
||||
- button "Titre Modifié Contenu modifié avec succès! il y a environ 5 heures" [ref=e430]:
|
||||
- generic [ref=e431]:
|
||||
- heading "Titre Modifié" [level=3] [ref=e432]
|
||||
- paragraph [ref=e433]: Contenu modifié avec succès!
|
||||
- generic [ref=e434]: il y a environ 5 heures
|
||||
- generic [ref=e435]:
|
||||
- button "Pin" [ref=e436]:
|
||||
- img
|
||||
- button "Change color" [ref=e437]:
|
||||
- img
|
||||
- button [ref=e438]:
|
||||
- img
|
||||
- status [ref=e439]
|
||||
- button "Open Next.js Dev Tools" [ref=e445] [cursor=pointer]:
|
||||
- img [ref=e446]
|
||||
- alert [ref=e449]
|
||||
```
|
||||
85
keep-notes/playwright-report/index.html
Normal file
@ -2,7 +2,7 @@ import { defineConfig, devices } from '@playwright/test';
|
||||
|
||||
export default defineConfig({
|
||||
testDir: './tests',
|
||||
fullyParallel: true,
|
||||
fullyParallel: false, // Disabled to prevent test isolation issues
|
||||
forbidOnly: !!process.env.CI,
|
||||
retries: process.env.CI ? 2 : 0,
|
||||
workers: process.env.CI ? 1 : undefined,
|
||||
|
||||
34
keep-notes/scripts/fix-order.ts
Normal file
@ -0,0 +1,34 @@
|
||||
import { PrismaClient } from '@prisma/client'
|
||||
|
||||
const prisma = new PrismaClient()
|
||||
|
||||
async function fixOrder() {
|
||||
try {
|
||||
// Get all notes sorted by creation date
|
||||
const notes = await prisma.note.findMany({
|
||||
orderBy: [
|
||||
{ isPinned: 'desc' },
|
||||
{ createdAt: 'asc' }
|
||||
]
|
||||
})
|
||||
|
||||
console.log(`Found ${notes.length} notes`)
|
||||
|
||||
// Update order values
|
||||
for (let i = 0; i < notes.length; i++) {
|
||||
await prisma.note.update({
|
||||
where: { id: notes[i].id },
|
||||
data: { order: i }
|
||||
})
|
||||
console.log(`Updated note ${notes[i].id} - order: ${i}`)
|
||||
}
|
||||
|
||||
console.log('✅ Order values fixed!')
|
||||
} catch (error) {
|
||||
console.error('Error:', error)
|
||||
} finally {
|
||||
await prisma.$disconnect()
|
||||
}
|
||||
}
|
||||
|
||||
fixOrder()
|
||||
8
keep-notes/test-results/.last-run.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"status": "failed",
|
||||
"failedTests": [
|
||||
"1e19528dd527cbd19c0c-4c49b0bcb3667bb1a228",
|
||||
"1e19528dd527cbd19c0c-039ef3f0ab8fb4aa0094",
|
||||
"1e19528dd527cbd19c0c-ff6161ab584bdf7fa93d"
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,557 @@
|
||||
# Page snapshot
|
||||
|
||||
```yaml
|
||||
- generic [active] [ref=e1]:
|
||||
- banner [ref=e2]:
|
||||
- generic [ref=e3]:
|
||||
- link "Memento" [ref=e4] [cursor=pointer]:
|
||||
- /url: /
|
||||
- img [ref=e5]
|
||||
- generic [ref=e8]: Memento
|
||||
- generic [ref=e10]:
|
||||
- img [ref=e11]
|
||||
- textbox "Search notes..." [ref=e14]
|
||||
- button [ref=e15]:
|
||||
- img
|
||||
- navigation [ref=e16]:
|
||||
- link "Notes" [ref=e17] [cursor=pointer]:
|
||||
- /url: /
|
||||
- img [ref=e18]
|
||||
- text: Notes
|
||||
- link "Archive" [ref=e21] [cursor=pointer]:
|
||||
- /url: /archive
|
||||
- img [ref=e22]
|
||||
- text: Archive
|
||||
- main [ref=e25]:
|
||||
- generic [ref=e27]:
|
||||
- textbox "Take a note..." [ref=e28]
|
||||
- button "New checklist" [ref=e29]:
|
||||
- img
|
||||
- generic [ref=e30]:
|
||||
- generic [ref=e31]:
|
||||
- heading "Pinned" [level=2] [ref=e32]
|
||||
- button "Updated Note avec image il y a environ 8 heures" [ref=e34]:
|
||||
- generic [ref=e35]:
|
||||
- img [ref=e36]
|
||||
- heading "Updated" [level=3] [ref=e38]
|
||||
- paragraph [ref=e39]: Note avec image
|
||||
- generic [ref=e40]: il y a environ 8 heures
|
||||
- generic [ref=e41]:
|
||||
- button "Unpin" [ref=e42]:
|
||||
- img
|
||||
- button "Change color" [ref=e43]:
|
||||
- img
|
||||
- button [ref=e44]:
|
||||
- img
|
||||
- generic [ref=e45]:
|
||||
- heading "Others" [level=2] [ref=e46]
|
||||
- generic [ref=e47]:
|
||||
- button "test-1767557370056-Note 4 test-1767557370056-Content 4 il y a moins d’une minute" [ref=e48]:
|
||||
- generic [ref=e49]:
|
||||
- heading "test-1767557370056-Note 4" [level=3] [ref=e50]
|
||||
- paragraph [ref=e51]: test-1767557370056-Content 4
|
||||
- generic [ref=e52]: il y a moins d’une minute
|
||||
- generic [ref=e53]:
|
||||
- button "Pin" [ref=e54]:
|
||||
- img
|
||||
- button "Change color" [ref=e55]:
|
||||
- img
|
||||
- button [ref=e56]:
|
||||
- img
|
||||
- button "test-1767557370056-Note 3 test-1767557370056-Content 3 il y a moins d’une minute" [ref=e57]:
|
||||
- generic [ref=e58]:
|
||||
- heading "test-1767557370056-Note 3" [level=3] [ref=e59]
|
||||
- paragraph [ref=e60]: test-1767557370056-Content 3
|
||||
- generic [ref=e61]: il y a moins d’une minute
|
||||
- generic [ref=e62]:
|
||||
- button "Pin" [ref=e63]:
|
||||
- img
|
||||
- button "Change color" [ref=e64]:
|
||||
- img
|
||||
- button [ref=e65]:
|
||||
- img
|
||||
- button "test-1767557370056-Note 2 test-1767557370056-Content 2 il y a moins d’une minute" [ref=e66]:
|
||||
- generic [ref=e67]:
|
||||
- heading "test-1767557370056-Note 2" [level=3] [ref=e68]
|
||||
- paragraph [ref=e69]: test-1767557370056-Content 2
|
||||
- generic [ref=e70]: il y a moins d’une minute
|
||||
- generic [ref=e71]:
|
||||
- button "Pin" [ref=e72]:
|
||||
- img
|
||||
- button "Change color" [ref=e73]:
|
||||
- img
|
||||
- button [ref=e74]:
|
||||
- img
|
||||
- button "test-1767557370056-Note 1 test-1767557370056-Content 1 il y a moins d’une minute" [ref=e75]:
|
||||
- generic [ref=e76]:
|
||||
- heading "test-1767557370056-Note 1" [level=3] [ref=e77]
|
||||
- paragraph [ref=e78]: test-1767557370056-Content 1
|
||||
- generic [ref=e79]: il y a moins d’une minute
|
||||
- generic [ref=e80]:
|
||||
- button "Pin" [ref=e81]:
|
||||
- img
|
||||
- button "Change color" [ref=e82]:
|
||||
- img
|
||||
- button [ref=e83]:
|
||||
- img
|
||||
- button "test-1767557339218-Note 4 test-1767557339218-Content 4 il y a 1 minute" [ref=e84]:
|
||||
- generic [ref=e85]:
|
||||
- heading "test-1767557339218-Note 4" [level=3] [ref=e86]
|
||||
- paragraph [ref=e87]: test-1767557339218-Content 4
|
||||
- generic [ref=e88]: il y a 1 minute
|
||||
- generic [ref=e89]:
|
||||
- button "Pin" [ref=e90]:
|
||||
- img
|
||||
- button "Change color" [ref=e91]:
|
||||
- img
|
||||
- button [ref=e92]:
|
||||
- img
|
||||
- button "test-1767557339218-Note 3 test-1767557339218-Content 3 il y a 1 minute" [ref=e93]:
|
||||
- generic [ref=e94]:
|
||||
- heading "test-1767557339218-Note 3" [level=3] [ref=e95]
|
||||
- paragraph [ref=e96]: test-1767557339218-Content 3
|
||||
- generic [ref=e97]: il y a 1 minute
|
||||
- generic [ref=e98]:
|
||||
- button "Pin" [ref=e99]:
|
||||
- img
|
||||
- button "Change color" [ref=e100]:
|
||||
- img
|
||||
- button [ref=e101]:
|
||||
- img
|
||||
- button "test-1767557339218-Note 2 test-1767557339218-Content 2 il y a 1 minute" [ref=e102]:
|
||||
- generic [ref=e103]:
|
||||
- heading "test-1767557339218-Note 2" [level=3] [ref=e104]
|
||||
- paragraph [ref=e105]: test-1767557339218-Content 2
|
||||
- generic [ref=e106]: il y a 1 minute
|
||||
- generic [ref=e107]:
|
||||
- button "Pin" [ref=e108]:
|
||||
- img
|
||||
- button "Change color" [ref=e109]:
|
||||
- img
|
||||
- button [ref=e110]:
|
||||
- img
|
||||
- button "test-1767557339218-Note 1 test-1767557339218-Content 1 il y a 1 minute" [ref=e111]:
|
||||
- generic [ref=e112]:
|
||||
- heading "test-1767557339218-Note 1" [level=3] [ref=e113]
|
||||
- paragraph [ref=e114]: test-1767557339218-Content 1
|
||||
- generic [ref=e115]: il y a 1 minute
|
||||
- generic [ref=e116]:
|
||||
- button "Pin" [ref=e117]:
|
||||
- img
|
||||
- button "Change color" [ref=e118]:
|
||||
- img
|
||||
- button [ref=e119]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 4 test-1767557334587-Content 4 il y a 1 minute" [ref=e120]:
|
||||
- generic [ref=e121]:
|
||||
- heading "test-1767557334587-Note 4" [level=3] [ref=e122]
|
||||
- paragraph [ref=e123]: test-1767557334587-Content 4
|
||||
- generic [ref=e124]: il y a 1 minute
|
||||
- generic [ref=e125]:
|
||||
- button "Pin" [ref=e126]:
|
||||
- img
|
||||
- button "Change color" [ref=e127]:
|
||||
- img
|
||||
- button [ref=e128]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 3 test-1767557334587-Content 3 il y a 1 minute" [ref=e129]:
|
||||
- generic [ref=e130]:
|
||||
- heading "test-1767557334587-Note 3" [level=3] [ref=e131]
|
||||
- paragraph [ref=e132]: test-1767557334587-Content 3
|
||||
- generic [ref=e133]: il y a 1 minute
|
||||
- generic [ref=e134]:
|
||||
- button "Pin" [ref=e135]:
|
||||
- img
|
||||
- button "Change color" [ref=e136]:
|
||||
- img
|
||||
- button [ref=e137]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 2 test-1767557334587-Content 2 il y a 1 minute" [ref=e138]:
|
||||
- generic [ref=e139]:
|
||||
- heading "test-1767557334587-Note 2" [level=3] [ref=e140]
|
||||
- paragraph [ref=e141]: test-1767557334587-Content 2
|
||||
- generic [ref=e142]: il y a 1 minute
|
||||
- generic [ref=e143]:
|
||||
- button "Pin" [ref=e144]:
|
||||
- img
|
||||
- button "Change color" [ref=e145]:
|
||||
- img
|
||||
- button [ref=e146]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 1 test-1767557334587-Content 1 il y a 1 minute" [ref=e147]:
|
||||
- generic [ref=e148]:
|
||||
- heading "test-1767557334587-Note 1" [level=3] [ref=e149]
|
||||
- paragraph [ref=e150]: test-1767557334587-Content 1
|
||||
- generic [ref=e151]: il y a 1 minute
|
||||
- generic [ref=e152]:
|
||||
- button "Pin" [ref=e153]:
|
||||
- img
|
||||
- button "Change color" [ref=e154]:
|
||||
- img
|
||||
- button [ref=e155]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 4 test-1767557330820-Content 4 il y a 1 minute" [ref=e156]:
|
||||
- generic [ref=e157]:
|
||||
- heading "test-1767557330820-Note 4" [level=3] [ref=e158]
|
||||
- paragraph [ref=e159]: test-1767557330820-Content 4
|
||||
- generic [ref=e160]: il y a 1 minute
|
||||
- generic [ref=e161]:
|
||||
- button "Pin" [ref=e162]:
|
||||
- img
|
||||
- button "Change color" [ref=e163]:
|
||||
- img
|
||||
- button [ref=e164]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 3 test-1767557330820-Content 3 il y a 1 minute" [ref=e165]:
|
||||
- generic [ref=e166]:
|
||||
- heading "test-1767557330820-Note 3" [level=3] [ref=e167]
|
||||
- paragraph [ref=e168]: test-1767557330820-Content 3
|
||||
- generic [ref=e169]: il y a 1 minute
|
||||
- generic [ref=e170]:
|
||||
- button "Pin" [ref=e171]:
|
||||
- img
|
||||
- button "Change color" [ref=e172]:
|
||||
- img
|
||||
- button [ref=e173]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 2 test-1767557330820-Content 2 il y a 1 minute" [ref=e174]:
|
||||
- generic [ref=e175]:
|
||||
- heading "test-1767557330820-Note 2" [level=3] [ref=e176]
|
||||
- paragraph [ref=e177]: test-1767557330820-Content 2
|
||||
- generic [ref=e178]: il y a 1 minute
|
||||
- generic [ref=e179]:
|
||||
- button "Pin" [ref=e180]:
|
||||
- img
|
||||
- button "Change color" [ref=e181]:
|
||||
- img
|
||||
- button [ref=e182]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 1 test-1767557330820-Content 1 il y a 1 minute" [ref=e183]:
|
||||
- generic [ref=e184]:
|
||||
- heading "test-1767557330820-Note 1" [level=3] [ref=e185]
|
||||
- paragraph [ref=e186]: test-1767557330820-Content 1
|
||||
- generic [ref=e187]: il y a 1 minute
|
||||
- generic [ref=e188]:
|
||||
- button "Pin" [ref=e189]:
|
||||
- img
|
||||
- button "Change color" [ref=e190]:
|
||||
- img
|
||||
- button [ref=e191]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 4 test-1767557327567-Content 4 il y a 1 minute" [ref=e192]:
|
||||
- generic [ref=e193]:
|
||||
- heading "test-1767557327567-Note 4" [level=3] [ref=e194]
|
||||
- paragraph [ref=e195]: test-1767557327567-Content 4
|
||||
- generic [ref=e196]: il y a 1 minute
|
||||
- generic [ref=e197]:
|
||||
- button "Pin" [ref=e198]:
|
||||
- img
|
||||
- button "Change color" [ref=e199]:
|
||||
- img
|
||||
- button [ref=e200]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 3 test-1767557327567-Content 3 il y a 1 minute" [ref=e201]:
|
||||
- generic [ref=e202]:
|
||||
- heading "test-1767557327567-Note 3" [level=3] [ref=e203]
|
||||
- paragraph [ref=e204]: test-1767557327567-Content 3
|
||||
- generic [ref=e205]: il y a 1 minute
|
||||
- generic [ref=e206]:
|
||||
- button "Pin" [ref=e207]:
|
||||
- img
|
||||
- button "Change color" [ref=e208]:
|
||||
- img
|
||||
- button [ref=e209]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 2 test-1767557327567-Content 2 il y a 1 minute" [ref=e210]:
|
||||
- generic [ref=e211]:
|
||||
- heading "test-1767557327567-Note 2" [level=3] [ref=e212]
|
||||
- paragraph [ref=e213]: test-1767557327567-Content 2
|
||||
- generic [ref=e214]: il y a 1 minute
|
||||
- generic [ref=e215]:
|
||||
- button "Pin" [ref=e216]:
|
||||
- img
|
||||
- button "Change color" [ref=e217]:
|
||||
- img
|
||||
- button [ref=e218]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 1 test-1767557327567-Content 1 il y a 1 minute" [ref=e219]:
|
||||
- generic [ref=e220]:
|
||||
- heading "test-1767557327567-Note 1" [level=3] [ref=e221]
|
||||
- paragraph [ref=e222]: test-1767557327567-Content 1
|
||||
- generic [ref=e223]: il y a 1 minute
|
||||
- generic [ref=e224]:
|
||||
- button "Pin" [ref=e225]:
|
||||
- img
|
||||
- button "Change color" [ref=e226]:
|
||||
- img
|
||||
- button [ref=e227]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 4 test-1767557324248-Content 4 il y a 1 minute" [ref=e228]:
|
||||
- generic [ref=e229]:
|
||||
- heading "test-1767557324248-Note 4" [level=3] [ref=e230]
|
||||
- paragraph [ref=e231]: test-1767557324248-Content 4
|
||||
- generic [ref=e232]: il y a 1 minute
|
||||
- generic [ref=e233]:
|
||||
- button "Pin" [ref=e234]:
|
||||
- img
|
||||
- button "Change color" [ref=e235]:
|
||||
- img
|
||||
- button [ref=e236]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 3 test-1767557324248-Content 3 il y a 1 minute" [ref=e237]:
|
||||
- generic [ref=e238]:
|
||||
- heading "test-1767557324248-Note 3" [level=3] [ref=e239]
|
||||
- paragraph [ref=e240]: test-1767557324248-Content 3
|
||||
- generic [ref=e241]: il y a 1 minute
|
||||
- generic [ref=e242]:
|
||||
- button "Pin" [ref=e243]:
|
||||
- img
|
||||
- button "Change color" [ref=e244]:
|
||||
- img
|
||||
- button [ref=e245]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 2 test-1767557324248-Content 2 il y a 1 minute" [ref=e246]:
|
||||
- generic [ref=e247]:
|
||||
- heading "test-1767557324248-Note 2" [level=3] [ref=e248]
|
||||
- paragraph [ref=e249]: test-1767557324248-Content 2
|
||||
- generic [ref=e250]: il y a 1 minute
|
||||
- generic [ref=e251]:
|
||||
- button "Pin" [ref=e252]:
|
||||
- img
|
||||
- button "Change color" [ref=e253]:
|
||||
- img
|
||||
- button [ref=e254]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 1 test-1767557324248-Content 1 il y a 1 minute" [ref=e255]:
|
||||
- generic [ref=e256]:
|
||||
- heading "test-1767557324248-Note 1" [level=3] [ref=e257]
|
||||
- paragraph [ref=e258]: test-1767557324248-Content 1
|
||||
- generic [ref=e259]: il y a 1 minute
|
||||
- generic [ref=e260]:
|
||||
- button "Pin" [ref=e261]:
|
||||
- img
|
||||
- button "Change color" [ref=e262]:
|
||||
- img
|
||||
- button [ref=e263]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e264]:
|
||||
- generic [ref=e265]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e266]
|
||||
- paragraph [ref=e267]: This note will have a reminder
|
||||
- generic [ref=e268]: il y a 27 minutes
|
||||
- generic [ref=e269]:
|
||||
- button "Pin" [ref=e270]:
|
||||
- img
|
||||
- button "Change color" [ref=e271]:
|
||||
- img
|
||||
- button [ref=e272]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e273]:
|
||||
- generic [ref=e274]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e275]
|
||||
- paragraph [ref=e276]: This note will have a reminder
|
||||
- generic [ref=e277]: il y a 27 minutes
|
||||
- generic [ref=e278]:
|
||||
- button "Pin" [ref=e279]:
|
||||
- img
|
||||
- button "Change color" [ref=e280]:
|
||||
- img
|
||||
- button [ref=e281]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e282]:
|
||||
- generic [ref=e283]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e284]
|
||||
- paragraph [ref=e285]: This note will have a reminder
|
||||
- generic [ref=e286]: il y a 27 minutes
|
||||
- generic [ref=e287]:
|
||||
- button "Pin" [ref=e288]:
|
||||
- img
|
||||
- button "Change color" [ref=e289]:
|
||||
- img
|
||||
- button [ref=e290]:
|
||||
- img
|
||||
- button "Test note il y a 26 minutes" [ref=e291]:
|
||||
- generic [ref=e292]:
|
||||
- paragraph [ref=e293]: Test note
|
||||
- generic [ref=e294]: il y a 26 minutes
|
||||
- generic [ref=e295]:
|
||||
- button "Pin" [ref=e296]:
|
||||
- img
|
||||
- button "Change color" [ref=e297]:
|
||||
- img
|
||||
- button [ref=e298]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e299]:
|
||||
- generic [ref=e300]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e301]
|
||||
- paragraph [ref=e302]: This note will have a reminder
|
||||
- generic [ref=e303]: il y a 27 minutes
|
||||
- generic [ref=e304]:
|
||||
- button "Pin" [ref=e305]:
|
||||
- img
|
||||
- button "Change color" [ref=e306]:
|
||||
- img
|
||||
- button [ref=e307]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e308]:
|
||||
- generic [ref=e309]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e310]
|
||||
- paragraph [ref=e311]: This note will have a reminder
|
||||
- generic [ref=e312]: il y a 27 minutes
|
||||
- generic [ref=e313]:
|
||||
- button "Pin" [ref=e314]:
|
||||
- img
|
||||
- button "Change color" [ref=e315]:
|
||||
- img
|
||||
- button [ref=e316]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e317]:
|
||||
- generic [ref=e318]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e319]
|
||||
- paragraph [ref=e320]: This note will have a reminder
|
||||
- generic [ref=e321]: il y a 27 minutes
|
||||
- generic [ref=e322]:
|
||||
- button "Pin" [ref=e323]:
|
||||
- img
|
||||
- button "Change color" [ref=e324]:
|
||||
- img
|
||||
- button [ref=e325]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e326]:
|
||||
- generic [ref=e327]:
|
||||
- img [ref=e328]
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e331]
|
||||
- paragraph [ref=e332]: This note will have a reminder
|
||||
- generic [ref=e333]: il y a 27 minutes
|
||||
- generic [ref=e334]:
|
||||
- button "Pin" [ref=e335]:
|
||||
- img
|
||||
- button "Change color" [ref=e336]:
|
||||
- img
|
||||
- button [ref=e337]:
|
||||
- img
|
||||
- button "test sample file il y a environ 5 heures" [ref=e338]:
|
||||
- generic [ref=e339]:
|
||||
- heading "test" [level=3] [ref=e340]
|
||||
- paragraph [ref=e342]: sample file
|
||||
- generic [ref=e343]: il y a environ 5 heures
|
||||
- generic [ref=e344]:
|
||||
- button "Pin" [ref=e345]:
|
||||
- img
|
||||
- button "Change color" [ref=e346]:
|
||||
- img
|
||||
- button [ref=e347]:
|
||||
- img
|
||||
- 'button "New AI Framework Released Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d''un framework pour l''IA - Optimisation de l''entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l''inférence en temps réel Tags: framework, mlops, gpu, ai, tech tech ai framework mlops gpu il y a environ 5 heures" [ref=e348]':
|
||||
- generic [ref=e349]:
|
||||
- heading "New AI Framework Released" [level=3] [ref=e350]
|
||||
- paragraph [ref=e351]: "Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d'un framework pour l'IA - Optimisation de l'entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l'inférence en temps réel Tags: framework, mlops, gpu, ai, tech"
|
||||
- generic [ref=e352]:
|
||||
- generic [ref=e353]: tech
|
||||
- generic [ref=e354]: ai
|
||||
- generic [ref=e355]: framework
|
||||
- generic [ref=e356]: mlops
|
||||
- generic [ref=e357]: gpu
|
||||
- generic [ref=e358]: il y a environ 5 heures
|
||||
- generic [ref=e359]:
|
||||
- button "Pin" [ref=e360]:
|
||||
- img
|
||||
- button "Change color" [ref=e361]:
|
||||
- img
|
||||
- button [ref=e362]:
|
||||
- img
|
||||
- button "Test Image API Note avec image il y a environ 8 heures" [ref=e363]:
|
||||
- generic [ref=e364]:
|
||||
- heading "Test Image API" [level=3] [ref=e365]
|
||||
- paragraph [ref=e367]: Note avec image
|
||||
- generic [ref=e368]: il y a environ 8 heures
|
||||
- generic [ref=e369]:
|
||||
- button "Pin" [ref=e370]:
|
||||
- img
|
||||
- button "Change color" [ref=e371]:
|
||||
- img
|
||||
- button [ref=e372]:
|
||||
- img
|
||||
- button "Test Markdown Titre Modifié Sous-titre édité Liste modifiée 1 Liste modifiée 2 Nouvelle liste 3 Texte gras modifié et italique édité console.log(\"Code modifié avec succès!\") il y a environ 5 heures" [ref=e373]:
|
||||
- generic [ref=e374]:
|
||||
- heading "Test Markdown" [level=3] [ref=e375]
|
||||
- generic [ref=e377]:
|
||||
- heading "Titre Modifié" [level=1] [ref=e378]
|
||||
- heading "Sous-titre édité" [level=2] [ref=e379]
|
||||
- list [ref=e380]:
|
||||
- listitem [ref=e381]: Liste modifiée 1
|
||||
- listitem [ref=e382]: Liste modifiée 2
|
||||
- listitem [ref=e383]: Nouvelle liste 3
|
||||
- paragraph [ref=e384]:
|
||||
- strong [ref=e385]: Texte gras modifié
|
||||
- text: et
|
||||
- emphasis [ref=e386]: italique édité
|
||||
- code [ref=e388]: console.log("Code modifié avec succès!")
|
||||
- generic [ref=e389]: il y a environ 5 heures
|
||||
- generic [ref=e390]:
|
||||
- button "Pin" [ref=e391]:
|
||||
- img
|
||||
- button "Change color" [ref=e392]:
|
||||
- img
|
||||
- button [ref=e393]:
|
||||
- img
|
||||
- button "Test Image Avec image il y a environ 8 heures" [ref=e394]:
|
||||
- generic [ref=e395]:
|
||||
- heading "Test Image" [level=3] [ref=e396]
|
||||
- paragraph [ref=e397]: Avec image
|
||||
- generic [ref=e398]: il y a environ 8 heures
|
||||
- generic [ref=e399]:
|
||||
- button "Pin" [ref=e400]:
|
||||
- img
|
||||
- button "Change color" [ref=e401]:
|
||||
- img
|
||||
- button [ref=e402]:
|
||||
- img
|
||||
- 'button "New AI Framework Released Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu tech ai framework mlops gpu il y a environ 6 heures" [ref=e403]':
|
||||
- generic [ref=e404]:
|
||||
- heading "New AI Framework Released" [level=3] [ref=e405]
|
||||
- paragraph [ref=e406]: "Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu"
|
||||
- generic [ref=e407]:
|
||||
- generic [ref=e408]: tech
|
||||
- generic [ref=e409]: ai
|
||||
- generic [ref=e410]: framework
|
||||
- generic [ref=e411]: mlops
|
||||
- generic [ref=e412]: gpu
|
||||
- generic [ref=e413]: il y a environ 6 heures
|
||||
- generic [ref=e414]:
|
||||
- button "Pin" [ref=e415]:
|
||||
- img
|
||||
- button "Change color" [ref=e416]:
|
||||
- img
|
||||
- button [ref=e417]:
|
||||
- img
|
||||
- button "Test Note This is my first note to test the Google Keep clone! il y a environ 10 heures" [ref=e418]:
|
||||
- generic [ref=e419]:
|
||||
- img [ref=e420]
|
||||
- heading "Test Note" [level=3] [ref=e423]
|
||||
- paragraph [ref=e424]: This is my first note to test the Google Keep clone!
|
||||
- generic [ref=e425]: il y a environ 10 heures
|
||||
- generic [ref=e426]:
|
||||
- button "Pin" [ref=e427]:
|
||||
- img
|
||||
- button "Change color" [ref=e428]:
|
||||
- img
|
||||
- button [ref=e429]:
|
||||
- img
|
||||
- button "Titre Modifié Contenu modifié avec succès! il y a environ 5 heures" [ref=e430]:
|
||||
- generic [ref=e431]:
|
||||
- heading "Titre Modifié" [level=3] [ref=e432]
|
||||
- paragraph [ref=e433]: Contenu modifié avec succès!
|
||||
- generic [ref=e434]: il y a environ 5 heures
|
||||
- generic [ref=e435]:
|
||||
- button "Pin" [ref=e436]:
|
||||
- img
|
||||
- button "Change color" [ref=e437]:
|
||||
- img
|
||||
- button [ref=e438]:
|
||||
- img
|
||||
- status [ref=e439]
|
||||
- button "Open Next.js Dev Tools" [ref=e445] [cursor=pointer]:
|
||||
- img [ref=e446]
|
||||
- alert [ref=e449]
|
||||
```
|
||||
@ -0,0 +1,478 @@
|
||||
# Page snapshot
|
||||
|
||||
```yaml
|
||||
- generic [active] [ref=e1]:
|
||||
- banner [ref=e2]:
|
||||
- generic [ref=e3]:
|
||||
- link "Memento" [ref=e4] [cursor=pointer]:
|
||||
- /url: /
|
||||
- img [ref=e5]
|
||||
- generic [ref=e8]: Memento
|
||||
- generic [ref=e10]:
|
||||
- img [ref=e11]
|
||||
- textbox "Search notes..." [ref=e14]
|
||||
- button [ref=e15]:
|
||||
- img
|
||||
- navigation [ref=e16]:
|
||||
- link "Notes" [ref=e17] [cursor=pointer]:
|
||||
- /url: /
|
||||
- img [ref=e18]
|
||||
- text: Notes
|
||||
- link "Archive" [ref=e21] [cursor=pointer]:
|
||||
- /url: /archive
|
||||
- img [ref=e22]
|
||||
- text: Archive
|
||||
- main [ref=e25]:
|
||||
- generic [ref=e27]:
|
||||
- textbox "Take a note..." [ref=e28]
|
||||
- button "New checklist" [ref=e29]:
|
||||
- img
|
||||
- generic [ref=e30]:
|
||||
- generic [ref=e31]:
|
||||
- heading "Pinned" [level=2] [ref=e32]
|
||||
- button "Updated Note avec image il y a environ 8 heures" [ref=e34]:
|
||||
- generic [ref=e35]:
|
||||
- img [ref=e36]
|
||||
- heading "Updated" [level=3] [ref=e38]
|
||||
- paragraph [ref=e39]: Note avec image
|
||||
- generic [ref=e40]: il y a environ 8 heures
|
||||
- generic [ref=e41]:
|
||||
- button "Unpin" [ref=e42]:
|
||||
- img
|
||||
- button "Change color" [ref=e43]:
|
||||
- img
|
||||
- button [ref=e44]:
|
||||
- img
|
||||
- generic [ref=e45]:
|
||||
- heading "Others" [level=2] [ref=e46]
|
||||
- generic [ref=e47]:
|
||||
- button "test-1767557334587-Note 4 test-1767557334587-Content 4 il y a moins d’une minute" [ref=e48]:
|
||||
- generic [ref=e49]:
|
||||
- heading "test-1767557334587-Note 4" [level=3] [ref=e50]
|
||||
- paragraph [ref=e51]: test-1767557334587-Content 4
|
||||
- generic [ref=e52]: il y a moins d’une minute
|
||||
- generic [ref=e53]:
|
||||
- button "Pin" [ref=e54]:
|
||||
- img
|
||||
- button "Change color" [ref=e55]:
|
||||
- img
|
||||
- button [ref=e56]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 3 test-1767557334587-Content 3 il y a moins d’une minute" [ref=e57]:
|
||||
- generic [ref=e58]:
|
||||
- heading "test-1767557334587-Note 3" [level=3] [ref=e59]
|
||||
- paragraph [ref=e60]: test-1767557334587-Content 3
|
||||
- generic [ref=e61]: il y a moins d’une minute
|
||||
- generic [ref=e62]:
|
||||
- button "Pin" [ref=e63]:
|
||||
- img
|
||||
- button "Change color" [ref=e64]:
|
||||
- img
|
||||
- button [ref=e65]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 2 test-1767557334587-Content 2 il y a moins d’une minute" [ref=e66]:
|
||||
- generic [ref=e67]:
|
||||
- heading "test-1767557334587-Note 2" [level=3] [ref=e68]
|
||||
- paragraph [ref=e69]: test-1767557334587-Content 2
|
||||
- generic [ref=e70]: il y a moins d’une minute
|
||||
- generic [ref=e71]:
|
||||
- button "Pin" [ref=e72]:
|
||||
- img
|
||||
- button "Change color" [ref=e73]:
|
||||
- img
|
||||
- button [ref=e74]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 1 test-1767557334587-Content 1 il y a moins d’une minute" [ref=e75]:
|
||||
- generic [ref=e76]:
|
||||
- heading "test-1767557334587-Note 1" [level=3] [ref=e77]
|
||||
- paragraph [ref=e78]: test-1767557334587-Content 1
|
||||
- generic [ref=e79]: il y a moins d’une minute
|
||||
- generic [ref=e80]:
|
||||
- button "Pin" [ref=e81]:
|
||||
- img
|
||||
- button "Change color" [ref=e82]:
|
||||
- img
|
||||
- button [ref=e83]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 4 test-1767557330820-Content 4 il y a moins d’une minute" [ref=e84]:
|
||||
- generic [ref=e85]:
|
||||
- heading "test-1767557330820-Note 4" [level=3] [ref=e86]
|
||||
- paragraph [ref=e87]: test-1767557330820-Content 4
|
||||
- generic [ref=e88]: il y a moins d’une minute
|
||||
- generic [ref=e89]:
|
||||
- button "Pin" [ref=e90]:
|
||||
- img
|
||||
- button "Change color" [ref=e91]:
|
||||
- img
|
||||
- button [ref=e92]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 3 test-1767557330820-Content 3 il y a moins d’une minute" [ref=e93]:
|
||||
- generic [ref=e94]:
|
||||
- heading "test-1767557330820-Note 3" [level=3] [ref=e95]
|
||||
- paragraph [ref=e96]: test-1767557330820-Content 3
|
||||
- generic [ref=e97]: il y a moins d’une minute
|
||||
- generic [ref=e98]:
|
||||
- button "Pin" [ref=e99]:
|
||||
- img
|
||||
- button "Change color" [ref=e100]:
|
||||
- img
|
||||
- button [ref=e101]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 2 test-1767557330820-Content 2 il y a moins d’une minute" [ref=e102]:
|
||||
- generic [ref=e103]:
|
||||
- heading "test-1767557330820-Note 2" [level=3] [ref=e104]
|
||||
- paragraph [ref=e105]: test-1767557330820-Content 2
|
||||
- generic [ref=e106]: il y a moins d’une minute
|
||||
- generic [ref=e107]:
|
||||
- button "Pin" [ref=e108]:
|
||||
- img
|
||||
- button "Change color" [ref=e109]:
|
||||
- img
|
||||
- button [ref=e110]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 1 test-1767557330820-Content 1 il y a moins d’une minute" [ref=e111]:
|
||||
- generic [ref=e112]:
|
||||
- heading "test-1767557330820-Note 1" [level=3] [ref=e113]
|
||||
- paragraph [ref=e114]: test-1767557330820-Content 1
|
||||
- generic [ref=e115]: il y a moins d’une minute
|
||||
- generic [ref=e116]:
|
||||
- button "Pin" [ref=e117]:
|
||||
- img
|
||||
- button "Change color" [ref=e118]:
|
||||
- img
|
||||
- button [ref=e119]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 4 test-1767557327567-Content 4 il y a moins d’une minute" [ref=e120]:
|
||||
- generic [ref=e121]:
|
||||
- heading "test-1767557327567-Note 4" [level=3] [ref=e122]
|
||||
- paragraph [ref=e123]: test-1767557327567-Content 4
|
||||
- generic [ref=e124]: il y a moins d’une minute
|
||||
- generic [ref=e125]:
|
||||
- button "Pin" [ref=e126]:
|
||||
- img
|
||||
- button "Change color" [ref=e127]:
|
||||
- img
|
||||
- button [ref=e128]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 3 test-1767557327567-Content 3 il y a moins d’une minute" [ref=e129]:
|
||||
- generic [ref=e130]:
|
||||
- heading "test-1767557327567-Note 3" [level=3] [ref=e131]
|
||||
- paragraph [ref=e132]: test-1767557327567-Content 3
|
||||
- generic [ref=e133]: il y a moins d’une minute
|
||||
- generic [ref=e134]:
|
||||
- button "Pin" [ref=e135]:
|
||||
- img
|
||||
- button "Change color" [ref=e136]:
|
||||
- img
|
||||
- button [ref=e137]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 2 test-1767557327567-Content 2 il y a moins d’une minute" [ref=e138]:
|
||||
- generic [ref=e139]:
|
||||
- heading "test-1767557327567-Note 2" [level=3] [ref=e140]
|
||||
- paragraph [ref=e141]: test-1767557327567-Content 2
|
||||
- generic [ref=e142]: il y a moins d’une minute
|
||||
- generic [ref=e143]:
|
||||
- button "Pin" [ref=e144]:
|
||||
- img
|
||||
- button "Change color" [ref=e145]:
|
||||
- img
|
||||
- button [ref=e146]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 1 test-1767557327567-Content 1 il y a moins d’une minute" [ref=e147]:
|
||||
- generic [ref=e148]:
|
||||
- heading "test-1767557327567-Note 1" [level=3] [ref=e149]
|
||||
- paragraph [ref=e150]: test-1767557327567-Content 1
|
||||
- generic [ref=e151]: il y a moins d’une minute
|
||||
- generic [ref=e152]:
|
||||
- button "Pin" [ref=e153]:
|
||||
- img
|
||||
- button "Change color" [ref=e154]:
|
||||
- img
|
||||
- button [ref=e155]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 4 test-1767557324248-Content 4 il y a moins d’une minute" [ref=e156]:
|
||||
- generic [ref=e157]:
|
||||
- heading "test-1767557324248-Note 4" [level=3] [ref=e158]
|
||||
- paragraph [ref=e159]: test-1767557324248-Content 4
|
||||
- generic [ref=e160]: il y a moins d’une minute
|
||||
- generic [ref=e161]:
|
||||
- button "Pin" [ref=e162]:
|
||||
- img
|
||||
- button "Change color" [ref=e163]:
|
||||
- img
|
||||
- button [ref=e164]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 3 test-1767557324248-Content 3 il y a moins d’une minute" [ref=e165]:
|
||||
- generic [ref=e166]:
|
||||
- heading "test-1767557324248-Note 3" [level=3] [ref=e167]
|
||||
- paragraph [ref=e168]: test-1767557324248-Content 3
|
||||
- generic [ref=e169]: il y a moins d’une minute
|
||||
- generic [ref=e170]:
|
||||
- button "Pin" [ref=e171]:
|
||||
- img
|
||||
- button "Change color" [ref=e172]:
|
||||
- img
|
||||
- button [ref=e173]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 2 test-1767557324248-Content 2 il y a moins d’une minute" [ref=e174]:
|
||||
- generic [ref=e175]:
|
||||
- heading "test-1767557324248-Note 2" [level=3] [ref=e176]
|
||||
- paragraph [ref=e177]: test-1767557324248-Content 2
|
||||
- generic [ref=e178]: il y a moins d’une minute
|
||||
- generic [ref=e179]:
|
||||
- button "Pin" [ref=e180]:
|
||||
- img
|
||||
- button "Change color" [ref=e181]:
|
||||
- img
|
||||
- button [ref=e182]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 1 test-1767557324248-Content 1 il y a moins d’une minute" [ref=e183]:
|
||||
- generic [ref=e184]:
|
||||
- heading "test-1767557324248-Note 1" [level=3] [ref=e185]
|
||||
- paragraph [ref=e186]: test-1767557324248-Content 1
|
||||
- generic [ref=e187]: il y a moins d’une minute
|
||||
- generic [ref=e188]:
|
||||
- button "Pin" [ref=e189]:
|
||||
- img
|
||||
- button "Change color" [ref=e190]:
|
||||
- img
|
||||
- button [ref=e191]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e192]:
|
||||
- generic [ref=e193]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e194]
|
||||
- paragraph [ref=e195]: This note will have a reminder
|
||||
- generic [ref=e196]: il y a 26 minutes
|
||||
- generic [ref=e197]:
|
||||
- button "Pin" [ref=e198]:
|
||||
- img
|
||||
- button "Change color" [ref=e199]:
|
||||
- img
|
||||
- button [ref=e200]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e201]:
|
||||
- generic [ref=e202]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e203]
|
||||
- paragraph [ref=e204]: This note will have a reminder
|
||||
- generic [ref=e205]: il y a 26 minutes
|
||||
- generic [ref=e206]:
|
||||
- button "Pin" [ref=e207]:
|
||||
- img
|
||||
- button "Change color" [ref=e208]:
|
||||
- img
|
||||
- button [ref=e209]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e210]:
|
||||
- generic [ref=e211]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e212]
|
||||
- paragraph [ref=e213]: This note will have a reminder
|
||||
- generic [ref=e214]: il y a 26 minutes
|
||||
- generic [ref=e215]:
|
||||
- button "Pin" [ref=e216]:
|
||||
- img
|
||||
- button "Change color" [ref=e217]:
|
||||
- img
|
||||
- button [ref=e218]:
|
||||
- img
|
||||
- button "Test note il y a 26 minutes" [ref=e219]:
|
||||
- generic [ref=e220]:
|
||||
- paragraph [ref=e221]: Test note
|
||||
- generic [ref=e222]: il y a 26 minutes
|
||||
- generic [ref=e223]:
|
||||
- button "Pin" [ref=e224]:
|
||||
- img
|
||||
- button "Change color" [ref=e225]:
|
||||
- img
|
||||
- button [ref=e226]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e227]:
|
||||
- generic [ref=e228]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e229]
|
||||
- paragraph [ref=e230]: This note will have a reminder
|
||||
- generic [ref=e231]: il y a 26 minutes
|
||||
- generic [ref=e232]:
|
||||
- button "Pin" [ref=e233]:
|
||||
- img
|
||||
- button "Change color" [ref=e234]:
|
||||
- img
|
||||
- button [ref=e235]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e236]:
|
||||
- generic [ref=e237]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e238]
|
||||
- paragraph [ref=e239]: This note will have a reminder
|
||||
- generic [ref=e240]: il y a 26 minutes
|
||||
- generic [ref=e241]:
|
||||
- button "Pin" [ref=e242]:
|
||||
- img
|
||||
- button "Change color" [ref=e243]:
|
||||
- img
|
||||
- button [ref=e244]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e245]:
|
||||
- generic [ref=e246]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e247]
|
||||
- paragraph [ref=e248]: This note will have a reminder
|
||||
- generic [ref=e249]: il y a 26 minutes
|
||||
- generic [ref=e250]:
|
||||
- button "Pin" [ref=e251]:
|
||||
- img
|
||||
- button "Change color" [ref=e252]:
|
||||
- img
|
||||
- button [ref=e253]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e254]:
|
||||
- generic [ref=e255]:
|
||||
- img [ref=e256]
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e259]
|
||||
- paragraph [ref=e260]: This note will have a reminder
|
||||
- generic [ref=e261]: il y a 26 minutes
|
||||
- generic [ref=e262]:
|
||||
- button "Pin" [ref=e263]:
|
||||
- img
|
||||
- button "Change color" [ref=e264]:
|
||||
- img
|
||||
- button [ref=e265]:
|
||||
- img
|
||||
- button "test sample file il y a environ 5 heures" [ref=e266]:
|
||||
- generic [ref=e267]:
|
||||
- heading "test" [level=3] [ref=e268]
|
||||
- paragraph [ref=e270]: sample file
|
||||
- generic [ref=e271]: il y a environ 5 heures
|
||||
- generic [ref=e272]:
|
||||
- button "Pin" [ref=e273]:
|
||||
- img
|
||||
- button "Change color" [ref=e274]:
|
||||
- img
|
||||
- button [ref=e275]:
|
||||
- img
|
||||
- 'button "New AI Framework Released Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d''un framework pour l''IA - Optimisation de l''entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l''inférence en temps réel Tags: framework, mlops, gpu, ai, tech tech ai framework mlops gpu il y a environ 5 heures" [ref=e276]':
|
||||
- generic [ref=e277]:
|
||||
- heading "New AI Framework Released" [level=3] [ref=e278]
|
||||
- paragraph [ref=e279]: "Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d'un framework pour l'IA - Optimisation de l'entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l'inférence en temps réel Tags: framework, mlops, gpu, ai, tech"
|
||||
- generic [ref=e280]:
|
||||
- generic [ref=e281]: tech
|
||||
- generic [ref=e282]: ai
|
||||
- generic [ref=e283]: framework
|
||||
- generic [ref=e284]: mlops
|
||||
- generic [ref=e285]: gpu
|
||||
- generic [ref=e286]: il y a environ 5 heures
|
||||
- generic [ref=e287]:
|
||||
- button "Pin" [ref=e288]:
|
||||
- img
|
||||
- button "Change color" [ref=e289]:
|
||||
- img
|
||||
- button [ref=e290]:
|
||||
- img
|
||||
- button "Test Image API Note avec image il y a environ 8 heures" [ref=e291]:
|
||||
- generic [ref=e292]:
|
||||
- heading "Test Image API" [level=3] [ref=e293]
|
||||
- paragraph [ref=e295]: Note avec image
|
||||
- generic [ref=e296]: il y a environ 8 heures
|
||||
- generic [ref=e297]:
|
||||
- button "Pin" [ref=e298]:
|
||||
- img
|
||||
- button "Change color" [ref=e299]:
|
||||
- img
|
||||
- button [ref=e300]:
|
||||
- img
|
||||
- button "Test Markdown Titre Modifié Sous-titre édité Liste modifiée 1 Liste modifiée 2 Nouvelle liste 3 Texte gras modifié et italique édité console.log(\"Code modifié avec succès!\") il y a environ 5 heures" [ref=e301]:
|
||||
- generic [ref=e302]:
|
||||
- heading "Test Markdown" [level=3] [ref=e303]
|
||||
- generic [ref=e305]:
|
||||
- heading "Titre Modifié" [level=1] [ref=e306]
|
||||
- heading "Sous-titre édité" [level=2] [ref=e307]
|
||||
- list [ref=e308]:
|
||||
- listitem [ref=e309]: Liste modifiée 1
|
||||
- listitem [ref=e310]: Liste modifiée 2
|
||||
- listitem [ref=e311]: Nouvelle liste 3
|
||||
- paragraph [ref=e312]:
|
||||
- strong [ref=e313]: Texte gras modifié
|
||||
- text: et
|
||||
- emphasis [ref=e314]: italique édité
|
||||
- code [ref=e316]: console.log("Code modifié avec succès!")
|
||||
- generic [ref=e317]: il y a environ 5 heures
|
||||
- generic [ref=e318]:
|
||||
- button "Pin" [ref=e319]:
|
||||
- img
|
||||
- button "Change color" [ref=e320]:
|
||||
- img
|
||||
- button [ref=e321]:
|
||||
- img
|
||||
- button "Test Image Avec image il y a environ 8 heures" [ref=e322]:
|
||||
- generic [ref=e323]:
|
||||
- heading "Test Image" [level=3] [ref=e324]
|
||||
- paragraph [ref=e325]: Avec image
|
||||
- generic [ref=e326]: il y a environ 8 heures
|
||||
- generic [ref=e327]:
|
||||
- button "Pin" [ref=e328]:
|
||||
- img
|
||||
- button "Change color" [ref=e329]:
|
||||
- img
|
||||
- button [ref=e330]:
|
||||
- img
|
||||
- 'button "New AI Framework Released Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu tech ai framework mlops gpu il y a environ 6 heures" [ref=e331]':
|
||||
- generic [ref=e332]:
|
||||
- heading "New AI Framework Released" [level=3] [ref=e333]
|
||||
- paragraph [ref=e334]: "Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu"
|
||||
- generic [ref=e335]:
|
||||
- generic [ref=e336]: tech
|
||||
- generic [ref=e337]: ai
|
||||
- generic [ref=e338]: framework
|
||||
- generic [ref=e339]: mlops
|
||||
- generic [ref=e340]: gpu
|
||||
- generic [ref=e341]: il y a environ 6 heures
|
||||
- generic [ref=e342]:
|
||||
- button "Pin" [ref=e343]:
|
||||
- img
|
||||
- button "Change color" [ref=e344]:
|
||||
- img
|
||||
- button [ref=e345]:
|
||||
- img
|
||||
- button "Test Note This is my first note to test the Google Keep clone! il y a environ 10 heures" [ref=e346]:
|
||||
- generic [ref=e347]:
|
||||
- img [ref=e348]
|
||||
- heading "Test Note" [level=3] [ref=e351]
|
||||
- paragraph [ref=e352]: This is my first note to test the Google Keep clone!
|
||||
- generic [ref=e353]: il y a environ 10 heures
|
||||
- generic [ref=e354]:
|
||||
- button "Pin" [ref=e355]:
|
||||
- img
|
||||
- button "Change color" [ref=e356]:
|
||||
- img
|
||||
- button [ref=e357]:
|
||||
- img
|
||||
- button "Titre Modifié Contenu modifié avec succès! il y a environ 5 heures" [ref=e358]:
|
||||
- generic [ref=e359]:
|
||||
- heading "Titre Modifié" [level=3] [ref=e360]
|
||||
- paragraph [ref=e361]: Contenu modifié avec succès!
|
||||
- generic [ref=e362]: il y a environ 5 heures
|
||||
- generic [ref=e363]:
|
||||
- button "Pin" [ref=e364]:
|
||||
- img
|
||||
- button "Change color" [ref=e365]:
|
||||
- img
|
||||
- button [ref=e366]:
|
||||
- img
|
||||
- status [ref=e367]
|
||||
- generic [ref=e368]:
|
||||
- generic [ref=e369]:
|
||||
- generic [ref=e370]: Note created successfully
|
||||
- button [ref=e371]:
|
||||
- img [ref=e372]
|
||||
- generic [ref=e375]:
|
||||
- generic [ref=e376]: Note created successfully
|
||||
- button [ref=e377]:
|
||||
- img [ref=e378]
|
||||
- generic [ref=e381]:
|
||||
- generic [ref=e382]: Note created successfully
|
||||
- button [ref=e383]:
|
||||
- img [ref=e384]
|
||||
- generic [ref=e387]:
|
||||
- generic [ref=e388]: Note created successfully
|
||||
- button [ref=e389]:
|
||||
- img [ref=e390]
|
||||
- button "Open Next.js Dev Tools" [ref=e398] [cursor=pointer]:
|
||||
- img [ref=e399]
|
||||
- alert [ref=e402]
|
||||
```
|
||||
@ -0,0 +1,509 @@
|
||||
# Page snapshot
|
||||
|
||||
```yaml
|
||||
- generic [active] [ref=e1]:
|
||||
- banner [ref=e2]:
|
||||
- generic [ref=e3]:
|
||||
- link "Memento" [ref=e4] [cursor=pointer]:
|
||||
- /url: /
|
||||
- img [ref=e5]
|
||||
- generic [ref=e8]: Memento
|
||||
- generic [ref=e10]:
|
||||
- img [ref=e11]
|
||||
- textbox "Search notes..." [ref=e14]
|
||||
- button [ref=e15]:
|
||||
- img
|
||||
- navigation [ref=e16]:
|
||||
- link "Notes" [ref=e17] [cursor=pointer]:
|
||||
- /url: /
|
||||
- img [ref=e18]
|
||||
- text: Notes
|
||||
- link "Archive" [ref=e21] [cursor=pointer]:
|
||||
- /url: /archive
|
||||
- img [ref=e22]
|
||||
- text: Archive
|
||||
- main [ref=e25]:
|
||||
- generic [ref=e27]:
|
||||
- textbox "Take a note..." [ref=e28]
|
||||
- button "New checklist" [ref=e29]:
|
||||
- img
|
||||
- generic [ref=e30]:
|
||||
- generic [ref=e31]:
|
||||
- heading "Pinned" [level=2] [ref=e32]
|
||||
- button "Updated Note avec image il y a environ 8 heures" [ref=e34]:
|
||||
- generic [ref=e35]:
|
||||
- img [ref=e36]
|
||||
- heading "Updated" [level=3] [ref=e38]
|
||||
- paragraph [ref=e39]: Note avec image
|
||||
- generic [ref=e40]: il y a environ 8 heures
|
||||
- generic [ref=e41]:
|
||||
- button "Unpin" [ref=e42]:
|
||||
- img
|
||||
- button "Change color" [ref=e43]:
|
||||
- img
|
||||
- button [ref=e44]:
|
||||
- img
|
||||
- generic [ref=e45]:
|
||||
- heading "Others" [level=2] [ref=e46]
|
||||
- generic [ref=e47]:
|
||||
- button "test-1767557339218-Note 4 test-1767557339218-Content 4 il y a moins d’une minute" [ref=e48]:
|
||||
- generic [ref=e49]:
|
||||
- heading "test-1767557339218-Note 4" [level=3] [ref=e50]
|
||||
- paragraph [ref=e51]: test-1767557339218-Content 4
|
||||
- generic [ref=e52]: il y a moins d’une minute
|
||||
- generic [ref=e53]:
|
||||
- button "Pin" [ref=e54]:
|
||||
- img
|
||||
- button "Change color" [ref=e55]:
|
||||
- img
|
||||
- button [ref=e56]:
|
||||
- img
|
||||
- button "test-1767557339218-Note 3 test-1767557339218-Content 3 il y a moins d’une minute" [ref=e57]:
|
||||
- generic [ref=e58]:
|
||||
- heading "test-1767557339218-Note 3" [level=3] [ref=e59]
|
||||
- paragraph [ref=e60]: test-1767557339218-Content 3
|
||||
- generic [ref=e61]: il y a moins d’une minute
|
||||
- generic [ref=e62]:
|
||||
- button "Pin" [ref=e63]:
|
||||
- img
|
||||
- button "Change color" [ref=e64]:
|
||||
- img
|
||||
- button [ref=e65]:
|
||||
- img
|
||||
- button "test-1767557339218-Note 2 test-1767557339218-Content 2 il y a moins d’une minute" [ref=e66]:
|
||||
- generic [ref=e67]:
|
||||
- heading "test-1767557339218-Note 2" [level=3] [ref=e68]
|
||||
- paragraph [ref=e69]: test-1767557339218-Content 2
|
||||
- generic [ref=e70]: il y a moins d’une minute
|
||||
- generic [ref=e71]:
|
||||
- button "Pin" [ref=e72]:
|
||||
- img
|
||||
- button "Change color" [ref=e73]:
|
||||
- img
|
||||
- button [ref=e74]:
|
||||
- img
|
||||
- button "test-1767557339218-Note 1 test-1767557339218-Content 1 il y a moins d’une minute" [ref=e75]:
|
||||
- generic [ref=e76]:
|
||||
- heading "test-1767557339218-Note 1" [level=3] [ref=e77]
|
||||
- paragraph [ref=e78]: test-1767557339218-Content 1
|
||||
- generic [ref=e79]: il y a moins d’une minute
|
||||
- generic [ref=e80]:
|
||||
- button "Pin" [ref=e81]:
|
||||
- img
|
||||
- button "Change color" [ref=e82]:
|
||||
- img
|
||||
- button [ref=e83]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 4 test-1767557334587-Content 4 il y a moins d’une minute" [ref=e84]:
|
||||
- generic [ref=e85]:
|
||||
- heading "test-1767557334587-Note 4" [level=3] [ref=e86]
|
||||
- paragraph [ref=e87]: test-1767557334587-Content 4
|
||||
- generic [ref=e88]: il y a moins d’une minute
|
||||
- generic [ref=e89]:
|
||||
- button "Pin" [ref=e90]:
|
||||
- img
|
||||
- button "Change color" [ref=e91]:
|
||||
- img
|
||||
- button [ref=e92]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 3 test-1767557334587-Content 3 il y a moins d’une minute" [ref=e93]:
|
||||
- generic [ref=e94]:
|
||||
- heading "test-1767557334587-Note 3" [level=3] [ref=e95]
|
||||
- paragraph [ref=e96]: test-1767557334587-Content 3
|
||||
- generic [ref=e97]: il y a moins d’une minute
|
||||
- generic [ref=e98]:
|
||||
- button "Pin" [ref=e99]:
|
||||
- img
|
||||
- button "Change color" [ref=e100]:
|
||||
- img
|
||||
- button [ref=e101]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 2 test-1767557334587-Content 2 il y a moins d’une minute" [ref=e102]:
|
||||
- generic [ref=e103]:
|
||||
- heading "test-1767557334587-Note 2" [level=3] [ref=e104]
|
||||
- paragraph [ref=e105]: test-1767557334587-Content 2
|
||||
- generic [ref=e106]: il y a moins d’une minute
|
||||
- generic [ref=e107]:
|
||||
- button "Pin" [ref=e108]:
|
||||
- img
|
||||
- button "Change color" [ref=e109]:
|
||||
- img
|
||||
- button [ref=e110]:
|
||||
- img
|
||||
- button "test-1767557334587-Note 1 test-1767557334587-Content 1 il y a moins d’une minute" [ref=e111]:
|
||||
- generic [ref=e112]:
|
||||
- heading "test-1767557334587-Note 1" [level=3] [ref=e113]
|
||||
- paragraph [ref=e114]: test-1767557334587-Content 1
|
||||
- generic [ref=e115]: il y a moins d’une minute
|
||||
- generic [ref=e116]:
|
||||
- button "Pin" [ref=e117]:
|
||||
- img
|
||||
- button "Change color" [ref=e118]:
|
||||
- img
|
||||
- button [ref=e119]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 4 test-1767557330820-Content 4 il y a moins d’une minute" [ref=e120]:
|
||||
- generic [ref=e121]:
|
||||
- heading "test-1767557330820-Note 4" [level=3] [ref=e122]
|
||||
- paragraph [ref=e123]: test-1767557330820-Content 4
|
||||
- generic [ref=e124]: il y a moins d’une minute
|
||||
- generic [ref=e125]:
|
||||
- button "Pin" [ref=e126]:
|
||||
- img
|
||||
- button "Change color" [ref=e127]:
|
||||
- img
|
||||
- button [ref=e128]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 3 test-1767557330820-Content 3 il y a moins d’une minute" [ref=e129]:
|
||||
- generic [ref=e130]:
|
||||
- heading "test-1767557330820-Note 3" [level=3] [ref=e131]
|
||||
- paragraph [ref=e132]: test-1767557330820-Content 3
|
||||
- generic [ref=e133]: il y a moins d’une minute
|
||||
- generic [ref=e134]:
|
||||
- button "Pin" [ref=e135]:
|
||||
- img
|
||||
- button "Change color" [ref=e136]:
|
||||
- img
|
||||
- button [ref=e137]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 2 test-1767557330820-Content 2 il y a moins d’une minute" [ref=e138]:
|
||||
- generic [ref=e139]:
|
||||
- heading "test-1767557330820-Note 2" [level=3] [ref=e140]
|
||||
- paragraph [ref=e141]: test-1767557330820-Content 2
|
||||
- generic [ref=e142]: il y a moins d’une minute
|
||||
- generic [ref=e143]:
|
||||
- button "Pin" [ref=e144]:
|
||||
- img
|
||||
- button "Change color" [ref=e145]:
|
||||
- img
|
||||
- button [ref=e146]:
|
||||
- img
|
||||
- button "test-1767557330820-Note 1 test-1767557330820-Content 1 il y a moins d’une minute" [ref=e147]:
|
||||
- generic [ref=e148]:
|
||||
- heading "test-1767557330820-Note 1" [level=3] [ref=e149]
|
||||
- paragraph [ref=e150]: test-1767557330820-Content 1
|
||||
- generic [ref=e151]: il y a moins d’une minute
|
||||
- generic [ref=e152]:
|
||||
- button "Pin" [ref=e153]:
|
||||
- img
|
||||
- button "Change color" [ref=e154]:
|
||||
- img
|
||||
- button [ref=e155]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 4 test-1767557327567-Content 4 il y a moins d’une minute" [ref=e156]:
|
||||
- generic [ref=e157]:
|
||||
- heading "test-1767557327567-Note 4" [level=3] [ref=e158]
|
||||
- paragraph [ref=e159]: test-1767557327567-Content 4
|
||||
- generic [ref=e160]: il y a moins d’une minute
|
||||
- generic [ref=e161]:
|
||||
- button "Pin" [ref=e162]:
|
||||
- img
|
||||
- button "Change color" [ref=e163]:
|
||||
- img
|
||||
- button [ref=e164]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 3 test-1767557327567-Content 3 il y a moins d’une minute" [ref=e165]:
|
||||
- generic [ref=e166]:
|
||||
- heading "test-1767557327567-Note 3" [level=3] [ref=e167]
|
||||
- paragraph [ref=e168]: test-1767557327567-Content 3
|
||||
- generic [ref=e169]: il y a moins d’une minute
|
||||
- generic [ref=e170]:
|
||||
- button "Pin" [ref=e171]:
|
||||
- img
|
||||
- button "Change color" [ref=e172]:
|
||||
- img
|
||||
- button [ref=e173]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 2 test-1767557327567-Content 2 il y a moins d’une minute" [ref=e174]:
|
||||
- generic [ref=e175]:
|
||||
- heading "test-1767557327567-Note 2" [level=3] [ref=e176]
|
||||
- paragraph [ref=e177]: test-1767557327567-Content 2
|
||||
- generic [ref=e178]: il y a moins d’une minute
|
||||
- generic [ref=e179]:
|
||||
- button "Pin" [ref=e180]:
|
||||
- img
|
||||
- button "Change color" [ref=e181]:
|
||||
- img
|
||||
- button [ref=e182]:
|
||||
- img
|
||||
- button "test-1767557327567-Note 1 test-1767557327567-Content 1 il y a moins d’une minute" [ref=e183]:
|
||||
- generic [ref=e184]:
|
||||
- heading "test-1767557327567-Note 1" [level=3] [ref=e185]
|
||||
- paragraph [ref=e186]: test-1767557327567-Content 1
|
||||
- generic [ref=e187]: il y a moins d’une minute
|
||||
- generic [ref=e188]:
|
||||
- button "Pin" [ref=e189]:
|
||||
- img
|
||||
- button "Change color" [ref=e190]:
|
||||
- img
|
||||
- button [ref=e191]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 4 test-1767557324248-Content 4 il y a moins d’une minute" [ref=e192]:
|
||||
- generic [ref=e193]:
|
||||
- heading "test-1767557324248-Note 4" [level=3] [ref=e194]
|
||||
- paragraph [ref=e195]: test-1767557324248-Content 4
|
||||
- generic [ref=e196]: il y a moins d’une minute
|
||||
- generic [ref=e197]:
|
||||
- button "Pin" [ref=e198]:
|
||||
- img
|
||||
- button "Change color" [ref=e199]:
|
||||
- img
|
||||
- button [ref=e200]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 3 test-1767557324248-Content 3 il y a moins d’une minute" [ref=e201]:
|
||||
- generic [ref=e202]:
|
||||
- heading "test-1767557324248-Note 3" [level=3] [ref=e203]
|
||||
- paragraph [ref=e204]: test-1767557324248-Content 3
|
||||
- generic [ref=e205]: il y a moins d’une minute
|
||||
- generic [ref=e206]:
|
||||
- button "Pin" [ref=e207]:
|
||||
- img
|
||||
- button "Change color" [ref=e208]:
|
||||
- img
|
||||
- button [ref=e209]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 2 test-1767557324248-Content 2 il y a moins d’une minute" [ref=e210]:
|
||||
- generic [ref=e211]:
|
||||
- heading "test-1767557324248-Note 2" [level=3] [ref=e212]
|
||||
- paragraph [ref=e213]: test-1767557324248-Content 2
|
||||
- generic [ref=e214]: il y a moins d’une minute
|
||||
- generic [ref=e215]:
|
||||
- button "Pin" [ref=e216]:
|
||||
- img
|
||||
- button "Change color" [ref=e217]:
|
||||
- img
|
||||
- button [ref=e218]:
|
||||
- img
|
||||
- button "test-1767557324248-Note 1 test-1767557324248-Content 1 il y a moins d’une minute" [ref=e219]:
|
||||
- generic [ref=e220]:
|
||||
- heading "test-1767557324248-Note 1" [level=3] [ref=e221]
|
||||
- paragraph [ref=e222]: test-1767557324248-Content 1
|
||||
- generic [ref=e223]: il y a moins d’une minute
|
||||
- generic [ref=e224]:
|
||||
- button "Pin" [ref=e225]:
|
||||
- img
|
||||
- button "Change color" [ref=e226]:
|
||||
- img
|
||||
- button [ref=e227]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e228]:
|
||||
- generic [ref=e229]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e230]
|
||||
- paragraph [ref=e231]: This note will have a reminder
|
||||
- generic [ref=e232]: il y a 26 minutes
|
||||
- generic [ref=e233]:
|
||||
- button "Pin" [ref=e234]:
|
||||
- img
|
||||
- button "Change color" [ref=e235]:
|
||||
- img
|
||||
- button [ref=e236]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e237]:
|
||||
- generic [ref=e238]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e239]
|
||||
- paragraph [ref=e240]: This note will have a reminder
|
||||
- generic [ref=e241]: il y a 26 minutes
|
||||
- generic [ref=e242]:
|
||||
- button "Pin" [ref=e243]:
|
||||
- img
|
||||
- button "Change color" [ref=e244]:
|
||||
- img
|
||||
- button [ref=e245]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e246]:
|
||||
- generic [ref=e247]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e248]
|
||||
- paragraph [ref=e249]: This note will have a reminder
|
||||
- generic [ref=e250]: il y a 26 minutes
|
||||
- generic [ref=e251]:
|
||||
- button "Pin" [ref=e252]:
|
||||
- img
|
||||
- button "Change color" [ref=e253]:
|
||||
- img
|
||||
- button [ref=e254]:
|
||||
- img
|
||||
- button "Test note il y a 26 minutes" [ref=e255]:
|
||||
- generic [ref=e256]:
|
||||
- paragraph [ref=e257]: Test note
|
||||
- generic [ref=e258]: il y a 26 minutes
|
||||
- generic [ref=e259]:
|
||||
- button "Pin" [ref=e260]:
|
||||
- img
|
||||
- button "Change color" [ref=e261]:
|
||||
- img
|
||||
- button [ref=e262]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e263]:
|
||||
- generic [ref=e264]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e265]
|
||||
- paragraph [ref=e266]: This note will have a reminder
|
||||
- generic [ref=e267]: il y a 26 minutes
|
||||
- generic [ref=e268]:
|
||||
- button "Pin" [ref=e269]:
|
||||
- img
|
||||
- button "Change color" [ref=e270]:
|
||||
- img
|
||||
- button [ref=e271]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e272]:
|
||||
- generic [ref=e273]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e274]
|
||||
- paragraph [ref=e275]: This note will have a reminder
|
||||
- generic [ref=e276]: il y a 26 minutes
|
||||
- generic [ref=e277]:
|
||||
- button "Pin" [ref=e278]:
|
||||
- img
|
||||
- button "Change color" [ref=e279]:
|
||||
- img
|
||||
- button [ref=e280]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e281]:
|
||||
- generic [ref=e282]:
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e283]
|
||||
- paragraph [ref=e284]: This note will have a reminder
|
||||
- generic [ref=e285]: il y a 26 minutes
|
||||
- generic [ref=e286]:
|
||||
- button "Pin" [ref=e287]:
|
||||
- img
|
||||
- button "Change color" [ref=e288]:
|
||||
- img
|
||||
- button [ref=e289]:
|
||||
- img
|
||||
- button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e290]:
|
||||
- generic [ref=e291]:
|
||||
- img [ref=e292]
|
||||
- heading "Test Note for Reminder" [level=3] [ref=e295]
|
||||
- paragraph [ref=e296]: This note will have a reminder
|
||||
- generic [ref=e297]: il y a 26 minutes
|
||||
- generic [ref=e298]:
|
||||
- button "Pin" [ref=e299]:
|
||||
- img
|
||||
- button "Change color" [ref=e300]:
|
||||
- img
|
||||
- button [ref=e301]:
|
||||
- img
|
||||
- button "test sample file il y a environ 5 heures" [ref=e302]:
|
||||
- generic [ref=e303]:
|
||||
- heading "test" [level=3] [ref=e304]
|
||||
- paragraph [ref=e306]: sample file
|
||||
- generic [ref=e307]: il y a environ 5 heures
|
||||
- generic [ref=e308]:
|
||||
- button "Pin" [ref=e309]:
|
||||
- img
|
||||
- button "Change color" [ref=e310]:
|
||||
- img
|
||||
- button [ref=e311]:
|
||||
- img
|
||||
- 'button "New AI Framework Released Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d''un framework pour l''IA - Optimisation de l''entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l''inférence en temps réel Tags: framework, mlops, gpu, ai, tech tech ai framework mlops gpu il y a environ 5 heures" [ref=e312]':
|
||||
- generic [ref=e313]:
|
||||
- heading "New AI Framework Released" [level=3] [ref=e314]
|
||||
- paragraph [ref=e315]: "Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d'un framework pour l'IA - Optimisation de l'entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l'inférence en temps réel Tags: framework, mlops, gpu, ai, tech"
|
||||
- generic [ref=e316]:
|
||||
- generic [ref=e317]: tech
|
||||
- generic [ref=e318]: ai
|
||||
- generic [ref=e319]: framework
|
||||
- generic [ref=e320]: mlops
|
||||
- generic [ref=e321]: gpu
|
||||
- generic [ref=e322]: il y a environ 5 heures
|
||||
- generic [ref=e323]:
|
||||
- button "Pin" [ref=e324]:
|
||||
- img
|
||||
- button "Change color" [ref=e325]:
|
||||
- img
|
||||
- button [ref=e326]:
|
||||
- img
|
||||
- button "Test Image API Note avec image il y a environ 8 heures" [ref=e327]:
|
||||
- generic [ref=e328]:
|
||||
- heading "Test Image API" [level=3] [ref=e329]
|
||||
- paragraph [ref=e331]: Note avec image
|
||||
- generic [ref=e332]: il y a environ 8 heures
|
||||
- generic [ref=e333]:
|
||||
- button "Pin" [ref=e334]:
|
||||
- img
|
||||
- button "Change color" [ref=e335]:
|
||||
- img
|
||||
- button [ref=e336]:
|
||||
- img
|
||||
- button "Test Markdown Titre Modifié Sous-titre édité Liste modifiée 1 Liste modifiée 2 Nouvelle liste 3 Texte gras modifié et italique édité console.log(\"Code modifié avec succès!\") il y a environ 5 heures" [ref=e337]:
|
||||
- generic [ref=e338]:
|
||||
- heading "Test Markdown" [level=3] [ref=e339]
|
||||
- generic [ref=e341]:
|
||||
- heading "Titre Modifié" [level=1] [ref=e342]
|
||||
- heading "Sous-titre édité" [level=2] [ref=e343]
|
||||
- list [ref=e344]:
|
||||
- listitem [ref=e345]: Liste modifiée 1
|
||||
- listitem [ref=e346]: Liste modifiée 2
|
||||
- listitem [ref=e347]: Nouvelle liste 3
|
||||
- paragraph [ref=e348]:
|
||||
- strong [ref=e349]: Texte gras modifié
|
||||
- text: et
|
||||
- emphasis [ref=e350]: italique édité
|
||||
- code [ref=e352]: console.log("Code modifié avec succès!")
|
||||
- generic [ref=e353]: il y a environ 5 heures
|
||||
- generic [ref=e354]:
|
||||
- button "Pin" [ref=e355]:
|
||||
- img
|
||||
- button "Change color" [ref=e356]:
|
||||
- img
|
||||
- button [ref=e357]:
|
||||
- img
|
||||
- button "Test Image Avec image il y a environ 8 heures" [ref=e358]:
|
||||
- generic [ref=e359]:
|
||||
- heading "Test Image" [level=3] [ref=e360]
|
||||
- paragraph [ref=e361]: Avec image
|
||||
- generic [ref=e362]: il y a environ 8 heures
|
||||
- generic [ref=e363]:
|
||||
- button "Pin" [ref=e364]:
|
||||
- img
|
||||
- button "Change color" [ref=e365]:
|
||||
- img
|
||||
- button [ref=e366]:
|
||||
- img
|
||||
- 'button "New AI Framework Released Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu tech ai framework mlops gpu il y a environ 6 heures" [ref=e367]':
|
||||
- generic [ref=e368]:
|
||||
- heading "New AI Framework Released" [level=3] [ref=e369]
|
||||
- paragraph [ref=e370]: "Lien: <www.example.com> Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu"
|
||||
- generic [ref=e371]:
|
||||
- generic [ref=e372]: tech
|
||||
- generic [ref=e373]: ai
|
||||
- generic [ref=e374]: framework
|
||||
- generic [ref=e375]: mlops
|
||||
- generic [ref=e376]: gpu
|
||||
- generic [ref=e377]: il y a environ 6 heures
|
||||
- generic [ref=e378]:
|
||||
- button "Pin" [ref=e379]:
|
||||
- img
|
||||
- button "Change color" [ref=e380]:
|
||||
- img
|
||||
- button [ref=e381]:
|
||||
- img
|
||||
- button "Test Note This is my first note to test the Google Keep clone! il y a environ 10 heures" [ref=e382]:
|
||||
- generic [ref=e383]:
|
||||
- img [ref=e384]
|
||||
- heading "Test Note" [level=3] [ref=e387]
|
||||
- paragraph [ref=e388]: This is my first note to test the Google Keep clone!
|
||||
- generic [ref=e389]: il y a environ 10 heures
|
||||
- generic [ref=e390]:
|
||||
- button "Pin" [ref=e391]:
|
||||
- img
|
||||
- button "Change color" [ref=e392]:
|
||||
- img
|
||||
- button [ref=e393]:
|
||||
- img
|
||||
- button "Titre Modifié Contenu modifié avec succès! il y a environ 5 heures" [ref=e394]:
|
||||
- generic [ref=e395]:
|
||||
- heading "Titre Modifié" [level=3] [ref=e396]
|
||||
- paragraph [ref=e397]: Contenu modifié avec succès!
|
||||
- generic [ref=e398]: il y a environ 5 heures
|
||||
- generic [ref=e399]:
|
||||
- button "Pin" [ref=e400]:
|
||||
- img
|
||||
- button "Change color" [ref=e401]:
|
||||
- img
|
||||
- button [ref=e402]:
|
||||
- img
|
||||
- status [ref=e403]
|
||||
- button "Open Next.js Dev Tools" [ref=e409] [cursor=pointer]:
|
||||
- img [ref=e410]
|
||||
- alert [ref=e413]
|
||||
```
|
||||
@ -1,42 +1,109 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
import { test, expect, request } from '@playwright/test';
|
||||
|
||||
test.describe('Note Grid - Drag and Drop', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await page.goto('/');
|
||||
test.beforeAll(async ({ request }) => {
|
||||
console.log('[CLEANUP] beforeAll: Cleaning up any existing test notes...');
|
||||
|
||||
// Create multiple notes for testing drag and drop
|
||||
for (let i = 1; i <= 4; i++) {
|
||||
await page.click('input[placeholder="Take a note..."]');
|
||||
await page.fill('input[placeholder="Title"]', `Note ${i}`);
|
||||
await page.fill('textarea[placeholder="Take a note..."]', `Content ${i}`);
|
||||
await page.click('button:has-text("Add")');
|
||||
await page.waitForTimeout(500);
|
||||
// Clean up any existing test notes from previous runs
|
||||
try {
|
||||
const response = await request.get('http://localhost:3000/api/notes');
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success && data.data) {
|
||||
const testNotes = data.data.filter((note: any) =>
|
||||
note.title?.startsWith('test-') &&
|
||||
note.content?.startsWith('Content ')
|
||||
);
|
||||
|
||||
console.log(`[CLEANUP] beforeAll: Found ${testNotes.length} test notes to delete`);
|
||||
|
||||
for (const note of testNotes) {
|
||||
try {
|
||||
await request.delete(`http://localhost:3000/api/notes?id=${note.id}`);
|
||||
console.log(`[CLEANUP] beforeAll: Deleted note ${note.id}`);
|
||||
} catch (error) {
|
||||
console.log(`[CLEANUP] beforeAll: Failed to delete note ${note.id}`, error);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('[CLEANUP] beforeAll: Error fetching notes for cleanup', error);
|
||||
}
|
||||
});
|
||||
|
||||
test('should have draggable notes', async ({ page }) => {
|
||||
// Wait for notes to appear
|
||||
await page.waitForSelector('text=Note 1');
|
||||
test.beforeEach(async ({ page }) => {
|
||||
// Generate unique timestamp for this test run to avoid conflicts
|
||||
const timestamp = Date.now();
|
||||
const testId = `test-${timestamp}`;
|
||||
|
||||
// Check that notes have draggable attribute
|
||||
const noteCards = page.locator('[draggable="true"]');
|
||||
await page.goto('/');
|
||||
|
||||
// Wait for page to fully load
|
||||
await page.waitForLoadState('networkidle');
|
||||
|
||||
// Log initial note count before creating new notes
|
||||
const initialNotes = page.locator('[data-draggable="true"]');
|
||||
const initialCount = await initialNotes.count();
|
||||
console.log(`[DEBUG] [${testId}] Initial note count: ${initialCount}`);
|
||||
|
||||
// Create multiple notes for testing drag and drop with unique identifiers
|
||||
for (let i = 1; i <= 4; i++) {
|
||||
const noteTitle = `${testId}-Note ${i}`;
|
||||
const noteContent = `${testId}-Content ${i}`;
|
||||
|
||||
console.log(`[DEBUG] [${testId}] Creating ${noteTitle}`);
|
||||
await page.click('input[placeholder="Take a note..."]');
|
||||
await page.fill('input[placeholder="Title"]', noteTitle);
|
||||
await page.fill('textarea[placeholder="Take a note..."]', noteContent);
|
||||
await page.click('button:has-text("Add")');
|
||||
await page.waitForTimeout(500);
|
||||
|
||||
// Log note count after each creation
|
||||
const currentCount = await page.locator('[data-draggable="true"]').count();
|
||||
console.log(`[DEBUG] [${testId}] Note count after creating ${noteTitle}: ${currentCount}`);
|
||||
}
|
||||
|
||||
// Log final note count
|
||||
const finalCount = await page.locator('[data-draggable="true"]').count();
|
||||
console.log(`[DEBUG] [${testId}] Final note count after all creations: ${finalCount}`);
|
||||
});
|
||||
|
||||
test('should have draggable notes', async ({ page }) => {
|
||||
console.log('[DEBUG] Test: should have draggable notes');
|
||||
|
||||
// Wait for notes to appear (use a more flexible selector that matches pattern)
|
||||
await page.waitForSelector('[data-draggable="true"]');
|
||||
|
||||
// Check that notes have data-draggable attribute (dnd-kit uses this)
|
||||
const noteCards = page.locator('[data-draggable="true"]');
|
||||
const count = await noteCards.count();
|
||||
console.log(`[DEBUG] Found ${count} notes with data-draggable="true"`);
|
||||
|
||||
// Log first few notes details
|
||||
for (let i = 0; i < Math.min(count, 3); i++) {
|
||||
const note = noteCards.nth(i);
|
||||
const text = await note.textContent();
|
||||
const draggableAttr = await note.getAttribute('data-draggable');
|
||||
console.log(`[DEBUG] Note ${i}: "${text?.substring(0, 50)}", data-draggable="${draggableAttr}"`);
|
||||
}
|
||||
|
||||
expect(count).toBeGreaterThanOrEqual(4);
|
||||
});
|
||||
|
||||
test('should show cursor-move on note cards', async ({ page }) => {
|
||||
await page.waitForSelector('text=Note 1');
|
||||
await page.waitForSelector('[data-draggable="true"]');
|
||||
|
||||
// Check CSS class for cursor-move
|
||||
const firstNote = page.locator('[draggable="true"]').first();
|
||||
const className = await firstNote.getAttribute('class');
|
||||
// Check CSS class for cursor-move on the note card inside
|
||||
const firstNote = page.locator('[data-draggable="true"]').first();
|
||||
const noteCard = firstNote.locator('.note-card-main');
|
||||
const className = await noteCard.getAttribute('class');
|
||||
expect(className).toContain('cursor-move');
|
||||
});
|
||||
|
||||
test('should change opacity when dragging', async ({ page }) => {
|
||||
await page.waitForSelector('text=Note 1');
|
||||
await page.waitForSelector('[data-draggable="true"]');
|
||||
|
||||
const firstNote = page.locator('[draggable="true"]').first();
|
||||
const firstNote = page.locator('[data-draggable="true"]').first();
|
||||
|
||||
// Start drag
|
||||
const box = await firstNote.boundingBox();
|
||||
@ -44,98 +111,109 @@ test.describe('Note Grid - Drag and Drop', () => {
|
||||
await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2);
|
||||
await page.mouse.down();
|
||||
|
||||
// Check if opacity changed (isDragging class)
|
||||
await page.waitForTimeout(100);
|
||||
// Move to trigger drag
|
||||
await page.mouse.move(box.x + box.width / 2 + 50, box.y + box.height / 2 + 50);
|
||||
await page.waitForTimeout(200);
|
||||
|
||||
const className = await firstNote.getAttribute('class');
|
||||
// The dragged note should have opacity-30 class
|
||||
// Note: This is tricky with Playwright, might need visual regression testing
|
||||
// Check if opacity changed (style should have opacity: 0.5)
|
||||
const style = await firstNote.getAttribute('style');
|
||||
expect(style).toContain('opacity');
|
||||
|
||||
await page.mouse.up();
|
||||
}
|
||||
});
|
||||
|
||||
test('should reorder notes when dropped on another note', async ({ page }) => {
|
||||
await page.waitForSelector('text=Note 1');
|
||||
console.log('[DEBUG] Test: should reorder notes when dropped on another note');
|
||||
|
||||
// Wait for notes to be fully loaded and drag-and-drop initialized
|
||||
await page.waitForSelector('[data-draggable="true"]', { state: 'attached' });
|
||||
await page.waitForTimeout(500); // Extra wait for dnd-kit to initialize
|
||||
|
||||
// Get initial order
|
||||
const notes = page.locator('[draggable="true"]');
|
||||
const notes = page.locator('[data-draggable="true"]');
|
||||
const firstNoteText = await notes.first().textContent();
|
||||
const secondNoteText = await notes.nth(1).textContent();
|
||||
|
||||
expect(firstNoteText).toContain('Note');
|
||||
expect(secondNoteText).toContain('Note');
|
||||
console.log(`[DEBUG] Initial first note: ${firstNoteText?.substring(0, 30)}`);
|
||||
console.log(`[DEBUG] Initial second note: ${secondNoteText?.substring(0, 30)}`);
|
||||
|
||||
// Drag first note to second position
|
||||
expect(firstNoteText).toMatch(/Note \d+/);
|
||||
expect(secondNoteText).toMatch(/Note \d+/);
|
||||
|
||||
// Use dragTo for more reliable drag and drop
|
||||
const firstNote = notes.first();
|
||||
const secondNote = notes.nth(1);
|
||||
|
||||
const firstBox = await firstNote.boundingBox();
|
||||
const secondBox = await secondNote.boundingBox();
|
||||
console.log('[DEBUG] Starting drag operation...');
|
||||
await firstNote.dragTo(secondNote);
|
||||
console.log('[DEBUG] Drag operation completed');
|
||||
|
||||
if (firstBox && secondBox) {
|
||||
await page.mouse.move(firstBox.x + firstBox.width / 2, firstBox.y + firstBox.height / 2);
|
||||
await page.mouse.down();
|
||||
await page.mouse.move(secondBox.x + secondBox.width / 2, secondBox.y + secondBox.height / 2);
|
||||
await page.mouse.up();
|
||||
|
||||
// Wait for reorder to complete
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
// Check that order changed
|
||||
// Note: This depends on the order persisting in the database
|
||||
await page.reload();
|
||||
await page.waitForSelector('text=Note');
|
||||
|
||||
// Verify the order changed (implementation dependent)
|
||||
}
|
||||
// Wait for reorder to complete and database to update
|
||||
await page.waitForTimeout(2000); // Increased wait time for async operations
|
||||
|
||||
// Check that order changed
|
||||
// Note: This depends on order persisting in the database
|
||||
console.log('[DEBUG] Reloading page to verify persistence...');
|
||||
await page.reload();
|
||||
await page.waitForSelector('[data-draggable="true"]', { state: 'attached' });
|
||||
await page.waitForTimeout(500);
|
||||
|
||||
// Verify that order changed (implementation dependent)
|
||||
console.log('[DEBUG] Page reloaded, checking order...');
|
||||
});
|
||||
|
||||
test('should work with pinned and unpinned notes separately', async ({ page }) => {
|
||||
await page.waitForSelector('text=Note 1');
|
||||
await page.waitForSelector('[data-draggable="true"]');
|
||||
|
||||
// Pin first note
|
||||
const firstNote = page.locator('text=Note 1').first();
|
||||
await firstNote.hover();
|
||||
await page.click('button[title*="Pin"]:visible').first();
|
||||
// Pin first note by hovering and clicking pin button
|
||||
const firstNoteCard = page.locator('[data-draggable="true"]').first();
|
||||
await firstNoteCard.hover();
|
||||
|
||||
// Click the pin button
|
||||
const pinButton = firstNoteCard.locator('button[title="Pin"]');
|
||||
await pinButton.click();
|
||||
|
||||
await page.waitForTimeout(500);
|
||||
|
||||
// Check that "Pinned" section appears
|
||||
await expect(page.locator('text=Pinned')).toBeVisible();
|
||||
await expect(page.locator('h2:has-text("Pinned")')).toBeVisible();
|
||||
|
||||
// Verify note is in pinned section
|
||||
const pinnedSection = page.locator('h2:has-text("Pinned")').locator('..').locator('..');
|
||||
await expect(pinnedSection.locator('text=Note 1')).toBeVisible();
|
||||
const pinnedSection = page.locator('h2:has-text("Pinned")').locator('..').locator('div[data-draggable="true"]');
|
||||
expect(await pinnedSection.count()).toBeGreaterThanOrEqual(1);
|
||||
});
|
||||
|
||||
test('should not mix pinned and unpinned notes when dragging', async ({ page }) => {
|
||||
await page.waitForSelector('text=Note 1');
|
||||
await page.waitForSelector('[data-draggable="true"]');
|
||||
|
||||
// Pin first note
|
||||
const firstNote = page.locator('text=Note 1').first();
|
||||
await firstNote.hover();
|
||||
await page.click('button[title*="Pin"]:visible').first();
|
||||
// Pin first note by hovering and clicking pin button
|
||||
const firstNoteCard = page.locator('[data-draggable="true"]').first();
|
||||
await firstNoteCard.hover();
|
||||
|
||||
// Click the pin button
|
||||
const pinButton = firstNoteCard.locator('button[title="Pin"]');
|
||||
await pinButton.click();
|
||||
|
||||
await page.waitForTimeout(500);
|
||||
|
||||
// Should have both Pinned and Others sections
|
||||
await expect(page.locator('text=Pinned')).toBeVisible();
|
||||
await expect(page.locator('text=Others')).toBeVisible();
|
||||
await expect(page.locator('h2:has-text("Pinned")')).toBeVisible();
|
||||
await expect(page.locator('h2:has-text("Others")')).toBeVisible();
|
||||
|
||||
// Count notes in each section
|
||||
const pinnedNotes = page.locator('h2:has-text("Pinned") ~ div [draggable="true"]');
|
||||
const unpinnedNotes = page.locator('h2:has-text("Others") ~ div [draggable="true"]');
|
||||
// Count notes in each section using data-draggable attribute
|
||||
const pinnedNotes = page.locator('h2:has-text("Pinned") ~ div [data-draggable="true"]');
|
||||
const unpinnedNotes = page.locator('h2:has-text("Others") ~ div [data-draggable="true"]');
|
||||
|
||||
expect(await pinnedNotes.count()).toBeGreaterThanOrEqual(1);
|
||||
expect(await unpinnedNotes.count()).toBeGreaterThanOrEqual(3);
|
||||
});
|
||||
|
||||
test('should persist note order after page reload', async ({ page }) => {
|
||||
await page.waitForSelector('text=Note 1');
|
||||
await page.waitForSelector('[data-draggable="true"]');
|
||||
|
||||
// Get initial order
|
||||
const notes = page.locator('[draggable="true"]');
|
||||
const notes = page.locator('[data-draggable="true"]');
|
||||
const initialOrder: string[] = [];
|
||||
const count = await notes.count();
|
||||
|
||||
@ -146,10 +224,10 @@ test.describe('Note Grid - Drag and Drop', () => {
|
||||
|
||||
// Reload page
|
||||
await page.reload();
|
||||
await page.waitForSelector('text=Note');
|
||||
await page.waitForSelector('[data-draggable="true"]');
|
||||
|
||||
// Get order after reload
|
||||
const notesAfterReload = page.locator('[draggable="true"]');
|
||||
const notesAfterReload = page.locator('[data-draggable="true"]');
|
||||
const reloadedOrder: string[] = [];
|
||||
const countAfterReload = await notesAfterReload.count();
|
||||
|
||||
@ -162,20 +240,63 @@ test.describe('Note Grid - Drag and Drop', () => {
|
||||
expect(reloadedOrder.length).toBe(initialOrder.length);
|
||||
});
|
||||
|
||||
test.afterEach(async ({ page }) => {
|
||||
// Clean up created notes
|
||||
const notes = page.locator('[draggable="true"]');
|
||||
const count = await notes.count();
|
||||
test.afterEach(async ({ page, request }) => {
|
||||
console.log('[CLEANUP] Starting cleanup...');
|
||||
|
||||
for (let i = 0; i < count; i++) {
|
||||
const note = notes.first();
|
||||
await note.hover();
|
||||
await page.click('button:has(svg.lucide-more-vertical)').first();
|
||||
await page.click('text=Delete').first();
|
||||
// Clean up created notes via API - more reliable than UI interaction
|
||||
try {
|
||||
const response = await request.get('http://localhost:3000/api/notes');
|
||||
const data = await response.json();
|
||||
|
||||
// Confirm delete
|
||||
page.once('dialog', dialog => dialog.accept());
|
||||
await page.waitForTimeout(300);
|
||||
if (data.success && data.data) {
|
||||
const testNotes = data.data.filter((note: any) =>
|
||||
note.title?.startsWith('test-') &&
|
||||
note.content?.startsWith('Content ')
|
||||
);
|
||||
|
||||
console.log(`[CLEANUP] Found ${testNotes.length} test notes to delete via API`);
|
||||
|
||||
for (const note of testNotes) {
|
||||
try {
|
||||
await request.delete(`http://localhost:3000/api/notes?id=${note.id}`);
|
||||
console.log(`[CLEANUP] Deleted note ${note.id}`);
|
||||
} catch (error) {
|
||||
console.log(`[CLEANUP] Failed to delete note ${note.id}`, error);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('[CLEANUP] Error fetching notes for cleanup', error);
|
||||
}
|
||||
});
|
||||
|
||||
test.afterAll(async ({ request }) => {
|
||||
console.log('[CLEANUP] afterAll: Final cleanup of any remaining test notes...');
|
||||
|
||||
// Final cleanup to ensure no test notes remain
|
||||
try {
|
||||
const response = await request.get('http://localhost:3000/api/notes');
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success && data.data) {
|
||||
const testNotes = data.data.filter((note: any) =>
|
||||
note.title?.startsWith('test-') &&
|
||||
note.content?.startsWith('Content ')
|
||||
);
|
||||
|
||||
console.log(`[CLEANUP] afterAll: Found ${testNotes.length} remaining test notes to delete`);
|
||||
|
||||
for (const note of testNotes) {
|
||||
try {
|
||||
await request.delete(`http://localhost:3000/api/notes?id=${note.id}`);
|
||||
console.log(`[CLEANUP] afterAll: Deleted note ${note.id}`);
|
||||
} catch (error) {
|
||||
console.log(`[CLEANUP] afterAll: Failed to delete note ${note.id}`, error);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('[CLEANUP] afterAll: Error fetching notes for final cleanup', error);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||