From dcd2b0106e44d2f96f7dbe637ba5442b099e3968 Mon Sep 17 00:00:00 2001 From: theredwillow Date: Wed, 13 Nov 2024 15:35:44 -0800 Subject: [PATCH 01/12] Work --- apps/mondrianclock/README.md | 35 ++++ apps/mondrianclock/manifest.yaml | 8 + apps/mondrianclock/mondrianclock.star | 279 ++++++++++++++++++++++++++ 3 files changed, 322 insertions(+) create mode 100644 apps/mondrianclock/README.md create mode 100644 apps/mondrianclock/manifest.yaml create mode 100644 apps/mondrianclock/mondrianclock.star diff --git a/apps/mondrianclock/README.md b/apps/mondrianclock/README.md new file mode 100644 index 000000000..2213ca9a4 --- /dev/null +++ b/apps/mondrianclock/README.md @@ -0,0 +1,35 @@ +# Piet Mondrian-inspired clock for Tidbyt + +Displays the time with a beautiful, unique composition De Stijl for each minute of the day. + +## Reading the clock +### Digital clock +As you learn to read the clock faces, I suggest leaving the configuration for the digital clock face set to True. + +### Hours +Hours are displayed next to the red block on the top. +A thin white block is merely decorative (for 12 and 6 displays). A thicker column or two of white blocks indicates actual hours. If the red block has moved to the left side of the display, that equals 6 hours. + +``` +12: Thin white column / Red +01: White column of 1 / Red +02: White column of 2 / Red +03: White column of 3 / Red +04: White column of 3 / White column of 1 / Red +05: White column of 3 / White column of 2 / Red +06: Red / Thin white column +07: Red / White column of 1 +08: Red / White column of 2 +09: Red / White column of 3 +10: Red / White column of 3 / White column of 1 +11: Red / White column of 3 / White column of 2 +``` + +### Five Minute Increments +Five minute intervals are displayed in the bottom left. When the blue box is on the top row, it expands until it fits 25. Conversely, when the blue box is on the bottom row, it expands until it fits 55. The 15 and 45 have convenient grey boxes next to them to make them easier to read. + +### One Minute Increments +There is a one minute mark in the bottom right. If the big one is yellow, it means to add 0 to the five-minute-read. There is then a box with four smaller boxes in them. The top left means to add one, top right to add two, bottom left to add three, and bottom right to add four. + +## Like my programming? +Reach out to me on github [@theredwillow](https://github.com/theredwillow) \ No newline at end of file diff --git a/apps/mondrianclock/manifest.yaml b/apps/mondrianclock/manifest.yaml new file mode 100644 index 000000000..93827852c --- /dev/null +++ b/apps/mondrianclock/manifest.yaml @@ -0,0 +1,8 @@ +--- +id: mondrianclock +name: Mondrian Clock +summary: Mondrian-inspired clock +desc: Displays a Piet Mondrian inspired clock face, De Stijl. +author: @theredwillow +fileName: mondrianclock.star +packageName: mondrianclock diff --git a/apps/mondrianclock/mondrianclock.star b/apps/mondrianclock/mondrianclock.star new file mode 100644 index 000000000..c3e6d464a --- /dev/null +++ b/apps/mondrianclock/mondrianclock.star @@ -0,0 +1,279 @@ +""" +Applet: Mondrian Clock +Summary: Mondrian-inspired clock +Description: Displays a Piet Mondrian inspired clock face, De Stijl. +Author: @theredwillow +""" + +load("render.star", "render") +load("time.star", "time") +load("schema.star", "schema") + +DEFAULT_TIMEZONE = "America/Chicago" + +RED = "#FF0000" +BLUE = "#0000FF" +YELLOW = "#FFFF00" +WHITE = "#FFFFFF" +BLACK = "#000000" +GRAY = "#808080" + +black_outline_block = render.Box(width=2, height=2, color=BLACK) + +def draw_hour(hour, minute, show_clock): + hour_blocks = [] + + def draw_no_hour_block(): + return render.Box(width=4, height=20, color=WHITE) + + def draw_one_hour_block(): + return render.Box(width=10, height=20, color=WHITE) + + def draw_two_hour_block(): + return render.Column( + children = [ + render.Box(width=10, height=9, color=WHITE), + black_outline_block, + render.Box(width=10, height=9, color=WHITE), + ], + ) + + def draw_three_hour_block(): + return render.Column( + children = [ + render.Box(width=10, height=5, color=WHITE), + black_outline_block, + render.Box(width=10, height=6, color=WHITE), + black_outline_block, + render.Box(width=10, height=5, color=WHITE), + ], + ) + + def write_time(hour, minute): + if hour == 0: + hour = 12 + elif hour < 10: + hour = "0%d" % hour + if minute < 10: + minute = "0%d" % minute + return render.Text("%s:%s" % (hour, minute), color=BLACK) + + def draw_red_block(white_blocks): + white_width = 67 - (white_blocks * 13) + if white_blocks == 0: + white_width -= 9 + red_block = render.Box(width=white_width, height=20, color=RED) + if show_clock: + red_block = render.Stack( + children = [ + red_block, + write_time(hour, minute) + ], + ) + return red_block + + if hour == 0: + hour_blocks.append(draw_no_hour_block()) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_red_block(0)) + elif hour == 1: + hour_blocks.append(draw_one_hour_block()) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_red_block(1)) + elif hour == 2: + hour_blocks.append(draw_two_hour_block()) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_red_block(1)) + elif hour == 3: + hour_blocks.append(draw_three_hour_block()) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_red_block(1)) + elif hour == 4: + hour_blocks.append(draw_three_hour_block()) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_one_hour_block()) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_red_block(2)) + elif hour == 5: + hour_blocks.append(draw_three_hour_block()) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_two_hour_block()) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_red_block(2)) + elif hour == 6: + hour_blocks.append(draw_red_block(0)) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_no_hour_block()) + elif hour == 7: + hour_blocks.append(draw_red_block(1)) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_one_hour_block()) + elif hour == 8: + hour_blocks.append(draw_red_block(1)) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_two_hour_block()) + elif hour == 9: + hour_blocks.append(draw_red_block(1)) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_three_hour_block()) + elif hour == 10: + hour_blocks.append(draw_red_block(2)) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_three_hour_block()) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_one_hour_block()) + elif hour == 11: + hour_blocks.append(draw_red_block(2)) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_three_hour_block()) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_two_hour_block()) + else: + hour_blocks.append(draw_red_block(2)) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_three_hour_block()) + hour_blocks.append(black_outline_block) + hour_blocks.append(draw_three_hour_block()) + + return render.Row( + children=hour_blocks, + expanded=True, + ) + +def draw_minute_left(minute): + def draw_five_minute_block(color=WHITE): + return render.Box(width=5, height=4, color=color) + + unused_five_minute_row = render.Row( + children = [ + render.Box(width=8, height=4, color=WHITE), + black_outline_block, + draw_five_minute_block(), + black_outline_block, + draw_five_minute_block(), + black_outline_block, + draw_five_minute_block(), + black_outline_block, + draw_five_minute_block(GRAY), + black_outline_block, + draw_five_minute_block(GRAY), + black_outline_block, + ] + ) + + def draw_used_five_minute_row(minute): + if minute >= 30: + minute -= 30 + minute //= 5 + minute *= 7 + blocks = [ + render.Box(width=8 + minute, height=4, color=BLUE), + black_outline_block + ] + if minute < 33: + blocks.append(render.Box(width=33 - minute, height=4, color=WHITE)) + blocks.append(black_outline_block) + return render.Row( + children=blocks, + ) + + if minute < 30: + five_minute_display = [ + draw_used_five_minute_row(minute), + black_outline_block, + unused_five_minute_row + ] + else: + five_minute_display = [ + unused_five_minute_row, + black_outline_block, + draw_used_five_minute_row(minute) + ] + + return render.Column( + children=five_minute_display, + ) + +def draw_minute_right(minute): + modulus = minute % 5 + return render.Row( + children = [ + render.Box(width=7, height=10, color=YELLOW if modulus == 0 else WHITE), + black_outline_block, + render.Column( + children=[ + render.Box(width=4, height=4, color=YELLOW if modulus == 1 else WHITE), + black_outline_block, + render.Box(width=4, height=4, color=YELLOW if modulus == 3 else WHITE), + ], + ), + black_outline_block, + render.Column( + children=[ + render.Box(width=4, height=4, color=YELLOW if modulus == 2 else WHITE), + black_outline_block, + render.Box(width=4, height=4, color=YELLOW if modulus == 4 else WHITE), + ], + ), + ], + ) + +def main(config): + timezone = config.get("$tz", DEFAULT_TIMEZONE) + now = time.now().in_location(timezone) + hour = now.hour + # if config.get("hour"): + # hour = int(config.get("hour")) + if hour > 12: + hour -= 12 + minute = now.minute + # if config.get("minute"): + # minute = int(config.get("minute")) + show_clock = config.bool("clock", False) + return render.Root( + child = render.Column( + children = [ + draw_hour(hour, minute, show_clock), + render.Row( + children=[ + render.Box(width=10, height=2, color=BLACK), + ], + expanded=True, + ), + render.Row( + children=[ + draw_minute_left(minute), + draw_minute_right(minute), + ], + ), + ], + ), + ) + +def get_schema(): + return schema.Schema( + version = "1", + fields = [ + schema.Toggle( + id = "clock", + name = "Display digital clock", + desc = "Whether to display the digital clock or not", + icon = "clock", + default = True, + ), + # schema.Text( + # id = "hour", + # name = "Hour", + # desc = "A test tool for seeing hours.", + # icon = "vials", + # default = "00", + # ), + # schema.Text( + # id = "minute", + # name = "Minute", + # desc = "A test tool for seeing minutes.", + # icon = "vials", + # default = "00", + # ) + ], + ) \ No newline at end of file From f6367eff5ac0efca729d45827c666b5b36a3c6d8 Mon Sep 17 00:00:00 2001 From: theredwillow Date: Wed, 13 Nov 2024 15:37:10 -0800 Subject: [PATCH 02/12] pixlet format --- apps/mondrianclock/mondrianclock.star | 76 ++++++++++++++------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/apps/mondrianclock/mondrianclock.star b/apps/mondrianclock/mondrianclock.star index c3e6d464a..91b221d7b 100644 --- a/apps/mondrianclock/mondrianclock.star +++ b/apps/mondrianclock/mondrianclock.star @@ -18,34 +18,34 @@ WHITE = "#FFFFFF" BLACK = "#000000" GRAY = "#808080" -black_outline_block = render.Box(width=2, height=2, color=BLACK) +black_outline_block = render.Box(width = 2, height = 2, color = BLACK) def draw_hour(hour, minute, show_clock): hour_blocks = [] def draw_no_hour_block(): - return render.Box(width=4, height=20, color=WHITE) + return render.Box(width = 4, height = 20, color = WHITE) def draw_one_hour_block(): - return render.Box(width=10, height=20, color=WHITE) + return render.Box(width = 10, height = 20, color = WHITE) def draw_two_hour_block(): return render.Column( children = [ - render.Box(width=10, height=9, color=WHITE), + render.Box(width = 10, height = 9, color = WHITE), black_outline_block, - render.Box(width=10, height=9, color=WHITE), + render.Box(width = 10, height = 9, color = WHITE), ], ) def draw_three_hour_block(): return render.Column( children = [ - render.Box(width=10, height=5, color=WHITE), + render.Box(width = 10, height = 5, color = WHITE), black_outline_block, - render.Box(width=10, height=6, color=WHITE), + render.Box(width = 10, height = 6, color = WHITE), black_outline_block, - render.Box(width=10, height=5, color=WHITE), + render.Box(width = 10, height = 5, color = WHITE), ], ) @@ -56,22 +56,22 @@ def draw_hour(hour, minute, show_clock): hour = "0%d" % hour if minute < 10: minute = "0%d" % minute - return render.Text("%s:%s" % (hour, minute), color=BLACK) + return render.Text("%s:%s" % (hour, minute), color = BLACK) def draw_red_block(white_blocks): white_width = 67 - (white_blocks * 13) if white_blocks == 0: white_width -= 9 - red_block = render.Box(width=white_width, height=20, color=RED) + red_block = render.Box(width = white_width, height = 20, color = RED) if show_clock: red_block = render.Stack( children = [ red_block, - write_time(hour, minute) + write_time(hour, minute), ], ) return red_block - + if hour == 0: hour_blocks.append(draw_no_hour_block()) hour_blocks.append(black_outline_block) @@ -136,17 +136,17 @@ def draw_hour(hour, minute, show_clock): hour_blocks.append(draw_three_hour_block()) return render.Row( - children=hour_blocks, - expanded=True, + children = hour_blocks, + expanded = True, ) def draw_minute_left(minute): - def draw_five_minute_block(color=WHITE): - return render.Box(width=5, height=4, color=color) + def draw_five_minute_block(color = WHITE): + return render.Box(width = 5, height = 4, color = color) unused_five_minute_row = render.Row( children = [ - render.Box(width=8, height=4, color=WHITE), + render.Box(width = 8, height = 4, color = WHITE), black_outline_block, draw_five_minute_block(), black_outline_block, @@ -158,7 +158,7 @@ def draw_minute_left(minute): black_outline_block, draw_five_minute_block(GRAY), black_outline_block, - ] + ], ) def draw_used_five_minute_row(minute): @@ -167,52 +167,52 @@ def draw_minute_left(minute): minute //= 5 minute *= 7 blocks = [ - render.Box(width=8 + minute, height=4, color=BLUE), - black_outline_block + render.Box(width = 8 + minute, height = 4, color = BLUE), + black_outline_block, ] if minute < 33: - blocks.append(render.Box(width=33 - minute, height=4, color=WHITE)) + blocks.append(render.Box(width = 33 - minute, height = 4, color = WHITE)) blocks.append(black_outline_block) return render.Row( - children=blocks, + children = blocks, ) if minute < 30: five_minute_display = [ draw_used_five_minute_row(minute), black_outline_block, - unused_five_minute_row + unused_five_minute_row, ] else: five_minute_display = [ unused_five_minute_row, black_outline_block, - draw_used_five_minute_row(minute) + draw_used_five_minute_row(minute), ] return render.Column( - children=five_minute_display, + children = five_minute_display, ) def draw_minute_right(minute): modulus = minute % 5 return render.Row( children = [ - render.Box(width=7, height=10, color=YELLOW if modulus == 0 else WHITE), + render.Box(width = 7, height = 10, color = YELLOW if modulus == 0 else WHITE), black_outline_block, render.Column( - children=[ - render.Box(width=4, height=4, color=YELLOW if modulus == 1 else WHITE), + children = [ + render.Box(width = 4, height = 4, color = YELLOW if modulus == 1 else WHITE), black_outline_block, - render.Box(width=4, height=4, color=YELLOW if modulus == 3 else WHITE), + render.Box(width = 4, height = 4, color = YELLOW if modulus == 3 else WHITE), ], ), black_outline_block, render.Column( - children=[ - render.Box(width=4, height=4, color=YELLOW if modulus == 2 else WHITE), + children = [ + render.Box(width = 4, height = 4, color = YELLOW if modulus == 2 else WHITE), black_outline_block, - render.Box(width=4, height=4, color=YELLOW if modulus == 4 else WHITE), + render.Box(width = 4, height = 4, color = YELLOW if modulus == 4 else WHITE), ], ), ], @@ -222,11 +222,13 @@ def main(config): timezone = config.get("$tz", DEFAULT_TIMEZONE) now = time.now().in_location(timezone) hour = now.hour + # if config.get("hour"): # hour = int(config.get("hour")) if hour > 12: hour -= 12 minute = now.minute + # if config.get("minute"): # minute = int(config.get("minute")) show_clock = config.bool("clock", False) @@ -235,13 +237,13 @@ def main(config): children = [ draw_hour(hour, minute, show_clock), render.Row( - children=[ - render.Box(width=10, height=2, color=BLACK), + children = [ + render.Box(width = 10, height = 2, color = BLACK), ], - expanded=True, + expanded = True, ), render.Row( - children=[ + children = [ draw_minute_left(minute), draw_minute_right(minute), ], @@ -276,4 +278,4 @@ def get_schema(): # default = "00", # ) ], - ) \ No newline at end of file + ) From 41087e5897e6c8c20490b3c7f8ab1def22a14dc4 Mon Sep 17 00:00:00 2001 From: theredwillow Date: Wed, 13 Nov 2024 15:37:48 -0800 Subject: [PATCH 03/12] pixlet lint --fix --- apps/mondrianclock/mondrianclock.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mondrianclock/mondrianclock.star b/apps/mondrianclock/mondrianclock.star index 91b221d7b..57dce80a5 100644 --- a/apps/mondrianclock/mondrianclock.star +++ b/apps/mondrianclock/mondrianclock.star @@ -6,8 +6,8 @@ Author: @theredwillow """ load("render.star", "render") -load("time.star", "time") load("schema.star", "schema") +load("time.star", "time") DEFAULT_TIMEZONE = "America/Chicago" From 59d67c20694515c1773c01bef0083bf09433d34b Mon Sep 17 00:00:00 2001 From: theredwillow Date: Wed, 13 Nov 2024 15:52:25 -0800 Subject: [PATCH 04/12] Removed forbidden @ character from manifest --- apps/mondrianclock/manifest.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mondrianclock/manifest.yaml b/apps/mondrianclock/manifest.yaml index 93827852c..5f79b244a 100644 --- a/apps/mondrianclock/manifest.yaml +++ b/apps/mondrianclock/manifest.yaml @@ -3,6 +3,6 @@ id: mondrianclock name: Mondrian Clock summary: Mondrian-inspired clock desc: Displays a Piet Mondrian inspired clock face, De Stijl. -author: @theredwillow +author: theredwillow fileName: mondrianclock.star packageName: mondrianclock From b53cec98beae80f1362b3ed22d4a943c755832f9 Mon Sep 17 00:00:00 2001 From: theredwillow Date: Wed, 13 Nov 2024 16:04:53 -0800 Subject: [PATCH 05/12] pixlet create --- apps/mondrianclock/manifest.yaml | 4 ++-- apps/mondrianclock/mondrianclock.star | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/mondrianclock/manifest.yaml b/apps/mondrianclock/manifest.yaml index 5f79b244a..5fabb02f0 100644 --- a/apps/mondrianclock/manifest.yaml +++ b/apps/mondrianclock/manifest.yaml @@ -1,8 +1,8 @@ --- id: mondrianclock name: Mondrian Clock -summary: Mondrian-inspired clock +summary: P Mondrian-inspired Clock desc: Displays a Piet Mondrian inspired clock face, De Stijl. -author: theredwillow +author: '@theredwillow' fileName: mondrianclock.star packageName: mondrianclock diff --git a/apps/mondrianclock/mondrianclock.star b/apps/mondrianclock/mondrianclock.star index 57dce80a5..0bd48647b 100644 --- a/apps/mondrianclock/mondrianclock.star +++ b/apps/mondrianclock/mondrianclock.star @@ -1,6 +1,6 @@ """ Applet: Mondrian Clock -Summary: Mondrian-inspired clock +Summary: P Mondrian-inspired Clock Description: Displays a Piet Mondrian inspired clock face, De Stijl. Author: @theredwillow """ From 0b1e3b748dbd0548d087f22b4fc54c4768825e75 Mon Sep 17 00:00:00 2001 From: theredwillow Date: Thu, 14 Nov 2024 07:28:30 -0800 Subject: [PATCH 06/12] In-Depth Tutorial --- apps/mondrianclock/.gitignore | 1 + apps/mondrianclock/README.md | 114 +++++++++++++++--- apps/mondrianclock/tutorial-images/01_01.webp | Bin 0 -> 188 bytes apps/mondrianclock/tutorial-images/02_02.webp | Bin 0 -> 206 bytes apps/mondrianclock/tutorial-images/03_03.webp | Bin 0 -> 212 bytes apps/mondrianclock/tutorial-images/04_04.webp | Bin 0 -> 210 bytes apps/mondrianclock/tutorial-images/05_05.webp | Bin 0 -> 220 bytes apps/mondrianclock/tutorial-images/06_15.webp | Bin 0 -> 204 bytes apps/mondrianclock/tutorial-images/07_25.webp | Bin 0 -> 202 bytes apps/mondrianclock/tutorial-images/08_30.webp | Bin 0 -> 210 bytes apps/mondrianclock/tutorial-images/09_35.webp | Bin 0 -> 224 bytes apps/mondrianclock/tutorial-images/10_40.webp | Bin 0 -> 206 bytes apps/mondrianclock/tutorial-images/11_45.webp | Bin 0 -> 228 bytes apps/mondrianclock/tutorial-images/12_00.webp | Bin 0 -> 198 bytes 14 files changed, 100 insertions(+), 15 deletions(-) create mode 100644 apps/mondrianclock/.gitignore create mode 100644 apps/mondrianclock/tutorial-images/01_01.webp create mode 100644 apps/mondrianclock/tutorial-images/02_02.webp create mode 100644 apps/mondrianclock/tutorial-images/03_03.webp create mode 100644 apps/mondrianclock/tutorial-images/04_04.webp create mode 100644 apps/mondrianclock/tutorial-images/05_05.webp create mode 100644 apps/mondrianclock/tutorial-images/06_15.webp create mode 100644 apps/mondrianclock/tutorial-images/07_25.webp create mode 100644 apps/mondrianclock/tutorial-images/08_30.webp create mode 100644 apps/mondrianclock/tutorial-images/09_35.webp create mode 100644 apps/mondrianclock/tutorial-images/10_40.webp create mode 100644 apps/mondrianclock/tutorial-images/11_45.webp create mode 100644 apps/mondrianclock/tutorial-images/12_00.webp diff --git a/apps/mondrianclock/.gitignore b/apps/mondrianclock/.gitignore new file mode 100644 index 000000000..eb7508741 --- /dev/null +++ b/apps/mondrianclock/.gitignore @@ -0,0 +1 @@ +!tutorial-images/* diff --git a/apps/mondrianclock/README.md b/apps/mondrianclock/README.md index 2213ca9a4..5714da2c6 100644 --- a/apps/mondrianclock/README.md +++ b/apps/mondrianclock/README.md @@ -10,26 +10,110 @@ As you learn to read the clock faces, I suggest leaving the configuration for th Hours are displayed next to the red block on the top. A thin white block is merely decorative (for 12 and 6 displays). A thicker column or two of white blocks indicates actual hours. If the red block has moved to the left side of the display, that equals 6 hours. -``` -12: Thin white column / Red -01: White column of 1 / Red -02: White column of 2 / Red -03: White column of 3 / Red -04: White column of 3 / White column of 1 / Red -05: White column of 3 / White column of 2 / Red -06: Red / Thin white column -07: Red / White column of 1 -08: Red / White column of 2 -09: Red / White column of 3 -10: Red / White column of 3 / White column of 1 -11: Red / White column of 3 / White column of 2 -``` - ### Five Minute Increments Five minute intervals are displayed in the bottom left. When the blue box is on the top row, it expands until it fits 25. Conversely, when the blue box is on the bottom row, it expands until it fits 55. The 15 and 45 have convenient grey boxes next to them to make them easier to read. ### One Minute Increments There is a one minute mark in the bottom right. If the big one is yellow, it means to add 0 to the five-minute-read. There is then a box with four smaller boxes in them. The top left means to add one, top right to add two, bottom left to add three, and bottom right to add four. +### Walk-through +Below I have included 12 images that I believe will help you understand how to read the clock better. + +![12:00](tutorial-images/12_00.webp) + +Hr: 0 = Thin white column / Red + +5m: 0 = Blue box doesn't reach 3 white and 2 grey tick marks, less than 30 so top row + +1m: 0 = Big box is yellow + +![1:01](tutorial-images/01_01.webp) + +Hr: 1 = White column of 1 / Red + +5m: 0 = Blue box doesn't reach 3 white and 2 grey tick marks, less than 30 so top row + +1m: 1 = Top left box is yellow + +![2:02](tutorial-images/02_02.webp) + +Hr: 2 = White column of 2 / Red + +5m: 0 = Blue box doesn't reach 3 white and 2 grey tick marks, less than 30 so top row + +1m: 2 = Top right box is yellow + +![3:03](tutorial-images/03_03.webp) + +Hr: 3 = White column of 3 / Red + +5m: 0 = Blue box doesn't reach 3 white and 2 grey tick marks, less than 30 so top row + +1m: 3 = Bottom left box is yellow + +![4:04](tutorial-images/04_04.webp) + +Hr: 4 = White column of 3 / White column of 1 / Red + +5m: 0 = Blue box doesn't reach 3 white and 2 grey tick marks, less than 30 so top row + +1m: 4 = Bottom right box is yellow + +![5:05](tutorial-images/05_05.webp) + +Hr: 5 = White column of 3 / White column of 2 / Red + +5m: 1 = Blue box reaches 1st tick mark, less than 30 so top row + +1m: 0 = Big box is yellow + +![6:15](tutorial-images/06_15.webp) + +Hr: 6 = Red / Thin white column + +5m: 3 = Blue box reaches 3rd tick mark (just before the quarter marking grey box), less than 30 so top row + +1m: 0 = Big box is yellow + +![7:25](tutorial-images/07_25.webp) + +Hr: 7 = Red / White column of 1 + +5m: 5 = Blue box reaches 5th (final) tick mark, less than 30 so top row + +1m: 0 = Big box is yellow + +![8:30](tutorial-images/08_30.webp) + +Hr: 8 = Red / White column of 2 + +5m: 0 (past 30) = Blue box doesn't reach 3 white and 2 grey tick marks, (more than or) equal to 30 so bottom row + +1m: 0 = Big box is yellow + +![9:35](tutorial-images/09_35.webp) + +Hr: 9 = Red / White column of 3 + +5m: 1 (past 30) = Blue box reaches 1st tick mark, (more than or) equal to 30 so bottom row + +1m: 0 = Big box is yellow + +![10:40](tutorial-images/10_40.webp) + +Hr: 10 = Red / White column of 3 / White column of 1 + +5m: 2 (past 30) = Blue box reaches 2nd tick mark, (more than or) equal to 30 so bottom row + +1m: 0 = Big box is yellow + +![11:45](tutorial-images/11_45.webp) + +Hr: 11 = Red / White column of 3 / White column of 2 + +5m: 3 (past 30) = Blue box reaches 3rd tick mark (just before the quarter marking grey box), (more than or) equal to 30 so bottom row + +1m: 0 = Big box is yellow + ## Like my programming? Reach out to me on github [@theredwillow](https://github.com/theredwillow) \ No newline at end of file diff --git a/apps/mondrianclock/tutorial-images/01_01.webp b/apps/mondrianclock/tutorial-images/01_01.webp new file mode 100644 index 0000000000000000000000000000000000000000..a683189a947bde3ae734d45caa76507d312bc2dc GIT binary patch literal 188 zcmV;t07L&$Nk&Gr00012MM6+kP&iDd0000lKfxyeFCY*|QlESc0YTAq%LxPs(v_S4 zfXo_L1q>oda2BLuMU(8eYd*n<+{~5MziV;N-yMJd{r>x$fY(Pc)kw9# qLMvl$;Hi*v(%<*6s%Xld&lJCem^Y2Cgker!amGJxUlu{bvlmgpeKajH1nlQh`Hhb>_ax I6h`l10NmhPhX4Qo literal 0 HcmV?d00001 diff --git a/apps/mondrianclock/tutorial-images/03_03.webp b/apps/mondrianclock/tutorial-images/03_03.webp new file mode 100644 index 0000000000000000000000000000000000000000..7c7da26fe87940d4b96c5db5b6753d15bd792be4 GIT binary patch literal 212 zcmV;_04x7eNk&G@00012MM6+kP&iD$0000lKfxyeFCY*|QlESc0YTAq%LxPs(v_S4 zfXo_L1rBQ4R-%gqpaF{t6wm`8Tbe#prY=pCE(!cSCzYS(o5y|e7^6F z*?$hi8-3RcpJmU#D}Rvh%F#zHm1KRvYGGt=;1-LKzK6GpW?A^m;+GI}M|{MhZMQbb Ot*x;#Xfoc^llNBgEoIsO literal 0 HcmV?d00001 diff --git a/apps/mondrianclock/tutorial-images/04_04.webp b/apps/mondrianclock/tutorial-images/04_04.webp new file mode 100644 index 0000000000000000000000000000000000000000..d1736a8321b76ef9a4267e8d8f872b43060c6891 GIT binary patch literal 210 zcmV;@04@JgNk&G>00012MM6+kP&iD!0000lKfxyeFCY*|QlESc0YTAq%LxPs(v_S4 zfXo_L1rB1{R;q&qpaDY#3TOcD-^DKH!Pln|{a56+k&;}O8Gg|7Vpp|P+rTaNsoS;jkT>C@=?!IrEF*MT4h?@Id9<3#mL`-w+f9|{EYBR W2ysW;I2P^lw5EAl>tyb$*?VU?RBKBB literal 0 HcmV?d00001 diff --git a/apps/mondrianclock/tutorial-images/06_15.webp b/apps/mondrianclock/tutorial-images/06_15.webp new file mode 100644 index 0000000000000000000000000000000000000000..8dd99c2fd8d6f4df331c2eed0c89c64716e7304e GIT binary patch literal 204 zcmV;-05ktmNk&G*00012MM6+kP&iDt0000lKfxyeFCY*|QlESc0YTAq%LxPs(v_S4 zfXo_L1r8!fQlvf-a1J(30U4kXaOhvm?)T2~|6xS`6}fHONZ0O_wok}DkFW}HB?K_M zRjj4FRUvLQD?1^;(&|f0A^B+d^Uy<8JN^)Ih_`%{+2=*AVBLpC(gq8%V zERj-m?392AXBU#}aFL>Q`9!L3BJCR}0~;woT|NN0o2#98Cr_j`+~V51soqyRK0e>O z00012MM6+kP&iDz0000lKfxyeFCY*|QlESc0YTAq%LxPs(v_S4 zfXo_L1r8!fQlvf-a1Jg`0U4kd!2ZST{=oAuM)Y5i+eS)qU6^HfLjNg*@gUL>0(5kI zY`AnRCE(sE0V>^nH&K1XMqq{E=#gc!0&;(Rs%&gh?*P>Y&L3){(4MQzyV3FS`TiYa zCFF+Be70000lKfxyeFCY*|QlESc0YTAq%LxPs(v_S4 zfXo_L1rQoZawO%g0dNdjh2RW<`~L>;mOq&3?LTkUM)ZFIbT3l+QF}sQ9h4c8Qbo7* z>?)8dkSb6KCV?pilLB4wK2~Q1nXu0%i8vEhpd?tIFATsWutWt{@3?&+Nnna8m979x zF{Q3^-{~F<{HTlndRE7sR`8=P|6=mdj~aNoDGr_vJlzzZf9c>a-4>hu{{v43e&Ts~ a+}xwxk>gA2^IR1Nzxd`Po(w!We-8k$TwrVf literal 0 HcmV?d00001 diff --git a/apps/mondrianclock/tutorial-images/10_40.webp b/apps/mondrianclock/tutorial-images/10_40.webp new file mode 100644 index 0000000000000000000000000000000000000000..e6b5e51bf95adedaf7309c40a889c6707abbde22 GIT binary patch literal 206 zcmV;<05ShkNk&G-00012MM6+kP&iDv0000lKfxyeFCY*|QlESc0YTAq%LxPs(v_S4 zfXo_L1r8!fQlvT(a1J(30U3aQ0qkGQf6Os0M)aSJ+cuJ@c6K*Y?e&9VBgFvieRS!h zsWc%_@)jiHrqb_Xkbsicjh;&X+45naMvP%L2pI<>W?A0Ev?gihS>Ma_v;F%n8vLi* ztn#~_^(^fE-v#HR3HP!wH@-PWdwj+Ie8sY#vKbD52|M!NV^fVbG5cA*Q~=!PE?wrn I>b-Xd08HFprvLx| literal 0 HcmV?d00001 diff --git a/apps/mondrianclock/tutorial-images/11_45.webp b/apps/mondrianclock/tutorial-images/11_45.webp new file mode 100644 index 0000000000000000000000000000000000000000..6c2b908109937ae8dee1862ea2485ebd2d34fe4d GIT binary patch literal 228 zcmV^D@lB54tz01c3P{u2!v; zBLoISK_&x?U^36ZirrVvAG0p>WKX5cX=2Aq_RWjk zL-x4po_)UWq7ev9;j_;-?uY1J^1EL6?DLKLS!0MkQjBGif$ssUhSQyF=T6pa`iYO- e1a@zv@8PWyQx-mJU#4RJ=SNrloN+aI?+5_(_G^y- literal 0 HcmV?d00001 diff --git a/apps/mondrianclock/tutorial-images/12_00.webp b/apps/mondrianclock/tutorial-images/12_00.webp new file mode 100644 index 0000000000000000000000000000000000000000..77094cd3da72248631b54afdf3147a85ad542ef0 GIT binary patch literal 198 zcmV;%06G6sNk&G#00012MM6+kP&iDo0000lKfxyeFCY*|QlESc0YTAq%LxPs(v_S4 zfXo_L1r8!fQlyFl0q*}Uz0!*{9Yi1243$PNE%QN zq6*>~P;DRpQ3ZLiQ`IC7(zgS=mfs5+&?3mYKtmj)qGb@x8_-Mtf^>8K{rC6ZF93Xf z92_*T3*5QkWdFd5ffaw> Date: Thu, 14 Nov 2024 07:40:37 -0800 Subject: [PATCH 07/12] Fixed small miss in tutorial language --- apps/mondrianclock/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/mondrianclock/README.md b/apps/mondrianclock/README.md index 5714da2c6..9aa147ac5 100644 --- a/apps/mondrianclock/README.md +++ b/apps/mondrianclock/README.md @@ -95,7 +95,7 @@ Hr: 8 = Red / White column of 2 Hr: 9 = Red / White column of 3 -5m: 1 (past 30) = Blue box reaches 1st tick mark, (more than or) equal to 30 so bottom row +5m: 1 (past 30) = Blue box reaches 1st tick mark, more than or (equal to) 30 so bottom row 1m: 0 = Big box is yellow @@ -103,7 +103,7 @@ Hr: 9 = Red / White column of 3 Hr: 10 = Red / White column of 3 / White column of 1 -5m: 2 (past 30) = Blue box reaches 2nd tick mark, (more than or) equal to 30 so bottom row +5m: 2 (past 30) = Blue box reaches 2nd tick mark, more than or (equal to) 30 so bottom row 1m: 0 = Big box is yellow @@ -111,7 +111,7 @@ Hr: 10 = Red / White column of 3 / White column of 1 Hr: 11 = Red / White column of 3 / White column of 2 -5m: 3 (past 30) = Blue box reaches 3rd tick mark (just before the quarter marking grey box), (more than or) equal to 30 so bottom row +5m: 3 (past 30) = Blue box reaches 3rd tick mark (just before the quarter marking grey box), more than or (equal to) 30 so bottom row 1m: 0 = Big box is yellow From 1d97038ee8bc1b5209c1e4a3039f6e8ec0d69f22 Mon Sep 17 00:00:00 2001 From: theredwillow Date: Thu, 14 Nov 2024 07:45:16 -0800 Subject: [PATCH 08/12] D'oh! --- apps/mondrianclock/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/mondrianclock/README.md b/apps/mondrianclock/README.md index 9aa147ac5..3d1e7d6ab 100644 --- a/apps/mondrianclock/README.md +++ b/apps/mondrianclock/README.md @@ -95,7 +95,7 @@ Hr: 8 = Red / White column of 2 Hr: 9 = Red / White column of 3 -5m: 1 (past 30) = Blue box reaches 1st tick mark, more than or (equal to) 30 so bottom row +5m: 1 (past 30) = Blue box reaches 1st tick mark, more than (or equal to) 30 so bottom row 1m: 0 = Big box is yellow @@ -103,7 +103,7 @@ Hr: 9 = Red / White column of 3 Hr: 10 = Red / White column of 3 / White column of 1 -5m: 2 (past 30) = Blue box reaches 2nd tick mark, more than or (equal to) 30 so bottom row +5m: 2 (past 30) = Blue box reaches 2nd tick mark, more than (or equal to) 30 so bottom row 1m: 0 = Big box is yellow @@ -111,7 +111,7 @@ Hr: 10 = Red / White column of 3 / White column of 1 Hr: 11 = Red / White column of 3 / White column of 2 -5m: 3 (past 30) = Blue box reaches 3rd tick mark (just before the quarter marking grey box), more than or (equal to) 30 so bottom row +5m: 3 (past 30) = Blue box reaches 3rd tick mark (just before the quarter marking grey box), more than (or equal to) 30 so bottom row 1m: 0 = Big box is yellow From ac88b30be9c632c3b969c159109c977cf66c5b61 Mon Sep 17 00:00:00 2001 From: theredwillow Date: Thu, 14 Nov 2024 08:36:51 -0800 Subject: [PATCH 09/12] Converted webp's to jpg's, in order to Remove localized gitignore --- apps/mondrianclock/.gitignore | 1 - apps/mondrianclock/README.md | 24 +++++++++--------- apps/mondrianclock/tutorial-images/01_01.jpg | Bin 0 -> 6477 bytes apps/mondrianclock/tutorial-images/01_01.webp | Bin 188 -> 0 bytes apps/mondrianclock/tutorial-images/02_02.jpg | Bin 0 -> 6986 bytes apps/mondrianclock/tutorial-images/02_02.webp | Bin 206 -> 0 bytes apps/mondrianclock/tutorial-images/03_03.jpg | Bin 0 -> 7188 bytes apps/mondrianclock/tutorial-images/03_03.webp | Bin 212 -> 0 bytes apps/mondrianclock/tutorial-images/04_04.jpg | Bin 0 -> 7125 bytes apps/mondrianclock/tutorial-images/04_04.webp | Bin 210 -> 0 bytes apps/mondrianclock/tutorial-images/05_05.jpg | Bin 0 -> 7696 bytes apps/mondrianclock/tutorial-images/05_05.webp | Bin 220 -> 0 bytes apps/mondrianclock/tutorial-images/06_15.jpg | Bin 0 -> 6728 bytes apps/mondrianclock/tutorial-images/06_15.webp | Bin 204 -> 0 bytes apps/mondrianclock/tutorial-images/07_25.jpg | Bin 0 -> 6579 bytes apps/mondrianclock/tutorial-images/07_25.webp | Bin 202 -> 0 bytes apps/mondrianclock/tutorial-images/08_30.jpg | Bin 0 -> 6934 bytes apps/mondrianclock/tutorial-images/08_30.webp | Bin 210 -> 0 bytes apps/mondrianclock/tutorial-images/09_35.jpg | Bin 0 -> 7189 bytes apps/mondrianclock/tutorial-images/09_35.webp | Bin 224 -> 0 bytes apps/mondrianclock/tutorial-images/10_40.jpg | Bin 0 -> 7776 bytes apps/mondrianclock/tutorial-images/10_40.webp | Bin 206 -> 0 bytes apps/mondrianclock/tutorial-images/11_45.jpg | Bin 0 -> 8123 bytes apps/mondrianclock/tutorial-images/11_45.webp | Bin 228 -> 0 bytes apps/mondrianclock/tutorial-images/12_00.jpg | Bin 0 -> 6695 bytes apps/mondrianclock/tutorial-images/12_00.webp | Bin 198 -> 0 bytes 26 files changed, 12 insertions(+), 13 deletions(-) delete mode 100644 apps/mondrianclock/.gitignore create mode 100644 apps/mondrianclock/tutorial-images/01_01.jpg delete mode 100644 apps/mondrianclock/tutorial-images/01_01.webp create mode 100644 apps/mondrianclock/tutorial-images/02_02.jpg delete mode 100644 apps/mondrianclock/tutorial-images/02_02.webp create mode 100644 apps/mondrianclock/tutorial-images/03_03.jpg delete mode 100644 apps/mondrianclock/tutorial-images/03_03.webp create mode 100644 apps/mondrianclock/tutorial-images/04_04.jpg delete mode 100644 apps/mondrianclock/tutorial-images/04_04.webp create mode 100644 apps/mondrianclock/tutorial-images/05_05.jpg delete mode 100644 apps/mondrianclock/tutorial-images/05_05.webp create mode 100644 apps/mondrianclock/tutorial-images/06_15.jpg delete mode 100644 apps/mondrianclock/tutorial-images/06_15.webp create mode 100644 apps/mondrianclock/tutorial-images/07_25.jpg delete mode 100644 apps/mondrianclock/tutorial-images/07_25.webp create mode 100644 apps/mondrianclock/tutorial-images/08_30.jpg delete mode 100644 apps/mondrianclock/tutorial-images/08_30.webp create mode 100644 apps/mondrianclock/tutorial-images/09_35.jpg delete mode 100644 apps/mondrianclock/tutorial-images/09_35.webp create mode 100644 apps/mondrianclock/tutorial-images/10_40.jpg delete mode 100644 apps/mondrianclock/tutorial-images/10_40.webp create mode 100644 apps/mondrianclock/tutorial-images/11_45.jpg delete mode 100644 apps/mondrianclock/tutorial-images/11_45.webp create mode 100644 apps/mondrianclock/tutorial-images/12_00.jpg delete mode 100644 apps/mondrianclock/tutorial-images/12_00.webp diff --git a/apps/mondrianclock/.gitignore b/apps/mondrianclock/.gitignore deleted file mode 100644 index eb7508741..000000000 --- a/apps/mondrianclock/.gitignore +++ /dev/null @@ -1 +0,0 @@ -!tutorial-images/* diff --git a/apps/mondrianclock/README.md b/apps/mondrianclock/README.md index 3d1e7d6ab..ecf251511 100644 --- a/apps/mondrianclock/README.md +++ b/apps/mondrianclock/README.md @@ -19,7 +19,7 @@ There is a one minute mark in the bottom right. If the big one is yellow, it mea ### Walk-through Below I have included 12 images that I believe will help you understand how to read the clock better. -![12:00](tutorial-images/12_00.webp) +![12:00](tutorial-images/12_00.jpg) Hr: 0 = Thin white column / Red @@ -27,7 +27,7 @@ Hr: 0 = Thin white column / Red 1m: 0 = Big box is yellow -![1:01](tutorial-images/01_01.webp) +![1:01](tutorial-images/01_01.jpg) Hr: 1 = White column of 1 / Red @@ -35,7 +35,7 @@ Hr: 1 = White column of 1 / Red 1m: 1 = Top left box is yellow -![2:02](tutorial-images/02_02.webp) +![2:02](tutorial-images/02_02.jpg) Hr: 2 = White column of 2 / Red @@ -43,7 +43,7 @@ Hr: 2 = White column of 2 / Red 1m: 2 = Top right box is yellow -![3:03](tutorial-images/03_03.webp) +![3:03](tutorial-images/03_03.jpg) Hr: 3 = White column of 3 / Red @@ -51,7 +51,7 @@ Hr: 3 = White column of 3 / Red 1m: 3 = Bottom left box is yellow -![4:04](tutorial-images/04_04.webp) +![4:04](tutorial-images/04_04.jpg) Hr: 4 = White column of 3 / White column of 1 / Red @@ -59,7 +59,7 @@ Hr: 4 = White column of 3 / White column of 1 / Red 1m: 4 = Bottom right box is yellow -![5:05](tutorial-images/05_05.webp) +![5:05](tutorial-images/05_05.jpg) Hr: 5 = White column of 3 / White column of 2 / Red @@ -67,7 +67,7 @@ Hr: 5 = White column of 3 / White column of 2 / Red 1m: 0 = Big box is yellow -![6:15](tutorial-images/06_15.webp) +![6:15](tutorial-images/06_15.jpg) Hr: 6 = Red / Thin white column @@ -75,7 +75,7 @@ Hr: 6 = Red / Thin white column 1m: 0 = Big box is yellow -![7:25](tutorial-images/07_25.webp) +![7:25](tutorial-images/07_25.jpg) Hr: 7 = Red / White column of 1 @@ -83,7 +83,7 @@ Hr: 7 = Red / White column of 1 1m: 0 = Big box is yellow -![8:30](tutorial-images/08_30.webp) +![8:30](tutorial-images/08_30.jpg) Hr: 8 = Red / White column of 2 @@ -91,7 +91,7 @@ Hr: 8 = Red / White column of 2 1m: 0 = Big box is yellow -![9:35](tutorial-images/09_35.webp) +![9:35](tutorial-images/09_35.jpg) Hr: 9 = Red / White column of 3 @@ -99,7 +99,7 @@ Hr: 9 = Red / White column of 3 1m: 0 = Big box is yellow -![10:40](tutorial-images/10_40.webp) +![10:40](tutorial-images/10_40.jpg) Hr: 10 = Red / White column of 3 / White column of 1 @@ -107,7 +107,7 @@ Hr: 10 = Red / White column of 3 / White column of 1 1m: 0 = Big box is yellow -![11:45](tutorial-images/11_45.webp) +![11:45](tutorial-images/11_45.jpg) Hr: 11 = Red / White column of 3 / White column of 2 diff --git a/apps/mondrianclock/tutorial-images/01_01.jpg b/apps/mondrianclock/tutorial-images/01_01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea300548adac73e967061f2a6e787ab372c64045 GIT binary patch literal 6477 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 literal 0 HcmV?d00001 diff --git a/apps/mondrianclock/tutorial-images/01_01.webp b/apps/mondrianclock/tutorial-images/01_01.webp deleted file mode 100644 index a683189a947bde3ae734d45caa76507d312bc2dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 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 literal 0 HcmV?d00001 diff --git a/apps/mondrianclock/tutorial-images/02_02.webp b/apps/mondrianclock/tutorial-images/02_02.webp deleted file mode 100644 index db009a80ef7d100a40ca114c81f3bc59d519efd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206 zcmV;<05ShkNk&G-00012MM6+kP&iDv0000lKfxyeFCY*|QlESc0YTAq%LxPs(v_S4 zfXo_L1rBQ4R-%UmpaF{t6tEuv?H}gb{pifsi2f^b+ek^S%M3qYxWsK=Kr0GSBcW|8 ztW@@$Toq2$Oj2vWrLy#33x&2+mLF{AgiB@HF-jaOm2F4Y2BNB+6E2ngY2Cgker!amGJxUlu{bvlmgpeKajH1nlQh`Hhb>_ax I6h`l10NmhPhX4Qo diff --git a/apps/mondrianclock/tutorial-images/03_03.jpg b/apps/mondrianclock/tutorial-images/03_03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..760d326141a0b1ecf71b7f3ca09e358461e9d7de GIT binary patch literal 7188 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 Ot*x;#Xfoc^llNBgEoIsO diff --git a/apps/mondrianclock/tutorial-images/04_04.jpg b/apps/mondrianclock/tutorial-images/04_04.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12dd0c0e5bd0303ee3c9a229da9b07edbc79c742 GIT binary patch literal 7125 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 PLj5{$_e3rBbnL$X#Z(H( literal 0 HcmV?d00001 diff --git a/apps/mondrianclock/tutorial-images/04_04.webp b/apps/mondrianclock/tutorial-images/04_04.webp deleted file mode 100644 index d1736a8321b76ef9a4267e8d8f872b43060c6891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 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 GvHt_J5*>{I literal 0 HcmV?d00001 diff --git a/apps/mondrianclock/tutorial-images/05_05.webp b/apps/mondrianclock/tutorial-images/05_05.webp deleted file mode 100644 index 3e527793848c7263961daa239eba1c30247f78c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmV<203-iWNk&H000012MM6+kP&iD;0000lKfxyeFCY*|QlESc0YTAq%LxPs(v_S4 zfXo_L1r8!fQlvQ&a1Jg`0U3aQ0qkGQ(!k?lME@DNjikuAE;Ib#j1N@Qr5fKN4-8;X zYA_oN=%w=PYWr}`t$|)DpU-)(#VwUzN0_<+y;R;6;FB25guSnNc!*VX-Z{}r<@tQR z?~ZXjV)3)jci)fJz0`NT_}S;X?-#>C@=?!IrEF*MT4h?@Id9<3#mL`-w+f9|{EYBR W2ysW;I2P^lw5EAl>tyb$*?VU?RBKBB diff --git a/apps/mondrianclock/tutorial-images/06_15.jpg b/apps/mondrianclock/tutorial-images/06_15.jpg new file mode 100644 index 0000000000000000000000000000000000000000..25c10c466965067732840c3d4732bf74ba645f54 GIT binary patch literal 6728 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

!D3{0GQ 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 literal 0 HcmV?d00001 diff --git a/apps/mondrianclock/tutorial-images/07_25.webp b/apps/mondrianclock/tutorial-images/07_25.webp deleted file mode 100644 index 54f307ec863418f8c2bcdf06c517fd07136d73d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmV;*05$(oNk&G(00012MM6+kP&iDs0000lKfxyeFCY*|QlESc0YTAq%LxPs(v_S4 zfXo_L1r8!fQlvf-a1JJ30U1C6>|f0A^B+d^Uy<8JN^)Ih_`%{+2=*AVBLpC(gq8%V zERj-m?392AXBU#}aFL>Q`9!L3BJCR}0~;woT|NN0o2#98Cr_j`+~V51soqyRK0e>O zHUhmxZ?)}|2Z)ScoJL|7=&RXkR-`abBd*^iGbRM9GLt#*WhzJ0P2tVNT z1dxQ^xy5De=IUeX>1}Jn3q1VUQAx>V`Z<8#2gMn3N-8o^Vj>d4drNu%AfP6v1(DNIQ2zD>5iy|#FgeB9Gv^psSh*<~ znJ!;7u(K~LLXRviG4n`XQP%ef$JAkmdHJMng}&p5YU}9Qc;5?4N=YqP5V$C#;!)eC ziqNyPew2_mL`ZRgkop&d|3mh0{%d-dv+ zK7sJ`tO?HP_o37Xh7NIc=|xSmoeGX!|L=S}edS);YQ@v3 zuckTFd!dSqXu9fdc*JU6nV(B)jGwOnNZb*^E>zD~*j0I!&j+(CvP+JCZqv4)%Ik5% z;a;4#s}ah}F5y!hYdM=)5H4cJE+!q+kRN-WKX1@sG5pcn!dT;MTCxqF;DWhF?@j?- z+$^O8)IYK86xiRvO_uG4e%1$f+n#&UELo^AN57=itwXcW^$dM*m(;X|3)3}oZ>&sYpO|v$0N$31yjZb!J ztq=I)98qYmz8s{AOrfqESY09z;{CQdz~EIlQe-muFiB{iziOYH-FBhp8vC-Az*YS? z+4UZLmTszOmHb_Jf6v5S2{hL$z}s#xEYdX!&4WbJ&_EKN8rs|cQ2c)W_BV~=`F|pU zj<$NWg(7tDS;E_q<)}7BZc3ZTkD~c{4`3n{Y&coQ(&fIKZMyb5cLW)Q3T}&g+&V9` zK<8wWGKb=U@o{w(rhuK(<4%DLBP+u`CIxA>fWv#2VvW<*#)d@%y>$AcmzhV14FNuS zEw)J8vP@nGEij$>;04cfH0`BQsj+53OYLpLY4Iy}TzckQ%BVy8+)Ydj`OI%v2C-<;$N?&lSs1Mb>DA@Ii^Ej$32~M4-(i5XK2Z;LMjP}Pkc1$)FVmp z7`@)W4EYs`Sq^&&9LISbwQ$7cYK!e`odR5er+}39+Bg~8V;z+A<{GunTQmB-)H2n& zd>Efd>~aCmxFiQDkHiXb?p;CaUFUXwhwYhBF?~&h!^DWouuIfnW@_wSAp$4FQke@r ziwmboe|fEt#=<_G0~b`Zhedb7%qiFKc_9oi1WlEXruPkFD5T?I^T1$k8r%6=bH@Hx zE}R9YK-sm4QR&S`tiibx97KWl9opzx=lK1!pZhj2wQTEPQ9-P9wP-|PYN=(aTR;JT?8byN}6)2n_XY(OX_u*Fk6MU2zQ*C;RQ}CtK)S=MoB#1qv5R18e zwI|AU@pi8&E!k`0?hCGfPWG@F=pZ==exb_VRGsGr-^JQ<9~3cM)v*$$;EA61j1kkM zi9hN?6;zO?fQzZG^6N(BB)wy2r*%nu8+?a-sxf0uB4%l+5Uo>dPM|SwZ_hHH^K%er z>J)hNc$ADde$Wa2WuL+0jp^7b8fJQcS}s7+>cC^aMV$gWm-FRB-ZdK_jbsZvv?I+L zLFI3@@@KkVKdq@uXSpI6c|Ce@MV`Ihg2b_A(L;RVTWc882b`&7+CwO~>w@H6BbT}J zlh+u4?5vT(yswGuwSAs*3}-c+OGy!sKz8BAQ0KkN9+6N4efMQb$eK=RNvP?4*7(RP!rWx|P{ z3-suU!D;))3e5|*Y1n6X)b;NQjtWf)b^9-V7-hD=RbRc9wZO^oR&;*vu1~7Vd#?l8 z{-6skZ9?H=VZ<~v-tIA~x>4oj3=#owJj5a2B{@+anh#5iALQ_q%9&x&v{0TChDvq_ zLs`}`LYciAE3t*ONjG$o9g|dG8=@Cw)s?=-9buMvl`QLm2ha0avO3M!e#JqwrzAuI zBn>BhC206QTpCkok0QZDfh5f&kEY^q4O%ydids%sg3Lai=-&vU9~I9V^d9pp$I3fXy8S2}Lk?@+>HW$PogOVkVAio1a>u+%y{PQdHjxoIoe>(}#I2@xjQ|A-8) zSUBPyodl1wv^K4mvpYbhW)el433Er>WUcvF>EOd0*HfZQ9ySm{Yw2$R@J6p*2T1?c zlq1IJ0-n7Z_+bO;`p0&0O(pQn_l!vfojv~+hofh&tW)eS=+f$S>JcxQjQ@&*(rZ$IqV6-@|kBGC33l6Rh zNzn9FG4nqK8tG6%boNXUiZAOS{7F5GHAcBz$uJ#_c*M>Mry58?U5yu+cr&7_!uv{e zh~TZ46?WkRXYP@;Ns!}2tIL^oQuuW+PCAL|pJHuZlMIO%boxD}AIWBnZpN`;~^A zm`uNU+wxL6#&VK9uO|wm21jH-kAV({us+4+3dem`r*)Nfr`N}si#Q@iE`SIsR+*WB^GBLnR6+rYW_3Xt<~7}z#|8}RpC(d7i5mNnV) zWZ}V*L*0d(_ODGX$R>x`6XVghJAxZ5mAIYR*vrw=rvT0ByO_ieYcmxuPni2v_}hn@ zj69CSGb2JV-&@ms(UVtRrG9g7rjqLr_By&!0J3_a)aHMgXX$05ud|p^_-=xpiZcGl zT)k=dF8f@M|4TD6$wkJ76ZXM~%f>kiEi8Lw_48$W&ry^hw6093V>|m}bN5>_SKKWh zv|x?-_u`C;Z22)p_Ao7kNC#B1`49MPw73sHOlLFxE##X*ruV3|wtb4U>RhXHkvVaS zvOHYvQy`07$B@)Pl!0UPSRyK2T8I^g9ZN`_{Bu~5j6X5aA*GW-skQyM=(etFl?5_4 zPOd?W3r~o(WgDX3he~s-9Y{(G*;s1VYC%mAx?M=eVdt;-HuotF6) z-n!Nl8Zh&@jFq>}W=37MGM`#f3z5FeD>2{`%sjOHbqc!wW%fDqqx&!ax!2rzPPHbc z^4K)aw+CGg@=7slzW#R$0uI~^s9zUU{MILlUrjqJrXEx5Q@i-xTo&}-CD>eDuudm* zsHBfQu5n(wM1I2|U>EyYR9qA2X6cH{0vaQ)#bQIC(>PNEFxniWH7)^X5dg~=9) zR{pGVAxL?>b^=3UlETV74Tb&ZK(SAnb#B3;>kIc8@_wx!mfr}r#KKjLT4XHHZuG?_r~`mA{ZMdu&qrFTW`f;FId zxtk~AMKf#lai2c6n1~and;D5}ZNDaAz=+lSr5|Wrr*mptU(bQUR83i4H8eZ6g@{+M z<)-%e=uRi67v1!fy3U1QKce z+Zukt_H6uGx!~foFl@(!r?bsce-n??tF$Pd?lFI>l+x#Q&)Vdm@W-oyMrHK=CiP-J z?#k3?%t}|CX}Y=g4BQ8!bxXv*+^IfkTvI;c&Llf%7zI1qIv;PSBEZ};#g8?29fc{w zKx2L*h~yaA1j_TVDM^wYS}@B1XZ?ofV&stzLzMFvRv3^6bAm6*JV{})rDZi+qV5w5 z(UDZ(BqBzNkjRM|ZLCJa)cY@0rBvmAvynaKsTeKm$!gBI^y8^*|LpCQKs9Imy0ZGD z5v=^! zHTZe9dc$-I)QQPZj;3WEm+Xn&DQjeACtdI94;l$zDgl$H)H&@T2Hkis1p0kkA+8(A)*fffTvy9zQt7XsQYl02~sAbXH2+ar!5=IU9YLUqdE}SYs|Ku z@m}zDY3*6VI5DecF)r-#6qI+7HQ zwHeI)5azznONzrycArVbGpP1UsydazkJ_}&W!vjVP7IWU7SpM$(yOZ=TK6rgqvHPv;@x2+vc0aVSi zW~k}|6CtKzf9!N}rMd#z^SR1}Ls_Bmn|c9d<$u%@Mv&ZZKV?#@F0s0x@uy7kaI~+G z{3erw`P#P8^aPo#lTE)}Kc2u)FZ{GKs2_fBpv(G|J-^&4&$u4kU`D=SGDT4b-V(na zB>i>iWq^GqO=usQ%2*~^HMI)~ce3eSR=qZE2K7RHDVUM3ccZ^?P>nSL`ED*1n}Q?DHyMt zp^KBmk4dhh-2ip@U7t#t0#&^7Sp-C|AI8IzZNPXkVZ*Zo#Em zU({}3C^@~)L3@K=wpgUi`rt3c627}33%SC_Yw=`m6yKW!^hNR5X@04!unnA{pDr@FT~OC=Op4t9^#`r7D$P%h zj&?(uR9m{xThb*xviG65FMp;+mxK+D`<(Gm?l89_5p!fWPusd`e)OvW5x=r4GqqTa z-x?F~WH_V=Dm2)?*dgre+C%K4S?>%hQkArWB6t;+yuc-RO&15qo_JZetwxjhT6VET zRm}rx#FYwO3XA#|P4|%%lQqKnT8PXihR%jyZ%!|!jz;ts__=kLuvA|4XZ4WLD~We< z5H@@@J%`4hS)UO8D)d081wCB84zLxiVv7nOyGkohO5%d_?mFuDrxv?++p1XkYr?o+ zOoR6+Y-aZ#*wm|Uu@$Mw=H>Uu5e``PJeR8#S*y}d0foSuIss{y#985c1rU#7|IFbE z;mvHya5FctO5>xHI%L*5&RYko@Fn3Z$$Pi5v*x8oRoX@~JD-Xzbe`)56#MjjIAbmY zD%scC%6LcL>LRNDr@rJ9HXkIm2&tRh=s2yFju6bw98yc!pbmV4muNM^b0^9}VQ?xn zyO7?*OtfEbukAhNdl&4d$BP5wg=C7Q*FQ%dDUYrn`?Z?2nkH^`{}^sa-m=e(Rxeo> zXKLIl93>zw7&2idAP$+U>aWN+O2Oh&_Hf=_7=_^k_zRH9<@or@SLn(3kuj2!_ifdg zyk|~<=iTj@oF`t``BYDVe_ujwj5z?vp>tOW(#6Xy5Y_dd{3Gu8#kb%u#ywKI$4Xmn zhc^~2vW)z2lTWNhsmk*_siUbW7%iHvwCe=H13|}Qu4(SJf#RU?Xrt=nHyi;HFOuuI&JU82PsbWlMm>p z$3(pk0f_pbvpUpyIT**O&A5AG(cYE-2k&O}X0`7D?qG49r`5s4WwTsd_E2=w`>%a8 zJ^_fFDj0JwFa&0$WGv%s8>#hjt#|Rux2vMd^Pga9F%R&YFO;3?KtTZt@4xM+VhNXS I^HcnP0Fy$}CjbBd literal 0 HcmV?d00001 diff --git a/apps/mondrianclock/tutorial-images/08_30.webp b/apps/mondrianclock/tutorial-images/08_30.webp deleted file mode 100644 index 2a4c91d126b7faf60d385d267224ad4791f74ad8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 zcmV;@04@JgNk&G>00012MM6+kP&iDz0000lKfxyeFCY*|QlESc0YTAq%LxPs(v_S4 zfXo_L1r8!fQlvf-a1Jg`0U4kd!2ZST{=oAuM)Y5i+eS)qU6^HfLjNg*@gUL>0(5kI zY`AnRCE(sE0V>^nH&K1XMqq{E=#gc!0&;(Rs%&gh?*P>Y&L3){(4MQzyV3FS`TiYa zCFF+Be742?((F)$#lq(~?w-6b(}2+SZMB1$NTbcX`c zE!}sF*H^!L*L%P3pS$j!v)0~wo&D5rp6B`Pb3`aNy(@vNXaP4h>0m^DJZFFKp+qaIUPMM z4LubNh~}FTEF6psE*>Es9w7}WF)7V|JkDMNl;?nFShsMn*Z^!wEF4O#vu1z=6BsrQ zCPWB>iMo2_V)6B`)zoL>r%OzS^G$6LB?{>`Q*(gAQgRww~LkUO$WsfdWmh9^Y zC1gj6dU$Iur3#s=QUo$ds1kCei{eS98g`R9xKyWZ9;!RK5b`1r;UAHU@}CTo zW-*Vnf%i-Vr7D@r+DSk-;+}j6v+t$kNIjIy%I z8&_Kz9r*_aHS3jwjfIZS+wupOb;S2+Ry1~Hy?aNgnp7D}zi!RR^Vg;(yju=bWW@tSgi%EpCr^B;a9Y3V;6>V}3gB4A4y(Dj&W+Fb+iUS)GTA&2E5(;b z$cVy}JeQt)_-%w@fh${r`Qg%Hg!yjS=@QBS4c_6>UQ%}aN+RF!Ho^PqhcYX10jsil zksUi{8QO9Q!}#>XEVP-5w6CnI)ktW;8WpmN2W=Pzs~%9L2zK?$`IOvz1_X8u5-1!> z9;B)7tDM|z8az+;Y{OHS>Y8C%550Nr#miC0NED=;N|_hGs#gx~DPnsZuw6uihm91m zon5;$6LI6>s!B}#+>;okb3$NFStBb8zv+Hdf&tQ^r=WWG#2v(_C)ii4k|mRp;HoER z>MEzp##Y3`Gg~L2nlPiPnyCT~NGA#w^7XZxDCUX?3E`XoiyDd)99bD&*QPj)-1geK zmbsC9_`3WIn6t}VUf4q5WBY3^;h)Hk8?~m?uH#c2X3qlhsm&-yBPxAb7PFRjVavyW~KDWPS zES+XZzi`|fm!N)GV+6O7O_NiJ9o+FE_qN%9(=B$oq=5RW)$!8lu2n{Zv{~`Xv*N7# zgdMS|^e(9c3a%#g&#e+vdW0pwN{XS@x!ZL1cHFv3luVb~MDK6;Ena)G+Fa%`Jveuv zCAhFjUvJFEp{QTkdr12T0QwWo{naJ@oGC`9mR;!fS#S6Y{k_b*IDgNV>qH~eyi1`- zDu-^x$)K&sf7aNufbL@Fz3&QcEDfCjTcTY%+YhS!W$WI)IFa5v?vz)nxzrDd>&drP zG^!Tbc#J}8@gb>{E?QcPGSH4hy}r#(c8>?YH&{xnCb#tbSRJzceG!6*F(L&K%_tJn zlh+^W31bJL@D$_rHAae~_jFVXQkDvrc2}g(MfR=fD<(gtbw5vp@eh^7Y3riz}_c$=oLgxJO8>i2@Cq!|n^ zMe0hA(*v;s={Qt?q=XkDC|>oseI{lo_%c=5{;Nf zh89xl>0Y|K8(#_UksSeZltjqJa-PqYjC~Qj}V3w z3)^bIT6-j49jnqJk3s!QYLLmW0jmm}k6L6Qskx`fdrJ0hS$B#yHN5@$x*dazCCZ@^ zm7~Rlig|J<$8Gb`$Rx`j%;-*2bU#;l`AaritzitOjZoEZT(&UU<=xjaS{KaRz3RR)d<;we_@+7^osSZWr*}b+2`SP=GZDpXVqVU6TWc~|U9g&1;N!)1&az-5eU z%`lI26!L`{gTx=Z@H|Px9nTU`qx6yc>z^M#O#9@_e>^fg}vTg;Z889x?n$4b`9l_)GB4>x{5Z>3X6wq%DhL&qX7 zun%0qhe4v&@}A!mboyfU+o{ISz|=W_=*m*kpMLzq4p*$kbG+r0pzDH4;IF0iy9eW} zA&ok0NmV^dkqa$H%(_lX&mQQp6yd#dG5)TNjN&1XLst0kA5{POO2+PS=?Bx#-d}Ow z{aWICKTdDjPu;l<4wGalI1M+gXt8F}<7Hf*h=-efP{#JPmf6G2C z`VCTszhxhSf&Uu-$*(5MIr;@}nZ@bu?K_Hz@!N%SdkD?!n}SJ(=+)L>Z5yw&M2sG* ze>pT6HLPElKJ^-Sv&Oi5sdRl~(q1TZ@(duIYi;Rt3S65r_9LFXm@-2+@uB9Fu3hHd z;&G;Oz5L;|#*CeN^}%)Ryk5swQ%Qbsb%l$unM7?O>zf0`qO2O%Q+4D-jt{eGmuHR1 zTjyC&!zoi|u%^+csh7i@PzNmNs)+~{gGvDce<<`SRYMD_+eA~)>=?AtRB@nASIbB= zAueuKsN2$9?>{%+8$YChS|@<(EXyww;Z^MS^~JD}m{hcqizR^(3`qB+Qd@9g?Ct2Z zLz6-V)jwT*qxu6ihVKxX3v0y_s%?ZI)pZ=o?;2f*xL(VDVPuT??ken&Zf8oOZDn_C zOiC4)vMX;in)$_@Ur3X_&Hw7dzsmH#qRR$0)W_39D{CmG3+3rB87z#8Ei?HHdEoDP zL}N~iZ=pM1{Dr0X$bYPsN+^F2eIMlyHLijT?enb-PtL&CJ-bL=VlNB>zy(j#3 z!pFwpyj1L>hs`Gix~<7Fx_j?_oct;FNV}*scgOC@N(@8k@ajv`^JH#|g_)wHYkS%QBpGU2E2l>khleulsTLuJycnDlp$*%s&G0{exOj!pTlbpf$`aw*st|E%8R2Nk1-7KYe=dPi&v=O*3=xV(~h?CekHy-N{1YccmZJ1;bh z;f358P`mo-j);kttsk2F#8Tpq8gFhBTch+!-yD~S!$*v>?MckkcwAyl?`azUO1_u+ z>E?QTgm~{60B1dX=l&zn-fA<>kHDC{g6wYchU*_yi#l}1BaL*4d{nBBEH;gYuj-1C zr*u^vN|Z3J`-J!$uWWg_nQv|K(OKygEFmQfx!L19i{aI=L#h(N8ly}kLn%s_(r2y+ zRuSMI;VU|HFM<#$T2=LCr{x-|JW>2&Stxwj@=JnV^`2eItTSI?h$fV_Jz)$D)ZPh>(mK=68q&8pu+PWv0uxFgP{LI840WRyv&UE zZD!c2e}AC2B9nqfLQxsW!g00WzDrhBT8fB4vDt7TN00mONj3W_wW3^PWLbik^Vxgl zZ|iB^=hyY6O4;k44qu5ha1cBL8YfH~9LxC|Sq5nHUHb~tN*3eV@0uPTOnf;m-o4P3 zKB?Z`Xb#d7ZKbYHb~+Y_3;tE8fXDuKHY14t&Vzu*k=D#}wUU?C+d0GN+eJ&p?t}x0 z;iqw4v;_dO?m+QMe)c5(^+T79RmJJ*Qd5{D?S|k`U*w!*CLm#dH`WPXo%5|wM zsYV}TcnR&{k!I#(1E^rM#?|k(pYLJKfIi>OZjMxgC$9#?=yI{J!fre6ht48F2)MU`wXte~wzOudD!(CSH2mDN>dwsRwZkXnDT(LP<6$#W*^_Ozq=-_@JjLv{L`DHmwn?9TB)IZ6z)-j#ABSKQz(FlS=P ze-JQJc?P6rc@Yz)vl349-G4;)KH!%)(cbfNU+N%{@Xl~!vRhRBOdISBxO#h+$*TC?PB}c`SyVfd zjP1v&o*Km3rP)$4(zSKQQcN+G&{U<2UfwR46{mf~M)h)GUu`Y5nc|fS@8myerKSGm zC@I*)ZRZ>Nsi9(?=hS~=KQ@+@dFt=%*ORRY3#GuYA4)t~J#Q?U=K0w7cyh?;gO-(h z^(QAsrTGVv-9I!6EHFY|5j4{2eAGw<5`tbNt<=8qb`8Y*|tX$YKm0z%nul*ehTN2G@WCE#e zi;Y9OJLi)o!ULsR@j*r0Rz@v7m?Jgq*Vy4rBB-3Q>+Y$6y)?^l55khW&a zcLw^T*<8hvwbSqCIPsPsIt-cV@0g%vbX-@GIANSs(hHhuT9Wvd{ACs_Cm9eg8!N%} zkuUkx55;x)bbn<6ZLwgaZx^Q|N|=6c<*WACt>4W2oiG3G6!U9jTpm~rtYZ};KUp!{ zZ?=PyKA2m*yq=1-K``>SpNmN@ly_F5q}isVh|)-z&l7bcvLnsuiEwm=4^Pr|fXoLG zq+q4A!624i?QG}n>rzQ=jn*+4qYOXdeMW>8&uP7<`ue<&229D|r0*VqsgA(uzeZB5 zRt$+9)Mc+!%&3{x-Slf15vp+LEXx9?t#CVd$$;bvRkVT>(k-r7m#A^9!WSDx4GmDS zx9gyk(VaX(y(SfX$E}h_H{y1?KUjRKdasTEG)M}0rRp4j<)r`~NY`5G!|R7xep^4V zk@*P~R+oM?pwkVn4y8{ZD&fk;h-SYXD$?<*^9bs-f-JX@|0_y|k1^U8{c$b1Ah~Hz?!~+oSPm z8M#{j(z054krAmVo|WAJQPWPgWfSa{G$?mE1DJhewY=$g1i+Bp98sroFXo{VyNwKR zgz6kK_lK zJ(wmXY6n3TO1k#dV6KOnk`HpDF&Vl?XZhyqY77H=u4UY_++Z6%LU6lv?uX{G?2Vj~ zW5%8JtQM}}xdvm4GvNO9220000lKfxyeFCY*|QlESc0YTAq%LxPs(v_S4 zfXo_L1rQoZawO%g0dNdjh2RW<`~L>;mOq&3?LTkUM)ZFIbT3l+QF}sQ9h4c8Qbo7* z>?)8dkSb6KCV?pilLB4wK2~Q1nXu0%i8vEhpd?tIFATsWutWt{@3?&+Nnna8m979x zF{Q3^-{~F<{HTlndRE7sR`8=P|6=mdj~aNoDGr_vJlzzZf9c>a-4>hu{{v43e&Ts~ a+}xwxk>gA2^IR1Nzxd`Po(w!We-8k$TwrVf diff --git a/apps/mondrianclock/tutorial-images/10_40.jpg b/apps/mondrianclock/tutorial-images/10_40.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb1d57d04c77ee403c294de2f7a83b7b974c6504 GIT binary patch literal 7776 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 literal 0 HcmV?d00001 diff --git a/apps/mondrianclock/tutorial-images/10_40.webp b/apps/mondrianclock/tutorial-images/10_40.webp deleted file mode 100644 index e6b5e51bf95adedaf7309c40a889c6707abbde22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206 zcmV;<05ShkNk&G-00012MM6+kP&iDv0000lKfxyeFCY*|QlESc0YTAq%LxPs(v_S4 zfXo_L1r8!fQlvT(a1J(30U3aQ0qkGQf6Os0M)aSJ+cuJ@c6K*Y?e&9VBgFvieRS!h zsWc%_@)jiHrqb_Xkbsicjh;&X+45naMvP%L2pI<>W?A0Ev?gihS>Ma_v;F%n8vLi* ztn#~_^(^fE-v#HR3HP!wH@-PWdwj+Ie8sY#vKbD52|M!NV^fVbG5cA*Q~=!PE?wrn I>b-Xd08HFprvLx| diff --git a/apps/mondrianclock/tutorial-images/11_45.jpg b/apps/mondrianclock/tutorial-images/11_45.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4e3ec5b8ec13e0ece5375a4990e2f68c247c2c62 GIT binary patch literal 8123 zcmd6M1yoeq|L>tyx*O>ZXDCUpbSpJi=Hu{k^x|djIv-dT-BJv(BEq_vf4Y``L5O)zsA&fJj9_Sph&p0{}GC2e`Tfz$y_ZBWLJ^=|4J^?WSE-n!T5iuzlIXO8VAtec5P zeQo!A98w_>EensQ36)@B&F59s6fATrrZ&c$BFi6N#`_6WeP@=2yO5Y7B05(4b^YaP z%jAMoq!{{OLil3DN=$!XdNjWN8nUFeLe~MAOGz>e5Td_o?xM5L*!SZ$gtJCB=2`Y1 z`p>W?vGy*1Ogjk0RN4|_v^$2jOBB`{ULwd+MWtNO1l4zo8)ulN)KlVOD&b}OG+e? zo6KmY$SCuU3ERcjw!4nSTgPy6N9&2#>KGQ0jU4je#s%8C$z2po#X{Oc-|W#W<(o!q zG~|~c;^f8KZnTTh6{$J#Wn^TCc7)K5HRu$Gk)+M0G4G$L(vk|REoVq~hQ1(YhDKvKyqIG->b-AL>FP1j#=59J1t20-Agkm6H>PN&n z!uhz7a3s8e+`;(HJsMRd`jr~uCC;Ppa{4KQnq*dm>Y6-drI_A2wFay2xd-ou(mM=W z?^e0?C5m)+j_$yq0T;9&5Y2#d&9k0>yq413M|opd$4RqkK~_ehmC44{bbVgo-*o~t z=_(vwE5oB|Eep9$7i`JeQ^h`(SaB>bsn1l|Po+XlMiX`ORpN?lGIBvL&Ra*e#}|S} z?bgv-FT>v*2T0N0|MHMq>W}%7jA*|xJ+jUe{{Zzo>^}c=&P1V4TwbguOi(Q??F7~V zAF+OfM&#GG+xQDcgCt#5wv6pg7WwOxn4=M;hWvNGz&=I=UI79Jfrodq57JKGGqo?^ zEqv@zTw*P#^0y4{WlJE5Or^M!5~5Myddur>VF<8Ac48V6fX*kUzoF}T-` zU&GmA$eEsg#AoY$x`CkFz(ye(GuJE60TU3lc$HGbw5=FoGU*B^+V%eAZ@k=9x5U^L zUOJ+$J7(+%A6I!iNqPjJk?1r2+Mj=ZD|lZ42g1XRBP%mE?_BRV@r>pACS6PuKxgXf!HkW1CL^fiZlt#^m{oyE23 zCM>M#UcD1trv5${LaXypXQooccj>U#SpEti!?>^Q*u^!UG0EgkdH!oP4HFSQ-|30P z?3UT4HGBVkWs4evK|*)MOx;Gug2igp>?!2 z{%K0ni<8~wWgl$cKsrSUGC@WabrRQS$V1Mf#-r2GbUD3;uPn3Y2meQ@Hx< z%;|*!xNfu$t_@bUWfq(U(|pS5bUGhPFWDYV{kFwl0*T3VFg3X)Xo4N}&VCW1SquNp zJQ^tvpS;DVB+`1BCU%T2#d81Nty!akWLgymp6bth-)MYg^9;Cr9pzxE2K_3`QqKjJ zIJoaUFxM&Eb&Y?!;qVo25T4*MLZVDfoH-8VOCp+f;UtDC809pR8Gfm^A3G%r>#HqW zHjQ>o#Jd8-cJ{hP3!?`&6O-4=83u&NxFnz6w|bEUh1nO}7zPSHjb6QN7{tavRHjiTH|D93qa zE@{@l*Sv$Kn?s^nd1&xeR#xOvs_uo8BL&`chsy4!o-om-ZvO8=h2W&b3;OICR!3w$ zk-axsl%%+fv56_Mw+({Qn#mzUhq$-5$RMWIUzkZTSJRR6X!?|D=>#c&xG&`AD=Sap zI-OZ$?O&a}PfMfL+cNyv4E&B-zfezuYNGJY8O^~5(^Utu8rps>90iUH7ZMttL=F!2 zsCs_xsQOhw!?xV?hUcJ1Js{e*p>LZSnlhmU{n`Sf(-+TyiS=n5^yB9u7Hu-LXO#YHK}-N*kPSBRWBQ7x*tyS(Uz5Sjz^ZW z=1D(Qo)S#%QIhFb$O_}mgtEDxb4FA=2nsWFLAQ_m<-B*pGr6-*snAziq5_94vqq zN{+#fK>$J5^R(O!HuLzt}be zR@HEX(>I)2eN@_ZbI&Hi8)>#@p>HJZgAQ{DU_HXA`kTcS>OZ>uJ-A89_;G68w?95oe%FPsK=$IlU# zayoMG)ja!kP&(xwOyiVvowSm5-DO7II!P*nr7Fq-qo6e{L+Nc5^SC>2Yin({<^~Hv zV78dqqsKjpGBf+4)(6)BVgI$<$=A! zf2$%ja~nbgCnt40U)VW8A{5v=`@Y(1Ij2LPuqOK#gqva@Nk%fFx~vws^Wr^x!P`n| zU`L30Ohgx)8&cBx5I`52B@}^<90zD)`iC`_BSd|UT(}|=c*{y)T7oQmQ2zKI_D={s zb01Dr@bekfT8~uL2}^RZBNSjMO3^}4+0STMES*ZKSo9;h6&CdA|)O!R#?PGyEpP<)V+jLq{KE^DOlqs z*b-Vj@pU-`&G}f&AWAM`FI{4-R(Z41n2!x;1UdCfjMLxige~X51#pOqik5OvLQE>~ zxGU;pTR(vU-fWjAGn`cQJ%fV{pBle5Ut303SI-e10#GSmOMHMu{0cawS)N@vaKTKy z-l`IGFeza#Ev;$1jHYVqTE_7t zVoqo^Sdax(gaa{L)5y7H;puHV(Q$$_h<}rC4)x!ocu`4ANOf~R`JS}sOW+n-f>wce zX&K>-`u#h-rCRhl6F8y9{;92Bfa{BBqAO0xzCmh79+bp@5FLKb=<#w)8s(!j}RTy{*3zv7KrsUMQ4 zaK})SI8u5Pdj#TQ{<30FKas6b0?e9L<7ewr4l?Lh&;k!v$=idG<1e(3ProcP_yMh7 zII#^I;@1q{NYZ^9#^5ti^5)ZLAaGv}!M#Keu|bp)6e2L*4@vG^UsM19oE>oU>#_LH zd*ZC%3w+P5g8-3dYS-=!`wv!3z6S?i=w+W!ZiVwb^O*_An9rn50nu~4bh@MQ>4A3O z{&SBdmO_wg=Eg5rv9k6a7by?7A;AwB|EeO`_hjHQl}_Ab6C85(_?(3gC)8u7^A}0* z_D;I+mAN#lg{x&EV9JIB1Iuj02ffxbV~AGwhPGXkGbBFTp4&ygP+~t|k)Qbr2oWor z$TB&Loxq9Oo+}Y9)(iUP{dA%67*5X>f{{MxfSj+NHTSEySbJ{h?Ykwa&%o0fkUN?R z2+08GG2%u4>459Mpixg=0Usx&w-xj4S>Iplu$8^m2%FP8z5el7w6_b0PPE7L{7scb8UNs{6j!2^N8Kbx$YhZ=@Y+*&TJ#T@2k6;@bo%Yq@yrj z-bB8j7A#*-m^uyBVuu%XN(taj814L$1CIQSE84M!lk(Dece-EWe|>Z7K2ex>ZJ?IU zv~#Ltjdd9BC@i65^qC--nQKVS2*7XnM~I`)a!PA0VcUc2@%5p$;$6z^_8-00_3gf%{P)84L(b@1{3mA})FXX1kvHMK0{_u}3ck|tOK5HJUf2J}usWoCdz&9$iVXHQ< zQ`XSt?N$Ic{RKuuJ^BS{fc-c zKCbRxPLNIAxEywR8}olFzRafv@_8_ZBnA7=E|Vm&_vejd=d)gujDBxq4(e3;PtFt^;b`ZVq9R!fc8%i)cqM!%uh?a9Y?jd5~+g}vifYQ>Ob>AG+r zj1_g_2l;zk7Onso*vYjk!wjSXD=)S+V(HHtH{?>c8hT?dSRqE@U+dMr%e!fyTy8=V z6Hx$5Tb7RhSI)}*2DW{}W2E=cmY+s1(xi#4c?sk%#-C%WsOXp(bPr0IWrNn;-l#A1< zRniNNZ#eV|M4HZ8Q8juAH@>xjxacP#IJkyTWmq>wq9!{l7*lwi;(dFi`J>{g#6$Xe z4^PXt;hXN0Hu|=q=`auWa64v}0eKKjq(_5D>F*WPo{h>sCU;~~G-Ck7TAF5wI^*+? zY97SoUY3_jyTt@In$3}zbxu`9iv@$+EC~tJ55$NL_FTVGzMH4-c-MxU4=B6g3X%T! zEGm_o7otmfsSpezcUKS?QGN0+2|0_i?E;=H5-&VM`Wiz`mmm8QEMt5-H}Gx!Y<>mI z3^6S+pWz;8&D#uZax9y@$9J6Q694hAT-*j_J1>&V;Rt2>+`>tRcP+|xk+M%o2sSYd z`8QyirS}b$Zyt|6F&mj>91Gk~-CMTH_=KR$PP1K{UoE*ur zE(uEoQ3eVV!0OvhY)#tx4t=q`^uPpi$t+sQnWJ_xUn+2CbNRWapdu; zs?bo|Z)0vD{@!qG-K33a?&kuTaRz&aW$$JS&eu;EKV;237;1e+gDmGRFF54WSnv`_ zlNCyb%DPs*<+Vr*Z0uHYd>IRcJx`}$+~@o*#^3>_Hj)4G&frAFVZN`68p#0tY;^^s zG&FpkH#G@*0_W3MEgsA)TZZ+Uo1Ont2)W*0Duk=XaQK41otTLMZYO{86%O||_|yJ+ zjNlncTDi3kEx`d&(K_4}VcjF*RomHfah6B`LuE!d&|#%+pWfedXI5#nF4lA=fUl{? z)c71g5oK|q#6ZCJAr@~Im6=-^4yzjb4DUQ6W|aW$iYVz3@xg7oxtGt7w-9-8H5%1{ z)5rNa7=N(*l)09J(g5e$pF0clJ6xxTsLNBQ6{=fTz~84=3JmmYc>U|`qL!y2=xqRi z4!0P&RKAqhS>S%}wmuVc1(5d{M(Pp7?LF9?e?bhv4K^LOJE>3^NBjBk%QC6@P*1JZ zqvaGU)-g5-GK@3! z0`0c`;A)UPzxf#e<6F39e>+lZm~CZ*+B6BxR^NNWr&$XF>25~be^TK?zw)H z+h*OYau`&fJcM2hZ~DWBPGwuntVPcObfhGEh?nNk5yUM}dfkfx@kh^QbyId6xt{!O zHyhjI>aDl;9c%D{K1uYQ>|i5NZwYefN=`JkGCGM`oT)W;vSvjim>y5*HOqT1LyyAq z8ut4F@fjA8rc{c)jNt4;TDm)e`xcwS4U)CiML zzEYi`u4q0@iNuZZm=1Qb+~Q@|dCcLfzHq}#gj~mZCTe|{Z4>{O0H@bMg$pv@=<3X7 zrWzw{5swaEJ0|DE_tVNc3?+`#yKHfOFC@U<+NLRopNf=`Rj1GJ?w5QQqp)PAHvJoP zThqjUu{pP-qG`|c|MquWY*k5SldZzvY_O=bjYo@IHpbs_| z<2~l1^z;F{L@o{CV__nB$QO&t1c(HKI^Of6$X&XXvah|qUf32iVL_{++ATo zPybUg?CzbWM#u1ymFYVw{i?Rl2l6rt{9}6M{@3n|u{JFG3zTQ>&sfU-^3?Bu_Wbwa zDY<5#VhLMFQgC2(S*MRxxNRhN`<3hH(2qt)_( z0eO)bXF9agO5K7g8ERFxamRdOZ|=^Jc56}w$G)B99(M~bM_a^-Cdo@jxIln;aVgY>IBJxByp6LDe5Fh zfjY}kyq#EOV>yfBZLZ7>4%a}JrV37QkoeSk&294W&M4=a+=}R3N}{&o zPo2J$Wte^C_}JbWv^l+0+#SM+-JmkOmJuR;nlq_vaH0JO$4p1y-;+>;+Advb6<<8% zbjaN5@!0aM&qgJO^(Wh!bRBJWYa6iOkRpgC7Bsd?JE}z;@ zrp7|CRV;iEK~ih|U99&AyEcR#=gYOK!lFi1SBn%m$d!zZhxQ0;x((P$i(Ub2qDsL} zB|?B3`Ap?})UPWq&x0_X_7F}giQ}~r;o97^q@#|?_|09n-F?)zwyF7`r`V-h1ork- zLy52@gWectLItOd;MUtu$+EHfqbIpc$89Twwzbo}V}tz{Qjvon5RfY%y)Ih2p?W_G zQv6CwI>evvP)7CmUhNV>VwK>>llUZ$zc%AvCB(w9it1=%U;CRZQ=IFtu(Xh2ap*+3 z11dHsY9%ew>F4-Kt=_RM3mZSFRhHEY5Bif@vC`PY)b`U-`_}|+i4VVjt#PTrB~mQ3 z_U-ohQ{>v|(%$<1MvARoxwLb!ljNe7g`#G_%=%2CZgVV>Y2GiPi3YR)fF(;-<4^0G&HGV(Ds++*NPwV zcLs$2P6!M$01z*-|AL~1|7@7PWLE$w>Wz>=@D`{6A4?rURvhGJ9M!#%hS#S_0^qux}`R2pXt#OzUYq`x11 XMIiy^D@lB54tz01c3P{u2!v; zBLoISK_&x?U^36ZirrVvAG0p>WKX5cX=2Aq_RWjk zL-x4po_)UWq7ev9;j_;-?uY1J^1EL6?DLKLS!0MkQjBGif$ssUhSQyF=T6pa`iYO- e1a@zv@8PWyQx-mJU#4RJ=SNrloN+aI?+5_(_G^y- diff --git a/apps/mondrianclock/tutorial-images/12_00.jpg b/apps/mondrianclock/tutorial-images/12_00.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ff73ec17deb1c86974cb527b287735012cdabf72 GIT binary patch literal 6695 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 Date: Thu, 14 Nov 2024 10:42:01 -0800 Subject: [PATCH 10/12] Some small refactors --- apps/mondrianclock/mondrianclock.star | 176 +++++++++++++++----------- 1 file changed, 102 insertions(+), 74 deletions(-) diff --git a/apps/mondrianclock/mondrianclock.star b/apps/mondrianclock/mondrianclock.star index 0bd48647b..8794a6db4 100644 --- a/apps/mondrianclock/mondrianclock.star +++ b/apps/mondrianclock/mondrianclock.star @@ -21,7 +21,6 @@ GRAY = "#808080" black_outline_block = render.Box(width = 2, height = 2, color = BLACK) def draw_hour(hour, minute, show_clock): - hour_blocks = [] def draw_no_hour_block(): return render.Box(width = 4, height = 20, color = WHITE) @@ -73,67 +72,93 @@ def draw_hour(hour, minute, show_clock): return red_block if hour == 0: - hour_blocks.append(draw_no_hour_block()) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_red_block(0)) + hour_blocks = [ + draw_no_hour_block(), + black_outline_block, + draw_red_block(0), + ] elif hour == 1: - hour_blocks.append(draw_one_hour_block()) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_red_block(1)) + hour_blocks = [ + draw_one_hour_block(), + black_outline_block, + draw_red_block(1), + ] elif hour == 2: - hour_blocks.append(draw_two_hour_block()) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_red_block(1)) + hour_blocks = [ + draw_two_hour_block(), + black_outline_block, + draw_red_block(1), + ] elif hour == 3: - hour_blocks.append(draw_three_hour_block()) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_red_block(1)) + hour_blocks = [ + draw_three_hour_block(), + black_outline_block, + draw_red_block(1), + ] elif hour == 4: - hour_blocks.append(draw_three_hour_block()) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_one_hour_block()) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_red_block(2)) + hour_blocks = [ + draw_three_hour_block(), + black_outline_block, + draw_one_hour_block(), + black_outline_block, + draw_red_block(2), + ] elif hour == 5: - hour_blocks.append(draw_three_hour_block()) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_two_hour_block()) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_red_block(2)) + hour_blocks = [ + draw_three_hour_block(), + black_outline_block, + draw_two_hour_block(), + black_outline_block, + draw_red_block(2), + ] elif hour == 6: - hour_blocks.append(draw_red_block(0)) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_no_hour_block()) + hour_blocks = [ + draw_red_block(0), + black_outline_block, + draw_no_hour_block(), + ] elif hour == 7: - hour_blocks.append(draw_red_block(1)) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_one_hour_block()) + hour_blocks = [ + draw_red_block(1), + black_outline_block, + draw_one_hour_block(), + ] elif hour == 8: - hour_blocks.append(draw_red_block(1)) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_two_hour_block()) + hour_blocks = [ + draw_red_block(1), + black_outline_block, + draw_two_hour_block(), + ] elif hour == 9: - hour_blocks.append(draw_red_block(1)) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_three_hour_block()) + hour_blocks = [ + draw_red_block(1), + black_outline_block, + draw_three_hour_block(), + ] elif hour == 10: - hour_blocks.append(draw_red_block(2)) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_three_hour_block()) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_one_hour_block()) + hour_blocks = [ + draw_red_block(2), + black_outline_block, + draw_three_hour_block(), + black_outline_block, + draw_one_hour_block(), + ] elif hour == 11: - hour_blocks.append(draw_red_block(2)) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_three_hour_block()) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_two_hour_block()) + hour_blocks = [ + draw_red_block(2), + black_outline_block, + draw_three_hour_block(), + black_outline_block, + draw_two_hour_block(), + ] else: - hour_blocks.append(draw_red_block(2)) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_three_hour_block()) - hour_blocks.append(black_outline_block) - hour_blocks.append(draw_three_hour_block()) + hour_blocks = [ + draw_red_block(2), + black_outline_block, + draw_three_hour_block(), + black_outline_block, + draw_three_hour_block(), + ] return render.Row( children = hour_blocks, @@ -195,24 +220,43 @@ def draw_minute_left(minute): ) def draw_minute_right(minute): - modulus = minute % 5 + minute %= 5 return render.Row( children = [ - render.Box(width = 7, height = 10, color = YELLOW if modulus == 0 else WHITE), + render.Box(width = 7, height = 10, color = YELLOW if minute == 0 else WHITE), black_outline_block, render.Column( children = [ - render.Box(width = 4, height = 4, color = YELLOW if modulus == 1 else WHITE), + render.Box(width = 4, height = 4, color = YELLOW if minute == 1 else WHITE), black_outline_block, - render.Box(width = 4, height = 4, color = YELLOW if modulus == 3 else WHITE), + render.Box(width = 4, height = 4, color = YELLOW if minute == 3 else WHITE), ], ), black_outline_block, render.Column( children = [ - render.Box(width = 4, height = 4, color = YELLOW if modulus == 2 else WHITE), + render.Box(width = 4, height = 4, color = YELLOW if minute == 2 else WHITE), black_outline_block, - render.Box(width = 4, height = 4, color = YELLOW if modulus == 4 else WHITE), + render.Box(width = 4, height = 4, color = YELLOW if minute == 4 else WHITE), + ], + ), + ], + ) + +def draw_clock(hour, minute, show_clock): + return render.Column( + children = [ + draw_hour(hour, minute, show_clock), + render.Row( + children = [ + render.Box(width = 10, height = 2, color = BLACK), + ], + expanded = True, + ), + render.Row( + children = [ + draw_minute_left(minute), + draw_minute_right(minute), ], ), ], @@ -231,25 +275,9 @@ def main(config): # if config.get("minute"): # minute = int(config.get("minute")) - show_clock = config.bool("clock", False) + show_clock = config.bool("clock", True) return render.Root( - child = render.Column( - children = [ - draw_hour(hour, minute, show_clock), - render.Row( - children = [ - render.Box(width = 10, height = 2, color = BLACK), - ], - expanded = True, - ), - render.Row( - children = [ - draw_minute_left(minute), - draw_minute_right(minute), - ], - ), - ], - ), + child = draw_clock(hour, minute, show_clock), ) def get_schema(): From 859ba28ac8f725d1470d68668ebc57bc1536c694 Mon Sep 17 00:00:00 2001 From: theredwillow Date: Thu, 14 Nov 2024 10:42:23 -0800 Subject: [PATCH 11/12] Blurb about Mondrian's possible interpretations --- apps/mondrianclock/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/mondrianclock/README.md b/apps/mondrianclock/README.md index ecf251511..1d4e49291 100644 --- a/apps/mondrianclock/README.md +++ b/apps/mondrianclock/README.md @@ -115,5 +115,11 @@ Hr: 11 = Red / White column of 3 / White column of 2 1m: 0 = Big box is yellow +## What Would Mondrian Think? + +Piet Mondrian was deeply influenced by theosophy, a philosophy that sought to understand the underlying spiritual truths of the universe. He believed that art should express universal harmony, reducing the complexity of the natural world to its most basic, balanced forms. His iconic paintings, with their grids of black lines and primary colors, aimed to convey a sense of order and spiritual evolution. By abstracting real-life objects into their simplest elements, Mondrian sought to reveal the hidden harmony that he believed underpinned all of existence. + +I imagine that Mondrian would earnestly attempt to interpret these clock faces as metaphysical representations. Perhaps he'd be reminded of his visits to the shores of the North Sea. He might see the hour blocks as a rare red sky evening over the vast expanse of the ocean (five-minute block). The bright, yellow light from the lighthouse (one-minute block) guides the large white ships home, despite the impending void of night. The sailors are moments away from the their small Dutch village, where their families recurrently light their warm, yellow candles in anticipation of their safe arrival home. + ## Like my programming? Reach out to me on github [@theredwillow](https://github.com/theredwillow) \ No newline at end of file From 34bf39398b1298536d44e2740e037a4873bc7945 Mon Sep 17 00:00:00 2001 From: theredwillow Date: Thu, 14 Nov 2024 10:43:51 -0800 Subject: [PATCH 12/12] pixlet lint --- apps/mondrianclock/mondrianclock.star | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/mondrianclock/mondrianclock.star b/apps/mondrianclock/mondrianclock.star index 8794a6db4..8b16a74c2 100644 --- a/apps/mondrianclock/mondrianclock.star +++ b/apps/mondrianclock/mondrianclock.star @@ -21,7 +21,6 @@ GRAY = "#808080" black_outline_block = render.Box(width = 2, height = 2, color = BLACK) def draw_hour(hour, minute, show_clock): - def draw_no_hour_block(): return render.Box(width = 4, height = 20, color = WHITE)