diff --git a/android/app/build.gradle b/android/app/build.gradle index 6f170f7..04808da 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -44,7 +44,7 @@ android { defaultConfig { applicationId "ca.snoe.deedum" - minSdkVersion 16 + minSdkVersion flutter.minSdkVersion targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 3f1af43..a0f7705 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -6,7 +6,7 @@ additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> { SelectableText(widget.prompt), DecoratedBox( decoration: - BoxDecoration(color: _inputError ? Colors.deepOrange : null), + BoxDecoration(color: _inputError ? Colors.deepOrange : null), child: TextField( focusNode: focusNode, + maxLines: null, + keyboardType: TextInputType.multiline, controller: widget.searchController, onChanged: _inputChanged), ), diff --git a/lib/content.dart b/lib/content.dart index 8c9c41d..f0ac051 100644 --- a/lib/content.dart +++ b/lib/content.dart @@ -6,14 +6,17 @@ import 'package:deedum/contents/blockquote.dart'; import 'package:deedum/contents/heading.dart'; import 'package:deedum/contents/link.dart'; import 'package:deedum/contents/list_item.dart'; +import 'package:deedum/contents/pre_text.dart'; import 'package:deedum/contents/plain_text.dart'; import 'package:deedum/models/content_data.dart'; import 'package:deedum/parser.dart'; import 'package:deedum/shared.dart'; import 'package:extended_text/extended_text.dart'; import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'contents/ansi_pre_text.dart'; -const baseFontSize = 16.0; class Content extends StatefulWidget { const Content({ @@ -35,6 +38,21 @@ class Content extends StatefulWidget { class _ContentState extends State { var plainTextControls = false; + int ansiLevel = 1; + + @override + void initState() { + super.initState(); + changeAnsi(); + } + + changeAnsi() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + setState(() { + ansiLevel = int.parse(prefs.getString('ansiColors') ?? '0'); + }); + } + showControls(show) { setState(() { @@ -84,11 +102,11 @@ class _ContentState extends State { Widget groupsToWidget(List groups) { return Column( mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ for (final r in groups) if (r["type"] == "pre") - PreText(actualText: r["data"], maxLine: r["maxLine"]) + getPreTextWidget(r) else if (r["type"] == "header") Heading( content: r["data"], @@ -108,112 +126,15 @@ class _ContentState extends State { PlainText(content: r["data"]) ]); } -} - -class PreText extends StatefulWidget { - final String actualText; - final int maxLine; - - const PreText({Key? key, required this.actualText, required this.maxLine}) - : super(key: key); - - @override - _PreTextState createState() => _PreTextState(); -} - -class _PreTextState extends State { - int? _scale; - - @override - initState() { - super.initState(); - if (widget.maxLine > 120) { - _scale = -1; - } - if (widget.maxLine <= 32) { - _scale = 32; - } - } - - setScale(s) { - setState(() { - _scale = s; - }); - } - - @override - Widget build(BuildContext context) { - var availableWidth = MediaQuery.of(context).size.width - (padding * 2); - Widget fit; - if (_scale == -1) { - fit = SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: ExtendedText( - widget.actualText, - selectionEnabled: true, - style: const TextStyle( - fontFamily: "DejaVu Sans Mono", - fontSize: baseFontSize, - ), - )); - } else if (_scale != null) { - double size = (TextPainter( - text: TextSpan( - text: "0".padLeft(_scale!), - style: const TextStyle( - fontFamily: "DejaVu Sans Mono", - fontSize: baseFontSize, - ), - ), - maxLines: 1, - textScaleFactor: MediaQuery.of(context).textScaleFactor, - textDirection: TextDirection.ltr) - ..layout()) - .size - .width; - - fit = FittedBox( - fit: BoxFit.fill, - child: SizedBox( - child: ExtendedText(widget.actualText, - softWrap: true, - style: const TextStyle( - fontFamily: "DejaVu Sans Mono", fontSize: baseFontSize), - selectionEnabled: true), - width: size)); - } else { - fit = FittedBox( - child: ExtendedText(widget.actualText, - selectionEnabled: true, - style: const TextStyle( - fontFamily: "DejaVu Sans Mono", fontSize: baseFontSize)), - fit: BoxFit.fill); + getPreTextWidget(r) { + changeAnsi(); + if (ansiLevel == 0){ + return PreText(actualText: r["data"], maxLine: r["maxLine"]); } - var res = GestureDetector( - onDoubleTap: () async { - var picked = await showMenu( - items: [ - CheckedPopupMenuItem( - checked: _scale == null, - value: null, - child: const Text("Fit")) - ] + - [-1, 32, 40, 64, 80, 120] - .map((i) => CheckedPopupMenuItem( - checked: _scale == i, - value: i, - child: Text("${i == -1 ? "Scroll" : i}"))) - .toList(), - context: context, - position: const RelativeRect.fromLTRB(20, 100, 400, 200), - ); - setScale(picked); - }, - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: SizedBox(width: availableWidth, child: fit))); + return AnsiPreText(actualText: r["data"], + maxLine: r["maxLine"], + ansiLevel: ansiLevel); - return res; } } diff --git a/lib/contents/ansi_pre_text.dart b/lib/contents/ansi_pre_text.dart new file mode 100644 index 0000000..80e8f6d --- /dev/null +++ b/lib/contents/ansi_pre_text.dart @@ -0,0 +1,187 @@ +import 'package:flutter/material.dart'; +import 'package:terminal_color_parser/terminal_color_parser.dart'; + +import 'package:deedum/shared.dart'; + +import 'package:deedum/models/ansi_color.dart'; + + +class AnsiPreText extends StatefulWidget { + final String actualText; + final int maxLine; + final int ansiLevel; + + + const AnsiPreText({Key? key, required this.actualText, required this.maxLine, required this.ansiLevel}) + : super(key: key); + + @override + _AnsiPreTextState createState() => _AnsiPreTextState(); +} + +class _AnsiPreTextState extends State { + int? _scale; + + Color hexToColor(String code) { + return Color(int.parse(code.substring(1, 7), radix: 16) + 0xFF000000); + } + + @override + initState() { + super.initState(); + if (widget.maxLine > 120) { + _scale = -1; + } + if (widget.maxLine <= 32) { + _scale = 32; + } + } + + + setScale(s) { + setState(() { + _scale = s; + }); + } + + @override + Widget build(BuildContext context) { + var availableWidth = MediaQuery.of(context).size.width - (padding * 2); + + final coloredText = ColorParser(widget.actualText).parse(); + final spans = []; + + for (final token in coloredText) { + + DefaultTextStyle defaultStyle = DefaultTextStyle.of(context); + TextStyle style = TextStyle( + fontFamily: "DejaVu Sans Mono", + ); + if (widget.ansiLevel >2) { + style = TextStyle( + fontFamily: "DejaVu Sans Mono", + decoration: token.underline + ? TextDecoration.underline + : TextDecoration.none, + fontWeight: token.bold ? FontWeight.bold : FontWeight.normal, + ); + } + style = style.merge(defaultStyle.style); + + if (token.hasFgColor) { + if ( token.xterm256) { // get from the 256 colors "model" + style = style.merge(TextStyle( + color: hexToColor(AnsiColor.colors[token.fgColor]))); + }else{//8/16 colors + style= style.merge( TextStyle( + color: hexToColor(AnsiColor.simpleColors[token.fgColor].toString()))); + } + }else if (token.rgbFg){ + int r,g,b; + var rgbColors = token.rgbFgColor.split(';'); + r = int.parse(rgbColors[0]); + g = int.parse(rgbColors[1]); + b = int.parse(rgbColors[2]); + style= style.merge( TextStyle( + color: Color.fromRGBO(r, g, b, 1) + )); + } + if (widget.ansiLevel >1) { + if (token.hasBgColor) { + if (token.xterm256) { // get from the 256 colors "model" + style = style.merge(TextStyle( + backgroundColor: hexToColor( + AnsiColor.colors[token.bgColor].toString()))); + } + else { //8/16 colors + style = style.merge(TextStyle( + backgroundColor: hexToColor( + AnsiColor.simpleColors[token.bgColor].toString()))); + } + } else if (token.rgbBg) { + int r, g, b; + var rgbColors = token.rgbBgColor.split(';'); + r = int.parse(rgbColors[0]); + g = int.parse(rgbColors[1]); + b = int.parse(rgbColors[2]); + style = style.merge(TextStyle( + backgroundColor: Color.fromRGBO(r, g, b, 1) + )); + } + } + // + var span = TextSpan(text: token.text, + style: style + ); + + spans.add(span); + } + TextSpan container = TextSpan(children: spans); + RichText finalText = RichText(text: container); + + Widget fit; + + if (_scale == -1) { + fit = SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: finalText); + } else if (_scale != null) { + double size = (TextPainter( + text: TextSpan( + text: "0".padLeft(_scale!), + style: const TextStyle( + fontFamily: "DejaVu Sans Mono", + fontSize: baseFontSize, + ), + ), + maxLines: 1, + textScaleFactor: MediaQuery.of(context).textScaleFactor, + textDirection: TextDirection.ltr) + ..layout()) + .size + .width; + + fit = FittedBox( + fit: BoxFit.fill, + child: SizedBox( + width: size, + child: finalText + ) + // ExtendedText(widget.actualText, + // softWrap: true, + // style: const TextStyle( + // fontFamily: "DejaVu Sans Mono", fontSize: baseFontSize), + // ), + ); + } else { + fit = FittedBox( + child: finalText, + fit: BoxFit.fill); + } + var res = GestureDetector( + onDoubleTap: () async { + var picked = await showMenu( + items: [ + CheckedPopupMenuItem( + checked: _scale == null, + value: null, + child: const Text("Fit")) + ] + + [-1, 32, 40, 64, 80, 120] + .map((i) => CheckedPopupMenuItem( + checked: _scale == i, + value: i, + child: Text("${i == -1 ? "Scroll" : i}"))) + .toList(), + context: context, + position: const RelativeRect.fromLTRB(20, 100, 400, 200), + ); + setScale(picked); + }, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: SizedBox(width: availableWidth, child: fit))); + + return res; + } +} diff --git a/lib/contents/pre_text.dart b/lib/contents/pre_text.dart new file mode 100644 index 0000000..9a2456f --- /dev/null +++ b/lib/contents/pre_text.dart @@ -0,0 +1,117 @@ + +import 'package:extended_text/extended_text.dart'; +import 'package:flutter/material.dart'; + +import 'package:deedum/shared.dart'; + + +class PreText extends StatefulWidget { + final String actualText; + final int maxLine; + + const PreText({Key? key, required this.actualText, required this.maxLine}) + : super(key: key); + + @override + _PreTextState createState() => _PreTextState(); +} + +class _PreTextState extends State { + int? _scale; + + @override + initState() { + super.initState(); + if (widget.maxLine > 120) { + _scale = -1; + } + if (widget.maxLine <= 32) { + _scale = 32; + } + } + + setScale(s) { + setState(() { + _scale = s; + }); + } + + @override + Widget build(BuildContext context) { + var availableWidth = MediaQuery.of(context).size.width - (padding * 2); + Widget fit; + + if (_scale == -1) { + fit = SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: ExtendedText( + widget.actualText, + selectionEnabled: true, + style: const TextStyle( + fontFamily: "DejaVu Sans Mono", + fontSize: baseFontSize, + ), + )); + } else if (_scale != null) { + //selectionEnabled: true, //not sure if this is allowed here + double size = (TextPainter( + text: TextSpan( + text: "0".padLeft(_scale!), + style: const TextStyle( + fontFamily: "DejaVu Sans Mono", + fontSize: baseFontSize, + ), + ), + maxLines: 1, + textScaleFactor: MediaQuery.of(context).textScaleFactor, + textDirection: TextDirection.ltr) + ..layout()) + .size + .width; + + fit = FittedBox( + fit: BoxFit.fill, + child: SizedBox( + width: size, + child: ExtendedText(widget.actualText, + selectionEnabled: true, + softWrap: true, + style: const TextStyle( + fontFamily: "DejaVu Sans Mono", fontSize: baseFontSize), + ), + )); + } else { + fit = FittedBox( + child: ExtendedText(widget.actualText, + selectionEnabled: true, + style: const TextStyle( + fontFamily: "DejaVu Sans Mono", fontSize: baseFontSize)), + fit: BoxFit.fill); + } + var res = GestureDetector( + onDoubleTap: () async { + var picked = await showMenu( + items: [ + CheckedPopupMenuItem( + checked: _scale == null, + value: null, + child: const Text("Fit")) + ] + + [-1, 32, 40, 64, 80, 120] + .map((i) => CheckedPopupMenuItem( + checked: _scale == i, + value: i, + child: Text("${i == -1 ? "Scroll" : i}"))) + .toList(), + context: context, + position: const RelativeRect.fromLTRB(20, 100, 400, 200), + ); + setScale(picked); + }, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: SizedBox(width: availableWidth, child: fit))); + + return res; + } +} \ No newline at end of file diff --git a/lib/directory/settings.dart b/lib/directory/settings.dart index 1b32981..dd85107 100644 --- a/lib/directory/settings.dart +++ b/lib/directory/settings.dart @@ -1,10 +1,9 @@ -import 'dart:developer'; - import 'package:deedum/models/app_state.dart'; import 'package:deedum/directory/directory_element.dart'; import 'package:deedum/shared.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:toggle_switch/toggle_switch.dart'; class Settings extends DirectoryElement { static final homepageKey = GlobalKey(); @@ -15,13 +14,13 @@ class Settings extends DirectoryElement { @override String get title => [ - "███████╗███████╗████████╗████████╗██╗███╗ ██╗ ██████╗ ███████╗", - "██╔════╝██╔════╝╚══██╔══╝╚══██╔══╝██║████╗ ██║██╔════╝ ██╔════╝", - "███████╗█████╗ ██║ ██║ ██║██╔██╗ ██║██║ ███╗███████╗", - "╚════██║██╔══╝ ██║ ██║ ██║██║╚██╗██║██║ ██║╚════██║", - "███████║███████╗ ██║ ██║ ██║██║ ╚████║╚██████╔╝███████║", - "╚══════╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚══════╝" - ].join("\n"); + "███████╗███████╗████████╗████████╗██╗███╗ ██╗ ██████╗ ███████╗", + "██╔════╝██╔════╝╚══██╔══╝╚══██╔══╝██║████╗ ██║██╔════╝ ██╔════╝", + "███████╗█████╗ ██║ ██║ ██║██╔██╗ ██║██║ ███╗███████╗", + "╚════██║██╔══╝ ██║ ██║ ██║██║╚██╗██║██║ ██║╚════██║", + "███████║███████╗ ██║ ██║ ██║██║ ╚████║╚██████╔╝███████║", + "╚══════╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚══════╝" + ].join("\n"); @override Widget build(BuildContext context, WidgetRef ref) { @@ -31,39 +30,57 @@ class Settings extends DirectoryElement { padding: const EdgeInsets.all(8), child: (Form( key: homepageKey, - child: Column(children: [ - TextFormField( - keyboardType: TextInputType.url, - decoration: const InputDecoration(labelText: "Homepage"), - initialValue: removeGeminiScheme(appState.settings["homepage"]), - validator: validateGeminiURL, - onFieldSubmitted: validateAndSaveForm, - onSaved: (s) { - if (s!.trim().isNotEmpty) { - s = prefixSchema(s); - } - appState.onSaveSettings("homepage", s); - }, - ), - TextFormField( - keyboardType: TextInputType.url, - decoration: const InputDecoration( - labelText: "Search Engine (page that takes input)"), - initialValue: removeGeminiScheme(appState.settings["search"]), - validator: validateGeminiURL, - onFieldSubmitted: validateAndSaveForm, - onSaved: (s) { - s = prefixSchema(s!); - appState.onSaveSettings("search", s); - }, - ), - ]))), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + TextFormField( + keyboardType: TextInputType.url, + decoration: const InputDecoration(labelText: "Homepage"), + initialValue: removeGeminiScheme(appState.settings["homepage"]), + validator: validateGeminiURL, + onFieldSubmitted: validateAndSaveForm, + onSaved: (s) { + if (s!.trim().isNotEmpty) { + s = prefixSchema(s); + } + appState.onSaveSettings("homepage", s); + }, + ), + TextFormField( + keyboardType: TextInputType.url, + decoration: const InputDecoration( + labelText: "Search Engine (page that takes input)"), + initialValue: removeGeminiScheme(appState.settings["search"]), + validator: validateGeminiURL, + onFieldSubmitted: validateAndSaveForm, + onSaved: (s) { + s = prefixSchema(s!); + appState.onSaveSettings("search", s); + }, + ), + Text("Ansi format codes"), + ToggleSwitch( + isVertical: true, + initialLabelIndex: int.parse(appState.settings["ansiColors"]), + labels: ['Don\'t interpret ANSI colors','Interpret Foreground Colors','Interpret FG and BG Colors','Interpret all ANSI Style codes'], + // labels: ['No','FG','FG & BG','All'], + onToggle: (index) { + appState.onSaveSettings("ansiColors", index.toString()); + }, + ), + // SwitchListTile(title: const Text( "Use Ansi Color"), value: bool.parse(appState.settings["ansiColors"]), onChanged: (ansi) { + // appState.onSaveSettings("ansiColors", ansi.toString()); + // //TODO: update in real time + // }) + + ]))), ) ]; return SingleChildScrollView(child: Column(children: children)); } + String prefixSchema(String s) { if (!s.startsWith("gemini://") && !s.startsWith("about:")) { s = "gemini://" + s; diff --git a/lib/models/ansi_color.dart b/lib/models/ansi_color.dart new file mode 100644 index 0000000..8e495e5 --- /dev/null +++ b/lib/models/ansi_color.dart @@ -0,0 +1,1597 @@ + +abstract class AnsiColor{ + + // 8-16 color basic support + static final Map simpleColors = { + //fg + 30 : "#000000", + 31 : "#aa0000", + 32 : "#00aa00", + 33 : "#aa5500", + 34 : "#0000aa", + 35 : "#aa00aa", + 36 : "#00aaaa", + 37 : "#aaaaaa", + //bg + 40 : "#000000", + 41 : "#aa0000", + 42 : "#00aa00", + 43 : "#aa5500", + 44 : "#0000aa", + 45 : "#aa00aa", + 46 : "#00aaaa", + 47 : "#aaaaaa", + + //fg "bright" + 90 : "#555555", + 91 : "#ff5555", + 92 : "#55ff55", + 93 : "#ffff55", + 94 : "#5555ff", + 95 : "#ff55ff", + 96 : "#55ffff", + 97 : "#ffffff", + //bg "bright" + 100 : "#555555", + 101 : "#ff5555", + 102 : "#55ff55", + 103 : "#ffff55", + 104 : "#5555ff", + 105 : "#ff55ff", + 106 : "#55ffff", + 107 : "#ffffff", + }; + + + + + // a list of colors taken from + // https://github.com/woodward/color_palette/blob/main/lib/color_palette/data/ansi_color_codes.json + // maybe i'll add the full json in a comment at the bottom, just in case + + //meant to be retrieved by array[index] where index is the ansi code + static final colors = [ + "#000000", + "#800000", + "#008000", + "#808000", + "#000080", + "#800080", + "#008080", + "#c0c0c0", + "#808080", + "#ff0000", + "#00ff00", + "#ffff00", + "#0000ff", + "#ff00ff", + "#00ffff", + "#ffffff", + "#000000", + "#00005f", + "#000087", + "#0000af", + "#0000d7", + "#0000ff", + "#005f00", + "#005f5f", + "#005f87", + "#005faf", + "#005fd7", + "#005fff", + "#008700", + "#00875f", + "#008787", + "#0087af", + "#0087d7", + "#0087ff", + "#00af00", + "#00af5f", + "#00af87", + "#00afaf", + "#00afd7", + "#00afff", + "#00d700", + "#00d75f", + "#00d787", + "#00d7af", + "#00d7d7", + "#00d7ff", + "#00ff00", + "#00ff5f", + "#00ff87", + "#00ffaf", + "#00ffd7", + "#00ffff", + "#5f0000", + "#5f005f", + "#5f0087", + "#5f00af", + "#5f00d7", + "#5f00ff", + "#5f5f00", + "#5f5f5f", + "#5f5f87", + "#5f5faf", + "#5f5fd7", + "#5f5fff", + "#5f8700", + "#5f875f", + "#5f8787", + "#5f87af", + "#5f87d7", + "#5f87ff", + "#5faf00", + "#5faf5f", + "#5faf87", + "#5fafaf", + "#5fafd7", + "#5fafff", + "#5fd700", + "#5fd75f", + "#5fd787", + "#5fd7af", + "#5fd7d7", + "#5fd7ff", + "#5fff00", + "#5fff5f", + "#5fff87", + "#5fffaf", + "#5fffd7", + "#5fffff", + "#870000", + "#87005f", + "#870087", + "#8700af", + "#8700d7", + "#8700ff", + "#875f00", + "#875f5f", + "#875f87", + "#875faf", + "#875fd7", + "#875fff", + "#878700", + "#87875f", + "#878787", + "#8787af", + "#8787d7", + "#8787ff", + "#87af00", + "#87af5f", + "#87af87", + "#87afaf", + "#87afd7", + "#87afff", + "#87d700", + "#87d75f", + "#87d787", + "#87d7af", + "#87d7d7", + "#87d7ff", + "#87ff00", + "#87ff5f", + "#87ff87", + "#87ffaf", + "#87ffd7", + "#87ffff", + "#af0000", + "#af005f", + "#af0087", + "#af00af", + "#af00d7", + "#af00ff", + "#af5f00", + "#af5f5f", + "#af5f87", + "#af5faf", + "#af5fd7", + "#af5fff", + "#af8700", + "#af875f", + "#af8787", + "#af87af", + "#af87d7", + "#af87ff", + "#afaf00", + "#afaf5f", + "#afaf87", + "#afafaf", + "#afafd7", + "#afafff", + "#afd700", + "#afd75f", + "#afd787", + "#afd7af", + "#afd7d7", + "#afd7ff", + "#afff00", + "#afff5f", + "#afff87", + "#afffaf", + "#afffd7", + "#afffff", + "#d70000", + "#d7005f", + "#d70087", + "#d700af", + "#d700d7", + "#d700ff", + "#d75f00", + "#d75f5f", + "#d75f87", + "#d75faf", + "#d75fd7", + "#d75fff", + "#d78700", + "#d7875f", + "#d78787", + "#d787af", + "#d787d7", + "#d787ff", + "#d7af00", + "#d7af5f", + "#d7af87", + "#d7afaf", + "#d7afd7", + "#d7afff", + "#d7d700", + "#d7d75f", + "#d7d787", + "#d7d7af", + "#d7d7d7", + "#d7d7ff", + "#d7ff00", + "#d7ff5f", + "#d7ff87", + "#d7ffaf", + "#d7ffd7", + "#d7ffff", + "#ff0000", + "#ff005f", + "#ff0087", + "#ff00af", + "#ff00d7", + "#ff00ff", + "#ff5f00", + "#ff5f5f", + "#ff5f87", + "#ff5faf", + "#ff5fd7", + "#ff5fff", + "#ff8700", + "#ff875f", + "#ff8787", + "#ff87af", + "#ff87d7", + "#ff87ff", + "#ffaf00", + "#ffaf5f", + "#ffaf87", + "#ffafaf", + "#ffafd7", + "#ffafff", + "#ffd700", + "#ffd75f", + "#ffd787", + "#ffd7af", + "#ffd7d7", + "#ffd7ff", + "#ffff00", + "#ffff5f", + "#ffff87", + "#ffffaf", + "#ffffd7", + "#ffffff", + "#080808", + "#121212", + "#1c1c1c", + "#262626", + "#303030", + "#3a3a3a", + "#444444", + "#4e4e4e", + "#585858", + "#626262", + "#6c6c6c", + "#767676", + "#808080", + "#8a8a8a", + "#949494", + "#9e9e9e", + "#a8a8a8", + "#b2b2b2", + "#bcbcbc", + "#c6c6c6", + "#d0d0d0", + "#dadada", + "#e4e4e4", + "#eeeeee", + ]; + +} + +/* +[ + { + "code": 0, + "hex": "000000", + "rgb": [0, 0, 0] + }, + { + "code": 1, + "hex": "800000", + "rgb": [128, 0, 0] + }, + { + "code": 2, + "hex": "008000", + "rgb": [0, 128, 0] + }, + { + "code": 3, + "hex": "808000", + "rgb": [128, 128, 0] + }, + { + "code": 4, + "hex": "000080", + "rgb": [0, 0, 128] + }, + { + "code": 5, + "hex": "800080", + "rgb": [128, 0, 128] + }, + { + "code": 6, + "hex": "008080", + "rgb": [0, 128, 128] + }, + { + "code": 7, + "hex": "c0c0c0", + "rgb": [192, 192, 192] + }, + { + "code": 8, + "hex": "808080", + "rgb": [128, 128, 128] + }, + { + "code": 9, + "hex": "ff0000", + "rgb": [255, 0, 0] + }, + { + "code": 10, + "hex": "00ff00", + "rgb": [0, 255, 0] + }, + { + "code": 11, + "hex": "ffff00", + "rgb": [255, 255, 0] + }, + { + "code": 12, + "hex": "0000ff", + "rgb": [0, 0, 255] + }, + { + "code": 13, + "hex": "ff00ff", + "rgb": [255, 0, 255] + }, + { + "code": 14, + "hex": "00ffff", + "rgb": [0, 255, 255] + }, + { + "code": 15, + "hex": "ffffff", + "rgb": [255, 255, 255] + }, + { + "code": 16, + "hex": "000000", + "rgb": [0, 0, 0] + }, + { + "code": 17, + "hex": "00005f", + "rgb": [0, 0, 95] + }, + { + "code": 18, + "hex": "000087", + "rgb": [0, 0, 135] + }, + { + "code": 19, + "hex": "0000af", + "rgb": [0, 0, 175] + }, + { + "code": 20, + "hex": "0000d7", + "rgb": [0, 0, 215] + }, + { + "code": 21, + "hex": "0000ff", + "rgb": [0, 0, 255] + }, + { + "code": 22, + "hex": "005f00", + "rgb": [0, 95, 0] + }, + { + "code": 23, + "hex": "005f5f", + "rgb": [0, 95, 95] + }, + { + "code": 24, + "hex": "005f87", + "rgb": [0, 95, 135] + }, + { + "code": 25, + "hex": "005faf", + "rgb": [0, 95, 175] + }, + { + "code": 26, + "hex": "005fd7", + "rgb": [0, 95, 215] + }, + { + "code": 27, + "hex": "005fff", + "rgb": [0, 95, 255] + }, + { + "code": 28, + "hex": "008700", + "rgb": [0, 135, 0] + }, + { + "code": 29, + "hex": "00875f", + "rgb": [0, 135, 95] + }, + { + "code": 30, + "hex": "008787", + "rgb": [0, 135, 135] + }, + { + "code": 31, + "hex": "0087af", + "rgb": [0, 135, 175] + }, + { + "code": 32, + "hex": "0087d7", + "rgb": [0, 135, 215] + }, + { + "code": 33, + "hex": "0087ff", + "rgb": [0, 135, 255] + }, + { + "code": 34, + "hex": "00af00", + "rgb": [0, 175, 0] + }, + { + "code": 35, + "hex": "00af5f", + "rgb": [0, 175, 95] + }, + { + "code": 36, + "hex": "00af87", + "rgb": [0, 175, 135] + }, + { + "code": 37, + "hex": "00afaf", + "rgb": [0, 175, 175] + }, + { + "code": 38, + "hex": "00afd7", + "rgb": [0, 175, 215] + }, + { + "code": 39, + "hex": "00afff", + "rgb": [0, 175, 255] + }, + { + "code": 40, + "hex": "00d700", + "rgb": [0, 215, 0] + }, + { + "code": 41, + "hex": "00d75f", + "rgb": [0, 215, 95] + }, + { + "code": 42, + "hex": "00d787", + "rgb": [0, 215, 135] + }, + { + "code": 43, + "hex": "00d7af", + "rgb": [0, 215, 175] + }, + { + "code": 44, + "hex": "00d7d7", + "rgb": [0, 215, 215] + }, + { + "code": 45, + "hex": "00d7ff", + "rgb": [0, 215, 255] + }, + { + "code": 46, + "hex": "00ff00", + "rgb": [0, 255, 0] + }, + { + "code": 47, + "hex": "00ff5f", + "rgb": [0, 255, 95] + }, + { + "code": 48, + "hex": "00ff87", + "rgb": [0, 255, 135] + }, + { + "code": 49, + "hex": "00ffaf", + "rgb": [0, 255, 175] + }, + { + "code": 50, + "hex": "00ffd7", + "rgb": [0, 255, 215] + }, + { + "code": 51, + "hex": "00ffff", + "rgb": [0, 255, 255] + }, + { + "code": 52, + "hex": "5f0000", + "rgb": [95, 0, 0] + }, + { + "code": 53, + "hex": "5f005f", + "rgb": [95, 0, 95] + }, + { + "code": 54, + "hex": "5f0087", + "rgb": [95, 0, 135] + }, + { + "code": 55, + "hex": "5f00af", + "rgb": [95, 0, 175] + }, + { + "code": 56, + "hex": "5f00d7", + "rgb": [95, 0, 215] + }, + { + "code": 57, + "hex": "5f00ff", + "rgb": [95, 0, 255] + }, + { + "code": 58, + "hex": "5f5f00", + "rgb": [95, 95, 0] + }, + { + "code": 59, + "hex": "5f5f5f", + "rgb": [95, 95, 95] + }, + { + "code": 60, + "hex": "5f5f87", + "rgb": [95, 95, 135] + }, + { + "code": 61, + "hex": "5f5faf", + "rgb": [95, 95, 175] + }, + { + "code": 62, + "hex": "5f5fd7", + "rgb": [95, 95, 215] + }, + { + "code": 63, + "hex": "5f5fff", + "rgb": [95, 95, 255] + }, + { + "code": 64, + "hex": "5f8700", + "rgb": [95, 135, 0] + }, + { + "code": 65, + "hex": "5f875f", + "rgb": [95, 135, 95] + }, + { + "code": 66, + "hex": "5f8787", + "rgb": [95, 135, 135] + }, + { + "code": 67, + "hex": "5f87af", + "rgb": [95, 135, 175] + }, + { + "code": 68, + "hex": "5f87d7", + "rgb": [95, 135, 215] + }, + { + "code": 69, + "hex": "5f87ff", + "rgb": [95, 135, 255] + }, + { + "code": 70, + "hex": "5faf00", + "rgb": [95, 175, 0] + }, + { + "code": 71, + "hex": "5faf5f", + "rgb": [95, 175, 95] + }, + { + "code": 72, + "hex": "5faf87", + "rgb": [95, 175, 135] + }, + { + "code": 73, + "hex": "5fafaf", + "rgb": [95, 175, 175] + }, + { + "code": 74, + "hex": "5fafd7", + "rgb": [95, 175, 215] + }, + { + "code": 75, + "hex": "5fafff", + "rgb": [95, 175, 255] + }, + { + "code": 76, + "hex": "5fd700", + "rgb": [95, 215, 0] + }, + { + "code": 77, + "hex": "5fd75f", + "rgb": [95, 215, 95] + }, + { + "code": 78, + "hex": "5fd787", + "rgb": [95, 215, 135] + }, + { + "code": 79, + "hex": "5fd7af", + "rgb": [95, 215, 175] + }, + { + "code": 80, + "hex": "5fd7d7", + "rgb": [95, 215, 215] + }, + { + "code": 81, + "hex": "5fd7ff", + "rgb": [95, 215, 255] + }, + { + "code": 82, + "hex": "5fff00", + "rgb": [95, 255, 0] + }, + { + "code": 83, + "hex": "5fff5f", + "rgb": [95, 255, 95] + }, + { + "code": 84, + "hex": "5fff87", + "rgb": [95, 255, 135] + }, + { + "code": 85, + "hex": "5fffaf", + "rgb": [95, 255, 175] + }, + { + "code": 86, + "hex": "5fffd7", + "rgb": [95, 255, 215] + }, + { + "code": 87, + "hex": "5fffff", + "rgb": [95, 255, 255] + }, + { + "code": 88, + "hex": "870000", + "rgb": [135, 0, 0] + }, + { + "code": 89, + "hex": "87005f", + "rgb": [135, 0, 95] + }, + { + "code": 90, + "hex": "870087", + "rgb": [135, 0, 135] + }, + { + "code": 91, + "hex": "8700af", + "rgb": [135, 0, 175] + }, + { + "code": 92, + "hex": "8700d7", + "rgb": [135, 0, 215] + }, + { + "code": 93, + "hex": "8700ff", + "rgb": [135, 0, 255] + }, + { + "code": 94, + "hex": "875f00", + "rgb": [135, 95, 0] + }, + { + "code": 95, + "hex": "875f5f", + "rgb": [135, 95, 95] + }, + { + "code": 96, + "hex": "875f87", + "rgb": [135, 95, 135] + }, + { + "code": 97, + "hex": "875faf", + "rgb": [135, 95, 175] + }, + { + "code": 98, + "hex": "875fd7", + "rgb": [135, 95, 215] + }, + { + "code": 99, + "hex": "875fff", + "rgb": [135, 95, 255] + }, + { + "code": 100, + "hex": "878700", + "rgb": [135, 135, 0] + }, + { + "code": 101, + "hex": "87875f", + "rgb": [135, 135, 95] + }, + { + "code": 102, + "hex": "878787", + "rgb": [135, 135, 135] + }, + { + "code": 103, + "hex": "8787af", + "rgb": [135, 135, 175] + }, + { + "code": 104, + "hex": "8787d7", + "rgb": [135, 135, 215] + }, + { + "code": 105, + "hex": "8787ff", + "rgb": [135, 135, 255] + }, + { + "code": 106, + "hex": "87af00", + "rgb": [135, 175, 0] + }, + { + "code": 107, + "hex": "87af5f", + "rgb": [135, 175, 95] + }, + { + "code": 108, + "hex": "87af87", + "rgb": [135, 175, 135] + }, + { + "code": 109, + "hex": "87afaf", + "rgb": [135, 175, 175] + }, + { + "code": 110, + "hex": "87afd7", + "rgb": [135, 175, 215] + }, + { + "code": 111, + "hex": "87afff", + "rgb": [135, 175, 255] + }, + { + "code": 112, + "hex": "87d700", + "rgb": [135, 215, 0] + }, + { + "code": 113, + "hex": "87d75f", + "rgb": [135, 215, 95] + }, + { + "code": 114, + "hex": "87d787", + "rgb": [135, 215, 135] + }, + { + "code": 115, + "hex": "87d7af", + "rgb": [135, 215, 175] + }, + { + "code": 116, + "hex": "87d7d7", + "rgb": [135, 215, 215] + }, + { + "code": 117, + "hex": "87d7ff", + "rgb": [135, 215, 255] + }, + { + "code": 118, + "hex": "87ff00", + "rgb": [135, 255, 0] + }, + { + "code": 119, + "hex": "87ff5f", + "rgb": [135, 255, 95] + }, + { + "code": 120, + "hex": "87ff87", + "rgb": [135, 255, 135] + }, + { + "code": 121, + "hex": "87ffaf", + "rgb": [135, 255, 175] + }, + { + "code": 122, + "hex": "87ffd7", + "rgb": [135, 255, 215] + }, + { + "code": 123, + "hex": "87ffff", + "rgb": [135, 255, 255] + }, + { + "code": 124, + "hex": "af0000", + "rgb": [175, 0, 0] + }, + { + "code": 125, + "hex": "af005f", + "rgb": [175, 0, 95] + }, + { + "code": 126, + "hex": "af0087", + "rgb": [175, 0, 135] + }, + { + "code": 127, + "hex": "af00af", + "rgb": [175, 0, 175] + }, + { + "code": 128, + "hex": "af00d7", + "rgb": [175, 0, 215] + }, + { + "code": 129, + "hex": "af00ff", + "rgb": [175, 0, 255] + }, + { + "code": 130, + "hex": "af5f00", + "rgb": [175, 95, 0] + }, + { + "code": 131, + "hex": "af5f5f", + "rgb": [175, 95, 95] + }, + { + "code": 132, + "hex": "af5f87", + "rgb": [175, 95, 135] + }, + { + "code": 133, + "hex": "af5faf", + "rgb": [175, 95, 175] + }, + { + "code": 134, + "hex": "af5fd7", + "rgb": [175, 95, 215] + }, + { + "code": 135, + "hex": "af5fff", + "rgb": [175, 95, 255] + }, + { + "code": 136, + "hex": "af8700", + "rgb": [175, 135, 0] + }, + { + "code": 137, + "hex": "af875f", + "rgb": [175, 135, 95] + }, + { + "code": 138, + "hex": "af8787", + "rgb": [175, 135, 135] + }, + { + "code": 139, + "hex": "af87af", + "rgb": [175, 135, 175] + }, + { + "code": 140, + "hex": "af87d7", + "rgb": [175, 135, 215] + }, + { + "code": 141, + "hex": "af87ff", + "rgb": [175, 135, 255] + }, + { + "code": 142, + "hex": "afaf00", + "rgb": [175, 175, 0] + }, + { + "code": 143, + "hex": "afaf5f", + "rgb": [175, 175, 95] + }, + { + "code": 144, + "hex": "afaf87", + "rgb": [175, 175, 135] + }, + { + "code": 145, + "hex": "afafaf", + "rgb": [175, 175, 175] + }, + { + "code": 146, + "hex": "afafd7", + "rgb": [175, 175, 215] + }, + { + "code": 147, + "hex": "afafff", + "rgb": [175, 175, 255] + }, + { + "code": 148, + "hex": "afd700", + "rgb": [175, 215, 0] + }, + { + "code": 149, + "hex": "afd75f", + "rgb": [175, 215, 95] + }, + { + "code": 150, + "hex": "afd787", + "rgb": [175, 215, 135] + }, + { + "code": 151, + "hex": "afd7af", + "rgb": [175, 215, 175] + }, + { + "code": 152, + "hex": "afd7d7", + "rgb": [175, 215, 215] + }, + { + "code": 153, + "hex": "afd7ff", + "rgb": [175, 215, 255] + }, + { + "code": 154, + "hex": "afff00", + "rgb": [175, 255, 0] + }, + { + "code": 155, + "hex": "afff5f", + "rgb": [175, 255, 95] + }, + { + "code": 156, + "hex": "afff87", + "rgb": [175, 255, 135] + }, + { + "code": 157, + "hex": "afffaf", + "rgb": [175, 255, 175] + }, + { + "code": 158, + "hex": "afffd7", + "rgb": [175, 255, 215] + }, + { + "code": 159, + "hex": "afffff", + "rgb": [175, 255, 255] + }, + { + "code": 160, + "hex": "d70000", + "rgb": [215, 0, 0] + }, + { + "code": 161, + "hex": "d7005f", + "rgb": [215, 0, 95] + }, + { + "code": 162, + "hex": "d70087", + "rgb": [215, 0, 135] + }, + { + "code": 163, + "hex": "d700af", + "rgb": [215, 0, 175] + }, + { + "code": 164, + "hex": "d700d7", + "rgb": [215, 0, 215] + }, + { + "code": 165, + "hex": "d700ff", + "rgb": [215, 0, 255] + }, + { + "code": 166, + "hex": "d75f00", + "rgb": [215, 95, 0] + }, + { + "code": 167, + "hex": "d75f5f", + "rgb": [215, 95, 95] + }, + { + "code": 168, + "hex": "d75f87", + "rgb": [215, 95, 135] + }, + { + "code": 169, + "hex": "d75faf", + "rgb": [215, 95, 175] + }, + { + "code": 170, + "hex": "d75fd7", + "rgb": [215, 95, 215] + }, + { + "code": 171, + "hex": "d75fff", + "rgb": [215, 95, 255] + }, + { + "code": 172, + "hex": "d78700", + "rgb": [215, 135, 0] + }, + { + "code": 173, + "hex": "d7875f", + "rgb": [215, 135, 95] + }, + { + "code": 174, + "hex": "d78787", + "rgb": [215, 135, 135] + }, + { + "code": 175, + "hex": "d787af", + "rgb": [215, 135, 175] + }, + { + "code": 176, + "hex": "d787d7", + "rgb": [215, 135, 215] + }, + { + "code": 177, + "hex": "d787ff", + "rgb": [215, 135, 255] + }, + { + "code": 178, + "hex": "d7af00", + "rgb": [215, 175, 0] + }, + { + "code": 179, + "hex": "d7af5f", + "rgb": [215, 175, 95] + }, + { + "code": 180, + "hex": "d7af87", + "rgb": [215, 175, 135] + }, + { + "code": 181, + "hex": "d7afaf", + "rgb": [215, 175, 175] + }, + { + "code": 182, + "hex": "d7afd7", + "rgb": [215, 175, 215] + }, + { + "code": 183, + "hex": "d7afff", + "rgb": [215, 175, 255] + }, + { + "code": 184, + "hex": "d7d700", + "rgb": [215, 215, 0] + }, + { + "code": 185, + "hex": "d7d75f", + "rgb": [215, 215, 95] + }, + { + "code": 186, + "hex": "d7d787", + "rgb": [215, 215, 135] + }, + { + "code": 187, + "hex": "d7d7af", + "rgb": [215, 215, 175] + }, + { + "code": 188, + "hex": "d7d7d7", + "rgb": [215, 215, 215] + }, + { + "code": 189, + "hex": "d7d7ff", + "rgb": [215, 215, 255] + }, + { + "code": 190, + "hex": "d7ff00", + "rgb": [215, 255, 0] + }, + { + "code": 191, + "hex": "d7ff5f", + "rgb": [215, 255, 95] + }, + { + "code": 192, + "hex": "d7ff87", + "rgb": [215, 255, 135] + }, + { + "code": 193, + "hex": "d7ffaf", + "rgb": [215, 255, 175] + }, + { + "code": 194, + "hex": "d7ffd7", + "rgb": [215, 255, 215] + }, + { + "code": 195, + "hex": "d7ffff", + "rgb": [215, 255, 255] + }, + { + "code": 196, + "hex": "ff0000", + "rgb": [255, 0, 0] + }, + { + "code": 197, + "hex": "ff005f", + "rgb": [255, 0, 95] + }, + { + "code": 198, + "hex": "ff0087", + "rgb": [255, 0, 135] + }, + { + "code": 199, + "hex": "ff00af", + "rgb": [255, 0, 175] + }, + { + "code": 200, + "hex": "ff00d7", + "rgb": [255, 0, 215] + }, + { + "code": 201, + "hex": "ff00ff", + "rgb": [255, 0, 255] + }, + { + "code": 202, + "hex": "ff5f00", + "rgb": [255, 95, 0] + }, + { + "code": 203, + "hex": "ff5f5f", + "rgb": [255, 95, 95] + }, + { + "code": 204, + "hex": "ff5f87", + "rgb": [255, 95, 135] + }, + { + "code": 205, + "hex": "ff5faf", + "rgb": [255, 95, 175] + }, + { + "code": 206, + "hex": "ff5fd7", + "rgb": [255, 95, 215] + }, + { + "code": 207, + "hex": "ff5fff", + "rgb": [255, 95, 255] + }, + { + "code": 208, + "hex": "ff8700", + "rgb": [255, 135, 0] + }, + { + "code": 209, + "hex": "ff875f", + "rgb": [255, 135, 95] + }, + { + "code": 210, + "hex": "ff8787", + "rgb": [255, 135, 135] + }, + { + "code": 211, + "hex": "ff87af", + "rgb": [255, 135, 175] + }, + { + "code": 212, + "hex": "ff87d7", + "rgb": [255, 135, 215] + }, + { + "code": 213, + "hex": "ff87ff", + "rgb": [255, 135, 255] + }, + { + "code": 214, + "hex": "ffaf00", + "rgb": [255, 175, 0] + }, + { + "code": 215, + "hex": "ffaf5f", + "rgb": [255, 175, 95] + }, + { + "code": 216, + "hex": "ffaf87", + "rgb": [255, 175, 135] + }, + { + "code": 217, + "hex": "ffafaf", + "rgb": [255, 175, 175] + }, + { + "code": 218, + "hex": "ffafd7", + "rgb": [255, 175, 215] + }, + { + "code": 219, + "hex": "ffafff", + "rgb": [255, 175, 255] + }, + { + "code": 220, + "hex": "ffd700", + "rgb": [255, 215, 0] + }, + { + "code": 221, + "hex": "ffd75f", + "rgb": [255, 215, 95] + }, + { + "code": 222, + "hex": "ffd787", + "rgb": [255, 215, 135] + }, + { + "code": 223, + "hex": "ffd7af", + "rgb": [255, 215, 175] + }, + { + "code": 224, + "hex": "ffd7d7", + "rgb": [255, 215, 215] + }, + { + "code": 225, + "hex": "ffd7ff", + "rgb": [255, 215, 255] + }, + { + "code": 226, + "hex": "ffff00", + "rgb": [255, 255, 0] + }, + { + "code": 227, + "hex": "ffff5f", + "rgb": [255, 255, 95] + }, + { + "code": 228, + "hex": "ffff87", + "rgb": [255, 255, 135] + }, + { + "code": 229, + "hex": "ffffaf", + "rgb": [255, 255, 175] + }, + { + "code": 230, + "hex": "ffffd7", + "rgb": [255, 255, 215] + }, + { + "code": 231, + "hex": "ffffff", + "rgb": [255, 255, 255] + }, + { + "code": 232, + "hex": "080808", + "rgb": [8, 8, 8] + }, + { + "code": 233, + "hex": "121212", + "rgb": [18, 18, 18] + }, + { + "code": 234, + "hex": "1c1c1c", + "rgb": [28, 28, 28] + }, + { + "code": 235, + "hex": "262626", + "rgb": [38, 38, 38] + }, + { + "code": 236, + "hex": "303030", + "rgb": [48, 48, 48] + }, + { + "code": 237, + "hex": "3a3a3a", + "rgb": [58, 58, 58] + }, + { + "code": 238, + "hex": "444444", + "rgb": [68, 68, 68] + }, + { + "code": 239, + "hex": "4e4e4e", + "rgb": [78, 78, 78] + }, + { + "code": 240, + "hex": "585858", + "rgb": [88, 88, 88] + }, + { + "code": 241, + "hex": "626262", + "rgb": [98, 98, 98] + }, + { + "code": 242, + "hex": "6c6c6c", + "rgb": [108, 108, 108] + }, + { + "code": 243, + "hex": "767676", + "rgb": [118, 118, 118] + }, + { + "code": 244, + "hex": "808080", + "rgb": [128, 128, 128] + }, + { + "code": 245, + "hex": "8a8a8a", + "rgb": [138, 138, 138] + }, + { + "code": 246, + "hex": "949494", + "rgb": [148, 148, 148] + }, + { + "code": 247, + "hex": "9e9e9e", + "rgb": [158, 158, 158] + }, + { + "code": 248, + "hex": "a8a8a8", + "rgb": [168, 168, 168] + }, + { + "code": 249, + "hex": "b2b2b2", + "rgb": [178, 178, 178] + }, + { + "code": 250, + "hex": "bcbcbc", + "rgb": [188, 188, 188] + }, + { + "code": 251, + "hex": "c6c6c6", + "rgb": [198, 198, 198] + }, + { + "code": 252, + "hex": "d0d0d0", + "rgb": [208, 208, 208] + }, + { + "code": 253, + "hex": "dadada", + "rgb": [218, 218, 218] + }, + { + "code": 254, + "hex": "e4e4e4", + "rgb": [228, 228, 228] + }, + { + "code": 255, + "hex": "eeeeee", + "rgb": [238, 238, 238] + } +] + */ \ No newline at end of file diff --git a/lib/models/app_state.dart b/lib/models/app_state.dart index 03e6d14..046eee6 100644 --- a/lib/models/app_state.dart +++ b/lib/models/app_state.dart @@ -39,6 +39,7 @@ class AppState with ChangeNotifier { settings = { "homepage": (prefs.getString("homepage")), + "ansiColors": (prefs.getString("ansiColors") ?? "0"), "search": (prefs.getString("search") ?? "gemini://geminispace.info/search") }; diff --git a/lib/next/app.dart b/lib/next/app.dart index c9aeed5..4fbd6b4 100644 --- a/lib/next/app.dart +++ b/lib/next/app.dart @@ -62,6 +62,13 @@ class Home extends ConsumerWidget { List actions = []; actions = [ + IconButton( + icon: Icon(Icons.refresh), + color: Colors.black, + onPressed: () =>{ + appState.onLocation(appState.currentUri()) + } + ), IconButton( icon: SizedBox( width: 23, diff --git a/lib/next/browser_tab.dart b/lib/next/browser_tab.dart index d441060..1a97f33 100644 --- a/lib/next/browser_tab.dart +++ b/lib/next/browser_tab.dart @@ -6,6 +6,7 @@ import 'package:deedum/content.dart'; import 'package:deedum/models/content_data.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:deedum/shared.dart'; class BrowserTab extends ConsumerWidget { const BrowserTab( diff --git a/lib/shared.dart b/lib/shared.dart index a992267..a6a58db 100644 --- a/lib/shared.dart +++ b/lib/shared.dart @@ -40,6 +40,7 @@ Uri resolveLink(Uri currentUri, String link) { } double get padding => 25.0; +const baseFontSize = 16.0; extension CollectionUtil on Iterable { Iterable mapIndexed(E Function(int index, T item) transform) sync* { @@ -231,7 +232,7 @@ String emojiEncode(String base64String) { String qrEncode(Uint8List der) { final qrCode = - QrCode.fromUint8List(data: der, errorCorrectLevel: QrErrorCorrectLevel.L); + QrCode.fromUint8List(data: der, errorCorrectLevel: QrErrorCorrectLevel.L); final qrImage = QrImage(qrCode); var result = ""; diff --git a/pubspec.lock b/pubspec.lock index d77aa6e..0e71b11 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,21 +7,21 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.1.6" + version: "3.4.2" args: dependency: transitive description: name: args url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" + version: "2.3.1" asn1lib: dependency: "direct main" description: name: asn1lib url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "1.4.1" async: dependency: transitive description: @@ -77,28 +77,28 @@ packages: name: convert url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.1.0" crypto: dependency: "direct main" description: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" crypto_keys: dependency: transitive description: name: crypto_keys url: "https://pub.dartlang.org" source: hosted - version: "0.3.0" + version: "0.3.0+1" cupertino_icons: dependency: "direct main" description: name: cupertino_icons url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "1.0.5" extended_text: dependency: "direct main" description: @@ -126,21 +126,21 @@ packages: name: fast_immutable_collections url: "https://pub.dartlang.org" source: hosted - version: "7.1.2" + version: "7.4.3" ffi: dependency: transitive description: name: ffi url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.2.1" file: dependency: transitive description: name: file url: "https://pub.dartlang.org" source: hosted - version: "6.1.2" + version: "6.1.4" flutter: dependency: "direct main" description: flutter @@ -152,7 +152,7 @@ packages: name: flutter_launcher_icons url: "https://pub.dartlang.org" source: hosted - version: "0.9.2" + version: "0.9.3" flutter_lints: dependency: "direct dev" description: @@ -166,14 +166,14 @@ packages: name: flutter_markdown url: "https://pub.dartlang.org" source: hosted - version: "0.6.9" + version: "0.6.10" flutter_riverpod: dependency: "direct main" description: name: flutter_riverpod url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "1.0.3+1" flutter_test: dependency: "direct dev" description: flutter @@ -190,21 +190,21 @@ packages: name: http url: "https://pub.dartlang.org" source: hosted - version: "0.13.4" + version: "0.13.5" http_parser: dependency: transitive description: name: http_parser url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "4.0.2" image: dependency: transitive description: name: image url: "https://pub.dartlang.org" source: hosted - version: "3.1.0" + version: "3.1.3" intl: dependency: "direct main" description: @@ -225,7 +225,7 @@ packages: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "4.6.0" lints: dependency: transitive description: @@ -239,14 +239,14 @@ packages: name: logging url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" + version: "1.1.0" markdown: dependency: transitive description: name: markdown url: "https://pub.dartlang.org" source: hosted - version: "4.0.1" + version: "5.0.0" matcher: dependency: transitive description: @@ -281,21 +281,21 @@ packages: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.1.4" + version: "2.1.7" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.4" path_provider_windows: dependency: transitive description: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "2.0.7" petitparser: dependency: transitive description: @@ -316,14 +316,14 @@ packages: name: plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.1.3" pointycastle: dependency: transitive description: name: pointycastle url: "https://pub.dartlang.org" source: hosted - version: "3.5.0" + version: "3.7.3" process: dependency: transitive description: @@ -337,7 +337,7 @@ packages: name: provider url: "https://pub.dartlang.org" source: hosted - version: "6.0.2" + version: "6.1.2" punycode: dependency: "direct main" description: @@ -358,70 +358,70 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "3.0.1+1" + version: "3.1.0" riverpod: dependency: "direct main" description: name: riverpod url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "1.0.3+1" shared_preferences: dependency: "direct main" description: name: shared_preferences url: "https://pub.dartlang.org" source: hosted - version: "2.0.11" + version: "2.0.15" shared_preferences_android: dependency: transitive description: name: shared_preferences_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.9" + version: "2.0.12" shared_preferences_ios: dependency: transitive description: name: shared_preferences_ios url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.1.1" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.1.1" shared_preferences_macos: dependency: transitive description: name: shared_preferences_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.4" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0" shared_preferences_web: dependency: transitive description: name: shared_preferences_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.4" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.1.1" sky_engine: dependency: transitive description: flutter @@ -440,14 +440,14 @@ packages: name: sqflite url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.2" sqflite_common: dependency: transitive description: name: sqflite_common url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.2.0" stack_trace: dependency: transitive description: @@ -461,7 +461,7 @@ packages: name: state_notifier url: "https://pub.dartlang.org" source: hosted - version: "0.7.1" + version: "0.7.2+1" stream_channel: dependency: transitive description: @@ -489,7 +489,7 @@ packages: name: synchronized url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.0+3" term_glyph: dependency: transitive description: @@ -497,6 +497,15 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.0" + terminal_color_parser: + dependency: "direct main" + description: + path: "." + ref: "feature/rgb_support" + resolved-ref: adba5db59b8ddbe202af61e40247f92063597590 + url: "https://github.com/jchaves/terminal_color_parser_dart" + source: git + version: "0.7.0" test_api: dependency: transitive description: @@ -504,6 +513,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.3" + toggle_switch: + dependency: "direct main" + description: + name: toggle_switch + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" typed_data: dependency: transitive description: @@ -538,56 +554,56 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.0.17" + version: "6.1.5" url_launcher_android: dependency: transitive description: name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "6.0.13" + version: "6.0.17" url_launcher_ios: dependency: transitive description: name: url_launcher_ios url: "https://pub.dartlang.org" source: hosted - version: "6.0.13" + version: "6.0.17" url_launcher_linux: dependency: transitive description: name: url_launcher_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "3.0.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "3.0.1" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "2.1.0" url_launcher_web: dependency: transitive description: name: url_launcher_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.0.6" url_launcher_windows: dependency: transitive description: name: url_launcher_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "3.0.1" vector_math: dependency: transitive description: @@ -601,7 +617,7 @@ packages: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.3.3" + version: "2.5.2" x509: dependency: "direct main" description: @@ -617,7 +633,7 @@ packages: name: xdg_directories url: "https://pub.dartlang.org" source: hosted - version: "0.2.0" + version: "0.2.0+3" xml: dependency: transitive description: @@ -631,7 +647,7 @@ packages: name: yaml url: "https://pub.dartlang.org" source: hosted - version: "3.1.0" + version: "3.1.1" sdks: - dart: ">=2.15.0 <3.0.0" + dart: ">=2.15.1 <3.0.0" flutter: ">=2.8.0" diff --git a/pubspec.yaml b/pubspec.yaml index ac42f34..c17c6f6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -47,6 +47,11 @@ dependencies: riverpod: ^1.0.3 fast_immutable_collections: ^7.1.2 flutter_riverpod: ^1.0.3 + toggle_switch: 2.0.1 + terminal_color_parser: + git: + url: https://github.com/jchaves/terminal_color_parser_dart + ref: feature/rgb_support dev_dependencies: flutter_test: