Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor - playproject #19

Open
18 of 22 tasks
alyhxn opened this issue Jun 7, 2024 · 26 comments
Open
18 of 22 tasks

Refactor - playproject #19

alyhxn opened this issue Jun 7, 2024 · 26 comments

Comments

@alyhxn
Copy link

alyhxn commented Jun 7, 2024

Todo


  • Update - playproject_v0.0.1
    • @input 📦 playproject_v0.0.1 from comment
    • Identifying and removing useless hard code in our_contributors.js
    • Research and find how to repeat the patterns
    • Change footer's year to dynamic current year
    • Add the new code and test
    • @output 📦 playproject_v0.0.2 from comment


  • Update - playproject_v0.0.3
    • @input 📦 playproject_v0.0.3 from comment
    • Mobile version for supporters and contributors section
    • Making sub-components' CSS independent of their supers
    • Shadow encapsulation of the components
    • Handling the logic change
    • Debugging
    • @output 📦 playproject_v0.0.4 from comment

  • Refactor - playproject
    • Implement language translation
    • Improve contributors section's design
    • Improve supporters section's design
    • outputplayproject_v0.0
@alyhxn
Copy link
Author

alyhxn commented Jun 7, 2024

tasks - 2024.06.07

  • Refactor - playproject
    • @input 📦 playproject_old
    • Inspected whole project - 2h
    • Research about modules - 30min
    • Recorded Worklog - 10min
    • Logged tasks - 5min
    • @output 📦 playproject_v0.0.1

Worklog

worklog-212

@serapath
Copy link
Member

serapath commented Jun 8, 2024

feedback 2024.06.08

Regarding "smooth scroll", the page is old and now there is:
https://css-tricks.com/almanac/properties/s/scroll-behavior/
A native feature, we could maybe use to replace the dependency?

Let's at least try :-)


bel and csjs-inect should be completly replaced


For rellax, i am not sure. maybe take a look at the code and if you think it is easy enough to make our own little helper library, go for it, otherwise, we can also keep it for now i guess.


Components probably don't communicate because there was not much need for communication, so we can still setup our new component structure, but just not really use any communication, because we don't have anything to commnunicate, which makes it simple. yay :-)


Regarding people, I see you added yourself (Ali), but we also have "David" and we have Cypher and Ibrar and it always needs to be easy to add additional people.

We will add them later, so you don't have to bother, but at least for yourself, that's fine and maybe you can provide or add an image to your avatar and title, pick whatever skills you feel would be the right fit. You see what others wrote, but maybe you have yet another preferred way of describing yourself :-)

@alyhxn
Copy link
Author

alyhxn commented Jun 9, 2024

Tasks - 2024.06.09

  • Update - playproject_v0.0.1
    • Identifying and removing useless hard code in our_contributors.js - 1h
    • Research and find how to repeat the patterns - 1h
    • Change footer's year to dynamic current year - 2min
    • Add the new code and test - 1h25min
    • Record worklog - 10min
    • Log tasks - 5min
    • @output 📦 playproject_v0.0.2

Worklog

worklog-213


Feedback

The preview on my fork is not up to date, sorry. I can't push the bundle because I'm working on multiple sections.

@serapath
Copy link
Member

serapath commented Jun 9, 2024

feedback 2024.06.09

Yes, agree with "crazy hard coding".
Let's be practicing lots of refactoring to make good re-usable components where possible :-)

Thanks for worklog. Ibrar is currently working through the playproject as well to see how to improve it UI/UX wise, so maybe at some point you should follow each others worklogs while doing playproject stuff.

@alyhxn
Copy link
Author

alyhxn commented Jun 10, 2024

Tasks - 2024.06.11

  • Update - playproject_v0.0.2
    • Identifying and removing useless hard code in supporters.js - 1h
    • Finding the patterns - 1h
    • Add new dynamic code - 1h
    • Styling and debugging - 3h
    • Recorded worklog - 7min
    • Logged tasks - 3min
    • @output 📦 playproject_v0.0.3

Worklog

worklog-214

@serapath
Copy link
Member

serapath commented Jun 13, 2024

feedback 2024.06.13

We need a way to have a "theme switcher" somewhere in the menu. Behind the scenes, it will use the "theme api".
The "theme api" is powerful, so it could allow a widget to fully customize themes in detail, by providing a whole detailed theme editor on the page so user can customize and save their themes while the page is active without reload.

In order to provide such a powerful realtime live updating "theme api", we need to maybe follow the ideas i described on discord and maybe you can add or refine those.

It needs to take care of:

  1. components reporting they exist, where in the component tree they exist (a meaningful name or path to each component instance) to communicate with
  2. components using their default styles and reporting those to potentially use the "theme api" to query those default styles to display potentially in a "custom theme editor widget"
  3. use the "theme api" to save in localStorage a default theme override and also send the changed/customize styles to the individuals components for them to update live on the page e.g. to switch from light to dark theme or even just customize very targeted a single button component instance that exists somewhere in the page.

regarding island sizes

So the team section and the supporter section, both have small islands. To not make things boring, we should probably just "randomize" the icon component used to display a supporter island.

@alyhxn
Copy link
Author

alyhxn commented Jun 14, 2024

Tasks - 2024.06.15

  • Update - playproject_v0.0.3
    • Mobile version for supporters and contributors section - 3h
    • Making sub-components' CSS independent of their supers - 2h
    • Shadow encapsulation of the components - 3h
    • Handling the logic change - 3h
    • Debugging - 2h
    • Logged tasks - 5min
    • Recorded worklog - 10min
    • @output 📦 playproject_v0.0.4

Worklog

worklog-215

@serapath
Copy link
Member

feedback 2024.06.15

Good job. Looks fine.
Yes, it's fine to skip shadow on e.g. svg or trivial components.

Regarding the navigation.
The idea is, that the main website, which adds sections, will add those into a placeholder component, e.g.:

// ...
const el = document.createElement('div')
const sh = el.attachShadow(shopts)
const sections = [1,2,3,4].map(n => `section${n}`)
sh.innerHTML = `
  <div class="navbar"></div>
  ${sections.map(id => `<div id="${id}"></div>`)}
`
const shadowfy = el => el.attachShadow(shopts)
const shadows = [...sh.children].map(shadowfy)
const [navbar, sec1, sec2, sec3, sec4] = shadows

navbar.append(navbar(sections))
sec1.append(section1())
sec2.append(section2())
sec3.append(section3())
sec4.append(section4())

Now you can use the navigation component and add anchor tags to navigate to sections and those sections are otherwise the id's of the elements that contain the shadow component instances.

This was referenced Jul 17, 2024
@alyhxn
Copy link
Author

alyhxn commented Aug 29, 2024

Tasks - 2024.08.30

  • Update - playproject_v0.0.4
    • Test implementation of defaults - 1h30min
    • Replicating successful results to all components - 3h30min
    • Debugging - 2h
    • Logged tasks - 5min
    • @output 📦 playproject_v0.0.5

Worklog

worklog-230

@serapath
Copy link
Member

feedback 2024.08.30

feedback on discord :-)

@alyhxn
Copy link
Author

alyhxn commented Sep 2, 2024

Tasks - 2024.09.03

  • Update - playproject_v0.0.5
    • Updated slot list to integrate new design in graph - 1h
    • Added infinite slots feature - 3h
    • Divided supporters section - 3h
    • Debugging - 1h
    • Logged tasks - 5min
    • @output 📦 playproject_v0.0.6

Worklog

worklog-231

Proposal

  • Auto collapse duplicate entry elsewhere
  • Coloring of duplicates when selected
  • No more expanding (no jumping either) when a cycle is detected
  • New slot design implementation (below feedback)

@serapath
Copy link
Member

serapath commented Sep 3, 2024

feedback 2024.09.03

graphroot
It is slightlig confusing to see "default" and "dark" theme linked as root level entries.
I would have assumed they only become visible when [1]themes is expanded.

expand/collapse
Now this looks problematic.
We have never described a design where you have the up/down buttons, but the number would not be shown. That seems like a bug.

On the other hand, we also have never defined yet how things look when you e.g. expand up/down and the entry slot list is still expanded. The design you chose seems sensible, but it should also still show the numbers after the 🔼🔽🔼🔽 buttons, thus 🔼🔽1🔼🔽2

Or maybe there is a mistake. In case we are talking about the former being the "collapsed" mode, then that is not correct. The collapsed mode should look different, see expanded:

   ┃┣[5]Ali
   ┃┣[▲][▼]1[▲][▼]2🛠[5]Cypher          👈 // option 1 (might look a bit more neutral?)
   ┃┣🔼🔽1🔼🔽2🔼🔽3🔼🔽4🛠[5]Cypher   👈 // option 2
   ┃┗[5]Ibrar

but collapsed later it looks like

   ┃┣[5]Ali
   ┃┃┌[4]beep
   ┃┃├[5]boop
   ┃┃│ ┌[4]ping
   ┃┃│ ├[5]pong
   ┃┣╈1╈2🛠[5]Cypher
   ┃┃┃ ┣[2]zip
   ┃┃┃ ┗[2]zap
   ┃┃┣[5]foo
   ┃┃┗[5]bar
   ┃┗[5]Ibrar

Otherwise I get what you say.

If we want to "follow" just one design, then we need to decide how that is supposed to look and solve al the "UX problems" and if we have that, we can totally implement that.

What do you suggest?
Let's discuss on discord options to see what we can find.

For example, let's say {...} means an entry is currently SELECTED, maybe when an entry gets selected it could look like this:

   ┃┣[5]Ali
   ┃┃ ▲ ▲
   ┃┣━1━2🛠[5]{Cypher}
   ┃┃ ▼ ▼
   ┃┗[5]Ibrar

and later when still selected

   ┃┣[5]Ali
   ┃┃┌[4]beep
   ┃┃├[5]boop
   ┃┃│ ┌[4]ping
   ┃┃│ ├[5]pong
   ┃┃│▼│▼
   ┃┣╈1╈2🛠[5]{Cypher}
   ┃┃┃▲┃▲
   ┃┃┃ ┣[2]zip
   ┃┃┃ ┗[2]zap
   ┃┃┣[5]foo
   ┃┃┗[5]bar
   ┃┗[5]Ibrar

and later when unselected

   ┃┣[5]Ali
   ┃┃┌[4]beep
   ┃┃├[5]boop
   ┃┃│ ┌[4]ping
   ┃┃│ ├[5]pong
   ┃┣╈1╈2🛠[5]Cypher
   ┃┃┃ ┣[2]zip
   ┃┃┃ ┗[2]zap
   ┃┃┣[5]foo
   ┃┃┗[5]bar
   ┃┗[5]Ibrar

This might also solve the on/off toggle for spaced in front of lines as you say.

is that an improvement?
can we improve further?
any other ideas?

It might also allow us to improve the a themed version from:

   │├🧩Ali
   │├🧩Ibrar
   │└➕➕🗄🗄🔨🧩Cypher
   │         🔧rename📝
   │         🔧unlink🕳️
   │         🔧link📌
   │         🔧copy🖨️
   │         🔧delete❌
   └🧩footer

to

   │├🧩Ali
   │├🧩Ibrar
   │ 🔼 🔼
   ├─➕─🗄🔨🧩{Cypher}
   │ 🔽 🔽 🔧rename📝
   │       🔧unlink🕳️
   │       🔧link📌
   │       🔧copy🖨️
   │       🔧delete❌
   └🧩footer

regarding the bold and thin link connecting lines, i feel we should maybe always use thin lines everywhere, but maybe the currently selected path should switch to bold/thick line. That way we don't have ot rely on color to indicate what is currently selected.

Another thing we could do is, to indicate the path to all currently open editor tabs in the graph explorer as well using double lines, ...we do have the following options:

┏┳━┓
┃┃ ┃
┣╋━┫
┗┻━┛
┌┬─┐
││ │
├┼─┤
└┴─┘
╔╦═╗
║║ ║
╠╬═╣
╚╩═╝

@alyhxn
Copy link
Author

alyhxn commented Sep 6, 2024

Tasks - 2024.09.07

  • Update - playproject_v0.0.6
    • Implemented new design - 5h
    • Added bold selection - 2h
    • Cycle detection - 2h
    • Duplicate indication - 1h
    • Logged tasks - 5min
    • Recorded worklog - 5min
    • @output 📦 playproject_v0.0.7

Worklog

worlog-232

@serapath
Copy link
Member

serapath commented Sep 9, 2024

feedback 2024.09.09

  1. let's remove the timer - this is really annoying when i now tried it
  2. let's only allow to select a single entry at a time, the selected one has the expand arrows and any previously selected entry loses the expand arrows and collapses any non expanded slots
  3. when the orange arrow is clicked to expand, then it changes direction to point down until you click again to collapse, which makes the orange arrow change direction again

Also let's start fixing all bugs and clean up and modularize the code, so the next worklog wont have glitches or bugs anymore and can focus on explaining the code and the modules.
For modularization, lets discuss on discord :-)

@alyhxn
Copy link
Author

alyhxn commented Sep 11, 2024

Proposed Tasks

  • Replace slot timer with one slot opener
  • Rotate the orange slot arrow on click
  • Fix bugs
  • Modularize code as discussed in discord-thread
  • Refactor statedb
  • Implement CRUD to edit component instances without reload.

@alyhxn
Copy link
Author

alyhxn commented Sep 11, 2024

Tasks - 2024.09.12

  • Update - playproject_v0.0.7
    • Replaced slot timer with one slot opener - 15min
    • Rotated the orange slot arrow on click - 5min
    • Debugging - 1h30min
    • Modularized code - 1h
    • Refactoring - 1h
    • Docs update - 20min
    • Logged tasks - 5min
    • Recorded Worklog - 1h
    • @output 📦 playproject_v0.0.8

Worklog

worklog-233-code

@serapath
Copy link
Member

feedback 2024.09.12

It's a 20 minutes worklog, that's not good.
I'll watch it anyway, but let's try next time (if there is a lot to share), to make a little plan what you want to cover and then structure it into multiple worklogs rather than one long one and maybe add a title next to each worklog video linked in the worklog comment too then :-)


Here is some feedback for the first 5 minutes, which explain the graph-explorer, which is generally okay.

duplicates
One rule we have is: no state in the DOM
Make a little const state = {} object and then store properties on it, e.g. which are the currently expanded entries. Maybe state.focus[id] = [...] to store a reference to all DOM "entry" elements with id, ...there are many ways to approach this, but lets work in a way so we never have to lookup information from the DOM.

path
If we had another object const segments = { [id]: i }, you could check if (id in segments) to have O(1) lookup complexity and if an element, we know i is the position in ancestry (or graph "path"). The issue is .includes will be O(n) complexity.

Regarding styling:
Generating css classes dynamically is hard to theme for a designer. Are you sure you can't use some of the following techniques:

  1. https://stackoverflow.com/a/70652364/8697285
  2. https://jsfiddle.net/BgZN9/

To define styling based on inline style variables or attributes. If attributes are used, they should be data- attributes

e.g.

<div class=".graph-entry" data-indentation="10">...</div>
.graph-entry {
  --fallback: 5
  width: calc(10px * attr(data-indentation, var(--falback));
}

or something like that?
Alternative to attributes is css variables.
Is that an option to get rid of dynamically generated css classes? They seem to be very difficult to deal with for a designer. You would never know how many of those exist in practice.

I maybe didnt completely understand the essence of the problem yet.

@alyhxn
Copy link
Author

alyhxn commented Sep 14, 2024

Tasks - 2024.09.15

  • Update - playproject_v0.0.8
    • Multiple fallback experimentation - 2h
    • Data preprocessing implementation - 1h
    • Repeating the success to other components - 3h
    • Debugging - 3h
    • Logged tasks - 5min
    • Recorded screencast - 10min
      -@output 📦 playproject_v0.0.9

Worklog

worklog-234

@serapath
Copy link
Member

feedback 2024.09.15

init
I think this should change as mentioned on discord.

Like this:

// page/demo.js
const main = reqiure('main')
const statedb = require('STATE')
const { admin, sid } = await statedb.init(fallback)
const sdb = statedb()
main(sid)

async function fallback (root_db) {
  const path = './snapshot.json' // page/snapshot.json
  fetch(path).then(async response => {
    const data = await response.json()
    root_db.populate(data)
  }).catch(error => {})
}

The benefit of the above is, that we decouple the way "how" we get the default data. Is it an http request? is it hard coded? is it via websocket? is it via webtransport? is it via webrtc? is it via jsonp? is it by prompting the user with a form? ...many things are possible and it also makes our STATE module smaller to not hard code the fetching itself to e.g. fetch

later components can do:

// src/index.js
const footer = require('footer')
module.exports = main
async function main (sid) {
  const { id, data } = sdb.get(sid, fallback, hub)

  // ...
}
async function fallback (main_db) {
  const data = require('./data.json') // ./src/data.json
  main_db.populate(data)
}

maybe new components could be added by super components like this:

const btn = document.createElement('button')
btn.onclick = event => {
  const sid = sdb.add({
    "css"       : "",
    "shared"    : false,
    "uniq"      : true,
    "subs"      : {}
  })
  const footer_el = footer(sid)
  sh.append(footer_el)
}

@alyhxn
Copy link
Author

alyhxn commented Sep 15, 2024

Task proposals

  • Update demo's statedb implementation
  • things should not use uniq and shared anymore
    • uniq means it is meant for a css component instance
    • shared means it is meant for a module or for all component instances, making the same file a "uniq" listed for all component instances
    • basically, component instances can be grouped, so that would mean something in between uniq and shared
  • component instances should not have access to localStorage, so they should look up stuff using sdb or db or something ...their state basically
  • components should NOT use fetch to get their css files, but instead they should get it from the database and fallback should run once to store it initially in the database if nothing is stored in the database yet

@alyhxn
Copy link
Author

alyhxn commented Sep 22, 2024

Tasks - 2024.09.23

  • Update - playproject_v0.0.9
    • Implementation of new STATE - 2h
    • Apply changes to other files - 5h
    • Testing different methods - 5h
    • Debugging - 2h
    • Logged tasks - 5min
    • Recoreded Worklog - 20min
    • @output 📦 playproject_v0.0.10

Worklog

worklog-235

@alyhxn
Copy link
Author

alyhxn commented Sep 28, 2024

Tasks - 2024.09.29

  • Update - playproject_v0.0.10
    • Updated snapshot.json - 2h
    • Integrating and implementing new data structure- 4h
    • Integration of version system - 30min
    • Debugging - 2h
    • Recorded Worklog - 20min
    • Logged tasks - 5min
    • output 📦 playproject_v0.0.11

Worklog

worklog-236


Proposal

  • CSS storage in DB
  • CONTENT storage in DB
  • theme_widget update to work with new snapshot
  • Some way to automate the snapshot.json creation even the for first time because manually doing it is very exhausting when entries are more than 100, it is not just data entry and it also has ID matching

@serapath
Copy link
Member

serapath commented Sep 30, 2024

feedback 2024.09.30

Thanks, worklog is okay, but overall still a bit messy or different from what i was looking for in some way :-)

  1. doc/STATE.md is not up to date, e.g. still uses db.populate
  2. we have getdb and some code uses sdb.get_sub
  3. let's split it into:
    • doc/STATE/state.md for data model & internal helpers
    • doc/STATE/usage.md for public api docs & usage examples
  4. the README.mdhas "graph data","state data", "theme data" + examples

Let's change that and split this as well.

  • setting data via api calls and fallbacks in components
  • storing data internally in the database

The way we set/get/etc... data in components is not 100% the same as how it is managed internally in STATE.js for storing and persisting.

furthermore:

  • the "state data" shows `[{ ... sub: { [....ids] } }]
  • the example has { sub: { [name]: [...ids] } }

Which one is it?
And can we have a glossary/section below or use comments in the code snippets // or /* ... */ to describe each field or section of fields and what it does and why it is there and how it relates to others and how they are used.

also this doesn't look completely in sync with what is presented inside the worklog video

Whatever is or was discussed in discord needs to be captured as a commit in the repository. Either updates to the code or in this case also or mainly updates to the doc/... folder.


graph explorer

  1. All files need to be displayed in the graph explorer.
    If something isnt displayed, we need to add it.
  2. i was hoping the worklog will start with a summary to share how do we know structure the graph explorer, e.g.
    • datasets (themes/languages/etc...)
    • source code (files & folders)
    • modules (= module instances)
    • instances (=component instances)

data structures

As presented in worklog, not described in doc/... seems getting better, but would be nice if we could slightly change it just to maybe differentiate and make it slightly more readable?
e.g.

  "15": {
    "id": 15,
    "name": "topnav.json",
    "type": "json",
    "data": {},
    "hubs": [4, 14],
    "slotmap": [["hubs"]]
  }

to

  "15": {
    "id": 15,
    "name": "topnav.json",
    "type": "json",
    "data": {},
    "slot": {
      "": [["hubs"]] // slotmap is in the empty key
      "hubs": [4, 14],
    }
  }

But still, the above in general does not accommodate for slot types properly, especially not the module/instance type.
The differentiation between "alive" and "dead" data is not reflected at all.

Basically, a link that is mediated by an intermediate instance

// foo.js
const bar1 = require('bar')
//
const b = bar(sid)

which will lead the "foo" entry to have a link to the "b" instance of type "bar".

  • bar.js is the module code (=dead data)
  • bar is a module instance (=alive data
  • b is an instance of the module instance "bar"

It means, that "foo" cannot communicate with "b" without "bar" being theoretically able to interfere.

  • "b" is like a communication channel with the "bar instance"

regarding data:

There is a difference between a user provided data file, like the links: [...] array. Somebody else could re-use the playproject website and provide diffferent projects as data.
Still, no matter what data is provided by somebody different from the person developing the component, once the component exists, it has an entry in the database, thus the data: field should link to a filename, e.g. data: "topnav.json", but in that case, the name of the topnav state entry: 15: {...} should not also be "topnav.json".

I am not sure if "data:" or "file" is better, but it should always be either the first or the second, probably not a mix.

A traditional file provided by a user does not have that kind of information attached, so we need a new piece of data, which references the e.g. topnav.json and adds all it's relations to it. That piece of data "represents" topnav.json inside the graph explorer or the data structure.

And YES, they need a dedicated location as well. This is what i meant roughly by potentially user provided dataset.
It is different from potentially provided themes and different form potentially provided language translation files.

Basically, there can be any number of datasets an app uses and they can be switched, possibly at runtime :-)

Also the type: 'json' is not important, because the datafile has that type and is called topnav.json and the .json expresses that fact.

Regarding datasets like themes or language translations, imho our approach should think about "mounting" folders and "symlinking" files.


status

status
The status includes a tab id and init check.
If we want to reload a page and restore state, then we need to make sure, all important state can be restored from what was in the database snapshot.


module vs instance fallbacks

I think we already talked about it on discord.
e.g. think of a button

const pattern = './placeholder.svg'
module.exports = card
function card (opts = { text: 'hello' }) {
  return `<div>
    <img src="${pattern}">
    ${opts.text}
  </div>`
}

In the example above, the "card" module, would have a fallback with the "pattern image url", and the "card instance" would have a fallback with opts.text = 'hello'.

Which means, every card has different text based on the argument passed to it, but every card has usually the same pattern image, but of course - all defaults can be changed

Another example:

var counter = 0
module.exports = card
function card (opts = { text: 'hello' }) {
  const pattern = pseudo_random_pattern(counter++)
  return `<div>
    <img src="${pattern}">
    ${opts.text}
  </div>`
}

The above is basically the same, but now we deterministically generate a pattern image based on a number (here a counter), where the "text" is again part of instance fallback state and "counter" is part of module fallback state.

CHANGE LISTENERS:
The reason for sdb.on({ css: oncss }) on the module level is, that, if we have a "counter" or a "pattern" above and lets say they would be loaded from "counter.json" and "pattern.svg", then of course - they can also have changes at runtime, so we need to listen to those potential updates.

@alyhxn
Copy link
Author

alyhxn commented Oct 4, 2024

Tasks - 2024.10.04

  • Update - playproject_v0.0.11
    • CSS and DB storage - 40min
    • theme_editor refactored to work with new state data - 30min
    • Snapshot.json automation - 2h
    • Documentation update - 40min
    • Update data structure and reflect changes - 1h20min
    • Logged tasks - 5min
    • Recorded Worklog - 25min
    • @output 📦 playproject_v0.0.12

Worklog

worklog-237
worklog-237.2

This was referenced Oct 11, 2024
@alyhxn
Copy link
Author

alyhxn commented Oct 23, 2024

Tasks - 2024.10.18

  • Update - playproject_v0.0.12

Worklog

worklog-238

@serapath
Copy link
Member

feedback 2024.10.23
Sadly the worklog video does not show and explain those "DB" changes. Would be cool if in the future, for every update, there would be a small section in the worklog video that walks me through :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

2 participants