From e4a288eb522fe1eda54c7b3ef3eb959abbfa2d92 Mon Sep 17 00:00:00 2001 From: Kai O'Reilly Date: Thu, 22 Jun 2023 21:57:28 -0700 Subject: [PATCH] started using Ruby and Jekyll directly, changed theme, added more information, other improvements --- .gitignore | 5 + 404.html | 25 ++ Gemfile | 36 +++ Gemfile.lock | 269 +++++++++++++++++++ _config.yml | 62 ++++- _posts/2023-06-22-welcome-to-jekyll.markdown | 29 ++ about.markdown | 18 ++ assets/css/style.scss | 11 - assets/main.scss | 35 +++ gettingstarted.md | 52 ++++ index.md | 8 + install.md | 29 ++ 12 files changed, 564 insertions(+), 15 deletions(-) create mode 100644 .gitignore create mode 100644 404.html create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 _posts/2023-06-22-welcome-to-jekyll.markdown create mode 100644 about.markdown delete mode 100644 assets/css/style.scss create mode 100644 assets/main.scss create mode 100644 gettingstarted.md create mode 100644 install.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f40fbd8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +_site +.sass-cache +.jekyll-cache +.jekyll-metadata +vendor diff --git a/404.html b/404.html new file mode 100644 index 0000000..086a5c9 --- /dev/null +++ b/404.html @@ -0,0 +1,25 @@ +--- +permalink: /404.html +layout: default +--- + + + +
+

404

+ +

Page not found :(

+

The requested page could not be found.

+
diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..a55c70e --- /dev/null +++ b/Gemfile @@ -0,0 +1,36 @@ +source "https://rubygems.org" +# Hello! This is where you manage which Jekyll version is used to run. +# When you want to use a different version, change it below, save the +# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: +# +# bundle exec jekyll serve +# +# This will help ensure the proper Jekyll version is running. +# Happy Jekylling! +# gem "jekyll", "~> 4.3.2" +gem "github-pages", "~> 228", group: :jekyll_plugins +# This is the default theme for new Jekyll sites. You may change this to anything you like. +gem "minima", "~> 2.5" +# If you want to use GitHub Pages, remove the "gem "jekyll"" above and +# uncomment the line below. To upgrade, run `bundle update github-pages`. +# gem "github-pages", group: :jekyll_plugins +# If you have any plugins, put them here! +group :jekyll_plugins do + gem "jekyll-feed", "~> 0.12" +end + +# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem +# and associated library. +platforms :mingw, :x64_mingw, :mswin, :jruby do + gem "tzinfo", ">= 1", "< 3" + gem "tzinfo-data" +end + +# Performance-booster for watching directories on Windows +gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin] + +# Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds since newer versions of the gem +# do not have a Java counterpart. +gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby] + +gem "webrick", "~> 1.8" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..cc62c15 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,269 @@ +GEM + remote: https://rubygems.org/ + specs: + activesupport (7.0.5) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + addressable (2.8.4) + public_suffix (>= 2.0.2, < 6.0) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.11.1) + colorator (1.1.0) + commonmarker (0.23.9) + concurrent-ruby (1.2.2) + dnsruby (1.70.0) + simpleidn (~> 0.2.1) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + ethon (0.16.0) + ffi (>= 1.15.0) + eventmachine (1.2.7) + execjs (2.8.1) + faraday (2.7.7) + faraday-net_http (>= 2.0, < 3.1) + ruby2_keywords (>= 0.0.4) + faraday-net_http (3.0.2) + ffi (1.15.5) + forwardable-extended (2.6.0) + gemoji (3.0.1) + github-pages (228) + github-pages-health-check (= 1.17.9) + jekyll (= 3.9.3) + jekyll-avatar (= 0.7.0) + jekyll-coffeescript (= 1.1.1) + jekyll-commonmark-ghpages (= 0.4.0) + jekyll-default-layout (= 0.1.4) + jekyll-feed (= 0.15.1) + jekyll-gist (= 1.5.0) + jekyll-github-metadata (= 2.13.0) + jekyll-include-cache (= 0.2.1) + jekyll-mentions (= 1.6.0) + jekyll-optional-front-matter (= 0.3.2) + jekyll-paginate (= 1.1.0) + jekyll-readme-index (= 0.3.0) + jekyll-redirect-from (= 0.16.0) + jekyll-relative-links (= 0.6.1) + jekyll-remote-theme (= 0.4.3) + jekyll-sass-converter (= 1.5.2) + jekyll-seo-tag (= 2.8.0) + jekyll-sitemap (= 1.4.0) + jekyll-swiss (= 1.0.0) + jekyll-theme-architect (= 0.2.0) + jekyll-theme-cayman (= 0.2.0) + jekyll-theme-dinky (= 0.2.0) + jekyll-theme-hacker (= 0.2.0) + jekyll-theme-leap-day (= 0.2.0) + jekyll-theme-merlot (= 0.2.0) + jekyll-theme-midnight (= 0.2.0) + jekyll-theme-minimal (= 0.2.0) + jekyll-theme-modernist (= 0.2.0) + jekyll-theme-primer (= 0.6.0) + jekyll-theme-slate (= 0.2.0) + jekyll-theme-tactile (= 0.2.0) + jekyll-theme-time-machine (= 0.2.0) + jekyll-titles-from-headings (= 0.5.3) + jemoji (= 0.12.0) + kramdown (= 2.3.2) + kramdown-parser-gfm (= 1.1.0) + liquid (= 4.0.4) + mercenary (~> 0.3) + minima (= 2.5.1) + nokogiri (>= 1.13.6, < 2.0) + rouge (= 3.26.0) + terminal-table (~> 1.4) + github-pages-health-check (1.17.9) + addressable (~> 2.3) + dnsruby (~> 1.60) + octokit (~> 4.0) + public_suffix (>= 3.0, < 5.0) + typhoeus (~> 1.3) + html-pipeline (2.14.3) + activesupport (>= 2) + nokogiri (>= 1.4) + http_parser.rb (0.8.0) + i18n (1.14.1) + concurrent-ruby (~> 1.0) + jekyll (3.9.3) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (>= 0.7, < 2) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (>= 1.17, < 3) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + jekyll-avatar (0.7.0) + jekyll (>= 3.0, < 5.0) + jekyll-coffeescript (1.1.1) + coffee-script (~> 2.2) + coffee-script-source (~> 1.11.1) + jekyll-commonmark (1.4.0) + commonmarker (~> 0.22) + jekyll-commonmark-ghpages (0.4.0) + commonmarker (~> 0.23.7) + jekyll (~> 3.9.0) + jekyll-commonmark (~> 1.4.0) + rouge (>= 2.0, < 5.0) + jekyll-default-layout (0.1.4) + jekyll (~> 3.0) + jekyll-feed (0.15.1) + jekyll (>= 3.7, < 5.0) + jekyll-gist (1.5.0) + octokit (~> 4.2) + jekyll-github-metadata (2.13.0) + jekyll (>= 3.4, < 5.0) + octokit (~> 4.0, != 4.4.0) + jekyll-include-cache (0.2.1) + jekyll (>= 3.7, < 5.0) + jekyll-mentions (1.6.0) + html-pipeline (~> 2.3) + jekyll (>= 3.7, < 5.0) + jekyll-optional-front-matter (0.3.2) + jekyll (>= 3.0, < 5.0) + jekyll-paginate (1.1.0) + jekyll-readme-index (0.3.0) + jekyll (>= 3.0, < 5.0) + jekyll-redirect-from (0.16.0) + jekyll (>= 3.3, < 5.0) + jekyll-relative-links (0.6.1) + jekyll (>= 3.3, < 5.0) + jekyll-remote-theme (0.4.3) + addressable (~> 2.0) + jekyll (>= 3.5, < 5.0) + jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) + rubyzip (>= 1.3.0, < 3.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) + jekyll-seo-tag (2.8.0) + jekyll (>= 3.8, < 5.0) + jekyll-sitemap (1.4.0) + jekyll (>= 3.7, < 5.0) + jekyll-swiss (1.0.0) + jekyll-theme-architect (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-cayman (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-dinky (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-hacker (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-leap-day (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-merlot (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-midnight (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-minimal (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-modernist (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-primer (0.6.0) + jekyll (> 3.5, < 5.0) + jekyll-github-metadata (~> 2.9) + jekyll-seo-tag (~> 2.0) + jekyll-theme-slate (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-tactile (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-time-machine (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-titles-from-headings (0.5.3) + jekyll (>= 3.3, < 5.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + jemoji (0.12.0) + gemoji (~> 3.0) + html-pipeline (~> 2.2) + jekyll (>= 3.0, < 5.0) + kramdown (2.3.2) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.4) + listen (3.8.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.3.6) + minima (2.5.1) + jekyll (>= 3.5, < 5.0) + jekyll-feed (~> 0.9) + jekyll-seo-tag (~> 2.1) + minitest (5.18.1) + nokogiri (1.15.2-x64-mingw-ucrt) + racc (~> 1.4) + octokit (4.25.1) + faraday (>= 1, < 3) + sawyer (~> 0.9) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (4.0.7) + racc (1.7.1) + rb-fsevent (0.11.2) + rb-inotify (0.10.1) + ffi (~> 1.0) + rexml (3.2.5) + rouge (3.26.0) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) + safe_yaml (1.0.5) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sawyer (0.9.2) + addressable (>= 2.3.5) + faraday (>= 0.17.3, < 3) + simpleidn (0.2.1) + unf (~> 0.1.4) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + typhoeus (1.4.0) + ethon (>= 0.9.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + tzinfo-data (1.2023.3) + tzinfo (>= 1.0.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.8.2) + unicode-display_width (1.8.0) + wdm (0.1.1) + webrick (1.8.1) + +PLATFORMS + x64-mingw-ucrt + +DEPENDENCIES + github-pages (~> 228) + http_parser.rb (~> 0.6.0) + jekyll-feed (~> 0.12) + minima (~> 2.5) + tzinfo (>= 1, < 3) + tzinfo-data + wdm (~> 0.1.1) + webrick (~> 1.8) + +BUNDLED WITH + 2.4.14 diff --git a/_config.yml b/_config.yml index a668dbc..a27170f 100644 --- a/_config.yml +++ b/_config.yml @@ -1,4 +1,58 @@ -theme: jekyll-theme-cayman -title: GoKi & GoGi -description: Go-based Trees and Native Go 2D & 3D GUI -url: "https://GoKi.dev" +# Welcome to Jekyll! +# +# This config file is meant for settings that affect your whole blog, values +# which you are expected to set up once and rarely edit after that. If you find +# yourself editing this file very often, consider using Jekyll's data files +# feature for the data you need to update frequently. +# +# For technical reasons, this file is *NOT* reloaded automatically when you use +# 'bundle exec jekyll serve'. If you change this file, please restart the server process. +# +# If you need help with YAML syntax, here are some quick references for you: +# https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/#yaml +# https://learnxinyminutes.com/docs/yaml/ +# +# Site settings +# These are used to personalize your new site. If you look in the HTML files, +# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. +# You can create any custom variable you would like, and they will be accessible +# in the templates via {{ site.myvariable }}. + +title: GoKi +# email: your-email@example.com +description: >- # this means to ignore newlines until "baseurl:" + GoKi framework for Trees (Ki in Japanese) in Go language, including GoGi 2D & 3D GUI framework. +baseurl: "" # the subpath of your site, e.g. /blog +url: "https://goki.dev" # the base hostname & protocol for your site, e.g. http://example.com +# twitter_username: jekyllrb +github_username: goki + +# Build settings +theme: minima +plugins: + - jekyll-feed + + +header_pages: + - install.md + - gettingstarted.md + +# Exclude from processing. +# The following items will not be processed, by default. +# Any item listed under the `exclude:` key here will be automatically added to +# the internal "default list". +# +# Excluded items can be processed by explicitly listing the directories or +# their entries' file path in the `include:` list. +# +# exclude: +# - .sass-cache/ +# - .jekyll-cache/ +# - gemfiles/ +# - Gemfile +# - Gemfile.lock +# - node_modules/ +# - vendor/bundle/ +# - vendor/cache/ +# - vendor/gems/ +# - vendor/ruby/ diff --git a/_posts/2023-06-22-welcome-to-jekyll.markdown b/_posts/2023-06-22-welcome-to-jekyll.markdown new file mode 100644 index 0000000..e5d0e66 --- /dev/null +++ b/_posts/2023-06-22-welcome-to-jekyll.markdown @@ -0,0 +1,29 @@ +--- +layout: post +title: "Welcome to Jekyll!" +date: 2023-06-22 16:25:54 -0700 +categories: jekyll update +--- +You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated. + +Jekyll requires blog post files to be named according to the following format: + +`YEAR-MONTH-DAY-title.MARKUP` + +Where `YEAR` is a four-digit number, `MONTH` and `DAY` are both two-digit numbers, and `MARKUP` is the file extension representing the format used in the file. After that, include the necessary front matter. Take a look at the source for this post to get an idea about how it works. + +Jekyll also offers powerful support for code snippets: + +{% highlight ruby %} +def print_hi(name) + puts "Hi, #{name}" +end +print_hi('Tom') +#=> prints 'Hi, Tom' to STDOUT. +{% endhighlight %} + +Check out the [Jekyll docs][jekyll-docs] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll’s GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll Talk][jekyll-talk]. + +[jekyll-docs]: https://jekyllrb.com/docs/home +[jekyll-gh]: https://github.com/jekyll/jekyll +[jekyll-talk]: https://talk.jekyllrb.com/ diff --git a/about.markdown b/about.markdown new file mode 100644 index 0000000..8b4e0b2 --- /dev/null +++ b/about.markdown @@ -0,0 +1,18 @@ +--- +layout: page +title: About +permalink: /about/ +--- + +This is the base Jekyll theme. You can find out more info about customizing your Jekyll theme, as well as basic Jekyll usage documentation at [jekyllrb.com](https://jekyllrb.com/) + +You can find the source code for Minima at GitHub: +[jekyll][jekyll-organization] / +[minima](https://github.com/jekyll/minima) + +You can find the source code for Jekyll at GitHub: +[jekyll][jekyll-organization] / +[jekyll](https://github.com/jekyll/jekyll) + + +[jekyll-organization]: https://github.com/jekyll diff --git a/assets/css/style.scss b/assets/css/style.scss deleted file mode 100644 index 2c54ed0..0000000 --- a/assets/css/style.scss +++ /dev/null @@ -1,11 +0,0 @@ ---- ---- - -@import "{{ site.theme }}"; - -.page-header{ -color:#ffff; -background-color:#A067AB; -background-image: url('/images/gogi_goki_banner.png'); -background-size: 100% 100%; -} diff --git a/assets/main.scss b/assets/main.scss new file mode 100644 index 0000000..cb86948 --- /dev/null +++ b/assets/main.scss @@ -0,0 +1,35 @@ +--- +--- + +@import "{{ site.theme }}"; + +.site-header { + color: #ffff; + background-color: #a067ab; + background-image: linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.4)), url("/images/gogi_goki_banner.png"); + background-size: contain; + // filter: brightness(70%); + // background-size: 100% 100%; + // height: 30vh; +} + +.site-title, +.site-title:visited { + color: white; + font-weight: bold; + letter-spacing: normal; +} + +.site-nav .page-link { + color: white; +} + +@media screen and (max-width: 600px) { + .site-nav .page-link { + color: black; + } +} + +code { + user-select: all; +} diff --git a/gettingstarted.md b/gettingstarted.md new file mode 100644 index 0000000..1ff5325 --- /dev/null +++ b/gettingstarted.md @@ -0,0 +1,52 @@ +--- +layout: page +title: Getting Started +permalink: /gettingStarted/ +--- + +_Note: this page assumes that you have already installed GoGi by completing the steps in [Install](/install)_ + +## Create a new Go project + +1. Navigate back to your home directory by running `cd` +2. Create a new directory called myapp by running `mkdir myapp` +3. Navigate to your newly created directory by running `cd myapp` +4. Create a new Go module by running `go mod init myapp` +5. Create a new Go file by running `touch main.go` +6. Open main.go using an editor of your choice + +## Make a simple app + +1. Add the following code to your editor: + + package main + + func main() { + // Run the window event loop function as the main function + gimain.Main(func() { + mainrun() + }) + } + + func mainrun() { + // Create a window called My App Window with width 1024 and height 768 + win := gi.NewMainWindow("myapp", "My App Window", 1024, 768) + // Get the viewport within our window + vp := win.WinViewport2D() + // Start an update loop on the viewport + updt := vp.UpdateStart() + // Create a standard frame within the window and make it the main widget + mfr := win.SetMainFrame() + + // Add a label to the main frame with the text "Hello, World!" + label := gi.AddNewLabel(mfr, "label", "Hello, World!") + + // End the update loop on the viewport without a signal + vp.UpdateEndNoSig(updt) + // Start the event loop that keeps the window rendering; this is a blocking call, and it will not return until the user quits the app or gi.Quit() is called + win.StartEventLoop() + } + +2. Update your dependencies by running `go mod tidy` +3. Build the code by running `go build` +4. Run the app by running `./myapp` if you are on MacOS or Linux and `./myapp.exe` if you are on Windows. \ No newline at end of file diff --git a/index.md b/index.md index ff17094..bdceedd 100644 --- a/index.md +++ b/index.md @@ -1,5 +1,13 @@ +--- +layout: home +title: GoKi +--- + [GoKi](https://github.com/goki/ki) is a tree package based on the `Ki` interface implemented by the `Node` struct, supporting arbitrary directed (no loops!) structural trees and standard operations thereon, for primary use in constructing the scenegraph in the GoGi GUI framework. It can also be used for representing file system trees, web DOM trees, or any other such structural tree, which are so commonly used to represent structured information. + +## GoGi + [GoGi](https://github.com/goki/gi) is a 2D and 3D GUI framework, built on GoKi, providing a fully native Go experience, built upon widely-used and familiar standards in the web (CSS-based styling and layout, SVG-based vector graphics) and other GUIs (e.g., the Qt Widget and model-view framework). GoGi has feature parity (or better) compared to the industry standard Qt framework in most respects, including support for things like tooltips, fully-formatted HTML text with hypertext links, syntax-highlighted text display and full-featured editing, custom keymaps, color preferences (including light and dark mode), etc. The model-view framework uses reflection to render complex structured GUI elements like edit dialogs, tables, lists, choosers, etc based on standard Go structured types (`struct`, slices, `map`), including a `TreeView` based on `Ki` trees, with a full-featured `FileTree` and `FileTreeView` for file system trees. diff --git a/install.md b/install.md new file mode 100644 index 0000000..4d1f77f --- /dev/null +++ b/install.md @@ -0,0 +1,29 @@ +--- +layout: page +title: Install +permalink: /install/ +--- + +1. Install the platform-specific dependencies for your platform: + * **MacOS**: + 1. Install the xcode command-line tools if you don't already have them by running `xcode-select --install` + 2. Install the Vulkan SDK from the [Vulkan Website](https://vulkan.lunarg.com/sdk/home) + * **Windows**: + 1. Download and install git from the [git website](https://git-scm.com/download/win) + 2. Download and install TDM-GCC from [this website](https://jmeubank.github.io/tdm-gcc/) + 3. Open Windows Command Prompt and run `cd C:\TDM-GCC-64` + 4. Then, run `mingwvars.bat` + * **Linux**: + 1. Install necessary dependencies by running one of the following commands: + * If you are on Ubuntu or Debian, run `sudo apt-get install libgl1-mesa-dev xorg-dev` + * If you are on CentOS or Fedora, run `sudo dnf install libX11-devel libXcursor-devel libXrandr-devel libXinerama-devel mesa-libGL-devel libXi-devel` + 2. Install the Vulkan SDK from the [Vulkan Website](https://vulkan.lunarg.com/sdk/home) +2. Install the Go programming language (Golang) if you have not already. You can see how to do this on [the go website](https://go.dev/doc/install) +3. Clone the main GoGi repository by running `git clone https://github.com/goki/gi` + +## Run the Widgets Example + +4. Navigate to the widgets example by running `cd gi/examples/widgets` +5. Build the widgets example by running `go build` +6. Run the widgets example by running `./widgets` if you are on MacOS or Linux and `./widgets.exe` if you are on Windows. This should create a window with a variety of widgets, similar to the screenshot below: +![Screenshot of Widgets demo](/images/screenshot.png?raw=true "Screenshot of Widgets demo") \ No newline at end of file