diff --git a/.vscode/settings.json b/.vscode/settings.json
index 92479997..4cbc0787 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -9,23 +9,23 @@
"**/.fvm/flutter_sdk": true
},
"workbench.colorCustomizations": {
- "activityBar.activeBackground": "#2f7c47",
- "activityBar.background": "#2f7c47",
- "activityBar.foreground": "#e7e7e7",
- "activityBar.inactiveForeground": "#e7e7e799",
- "activityBarBadge.background": "#422c74",
+ "activityBar.activeBackground": "#3399ff",
+ "activityBar.background": "#3399ff",
+ "activityBar.foreground": "#15202b",
+ "activityBar.inactiveForeground": "#15202b99",
+ "activityBarBadge.background": "#bf0060",
"activityBarBadge.foreground": "#e7e7e7",
"commandCenter.border": "#e7e7e799",
- "sash.hoverBorder": "#2f7c47",
- "statusBar.background": "#215732",
+ "sash.hoverBorder": "#3399ff",
+ "statusBar.background": "#007fff",
"statusBar.foreground": "#e7e7e7",
- "statusBarItem.hoverBackground": "#2f7c47",
- "statusBarItem.remoteBackground": "#215732",
+ "statusBarItem.hoverBackground": "#3399ff",
+ "statusBarItem.remoteBackground": "#007fff",
"statusBarItem.remoteForeground": "#e7e7e7",
- "titleBar.activeBackground": "#215732",
+ "titleBar.activeBackground": "#007fff",
"titleBar.activeForeground": "#e7e7e7",
- "titleBar.inactiveBackground": "#21573299",
+ "titleBar.inactiveBackground": "#007fff99",
"titleBar.inactiveForeground": "#e7e7e799"
},
- "peacock.color": "#215732"
+ "peacock.color": "#007fff"
}
\ No newline at end of file
diff --git a/README.md b/README.md
index ec6bc7c9..d4f992d3 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,6 @@
-![Superdeck logo](./assets/logo.png)
+
+![Superdeck logo](./assets/logo-dark.png#gh-dark-mode-only)
+![Superdeck logo](./assets/logo-light.png#gh-light-mode-only)
SuperDeck enables you to craft visually appealing and interactive presentations directly within your Flutter apps, using the simplicity and power of Markdown.
@@ -8,8 +10,6 @@ SuperDeck enables you to craft visually appealing and interactive presentations
### [Example code](https://github.com/leoafarias/superdeck/blob/main/example/slides.md)
-
-
## Getting Started
Follow these steps to integrate SuperDeck into your Flutter project:
@@ -26,7 +26,8 @@ Follow these steps to integrate SuperDeck into your Flutter project:
import 'package:superdeck/superdeck.dart';
```
-3. Initialize SuperDeck and run the app.
+3. Initialize SuperDeck and run the app.
+
```dart
void main() {
runApp(const SuperDeckApp());
@@ -44,49 +45,39 @@ Follow these steps to integrate SuperDeck into your Flutter project:
- assets/images/
```
-The `assets` directory is used to slide and asset references, while the `assets/images` directory is specifically used for storing images used in your presentations.
+ The `assets` directory is used to slide and asset references, while the `assets/images` directory is specifically used for storing images used in your presentations.
6. Configure your app
-MacOS
-
-Change your `Release.entitlements`
-
-```xml
-
- com.apple.security.app-sandbox
-
- com.apple.security.network.client
-
-
-```
-
-Change `DebugProfile.entitlements`
-
-```xml
-
- com.apple.security.app-sandbox
-
- com.apple.security.cs.allow-jit
-
- com.apple.security.network.server
-
- com.apple.security.network.client
-
-
-```
-
-
-
-
-
-
-
+ MacOS
+ Change your `Release.entitlements`
+ ```xml
+
+ com.apple.security.app-sandbox
+
+ com.apple.security.network.client
+
+
+ ```
+ Change `DebugProfile.entitlements`
+
+ ```xml
+
+ com.apple.security.app-sandbox
+
+ com.apple.security.cs.allow-jit
+
+ com.apple.security.network.server
+
+ com.apple.security.network.client
+
+
+ ```
-6. Start building your slides in the `slides.md` file using Markdown syntax and SuperDeck's slide templates and configurations.
+7. Start building your slides in the `slides.md` file using Markdown syntax and SuperDeck's slide templates and configurations.
### SuperDeck Options
@@ -113,6 +104,7 @@ SuperDeckApp(
```
### Shared Slide Options
+
Some shared options can be applied by adding them to a `superdeck.yaml` file in the root of your project. These options will be applied to all slides unless overridden by slide-specific options.
### Slide Options
@@ -245,9 +237,9 @@ layout: two_column_header
#### Sections
-- `::header::`: The content that will be placed in the header section.
-- `::left::`: The content that will be placed in the left column.
-- `::right::`: The content that will be placed in the right column.
+- `::header::`: The content that will be placed in the header section.
+- `::left::`: The content that will be placed in the left column.
+- `::right::`: The content that will be placed in the right column.
If the first tag that is found is `::left::`, everything before this tag will be placed in the `::header::` section.
@@ -269,6 +261,7 @@ sections:
Keep in mind that you can also control the flex of the `left` and `right` sections by using the `content` property.
Read more about it in the [content options](#content) section.
+
### Image Template
Display an image alongside the slide content.
@@ -322,4 +315,3 @@ The `options` property specifies the widget to be embedded. It has the following
- `position`: The position of the widget relative to the slide content.
- `flex`: The flex value of the widget.
- `args`: Additional arguments to be passed to the widget.
-
diff --git a/assets/logo-dark.png b/assets/logo-dark.png
index e21fe1db..9091ef52 100644
Binary files a/assets/logo-dark.png and b/assets/logo-dark.png differ
diff --git a/assets/logo-light.png b/assets/logo-light.png
index 4a6365f7..08bbd7d1 100644
Binary files a/assets/logo-light.png and b/assets/logo-light.png differ
diff --git a/assets/logo.png b/assets/logo.png
index 60c19218..7e7881a3 100644
Binary files a/assets/logo.png and b/assets/logo.png differ
diff --git a/example/.metadata b/example/.metadata
deleted file mode 100644
index 009f8afe..00000000
--- a/example/.metadata
+++ /dev/null
@@ -1,45 +0,0 @@
-# This file tracks properties of this Flutter project.
-# Used by Flutter tool to assess capabilities and perform upgrades etc.
-#
-# This file should be version controlled and should not be manually edited.
-
-version:
- revision: "efbf63d9c66b9f6ec30e9ad4611189aa80003d31"
- channel: "stable"
-
-project_type: app
-
-# Tracks metadata for the flutter migrate command
-migration:
- platforms:
- - platform: root
- create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- - platform: android
- create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- - platform: ios
- create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- - platform: linux
- create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- - platform: macos
- create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- - platform: web
- create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- - platform: windows
- create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
-
- # User provided section
-
- # List of Local paths (relative to this file) that should be
- # ignored by the migrate tool.
- #
- # Files that are not part of the templates will be ignored by default.
- unmanaged_files:
- - 'lib/main.dart'
- - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle
deleted file mode 100644
index 8f246bbd..00000000
--- a/example/android/app/build.gradle
+++ /dev/null
@@ -1,67 +0,0 @@
-plugins {
- id "com.android.application"
- id "kotlin-android"
- id "dev.flutter.flutter-gradle-plugin"
-}
-
-def localProperties = new Properties()
-def localPropertiesFile = rootProject.file('local.properties')
-if (localPropertiesFile.exists()) {
- localPropertiesFile.withReader('UTF-8') { reader ->
- localProperties.load(reader)
- }
-}
-
-def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
-if (flutterVersionCode == null) {
- flutterVersionCode = '1'
-}
-
-def flutterVersionName = localProperties.getProperty('flutter.versionName')
-if (flutterVersionName == null) {
- flutterVersionName = '1.0'
-}
-
-android {
- namespace "com.example.superdeck_demo"
- compileSdkVersion flutter.compileSdkVersion
- ndkVersion flutter.ndkVersion
-
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
- }
-
- kotlinOptions {
- jvmTarget = '1.8'
- }
-
- sourceSets {
- main.java.srcDirs += 'src/main/kotlin'
- }
-
- defaultConfig {
- // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
- applicationId "com.example.superdeck_demo"
- // You can update the following values to match your application needs.
- // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
- minSdkVersion flutter.minSdkVersion
- targetSdkVersion flutter.targetSdkVersion
- versionCode flutterVersionCode.toInteger()
- versionName flutterVersionName
- }
-
- buildTypes {
- release {
- // TODO: Add your own signing config for the release build.
- // Signing with the debug keys for now, so `flutter run --release` works.
- signingConfig signingConfigs.debug
- }
- }
-}
-
-flutter {
- source '../..'
-}
-
-dependencies {}
diff --git a/example/android/app/src/main/kotlin/com/example/dash_deck_demo/MainActivity.kt b/example/android/app/src/main/kotlin/com/example/dash_deck_demo/MainActivity.kt
deleted file mode 100644
index 942c6fe5..00000000
--- a/example/android/app/src/main/kotlin/com/example/dash_deck_demo/MainActivity.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.example.superdeck_demo
-
-import io.flutter.embedding.android.FlutterActivity
-
-class MainActivity: FlutterActivity() {
-}
diff --git a/example/android/build.gradle b/example/android/build.gradle
deleted file mode 100644
index f7eb7f63..00000000
--- a/example/android/build.gradle
+++ /dev/null
@@ -1,31 +0,0 @@
-buildscript {
- ext.kotlin_version = '1.7.10'
- repositories {
- google()
- mavenCentral()
- }
-
- dependencies {
- classpath 'com.android.tools.build:gradle:7.3.0'
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
- }
-}
-
-allprojects {
- repositories {
- google()
- mavenCentral()
- }
-}
-
-rootProject.buildDir = '../build'
-subprojects {
- project.buildDir = "${rootProject.buildDir}/${project.name}"
-}
-subprojects {
- project.evaluationDependsOn(':app')
-}
-
-tasks.register("clean", Delete) {
- delete rootProject.buildDir
-}
diff --git a/example/android/gradle.properties b/example/android/gradle.properties
deleted file mode 100644
index 94adc3a3..00000000
--- a/example/android/gradle.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-org.gradle.jvmargs=-Xmx1536M
-android.useAndroidX=true
-android.enableJetifier=true
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png
deleted file mode 100644
index 3f71ab5c..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png
deleted file mode 100644
index 0f9fe3f0..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png
deleted file mode 100644
index 81f8f3b7..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png
deleted file mode 100644
index 58a8a4be..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png
deleted file mode 100644
index f5648679..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png
deleted file mode 100644
index c4c12a07..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png
deleted file mode 100644
index 1578fbc5..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png
deleted file mode 100644
index 5192436e..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png
deleted file mode 100644
index c09435ae..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png
deleted file mode 100644
index 300b39e1..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png
deleted file mode 100644
index 8efe4931..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png
deleted file mode 100644
index 8fc17e0c..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png
deleted file mode 100644
index 75b677f2..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png
deleted file mode 100644
index 5d7fa4a3..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png
deleted file mode 100644
index e8372384..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png
deleted file mode 100644
index 6eabe776..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png
deleted file mode 100644
index 9cda5f61..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png
deleted file mode 100644
index 620c3438..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png
deleted file mode 100644
index 71c2b9f4..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png
deleted file mode 100644
index 8fd73476..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png
deleted file mode 100644
index 13c5156c..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png
deleted file mode 100644
index 3ead7aaa..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png
deleted file mode 100644
index b0bda75d..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png
deleted file mode 100644
index 45a54efd..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png
deleted file mode 100644
index 34de7c41..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index 5c82812f..00000000
--- a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1 +0,0 @@
-{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"128x128","expected-size":"128","filename":"128.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"256x256","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"128x128","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"256x256","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"512x512","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"16","filename":"16.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"64","filename":"64.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"512x512","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"}]}
\ No newline at end of file
diff --git a/example/lib/main.dart b/example/lib/main.dart
deleted file mode 100644
index 1635572f..00000000
--- a/example/lib/main.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:superdeck/superdeck.dart';
-
-import 'src/style.dart';
-import 'src/widget/mix_demo.dart';
-
-void main() async {
- await SuperDeckApp.initialize();
- runApp(
- Builder(builder: (context) {
- return MaterialApp(
- title: 'Superdeck',
- debugShowCheckedModeBanner: false,
- home: SuperDeckApp(
- style: style,
- // ignore: prefer_const_literals_to_create_immutables
- examples: [
- Example(
- name: 'demo',
- schema: ExampleOptions.schema,
- builder: (args) {
- return Center(
- child: Container(
- height: args.height,
- width: args.width,
- color: Colors.blue,
- alignment: Alignment.center,
- child: Text(args.text),
- ),
- );
- },
- ),
- ],
- ),
- );
- }),
- );
-}
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/100.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/100.png
deleted file mode 100644
index 3f71ab5c..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/100.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/1024.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/1024.png
deleted file mode 100644
index 0f9fe3f0..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/1024.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/114.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/114.png
deleted file mode 100644
index 81f8f3b7..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/114.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/120.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/120.png
deleted file mode 100644
index 58a8a4be..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/120.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/128.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/128.png
deleted file mode 100644
index f5648679..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/128.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/144.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/144.png
deleted file mode 100644
index c4c12a07..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/144.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/152.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/152.png
deleted file mode 100644
index 1578fbc5..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/152.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/16.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/16.png
deleted file mode 100644
index 5192436e..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/16.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/167.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/167.png
deleted file mode 100644
index c09435ae..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/167.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/180.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/180.png
deleted file mode 100644
index 300b39e1..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/180.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/20.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/20.png
deleted file mode 100644
index 8efe4931..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/20.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/256.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/256.png
deleted file mode 100644
index 8fc17e0c..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/256.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/29.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/29.png
deleted file mode 100644
index 75b677f2..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/29.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/32.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/32.png
deleted file mode 100644
index 5d7fa4a3..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/32.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/40.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/40.png
deleted file mode 100644
index e8372384..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/40.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/50.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/50.png
deleted file mode 100644
index 6eabe776..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/50.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/512.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/512.png
deleted file mode 100644
index 9cda5f61..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/512.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/57.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/57.png
deleted file mode 100644
index 620c3438..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/57.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/58.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/58.png
deleted file mode 100644
index 71c2b9f4..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/58.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/60.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/60.png
deleted file mode 100644
index 8fd73476..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/60.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/64.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/64.png
deleted file mode 100644
index 13c5156c..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/64.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/72.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/72.png
deleted file mode 100644
index 3ead7aaa..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/72.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/76.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/76.png
deleted file mode 100644
index b0bda75d..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/76.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/80.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/80.png
deleted file mode 100644
index 45a54efd..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/80.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/87.png b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/87.png
deleted file mode 100644
index 34de7c41..00000000
Binary files a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/87.png and /dev/null differ
diff --git a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/Contents.json b/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index 871a77bc..00000000
--- a/example/macos/Runner/Assets.xcassets/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,284 +0,0 @@
-{
- "images": [
- {
- "size": "60x60",
- "expected-size": "180",
- "filename": "180.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "3x"
- },
- {
- "size": "40x40",
- "expected-size": "80",
- "filename": "80.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "2x"
- },
- {
- "size": "40x40",
- "expected-size": "120",
- "filename": "120.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "3x"
- },
- {
- "size": "60x60",
- "expected-size": "120",
- "filename": "120.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "2x"
- },
- {
- "size": "57x57",
- "expected-size": "57",
- "filename": "57.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "1x"
- },
- {
- "size": "29x29",
- "expected-size": "58",
- "filename": "58.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "2x"
- },
- {
- "size": "29x29",
- "expected-size": "29",
- "filename": "29.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "1x"
- },
- {
- "size": "29x29",
- "expected-size": "87",
- "filename": "87.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "3x"
- },
- {
- "size": "57x57",
- "expected-size": "114",
- "filename": "114.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "2x"
- },
- {
- "size": "20x20",
- "expected-size": "40",
- "filename": "40.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "2x"
- },
- {
- "size": "20x20",
- "expected-size": "60",
- "filename": "60.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "iphone",
- "scale": "3x"
- },
- {
- "size": "1024x1024",
- "filename": "1024.png",
- "expected-size": "1024",
- "idiom": "ios-marketing",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "scale": "1x"
- },
- {
- "size": "40x40",
- "expected-size": "80",
- "filename": "80.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "2x"
- },
- {
- "size": "72x72",
- "expected-size": "72",
- "filename": "72.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "1x"
- },
- {
- "size": "76x76",
- "expected-size": "152",
- "filename": "152.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "2x"
- },
- {
- "size": "50x50",
- "expected-size": "100",
- "filename": "100.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "2x"
- },
- {
- "size": "29x29",
- "expected-size": "58",
- "filename": "58.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "2x"
- },
- {
- "size": "76x76",
- "expected-size": "76",
- "filename": "76.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "1x"
- },
- {
- "size": "29x29",
- "expected-size": "29",
- "filename": "29.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "1x"
- },
- {
- "size": "50x50",
- "expected-size": "50",
- "filename": "50.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "1x"
- },
- {
- "size": "72x72",
- "expected-size": "144",
- "filename": "144.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "2x"
- },
- {
- "size": "40x40",
- "expected-size": "40",
- "filename": "40.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "1x"
- },
- {
- "size": "83.5x83.5",
- "expected-size": "167",
- "filename": "167.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "2x"
- },
- {
- "size": "20x20",
- "expected-size": "20",
- "filename": "20.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "1x"
- },
- {
- "size": "20x20",
- "expected-size": "40",
- "filename": "40.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "ipad",
- "scale": "2x"
- },
- {
- "size": "128x128",
- "expected-size": "128",
- "filename": "128.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "mac",
- "scale": "1x"
- },
- {
- "size": "256x256",
- "expected-size": "256",
- "filename": "256.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "mac",
- "scale": "1x"
- },
- {
- "size": "128x128",
- "expected-size": "256",
- "filename": "256.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "mac",
- "scale": "2x"
- },
- {
- "size": "256x256",
- "expected-size": "512",
- "filename": "512.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "mac",
- "scale": "2x"
- },
- {
- "size": "32x32",
- "expected-size": "32",
- "filename": "32.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "mac",
- "scale": "1x"
- },
- {
- "size": "512x512",
- "expected-size": "512",
- "filename": "512.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "mac",
- "scale": "1x"
- },
- {
- "size": "16x16",
- "expected-size": "16",
- "filename": "16.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "mac",
- "scale": "1x"
- },
- {
- "size": "16x16",
- "expected-size": "32",
- "filename": "32.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "mac",
- "scale": "2x"
- },
- {
- "size": "32x32",
- "expected-size": "64",
- "filename": "64.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "mac",
- "scale": "2x"
- },
- {
- "size": "512x512",
- "expected-size": "1024",
- "filename": "1024.png",
- "folder": "Assets.xcassets/AppIcon.appiconset/",
- "idiom": "mac",
- "scale": "2x"
- }
- ]
-}
diff --git a/example/pubspec.lock b/example/pubspec.lock
deleted file mode 100644
index 471c292d..00000000
--- a/example/pubspec.lock
+++ /dev/null
@@ -1,935 +0,0 @@
-# Generated by pub
-# See https://dart.dev/tools/pub/glossary#lockfile
-packages:
- _fe_analyzer_shared:
- dependency: transitive
- description:
- name: _fe_analyzer_shared
- sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
- url: "https://pub.dev"
- source: hosted
- version: "67.0.0"
- analyzer:
- dependency: transitive
- description:
- name: analyzer
- sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
- url: "https://pub.dev"
- source: hosted
- version: "6.4.1"
- animate_do:
- dependency: transitive
- description:
- name: animate_do
- sha256: "7a3162729f0ea042f9dd84da217c5bde5472ad9cef644079929d4304a5dc4ca0"
- url: "https://pub.dev"
- source: hosted
- version: "3.3.4"
- archive:
- dependency: transitive
- description:
- name: archive
- sha256: ecf4273855368121b1caed0d10d4513c7241dfc813f7d3c8933b36622ae9b265
- url: "https://pub.dev"
- source: hosted
- version: "3.5.1"
- args:
- dependency: transitive
- description:
- name: args
- sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a"
- url: "https://pub.dev"
- source: hosted
- version: "2.5.0"
- async:
- dependency: transitive
- description:
- name: async
- sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
- url: "https://pub.dev"
- source: hosted
- version: "2.11.0"
- barcode:
- dependency: transitive
- description:
- name: barcode
- sha256: ab180ce22c6555d77d45f0178a523669db67f95856e3378259ef2ffeb43e6003
- url: "https://pub.dev"
- source: hosted
- version: "2.2.8"
- bidi:
- dependency: transitive
- description:
- name: bidi
- sha256: "1a7d0c696324b2089f72e7671fd1f1f64fef44c980f3cebc84e803967c597b63"
- url: "https://pub.dev"
- source: hosted
- version: "2.0.10"
- boolean_selector:
- dependency: transitive
- description:
- name: boolean_selector
- sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
- url: "https://pub.dev"
- source: hosted
- version: "2.1.1"
- build:
- dependency: transitive
- description:
- name: build
- sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
- url: "https://pub.dev"
- source: hosted
- version: "2.4.1"
- build_config:
- dependency: transitive
- description:
- name: build_config
- sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1
- url: "https://pub.dev"
- source: hosted
- version: "1.1.1"
- cached_network_image:
- dependency: transitive
- description:
- name: cached_network_image
- sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f"
- url: "https://pub.dev"
- source: hosted
- version: "3.3.1"
- cached_network_image_platform_interface:
- dependency: transitive
- description:
- name: cached_network_image_platform_interface
- sha256: "9e90e78ae72caa874a323d78fa6301b3fb8fa7ea76a8f96dc5b5bf79f283bf2f"
- url: "https://pub.dev"
- source: hosted
- version: "4.0.0"
- cached_network_image_web:
- dependency: transitive
- description:
- name: cached_network_image_web
- sha256: "205d6a9f1862de34b93184f22b9d2d94586b2f05c581d546695e3d8f6a805cd7"
- url: "https://pub.dev"
- source: hosted
- version: "1.2.0"
- characters:
- dependency: transitive
- description:
- name: characters
- sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
- url: "https://pub.dev"
- source: hosted
- version: "1.3.0"
- charcode:
- dependency: transitive
- description:
- name: charcode
- sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306
- url: "https://pub.dev"
- source: hosted
- version: "1.3.1"
- checked_yaml:
- dependency: transitive
- description:
- name: checked_yaml
- sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff
- url: "https://pub.dev"
- source: hosted
- version: "2.0.3"
- clock:
- dependency: transitive
- description:
- name: clock
- sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
- url: "https://pub.dev"
- source: hosted
- version: "1.1.1"
- collection:
- dependency: transitive
- description:
- name: collection
- sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
- url: "https://pub.dev"
- source: hosted
- version: "1.18.0"
- convert:
- dependency: transitive
- description:
- name: convert
- sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
- url: "https://pub.dev"
- source: hosted
- version: "3.1.1"
- cross_file:
- dependency: transitive
- description:
- name: cross_file
- sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32"
- url: "https://pub.dev"
- source: hosted
- version: "0.3.4+1"
- crypto:
- dependency: transitive
- description:
- name: crypto
- sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
- url: "https://pub.dev"
- source: hosted
- version: "3.0.3"
- csslib:
- dependency: transitive
- description:
- name: csslib
- sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb"
- url: "https://pub.dev"
- source: hosted
- version: "1.0.0"
- dart_mappable:
- dependency: transitive
- description:
- name: dart_mappable
- sha256: "47269caf2060533c29b823ff7fa9706502355ffcb61e7f2a374e3a0fb2f2c3f0"
- url: "https://pub.dev"
- source: hosted
- version: "4.2.2"
- dart_markdown:
- dependency: transitive
- description:
- name: dart_markdown
- sha256: b9b7e13733dd418bc83e6f4e68d79caebab6cd3a8b301e91d1bfd6ef5ef8e993
- url: "https://pub.dev"
- source: hosted
- version: "3.1.7"
- dart_style:
- dependency: transitive
- description:
- name: dart_style
- sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9"
- url: "https://pub.dev"
- source: hosted
- version: "2.3.6"
- fake_async:
- dependency: transitive
- description:
- name: fake_async
- sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
- url: "https://pub.dev"
- source: hosted
- version: "1.3.1"
- ffi:
- dependency: transitive
- description:
- name: ffi
- sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
- url: "https://pub.dev"
- source: hosted
- version: "2.1.2"
- file:
- dependency: transitive
- description:
- name: file
- sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
- url: "https://pub.dev"
- source: hosted
- version: "7.0.0"
- file_picker:
- dependency: transitive
- description:
- name: file_picker
- sha256: "29c90806ac5f5fb896547720b73b17ee9aed9bba540dc5d91fe29f8c5745b10a"
- url: "https://pub.dev"
- source: hosted
- version: "8.0.3"
- fixnum:
- dependency: transitive
- description:
- name: fixnum
- sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
- url: "https://pub.dev"
- source: hosted
- version: "1.1.0"
- flutter:
- dependency: "direct main"
- description: flutter
- source: sdk
- version: "0.0.0"
- flutter_cache_manager:
- dependency: transitive
- description:
- name: flutter_cache_manager
- sha256: "395d6b7831f21f3b989ebedbb785545932adb9afe2622c1ffacf7f4b53a7e544"
- url: "https://pub.dev"
- source: hosted
- version: "3.3.2"
- flutter_lints:
- dependency: "direct dev"
- description:
- name: flutter_lints
- sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1"
- url: "https://pub.dev"
- source: hosted
- version: "3.0.2"
- flutter_plugin_android_lifecycle:
- dependency: transitive
- description:
- name: flutter_plugin_android_lifecycle
- sha256: "8cf40eebf5dec866a6d1956ad7b4f7016e6c0cc69847ab946833b7d43743809f"
- url: "https://pub.dev"
- source: hosted
- version: "2.0.19"
- flutter_test:
- dependency: "direct dev"
- description: flutter
- source: sdk
- version: "0.0.0"
- flutter_web_plugins:
- dependency: transitive
- description: flutter
- source: sdk
- version: "0.0.0"
- glob:
- dependency: transitive
- description:
- name: glob
- sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
- url: "https://pub.dev"
- source: hosted
- version: "2.1.2"
- go_router:
- dependency: transitive
- description:
- name: go_router
- sha256: abec47eb8c8c36ebf41d0a4c64dbbe7f956e39a012b3aafc530e951bdc12fe3f
- url: "https://pub.dev"
- source: hosted
- version: "14.1.4"
- google_fonts:
- dependency: "direct main"
- description:
- name: google_fonts
- sha256: "5b1726fee554d1cc9db1baef8061b126567ff0a1140a03ed7de936e62f2ab98b"
- url: "https://pub.dev"
- source: hosted
- version: "6.2.0"
- html:
- dependency: transitive
- description:
- name: html
- sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a"
- url: "https://pub.dev"
- source: hosted
- version: "0.15.4"
- http:
- dependency: transitive
- description:
- name: http
- sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
- url: "https://pub.dev"
- source: hosted
- version: "1.2.1"
- http_parser:
- dependency: transitive
- description:
- name: http_parser
- sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
- url: "https://pub.dev"
- source: hosted
- version: "4.0.2"
- image:
- dependency: transitive
- description:
- name: image
- sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e"
- url: "https://pub.dev"
- source: hosted
- version: "4.1.7"
- json_annotation:
- dependency: transitive
- description:
- name: json_annotation
- sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
- url: "https://pub.dev"
- source: hosted
- version: "4.9.0"
- leak_tracker:
- dependency: transitive
- description:
- name: leak_tracker
- sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
- url: "https://pub.dev"
- source: hosted
- version: "10.0.4"
- leak_tracker_flutter_testing:
- dependency: transitive
- description:
- name: leak_tracker_flutter_testing
- sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
- url: "https://pub.dev"
- source: hosted
- version: "3.0.3"
- leak_tracker_testing:
- dependency: transitive
- description:
- name: leak_tracker_testing
- sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
- url: "https://pub.dev"
- source: hosted
- version: "3.0.1"
- lints:
- dependency: transitive
- description:
- name: lints
- sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
- url: "https://pub.dev"
- source: hosted
- version: "3.0.0"
- localstorage:
- dependency: transitive
- description:
- name: localstorage
- sha256: "6340acefdd3a969cceb044a69cde2dc5877c5b861b2e02d0803930ed483dbe91"
- url: "https://pub.dev"
- source: hosted
- version: "5.0.0"
- logging:
- dependency: transitive
- description:
- name: logging
- sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
- url: "https://pub.dev"
- source: hosted
- version: "1.2.0"
- markdown_viewer:
- dependency: transitive
- description:
- name: markdown_viewer
- sha256: e819ea779eaeca933bb38228e02888ad72409aba922efb2e65abb2f8b046dc8e
- url: "https://pub.dev"
- source: hosted
- version: "0.6.2"
- matcher:
- dependency: transitive
- description:
- name: matcher
- sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
- url: "https://pub.dev"
- source: hosted
- version: "0.12.16+1"
- material_color_utilities:
- dependency: transitive
- description:
- name: material_color_utilities
- sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
- url: "https://pub.dev"
- source: hosted
- version: "0.8.0"
- meta:
- dependency: transitive
- description:
- name: meta
- sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
- url: "https://pub.dev"
- source: hosted
- version: "1.12.0"
- mix:
- dependency: "direct overridden"
- description:
- path: "../../mix/packages/mix"
- relative: true
- source: path
- version: "1.3.0"
- mix_annotations:
- dependency: transitive
- description:
- name: mix_annotations
- sha256: ecad51935d9c422481ebc820e8d3edac001bfd8493ac3cf44d03c43cee196d7a
- url: "https://pub.dev"
- source: hosted
- version: "0.2.0+1"
- mix_generator:
- dependency: "direct overridden"
- description:
- path: "../../mix/packages/mix_generator"
- relative: true
- source: path
- version: "0.2.1"
- octo_image:
- dependency: transitive
- description:
- name: octo_image
- sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d"
- url: "https://pub.dev"
- source: hosted
- version: "2.0.0"
- package_config:
- dependency: transitive
- description:
- name: package_config
- sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
- url: "https://pub.dev"
- source: hosted
- version: "2.1.0"
- path:
- dependency: transitive
- description:
- name: path
- sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
- url: "https://pub.dev"
- source: hosted
- version: "1.9.0"
- path_parsing:
- dependency: transitive
- description:
- name: path_parsing
- sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf
- url: "https://pub.dev"
- source: hosted
- version: "1.0.1"
- path_provider:
- dependency: transitive
- description:
- name: path_provider
- sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161
- url: "https://pub.dev"
- source: hosted
- version: "2.1.3"
- path_provider_android:
- dependency: transitive
- description:
- name: path_provider_android
- sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d
- url: "https://pub.dev"
- source: hosted
- version: "2.2.4"
- path_provider_foundation:
- dependency: transitive
- description:
- name: path_provider_foundation
- sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f"
- url: "https://pub.dev"
- source: hosted
- version: "2.3.2"
- path_provider_linux:
- dependency: transitive
- description:
- name: path_provider_linux
- sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
- url: "https://pub.dev"
- source: hosted
- version: "2.2.1"
- path_provider_platform_interface:
- dependency: transitive
- description:
- name: path_provider_platform_interface
- sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
- url: "https://pub.dev"
- source: hosted
- version: "2.1.2"
- path_provider_windows:
- dependency: transitive
- description:
- name: path_provider_windows
- sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
- url: "https://pub.dev"
- source: hosted
- version: "2.2.1"
- pdf:
- dependency: transitive
- description:
- name: pdf
- sha256: "243f05342fc0bdf140eba5b069398985cdbdd3dbb1d776cf43d5ea29cc570ba6"
- url: "https://pub.dev"
- source: hosted
- version: "3.10.8"
- petitparser:
- dependency: transitive
- description:
- name: petitparser
- sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27
- url: "https://pub.dev"
- source: hosted
- version: "6.0.2"
- platform:
- dependency: transitive
- description:
- name: platform
- sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
- url: "https://pub.dev"
- source: hosted
- version: "3.1.4"
- plugin_platform_interface:
- dependency: transitive
- description:
- name: plugin_platform_interface
- sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
- url: "https://pub.dev"
- source: hosted
- version: "2.1.8"
- pub_semver:
- dependency: transitive
- description:
- name: pub_semver
- sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
- url: "https://pub.dev"
- source: hosted
- version: "2.1.4"
- pubspec_parse:
- dependency: transitive
- description:
- name: pubspec_parse
- sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8
- url: "https://pub.dev"
- source: hosted
- version: "1.3.0"
- qr:
- dependency: transitive
- description:
- name: qr
- sha256: "64957a3930367bf97cc211a5af99551d630f2f4625e38af10edd6b19131b64b3"
- url: "https://pub.dev"
- source: hosted
- version: "3.0.1"
- recase:
- dependency: transitive
- description:
- name: recase
- sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213
- url: "https://pub.dev"
- source: hosted
- version: "4.1.0"
- rxdart:
- dependency: transitive
- description:
- name: rxdart
- sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb"
- url: "https://pub.dev"
- source: hosted
- version: "0.27.7"
- screen_retriever:
- dependency: transitive
- description:
- name: screen_retriever
- sha256: "6ee02c8a1158e6dae7ca430da79436e3b1c9563c8cf02f524af997c201ac2b90"
- url: "https://pub.dev"
- source: hosted
- version: "0.1.9"
- scrollable_positioned_list:
- dependency: transitive
- description:
- name: scrollable_positioned_list
- sha256: "1b54d5f1329a1e263269abc9e2543d90806131aa14fe7c6062a8054d57249287"
- url: "https://pub.dev"
- source: hosted
- version: "0.3.8"
- signals:
- dependency: transitive
- description:
- name: signals
- sha256: "94927d4069a158a6a20ad98990e6c67faeeed4ae6af681c1696fb98f3fbd5d2e"
- url: "https://pub.dev"
- source: hosted
- version: "5.2.2"
- signals_core:
- dependency: transitive
- description:
- name: signals_core
- sha256: e5888685b9a3cff7c9814bd433195b1f76d0bfa3eae135e0a2f4ff5c48a56a1c
- url: "https://pub.dev"
- source: hosted
- version: "5.2.2"
- signals_flutter:
- dependency: transitive
- description:
- name: signals_flutter
- sha256: "1c202bc5136fbe1d8d71b66202e8f71bc10b957ca678c1f44d0d3af2aeb678cc"
- url: "https://pub.dev"
- source: hosted
- version: "5.2.2"
- sky_engine:
- dependency: transitive
- description: flutter
- source: sdk
- version: "0.0.99"
- source_gen:
- dependency: transitive
- description:
- name: source_gen
- sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832"
- url: "https://pub.dev"
- source: hosted
- version: "1.5.0"
- source_span:
- dependency: transitive
- description:
- name: source_span
- sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
- url: "https://pub.dev"
- source: hosted
- version: "1.10.0"
- sprintf:
- dependency: transitive
- description:
- name: sprintf
- sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23"
- url: "https://pub.dev"
- source: hosted
- version: "7.0.0"
- sqflite:
- dependency: transitive
- description:
- name: sqflite
- sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d
- url: "https://pub.dev"
- source: hosted
- version: "2.3.3+1"
- sqflite_common:
- dependency: transitive
- description:
- name: sqflite_common
- sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4"
- url: "https://pub.dev"
- source: hosted
- version: "2.5.4"
- stack_trace:
- dependency: transitive
- description:
- name: stack_trace
- sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
- url: "https://pub.dev"
- source: hosted
- version: "1.11.1"
- stream_channel:
- dependency: transitive
- description:
- name: stream_channel
- sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
- url: "https://pub.dev"
- source: hosted
- version: "2.1.2"
- string_scanner:
- dependency: transitive
- description:
- name: string_scanner
- sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
- url: "https://pub.dev"
- source: hosted
- version: "1.2.0"
- superdeck:
- dependency: "direct main"
- description:
- path: ".."
- relative: true
- source: path
- version: "0.0.4"
- synchronized:
- dependency: transitive
- description:
- name: synchronized
- sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558"
- url: "https://pub.dev"
- source: hosted
- version: "3.1.0+1"
- syntax_highlight:
- dependency: transitive
- description:
- name: syntax_highlight
- sha256: ee33b6aa82cc722bb9b40152a792181dee222353b486c0255fde666a3e3a4997
- url: "https://pub.dev"
- source: hosted
- version: "0.4.0"
- term_glyph:
- dependency: transitive
- description:
- name: term_glyph
- sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
- url: "https://pub.dev"
- source: hosted
- version: "1.2.1"
- test_api:
- dependency: transitive
- description:
- name: test_api
- sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
- url: "https://pub.dev"
- source: hosted
- version: "0.7.0"
- type_plus:
- dependency: transitive
- description:
- name: type_plus
- sha256: d5d1019471f0d38b91603adb9b5fd4ce7ab903c879d2fbf1a3f80a630a03fcc9
- url: "https://pub.dev"
- source: hosted
- version: "2.1.1"
- typed_data:
- dependency: transitive
- description:
- name: typed_data
- sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
- url: "https://pub.dev"
- source: hosted
- version: "1.3.2"
- universal_html:
- dependency: transitive
- description:
- name: universal_html
- sha256: "56536254004e24d9d8cfdb7dbbf09b74cf8df96729f38a2f5c238163e3d58971"
- url: "https://pub.dev"
- source: hosted
- version: "2.2.4"
- universal_io:
- dependency: transitive
- description:
- name: universal_io
- sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad"
- url: "https://pub.dev"
- source: hosted
- version: "2.2.2"
- url_launcher:
- dependency: transitive
- description:
- name: url_launcher
- sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e"
- url: "https://pub.dev"
- source: hosted
- version: "6.2.6"
- url_launcher_android:
- dependency: transitive
- description:
- name: url_launcher_android
- sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775"
- url: "https://pub.dev"
- source: hosted
- version: "6.3.1"
- url_launcher_ios:
- dependency: transitive
- description:
- name: url_launcher_ios
- sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5"
- url: "https://pub.dev"
- source: hosted
- version: "6.2.5"
- url_launcher_linux:
- dependency: transitive
- description:
- name: url_launcher_linux
- sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811
- url: "https://pub.dev"
- source: hosted
- version: "3.1.1"
- url_launcher_macos:
- dependency: transitive
- description:
- name: url_launcher_macos
- sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234
- url: "https://pub.dev"
- source: hosted
- version: "3.1.0"
- url_launcher_platform_interface:
- dependency: transitive
- description:
- name: url_launcher_platform_interface
- sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
- url: "https://pub.dev"
- source: hosted
- version: "2.3.2"
- url_launcher_web:
- dependency: transitive
- description:
- name: url_launcher_web
- sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a"
- url: "https://pub.dev"
- source: hosted
- version: "2.3.1"
- url_launcher_windows:
- dependency: transitive
- description:
- name: url_launcher_windows
- sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7
- url: "https://pub.dev"
- source: hosted
- version: "3.1.1"
- uuid:
- dependency: transitive
- description:
- name: uuid
- sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8"
- url: "https://pub.dev"
- source: hosted
- version: "4.4.0"
- vector_math:
- dependency: transitive
- description:
- name: vector_math
- sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
- url: "https://pub.dev"
- source: hosted
- version: "2.1.4"
- vm_service:
- dependency: transitive
- description:
- name: vm_service
- sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
- url: "https://pub.dev"
- source: hosted
- version: "14.2.1"
- watcher:
- dependency: transitive
- description:
- name: watcher
- sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
- url: "https://pub.dev"
- source: hosted
- version: "1.1.0"
- web:
- dependency: transitive
- description:
- name: web
- sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
- url: "https://pub.dev"
- source: hosted
- version: "0.5.1"
- win32:
- dependency: transitive
- description:
- name: win32
- sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb"
- url: "https://pub.dev"
- source: hosted
- version: "5.5.0"
- window_manager:
- dependency: transitive
- description:
- name: window_manager
- sha256: "8699323b30da4cdbe2aa2e7c9de567a6abd8a97d9a5c850a3c86dcd0b34bbfbf"
- url: "https://pub.dev"
- source: hosted
- version: "0.3.9"
- xdg_directories:
- dependency: transitive
- description:
- name: xdg_directories
- sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
- url: "https://pub.dev"
- source: hosted
- version: "1.0.4"
- xml:
- dependency: transitive
- description:
- name: xml
- sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
- url: "https://pub.dev"
- source: hosted
- version: "6.5.0"
- yaml:
- dependency: transitive
- description:
- name: yaml
- sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
- url: "https://pub.dev"
- source: hosted
- version: "3.1.2"
-sdks:
- dart: ">=3.3.0 <4.0.0"
- flutter: ">=3.19.0"
diff --git a/example/pubspec_overrides.yaml b/example/pubspec_overrides.yaml
deleted file mode 100644
index e9e5b6a3..00000000
--- a/example/pubspec_overrides.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-dependency_overrides:
- mix_generator:
- path: ../../mix/packages/mix_generator
- mix:
- path: ../../mix/packages/mix
\ No newline at end of file
diff --git a/example/superdeck/assets.json b/example/superdeck/assets.json
deleted file mode 100644
index 2068adb0..00000000
--- a/example/superdeck/assets.json
+++ /dev/null
@@ -1 +0,0 @@
-[{"file":"superdeck/generated/thumb_K0akgdDR.png","dimensions":{"width":512.0,"height":288.0}},{"file":"superdeck/generated/thumb_aShu2Vm6.png","dimensions":{"width":512.0,"height":288.0}},{"file":"superdeck/generated/thumb_SwkEymrr.png","dimensions":{"width":512.0,"height":288.0}},{"file":"superdeck/generated/thumb_2oTGEbqt.png","dimensions":{"width":512.0,"height":288.0}},{"file":"superdeck/generated/thumb_rM1XbfdO.png","dimensions":{"width":512.0,"height":288.0}},{"file":"superdeck/generated/thumb_bt3HCjyv.png","dimensions":{"width":512.0,"height":288.0}},{"file":"superdeck/generated/thumb_zXfqPfVD.png","dimensions":{"width":512.0,"height":288.0}},{"file":"superdeck/generated/thumb_qH3zHQwf.png","dimensions":{"width":512.0,"height":288.0}},{"file":"superdeck/generated/thumb_dBrctVs2.png","dimensions":{"width":512.0,"height":288.0}},{"file":"superdeck/generated/mermaid_wRACwsNb.png","dimensions":{"width":600.0,"height":860.0}},{"file":"superdeck/generated/thumb_Bp7o6RCC.png","dimensions":{"width":512.0,"height":288.0}},{"file":"superdeck/generated/thumb_IrZnYqye.png","dimensions":{"width":512.0,"height":288.0}}]
\ No newline at end of file
diff --git a/example/superdeck/config.json b/example/superdeck/config.json
deleted file mode 100644
index 9e26dfee..00000000
--- a/example/superdeck/config.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/example/superdeck/generated/mermaid_wRACwsNb.png b/example/superdeck/generated/mermaid_wRACwsNb.png
deleted file mode 100644
index 2e8a0cc8..00000000
Binary files a/example/superdeck/generated/mermaid_wRACwsNb.png and /dev/null differ
diff --git a/example/superdeck/generated/thumb_2oTGEbqt.png b/example/superdeck/generated/thumb_2oTGEbqt.png
deleted file mode 100644
index f5df3510..00000000
Binary files a/example/superdeck/generated/thumb_2oTGEbqt.png and /dev/null differ
diff --git a/example/superdeck/generated/thumb_Bp7o6RCC.png b/example/superdeck/generated/thumb_Bp7o6RCC.png
deleted file mode 100644
index 2a40ee3a..00000000
Binary files a/example/superdeck/generated/thumb_Bp7o6RCC.png and /dev/null differ
diff --git a/example/superdeck/generated/thumb_IrZnYqye.png b/example/superdeck/generated/thumb_IrZnYqye.png
deleted file mode 100644
index 0ae204a4..00000000
Binary files a/example/superdeck/generated/thumb_IrZnYqye.png and /dev/null differ
diff --git a/example/superdeck/generated/thumb_K0akgdDR.png b/example/superdeck/generated/thumb_K0akgdDR.png
deleted file mode 100644
index 559eb0b5..00000000
Binary files a/example/superdeck/generated/thumb_K0akgdDR.png and /dev/null differ
diff --git a/example/superdeck/generated/thumb_SwkEymrr.png b/example/superdeck/generated/thumb_SwkEymrr.png
deleted file mode 100644
index abaada82..00000000
Binary files a/example/superdeck/generated/thumb_SwkEymrr.png and /dev/null differ
diff --git a/example/superdeck/generated/thumb_aShu2Vm6.png b/example/superdeck/generated/thumb_aShu2Vm6.png
deleted file mode 100644
index d9993ed4..00000000
Binary files a/example/superdeck/generated/thumb_aShu2Vm6.png and /dev/null differ
diff --git a/example/superdeck/generated/thumb_bt3HCjyv.png b/example/superdeck/generated/thumb_bt3HCjyv.png
deleted file mode 100644
index e0d3bce3..00000000
Binary files a/example/superdeck/generated/thumb_bt3HCjyv.png and /dev/null differ
diff --git a/example/superdeck/generated/thumb_dBrctVs2.png b/example/superdeck/generated/thumb_dBrctVs2.png
deleted file mode 100644
index 3e4bef61..00000000
Binary files a/example/superdeck/generated/thumb_dBrctVs2.png and /dev/null differ
diff --git a/example/superdeck/generated/thumb_qH3zHQwf.png b/example/superdeck/generated/thumb_qH3zHQwf.png
deleted file mode 100644
index 0e1aab1d..00000000
Binary files a/example/superdeck/generated/thumb_qH3zHQwf.png and /dev/null differ
diff --git a/example/superdeck/generated/thumb_rM1XbfdO.png b/example/superdeck/generated/thumb_rM1XbfdO.png
deleted file mode 100644
index 91c2d14d..00000000
Binary files a/example/superdeck/generated/thumb_rM1XbfdO.png and /dev/null differ
diff --git a/example/superdeck/generated/thumb_zXfqPfVD.png b/example/superdeck/generated/thumb_zXfqPfVD.png
deleted file mode 100644
index c32bee57..00000000
Binary files a/example/superdeck/generated/thumb_zXfqPfVD.png and /dev/null differ
diff --git a/example/superdeck/slides.json b/example/superdeck/slides.json
deleted file mode 100644
index aaa41a35..00000000
--- a/example/superdeck/slides.json
+++ /dev/null
@@ -1 +0,0 @@
-[{"style":"quote","content":{"flex":1,"alignment":"bottom_right"},"data":"> Create your Flutter presentations faster and easier than ever.\n> You can quote me on that\n> ### Leo Farias","options":{"src":"https://source.unsplash.com/people-watching-concert-during-night-time-blgOFmPIlr0","fit":"cover","flex":1,"position":"right"},"raw":"---\nstyle: quote\nlayout: image\noptions:\n src: https://source.unsplash.com/people-watching-concert-during-night-time-blgOFmPIlr0\n fit: cover\ncontent:\n alignment: bottom_right\n---\n\n> Create your Flutter presentations faster and easier than ever.\n> You can quote me on that\n> ### Leo Farias","type":"Slide","layout":"image"},{"background":"https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExZGt1MnQ5N2k3cXVma24wb3V5cThlZ3ExY2NvY3czcmozang0bGQ1ZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/XzWd8acQ37byKR4tmd/giphy.gif","style":"cover","raw":"---\nbackground: https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExZGt1MnQ5N2k3cXVma24wb3V5cThlZ3ExY2NvY3czcmozang0bGQ1ZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/XzWd8acQ37byKR4tmd/giphy.gif\nstyle: cover\n---\n\n# Complex layout","data":"# Complex layout","type":"Slide"},{"style":"show_sections","data":"## Image Layout\n\nCreate beautiful slides with images that fit your content.\n\n##### Options\n```yaml\noptions:\n src: https//www.url.com/image.jpg\n fit: cover\n position: left\n flex: 1\n```\n\n> Define position fit and flex options for the image.","options":{"src":"https://source.unsplash.com/random/900×700/?waves","fit":"cover","flex":1,"position":"left"},"raw":"---\nlayout: image\nstyle: show_sections\noptions:\n src: https://source.unsplash.com/random/900×700/?waves\n fit: cover\n position: left\n flex: 1\n---\n\n## Image Layout\n\nCreate beautiful slides with images that fit your content.\n\n##### Options\n```yaml\noptions:\n src: https//www.url.com/image.jpg\n fit: cover\n position: left\n flex: 1\n```\n\n> Define position fit and flex options for the image.","type":"Slide","layout":"image"},{"style":"show_sections","data":"::left::\n\n# Two Column\n\nThis is a two-column layout. You can use it to compare two different concepts or ideas.\n\n::right::\n\n### Section Options\n\nEasily customize the content of each section to suit your needs.\n\nUse front matter to define the layout of each section\n\n\n```yaml\nsections:\n left:\n flex: 2\n right:\n alignment: bottom_left\n```","sections":{"left":{"flex":2,"alignment":"center_left"},"right":{"flex":1,"alignment":"bottom_left"}},"raw":"---\nlayout: two_column\nstyle: show_sections\nsections:\n left:\n flex: 2\n right:\n alignment: bottom_left\n---\n\n::left::\n\n# Two Column\n\nThis is a two-column layout. You can use it to compare two different concepts or ideas.\n\n::right::\n\n### Section Options\n\nEasily customize the content of each section to suit your needs.\n\nUse front matter to define the layout of each section\n\n\n```yaml\nsections:\n left:\n flex: 2\n right:\n alignment: bottom_left\n```","type":"Slide","layout":"two_column"},{"content":{"flex":2,"alignment":"center"},"style":"show_sections","data":"# Two Column + Header\n\n\n::left::\n\n### Left Section\nEasily customize the content of each section to suit your needs.\n\nUse front matter to define the layout of each section\n::right::\n\n#### Section Options\n\n```yaml\nsections:\n left:\n alignment: bottom_right\n flex: 2\n right:\n alignment: bottom_left\n header:\n alignment: bottom_left\n```","sections":{"left":{"flex":2,"alignment":"center_left"},"right":{"flex":1,"alignment":"bottom_left"},"header":{"flex":1,"alignment":"bottom_left"}},"raw":"---\nlayout: two_column_header\ncontent:\n alignment: center\n flex: 2\nsections:\n left:\n flex: 2\n right:\n alignment: bottom_left\n header:\n alignment: bottom_left\nstyle: show_sections\n---\n\n# Two Column + Header\n\n\n::left::\n\n### Left Section\nEasily customize the content of each section to suit your needs.\n\nUse front matter to define the layout of each section\n::right::\n\n#### Section Options\n\n```yaml\nsections:\n left:\n alignment: bottom_right\n flex: 2\n right:\n alignment: bottom_left\n header:\n alignment: bottom_left\n```","type":"Slide","layout":"two_column_header"},{"content":{"flex":1,"alignment":"center"},"style":"rad","data":"# Mix\n\nIntegration with Mix gives you complete control over all styling elements in your slides with a simple and intuitive API.\n\n::right::\n\n```dart\nVariantAttribute get radStyle {\n return const SlideVariant('rad')(\n $.h1.textStyle.as(GoogleFonts.poppins()),\n $.h1.textStyle.fontSize(140),\n $.code.decoration.border.all(\n color: Colors.red,\n width: 3,\n ),\n $.code.decoration(\n color: Colors.black54,\n ),\n $.code.padding.all(40),\n\n $.outerContainer.margin.all(60),\n\n $.innerContainer.borderRadius(25),\n $.innerContainer.shadow(\n blurRadius: 0,\n spreadRadius: 10,\n color: Colors.red.withOpacity(1),\n ),\n $.innerContainer.gradient.radial(\n stops: [0.0, 1.0],\n radius: 0.7,\n colors: [Colors.purple, Colors.deepPurple],\n ),\n\n // Events\n onMouseHover((event) {\n final position = event.position;\n final dx = position.x * 10;\n final dy = position.y * 10;\n\n return Style(\n $.innerContainer.transform(_transformMatrix(position)),\n $.innerContainer.shadow.offset(dx, dy),\n $.innerContainer.gradient.radial(\n center: position,\n ),\n );\n }),\n\n (onPressed | onLongPressed)(\n $.innerContainer.shadow(\n blurRadius: 5,\n spreadRadius: 1,\n offset: Offset.zero,\n color: Colors.purpleAccent,\n ),\n $.innerContainer.border.all(color: Colors.white, width: 1),\n $.innerContainer.gradient.radial\n .colors([Colors.purpleAccent, Colors.purpleAccent]),\n ),\n );\n}\n```","sections":{"left":null,"right":{"flex":2,"alignment":"bottom_left"}},"raw":"---\nstyle: rad\nlayout: two_column\ncontent:\n alignment: center\nsections:\n left:\n right:\n alignment: bottom_left\n flex: 2\n---\n\n# Mix\n\nIntegration with Mix gives you complete control over all styling elements in your slides with a simple and intuitive API.\n\n::right::\n\n```dart\nVariantAttribute get radStyle {\n return const SlideVariant('rad')(\n $.h1.textStyle.as(GoogleFonts.poppins()),\n $.h1.textStyle.fontSize(140),\n $.code.decoration.border.all(\n color: Colors.red,\n width: 3,\n ),\n $.code.decoration(\n color: Colors.black54,\n ),\n $.code.padding.all(40),\n\n $.outerContainer.margin.all(60),\n\n $.innerContainer.borderRadius(25),\n $.innerContainer.shadow(\n blurRadius: 0,\n spreadRadius: 10,\n color: Colors.red.withOpacity(1),\n ),\n $.innerContainer.gradient.radial(\n stops: [0.0, 1.0],\n radius: 0.7,\n colors: [Colors.purple, Colors.deepPurple],\n ),\n\n // Events\n onMouseHover((event) {\n final position = event.position;\n final dx = position.x * 10;\n final dy = position.y * 10;\n\n return Style(\n $.innerContainer.transform(_transformMatrix(position)),\n $.innerContainer.shadow.offset(dx, dy),\n $.innerContainer.gradient.radial(\n center: position,\n ),\n );\n }),\n\n (onPressed | onLongPressed)(\n $.innerContainer.shadow(\n blurRadius: 5,\n spreadRadius: 1,\n offset: Offset.zero,\n color: Colors.purpleAccent,\n ),\n $.innerContainer.border.all(color: Colors.white, width: 1),\n $.innerContainer.gradient.radial\n .colors([Colors.purpleAccent, Colors.purpleAccent]),\n ),\n );\n}\n```","type":"Slide","layout":"two_column"},{"background":"https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExeGswdWJvY2oxazJoY3g2Y2poNHBvZXlpYmd5YTg0Z2g0ODRrbng4MyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/oB6KlAvOuaLtxYy8l4/giphy.gif","style":"cover","raw":"---\nstyle: cover\nbackground: https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExeGswdWJvY2oxazJoY3g2Y2poNHBvZXlpYmd5YTg0Z2g0ODRrbng4MyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/oB6KlAvOuaLtxYy8l4/giphy.gif\n---\n\n# Markdown support","data":"# Markdown support","type":"Slide"},{"content":{"flex":4,"alignment":"center_left"},"style":"show_sections","data":"::left::\n\n\n**Bold Text**\n\n*Italic Text*\n\n~~Strikethrough~~\n\n`Inline Code`\n\n[Link here](https://github.com/leoafarias/superdeck)\n\n::right::\n\nLists\n\n1. Ordered list item 1\n2. Ordered list item 2\n\n- Unordered list item 1\n- Unordered list item 2\n\nQuotes\n\n> If you want to go fast, go alone. \n> If you want to go far, go together.\n> ### African Proverb","sections":{},"raw":"---\nstyle: show_sections\nlayout: two_column\nsections:\ncontent:\n flex: 4\n---\n\n::left::\n\n\n**Bold Text**\n\n*Italic Text*\n\n~~Strikethrough~~\n\n`Inline Code`\n\n[Link here](https://github.com/leoafarias/superdeck)\n\n::right::\n\nLists\n\n1. Ordered list item 1\n2. Ordered list item 2\n\n- Unordered list item 1\n- Unordered list item 2\n\nQuotes\n\n> If you want to go fast, go alone. \n> If you want to go far, go together.\n> ### African Proverb","type":"Slide","layout":"two_column"},{"data":"::left::\n\n\nCode\n```dart\nint factorial(int n) {\n return n == 0 ? 1 : n * factorial(n - 1);\n}\n```\n\nTasks\n- [ ] Item 1\n- [x] Item 2\n\nSubtasks\n\n- [x] Item 1\n - [ ] Subitem 1\n\n::right::\n\nImages\n![Unsplash Image](https://source.unsplash.com/random/300x200/?landscape)\n\n\nTable\n\n| Header 1 | Header 2 |\n|----------|----------|\n| Cell 1A | Cell 1B |\n| Cell 2A | Cell 2B |\n\nDivider\n\n___","sections":{},"raw":"---\nlayout: two_column\n---\n\n::left::\n\n\nCode\n```dart\nint factorial(int n) {\n return n == 0 ? 1 : n * factorial(n - 1);\n}\n```\n\nTasks\n- [ ] Item 1\n- [x] Item 2\n\nSubtasks\n\n- [x] Item 1\n - [ ] Subitem 1\n\n::right::\n\nImages\n![Unsplash Image](https://source.unsplash.com/random/300x200/?landscape)\n\n\nTable\n\n| Header 1 | Header 2 |\n|----------|----------|\n| Cell 1A | Cell 1B |\n| Cell 2A | Cell 2B |\n\nDivider\n\n___","type":"Slide","layout":"two_column"},{"title":"Mermaid example","data":"::left::\n\n![Mermaid Diagram](superdeck/generated/mermaid_wRACwsNb.png)\n \n\n::right::\n\n## Mermaid Support\n\nSuperdeck allows you to use Mermaid diagrams in your slides. It automatically converts the code into a visual representation.","sections":{},"raw":"---\ntitle: \"Mermaid example\"\nlayout: two_column\n---\n\n::left::\n\n```mermaid\nflowchart TD\n A[This is crazy] -->|Get money| B(Go shopping)\n B --> C{Let me car}\n C -->|One| D[Laptop]\n C -->|Two| E[iPhone]\n C -->|Three| F[fa:fa-car Car]\n```\n \n\n::right::\n\n## Mermaid Support\n\nSuperdeck allows you to use Mermaid diagrams in your slides. It automatically converts the code into a visual representation.","type":"Slide","layout":"two_column"},{"options":{"name":"demo","args":{"text":"Hello, Superdeck!","height":200.0,"width":300.0},"flex":1,"position":"right"},"data":"## Showcase your widgets","raw":"---\nlayout: widget\noptions:\n name: demo\n args:\n text: Hello, Superdeck!\n height: 200.0\n width: 300.0\n---\n\n## Showcase your widgets\n","type":"Slide","layout":"widget"}]
\ No newline at end of file
diff --git a/example/web/index.html b/example/web/index.html
deleted file mode 100644
index 4b6ba3fd..00000000
--- a/example/web/index.html
+++ /dev/null
@@ -1,95 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Presentation
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/example/web/manifest.json b/example/web/manifest.json
deleted file mode 100644
index c325d4ec..00000000
--- a/example/web/manifest.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "name": "superdeck_demo",
- "short_name": "superdeck_demo",
- "start_url": ".",
- "display": "standalone",
- "background_color": "#0175C2",
- "theme_color": "#0175C2",
- "description": "A new Flutter project.",
- "orientation": "portrait-primary",
- "prefer_related_applications": false,
- "icons": [
- {
- "src": "icons/Icon-192.png",
- "sizes": "192x192",
- "type": "image/png"
- },
- {
- "src": "icons/Icon-512.png",
- "sizes": "512x512",
- "type": "image/png"
- },
- {
- "src": "icons/Icon-maskable-192.png",
- "sizes": "192x192",
- "type": "image/png",
- "purpose": "maskable"
- },
- {
- "src": "icons/Icon-maskable-512.png",
- "sizes": "512x512",
- "type": "image/png",
- "purpose": "maskable"
- }
- ]
-}
diff --git a/lib/builder/slide_parser.dart b/lib/builder/slide_parser.dart
deleted file mode 100644
index e4b18ad9..00000000
--- a/lib/builder/slide_parser.dart
+++ /dev/null
@@ -1,78 +0,0 @@
-import '../helpers/config_model.dart';
-import '../helpers/deep_merge.dart';
-import '../helpers/utils.dart';
-import '../models/slide_model.dart';
-
-class SlideParser {
- final SDConfig config;
-
- SlideParser({required this.config});
-
- final _frontMatterRegex = RegExp(r'---([\s\S]*?)---');
-
- List _splitSlides(String content) {
- final lines = content.split('\n');
- final slides = [];
- final buffer = StringBuffer();
- bool inSlide = false;
-
- var isCodeBlock = false;
-
- for (var line in lines) {
- if (line.trim().startsWith('```')) {
- isCodeBlock = !isCodeBlock;
- }
- if (line.trim() == '---' && !isCodeBlock) {
- if (buffer.isNotEmpty) {
- if (inSlide) {
- // Add the slide content to the list of slides
- slides.add(buffer.toString().trim());
- inSlide = false;
- buffer.clear();
- } else {
- inSlide = true;
- }
- }
- buffer.writeln(line);
- } else {
- buffer.writeln(line);
- }
- }
-
- // Capture any remaining content as a slide
- if (buffer.isNotEmpty) {
- slides.add(buffer.toString());
- }
-
- return slides;
- }
-
- List run(String contents) {
- final slidesRaw = _splitSlides(contents.trim());
-
- final slides = [];
-
- for (final slideRaw in slidesRaw) {
- slides.add(_runEach(slideRaw));
- }
-
- return slides;
- }
-
- Slide _runEach(String slideRaw) {
- final frontMatter = _frontMatterRegex.firstMatch(slideRaw)?.group(1) ?? '';
-
- final options = converYamlToMap(frontMatter);
-
- final content = slideRaw
- .substring(_frontMatterRegex.matchAsPrefix(slideRaw)?.end ?? 0)
- .trim();
-
- final mergedOptions = deepMerge(
- config.toSlideMap(),
- {...options, 'raw': slideRaw, 'data': content},
- );
-
- return Slide.parse(mergedOptions);
- }
-}
diff --git a/lib/builder/slides_loader.dart b/lib/builder/slides_loader.dart
deleted file mode 100644
index 00a2f312..00000000
--- a/lib/builder/slides_loader.dart
+++ /dev/null
@@ -1,71 +0,0 @@
-import 'dart:async';
-import 'dart:developer';
-
-import 'package:watcher/watcher.dart';
-
-import '../helpers/constants.dart';
-import '../services/project_service.dart';
-import 'slide_parser.dart';
-import 'slides_pipeline.dart';
-
-class SlidesLoader {
- SlidesLoader._();
-
- static final instance = SlidesLoader._();
-
- StreamSubscription? _listenerSub;
- final _projectService = ProjectService.instance;
-
- Future _generate() async {
- log('Generating slides...');
- await _projectService.ensureExists();
-
- final presentationRaw = await _projectService.loadMarkdown();
- final deck = await _projectService.loadDeck();
- final files = await _projectService.loadGeneratedFiles();
-
- final slideParser = SlideParser(config: deck.config);
-
- final slides = slideParser.run(presentationRaw);
-
- final pipeline = SlidesPipeline(
- [
- // const ImageCachingTask(),
- const MermaidConverterTask(),
- const SlideThumbnailTask(),
- ],
- );
-
- final result = await pipeline.run(slides, files);
-
- for (var file in files) {
- if (!result.neededAssets.any((element) => element.path == file.path)) {
- if (await file.exists()) {
- await file.delete();
- }
- }
- }
-
- await Future.wait([
- _projectService.saveConfigRef(deck.config),
- _projectService.saveSlidesRef(result.slides),
- _projectService.saveAssetsRef(result.neededAssets),
- ]);
- }
-
- void listen(
- FutureOr Function() onChange,
- ) {
- // _listenerSub?.cancel();
-
- _listenerSub = _projectService.watcher.events.listen((_) => onChange());
- }
-
- Future loadDeck() async {
- if (kCanRunProcess) {
- await _generate();
- }
-
- return _projectService.loadDeck();
- }
-}
diff --git a/lib/builder/slides_pipeline.dart b/lib/builder/slides_pipeline.dart
deleted file mode 100644
index a9869493..00000000
--- a/lib/builder/slides_pipeline.dart
+++ /dev/null
@@ -1,256 +0,0 @@
-import 'dart:async';
-import 'dart:developer';
-import 'dart:io';
-import 'dart:ui' as ui;
-
-import 'package:flutter/foundation.dart';
-
-import '../services/mermaid_service.dart';
-import '../services/project_service.dart';
-import '../superdeck.dart';
-
-final _mermaidBlockRegex = RegExp(r'```mermaid([\s\S]*?)```');
-
-class PipelineAsset {
- final File asset;
- final Uint8List data;
-
- PipelineAsset({
- required this.asset,
- required this.data,
- });
-}
-
-typedef PipelineResult = ({
- List slides,
- List neededAssets,
-});
-
-class TaskController {
- final Slide slide;
- final List _assets;
-
- TaskController({
- required this.slide,
- required List assets,
- }) : _assets = assets;
-
- List neededAssets = [];
-
- TaskController copyWith({
- Slide? slide,
- List? assets,
- }) {
- return TaskController(
- slide: slide ?? this.slide,
- assets: assets ?? _assets,
- )..neededAssets = neededAssets;
- }
-
- void markNeeded(File asset) {
- neededAssets.add(asset);
- }
-}
-
-class SlidesPipeline {
- final List processors;
-
- SlidesPipeline(this.processors);
-
- Future run(
- List slides,
- List assets,
- ) async {
- final futures = >[];
-
- Future runEachSlide(Slide slide) async {
- var controller = TaskController(slide: slide, assets: assets);
- for (var task in processors) {
- controller = await task.run(controller);
- }
- return controller;
- }
-
- for (var slide in slides) {
- futures.add(runEachSlide(slide));
- }
-
- final controllers = await Future.wait(futures);
-
- final result = (
- slides: controllers.map((e) => e.slide).toList(),
- neededAssets: controllers.expand((e) => e.neededAssets).toList(),
- );
-
- return result;
- }
-}
-
-abstract class Task {
- const Task();
-
- FutureOr run(
- TaskController controller,
- );
-}
-
-class SlideThumbnailTask extends Task {
- const SlideThumbnailTask();
-
- @override
- FutureOr run(controller) async {
- final file = SlideAsset.thumbnail(controller.slide);
-
- if (await file.exists()) {
- controller.markNeeded(file);
- }
-
- return controller;
- }
-}
-
-class MermaidConverterTask extends Task {
- const MermaidConverterTask();
-
- @override
- FutureOr run(controller) async {
- final slide = controller.slide;
-
- final matches = _mermaidBlockRegex.allMatches(slide.data);
-
- if (matches.isEmpty) return controller;
- final replacements = <({int start, int end, String markdown})>[];
-
- for (final Match match in matches) {
- final mermaidSyntax = match.group(1);
-
- if (mermaidSyntax == null) continue;
-
- final mermaidFile = SlideAsset.mermaid(mermaidSyntax);
-
- if (!await mermaidFile.exists()) {
- // Process the mermaid syntax to generate an image file
- final imageData = await mermaidService.generateImage(mermaidSyntax);
-
- if (imageData != null) {
- await mermaidFile.writeAsBytes(imageData);
- }
- }
-
- // If file existeed or was create it then replace it
- if (await mermaidFile.exists()) {
- controller.markNeeded(mermaidFile);
-
- replacements.add((
- start: match.start,
- end: match.end,
- markdown: '![Mermaid Diagram](${mermaidFile.path})',
- ));
- }
- }
-
- var replacedData = slide.data;
-
- // Apply replacements in reverse order
- for (var replacement in replacements.reversed) {
- final (
- :start,
- :end,
- :markdown,
- ) = replacement;
-
- replacedData = replacedData.replaceRange(start, end, markdown);
- }
-
- return controller.copyWith(
- slide: slide.copyWith(data: replacedData),
- );
- }
-}
-
-class ImageCachingTask extends Task {
- const ImageCachingTask();
-
- @override
- Future run(controller) async {
- final slide = controller.slide;
-
- var content = slide.data;
- // Do not cache remot edata if cacheRemoteAssets is false
-
- // Get any url of images that are in the markdown
- // Save it the local path on the device
- // and replace the url with the local path
- final imageRegex = RegExp(r'!\[.*?\]\((.*?)\)');
-
- final matches = imageRegex.allMatches(content);
-
- Future saveAsset(String url) async {
- if (ProjectService.instance.isAssetFile(File(url))) return;
- // Look by hashcode to see if the asset is already cached
-
- final file = SlideAsset.cached(url);
-
- if (await file.exists()) {
- controller.markNeeded(file);
- return;
- }
-
- final client = HttpClient();
- final request = await client.getUrl(Uri.parse(url));
- final response = await request.close();
-
- final contentType = response.headers.contentType;
- // Default to .jpg if no extension is found
- var assetData = await consolidateHttpClientResponseBytes(response);
- final extension = contentType?.subType ?? 'jpg';
-
- final fileType = AssetFileType.tryParse(extension);
-
- if (fileType == null) {
- log('Invalid file type: $extension');
- return;
- }
-
- final codec = await ui.instantiateImageCodec(assetData);
-
- if (codec.frameCount > 1) {
- // get half of the frame count
- final frameCount = codec.frameCount ~/ 2;
-
- for (var i = 0; i < frameCount; i++) {
- await codec.getNextFrame();
- }
- final frame = await codec.getNextFrame();
-
- final bytes =
- await frame.image.toByteData(format: ui.ImageByteFormat.png);
- assetData = bytes!.buffer.asUint8List();
- }
-
- await file.writeAsBytes(assetData);
-
- controller.markNeeded(file);
- }
-
- for (final Match match in matches) {
- final assetUri = match.group(1);
- if (assetUri == null) continue;
-
- await saveAsset(assetUri);
- }
-
- final background = slide.background;
-
- if (background != null) {
- await saveAsset(background);
- }
-
- if (slide is ImageSlide) {
- final imageSource = slide.options.src;
- await saveAsset(imageSource);
- }
-
- return controller;
- }
-}
diff --git a/lib/components/atoms/linear_progresss_indicator_widget.dart b/lib/components/atoms/linear_progresss_indicator_widget.dart
deleted file mode 100644
index 4f51ae78..00000000
--- a/lib/components/atoms/linear_progresss_indicator_widget.dart
+++ /dev/null
@@ -1,70 +0,0 @@
-import 'package:flutter/material.dart';
-
-class AnimatedLinearProgressIndicator extends StatefulWidget {
- final double progress;
-
- const AnimatedLinearProgressIndicator({
- super.key,
- required this.progress,
- });
-
- @override
- _AnimatedLinearProgressIndicatorState createState() =>
- _AnimatedLinearProgressIndicatorState();
-}
-
-class _AnimatedLinearProgressIndicatorState
- extends State
- with SingleTickerProviderStateMixin {
- late AnimationController _animationController;
- late Animation _animation;
-
- @override
- void initState() {
- super.initState();
- _animationController = AnimationController(
- vsync: this,
- duration: const Duration(milliseconds: 100),
- );
- _animation = Tween(begin: 0.0, end: widget.progress)
- .animate(_animationController);
- _animationController.forward();
- }
-
- @override
- void didUpdateWidget(covariant AnimatedLinearProgressIndicator oldWidget) {
- super.didUpdateWidget(oldWidget);
- if (widget.progress != oldWidget.progress) {
- _animation = Tween(
- begin: _animation.value,
- end: widget.progress,
- ).animate(_animationController);
-
- if (_animationController.isAnimating) {
- _animationController.forward();
- } else {
- _animationController.forward(from: 0.0);
- }
- }
- }
-
- @override
- void dispose() {
- _animationController.dispose();
- super.dispose();
- }
-
- @override
- Widget build(BuildContext context) {
- return AnimatedBuilder(
- animation: _animation,
- builder: (context, child) {
- return LinearProgressIndicator(
- minHeight: 10,
- borderRadius: BorderRadius.circular(10),
- value: _animation.value,
- );
- },
- );
- }
-}
diff --git a/lib/components/atoms/markdown_viewer.dart b/lib/components/atoms/markdown_viewer.dart
deleted file mode 100644
index 12f375c9..00000000
--- a/lib/components/atoms/markdown_viewer.dart
+++ /dev/null
@@ -1,169 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:markdown_viewer/markdown_viewer.dart';
-import 'package:url_launcher/url_launcher.dart';
-
-import '../../helpers/measure_size.dart';
-import '../../helpers/syntax_highlighter.dart';
-import '../../helpers/utils.dart';
-import '../../providers/slide_provider.dart';
-import '../../superdeck.dart';
-import 'cache_image_widget.dart';
-
-class AnimatedMarkdownViewer extends ImplicitlyAnimatedWidget {
- final String content;
- final SlideSpec spec;
-
- const AnimatedMarkdownViewer({
- super.key,
- required this.content,
- required this.spec,
- required super.duration,
- super.curve = Curves.linear,
- });
-
- @override
- ImplicitlyAnimatedWidgetState createState() =>
- _AnimatedMarkdownViewerState();
-}
-
-class _AnimatedMarkdownViewerState
- extends AnimatedWidgetBaseState {
- SlideSpecTween? _styleTween;
-
- @override
- void forEachTween(TweenVisitor visitor) {
- _styleTween = visitor(
- _styleTween,
- widget.spec,
- (dynamic value) => SlideSpecTween(begin: value),
- ) as SlideSpecTween?;
- }
-
- @override
- Widget build(BuildContext context) {
- return MarkdownViewer(
- widget.content,
- enableTaskList: true,
- enableSuperscript: false,
- enableSubscript: false,
- enableFootnote: false,
- enableImageSize: true,
- enableKbd: false,
- syntaxExtensions: const [],
- elementBuilders: const [],
- imageBuilder: _imageBuilder,
- onTapLink: (href, title) async {
- // open link in the browser
- if (href == null || href.isEmpty) return;
- final url = Uri.parse(href);
- await launchUrl(url);
- },
- highlightBuilder: (text, language, infoString) {
- return [
- TextSpan(
- style: _styleTween!.evaluate(animation).code?.codeSpan,
- children: SyntaxHighlight.render(text, language),
- ),
- ];
- },
- copyIconBuilder: (bool copied) {
- return const SizedBox();
- // return Padding(
- // padding: const EdgeInsets.all(16.0),
- // child: Icon(
- // copied ? Icons.check : Icons.copy,
- // color: _styleTween!.evaluate(animation).code?.copyIconColor ??
- // Colors.grey,
- // size: 24,
- // ),
- // );
- },
- styleSheet: _styleTween!.evaluate(animation).toStyle(),
- );
- }
-}
-
-class SlideSpecTween extends Tween {
- SlideSpecTween({super.begin, super.end});
- @override
- SlideSpec lerp(double t) {
- return begin?.lerp(end!, t) ?? end ?? SlideSpec();
- }
-}
-
-Widget _imageBuilder(
- Uri uri,
- MarkdownImageInfo info,
-) {
- return Builder(
- builder: (context) {
- final size = SlideConstraints.of(context).biggest;
-
- final spec = SlideProvider.specOf(context);
- final imageSpec = spec.image;
- final constraints = calculateConstraints(size, spec.contentContainer);
- return ConstrainedBox(
- constraints: constraints,
- child: CacheImage(
- url: uri.toString(),
- size: constraints.biggest,
- spec: imageSpec.copyWith(
- width: info.width ?? imageSpec.width,
- height: info.height ?? imageSpec.height,
- ),
- ),
- );
- },
- );
-}
-
-List updateTextColor(
- List originalSpans,
- List targetLines,
- Color newColor,
-) {
- // Check if the target line is within the range of the list
- if (targetLines.isEmpty) {
- return originalSpans;
- }
-
- // Clone the original list to avoid mutating it directly
- List updatedSpans = List.from(originalSpans);
-
- // Detect line break from the list of text spans
- // This is done by checking if the previous span is a line break
- // If it is, then the current span is the start of a new line
- int line = 1;
-
- for (int i = 0; i < updatedSpans.length; i++) {
- if (i > 0) {
- final currentValue = updatedSpans[i].text ?? '';
-
- if (currentValue.startsWith('\n')) {
- line++;
- }
- }
- final originalSpan = originalSpans[i];
-
- final textStyle = originalSpan.style ?? const TextStyle();
-
- if (targetLines.contains(line)) {
- updatedSpans[i] = TextSpan(
- text: originalSpan.text,
- children: originalSpan.children,
- recognizer: originalSpan.recognizer,
- mouseCursor: originalSpan.mouseCursor,
- onEnter: originalSpan.onEnter,
- onExit: originalSpan.onExit,
- semanticsLabel: originalSpan.semanticsLabel,
- locale: originalSpan.locale,
- spellOut: originalSpan.spellOut,
- style: textStyle.copyWith(
- backgroundColor: newColor,
- ),
- );
- }
- }
-
- return updatedSpans;
-}
diff --git a/lib/components/atoms/slide_thumbnail.dart b/lib/components/atoms/slide_thumbnail.dart
deleted file mode 100644
index 5d0a2fa4..00000000
--- a/lib/components/atoms/slide_thumbnail.dart
+++ /dev/null
@@ -1,216 +0,0 @@
-import 'dart:async';
-import 'dart:io';
-
-import 'package:flutter/material.dart';
-import 'package:signals/signals_flutter.dart';
-
-import '../../helpers/constants.dart';
-import '../../services/snapshot_service.dart';
-import '../../superdeck.dart';
-import '../molecules/scaled_app.dart';
-import 'cache_image_widget.dart';
-import 'loading_indicator.dart';
-import 'slide_view.dart';
-
-final _previewStyle = AnimatedStyle(
- Style(
- $box.color.grey.shade900(),
- $box.margin.all(8),
- $box.border.all.width(2),
- $box.shadow(
- color: Colors.black.withOpacity(0.5),
- blurRadius: 4,
- spreadRadius: 1,
- ),
- ),
- duration: const Duration(milliseconds: 300),
- curve: Curves.ease,
-);
-
-// ignore: non_constant_identifier_names
-final PreviewBox = _previewStyle.box;
-
-class SlideThumbnail extends StatefulWidget {
- final bool selected;
- final VoidCallback onTap;
- final int index;
- final Slide slide;
-
- const SlideThumbnail({
- super.key,
- required this.selected,
- required this.index,
- required this.onTap,
- required this.slide,
- });
-
- @override
- State createState() => _SlideThumbnailState();
-}
-
-class _SlideThumbnailState extends State {
- late final imageGenerator = SnapshotService.instance;
- late File _thumbnailFile = SlideAsset.thumbnail(widget.slide);
-
- late final _thumbnailLoader = futureSignal(() {
- return kCanRunProcess
- ? _generateThumbnail()
- : Future.value(_getLocalAsset());
- });
-
- @override
- void dispose() {
- super.dispose();
-
- _thumbnailLoader.dispose();
- }
-
- @override
- void didUpdateWidget(SlideThumbnail oldWidget) {
- super.didUpdateWidget(oldWidget);
- if (oldWidget.slide.hashKey != widget.slide.hashKey) {
- _thumbnailFile = SlideAsset.thumbnail(widget.slide);
- _thumbnailLoader.refresh();
- }
- }
-
- String _getLocalAsset() {
- return _thumbnailFile.path;
- }
-
- Future _generateThumbnail() async {
- if (await _thumbnailFile.exists()) {
- return _getLocalAsset();
- }
-
- final imageData = await imageGenerator.generate(
- // ignore: use_build_context_synchronously
- quality: SnapshotQuality.low,
- slide: widget.slide,
- );
-
- await _thumbnailFile.writeAsBytes(imageData);
-
- return _getLocalAsset();
- }
-
- @override
- Widget build(BuildContext context) {
- return LayoutBuilder(builder: (context, constraints) {
- final selectedColor = widget.selected ? Colors.blue : Colors.transparent;
-
- final result = _thumbnailLoader.watch(context);
-
- final child = LoadingOverlay(
- isLoading: result.isLoading,
- child: result.map(
- data: (path) {
- return Image(
- image: getImageProvider(
- context: context,
- url: path,
- targetSize: constraints.biggest,
- ),
- );
- },
- loading: () {
- return const Center(
- child: CircularProgressIndicator(),
- );
- },
- error: (error, _) {
- return const Center(
- child: Text('Error loading image'),
- );
- },
- ),
- );
-
- return GestureDetector(
- onTap: widget.onTap,
- child: PreviewBox(
- style: Style(
- $box.border.all.color(selectedColor),
- ),
- child: AbsorbPointer(
- child: AspectRatio(
- aspectRatio: kAspectRatio,
- child: Stack(
- children: [
- child,
- Positioned(
- top: 0,
- right: 0,
- left: 0,
- child: SizedBox(
- child: result.isRefreshing
- ? const LinearProgressIndicator(
- minHeight: 3,
- backgroundColor: Colors.transparent,
- )
- : null,
- ),
- ),
- Positioned(
- right: 0,
- bottom: 0,
- child: Container(
- padding: const EdgeInsets.fromLTRB(12, 4, 12, 4),
- margin: const EdgeInsets.all(1),
- color: Colors.black.withOpacity(0.5),
- child: Text(
- '${widget.index + 1}',
- style: const TextStyle(
- color: Colors.white,
- fontWeight: FontWeight.bold,
- ),
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- ),
- );
- });
- }
-}
-
-class SlideThumbnailDynamic extends StatelessWidget {
- final bool selected;
- final VoidCallback onTap;
- final int index;
- final Slide slide;
-
- const SlideThumbnailDynamic({
- super.key,
- required this.selected,
- required this.index,
- required this.onTap,
- required this.slide,
- });
-
- @override
- Widget build(BuildContext context) {
- final selectedColor = selected ? Colors.blue : Colors.transparent;
-
- return GestureDetector(
- onTap: onTap,
- child: PreviewBox(
- style: Style(
- $box.border.all.color(selectedColor),
- ),
- child: AbsorbPointer(
- child: AspectRatio(
- aspectRatio: kAspectRatio,
- child: ScaledWidget(
- child: SlideView(
- slide,
- ),
- )),
- ),
- ),
- );
- }
-}
diff --git a/lib/components/atoms/slide_view.dart b/lib/components/atoms/slide_view.dart
deleted file mode 100644
index 60a60b40..00000000
--- a/lib/components/atoms/slide_view.dart
+++ /dev/null
@@ -1,128 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:signals/signals_flutter.dart';
-
-import '../../helpers/constants.dart';
-import '../../helpers/layout_builder.dart';
-import '../../helpers/measure_size.dart';
-import '../../providers/slide_provider.dart';
-import '../../superdeck.dart';
-import 'cache_image_widget.dart';
-import 'transition_widget.dart';
-
-class SlideView extends StatelessWidget {
- // If SlideView is a snapshot for image generation
- final bool _isSnapshot;
- const SlideView(
- this.slide, {
- super.key,
- }) : _isSnapshot = false;
-
- const SlideView.snapshot(
- this.slide, {
- super.key,
- }) : _isSnapshot = true;
-
- final Slide slide;
-
- @override
- Widget build(BuildContext context) {
- final slide = this.slide;
- final variant = slide.styleVariant;
- final style = sdController.style.watch(context);
-
- final variantStyle = style.applyVariant(variant);
-
- final backgroundWidget = slide.background != null
- ? CacheImage(
- url: slide.background!,
- fit: BoxFit.cover,
- size: kResolution,
- alignment: Alignment.center,
- )
- : const SizedBox();
-
- final duration = _isSnapshot ? Duration.zero : null;
-
- return TransitionWidget(
- key: ValueKey(slide.transition?.copyWith(duration: duration)),
- transition: slide.transition,
- child: Pressable(
- onPress: () {},
- autofocus: true,
- child: SpecBuilder(
- style: variantStyle,
- builder: (context) {
- final spec = SlideSpec.of(context);
- return Builder(builder: (context) {
- return AnimatedBoxSpecWidget(
- spec: spec.outerContainer,
- duration: duration ?? const Duration(milliseconds: 300),
- child: Stack(
- children: [
- Positioned.fill(child: backgroundWidget),
- AnimatedBoxSpecWidget(
- spec: spec.innerContainer,
- duration: const Duration(milliseconds: 300),
- child: SlideProvider(
- slide: slide,
- spec: spec,
- examples: sdController.examples.watch(context),
- assets: sdController.assets.watch(context),
- isSnapshot: _isSnapshot,
- child: SlideConstraints(
- (_) {
- if (slide is SimpleSlide) {
- return SimpleSlideBuilder(config: slide);
- } else if (slide is WidgetSlide) {
- return WidgetSlideBuilder(config: slide);
- } else if (slide is ImageSlide) {
- return ImageSlideBuilder(config: slide);
- } else if (slide is TwoColumnSlide) {
- return TwoColumnSlideBuilder(config: slide);
- } else if (slide is TwoColumnHeaderSlide) {
- return TwoColumnHeaderSlideBuilder(config: slide);
- } else if (slide is InvalidSlide) {
- return InvalidSlideBuilder(config: slide);
- } else {
- throw UnimplementedError(
- 'Slide config not implemented',
- );
- }
- },
- ),
- ),
- ),
- ],
- ),
- );
- });
- },
- ),
- ),
- );
- }
-}
-
-class SlideConstraintsProvider extends InheritedWidget {
- const SlideConstraintsProvider({
- required this.constraints,
- required super.child,
- super.key,
- });
-
- final BoxConstraints constraints;
-
- static BoxConstraints of(BuildContext context) {
- final slideConstraints =
- context.dependOnInheritedWidgetOfExactType();
- if (slideConstraints == null) {
- throw Exception('SlideConstraints not found in context');
- }
- return slideConstraints.constraints;
- }
-
- @override
- bool updateShouldNotify(SlideConstraintsProvider oldWidget) {
- return oldWidget.constraints != constraints;
- }
-}
diff --git a/lib/components/molecules/code_preview.dart b/lib/components/molecules/code_preview.dart
deleted file mode 100644
index 39f31fbe..00000000
--- a/lib/components/molecules/code_preview.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-import 'package:flutter/material.dart';
-
-class CodePreview extends StatelessWidget {
- const CodePreview({
- this.child,
- super.key,
- });
-
- final Widget? child;
-
- @override
- Widget build(BuildContext context) {
- // final options = SlideDataProvider.of(context);
- return Center(child: child);
- }
-}
diff --git a/lib/components/molecules/slide_preview.dart b/lib/components/molecules/slide_preview.dart
deleted file mode 100644
index 9effa3e7..00000000
--- a/lib/components/molecules/slide_preview.dart
+++ /dev/null
@@ -1,77 +0,0 @@
-import 'package:flutter/material.dart';
-
-import '../../helpers/measure_size.dart';
-import '../../helpers/utils.dart';
-import '../../styles/style_util.dart';
-import '../../superdeck.dart';
-import '../atoms/markdown_viewer.dart';
-import '../atoms/slide_view.dart';
-import 'scaled_app.dart';
-import 'split_view.dart';
-
-class SlidePreview extends StatelessWidget {
- const SlidePreview(
- this.slide, {
- super.key,
- });
-
- final Slide slide;
-
- @override
- Widget build(BuildContext context) {
- final panelSize = SplitViewProvider.panelSizeOf(context);
- var paddingSize = panelSize / (context.isSmall ? 5.0 : 20.0);
-
- return Center(
- child: Container(
- margin: EdgeInsets.all(paddingSize),
- decoration: BoxDecoration(
- color: const Color.fromARGB(144, 0, 0, 0),
- boxShadow: [
- BoxShadow(
- color: Colors.black.withOpacity(0.3),
- blurRadius: 6,
- spreadRadius: 3,
- ),
- ],
- ),
- child: ScaledWidget(
- child: SlideView(slide),
- ),
- ),
- );
- }
-}
-
-class SlideMarkdownPreview extends StatelessWidget {
- const SlideMarkdownPreview({
- super.key,
- required this.slide,
- });
-
- final Slide slide;
-
- @override
- Widget build(BuildContext context) {
- final rawYaml = slide.raw;
- final options = '#### Options\n```yaml\n${rawYaml.trim()}\n```\n';
- final data = '#### Content\n```markdown\n${slide.data}\n```\n';
- final s = SlideSpecUtility.self;
- return SpecBuilder(
- style: defaultStyle.merge(
- Style(
- s.code.span.fontSize(14),
- ),
- ),
- builder: (mix) {
- return SlideConstraints((_) {
- return AnimatedMarkdownViewer(
- content: "$options\n$data\n",
- spec: SlideSpec.of(context),
- duration: Duration.zero,
- );
- });
- },
- );
- }
-}
diff --git a/lib/components/molecules/slide_thumbnail_list.dart b/lib/components/molecules/slide_thumbnail_list.dart
deleted file mode 100644
index afa15bc7..00000000
--- a/lib/components/molecules/slide_thumbnail_list.dart
+++ /dev/null
@@ -1,109 +0,0 @@
-import 'package:collection/collection.dart';
-import 'package:flutter/material.dart';
-import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
-import 'package:signals/signals_flutter.dart';
-
-import '../../models/slide_model.dart';
-import '../../providers/controller.dart';
-import '../atoms/slide_thumbnail.dart';
-
-class SlideThumbnailList extends StatefulWidget {
- const SlideThumbnailList({
- super.key,
- required this.slides,
- required this.currentSlide,
- required this.onSelect,
- required this.scrollDirection,
- });
-
- final List slides;
- final int currentSlide;
- final void Function(int) onSelect;
- final Axis scrollDirection;
-
- @override
- State createState() => _SlideThumbnailListState();
-}
-
-class _SlideThumbnailListState extends State {
- final _itemScrollController = ItemScrollController();
- final _itemPositionsListener = ItemPositionsListener.create();
-
- var _visibleItems = [];
-
- @override
- void didUpdateWidget(covariant SlideThumbnailList oldWidget) {
- super.didUpdateWidget(oldWidget);
-
- if (widget.currentSlide != oldWidget.currentSlide) {
- goToPage(widget.currentSlide);
- }
- }
-
- Future goToPage(int page, {bool animate = true}) async {
- if (page < 0 || page >= widget.slides.length) return;
-
- const duration = Duration(milliseconds: 300);
- const curve = Curves.easeInOutCubic;
-
- final visibleItem = _visibleItems.firstWhereOrNull((e) => e.index == page);
-
- double alignment;
-
- if (visibleItem == null) {
- final isBeginning = _visibleItems.first.index > page;
-
- alignment = isBeginning ? 0 : 0.75;
- } else {
- if (visibleItem.itemTrailingEdge > 1) {
- final totalSpace =
- visibleItem.itemTrailingEdge - visibleItem.itemLeadingEdge;
- alignment = 1 - totalSpace;
- } else if (visibleItem.itemLeadingEdge < 0) {
- alignment = 0;
- } else {
- alignment = visibleItem.itemLeadingEdge;
- }
- }
- _itemScrollController.scrollTo(
- index: page,
- alignment: alignment,
- duration: duration,
- curve: curve,
- );
-
- widget.onSelect(page);
- }
-
- @override
- void initState() {
- super.initState();
- _itemPositionsListener.itemPositions.addListener(() {
- _visibleItems = _itemPositionsListener.itemPositions.value.toList();
- });
- }
-
- @override
- Widget build(BuildContext context) {
- return Container(
- color: const Color.fromARGB(108, 0, 0, 0),
- child: ScrollablePositionedList.builder(
- scrollDirection: widget.scrollDirection,
- itemCount: widget.slides.length,
- itemPositionsListener: _itemPositionsListener,
- itemScrollController: _itemScrollController,
- padding: const EdgeInsets.all(20),
- itemBuilder: (context, idx) {
- final slide = widget.slides[idx];
- SDController.instance.style.watch(context);
-
- return SlideThumbnail(
- index: idx,
- selected: idx == widget.currentSlide,
- onTap: () => goToPage(idx),
- slide: slide,
- );
- }),
- );
- }
-}
diff --git a/lib/components/molecules/split_view.dart b/lib/components/molecules/split_view.dart
deleted file mode 100644
index c2eeed9b..00000000
--- a/lib/components/molecules/split_view.dart
+++ /dev/null
@@ -1,213 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:signals/signals_flutter.dart';
-
-import '../../helpers/utils.dart';
-import '../../superdeck.dart';
-import 'slide_thumbnail_list.dart';
-
-// ignore: non_constant_identifier_names
-final SlidePreviewBox = Style(
- $box.color.grey.shade900(),
- $box.margin.all(8),
- $box.maxHeight(140),
- $box.shadow(
- color: Colors.black.withOpacity(0.5),
- blurRadius: 4,
- spreadRadius: 1,
- ),
-).box;
-
-class SplitView extends StatefulWidget {
- final Widget child;
-
- const SplitView({
- super.key,
- required this.child,
- });
-
- @override
- // ignore: library_private_types_in_public_api
- _SplitViewState createState() => _SplitViewState();
-}
-
-class _SplitViewState extends State
- with SingleTickerProviderStateMixin {
- late AnimationController _animationController;
- late Animation _animation;
-
- late final navigation = NavigationProvider.instance;
- late final superdeck = SDController.instance;
-
- @override
- void initState() {
- super.initState();
- _animationController = AnimationController(
- vsync: this,
- duration: Durations.medium1,
- );
- _animation = Tween(begin: 0.0, end: 1.0).animate(
- CurvedAnimation(
- parent: _animationController,
- curve: Curves.ease,
- ),
- );
-
- if (navigation.sideIsOpen.value) {
- _animationController.value = 1.0;
- }
- }
-
- @override
- void dispose() {
- _animationController.dispose();
- super.dispose();
- }
-
- @override
- Widget build(BuildContext context) {
- final slides = superdeck.slides.watch(context);
-
- navigation.sideIsOpen.listen(context, () {
- if (navigation.sideIsOpen.value) {
- _animationController.forward();
- } else {
- _animationController.reverse();
- }
- });
-
- final sideWidth = context.isMobileLandscape ? 200.0 : 400.0;
- const sideHeight = 200.0;
- final currentSlide = navigation.currentSlide.watch(context);
- final sideIsOpen = navigation.sideIsOpen.watch(context);
-
- final isSmall = context.isSmall || context.isMobileLandscape;
-
- final sidePanel = SlideThumbnailList(
- scrollDirection: isSmall ? Axis.horizontal : Axis.vertical,
- currentSlide: currentSlide,
- onSelect: navigation.goToSlide,
- slides: slides,
- );
-
- return LayoutBuilder(
- builder: (context, constraints) {
- return AnimatedBuilder(
- animation: _animation,
- builder: (context, child) {
- final animatedWidth = _animation.value * sideWidth;
- final animatedHeight = _animation.value * sideHeight;
-
- Offset offset;
- if (isSmall) {
- offset = Offset(0, -(animatedHeight - sideHeight));
- } else {
- offset = Offset(animatedWidth - sideWidth, 0);
- }
-
- EdgeInsets padding;
-
- if (isSmall) {
- padding = EdgeInsets.only(bottom: animatedHeight);
- } else {
- padding = EdgeInsets.only(left: animatedWidth);
- }
-
- final panelSize = isSmall ? animatedHeight : animatedWidth;
-
- Widget drawer = Transform.translate(
- offset: offset,
- child: SizedBox(
- width: isSmall ? null : sideWidth,
- height: isSmall ? sideHeight : null,
- child: sidePanel,
- ),
- );
-
- // Align at the bottom if its a small screen
- if (isSmall) {
- drawer = Align(
- alignment: Alignment.bottomCenter,
- child: drawer,
- );
- }
-
- final child = SplitViewProvider(
- panelSize: panelSize,
- isOpen: sideIsOpen,
- size: constraints.biggest,
- child: Padding(
- padding: padding,
- child: widget.child,
- ),
- );
-
- return Stack(
- children: [child, drawer],
- );
- },
- );
- },
- );
- }
-}
-
-enum SplitViewProviderAspect {
- panelSize,
- isOpen,
- size,
-}
-
-class SplitViewProvider extends InheritedModel {
- final double panelSize;
- final bool isOpen;
- final Size size;
-
- const SplitViewProvider({
- super.key,
- required this.panelSize,
- required this.isOpen,
- required this.size,
- required super.child,
- });
-
- @override
- bool updateShouldNotify(covariant SplitViewProvider oldWidget) {
- return panelSize != oldWidget.panelSize ||
- isOpen != oldWidget.isOpen ||
- size != oldWidget.size;
- }
-
- @override
- bool updateShouldNotifyDependent(covariant SplitViewProvider oldWidget,
- Set dependencies) {
- if (dependencies.contains(SplitViewProviderAspect.panelSize) &&
- panelSize != oldWidget.panelSize) {
- return true;
- }
- if (dependencies.contains(SplitViewProviderAspect.isOpen) &&
- isOpen != oldWidget.isOpen) {
- return true;
- }
- if (dependencies.contains(SplitViewProviderAspect.size) &&
- size != oldWidget.size) {
- return true;
- }
- return false;
- }
-
- static SplitViewProvider of(BuildContext context) {
- return context.dependOnInheritedWidgetOfExactType()!;
- }
-
- static Size sizeOf(BuildContext context) {
- return SplitViewProvider.of(context).size;
- }
-
- static double panelSizeOf(BuildContext context) {
- return SplitViewProvider.of(context).panelSize;
- }
-
- static bool isOpenOf(BuildContext context) {
- return SplitViewProvider.of(context).isOpen;
- }
-}
diff --git a/lib/components/organisms/app_shell.dart b/lib/components/organisms/app_shell.dart
deleted file mode 100644
index a7f69559..00000000
--- a/lib/components/organisms/app_shell.dart
+++ /dev/null
@@ -1,172 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter/services.dart';
-import 'package:go_router/go_router.dart';
-import 'package:signals/signals_flutter.dart';
-
-import '../../helpers/constants.dart';
-import '../../helpers/utils.dart';
-import '../../superdeck.dart';
-import 'drawer.dart';
-
-final scaffoldKey = GlobalKey();
-
-/// Builds the "shell" for the app by building a Scaffold with a
-/// BottomNavigationBar, where [child] is placed in the body of the Scaffold.
-class ScaffoldWithNavBar extends StatefulWidget {
- /// Constructs an [ScaffoldWithNavBar].
- const ScaffoldWithNavBar({
- required this.navigationShell,
- Key? key,
- }) : super(key: key ?? const ValueKey('ScaffoldWithNavBar'));
-
- /// The navigation shell and container for the branch Navigators.
- final StatefulNavigationShell navigationShell;
-
- @override
- State createState() => _ScaffoldWithNavBarState();
-}
-
-class _ScaffoldWithNavBarState extends State
- with SingleTickerProviderStateMixin {
- late AnimationController _animationController;
- late Animation _animation;
-
- @override
- void initState() {
- super.initState();
- _animationController = AnimationController(
- vsync: this,
- duration: Durations.short3,
- );
- _animation = CurvedAnimation(
- parent: _animationController,
- curve: Curves.ease,
- );
-
- if (navigation.sideIsOpen.value) {
- _animationController.forward();
- }
- }
-
- @override
- void dispose() {
- _animationController.dispose();
- super.dispose();
- }
-
- final navigation = NavigationProvider.instance;
-
- void _onTap(BuildContext context, int index) {
- if (index == SideMenu.clearCache.index) {
- sdController.clearGenerated();
- return;
- }
- // When navigating to a new branch, it's recommended to use the goBranch
- // method, as doing so makes sure the last navigation state of the
- // Navigator for the branch is restored.
- widget.navigationShell.goBranch(
- index,
- // A common pattern when using bottom navigation bars is to support
- // navigating to the initial location when tapping the item that is
- // already active. This example demonstrates how to support this behavior,
- // using the initialLocation parameter of goBranch.
- // initialLocation: index == navigationShell.currentIndex,
- );
- }
-
- @override
- Widget build(BuildContext context) {
- final slides = sdController.slides.watch(context);
-
- navigation.sideIsOpen.listen(context, () {
- if (navigation.sideIsOpen.value) {
- _animationController.forward();
- } else {
- _animationController.reverse();
- }
- });
- final isSmall = context.isSmall;
-
- final totalInvalid = slides.whereType().length;
-
- final bindings = {
- const SingleActivator(
- LogicalKeyboardKey.arrowRight,
- ): navigation.nextSlide,
- const SingleActivator(
- LogicalKeyboardKey.arrowDown,
- ): navigation.nextSlide,
- const SingleActivator(
- LogicalKeyboardKey.space,
- ): navigation.nextSlide,
- const SingleActivator(
- LogicalKeyboardKey.arrowLeft,
- ): navigation.previousSlide,
- const SingleActivator(
- LogicalKeyboardKey.arrowUp,
- ): navigation.previousSlide,
- };
-
- void onTap(int index) {
- _onTap(context, index);
- }
-
- final menuItems = kCanRunProcess ? SideMenu.devMenu : SideMenu.prodMenu;
-
- final navigationRail = NavigationRail(
- extended: false,
- selectedIndex: widget.navigationShell.currentIndex,
- onDestinationSelected: onTap,
- minWidth: 80,
- leading: const SizedBox(height: 20),
- labelType: NavigationRailLabelType.none,
- destinations: menuItems.map(
- (e) {
- return NavigationRailDestination(
- icon: Icon(e.icon, size: 20),
- label: Text(e.label),
- );
- },
- ).toList(),
- );
-
- final sideNavBar = !isSmall
- ? AnimatedBuilder(
- animation: _animation,
- builder: (context, child) {
- return SizeTransition(
- sizeFactor: _animation,
- axis: Axis.horizontal,
- child: navigationRail,
- );
- })
- : null;
-
- return CallbackShortcuts(
- bindings: bindings,
- child: Scaffold(
- bottomNavigationBar: null,
- key: scaffoldKey,
- floatingActionButtonLocation: isSmall
- ? FloatingActionButtonLocation.miniEndFloat
- : FloatingActionButtonLocation.miniStartFloat,
- floatingActionButton: FloatingActionButton.small(
- onPressed: navigation.toggleSide,
- child: Badge(
- label: Text(totalInvalid.toString()),
- isLabelVisible: totalInvalid != 0,
- child: const Icon(Icons.menu),
- ),
- ),
- body: isSmall
- ? widget.navigationShell
- : Row(
- children: [
- sideNavBar ?? Container(),
- Expanded(child: widget.navigationShell),
- ],
- ),
- ),
- );
- }
-}
diff --git a/lib/components/superdeck_app.dart b/lib/components/superdeck_app.dart
deleted file mode 100644
index e153cda0..00000000
--- a/lib/components/superdeck_app.dart
+++ /dev/null
@@ -1,187 +0,0 @@
-import 'dart:async';
-
-import 'package:flutter/foundation.dart';
-import 'package:flutter/material.dart';
-import 'package:go_router/go_router.dart';
-import 'package:localstorage/localstorage.dart';
-import 'package:signals/signals_flutter.dart';
-import 'package:window_manager/window_manager.dart';
-
-import '../../helpers/syntax_highlighter.dart';
-import '../../superdeck.dart';
-import '../helpers/constants.dart';
-import '../helpers/theme.dart';
-import '../screens/export_screen.dart';
-import '../screens/home_screen.dart';
-import 'atoms/loading_indicator.dart';
-import 'molecules/exception_widget.dart';
-
-final kAppKey = GlobalKey();
-final _uniqueKey = UniqueKey();
-
-class SuperDeckApp extends StatefulWidget {
- const SuperDeckApp({
- super.key,
- this.style,
- this.examples = const [],
- });
-
- final Style? style;
- final List examples;
-
- static bool _isInitialized = false;
-
- static Future initialize() async {
- // Return if its initialized
- if (SuperDeckApp._isInitialized) return;
-
- WidgetsFlutterBinding.ensureInitialized();
-
- SignalsObserver.instance = null;
-
- await Future.wait([
- initLocalStorage(),
- SyntaxHighlight.initialize(),
- _initializeWindowManager(),
- ]);
-
- SuperDeckApp._isInitialized = true;
- }
-
- @override
- // ignore: library_private_types_in_public_api
- _SuperDeckAppState createState() => _SuperDeckAppState();
-}
-
-class _SuperDeckAppState extends State {
- late final _initialize = futureSignal(() async {
- await SuperDeckApp.initialize();
-
- return sdController.initialize(
- style: widget.style,
- examples: widget.examples,
- );
- });
-
- @override
- void didUpdateWidget(SuperDeckApp oldWidget) {
- super.didUpdateWidget(oldWidget);
- if (widget.style != oldWidget.style ||
- !listEquals(widget.examples, oldWidget.examples)) {
- _initialize.refresh();
- }
- }
-
- @override
- void dispose() {
- _initialize.dispose();
- super.dispose();
- }
-
- @override
- Widget build(BuildContext context) {
- return Theme(
- data: theme,
- child: Builder(builder: (context) {
- return MixTheme(
- data: MixThemeData.withMaterial(),
- child: MaterialApp.router(
- debugShowCheckedModeBanner: false,
- title: 'Superdeck',
- routerConfig: _router,
- theme: Theme.of(context),
- key: kAppKey,
- builder: (context, child) {
- final result = _initialize.watch(context);
-
- return LoadingOverlay(
- isLoading: result.isLoading,
- key: _uniqueKey,
- child: result.map(
- data: (_) => child!,
- loading: () => const SizedBox(),
- error: (error, _) {
- return ExceptionWidget(
- error,
- onRetry: _initialize.reload,
- );
- },
- ),
- );
- },
- ),
- );
- }),
- );
- }
-}
-
-Future _initializeWindowManager() async {
- if (kIsWeb) return;
-
- // Must add this line.
- await windowManager.ensureInitialized();
-
- const windowOptions = WindowOptions(
- size: kResolution,
- backgroundColor: Colors.black,
- skipTaskbar: false,
- minimumSize: kResolution,
- titleBarStyle: TitleBarStyle.hidden,
- );
-
- windowManager.waitUntilReadyToShow(windowOptions, () async {
- await windowManager.show();
- await windowManager.focus();
- });
-
- await windowManager.setAspectRatio(kAspectRatio);
-}
-
-final _rootNavigatorKey = GlobalKey(debugLabel: 'root');
-final _sectionANavigatorKey =
- GlobalKey(debugLabel: 'sectionANav');
-
-final _router = GoRouter(
- navigatorKey: _rootNavigatorKey,
- initialLocation: '/',
- routes: [
- StatefulShellRoute.indexedStack(
- builder: (
- BuildContext context,
- GoRouterState state,
- StatefulNavigationShell navigationShell,
- ) {
- // Return the widget that implements the custom shell (in this case
- // using a BottomNavigationBar). The StatefulNavigationShell is passed
- // to be able access the state of the shell and to navigate to other
- // branches in a stateful way.
- return ScaffoldWithNavBar(navigationShell: navigationShell);
- },
- branches: [
- // The route branch for the first tab of the bottom navigation bar.
- StatefulShellBranch(
- navigatorKey: _sectionANavigatorKey,
- routes: [
- GoRoute(
- path: '/',
- builder: (BuildContext context, GoRouterState state) {
- return const HomeScreen();
- },
- ),
- ],
- ),
- StatefulShellBranch(
- routes: [
- GoRoute(
- path: '/export',
- builder: (BuildContext context, GoRouterState state) {
- return const ExportScreen();
- },
- ),
- ],
- ),
- ],
- ),
- ],
-);
diff --git a/lib/helpers/layout_builder.dart b/lib/helpers/layout_builder.dart
deleted file mode 100644
index 1701948d..00000000
--- a/lib/helpers/layout_builder.dart
+++ /dev/null
@@ -1,265 +0,0 @@
-import 'package:flutter/material.dart';
-
-import '../components/atoms/cache_image_widget.dart';
-import '../components/molecules/code_preview.dart';
-import '../components/molecules/slide_content.dart';
-import '../providers/slide_provider.dart';
-import '../superdeck.dart';
-import 'constants.dart';
-import 'measure_size.dart';
-
-abstract class SlideBuilder extends StatelessWidget {
- final T config;
-
- const SlideBuilder({required this.config, super.key});
-
- Widget buildContent() {
- return _buildContent(
- config.data,
- config.contentOptions,
- );
- }
-
- @protected
- Widget _buildContent(String content, ContentOptions? options) {
- return SlideContent(data: content, options: options);
- }
-
- Widget buildContentSection(SectionData section) {
- return Expanded(
- flex: section.options.flex,
- child: _buildContent(section.content, section.options),
- );
- }
-}
-
-class SimpleSlideBuilder extends SlideBuilder {
- const SimpleSlideBuilder({required super.config, super.key});
-
- @override
- Widget build(BuildContext context) => buildContent();
-}
-
-class InvalidSlideBuilder extends SlideBuilder {
- const InvalidSlideBuilder({required super.config, super.key});
-
- @override
- Widget build(BuildContext context) {
- const red = Color.fromARGB(255, 166, 6, 6);
-
- final s = SlideSpecUtility.self;
-
- final style = Style(
- s.textStyle.color(Colors.white),
- s.h1.textStyle.color(const Color.fromARGB(255, 71, 1, 1)),
- s.h1.textStyle.fontSize(36.0),
- s.h1.textStyle.bold(),
- s.h2.padding.top(0),
- s.h2.textStyle.bold(),
- s.h2.textStyle.color.yellow(),
- s.code.span.color.yellow(),
- s.code.span.backgroundColor(const Color.fromARGB(255, 84, 6, 6)),
- );
-
- return SpecBuilder(
- style: style,
- builder: (context) {
- // Maybe there are no validation errors just return the content
- return Container(
- decoration: BoxDecoration(
- color: red,
- border: Border.all(color: red, width: 20),
- ),
- child: buildContent(),
- );
- });
- }
-}
-
-abstract class SplitSlideBuilder extends SlideBuilder {
- const SplitSlideBuilder({required super.config, super.key});
-
- Widget buildSplitSlide(Widget side) {
- final position = config.options.position;
- final flex = config.options.flex;
-
- List children = [
- buildContentSection((
- content: config.data,
- options: config.contentOptions ?? const ContentOptions(),
- )),
- Expanded(flex: flex, child: side),
- ];
-
- if (position == LayoutPosition.left || position == LayoutPosition.top) {
- children = children.reversed.toList();
- }
-
- final isVertical =
- position == LayoutPosition.top || position == LayoutPosition.bottom;
-
- if (isVertical) {
- return Column(children: children);
- } else {
- return Row(children: children);
- }
- }
-}
-
-class WidgetSlideBuilder extends SplitSlideBuilder {
- const WidgetSlideBuilder({required super.config, super.key});
-
- @override
- Widget build(BuildContext context) {
- final options = config.options;
-
- final examples = SlideProvider.examplesOf(context);
-
- final builder = examples[options.name];
-
- final side = SlideConstraints(
- (size) {
- return MediaQuery(
- data: MediaQueryData(size: size),
- child: ConstrainedBox(
- constraints: BoxConstraints(
- maxWidth: size.width,
- maxHeight: size.height,
- ),
- child: CodePreview(
- child: builder?.call(options.args),
- ),
- ),
- );
- },
- );
-
- return buildSplitSlide(side);
- }
-}
-
-class ImageSlideBuilder extends SplitSlideBuilder {
- const ImageSlideBuilder({required super.config, super.key});
-
- @override
- Widget build(BuildContext context) {
- final spec = SlideProvider.specOf(context);
-
- final src = config.options.src;
- final boxFit = config.options.fit?.toBoxFit() ?? spec.image.fit;
-
- // THis slide breaks in half and I want to calculate the size based on if its in top or bottom
- // or left or right. Also there is a property called flex which is how much of the slide it takes
- // so I can use that to calculate the size of the canvas
- final firstHalf =
- config.contentOptions?.flex ?? const ContentOptions().flex;
- final imageHalf = config.options.flex;
-
-// available size const width = 1280.0;
-//const height = 720.0;
-
- double width;
- double height;
- const availableSize = kResolution;
- if (config.options.position.isHorizontal()) {
- width = availableSize.width * firstHalf / (firstHalf + imageHalf);
- height = availableSize.height;
- } else {
- width = availableSize.width;
- height = availableSize.height * firstHalf / (firstHalf + imageHalf);
- }
-
- final side = Container(
- height: spec.image.height,
- width: spec.image.width,
- alignment: spec.image.alignment,
- decoration: BoxDecoration(
- image: DecorationImage(
- image: getImageProvider(
- context: context,
- url: src,
- targetSize: Size(
- width,
- height,
- ),
- ),
- centerSlice: spec.image.centerSlice,
- repeat: spec.image.repeat ?? ImageRepeat.noRepeat,
- filterQuality: spec.image.filterQuality ?? FilterQuality.low,
- fit: boxFit,
- ),
- ),
- );
-
- return buildSplitSlide(side);
- }
-}
-
-class TwoColumnSlideBuilder extends SlideBuilder {
- const TwoColumnSlideBuilder({required super.config, super.key});
-
- @override
- Widget build(BuildContext context) {
- final options = config.contentOptions ?? const ContentOptions();
- final alignment = options.alignment;
-
- return Container(
- alignment: alignment.toAlignment(),
- child: Row(
- children: [
- buildContentSection(config.left),
- buildContentSection(config.right),
- ],
- ),
- );
- }
-}
-
-class TwoColumnHeaderSlideBuilder extends SlideBuilder {
- const TwoColumnHeaderSlideBuilder({required super.config, super.key});
-
- @override
- Widget build(BuildContext context) {
- final options = config.contentOptions ?? const ContentOptions();
- final alignment = options.alignment;
- final flex = options.flex;
-
- final header = config.header;
-
- final left = config.left;
- final right = config.right;
- return Column(
- children: [
- Expanded(
- flex: header.options.flex,
- child: Row(
- children: [
- buildContentSection((
- content: header.content,
- options: options.merge(header.options),
- )),
- ],
- ),
- ),
- Expanded(
- flex: flex,
- child: Container(
- alignment: alignment.toAlignment(),
- child: Row(
- children: [
- buildContentSection((
- content: left.content,
- options: options.merge(left.options),
- )),
- buildContentSection((
- content: right.content,
- options: options.merge(right.options),
- )),
- ],
- ),
- ),
- ),
- ],
- );
- }
-}
diff --git a/lib/helpers/measure_size.dart b/lib/helpers/measure_size.dart
deleted file mode 100644
index 52eab9cb..00000000
--- a/lib/helpers/measure_size.dart
+++ /dev/null
@@ -1,113 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter/rendering.dart';
-
-import '../components/atoms/slide_view.dart';
-
-typedef OnWidgetSizeChange = void Function(Size size);
-
-class MeasureSizeRenderObject extends RenderProxyBox {
- Size? oldSize;
- OnWidgetSizeChange onChange;
-
- MeasureSizeRenderObject(this.onChange);
-
- @override
- void performLayout() {
- super.performLayout();
-
- Size newSize = child!.size;
- if (oldSize == newSize) return;
-
- oldSize = newSize;
- WidgetsBinding.instance.addPostFrameCallback((_) {
- onChange(newSize);
- });
- }
-}
-
-class MeasureSize extends SingleChildRenderObjectWidget {
- final OnWidgetSizeChange onChange;
-
- const MeasureSize({
- super.key,
- required this.onChange,
- required Widget super.child,
- });
-
- @override
- RenderObject createRenderObject(BuildContext context) {
- return MeasureSizeRenderObject(onChange);
- }
-
- @override
- void updateRenderObject(
- BuildContext context, covariant MeasureSizeRenderObject renderObject) {
- renderObject.onChange = onChange;
- }
-}
-
-class SlideConstraints extends StatefulWidget {
- final Widget Function(Size) builder;
-
- const SlideConstraints(
- this.builder, {
- super.key,
- });
-
- static BoxConstraints of(BuildContext context) {
- final provider =
- context.dependOnInheritedWidgetOfExactType();
- if (provider == null) {
- throw FlutterError('SlideConstraintsProvider not found in context');
- }
-
- return provider.constraints;
- }
-
- static Size sizeOf(BuildContext context) {
- final constraints = of(context);
- return Size(constraints.maxWidth, constraints.maxHeight);
- }
-
- @override
- // ignore: library_private_types_in_public_api
- _SlideConstraintsState createState() => _SlideConstraintsState();
-}
-
-class _SlideConstraintsState extends State {
- Size? _widgetSize;
-
- void _onWidgetSizeChange(Size size) {
- setState(() {
- _widgetSize = size;
- });
- }
-
- @override
- Widget build(BuildContext context) {
- return LayoutBuilder(
- builder: (
- BuildContext context,
- BoxConstraints constraints,
- ) {
- final size = _widgetSize == null ? constraints.biggest : _widgetSize!;
- final constraintSize = BoxConstraints(
- maxHeight: size.height,
- maxWidth: size.width,
- );
-
- return MeasureSize(
- onChange: _onWidgetSizeChange,
- child: SlideConstraintsProvider(
- constraints: constraintSize,
- child: Builder(
- builder: (context) {
- return widget.builder(size);
- },
- ),
- ),
- );
- },
- );
- }
-}
diff --git a/lib/helpers/theme.dart b/lib/helpers/theme.dart
deleted file mode 100644
index 5363a1f0..00000000
--- a/lib/helpers/theme.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-import 'package:flutter/material.dart';
-
-ThemeData get theme => ThemeData(
- colorScheme: ColorScheme.fromSeed(
- seedColor: Colors.cyan,
- error: Colors.red,
- onTertiary: Colors.orange,
- brightness: Brightness.dark,
- ),
- );
diff --git a/lib/helpers/utils.dart b/lib/helpers/utils.dart
deleted file mode 100644
index c5ce0801..00000000
--- a/lib/helpers/utils.dart
+++ /dev/null
@@ -1,140 +0,0 @@
-import 'dart:convert';
-
-import 'package:flutter/material.dart';
-import 'package:mix/mix.dart';
-import 'package:yaml/yaml.dart';
-
-Map converYamlToMap(String yamlString) {
- final yamlMap = loadYaml(yamlString) as YamlMap? ?? YamlMap();
-
- final yaml = jsonEncode(yamlMap);
-
- return jsonDecode(yaml);
-}
-
-/// Formats [json]
-String prettyJson(dynamic json) {
- var spaces = ' ' * 2;
- var encoder = JsonEncoder.withIndent(spaces);
- return encoder.convert(json);
-}
-
-BoxConstraints calculateConstraints(Size size, BoxSpec spec) {
- final padding = spec.padding ?? EdgeInsets.zero;
- final margin = spec.margin ?? EdgeInsets.zero;
-
- double horizontalBorder = 0.0;
- double verticalBorder = 0.0;
-
- if (spec.decoration is BoxDecoration) {
- final border = (spec.decoration as BoxDecoration).border;
- if (border != null) {
- horizontalBorder = border.dimensions.horizontal;
- verticalBorder = border.dimensions.vertical;
- }
- }
-
- final horizontalSpacing =
- padding.horizontal + margin.horizontal + horizontalBorder;
- final verticalSpacing = padding.vertical + margin.vertical + verticalBorder;
-
- return BoxConstraints(
- maxHeight: size.height - verticalSpacing,
- maxWidth: size.width - horizontalSpacing,
- );
-}
-
-({List added, List removed}) compareListChanges(
- List oldList,
- List newList,
-) {
- final added = [];
- final removed = [];
-
- final oldSet = oldList.toSet();
- final newSet = newList.toSet();
-
- for (final item in newList) {
- if (!oldSet.contains(item)) {
- added.add(item);
- }
- }
-
- for (final item in oldList) {
- if (!newSet.contains(item)) {
- removed.add(item);
- }
- }
-
- return (
- added: added,
- removed: removed,
- );
-}
-
-extension BuildContextExt on BuildContext {
- bool get isDarkMode => Theme.of(this).brightness == Brightness.dark;
- bool get isSmall => size.width < 600;
-
- Size get size => MediaQuery.sizeOf(this);
- bool get isMedium => size.width >= 600 && size.width < 1024;
-
- bool get isLarge => size.width >= 1024;
-
- bool get isExtraLarge => size.width >= 1440;
-
- bool get isMobileLandscape {
- return size.shortestSide < 600 && isLandscape;
- }
-
- bool get isLandscape =>
- MediaQuery.orientationOf(this) == Orientation.landscape;
-
- bool get isPortrait => MediaQuery.orientationOf(this) == Orientation.portrait;
-
- double get width => size.width;
- double get height => size.height;
-}
-
-/// Generates a short, unique identifier from a given string.
-/// This is needed as hashCode for strings is not guaranteed to be unique across different platforms
-///
-/// This function uses a hashing mechanism to transform the input string into
-/// a unique, 8-character identifier. It is useful for creating compact and
-/// unique keys for database entries, URLs, etc.
-///
-/// [valueToHash] is the string input that you want to convert into a hash ID.
-///
-/// Returns an 8-character string that represents the hashed ID.
-String shortHashId(String valueToHash) {
- // Define a string of possible characters that can appear in the output hash.
- const characters =
- 'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789';
-
- // Initialize hash to zero.
- int hash = 0;
-
- // Calculate the hash value from each character in the input string.
- for (int i = 0; i < valueToHash.length; i++) {
- int charIndex = characters.indexOf(valueToHash[i]);
- // Continue to next iteration if character is not found in the characters string.
- if (charIndex == -1) {
- continue;
- }
- // Update the hash value using the character's index and position.
- hash = (hash * 31 + charIndex + i) % 2147483647;
- }
-
- // Initialize the short ID as an empty string.
- String shortId = '';
- int base = characters.length;
- int remainingHash = hash;
-
- // Construct the short ID using the hash value.
- for (int i = 0; i < 8; i++) {
- shortId += characters[remainingHash % base];
- remainingHash = (remainingHash * 31 + hash) % 2147483647;
- }
-
- return shortId;
-}
diff --git a/lib/models/asset_model.dart b/lib/models/asset_model.dart
deleted file mode 100644
index dbde6e57..00000000
--- a/lib/models/asset_model.dart
+++ /dev/null
@@ -1,99 +0,0 @@
-import 'dart:io';
-
-import 'package:collection/collection.dart';
-import 'package:dart_mappable/dart_mappable.dart';
-import 'package:flutter/services.dart';
-import 'package:path/path.dart' as p;
-
-import '../helpers/mappers.dart';
-import '../helpers/utils.dart';
-import '../services/project_service.dart';
-import 'slide_model.dart';
-
-part 'asset_model.mapper.dart';
-
-@MappableEnum()
-enum AssetFileType {
- png,
- jpg,
- jpeg,
- gif,
- webp;
-
- static AssetFileType parse(String value) {
- return values.firstWhereOrNull((e) => e.name == value) ??
- (throw Exception('Invalid file type: $value'));
- }
-
- static AssetFileType? tryParse(String value) {
- return values.firstWhereOrNull((e) => value.startsWith(e.name));
- }
-
- bool isPng() => this == AssetFileType.png;
-
- bool isJpg() => this == AssetFileType.jpg || this == AssetFileType.jpeg;
-
- bool isGif() => this == AssetFileType.gif;
-}
-
-@MappableEnum()
-enum SlideAssetType {
- cached,
- thumb,
- mermaid;
-
- static SlideAssetType parse(String value) {
- return values.firstWhereOrNull((e) => e.name == value) ??
- (throw Exception('Invalid asset type: $value'));
- }
-
- static SlideAssetType? tryParse(String value) {
- return values.firstWhereOrNull((e) => value.startsWith(e.name));
- }
-}
-
-@MappableClass(
- includeCustomMappers: [
- FileMapper(),
- SizeMapper(),
- ],
-)
-final class SlideAsset with SlideAssetMappable {
- final File file;
- final Size dimensions;
-
- SlideAsset({
- required this.file,
- required this.dimensions,
- });
-
- String get extension => p.extension(file.path);
-
- bool get isPortrait => dimensions.height > dimensions.width;
-
- bool get isLandscape => !isPortrait;
-
- static File thumbnail(Slide slide) {
- return ProjectService.instance.buildAssetFile(
- '${slide.hashKey}.png',
- SlideAssetType.thumb,
- );
- }
-
- static File cached(String uri) {
- return ProjectService.instance.buildAssetFile(
- '${shortHashId(uri)}.png',
- SlideAssetType.cached,
- );
- }
-
- static File mermaid(String mermaidSyntax) {
- return ProjectService.instance.buildAssetFile(
- '${shortHashId(mermaidSyntax)}.png',
- SlideAssetType.mermaid,
- );
- }
-
- static const fromMap = SlideAssetMapper.fromMap;
- static const fromJson = SlideAssetMapper.fromJson;
-}
diff --git a/lib/providers/controller.dart b/lib/providers/controller.dart
deleted file mode 100644
index 25a45983..00000000
--- a/lib/providers/controller.dart
+++ /dev/null
@@ -1,157 +0,0 @@
-import 'dart:async';
-import 'dart:convert';
-
-import 'package:flutter/foundation.dart';
-import 'package:localstorage/localstorage.dart';
-import 'package:signals/signals_flutter.dart';
-
-import '../builder/slides_loader.dart';
-import '../helpers/constants.dart';
-import '../services/project_service.dart';
-import '../styles/style_util.dart';
-import '../superdeck.dart';
-
-final sdController = SDController.instance;
-
-class SDController {
- SDController._();
-
- static final instance = SDController._();
-
- final _data = futureSignal(SlidesLoader.instance.loadDeck);
-
- final style = signal(const Style.empty(), debugLabel: 'Style');
-
- late final loading = computed(() => _data.value is AsyncLoading);
-
- late final slides = computed(() => _data.value.value?.slides ?? []);
- late final assets = computed(() => _data.value.value?.assets ?? []);
-
- final examples = mapSignal({});
-
- late final error = computed(
- () {
- final data = _data.value;
- return data is AsyncError ? data.error : null;
- },
- );
-
- Future initialize({
- List examples = const [],
- Style? style,
- }) async {
- // Unsubscribe to listeners in case its a retry
- batch(() {
- this.style.value = defaultStyle.merge(style);
- this.examples.assign({for (var e in examples) e.name: e});
- });
-
- if (_data.isDone) {
- await _data.reload();
- } else {
- await _data.future;
- }
-
- if (kCanRunProcess) {
- SlidesLoader.instance.listen(_data.refresh);
- }
- }
-
- Future clearGenerated() async {
- await ProjectService.instance.clearGeneratedDir();
- _data.refresh();
- }
-
- void dispose() {
- style.dispose();
- error.dispose();
- assets.dispose();
- slides.dispose();
- _data.dispose();
- examples.dispose();
- }
-}
-
-class NavigationProvider {
- List? _cleanup;
- NavigationProvider._() {
- initialize();
- }
-
- static NavigationProvider get instance => _instance;
-
- static final _instance = NavigationProvider._();
-
- late final currentSlide = signal(0);
- late final sideIsOpen = signal(false);
- late final currentScreen = signal(0);
-
- void initialize() {
- currentSlide.value = _getItem('current-slide') ?? 0;
- sideIsOpen.value = _getItem('side-is-open') ?? false;
- currentScreen.value = _getItem('current-screen') ?? 0;
-
- _cleanup = [
- effect(() {
- _setItem('side-is-open', sideIsOpen.value);
- _setItem('current-slide', currentSlide.value);
- _setItem('current-screen', currentScreen.value);
- })
- ];
- }
-
- void toggleSide() {
- batch(() {
- if (sideIsOpen.value) {
- currentScreen.value = 0;
- }
- sideIsOpen.value = !sideIsOpen.peek();
- });
- }
-
- void goToSlide(int slide) {
- if (slide < 0 || slide >= sdController.slides.value.length) return;
- currentSlide.value = slide;
- }
-
- void nextSlide() {
- goToSlide(currentSlide.peek() + 1);
- }
-
- void previousSlide() {
- goToSlide(currentSlide.peek() - 1);
- }
-
- void goToScreen(int screen) {
- currentScreen.value = screen;
- }
-
- void _setItem(String key, T value) {
- localStorage.setItem(key, jsonEncode(value));
- }
-
- T? _getItem(String key) {
- final stringValue = localStorage.getItem(key);
- return stringValue == null ? null : jsonDecode(stringValue) as T;
- }
-
- void dispose() {
- currentSlide.dispose();
- sideIsOpen.dispose();
- _cleanup?.forEach((e) => e.call());
- }
-}
-
-extension ListSignalExtension on ListSignal {
- void assign(List value) {
- if (listEquals(peek(), value)) return;
- this.value = value;
- }
-}
-
-extension MapSignalExtension on MapSignal {
- void assign(Map value) {
- if (mapEquals(peek(), value)) return;
- this.value = value;
- }
-}
diff --git a/lib/providers/slide_provider.dart b/lib/providers/slide_provider.dart
deleted file mode 100644
index 58956371..00000000
--- a/lib/providers/slide_provider.dart
+++ /dev/null
@@ -1,94 +0,0 @@
-// Create a SlideProvider that extends an Inherited widget
-import 'package:flutter/material.dart';
-
-import '../models/asset_model.dart';
-import '../models/options_model.dart';
-import '../models/slide_model.dart';
-import '../styles/style_spec.dart';
-
-enum SlideProviderAspect {
- slide,
- spec,
- isSnapshot,
- examples,
- assets,
-}
-
-class SlideProvider extends InheritedModel {
- final Slide slide;
- final SlideSpec spec;
-
- // If slide is a snapshot for image generation
- final bool isSnapshot;
- final Map examples;
- final List assets;
-
- const SlideProvider({
- super.key,
- required this.slide,
- required this.spec,
- required this.isSnapshot,
- required this.examples,
- required this.assets,
- required super.child,
- });
-
- @override
- bool updateShouldNotify(covariant SlideProvider oldWidget) {
- return slide != oldWidget.slide || spec != oldWidget.spec;
- }
-
- static SlideProvider of(BuildContext context) {
- return context.dependOnInheritedWidgetOfExactType()!;
- }
-
- @override
- bool updateShouldNotifyDependent(
- covariant SlideProvider oldWidget,
- Set dependencies,
- ) {
- if (dependencies.contains(SlideProviderAspect.slide) &&
- slide != oldWidget.slide) {
- return true;
- }
- if (dependencies.contains(SlideProviderAspect.spec) &&
- spec != oldWidget.spec) {
- return true;
- }
-
- if (dependencies.contains(SlideProviderAspect.isSnapshot) &&
- isSnapshot != oldWidget.isSnapshot) {
- return true;
- }
- if (dependencies.contains(SlideProviderAspect.examples) &&
- examples != oldWidget.examples) {
- return true;
- }
- if (dependencies.contains(SlideProviderAspect.assets) &&
- assets != oldWidget.assets) {
- return true;
- }
- return false;
- }
-
- static Slide slideOf(BuildContext context) {
- return SlideProvider.of(context).slide;
- }
-
- static SlideSpec specOf(BuildContext context) {
- return SlideProvider.of(context).spec;
- }
-
- static bool isSnapshotOf(BuildContext context) {
- return SlideProvider.of(context).isSnapshot;
- }
-
- static List assetsOf(BuildContext context) {
- return SlideProvider.of(context).assets;
- }
-
-// TODO: only get notified if the individual example changes
- static Map examplesOf(BuildContext context) {
- return SlideProvider.of(context).examples;
- }
-}
diff --git a/lib/schema/schema_model.dart b/lib/schema/schema_model.dart
deleted file mode 100644
index 282711b0..00000000
--- a/lib/schema/schema_model.dart
+++ /dev/null
@@ -1,296 +0,0 @@
-import 'package:dart_mappable/dart_mappable.dart';
-
-import 'schema_values.dart';
-import 'validators.dart';
-
-part 'schema_model.mapper.dart';
-
-typedef JSON = Map;
-
-class SchemaValidationException implements Exception {
- final SchemaValidationResult result;
-
- const SchemaValidationException(this.result);
-}
-
-class SchemaError {
- const SchemaError._();
- static const unallowedAdditionalProperty = 'unnalowed_additional_property';
- static const enumViolated = 'enum_violated';
- static const requiredPropMissing = 'required_property_missing';
- static const invalidType = 'invalid_type';
- static const constraints = 'constraints';
- static const unknown = 'unknown';
-}
-
-@MappableClass()
-class SchemaValidationError with SchemaValidationErrorMappable {
- final String type;
- final String message;
- const SchemaValidationError({
- required this.type,
- required this.message,
- });
-
- const SchemaValidationError.unknown()
- : type = SchemaError.unknown,
- message = 'Unknown error';
-
- const SchemaValidationError.constraints(this.message)
- : type = SchemaError.constraints;
-
- const SchemaValidationError.unallowedAdditionalProperty(String property)
- : type = SchemaError.unallowedAdditionalProperty,
- message = 'Unallowed property: [$property]';
-
- const SchemaValidationError.enumViolated(
- String value, List possibleValues)
- : type = SchemaError.enumViolated,
- message = 'Wrong value: [$value] \n\n Possible values: $possibleValues';
-
- const SchemaValidationError.requiredPropMissing(String property)
- : type = SchemaError.requiredPropMissing,
- message = 'Missing prop: [$property]';
-
- const SchemaValidationError.invalidType(String value, String expectedType)
- : type = SchemaError.invalidType,
- message = 'Invalid type: [$expectedType] got [$value]';
-
- @override
- String toString() {
- return 'SchemaValidationError{type: $type, message: $message}';
- }
-}
-
-@MappableClass()
-class SchemaValidationResult with SchemaValidationResultMappable {
- final List key;
- final List errors;
-
- const SchemaValidationResult({
- required this.key,
- required this.errors,
- });
-
- const SchemaValidationResult.valid(this.key) : errors = const [];
-
- factory SchemaValidationResult.invalidType(
- List path,
- Object value,
- String expectedType,
- ) {
- return SchemaValidationResult(
- key: path,
- errors: [
- SchemaValidationError.invalidType(
- value.runtimeType.toString(),
- expectedType,
- )
- ],
- );
- }
-
- factory SchemaValidationResult.unallowedAdditionalProperty(
- List path, String property) {
- return SchemaValidationResult(
- key: path,
- errors: [SchemaValidationError.unallowedAdditionalProperty(property)],
- );
- }
-
- factory SchemaValidationResult.enumViolated(
- List path, String value, List possibleValues) {
- return SchemaValidationResult(
- key: path,
- errors: [SchemaValidationError.enumViolated(value, possibleValues)],
- );
- }
-
- factory SchemaValidationResult.requiredPropMissing(List path) {
- return SchemaValidationResult(
- key: path,
- errors: [SchemaValidationError.requiredPropMissing(path.last)],
- );
- }
-
- factory SchemaValidationResult.constraints(
- List path, String message) {
- return SchemaValidationResult(
- key: path,
- errors: [SchemaValidationError.constraints(message)],
- );
- }
-
- @override
- String toString() {
- return '${errors.isEmpty ? 'VALID' : 'INVALID'}${errors.isEmpty ? ', Errors: $errors' : ''}';
- }
-
- bool get isValid => errors.isEmpty;
-
- static const fromMap = SchemaValidationResultMapper.fromMap;
- static const fromJson = SchemaValidationResultMapper.fromJson;
-}
-
-class SchemaMap extends SchemaValue