Skip to content

Commit d626593

Browse files
committed
Dark mode in initializr and fixing build to update to latest version of plugin
1 parent 1fb4fe5 commit d626593

10 files changed

Lines changed: 271 additions & 16 deletions

File tree

.github/workflows/initializr-cn1-version-pr.yml

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ name: Initializr CN1 Version PR
33
on:
44
push:
55
tags:
6-
- "v*"
7-
- "[0-9]*"
6+
- "*"
7+
release:
8+
types:
9+
- published
810

911
permissions:
1012
contents: write
@@ -18,21 +20,22 @@ jobs:
1820
uses: actions/checkout@v4
1921

2022
- name: Update Initializr Codename One versions
21-
run: ./scripts/initializr/update-cn1-version.sh "${GITHUB_REF_NAME}"
23+
run: ./scripts/initializr/update-cn1-version.sh "${{ github.event.release.tag_name || github.ref_name }}"
2224

2325
- name: Create pull request
2426
uses: peter-evans/create-pull-request@v6
2527
with:
26-
commit-message: "scripts/initializr: bump Codename One versions to ${{ github.ref_name }}"
27-
title: "scripts/initializr: bump Codename One versions to ${{ github.ref_name }}"
28+
commit-message: "scripts/initializr: bump Codename One versions to ${{ github.event.release.tag_name || github.ref_name }}"
29+
title: "scripts/initializr: bump Codename One versions to ${{ github.event.release.tag_name || github.ref_name }}"
2830
body: |
29-
Automated update of Codename One versions in `scripts/initializr` after release `${{ github.ref_name }}`.
31+
Automated update of Codename One versions in `scripts/initializr` after release `${{ github.event.release.tag_name || github.ref_name }}`.
3032
3133
Updated:
3234
- All `scripts/initializr/**/pom.xml` files containing `cn1.plugin.version`
3335
- `scripts/initializr/common/src/main/java/com/codename1/initializr/model/GeneratorModel.java`
3436
- `scripts/initializr/common/src/test/java/com/codename1/initializr/model/GeneratorModelMatrixTest.java`
35-
branch: automation/initializr-cn1-version-${{ github.ref_name }}
37+
- Embedded root `pom.xml` in `scripts/initializr/common/src/main/resources/common.zip`
38+
branch: automation/initializr-cn1-version-${{ github.event.release.tag_name || github.ref_name }}
3639
delete-branch: true
3740
labels: |
3841
automation

scripts/initializr/common/src/main/css/theme.css

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,49 +57,96 @@ InitializrForm {
5757
background-color: #f3f6fb;
5858
}
5959

60+
InitializrFormDark {
61+
background-color: #0f172a;
62+
}
63+
6064
InitializrRoot {
6165
padding: 2.2mm;
6266
}
6367

68+
InitializrRootDark {
69+
padding: 2.2mm;
70+
}
71+
6472
InitializrHeaderCard {
6573
background-color: #eaf2ff;
6674
padding: 2.5mm;
6775
margin: 1.2mm;
6876
}
6977

78+
InitializrHeaderCardDark {
79+
background-color: #1e293b;
80+
padding: 2.5mm;
81+
margin: 1.2mm;
82+
}
83+
7084
InitializrCard {
7185
background-color: #ffffff;
7286
padding: 2.5mm;
7387
margin: 1.2mm;
7488
}
7589

90+
InitializrCardDark {
91+
background-color: #111827;
92+
padding: 2.5mm;
93+
margin: 1.2mm;
94+
}
95+
7696
InitializrHeroTitle {
7797
color: #0d1b2a;
7898
font-family: "native:MainBold";
7999
font-size: 4.5mm;
80100
padding: 0 0 1mm 0;
81101
}
82102

103+
InitializrHeroTitleDark {
104+
color: #e2e8f0;
105+
font-family: "native:MainBold";
106+
font-size: 4.5mm;
107+
padding: 0 0 1mm 0;
108+
}
109+
83110
InitializrHeroSubtitle {
84111
color: #4a5568;
85112
font-family: "native:MainRegular";
86113
font-size: 2.8mm;
87114
}
88115

116+
InitializrHeroSubtitleDark {
117+
color: #94a3b8;
118+
font-family: "native:MainRegular";
119+
font-size: 2.8mm;
120+
}
121+
89122
InitializrSectionTitle {
90123
color: #1f2937;
91124
font-family: "native:MainBold";
92125
font-size: 3.4mm;
93126
padding: 0 0 1.2mm 0;
94127
}
95128

129+
InitializrSectionTitleDark {
130+
color: #e2e8f0;
131+
font-family: "native:MainBold";
132+
font-size: 3.4mm;
133+
padding: 0 0 1.2mm 0;
134+
}
135+
96136
InitializrFieldLabel {
97137
color: #475569;
98138
font-family: "native:MainRegular";
99139
font-size: 2.4mm;
100140
padding: 0.4mm 0;
101141
}
102142

143+
InitializrFieldLabelDark {
144+
color: #cbd5e1;
145+
font-family: "native:MainRegular";
146+
font-size: 2.4mm;
147+
padding: 0.4mm 0;
148+
}
149+
103150
InitializrField, InitializrFieldHint {
104151
color: #1f2937;
105152
font-family: "native:MainRegular";
@@ -110,6 +157,16 @@ InitializrField, InitializrFieldHint {
110157
margin: 0 0 1.4mm 0;
111158
}
112159

160+
InitializrFieldDark, InitializrFieldHintDark {
161+
color: #e2e8f0;
162+
font-family: "native:MainRegular";
163+
font-size: 2.8mm;
164+
background-color: #0f172a;
165+
border: 1px solid #334155;
166+
padding: 1.1mm;
167+
margin: 0 0 1.4mm 0;
168+
}
169+
113170
InitializrChoicesGrid {
114171
margin: 0 0 1.2mm 0;
115172
}
@@ -132,6 +189,24 @@ InitializrChoice.pressed {
132189
text-align: center;
133190
}
134191

192+
InitializrChoiceDark {
193+
color: #e2e8f0;
194+
background-color: #1f2937;
195+
font-family: "native:MainRegular";
196+
font-size: 2.6mm;
197+
border: 1px solid #334155;
198+
margin: 0.7mm;
199+
padding: 1.1mm;
200+
text-align: center;
201+
}
202+
203+
InitializrChoiceDark.pressed {
204+
color: #ffffff;
205+
background-color: #0f766e;
206+
border: 1px solid #0f766e;
207+
text-align: center;
208+
}
209+
135210
InitializrSummary {
136211
color: #1f2937;
137212
font-family: "native:MainRegular";
@@ -142,20 +217,44 @@ InitializrSummary {
142217
margin: 0 0 1.4mm 0;
143218
}
144219

220+
InitializrSummaryDark {
221+
color: #e2e8f0;
222+
font-family: "native:MainRegular";
223+
font-size: 2.7mm;
224+
background-color: #0f172a;
225+
border: 1px solid #334155;
226+
padding: 1.4mm;
227+
margin: 0 0 1.4mm 0;
228+
}
229+
145230
InitializrTip {
146231
color: #5f6b7a;
147232
font-family: "native:MainRegular";
148233
font-size: 2.4mm;
149234
padding: 0 0 1.2mm 0;
150235
}
151236

237+
InitializrTipDark {
238+
color: #94a3b8;
239+
font-family: "native:MainRegular";
240+
font-size: 2.4mm;
241+
padding: 0 0 1.2mm 0;
242+
}
243+
152244
InitializrValidationError {
153245
color: #b42318;
154246
font-family: "native:MainRegular";
155247
font-size: 2.2mm;
156248
padding: 0 0 0.8mm 0;
157249
}
158250

251+
InitializrValidationErrorDark {
252+
color: #f87171;
253+
font-family: "native:MainRegular";
254+
font-size: 2.2mm;
255+
padding: 0 0 0.8mm 0;
256+
}
257+
159258
InitializrHelpButton {
160259
cn1-derive: Button;
161260
color: #64748b;
@@ -165,6 +264,15 @@ InitializrHelpButton {
165264
padding: 0.2mm;
166265
}
167266

267+
InitializrHelpButtonDark {
268+
cn1-derive: Button;
269+
color: #94a3b8;
270+
background-color: transparent;
271+
border: none;
272+
margin: 0;
273+
padding: 0.2mm;
274+
}
275+
168276
Images {
169277
background-image: url(images/grub.png),
170278
url(images/tweet.png);

scripts/initializr/common/src/main/java/com/codename1/initializr/Initializr.java

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.codename1.initializr.model.Template;
1212
import com.codename1.initializr.ui.TemplatePreviewPanel;
1313
import com.codename1.system.Lifecycle;
14+
import com.codename1.system.NativeLookup;
1415
import com.codename1.ui.Button;
1516
import com.codename1.ui.ButtonGroup;
1617
import com.codename1.ui.CheckBox;
@@ -25,9 +26,12 @@
2526
import com.codename1.ui.layouts.BorderLayout;
2627
import com.codename1.ui.layouts.BoxLayout;
2728
import com.codename1.ui.layouts.GridLayout;
29+
import com.codename1.ui.util.UITimer;
2830
import com.codename1.util.StringUtil;
2931

3032
public class Initializr extends Lifecycle {
33+
private boolean websiteDarkMode;
34+
3135
@Override
3236
public void runApp() {
3337
final Form form = new Form("", new BorderLayout());
@@ -132,6 +136,7 @@ public void run() {
132136
appNameField.addDataChangedListener((type, index) -> refresh.run());
133137
packageField.addDataChangedListener((type, index) -> refresh.run());
134138
refresh.run();
139+
initWebsiteThemeSync(form);
135140
form.show();
136141
}
137142

@@ -324,6 +329,92 @@ private boolean supportsLivePreview(Template template) {
324329
return template == Template.BAREBONES || template == Template.KOTLIN;
325330
}
326331

332+
private void initWebsiteThemeSync(Form form) {
333+
WebsiteThemeNative websiteThemeNative = NativeLookup.create(WebsiteThemeNative.class);
334+
if (websiteThemeNative == null || !websiteThemeNative.isSupported()) {
335+
return;
336+
}
337+
websiteDarkMode = websiteThemeNative.isDarkMode();
338+
applyWebsiteTheme(form, websiteDarkMode);
339+
UITimer.timer(900, true, form, () -> {
340+
boolean dark = websiteThemeNative.isDarkMode();
341+
if (dark != websiteDarkMode) {
342+
websiteDarkMode = dark;
343+
applyWebsiteTheme(form, dark);
344+
form.revalidate();
345+
}
346+
});
347+
}
348+
349+
private void applyWebsiteTheme(Component component, boolean dark) {
350+
String uiid = component.getUIID();
351+
String themed = themedUiid(uiid, dark);
352+
if (!uiid.equals(themed)) {
353+
component.setUIID(themed);
354+
}
355+
if (component instanceof Container) {
356+
Container cnt = (Container) component;
357+
for (int i = 0; i < cnt.getComponentCount(); i++) {
358+
applyWebsiteTheme(cnt.getComponentAt(i), dark);
359+
}
360+
}
361+
}
362+
363+
private String themedUiid(String uiid, boolean dark) {
364+
if (uiid == null || uiid.length() == 0) {
365+
return uiid;
366+
}
367+
if (dark) {
368+
if (uiid.endsWith("Dark")) {
369+
return uiid;
370+
}
371+
switch (uiid) {
372+
case "InitializrForm":
373+
case "InitializrRoot":
374+
case "InitializrHeaderCard":
375+
case "InitializrCard":
376+
case "InitializrHeroTitle":
377+
case "InitializrHeroSubtitle":
378+
case "InitializrSectionTitle":
379+
case "InitializrFieldLabel":
380+
case "InitializrField":
381+
case "InitializrFieldHint":
382+
case "InitializrChoice":
383+
case "InitializrSummary":
384+
case "InitializrTip":
385+
case "InitializrValidationError":
386+
case "InitializrHelpButton":
387+
return uiid + "Dark";
388+
default:
389+
return uiid;
390+
}
391+
}
392+
if (!uiid.endsWith("Dark")) {
393+
return uiid;
394+
}
395+
String base = uiid.substring(0, uiid.length() - "Dark".length());
396+
switch (base) {
397+
case "InitializrForm":
398+
case "InitializrRoot":
399+
case "InitializrHeaderCard":
400+
case "InitializrCard":
401+
case "InitializrHeroTitle":
402+
case "InitializrHeroSubtitle":
403+
case "InitializrSectionTitle":
404+
case "InitializrFieldLabel":
405+
case "InitializrField":
406+
case "InitializrFieldHint":
407+
case "InitializrChoice":
408+
case "InitializrSummary":
409+
case "InitializrTip":
410+
case "InitializrValidationError":
411+
case "InitializrHelpButton":
412+
return base;
413+
default:
414+
return uiid;
415+
}
416+
}
417+
327418
private void setEnabledRecursive(Component component, boolean enabled) {
328419
component.setEnabled(enabled);
329420
if (component instanceof Container) {
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.codename1.initializr;
2+
3+
import com.codename1.system.NativeInterface;
4+
5+
public interface WebsiteThemeNative extends NativeInterface {
6+
boolean isDarkMode();
7+
}

scripts/initializr/common/src/main/java/com/codename1/initializr/model/GeneratorModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import static com.codename1.ui.CN.*;
1919

2020
public class GeneratorModel {
21-
private static final String CN1_PLUGIN_VERSION = "7.0.224";
21+
private static final String CN1_PLUGIN_VERSION = "7.0.250";
2222
private static final String GENERATED_GITIGNORE =
2323
"**/target/\n" +
2424
".idea/\n" +
-2.94 KB
Binary file not shown.

scripts/initializr/common/src/test/java/com/codename1/initializr/model/GeneratorModelMatrixTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ private void assertRootPom(Map<String, byte[]> entries, String packageName, Stri
9191
String pom = getText(entries, "pom.xml");
9292
assertContains(pom, packageName, "Root pom should include package as groupId");
9393
assertContains(pom, mainClassName.toLowerCase(), "Root pom should include app artifact/name");
94-
assertContains(pom, "<cn1.plugin.version>7.0.224</cn1.plugin.version>", "Root pom should use current CN1 plugin version");
94+
assertContains(pom, "<cn1.plugin.version>7.0.250</cn1.plugin.version>", "Root pom should use current CN1 plugin version");
9595
assertFalse(pom.indexOf("com.example.myapp") >= 0, "Root pom still contains placeholder package");
9696
assertFalse(pom.indexOf("myappname") >= 0, "Root pom still contains placeholder app name");
9797
}

0 commit comments

Comments
 (0)