Du JS pur,
pour du mobile
60 FPS

70+ composants Material/Cupertino · 30+ utilitaires · 6 managers système
SecureStorage · AnimationEngine · OfflineSync · Accessibility

Commencer → GitHub
70+ Composants
30+ Utilitaires
6 Managers
60 FPS
🎨

70+ Composants

Button, Input, Switch, Slider, Dialog, Modal, Tabs, List, Cards, Camera, QRCode, Map...

🛠️

30+ Utilitaires

SecureStorage, AnimationEngine, FetchClient, DataStore, I18n, FormValidator, WebSocket...

⚙️

Managers

ErrorHandler, MemoryManager, SecurityManager, AccessibilityManager, PerformanceMonitor

🔐

SecureStorage

AES-GCM, IV aléatoire, cache mémoire, export/import chiffré

La performance
la vérité, sans filtre

On ne va pas se mentir. Flutter est meilleur. Point.
Mais voici où on se situe vraiment, avec nos forces ET nos faiblesses.

Flutter (incontesté) CanvasFramework (honnête) React Native ⚠️ ici on peut être sous RN Ionic (DOM + WebView)
🏆
Flutter
Moteur Skia compilé
100%
le roi
🤷
CanvasFramework
WebView shell
92-96%
honnête, pas plus
📱
React Native
Bridge JS/natif
90-95%
variable
🐌
Ionic
DOM + WebView
60-75%
à éviter si perf

🔍 La réalité des chiffres

📉 Nos limites

  • 95% des perfs Flutter en moyenne, pas 98%
  • Peut descendre à 92% sur listes géantes + animations
  • Parfois sous React Native dans certains cas complexes
  • Pas de miracles : la WebView reste une WebView

✅ Nos forces (quand même)

  • 92-96% c'est déjà très honorable
  • 60 FPS stables en production médicale (preuve)
  • Toujours mieux qu'Ionic (très large)

🏁 Le classement sans filtre

🥇 Flutter 100%
Moteur Skia compilé - le meilleur, sans discussion
🥈 CanvasFramework 92-96%
Parfois 92%, parfois 96%. Honnête mais pas miraculeux
🥉 React Native 90-95%
Bridge JS/natif - variable, parfois au-dessus de nous
4 Ionic 60-75%
DOM + WebView - beaucoup trop lent

⚡ CanvasFramework vs Ionic

CanvasFramework
92-96%
🐌
Ionic
60-75%

L'écart est ÉNORME : 30% de performance en plus.
Ionic traîne le DOM, nous on dessine directement sur canvas.

⚠️ Les cas où CanvasFramework est sous React Native

📋
Listes infinies
+ 10 000 items
-4% perf
🔄
Animations simultanées
50+ composants
-3% perf
🎨
Redessins fréquents
60 FPS constants
-2% perf

Dans ces cas, on peut descendre à 92% quand React Native reste à 93-94%.
C'est rare, mais ça arrive. On assume.

📱
Application médicale
60 FPS
MAIS :
  • ✓ Interface simple
  • ✓ Peu d'animations complexes
  • ✓ Pas de listes infinies
  • ✓ Optimisée manuellement
Dans ce contexte précis, ça tient.
🎮
Cas extrême
50-55 FPS
si on pousse vraiment :
  • ✗ 20 000 items
  • ✗ 100 animations en parallèle
  • ✗ Redessin complet à chaque frame
Mais qui fait ça ?
60 FPS dans les cas normaux (et 50-55 FPS dans les cas extrêmes)

🎯 La vérité qui fâche

Flutter est meilleur. On ne le rattrapera pas.
React Native nous talonne, et parfois nous dépasse.
Mais on écrase Ionic.
Et surtout, on fait tout ça en JavaScript pur, sans Dart, sans bridge, sans complexité inutile.
C'est notre vrai combat.

Comparaison honnête

On ne bat pas Flutter en perf pure. Mais pour le reste...

CanvasFramework Flutter React Native Ionic
Performance 🔥 60 FPS 🔥 60 FPS 🔥 55 FPS 🔥 30-40 FPS
Langage ✅ JavaScript ❌ Dart ✅ JavaScript ✅ JavaScript
Courbe apprentissage ⭐ 1/10 🔥 8/10 🔥 5/10 🔥 3/10
Bundle size +/- 450 KB 2MB+ 5MB+ 3MB+
DOM ❌ Non ❌ Non ✅ Oui (bridge) ✅ Oui
Production médicale ✅ Oui ✅ Oui ✅ Oui ✅ Oui

🎨 Tous les composants

Tous (70+)
Formulaires
Navigation
Feedback
Affichage
Médias
Avancés
🔘

Button

Material 3 Cupertino Formulaires
Cliquez-moi

5 types Material, 5 types Cupertino, 3 formes, ripple, elevation

  • filled, outlined, text, elevated, tonal
  • filled, gray, tinted, bordered, plain
  • rounded, square, pill
  • Ripple effect Material
const btn = new Button(framework, {
    text: 'Cliquez-moi',
    type: 'filled',
    shape: 'rounded',
    onClick: () => console.log('Click!')
});
📝

Input

Material 3 Cupertino Formulaires

Filled/Outlined, label flottant, erreur, helper, icônes

  • Filled & Outlined variants
  • Floating label animation
  • Error & helper text
  • Leading/trailing icons
  • Cursor blinking
const input = new Input(framework, {
    label: 'Email',
    placeholder: 'vous@exemple.com',
    variant: 'outlined'
});
🔄

Switch

Material 3 Cupertino Formulaires

Toggle avec animation fluide

  • Material track/thumb animation
  • iOS style with shadow
  • Animated transition
  • onChange callback
const toggle = new Switch(framework, {
    checked: true,
    onChange: (checked) => {
        console.log('Switch:', checked);
    }
});
🎚️

Slider

Material 3 Cupertino Formulaires

Curseur avec drag & animation

  • Min/max/step configurables
  • Thumb scale animation
  • Shadow on drag
  • onChange callback
const slider = new Slider(framework, {
    min: 0, max: 100, value: 50,
    onChange: (val) => updateValue(val)
});

RadioButton

Material 3 Cupertino Formulaires

Groupes, sélection unique

  • Ripple effect Material
  • Tap overlay iOS
  • Group management
  • Animated selection
const radio = new RadioButton(framework, {
    group: 'gender',
    label: 'Homme',
    checked: false
});

Checkbox

Material 3 Cupertino Formulaires

Cases à cocher avec animations

  • Material square with check
  • iOS circle with check
  • Label support
  • onChange callback
const cb = new Checkbox(framework, {
    label: 'Accepter',
    checked: false
});
💬

Dialog

Material 3 Cupertino Feedback
Confirmation
Voulez-vous continuer ?
ANNULER OK

Modals avec animations

  • Material design (Android)
  • Cupertino design (iOS)
  • Ripple on buttons
  • Fade in/out animation
const dialog = new Dialog(framework, {
    title: 'Confirmation',
    message: 'Action irréversible',
    buttons: ['ANNULER', 'CONFIRMER']
});
🍞

Toast

Material 3 Cupertino Feedback
Message court

Notifications temporaires

  • Auto-dismiss configurable
  • Fade in/out animation
  • Text truncation
  • Material & iOS styles
const toast = new Toast(framework, {
    text: 'Opération réussie !',
    duration: 3000
});
toast.show();
🍫

Snackbar

Material 3 Feedback
Document sauvegardé ANNULER

Notification avec action

  • Action button optionnel
  • Slide in/out animation
  • Auto-dismiss
  • Material style
const snack = new Snackbar(framework, {
    message: 'Document sauvegardé',
    actionText: 'ANNULER',
    onAction: () => undo()
});
snack.show();
👤

Avatar

Material 3 Cupertino Affichage
JD

Photo de profil ou initiales

  • Image support
  • Initials auto-generated
  • Auto color generation
  • Status indicator
  • Border customization
const avatar = new Avatar(framework, {
    initials: 'JD',
    size: 48,
    status: 'online'
});
🏷️

Chip

Material 3 Affichage
Tag

Tags et filtres

  • Variants: filter, input, choice
  • Delete button option
  • Icon support
  • Ripple effect
const chip = new Chip(framework, {
    label: 'React',
    variant: 'filter',
    deletable: true
});
📋

ListItem

Material 3 Cupertino Affichage
Élément de liste

Élément de liste standard

  • Title & subtitle
  • Left/right icons
  • Left image support
  • Divider option
  • Ripple effect
const item = new ListItem(framework, {
    title: 'Jean Dupont',
    subtitle: 'Cardiologie',
    leftIcon: '👤'
});
↔️

SwipeableListItem

Material 3 Avancés
Swipe →

Item avec swipe actions

  • Left/right actions
  • Custom colors & icons
  • Swipe threshold
  • Drag offset animation
const item = new SwipeableListItem(framework, {
    title: 'Document',
    leftActions: [{
        text: 'Archiver',
        color: '#388E3C',
        onClick: () => archive()
    }]
});
📑

VirtualList

Material 3 Avancés
10 000 items

Liste virtualisée haute performance

  • Only visible items rendered
  • Item pooling
  • Scroll recycling
  • Memory efficient
const list = new VirtualList(framework, {
    itemHeight: 56,
    onItemClick: (index) => console.log(index)
});
📊

Table

Material 3 Cupertino Avancés
Nom Âge
...

Tableau complet avec features

  • Sortable columns
  • Pagination
  • Row selection
  • Alternate row colors
  • Custom cell rendering
const table = new Table(framework, {
    columns: [
        { key: 'name', label: 'Nom' },
        { key: 'age', label: 'Âge' }
    ],
    data: dataArray,
    sortable: true
});
🌳

TreeView

Material 3 Avancés
📁 Dossier 1
  📄 Fichier 1

Arborescence interactive

  • Nested items
  • Expand/collapse
  • Icons per level
  • Selection support
const tree = new TreeView(framework, {
    data: treeData,
    onSelect: (node) => console.log(node)
});
🔽

Accordion

Material 3 Cupertino Avancés
Section 1

Section extensible animée

  • Ripple effect centré
  • Content height calculation
  • Chevron rotation
  • Animated expansion
const acc = new Accordion(framework, {
    title: 'Paramètres avancés',
    content: 'Configuration détaillée...',
    expanded: false
});
📑

Tabs

Material 3 Cupertino Navigation
Accueil
Profil
Paramètres

Onglets avec contenu associé

  • Ripple effect Material
  • iOS style bottom indicator
  • Icon + text support
  • Content switching
  • Position: top/bottom
const tabs = new Tabs(framework, {
    tabs: [
        { label: 'Accueil', icon: '🏠' },
        { label: 'Profil', icon: '👤' }
    ],
    onChange: (index) => loadPage(index)
});
📱

BottomNavigationBar

Material 3 Cupertino Navigation
🏠 🔍 👤

Barre de navigation inférieure

  • Ripple effect Material
  • iOS blur background
  • Icon + label
  • Animated indicator
const nav = new BottomNavigationBar(framework, {
    items: [
        { icon: '🏠', label: 'Accueil' },
        { icon: '🔍', label: 'Recherche' }
    ]
});
🏗️

AppBar

Material 3 Cupertino Navigation
Titre

Barre d'application supérieure

  • Material elevation shadow
  • iOS blur background
  • Left/right icons
  • Ripple on Material
  • iOS press overlay
const appBar = new AppBar(framework, {
    title: 'Mon App',
    leftIcon: 'menu',
    rightIcon: 'search'
});
🏔️

SliverAppBar

Material 3 Cupertino Navigation

AppBar expansible/collapsable

  • Collapse on scroll
  • Parallax background
  • Stretch on overscroll
  • Title fade
  • Extends AppBar
const sliver = new SliverAppBar(framework, {
    title: 'Profil',
    expandedHeight: 200,
    collapsedHeight: 56,
    parallax: true
});
📂

Drawer

Material 3 Cupertino Navigation

Menu latéral

  • Header avec titre
  • Items avec icônes
  • Slide animation
  • Overlay semi-transparent
  • Hover effect
const drawer = new Drawer(framework, {
    header: { title: 'Menu' },
    items: [
        { icon: '🏠', label: 'Accueil' },
        { icon: '⚙️', label: 'Paramètres' }
    ]
});
drawer.open();
📎

BottomSheet

Material 3 Cupertino Navigation

Feuille modale par le bas

  • Drag handle
  • Spring animation iOS
  • Easing animation Material
  • Close on overlay click
  • Clip content
const sheet = new BottomSheet(framework, {
    height: 400,
    dragHandle: true
});
sheet.add(button);
sheet.open();
🪟

Modal

Material 3 Feedback

Fenêtre modale générique

  • Scale in animation
  • Close button
  • Overlay click to close
  • Child components support
  • Shadow & blur
const modal = new Modal(framework, {
    title: 'Informations',
    width: 300, height: 400
});
modal.add(content);
modal.show();
🍔

ContextMenu

Material 3 Navigation
Option 1
Option 2

Menu contextuel

  • Hover detection
  • Auto-close
  • Shadow & border
  • Item dividers
const menu = new ContextMenu(framework, {
    options: ['Éditer', 'Copier', 'Supprimer'],
    onSelect: (index) => action(index)
});

FAB

Material 3 Navigation
+

Floating Action Button

  • Variants: small, medium, large
  • Extended mode with text
  • Rounded corners (Material 3)
  • Ripple effect
  • Elevation shadow
const fab = new FAB(framework, {
    icon: '+',
    variant: 'large',
    onClick: () => addItem()
});

SpeedDialFAB

Material 3 Navigation
📞
+

FAB avec menu d'actions

  • Animated opening
  • Staggered animation
  • Labels on left
  • Overlay on open
  • Rotating icon
const fab = new SpeedDialFAB(framework, {
    actions: [
        { icon: '✉', label: 'Email', action: sendEmail },
        { icon: '📞', label: 'Call', action: makeCall }
    ]
});
🔄

MorphingFAB

Material 3 Navigation
Search...

FAB qui se transforme

  • Toolbar or searchbar mode
  • Smooth morph animation
  • Input support for search
  • Action buttons
  • Back button
const fab = new MorphingFAB(framework, {
    morphType: 'searchbar',
    actions: [...]
});

CircularProgress

Material 3 Cupertino Feedback

Spinner circulaire

  • Indeterminate mode
  • Progress mode (0-100%)
  • Material arc animation
  • iOS 12-lines spinner
  • Custom color & size
const spinner = new CircularProgress(framework, {
    indeterminate: true,
    size: 40
});
📊

ProgressBar

Material 3 Cupertino Feedback

Barre de progression linéaire

  • Material flat design
  • iOS rounded corners
  • Custom progress
  • Determinate only
const bar = new ProgressBar(framework, {
    progress: 75,
    height: 4
});
📢

Banner

Material 3 Cupertino Feedback
Message important

Bannière d'information

  • Types: info, success, warning, error
  • Actions buttons
  • Dismissible option
  • Ripple effect Material
const banner = new Banner(framework, {
    text: 'Mise à jour disponible',
    type: 'info',
    actions: [{ label: 'Mettre à jour', onClick: update }]
});
📅

DatePicker

Material 3 Cupertino Formulaires
25/12/2024

Sélecteur de date

  • Android dialog style
  • iOS wheel picker
  • Min/max constraints
  • Modal integration
  • Custom colors
const picker = new DatePicker(framework, {
    selectedDate: new Date(),
    onChange: (date) => console.log(date)
});

TimePicker

Material 3 Cupertino Formulaires
14:30

Sélecteur d'heure

  • iOS wheel picker
  • Android clock face
  • Min/max constraints
  • AM/PM support
const timePicker = new TimePicker(framework, {
    selectedTime: new Date(),
    onChange: (time) => console.log(time)
});
📷

Camera

Direct Events Médias
📸

Appareil photo intégré

  • Facing mode (user/environment)
  • Torch support
  • Fit modes (contain/cover)
  • Photo capture
  • Preview thumbnail
const camera = new Camera(framework, {
    facingMode: 'environment',
    onPhoto: (dataUrl) => savePhoto(dataUrl)
});
📱

QRCodeReader

Direct Events Médias
📱 QR

Lecteur de QR codes

  • Real-time scanning
  • Overlay with scanning line
  • Torch support
  • Vibration on detection
  • Scan history
const reader = new QRCodeReader(framework, {
    onQRCodeDetected: (data) => console.log(data)
});
✍️

SignaturePad

Direct Events Médias
🖊️

Pad de signature

  • Smooth drawing
  • Custom stroke color/width
  • Clear function
  • Export as DataURL/Blob
  • Empty detection
const pad = new SignaturePad(framework, {
    strokeColor: '#000000',
    onSignatureChange: (points) => console.log(points)
});
🎬

Video

Direct Events Médias
▶️

Lecteur vidéo

  • Play/pause controls
  • Progress bar
  • Time display
  • Fullscreen toggle
  • Poster image
const video = new Video(framework, {
    src: 'video.mp4',
    onPlay: () => console.log('Playing')
});
🎵

AudioPlayer

Direct Events Médias
🎵

Lecteur audio

  • Direct event handling
  • Native UI controls
  • Audio cache
  • Volume control
  • Time tracking
const player = new AudioPlayer(framework, {
    src: '/audio/track.mp3',
    onEnded: () => console.log('Finished')
});
🖼️

ImageComponent

Material 3 Affichage
🖼️

Composant d'image

  • Fit modes: cover, contain, fill, none
  • Lazy loading
  • Placeholder with spinner
  • Error handling
  • Border radius
const img = new ImageComponent(framework, {
    src: 'photo.jpg',
    fit: 'cover',
    borderRadius: 8
});
🗺️

OpenStreetMap

Direct Events Médias
🗺️

Cartes OpenStreetMap

  • Pan & zoom
  • Multi-touch support
  • Tile caching
  • Markers
  • Inertia scrolling
const map = new OpenStreetMap(framework, {
    lat: 48.8566,
    lng: 2.3522,
    zoom: 13
});
🔢

NumberInput

Material 3 Cupertino Formulaires
42

Input numérique

  • Min/max constraints
  • Step increment
  • Numeric keyboard
  • Placeholder support
const num = new NumberInput(framework, {
    value: 10,
    min: 0,
    max: 100,
    step: 5
});
🔒

PasswordInput

Material 3 Cupertino Formulaires
••••••

Champ mot de passe

  • Show/hide toggle
  • Mask character
  • Eye icon button
  • Cursor animation
const pwd = new PasswordInput(framework, {
    placeholder: 'Mot de passe'
});
🏷️

InputTags

Material 3 Formulaires
React ✕
Vue ✕

Saisie de tags multiples

  • Add with Enter or comma
  • Delete with backspace
  • Remove individual tags
  • Dynamic height
const tags = new InputTags(framework, {
    tags: ['React', 'Vue'],
    onTagAdd: (tag) => console.log('Added:', tag)
});
📋

InputDatalist

Material 3 Formulaires
Rechercher...

Input avec autocomplétion

  • Filter on type
  • Dropdown with options
  • Keyboard navigation
  • Match highlighting
const datalist = new InputDatalist(framework, {
    options: ['Paris', 'Lyon', 'Marseille'],
    onSelect: (value) => console.log(value)
});
📎

FileUpload

Material 3 Cupertino Formulaires
📁 Choisir un fichier

Zone de téléchargement

  • Ripple effect Material
  • iOS style
  • File list display
  • Accept attribute
  • Multiple files
const upload = new FileUpload(framework, {
    accept: '.jpg,.png',
    multiple: true,
    onFilesSelected: (files) => console.log(files)
});

Select

Material 3 Cupertino Formulaires
▼ Option 1

Menu déroulant

  • Dropdown with options
  • Selected value display
  • Keyboard navigation
  • Custom styling
const select = new Select(framework, {
    options: ['Option 1', 'Option 2'],
    onChange: (value) => console.log(value)
});
☑️

MultiSelectDialog

Modal Formulaires
☑️ Multi

Sélection multiple

  • Checkboxes per option
  • Scrollable list
  • Cancel/OK buttons
  • Selected indices
const multi = new MultiSelectDialog(framework, {
    options: ['A', 'B', 'C'],
    selectedIndices: [0, 2],
    onSelect: (indices, values) => console.log(values)
});
🎚️

SegmentedControl

Material 3 Cupertino Formulaires
Jour
Semaine
Mois

Contrôle segmenté

  • Ripple effect Material
  • iOS style
  • Button callbacks
  • Rounded corners
const seg = new SegmentedControl(framework, {
    buttons: [
        { text: 'Jour', onClick: () => setView('day') }
    ]
});
➕/➖

Stepper

Material 3 Cupertino Formulaires
- 5 +

Incrémenteur/décrémenteur

  • Min/max/step
  • Ripple effect
  • iOS style
  • Press feedback
const stepper = new Stepper(framework, {
    value: 1,
    min: 0,
    max: 10,
    onChange: (val) => console.log(val)
});
📈

Chart

Graphiques Avancés
📊

Graphiques avancés

  • Types: line, bar, pie, doughnut
  • Animations 60 FPS
  • Legend & grid
  • Hover interaction
const chart = new Chart(framework, {
    type: 'line',
    data: {
        labels: ['Jan', 'Feb'],
        datasets: [{ data: [10, 20] }]
    }
});
🃏

Cards

Container Affichage
Titre
Contenu de la carte

Conteneur avec élévation

  • Elevation 0-5 with shadows
  • Border radius
  • Child positioning
  • Padding & gap
const card = new Cards(framework, {
    padding: 16,
    elevation: 4,
    borderRadius: 12
}, [text, button]);
➡️

Row

Layout Affichage

Layout horizontal

  • Align: start, center, end
  • Spacing control
  • Auto-sizing
  • Recursive layout
const row = new Row(framework, {
    spacing: 10,
    align: 'center'
}, [child1, child2]);
⬇️

Column

Layout Affichage

Layout vertical

  • Align: start, center, end, stretch
  • Spacing control
  • Auto-sizing
  • Recursive layout
const col = new Column(framework, {
    spacing: 10,
    align: 'stretch'
}, [child1, child2]);
🔲

Grid

Layout Affichage

Grille responsive

  • Configurable columns
  • Equal width cells
  • Spacing control
  • Auto row height
const grid = new Grid(framework, {
    columns: 2,
    spacing: 10
}, items);
📚

Stack

Layout Affichage

Superposition de composants

  • Z-order by addition
  • No automatic positioning
  • Use with Positioned
  • Recursive layout
const stack = new Stack(framework, {}, [
    background,
    foreground
]);
📍

Positioned

Layout Affichage

Positionnement absolu

  • left, top, right, bottom
  • Relative to parent
  • Layout integration
const pos = new Positioned(framework, {
    child: fab,
    bottom: 16,
    right: 16
});
📃

List

Container Affichage
Item 1
Item 2

Conteneur de liste

  • Automatic positioning
  • Item height fixed
  • Supports ListItem
  • Clear function
const list = new List(framework, {
    itemHeight: 56,
    onItemClick: (index) => console.log(index)
});
list.addItem({ title: 'Item' });

Divider

Material 3 Affichage

Séparateur visuel

  • Horizontal/vertical
  • Variants: full, inset, middle
  • Styles: solid, dashed, dotted
  • Custom color & thickness
const divider = new Divider(framework, {
    orientation: 'horizontal',
    variant: 'inset',
    style: 'dashed'
});
⬇️🔄

PullToRefresh

Direct Events Avancés
↓ Pull to refresh

Pull-to-refresh autonome

  • Independent event handling
  • Pull threshold
  • Progress indicator
  • Refresh spinner
const ptr = new PullToRefresh(framework, {
    onRefresh: async () => {
        await loadData();
    }
});
🦴

Skeleton

Placeholder Feedback

Placeholder animé

  • Types: text, circle, rectangle
  • Shimmer effect
  • Animation progress
  • Border radius
const skeleton = new Skeleton(framework, {
    type: 'text',
    width: 200,
    height: 100
});

⚡ Performance

Testé en production médicale - 60 FPS stables

60
FPS constants
10-50
MB mémoire
+/- 450
KB bundle
// Optimisations activées par défaut
const app = new CanvasFramework('app', {
    useWebGL: true,           // Rendu accéléré
    optimizations: {
        useDoubleBuffering: true,  // Pas de flickering
        useSpatialPartitioning: true, // Culling viewport
        useImageDataOptimization: true
    },
    showFps: true               // Debug performance
});