diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dcb3189..328135b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ FlatLaf Change Log #### New features - Animated theme change (see [FlatLaf Extras](flatlaf-extras)). Used in Demo. +- Demo: Added combo box above themes list to show only light or dark themes. - IntelliJ Themes: - Added "Arc Dark" and "Arc Dark - Orange" themes. - Replaced "Solarized" themes with much better ones from 4lex4. diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemeInfo.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemeInfo.java index 6250d22b..40e0bc03 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemeInfo.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemeInfo.java @@ -25,6 +25,7 @@ class IJThemeInfo { final String name; final String resourceName; + final boolean dark; final String license; final String licenseFile; final String sourceCodeUrl; @@ -32,13 +33,14 @@ class IJThemeInfo final File themeFile; final String lafClassName; - IJThemeInfo( String name, String resourceName, + IJThemeInfo( String name, String resourceName, boolean dark, String license, String licenseFile, String sourceCodeUrl, String sourceCodePath, File themeFile, String lafClassName ) { this.name = name; this.resourceName = resourceName; + this.dark = dark; this.license = license; this.licenseFile = licenseFile; this.sourceCodeUrl = sourceCodeUrl; diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesManager.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesManager.java index 22e568cd..07142025 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesManager.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesManager.java @@ -55,12 +55,13 @@ class IJThemesManager String resourceName = e.getKey(); Map value = (Map) e.getValue(); String name = value.get( "name" ); + boolean dark = Boolean.parseBoolean( value.get( "dark" ) ); String license = value.get( "license" ); String licenseFile = value.get( "licenseFile" ); String sourceCodeUrl = value.get( "sourceCodeUrl" ); String sourceCodePath = value.get( "sourceCodePath" ); - bundledThemes.add( new IJThemeInfo( name, resourceName, license, licenseFile, sourceCodeUrl, sourceCodePath, null, null ) ); + bundledThemes.add( new IJThemeInfo( name, resourceName, dark, license, licenseFile, sourceCodeUrl, sourceCodePath, null, null ) ); } } @@ -83,7 +84,7 @@ class IJThemesManager String name = fname.endsWith( ".properties" ) ? StringUtils.removeTrailing( fname, ".properties" ) : StringUtils.removeTrailing( fname, ".theme.json" ); - moreThemes.add( new IJThemeInfo( name, null, null, null, null, null, f, null ) ); + moreThemes.add( new IJThemeInfo( name, null, false, null, null, null, null, f, null ) ); lastModifiedMap.put( f, f.lastModified() ); } } diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesPanel.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesPanel.java index 2fa7d4a5..8f48a7ed 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesPanel.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesPanel.java @@ -19,6 +19,7 @@ package com.formdev.flatlaf.demo.intellijthemes; import java.awt.Component; import java.awt.Desktop; import java.awt.EventQueue; +import java.awt.Rectangle; import java.awt.Window; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; @@ -120,6 +121,10 @@ public class IJThemesPanel } private void updateThemesList() { + int filterLightDark = filterComboBox.getSelectedIndex(); + boolean showLight = (filterLightDark != 2); + boolean showDark = (filterLightDark != 1); + // load theme infos themesManager.loadBundledThemes(); themesManager.loadThemesFromDirectory(); @@ -129,15 +134,22 @@ public class IJThemesPanel themesManager.bundledThemes.sort( comparator ); themesManager.moreThemes.sort( comparator ); + // remember selection (must be invoked before clearing themes field) + IJThemeInfo oldSel = themesList.getSelectedValue(); + themes.clear(); categories.clear(); // add core themes at beginning categories.put( themes.size(), "Core Themes" ); - themes.add( new IJThemeInfo( "Flat Light", null, null, null, null, null, null, FlatLightLaf.class.getName() ) ); - themes.add( new IJThemeInfo( "Flat Dark", null, null, null, null, null, null, FlatDarkLaf.class.getName() ) ); - themes.add( new IJThemeInfo( "Flat IntelliJ", null, null, null, null, null, null, FlatIntelliJLaf.class.getName() ) ); - themes.add( new IJThemeInfo( "Flat Darcula", null, null, null, null, null, null, FlatDarculaLaf.class.getName() ) ); + if( showLight ) + themes.add( new IJThemeInfo( "Flat Light", null, false, null, null, null, null, null, FlatLightLaf.class.getName() ) ); + if( showDark ) + themes.add( new IJThemeInfo( "Flat Dark", null, true, null, null, null, null, null, FlatDarkLaf.class.getName() ) ); + if( showLight ) + themes.add( new IJThemeInfo( "Flat IntelliJ", null, false, null, null, null, null, null, FlatIntelliJLaf.class.getName() ) ); + if( showDark ) + themes.add( new IJThemeInfo( "Flat Darcula", null, true, null, null, null, null, null, FlatDarculaLaf.class.getName() ) ); // add themes from directory categories.put( themes.size(), "Current Directory" ); @@ -146,15 +158,17 @@ public class IJThemesPanel // add uncategorized bundled themes categories.put( themes.size(), "IntelliJ Themes" ); for( IJThemeInfo ti : themesManager.bundledThemes ) { - if( !ti.name.contains( "/" ) ) + boolean show = (showLight && !ti.dark) || (showDark && ti.dark); + if( show && !ti.name.contains( "/" ) ) themes.add( ti ); } // add categorized bundled themes String lastCategory = null; for( IJThemeInfo ti : themesManager.bundledThemes ) { + boolean show = (showLight && !ti.dark) || (showDark && ti.dark); int sep = ti.name.indexOf( '/' ); - if( sep < 0 ) + if( !show || sep < 0 ) continue; String category = ti.name.substring( 0, sep ).trim(); @@ -166,9 +180,6 @@ public class IJThemesPanel themes.add( ti ); } - // remember selection - IJThemeInfo oldSel = themesList.getSelectedValue(); - // fill themes list themesList.setModel( new AbstractListModel() { @Override @@ -195,6 +206,18 @@ public class IJThemesPanel } } } + + // select first theme if none selected + if( themesList.getSelectedIndex() < 0 ) + themesList.setSelectedIndex( 0 ); + + // scroll selection into visible area + int sel = themesList.getSelectedIndex(); + if( sel >= 0 ) { + Rectangle bounds = themesList.getCellBounds( sel, sel ); + if( bounds != null ) + themesList.scrollRectToVisible( bounds ); + } } private void themesListValueChanged( ListSelectionEvent e ) { @@ -381,12 +404,17 @@ public class IJThemesPanel isAdjustingThemesList = false; } + private void filterChanged() { + updateThemesList(); + } + private void initComponents() { // JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents JLabel themesLabel = new JLabel(); toolBar = new JToolBar(); saveButton = new JButton(); sourceCodeButton = new JButton(); + filterComboBox = new JComboBox<>(); themesScrollPane = new JScrollPane(); themesList = new JList<>(); @@ -419,6 +447,17 @@ public class IJThemesPanel } add(toolBar, "cell 0 0,alignx right,growx 0"); + //---- filterComboBox ---- + filterComboBox.setModel(new DefaultComboBoxModel<>(new String[] { + "all", + "light", + "dark" + })); + filterComboBox.putClientProperty("JComponent.minimumWidth", 0); + filterComboBox.setFocusable(false); + filterComboBox.addActionListener(e -> filterChanged()); + add(filterComboBox, "cell 0 0,alignx right,growx 0"); + //======== themesScrollPane ======== { @@ -435,6 +474,7 @@ public class IJThemesPanel private JToolBar toolBar; private JButton saveButton; private JButton sourceCodeButton; + private JComboBox filterComboBox; private JScrollPane themesScrollPane; private JList themesList; // JFormDesigner - End of variables declaration //GEN-END:variables diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesPanel.jfd b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesPanel.jfd index 51a3fa3a..8674fb70 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesPanel.jfd +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesPanel.jfd @@ -1,4 +1,4 @@ -JFDML JFormDesigner: "7.0.0.0.194" Java: "11.0.2" encoding: "UTF-8" +JFDML JFormDesigner: "7.0.2.0.298" Java: "14" encoding: "UTF-8" new FormModel { contentType: "form/swing" @@ -34,6 +34,20 @@ new FormModel { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 0 0,alignx right,growx 0" } ) + add( new FormComponent( "javax.swing.JComboBox" ) { + name: "filterComboBox" + "model": new javax.swing.DefaultComboBoxModel { + selectedItem: "all" + addElement( "all" ) + addElement( "light" ) + addElement( "dark" ) + } + "$client.JComponent.minimumWidth": 0 + "focusable": false + addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "filterChanged", false ) ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 0 0,alignx right,growx 0" + } ) add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) { name: "themesScrollPane" add( new FormComponent( "javax.swing.JList" ) { diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/themes.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/themes.json index c6333ee8..543471cd 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/themes.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/themes.json @@ -15,6 +15,7 @@ }, "arc_theme_dark.theme.json": { "name": "Arc Dark", + "dark": true, "license": "MIT", "licenseFile": "arc-themes.LICENSE.txt", "sourceCodeUrl": "https://gitlab.com/zlamalp/arc-theme-idea", @@ -22,6 +23,7 @@ }, "arc_theme_dark_orange.theme.json": { "name": "Arc Dark - Orange", + "dark": true, "license": "MIT", "licenseFile": "arc-themes.LICENSE.txt", "sourceCodeUrl": "https://gitlab.com/zlamalp/arc-theme-idea", @@ -36,6 +38,7 @@ }, "DarkFlatTheme.theme.json": { "name": "Dark Flat", + "dark": true, "license": "MIT", "licenseFile": "DarkFlatTheme.LICENSE.txt", "sourceCodeUrl": "https://github.com/nerzhulart/DarkFlatTheme", @@ -43,6 +46,7 @@ }, "DarkPurple.theme.json": { "name": "Dark purple", + "dark": true, "license": "MIT", "licenseFile": "DarkPurple.LICENSE.txt", "sourceCodeUrl": "https://github.com/OlyaB/DarkPurpleTheme", @@ -50,6 +54,7 @@ }, "Dracula.theme.json": { "name": "Dracula", + "dark": true, "license": "MIT", "licenseFile": "Dracula.LICENSE.txt", "sourceCodeUrl": "https://github.com/dracula/jetbrains", @@ -57,6 +62,7 @@ }, "Gradianto_dark_fuchsia.theme.json": { "name": "Gradianto Dark Fuchsia", + "dark": true, "license": "MIT", "licenseFile": "Gradianto.LICENSE.txt", "sourceCodeUrl": "https://github.com/thvardhan/Gradianto", @@ -64,6 +70,7 @@ }, "Gradianto_deep_ocean.theme.json": { "name": "Gradianto Deep Ocean", + "dark": true, "license": "MIT", "licenseFile": "Gradianto.LICENSE.txt", "sourceCodeUrl": "https://github.com/thvardhan/Gradianto", @@ -71,6 +78,7 @@ }, "Gradianto_midnight_blue.theme.json": { "name": "Gradianto Midnight Blue", + "dark": true, "license": "MIT", "licenseFile": "Gradianto.LICENSE.txt", "sourceCodeUrl": "https://github.com/thvardhan/Gradianto", @@ -85,6 +93,7 @@ }, "gruvbox_dark_hard.theme.json": { "name": "Gruvbox Dark Hard", + "dark": true, "license": "MIT", "licenseFile": "gruvbox_theme.LICENSE.txt", "sourceCodeUrl": "https://github.com/Vincent-P/gruvbox-intellij-theme", @@ -92,6 +101,7 @@ }, "gruvbox_dark_medium.theme.json": { "name": "Gruvbox Dark Medium", + "dark": true, "license": "MIT", "licenseFile": "gruvbox_theme.LICENSE.txt", "sourceCodeUrl": "https://github.com/Vincent-P/gruvbox-intellij-theme", @@ -99,6 +109,7 @@ }, "gruvbox_dark_soft.theme.json": { "name": "Gruvbox Dark Soft", + "dark": true, "license": "MIT", "licenseFile": "gruvbox_theme.LICENSE.txt", "sourceCodeUrl": "https://github.com/Vincent-P/gruvbox-intellij-theme", @@ -106,6 +117,7 @@ }, "HiberbeeDark.theme.json": { "name": "Hiberbee Dark", + "dark": true, "license": "MIT", "licenseFile": "Hiberbee.LICENSE.txt", "sourceCodeUrl": "https://github.com/Hiberbee/code-highlight-themes", @@ -113,6 +125,7 @@ }, "HighContrast.theme.json": { "name": "High contrast", + "dark": true, "license": "MIT", "licenseFile": "HighContrast.LICENSE.txt", "sourceCodeUrl": "https://github.com/OlyaB/HighContrastTheme", @@ -127,6 +140,7 @@ }, "MaterialTheme.theme.json": { "name": "Material Design Dark", + "dark": true, "license": "MIT", "licenseFile": "MaterialTheme.LICENSE.txt", "sourceCodeUrl": "https://github.com/xinkunZ/NotReallyMDTheme", @@ -134,6 +148,7 @@ }, "Monocai.theme.json": { "name": "Monocai", + "dark": true, "license": "MIT", "licenseFile": "Monocai.LICENSE.txt", "sourceCodeUrl": "https://github.com/bmikaili/intellij-monocai-theme", @@ -141,6 +156,7 @@ }, "nord.theme.json": { "name": "Nord", + "dark": true, "license": "MIT", "licenseFile": "nord.LICENSE.txt", "sourceCodeUrl": "https://github.com/arcticicestudio/nord-jetbrains", @@ -148,6 +164,7 @@ }, "one_dark.theme.json": { "name": "One Dark", + "dark": true, "license": "MIT", "licenseFile": "one_dark.LICENSE.txt", "sourceCodeUrl": "https://github.com/one-dark/jetbrains-one-dark-theme", @@ -155,6 +172,7 @@ }, "SolarizedDark.theme.json": { "name": "Solarized Dark", + "dark": true, "license": "The Unlicense", "licenseFile": "Solarized.LICENSE.txt", "sourceCodeUrl": "https://github.com/4lex4/intellij-platform-solarized", @@ -169,6 +187,7 @@ }, "Spacegray.theme.json": { "name": "Spacegray", + "dark": true, "license": "MIT", "licenseFile": "Spacegray.LICENSE.txt", "sourceCodeUrl": "https://github.com/mturlo/intellij-spacegray", @@ -176,6 +195,7 @@ }, "vuesion_theme.theme.json": { "name": "Vuesion", + "dark": true, "license": "MIT", "licenseFile": "vuesion_theme.LICENSE.txt", "sourceCodeUrl": "https://github.com/vuesion/intellij-theme", @@ -184,6 +204,7 @@ "material-theme-ui-lite/Arc Dark.theme.json": { "name": "Material Theme UI Lite / Arc Dark", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -191,6 +212,7 @@ }, "material-theme-ui-lite/Arc Dark Contrast.theme.json": { "name": "Material Theme UI Lite / Arc Dark Contrast", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -198,6 +220,7 @@ }, "material-theme-ui-lite/Atom One Dark.theme.json": { "name": "Material Theme UI Lite / Atom One Dark", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -205,6 +228,7 @@ }, "material-theme-ui-lite/Atom One Dark Contrast.theme.json": { "name": "Material Theme UI Lite / Atom One Dark Contrast", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -226,6 +250,7 @@ }, "material-theme-ui-lite/Dracula.theme.json": { "name": "Material Theme UI Lite / Dracula", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -233,6 +258,7 @@ }, "material-theme-ui-lite/Dracula Contrast.theme.json": { "name": "Material Theme UI Lite / Dracula Contrast", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -268,6 +294,7 @@ }, "material-theme-ui-lite/Material Darker.theme.json": { "name": "Material Theme UI Lite / Material Darker", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -275,6 +302,7 @@ }, "material-theme-ui-lite/Material Darker Contrast.theme.json": { "name": "Material Theme UI Lite / Material Darker Contrast", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -282,6 +310,7 @@ }, "material-theme-ui-lite/Material Deep Ocean.theme.json": { "name": "Material Theme UI Lite / Material Deep Ocean", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -289,6 +318,7 @@ }, "material-theme-ui-lite/Material Deep Ocean Contrast.theme.json": { "name": "Material Theme UI Lite / Material Deep Ocean Contrast", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -310,6 +340,7 @@ }, "material-theme-ui-lite/Material Oceanic.theme.json": { "name": "Material Theme UI Lite / Material Oceanic", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -317,6 +348,7 @@ }, "material-theme-ui-lite/Material Oceanic Contrast.theme.json": { "name": "Material Theme UI Lite / Material Oceanic Contrast", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -324,6 +356,7 @@ }, "material-theme-ui-lite/Material Palenight.theme.json": { "name": "Material Theme UI Lite / Material Palenight", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -331,6 +364,7 @@ }, "material-theme-ui-lite/Material Palenight Contrast.theme.json": { "name": "Material Theme UI Lite / Material Palenight Contrast", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -338,6 +372,7 @@ }, "material-theme-ui-lite/Monokai Pro.theme.json": { "name": "Material Theme UI Lite / Monokai Pro", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -345,6 +380,7 @@ }, "material-theme-ui-lite/Monokai Pro Contrast.theme.json": { "name": "Material Theme UI Lite / Monokai Pro Contrast", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -352,6 +388,7 @@ }, "material-theme-ui-lite/Night Owl.theme.json": { "name": "Material Theme UI Lite / Night Owl", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -359,6 +396,7 @@ }, "material-theme-ui-lite/Night Owl Contrast.theme.json": { "name": "Material Theme UI Lite / Night Owl Contrast", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -366,6 +404,7 @@ }, "material-theme-ui-lite/Solarized Dark.theme.json": { "name": "Material Theme UI Lite / Solarized Dark", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite", @@ -373,6 +412,7 @@ }, "material-theme-ui-lite/Solarized Dark Contrast.theme.json": { "name": "Material Theme UI Lite / Solarized Dark Contrast", + "dark": true, "license": "MIT", "licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt", "sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite",