Send webhook messages when _apps is longer than 1024 characters.

Because of Discord's limits, the webhook message will not be sent if _apps is longer than 1024 characters. My proposed solution is to create multiple embeds, with fields whose values are not longer than 1024 characters. I also tried to just create multiple fields within a single embed, but it looked bad.
Also had to bump gevent version in requirements.txt because I couldn't install the older version.

@Troughy
Thanks, will give it a try in next few days or weeks 😃

@kurokobo like I said, it looked stupid on my screen, the fields were next to each other, and the games' names did not fit in one line. But now that I think about it, maybe you could use the inline parameter.. I'm gonna test this when I get home

Hey, so I rewrote the entire thing. I realized that by setting inline = False and therefore not having the fields next to each other, it actually looks good. 25(max) fields per embed, 10(max) embeds per message. Everything should be handled, and this should allow for a very large game collection. (Could be unlimited, if we add a delay between the messages, so that the webhook doesn't get ratelimited)
I have tested this with 38 games, it would be nice to test with at least a few hundred (to make sure everything works).

It is also very difficult to even get a list of a few hundred working appids, some games have been removed from the store and those make the script crash. Some other games (like 3590, Plants vs Zombies: goty) also make it crash, I think because they haven't been updated in a while.

Okay, so I temporarily fixed the crashing issue, but there's another limit I didn't see:

Additionally, the combined sum of characters in all title, description, field.name, field.value, footer.text, and author.name fields across all embeds attached to a message must not exceed 6000 characters. Violating any of these constraints will result in a Bad Request response.

The problem is, we don't know author.name. We could calculate with 256 (since that's the maximum for author.name), or maybe make setting the webhook's name in .env mandatory.

f78b5e7   fixes the crashing issue by ignoring games that don't work. I don't know why they don't work, I've checked a few problematic ones on steamdb.info, and they all had their last builds before 2016
It also accounts for the 6000 character limit. I turned this into a draft because there are a few problems:

I hardcoded 256 to account for the author.name variable. I'm pretty sure there is no way to know the webhook's name beforehand, Discord will look at the request, if author.name is set, it will use that, if it isn't, it will use whatever is set in the server's settings.
The code is ugly. Most of the logic is in one single function, and that's something that should be changed. I'm gonna work on it later, just wanted to commit it so you can test it

Thanks for working on this.
I didn't make any test for this yet, but honestly, I only want to check for updates on just a few games, so 1024 characters should be enough for me.
Assuming we use 50 characters per game for update notifications, we won't reach 1024 characters unless we monitor more than 500 games.
Do you actually have a use case where 1024 characters is not enough?
Rather than complicate the logic, is it possible that simply truncating after 1024 characters would be sufficient?
If not, alternatively we can launch additional instances of this tool e.g., 2 instances of 250 games each to monitor 500 games in total.

I do actually have a use case, I monitor all my Steam games, because I want to know when one of them had an update.

Assuming we use 50 characters per game for update notifications, we won't reach 1024 characters unless we monitor more than 500 games.

Uhm, more like 20 games.
I'm gonna work on this in the next few days, it's almost done, just haven't had the time lately. I guess the average person won't have this many games to monitor... And also it seems like I was missing something important: there is no way 500 games are going to be updated at once.. Oh well. I will still finish what I started.


Incorrect display after switching themes.

Describe the bug
After switching theme(use Theme.Apply(ThemeType.*,BackgroundType.*)), the theme color of the window does not change, only after changing the window material (use WindowBackDrop=BackgroundType.*), while the theme function of the page is normal.
The problem appears to have arisen after an update to the system.
To Reproduce
Switch theme and material by Theme.Apply(ThemeType.*,BackgroundType.*);.
Expected behavior
You know.
Screenshots

OS version
Version Windows 11 Professional Workstation Edition
Version 22H2
The installation date  2022-11 -   17
Operating system Version 22621.963
Experience Windows Feature Experience Pack 1000.22638.1000.0
.NET version
6.0.2
WPF-UI NuGet version
2.0.3
Additional context
No response

Probably a duplicate issue of #271 .
Do you think https://github.com/lepoco/wpfui/issues/271#issuecomment-1317563742  can solve your problem?
I had a similar issue of yours and solved like following step:
private void btTheme_Click(object sender, RoutedEventArgs e)
{
    var currentTheme = Wpf.Ui.Appearance.Theme.GetAppTheme();
    var newTheme = currentTheme == Wpf.Ui.Appearance.ThemeType.Dark ? Wpf.Ui.Appearance.ThemeType.Light : Wpf.Ui.Appearance.ThemeType.Dark;
    Wpf.Ui.Appearance.Theme.Apply(
        newTheme,
        Wpf.Ui.Appearance.BackgroundType.Mica, // Change this to None
        true);
}

private void btTheme_Click(object sender, RoutedEventArgs e)
{
    var currentTheme = Wpf.Ui.Appearance.Theme.GetAppTheme();
    var newTheme = currentTheme == Wpf.Ui.Appearance.ThemeType.Dark ? Wpf.Ui.Appearance.ThemeType.Light : Wpf.Ui.Appearance.ThemeType.Dark;
    Wpf.Ui.Appearance.Theme.Apply(
        newTheme,
        Wpf.Ui.Appearance.BackgroundType.None, // Like this
        true);
}

Probably a duplicate issue of #271 . Does #271 (comment) can solve your problem? I had a similar issue of yours and solved like following step:
private void btTheme_Click(object sender, RoutedEventArgs e)
{
    var currentTheme = Wpf.Ui.Appearance.Theme.GetAppTheme();
    var newTheme = currentTheme == Wpf.Ui.Appearance.ThemeType.Dark ? Wpf.Ui.Appearance.ThemeType.Light : Wpf.Ui.Appearance.ThemeType.Dark;
    Wpf.Ui.Appearance.Theme.Apply(
        newTheme,
        Wpf.Ui.Appearance.BackgroundType.Mica, // Change this to None
        true);
}

private void btTheme_Click(object sender, RoutedEventArgs e)
{
    var currentTheme = Wpf.Ui.Appearance.Theme.GetAppTheme();
    var newTheme = currentTheme == Wpf.Ui.Appearance.ThemeType.Dark ? Wpf.Ui.Appearance.ThemeType.Light : Wpf.Ui.Appearance.ThemeType.Dark;
    Wpf.Ui.Appearance.Theme.Apply(
        newTheme,
        Wpf.Ui.Appearance.BackgroundType.None, // Like this
        true);
}

Thank you. I think that's the same problem as #487, but it's not the same problem I'm referring to here.

I have the same problem, but I'm really glad you posted your WindowBackDrop find. I use the WeakReferenceMessenger to let the main window know of the change, then let it switch between WindowBackdropType.Auto and WindowBackdropType.None within 50ms. That cleans up the theme with the user barely noticing anything. A workaround, but it works. So thanks!

Maybe messenger is not necessary:
if(theme.getbackdrop()=backdrop.none) {     theme.apply(theme,backdrop.mica);    thread.sleep(50);     theme.apply(theme,backdrop.none); }
I typed this on phone, the function name may wrong, but I think you know what I mean.
I hope someone try to find out what's the cause and fix it.(I am poor in programming)

Could someone verify if this is still happening on preview.10?

Is this still an issue with the latest version?


Add @checkReturnValue annotation that requires callers to use the return value

It would be very helpful on the .build/.rebuild methods of BuiltValue, for example.
Otherwise, one can easily forget the _built= part in
set foo(int val) => _built = _built.rebuild((b) => b..val = val);

Dart VM version: 2.2.1-dev.4.2+google3-v2.2.1.dev.4.2 (google3) on "linux_x64"
@davidmorgan fyi

Do you see this as being a generally useful annotation, or is this specifically to catch a common error in the way BuiltValue is used?
If it's the latter, then this might want to be part of the checking that the built_value plugin performs.
If it's the former, then could you be a bit more specific about what you mean by "check" or "use"? In the example it means "assigned to a field", but if this is a general annotation it should probably include something more than that.

This is more generic. For example, it can be used on methods that return error values which callers really should not ignore by accident. Similar to the discussion about not awaiting Future returns.
So there are two categories:

methods returning values that should not be ignored (like errors)
methods whose sole purpose is to produce a return value without side effects -> not using the return is always a strong smell

For the latter, I guess any pure method qualifies that doesn't use exceptions as a form of regular alternative exit. But I'm not suggesting that Dart auto-detect such methods. The author would have to annotate them. Such auto-detection would be a different thing to possibly look into.

Java has https://errorprone.info/bugpattern/CheckReturnValue which is the same idea.

See discussion in https://github.com/dart-lang/linter/issues/1888; basic support for @useResult has landed.
Feedback (there) welcome!


Problem about Meters/tile side

[Enter feedback here]
Hello, I want to konw the relationship between tile side and the distance about tile WGS84 proint, but I'm not good at map and English, so please bear with me.
Example
tile size: 256
zoom level: 17
tile side: 305.748
[WGS84]
lon:<PHONE_NUMBER>7941444
lat: 22.550722589903025
boundingbox
[calculate by function "TileXYToBoundingBox" that in sample code ]
[WGS84]
west:<PHONE_NUMBER>3046875
south: 22.550610920226646
east:<PHONE_NUMBER>125
north: 22.55314747840319
Why distance between [west,  south] and [west,  north] is 282.368, but tile side is 305.748 ?

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: a5e829b4-ffb5-9a4c-5cb4-980636e195e0
Version Independent ID: d0ba3e05-4a72-51d0-8ae1-ae0a8eccacd6
Content: Zoom levels and tile grid in Microsoft Azure Maps
Content Source: articles/azure-maps/zoom-levels-and-tile-grid.md
Service: azure-maps
GitHub Login: @anastasia-ms
Microsoft Alias: v-stharr

@Genuineh we'll review your feedback and get back to you shortly. Thanks.

@GiftA-MSFT Thanks. Look forward to your reply.

Hi @Genuineh as per the doc "The Azure Maps SDK's use tiles that have a size of 512 x 512 pixels for road maps, and smaller 256 x 256 pixels for satellite imagery. "
What is the result when you select tile size: 512?
Thanks

............................................

Hi @asergaz , same result in tile size 512

@Genuineh thanks for confirming. I am reaching out to the product team for help on this one. Stay tuned.

@asergaz Thanks. 💪

Hi @Genuineh,
There are three things at play here; EPSG:3857, WGS84 & Pixels. From our docs:
https://docs.microsoft.com/en-us/azure/azure-maps/glossary
WGS84: A set of constants used to relate spatial coordinates to locations on the surface of the map. The WGS84 datum is the standard one used by most online mapping providers and GPS devices. Azure Maps uses the EPSG:3857 coordinate reference system variant of WGS84
https://docs.microsoft.com/en-us/azure/azure-maps/zoom-levels-and-tile-grid?tabs=csharp#tile-coordinates shows a "Meters per pixel" table as to how the tiles can be understood. Further on this page is the translation math from tiles to pixels.
I believe the issue you are encountering is that you are conflating Pixels with tile co-ordinates and these are not equivalent.
Sincerely,
IoTGirl

Hi @IoTGirl
Thanks for your reply.
According to your reply,  the distance calculated in points that EPSG:3857 converted from WGS84 is right value:305.748


Add invariant checking

Addresses #366.
(This PR currently includes #442)

I've checked that this tooling could have caught #420. Sample output:
        intersection produces valid HashMap: FAIL
          *** Failed! Falsified (after 61 tests and 10 shrinks):
          fromList [(K {hash = 265, _x = D},()),(K {hash = 16649, _x = A},())]
          fromList [(K {hash = 265, _x = D},()),(K {hash = 16649, _x = A},())]
          Invalid (INV2_misplaced_hash 265) (Cons 0 Root) /= Valid
          Use --quickcheck-replay=665566 to reproduce.
          Use -p '/intersection/&&/Data.HashMap.Lazy.difference and intersection.intersection produces valid HashMap/' to rerun this test only.

Hmm, is there another bug in the new intersection implementation?! oO

Hmm, is there another bug in the new intersection implementation?! oO

Probably not. I'm getting the same errors with the naive old intersection implementation. I must have made a mistake in the validation logic.

This should be ready for review. I'll hold off on adding more validity tests until I've refactored the existing property tests a bit.

Huzzah!


[Tabs] [Angular] [IOS] Tab layout is broken

Which platform(s) does your issue occur on?
iOS, emulator, 14.4
Please, provide the following version numbers that your issue occurs with:
CLI: 8.0.1
Cross-platform modules: 8.0.0
Runtime(s): 8.0.0
Plugin(s): 5.2.20
https://github.com/NativeScript/NativeScript/issues/9322

@valera1401 please try to sum up the other issue.
Where you seeing this on N 6.x ? I mean your other issue starts by mentioning 6.5.0

@valera1401 please try to sum up the other issue.
Where you seeing this on N 6.x ? I mean your other issue starts by mentioning 6.5.0

The issue was opened by @kenzend for the old version of the Tabs component.
I had the same issue with old Tabs and NS 6.
Now I'm migrating the app to the NS 8.
Replaced old Tabs with @nativescript-community/ui-material-tabs and the issue still exists.

@valera1401 please provide a simple example to reproduce (not angular).

@valera1401 please provide a simple example to reproduce (not angular).

Yes sure. Will try to repeat it without angular.

<ActionBar title="My App" icon="" />

<GridLayout>
    <mdt:Tabs
        style="font-size: 15;"
        selectedIndex="2">
        <mdt:TabStrip>
            <mdt:TabStripItem class="tab" title="Tab Title 1"/>
            <mdt:TabStripItem class="tab" title="Tab Title 2"/>
            <mdt:TabStripItem class="tab" title="Tab Title 3"/>
        </mdt:TabStrip>
        <mdt:TabContentItem>
            <GridLayout>
                <Label text="Tab 1" />
            </GridLayout>
        </mdt:TabContentItem>
        <mdt:TabContentItem>
            <GridLayout columns="auto, auto, auto">
                <GridLayout>
                <Label text="Labe 1" col="0" />
                </GridLayout>
                <GridLayout>
                <Label text="Labe 2" col="1" />
                </GridLayout>
                <GridLayout>
                <Label text="Labe 3" col="2" />
                </GridLayout>
            </GridLayout>
        </mdt:TabContentItem>
        <mdt:TabContentItem>
            <GridLayout>
                <Label text="Tab 3" />
            </GridLayout>
        </mdt:TabContentItem>
    </mdt:Tabs>
</GridLayout>

<ActionBar title="My App" icon="" />

<GridLayout>
    <mdt:Tabs
        style="font-size: 15;"
        selectedIndex="2">
        <mdt:TabStrip>
            <mdt:TabStripItem class="tab" title="Tab Title 1"/>
            <mdt:TabStripItem class="tab" title="Tab Title 2"/>
            <mdt:TabStripItem class="tab" title="Tab Title 3"/>
        </mdt:TabStrip>
        <mdt:TabContentItem>
            <Label text="Tab 1" />
        </mdt:TabContentItem>
        <mdt:TabContentItem>
            <ScrollView>
                    <GridLayout columns="auto, auto, auto">
                        <GridLayout col="0">
                            <Label text="Labe 1" />
                        </GridLayout>
                        <GridLayout col="1" >
                            <Label text="Labe 2" />
                        </GridLayout>
                        <GridLayout col="2">
                            <Label text="Labe 3" />
                        </GridLayout>
                    </GridLayout>
            </ScrollView>
        </mdt:TabContentItem>
        <mdt:TabContentItem>
            <GridLayout>
                <Label text="Tab 3" />
            </GridLayout>
        </mdt:TabContentItem>
    </mdt:Tabs>
</GridLayout>

selectedIndex = 2
Tap on tab 1

selectedIndex = 0
Tap on tab 1

Layout is broken if first navigation on Tab 1 is happening from Tab 2.
If first navigation on Tab 1 is happening from Tab 0 the layout is fine.

@valera1401 It is working perfectly fine here. What emulator, what ios Version? What N version?
I need to know it all

@valera1401 It is working perfectly fine here. What emulator, what ios Version? What N version?
I need to know it all

Was reproduced on the iPhone 12 emulator
IOS 14.4
NS 8.0.1
@nativescript/core 8.0.0,
@nativescript-community/ui-material-tabs 5.2.20
Xcode 12.4
Clean app created with ns create
I will try to reproduce it on another emulator or iPhone.

Checked on iPhone 11 emulator
IOS 13.5
The same behavior

@farfromrefug Could you tell me what version it works fine on? So far, I have been trying on iPhone X Preview, iPhone 8 and above emulators, but nothing works. I am wondering if this only happens on emulators and preview, but will go away after build.

@valera1401 i think it will work for me on any version. think he issue is somewherr else. can you share your project (simple one) where it fails?

Also, here is a playground link if needed: https://play.nativescript.org/?template=play-ng&id=PhTkb8&v=7
tab 0 and 1 are broken if the defaultSelected and currentTabIndex variables in home.component.ts are 2.
If the defaultSelected and currentTabIndex variables in home.component.ts are 0, tap on any tab >= 2 and tap back to 1, tab 1's layout will be broken.

@farfromrefug For some context, I use the featured cradle tab bar from this NativeScript blog: https://blog.nativescript.org/tabs-and-bottomnavigation-nativescripts-two-new-components/
and here is the Playground from that blog: https://play.nativescript.org/?template=play-ng&id=YfZPr1
It works as provided, but after adding 2-3 layout levels, the behavior is not consistent anymore.

iPhone XS MAX (not emulator)
IOS 13.6.1
NS 8.0.1
@nativescript/core 8.0.0,
@nativescript-community/ui-material-tabs 5.2.20
Xcode 12.4
Release build
The same issue.
Tab 3 is selected by default (selectedIndex="2")
Tap on Tab 2
Layout on Tab 2 is broken
blob:https://web.whatsapp.com/6c4cd332-8b6c-40ea-abda-26e8818d5aa7

tabsjs.zip

Archive.zip

@valera1401 I found the source issue. It is a safe area issue. by adding `iosIgnoreSafeArea="true" the scrollview gridlayout it starts working.
This is not a solution! Could you open an issue in N withe sample app, and by referencing this issue too ? Then we could look at fixing this on the N side.
Thanks

Thank you very much.
Finally it's working.
Sry but I'm not sure how to describe the issue for the NS repository.
Also can't find clear documentation what is iosIgnoreSafeArea actually doing

@valera1401 i commented on your N issue. We'll see. About the missing doc yes there is none right now because that prop should not be needed in most cases, we did not have time to document it. but it is self explanatory


[1.6c] Crash when extracting Liquid Helium fluid

Running NuclearCraft through its paces to test inclusion with my group's modpack, and had this crash.
Ran a Thermal Expansion Fluiduct from Liquid He Extractor, with Resonant Servo to pull fluid.  Crash occurred immediately upon activating the servo; I'd guess from trying to introduce the fluid "into the world."
http://pastebin.ca/3373126

Strange... I do not see any mention of Liquid Helium in that report, or NuclearCraft...
I would have to guess I've done something wrong, but I would try to get into touch with KingLemming or someone who knows TE/fluids well. They may be able to tell you what's wrong.

The issue is that your fluid has a viscosity of 0. It's a Fluid system, not a SuperFluid system - it wasn't designed for that and you shouldn't be too surprised when things break as a result. ;)
Yes, liquid helium in a carefully controlled environment at a certain temp will behave as with viscosity 0. Liquid helium in general as it flows through a network of pipes will not. Give it something in the range of 1-5 and it'll be a fair approximation.

Ah, right. Thank you - an easy fix for the next version ;)

Done


Consider increasing DRY across testing suite

see e.g.:

Should we share this across multiple files?

Originally posted by @damonbayer in https://github.com/CDCgov/multisignal-epi-inference/pull/275#discussion_r1685019213

what is DRY?

Stands for "don't repeat yourself"


Question: OPUS encoding in iOS

Hi!
Do you guys know if iOS has builtin support for converting PCM to OPUS nowdays? AVAssetWriter and AVAssetWriterInput can do it when writing to file, but I haven't been able to using AVAudioConverter for live streaming.

Hi @eerimoq,
did you find a solution to live streaming and compressing PCM audio buffer? I'd appreciate any help!
Cheers,
Ondrej

Paused the work before got it to work. Some ideas here: https://github.com/eerimoq/moblin/blob/main/Moblin/HaishinKit/Codec/AudioCodecOutputSettings.swift#L63-L78
There are more OPUS codec stuff in that repo, but nothing has been confirmed to work. Let me know it you get it working.


WebDriverException: Message: json: cannot unmarshal string into Go struct field Caps.enableVideo of type bool

Using robot framework with python selenium2Library
code
`
*** Settings ***
Documentation    Test
Library    String
Library    Selenium2Library
Test Teardown               Close All Browsers
*** Variables ***
${URL}                      https://tut.by
${BROWSER}                  chrome
${ALIAS}                    None
${REMOTE_URL}               http://localhost:4444/wd/hub
${DESIRED_CAPABILITIES}     name:browserTest,enableVideo:true
*** Test Cases ***
Open browser
[Documentation]    Check tat browser can be opened
...                and assert is
Open Browser    ${URL}   ${BROWSER}   ${ALIAS}   ${REMOTE_URL}    ${DESIRED_CAPABILITIES}
Wait Until Element Is Visible    xpath://div[@id="example"]    10
Capture Page Screenshot
*** Keywords ***
`
It transformes to
POST http://<IP_ADDRESS>:4444/wd/hub/session {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "chrome", "platformName": "any"}}, "desiredCapabilities": {"browserName": "chrome", "version": "", "platform": "ANY", "name": "browserTest", "enableVideo": "true"}}

@DmitryNaumovA1qa should be "enableVideo": True - boolean, not a string.

"enableVideo": "true"
this string creates robot framework and I can't influence on it as I set it as name:browserTest,enableVideo:true
Is there a workaround for it?

@DmitryNaumovA1qa take a look at this: http://robotframework.org/SeleniumLibrary/SeleniumLibrary.html#Boolean arguments

@DmitryNaumovA1qa did it help?

nope, make a workaround, create a custom keyword that initializes browser. Did not succeed with Selenium2Library and Selenoid

@DmitryNaumovA1qa Hi, you are using incorrect syntax. It's possible to force boolean in Robot Framework. Look at this example:
*** Settings ***
Library           Selenium2Library

*** Variables ***
&{DESIRED_CAPABILITIES}    name=browserTest    enableVideo=${True}

*** Test Cases ***
Issue554
    Open Browser     https://tut.by    gc    remote_url=http://localhost:4444/wd/hub    desired_capabilities=${DESIRED_CAPABILITIES}
    Sleep    30

@DmitryNaumovA1qa seems to be resolved. Closing. Feel free to reopen is still having this issue.

@DmitryNaumovA1qa Hi, you are using incorrect syntax. It's possible to force boolean in Robot Framework. Look at this example:
*** Settings ***
Library           Selenium2Library

*** Variables ***
&{DESIRED_CAPABILITIES}    name=browserTest    enableVideo=${True}

*** Test Cases ***
Issue554
    Open Browser     https://tut.by    gc    remote_url=http://localhost:4444/wd/hub    desired_capabilities=${DESIRED_CAPABILITIES}
    Sleep    30

Hi, I was trying this on my end also but I encountered this error.
AttributeError: 'NoneType' object has no attribute 'to_capabilities'
Is there any config/setting do I need to setup first?
Thanks

Trying to run Selenoid on my Robot Framework tests but I am unable to view Video or record it.

What am I doing wrong?

@DmitryNaumovA1qa Hi, you are using incorrect syntax. It's possible to force boolean in Robot Framework. Look at this example:
*** Settings ***
Library           Selenium2Library

*** Variables ***
&{DESIRED_CAPABILITIES}    name=browserTest    enableVideo=${True}

*** Test Cases ***
Issue554
    Open Browser     https://tut.by    gc    remote_url=http://localhost:4444/wd/hub    desired_capabilities=${DESIRED_CAPABILITIES}
    Sleep    30

Hi, I was trying this on my end also but I encountered this error. AttributeError: 'NoneType' object has no attribute 'to_capabilities'
Is there any config/setting do I need to setup first?
BTW. I have running Selenoid and Selenoid UI on my local machine.
Thanks

I'm having same error now: AttributeError: 'NoneType' object has no attribute 'to_capabilities'
Have you been able to fix this?
Thx


[v9] TypeScript issue with ref prop

The newest beta version has some kind of type problem when using useSpring with ref !
3 Examples explained  in comments : (using SpringHandle or SpringStartFn )
import React, { useRef, useEffect } from "react";
import { a, useSpring, SpringHandle, SpringStartFn } from "@react-spring/web";

const App: React.FC = () => {
  // a simple spring without ref works just fine!
  const [springs, set] = useSpring(() => ({
    width: "100px",
    height: "120px",
    background: "blue"
  }));

  return <a.div style={springs}></a.div>;
};

export const App2: React.FC = () => {
  // using SpringStartFn as type of ref : styles recognize in a.span but there is no start function in this type! (this actually worked in the last version!
  const ref = useRef<
    SpringStartFn<{
      width: string;
      height: string;
      background: string;
    }>
  >(null);
  const springs = useSpring(() => ({
    ref: ref,
    width: "100px",
    height: "120px",
    background: "blue"
  }));

  useEffect(() => {
    if (ref.current) {
      ref.current.start();
    }
  }, []);
  return <a.div style={springs}></a.div>;
};

export const App3: React.FC = () => {
  // SpringHandle solved the ref problem but now type of style is not compatible!
  const ref = useRef<
    SpringHandle<{
      width: string;
      height: string;
      background: string;
    }>
  >(null);
  const springs = useSpring(() => ({
    ref: ref,
    width: "100px",
    height: "120px",
    background: "blue"
  }));

  useEffect(() => {
    if (ref.current) {
      ref.current.start();
    }
  }, []);
  return <a.div style={springs}></a.div>;
};

export default App;

Sandbox : https://codesandbox.io/s/adoring-react-spring-ts-nzrdz?file=/src/App.tsx:0-1453
EDIT:
I figured it out. it apparently returns a start function as well even if you use ref!!! But locally I still receive an strange Error, even with a simple useSpring (without ref) :

EDIT2 :
turns out if you define functional component like:
function App = () {
  const [springs, set] = useSpring(() => ({
    width: "100px",
    height: "120px",
    background: "blue"
  }));

  return <a.div style={springs}></a.div>;
};

typescript cannot determine the type of style correctly!
define functional component instead like:
const App: React.FC = () => {
  // a simple spring without ref works just fine!
  const [springs, set] = useSpring(() => ({
    width: "100px",
    height: "120px",
    background: "blue"
  }));

  return <a.div style={springs}></a.div>;
};

and it works fine!
Originally posted by @kurosh-z in https://github.com/react-spring/react-spring/issues/985#issuecomment-683331799

Same issue, except I'm animating with a ForwardRefExoticComponent. Haven't spent much time trying to figure it out, I just type casted style to any to avoid it for the time being.
It's also important to note that I have a [mostly] duplicate of this component, animating something else. It works fine there - no ts errors.
Component that tsc fails on:
const Fade = React.forwardRef<
    HTMLDivElement,
    React.PropsWithChildren<ITransition>
>(function Fade(({ children }), ref) {
    const style = useSpring({
        from: { opacity: 0 },
        opacity: open ? 1 : 0
    });

    return (
        <animated.div ref={ref} style={style}>
            {children}
        </animated.div>
    );
});

Component that tsc does not fail on
const SlideInOut = React.forwardRef<HTMLDivElement, Props>(function SlideInOut(
    props,
    ref
) {
    const style = useSpring({
        from: { transform: outAnimation }, // translateY(0%)
        transform: open ? inAnimation : outAnimation // translateY(100%)
    });

    return (
        <animated.div ref={ref} style={style}>
            {children}
        </animated.div>
    );
});

Originally posted by @marwan38 in https://github.com/react-spring/react-spring/issues/985#issuecomment-687087896

@aleclarson This duplicates #1102


2.2.10 fails on Ubuntu 16 and 18

Gah! if it's not one failure it's another. Now 2.2.10, which fixed the dotnet build failure (but apparently only on Windows) fails on Ubuntu 16 and 18 with this:
Repro steps
On a Linux machine (or Linux on Windows) such as Ubuntu 16, 18, or Linux Mint 19:
git clone https://github.com/aarnott/nerdbank.streams
cd nerdbank.streams/src/Nerdbank.Streams
git checkout fixLinuxBuild2
LD_DEBUG=versions dotnet build

The output is long, but includes this error:
      2512:	/usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.3/System.Globalization.Native.so: error: symbol lookup error: undefined symbol: GlobalizationNative_ToAsciiW (fatal)
      2512:	/usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.3/System.Globalization.Native.so: error: symbol lookup error: undefined symbol: GlobalizationNative_GetSortKeyW (fatal)

/home/andrew/.nuget/packages/nerdbank.gitversioning/2.2.10/build/Nerdbank.GitVersioning.targets(63,5): error MSB4018: The "Nerdbank.GitVersioning.Tasks.GetBuildVersion" task failed unexpectedly. [/home/andrew/git/nerdbank.streams/src/Nerdbank.Streams/Nerdbank.Streams.csproj]
/home/andrew/.nuget/packages/nerdbank.gitversioning/2.2.10/build/Nerdbank.GitVersioning.targets(63,5): error MSB4018: System.TypeInitializationException: The type initializer for 'LibGit2Sharp.Core.NativeMethods' threw an exception. ---> System.DllNotFoundException: Unable to load shared library 'git2-6311e88' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: libgit2-6311e88: cannot open shared object file: No such file or directory [/home/andrew/git/nerdbank.streams/src/Nerdbank.Streams/Nerdbank.Streams.csproj]
/home/andrew/.nuget/packages/nerdbank.gitversioning/2.2.10/build/Nerdbank.GitVersioning.targets(63,5): error MSB4018:    at LibGit2Sharp.Core.NativeMethods.git_libgit2_init() [/home/andrew/git/nerdbank.streams/src/Nerdbank.Streams/Nerdbank.Streams.csproj]
/home/andrew/.nuget/packages/nerdbank.gitversioning/2.2.10/build/Nerdbank.GitVersioning.targets(63,5): error MSB4018:    at LibGit2Sharp.Core.NativeMethods.LoadNativeLibrary() [/home/andrew/git/nerdbank.streams/src/Nerdbank.Streams/Nerdbank.Streams.csproj]
/home/andrew/.nuget/packages/nerdbank.gitversioning/2.2.10/build/Nerdbank.GitVersioning.targets(63,5): error MSB4018:    at LibGit2Sharp.Core.NativeMethods..cctor() [/home/andrew/git/nerdbank.streams/src/Nerdbank.Streams/Nerdbank.Streams.csproj]
/home/andrew/.nuget/packages/nerdbank.gitversioning/2.2.10/build/Nerdbank.GitVersioning.targets(63,5): error MSB4018:    --- End of inner exception stack trace --- [/home/andrew/git/nerdbank.streams/src/Nerdbank.Streams/Nerdbank.Streams.csproj]
/home/andrew/.nuget/packages/nerdbank.gitversioning/2.2.10/build/Nerdbank.GitVersioning.targets(63,5): error MSB4018:    at LibGit2Sharp.Core.NativeMethods.git_libgit2_opts(Int32 option, UInt32 level, String path) [/home/andrew/git/nerdbank.streams/src/Nerdbank.Streams/Nerdbank.Streams.csproj]
/home/andrew/.nuget/packages/nerdbank.gitversioning/2.2.10/build/Nerdbank.GitVersioning.targets(63,5): error MSB4018:    at LibGit2Sharp.GlobalSettings.SetConfigSearchPaths(ConfigurationLevel level, String[] paths) [/home/andrew/git/nerdbank.streams/src/Nerdbank.Streams/Nerdbank.Streams.csproj]
/home/andrew/.nuget/packages/nerdbank.gitversioning/2.2.10/build/Nerdbank.GitVersioning.targets(63,5): error MSB4018:    at Nerdbank.GitVersioning.GitExtensions.OpenGitRepo(String pathUnderGitRepo) [/home/andrew/git/nerdbank.streams/src/Nerdbank.Streams/Nerdbank.Streams.csproj]
/home/andrew/.nuget/packages/nerdbank.gitversioning/2.2.10/build/Nerdbank.GitVersioning.targets(63,5): error MSB4018:    at Nerdbank.GitVersioning.VersionOracle.Create(String projectDirectory, String gitRepoDirectory, ICloudBuild cloudBuild, Nullable`1 overrideBuildNumberOffset, String projectPathRelativeToGitRepoRoot) [/home/andrew/git/nerdbank.streams/src/Nerdbank.Streams/Nerdbank.Streams.csproj]
/home/andrew/.nuget/packages/nerdbank.gitversioning/2.2.10/build/Nerdbank.GitVersioning.targets(63,5): error MSB4018:    at Nerdbank.GitVersioning.Tasks.GetBuildVersion.ExecuteInner() [/home/andrew/git/nerdbank.streams/src/Nerdbank.Streams/Nerdbank.Streams.csproj]

@bording @luqunl @AaronRobinsonMSFT With #215 behind us, this is the next thing that appears as a regression. Interestingly enough, the #216 workaround seems to have somehow made things worse since now all projects on all versions of linux fail (rather than #215 which only failed on some projects).
Regarding the LD_DEBUG errors:
      2512:	/usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.3/System.Globalization.Native.so: error: symbol lookup error: undefined symbol: GlobalizationNative_ToAsciiW (fatal)
      2512:	/usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.3/System.Globalization.Native.so: error: symbol lookup error: undefined symbol: GlobalizationNative_GetSortKeyW (fatal)

Is this because Core CLR linked against linux .so files that don't have those symbols at runtime?

@AArnott Which version of LibGit2Sharp are you using? I would expect Ubuntu 16 to be working without a problem, assuming you're pointing to the to the native library correctly.
To support most of the linux distros that .NET Core runs on, you'd need to be using 0.26.0-preview-0027, and then ensure you're loading the correct native library based on the RID.
Even if you do that, however, it's known that Ubuntu 18 doesn't work, because it shipped a newer version of curl. We'd need to build another separate library for that. I have a PR open that does that.
However, instead of having to keep chasing more and more native binaries, there is another plan brewing to reduce the native dependencies and simplify things as much as possible.
So, I would expect 16 to work and 18 to not work.

@AArnott Can you post the entire LD_DEBUG log?

you'd need to be using 0.26.0-preview-0027, and then ensure you're loading the correct native library based on the RID

I'd rather not depend on an unstable package, but if it resolved the issue I could live with that for a while. Do I need to do the work to load the correct native library, or does libgit2sharp take care of that (or at least offer something to help)?

it's known that Ubuntu 18 doesn't work

That's peculiar, since my nbgv tool works fine on Ubuntu 18 (and all other OSs I've tested), and that uses the same version of libgit2sharp and nb.gv. All these issues only show up when running in the context of dotnet build.

Can you post the entire LD_DEBUG log?

I'd be happy to. But the > redirector operator doesn't seem to work in bash. Any suggestion how to modify the command line in my repro steps to capture the log in a file? I'm quite inexperienced in bash.

I may have added curl, I don't know. But the annoying point to me is that msbuild tasks always have dependency issues and tools tend to work. I may just rewrite my msbuild task to spawn my tool.

I may have added curl, I don't know. But the annoying point to me is that msbuild tasks always have dependency issues and tools tend to work. I may just rewrite my msbuild task to spawn my tool.

Honestly that might be the best way to handle it. That way you aren't fighting against .NET Core's assembly loading design that doesn't really account for these kind of scenarios.
On the other hand, don't want to make that chance, if you can wait until it's ready, the 2nd option in https://github.com/dotnet/roslyn/issues/29289#issuecomment-413294637 will definitely help simplify this a lot.

If you do want to keep investigating this, give the stderr redirection a try, because I'd like to see what is actually causing the libgit2 load to fail.

Here is my LD_DEBUG log file. Your stderr redirection idea worked. LD_DEBUG.zip

@AArnott Thanks; Here are the relevant lines:
11132:	checking for version `CURL_OPENSSL_3' in file /usr/lib/x86_64-linux-gnu/libcurl.so.4 [0] required by file /home/andrew/.nuget/packages/nerdbank.gitversioning/2.1.65/build/MSBuildFull/lib/linux/x86_64/libgit2-1196807.so [0]
11132:	/usr/lib/x86_64-linux-gnu/libcurl.so.4: error: version lookup error: version `CURL_OPENSSL_3' not found (required by /home/andrew/.nuget/packages/nerdbank.gitversioning/2.1.65/build/MSBuildFull/lib/linux/x86_64/libgit2-1196807.so) (fatal)

Which version of Ubuntu is the log file from?

That one is from Linux Mint 19, which I believe is based on Ubuntu 18.
It fails on Ubuntu 16 as well though. Perhaps with a different error.

@AArnott Can you get a file from Ubuntu 16 as well?

Here is Ubuntu 16: LD_DEBUG.zip

Yes, sorry. I have 3 machines and forgot to keep them in sync, obviously.
Here is Ubuntu 18 with nb.gv 2.2.10: LD_DEBUG.zip

Ok, I believe I see what's going on.
In the 2.1.65 log, it's searching for and finding libgit2 in /home/andrew/.nuget/packages/nerdbank.gitversioning/2.1.65/build/MSBuildFull/lib/linux/x86_64/libgit2-1196807.so
And then failing to load because of the whole curl/OpenSSL problem I would expect to see on an Ubuntu 18-based machine.
Note that it appears it found the copy in MSBuildFull, not MSBuildCore, so there's probably some bug in what path you're passing in there.
For the two 2.2.10 logs, different behavior can be seen.
It's searching for libgit2, and can't find it. It's looking at /home/andrew/.nuget/packages/nerdbank.gitversioning/2.2.10/build/MSBuildCore/libgit2-6311e88.so
That path doesn't include the /lib/linux/x86_64/ portion it should have.

I wonder if I can forcibly load the native dll myself so that the load context of the managed assembly doesn't matter.

I'm not sure that's possible. That was what @tmat's changes in https://github.com/libgit2/libgit2sharp/pull/1563 were attempting to do (and I had planned on enhancing in https://github.com/libgit2/libgit2sharp/pull/1571), but it turns out that it only works on Windows.
To take full control of the native library loading, we'd have to discard DLLImport altogether, and directly wire up everything manually.

P/Invoke only works on Core CLR if I load libgit2sharp into the Default context

It seems like it would be worth continuing the investigation into why that would be. Is it something that we can resolve in some way, or is it actually a CoreCLR bug?

It seems like it would be worth continuing the investigation into why that would be. Is it something that we can resolve in some way, or is it actually a CoreCLR bug?

I agree. The CoreCLR bug is still active, but inconclusive at the moment. I don't know any other way to workaround it at the moment.

I'm not sure that's possible.

That's a long PR to search. I haven't made it work yet, but given an AssemblyLoadContext-derived type can call LoadUnmanagedDll, it seems like I can force it to load IMO. That's the approach I'm taking. I'm running into a few random snags, which are slowing me down though.

Maybe this is what you were suggesting @bording, but while it seems I can successfully load the native library on-demand, when it comes to p/invoking, it will try again to load it using the Default context and will fail. It's not smart enough to realize the library is already loaded. Perhaps it's because the p/invoke signature merely states git2-6311e88 but the native image that is already loaded is libgit2-6311e88.so.
It works on Windows, but not Linux. Given Linux is the only OS that changes the image name to prefix a lib string, I'm pretty sure that's the problem.  Why is the lib prefix so important? Do we have to keep it?

Yes that is the problem I'm referring to.I don't believe the lib prefix is the problem. You can see in the LD_DEBUG log that .NET Core knows to search for both versions.

I agree. The CoreCLR bug is still active, but inconclusive at the moment. I don't know any other way to workaround it at the moment.

I'm still curious about the repro you have, and how it might be interacting with dotnet/sourcelink. That is the other tool I'm aware of that could also be hitting the problem you're seeing, but AFAIK it's not being seen there.

how it might be interacting with dotnet/sourcelink

There is no interaction, because I'm not using SourceLink on any of these repos.
NB.GV 2.2.3 worked on some projects as well. Maybe the investigation should pursue what's different about the ones it works on and those it doesn't. My only guess is that it works on leaf projects, but not on projects with P2Ps that also use NB.GV. I'm going to (in)validate that hypothesis next.

Hypothesis confirmed: I have the most trivial hello world C# project that works. I then copied it, and added a P2P to the original. Then when I build the copy, the original builds first (and succeeds) and the second one fails.
This is with code equivalent to 2.2.3, BTW, which loads libgit2sharp in my custom AssemblyLoadContext so that it can find the native library.
So perhaps the problem is that once I have loaded libgit2 in one custom assemblyloadcontext, and CoreCLR generates whatever interop stuff it needs for its custom marshaling, subsequently loading it in another assemblyloadcontext causes p/invoke handling to cross wire and fail.

Ooh! early read on a workaround showed promise. I only create one custom Assemblyloadcontext and store it as a static and reuse it for subsequent task invocations. That got two projects building in a row without an error. :)

Interesting. I wonder if this is a similar issue to what using UniqueId.UniqueIdentifier as the MarshalCookie is intending to solve: https://github.com/libgit2/libgit2sharp/blob/master/LibGit2Sharp/Core/NativeMethods.cs#L100
I'd have to track down the original issues, but IIRC that was added to work around a custom marshaling bug when two different versions of LibGit2Sharp were loaded.
In this case, you've still got two different copies of the assembly loaded, but they share the same MarshalCookie, so things are getting messed up.

Well, this will be fix number 3 for getting nb.gv working consistently everywhere (which of course used to work, but Ubuntu 18 and other recent Linux versions broke it). I hope the 3rd time's the charm on this.

Thanks for your help investigating and brainstorming on this, @bording! I really appreciate it.

Glad to help! I wish this stuff was easier to deal with. Having a native dependency always complicates things.


Added management api specification

I have added the initial management API specification.
We will make changes in terms of granular specifications on the APIs.

Thanks for getting this out Jigar. It's a great first version. Here are my comments:

Ideally we should document the request endpoints here as well (e.g api/v1/provider/LeaseStatus or api/v1/provider/{gseq}/getLease)
I think it might help to have an endpoint to request ALL leases (no DSEQ specified) (e.g api/v1/provider/leaseList or something)
I think we may want to also return the image names (in case we intend to implement a allow/ deny list in the moderation APIs)?

Notes from the wg meeting: Jigar and Deval working on an update to this and will post an update to this PR

Discussed with Deval and reviewed existing APIs to form new management API standards.


xilem_web: Add svgdraw example

Add a simple example showing, that svg nodes can also be used similarly as a CanvasRenderingContext2D to draw some lines. This takes advantage of a kurbo::QuadSpline to avoid sharp edges  when the pointer moves fast.
See this zulip topic for more context.
This could potentially be optimized further (don't clone/recalculate all the lines every reconciliation), but I think in its current state it's also a good test to see how a naive implementation performs, and so far it's not too bad.
Btw. as noted here this implicitly also adds the BezPath as the example (for more manual testing opportunities).

As I understand pointer is related to https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events
Is this recommended way for interactivity? Cuold you somehow emphasize this in the documentation for people who are not familiar with web development?


Clarify Nested Routing scenario

The Nested Routing scenario does not specify how it should be implemented. It can be implemented using the Route API using a single parser and AppState object. Pull request https://github.com/flutter/uxr/pull/34 provides sample code for this scenario, but it's not clear this solution meets our users' needs. Each of these sections is something I think should be considered as we learn more about what users are looking for.
Please comment if you feel these scenarios are important / unimportant, or if there are any misunderstandings.
Hierarchical Routing
Scenario: A developer would like to define what UI should be displayed for a route path in a hierarchical structure.
Consider an app that handles the following routes:

/ -> redirects to /home
/home - displays the home screen with links to /home/articles and /home/users
/home/users
/home/articles
/settings

Another scenario where this could come up is if multiple teams are working on independent parts of an app, perhaps as separate packages or libraries:

Router View / Router Outlets
Scenario: a developer would like to define a position in UI (e.g. the widget tree) where the sub-routes should be displayed.
In other frameworks this is called Nested Routes or Nesting.
Each "layer" of the tree corresponds to a part of the UI (e.g. a Widget), which defines a position in its sub-tree where the UI for the sub-routes should be displayed. In Vue, this is the <router-view> component, in Angular / AngularDart this is called the <router-outlet> and in react-router this is a <Switch>.
Nested Stacks
Scenario: A developer would like display a stack of pages in a sub-section of their app's UI.
For example, Getting to the Bottom of Navigation in Flutter describes a scenario where a Navigator is required for each destination view associated with a BottomNavigationBar. This example shows a BottomNavigationBar with an inner Navigator managing a stack of screens (/, /list and /text). Even though the inner Navigator is keeping a stack of pages, the bottom navigation bar remains on-screen.

cc: @jackkim9 @chunhtai

Here's an AngularDart example of the first two scenarios. Route paths are defined as a tree:
  static final articles = RoutePath(
      path: 'articles', parent: app.RoutePaths.home, useAsDefault: true);
  static final users = RoutePath(path: 'users', parent: app.RoutePaths.home);

And each component can use the router-outlet component to define where the UI for the sub-routes should be displayed:

home

    Articles
    Users

<router-outlet [routes]="HomeComponent.routes"></router-outlet>

The vrouter package uses an InheritedWidget to determine what widget should be displayed in a certain sub-section of the widget tree:
class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          children: [
            Text('Home'),
            Expanded(
                child: VRouteElementData.of(context).vChild ?? Placeholder()),
          ],
        ),
      ),
    );
  }
}

Thanks for dedicating an issue to this. Nesting is so important in Flutter I think this is something we must take time to consider.
Concerning what you described:
Hierarchical Routing
I think this is interesting, not as a new feature, but really something which makes development easier.
What you describe here can be achieved in every packages as long as there is a path -> widget mapping. But what is really interesting is how the package makes it easier for developer by allowing or not things like relative paths.
Here is an example (using vrouter since I think the syntax is easy to understand in that case):
Solution 1, any path -> widget mapping would allow that
VRouter(
  routes: [
    VWidget(
      path: '/home',
      widget: HomeScreen(),
      stackedRoutes: [
        VWidget(path: '/home/articles', widget: ArticlesScreen()),
        VWidget(path: '/home/users', widget: UsersScreen()),
      ],
    ),
  ],
)

Solution 2, in vrouter this is relative path, but the important thing is that in avoids verbosity
VRouter(
  routes: [
    VWidget(
      path: '/home',
      widget: HomeScreen(),
      stackedRoutes: [
        VWidget(path: 'articles', widget: ArticlesScreen()),
        VWidget(path: 'users', widget: UsersScreen()),
      ],
    ),
  ],
)

Something interesting to note is that this can be taken to the next level. The issue with the example above in that if someone developed  ArticlesScreen and UsersScreen and then added those later in HomeScreen, they will have to go to each push and change from push('/articles') to push('/home/articles') and push('/users') to push('/home/users'). So painful and hard to maintain separately.
This is something that Reach router does really well, I encourage anyone to read the Large Scale Apps sections, showing that not only the path but also the links are relative. This allows true separation of work.
Pushing relative path is allowed in VRouter but not to the extend that I wish, anyway this is not the place to discuss my future plans but I hope that you get my point.
Router View / Router Outlets AND Nested Stacks
First, I don't really understand the difference between the two. If any, I would say that Router View / Router Outlets is a subpart of Nested Stacks.
That being said, I think this is one of the most important topic with Flutter navigation. Flutter loves scoped models and nesting while navigation is inherently global  (and least in the web where there is a single path). Re-conciliating is one of the greatest challenges of any navigation package imo.
Based on my experience, this example showing a BottomNavigationBar with an inner Navigator managing a stack is a though challenge that should be a really important scenario to conciser (since basically any mobile app faces it)

Showing nested navigator is easy but it becomes a very complicated topic when we need to support deep-linking and URL on the web. The more time I spend to work with nested routing, the more problems I see on this topic.
It has many edge cases to consider:

Do we want each tab is a page of the same Navigator? Or each tab is a separated Navigator with multiple child pages?
For example, in showing book, I have 2 tabs: info and reviews.
In the reviews tab, I have previous/next button to open previous/next review. So each review is a child page inside the reviews tab.
In each tab, we can have another nested navigator, ex. sections inside tabs. It could be 2 or 3 levels deep. Not sure if there's real scenario, where we need to control URL for deeper nested navigator.
Do we want to remember the state of all tabs (and nested routes inside each tab)?
In small screen, we have tabs. But in large screen, what if we want to show 2 or more nested navigators on the screen at the same time?
Next thing is animation when the transition inside the part of the UI.

While the technical difficulties, we must maintain architecture to make sure we can easily split our works to multiple teams. This point is a very important thing to me.

@lulupointu
From what I learn from your reply (please correct me if I am wrong), this topic can be separate into two different scenarios.

Hierarchical routing, there can be sub parsing of the url, and they can define the page for each sub route, this can be useful when separating out functional teams that each team works on one page.
Router View / Router Outlets, a page that has some static content is universal across routes, and some contents that will change based on the URL

Both scenarios are important and we should probably have both when we do the usability analysis.
@nguyenxndaidev on the other hand suggest on the Router View / Router Outlets scenario, it is also important we analysis the ability to to split the works across teams.
To combine both feedback, I we were to cover all use cases we have so far. There are two different categories that both focusing on building app in large scale across multiple teams.

Multiple teams each works independently on their own page, and they can easily combine their works together.
Multiple teams that works independently on different parts of the same page.

I think (2) is the most tricky one, and it is likely if we cover (2), we will also cover (1)
What do you think?

@chunhtai generally, sound good to me.

Same!

Multiple teams that works independently on different parts of the same page.

I'm concerned that we could have many speculative edge cases that push the API design to be more complex than it needs to be for the majority of Flutter users. Adding support for such modularity in the routing system is unlikely to be free of a usability cost. If anyone is interested in exploring this, comparing API design with and without this requirement could be illuminating.

@InMatrix concerning scalability without usability cost, allow me to tell you what I want to achieve with vrouter, which will illustrate the points which are awaited when we talk about modularity:
Here is what one could do
final settingsRouter = VRouter(
  routes: [
    VWidget(path: '/basic', widget: BasicSettingsScreen()),
    VWidget(path: '/network', widget: NetworkSettingsScreen()),
    VWidget(path: '/advanced', widget: AdvancedSettingsScreen()),
  ],
);

final loginRouter = VRouter(
  routes: [
    VWidget(path: '/login', widget: LoginScreen()),
  ],
);

final mainRouter = VRouter(
  routes: [
    loginRouter,
    VNester(
      path: '/settings',
      widgetBuilder: (child) => SettingsScreen(child),
      nestedRoutes: [settingsRouter],
    ),
  ]
);

The goals here are that:

A team working on settings can work in their router and navigate between its pages completely independently of what the team working on login implements
When using the mainRouter, nothing has to be modified. This means that if we had push('/network') in settingsRouter, this should not be changed when settingsRouter is used inside mainRouter (even if the path when using mainRouter is /settings/network)
Navigating between completely different part of the app should still be possible. Here navigating between /login and /settings/network would be done using something like a root router. This link will be dead when using loginRouter independently of course.

Something interesting to note here is that using this implementation provides no breaking changes to the current vrouter. Which answer your concern:

Adding support for such modularity in the routing system is unlikely to be free of a usability cost

I don't think this has to be true. This example is using vrouter because I am familiar with it but the important thing is that it is theoretically possible.

@InMatrix In Navi, a nested route is just a widget RouteStack and works like a normal widget.
It means that, using Navi, it's freely to distribute the work exactly as we are doing with normal flutter project with the normal widget tree.
In case, the child RouteStack want to access parent RouteStack to read the current state or to navigate, the teams only need to know what is the StackMarker for the stack. StackMarker is normally an immutable data class, you can provide when you create RouteStack.
So, at the end, Navi is friendly to the problem by default without doing anything.

Hi folks,
I've added some scenarios for my project here: https://github.com/aliyazdi75/gallery/discussions/5#discussioncomment-571684
Hope these are useful and tell me if they are wrong.

I don't totally get the team aspect tbh, any routing solution should be able to create testable widgets where the params are injected right into the pages: BooksPage(bookId: ...), at which pt teams can work and test fairly independently as long as they can set the initial route locally.
The best real-world example of a multi-platform app with complex nesting scenarios I can find is actually https://twitter.com/. Surfing through there will pretty much generate every combination of nesting you would need to support in most apps.
If you compare their website to their app it is pretty consistent. It breaks down into basically:

Main Pages that are in the menu/tab bar (/home,  /explore,  /messages etc)
Main pages with deeplinks /messages/[MessageID]
Main pages with params /search?q="..."&src="..."
Main pages with nested stacks /explore/trending, explore/news, explore/sports
Double-nested pages like settings/notifications/advanced_filters or settings/explore/location
Full-screen pages that are not associated with a menu item /someuser/[PostID]

That's not every use case out there, but it's pretty close!

@lulupointu @nguyenxndaidev Thank you both for your explanation! It does seem to be doable.

Been digging into this a lot more, and some thoughts...
There is a rather critical high level things that can drastically change what we mean by "nested routers".

In it's simplest form, nested routers is just an extension of map:widget mapping, where you can construct relative paths:

Route(
  path: "settings/",
  child: SettingsPage(),
  nested: [
     Route(path: "alerts", child: AlertsPage())  // Matches settings/alerts
    ]
)

In a more advanced form, nested routes allow you to wrap a scaffold around the contents of each route. This is very important for having tab menus, and nesting them (as you see in the twitter android app). There is usually be some way to define custom animations for these routes as well.

Route(
  path: "settings",
  nestedBuilder: (_, c) => SettingsScaffold(c), // All nested routes are wrapped in this
  nested: [
     Route(path: "alerts", child: AlertsPage()),
     Route(path: "profile", child: ProfilePage()),
    ]
)

In an even more advanced form, each nested page actually maintains state. You can see this in the twitter android app. When you change tabs, scroll-position and sub-tab values are maintained, there is no loading or loss of state when you switch routes.  Additionally, the state of the Scaffold widgets are also preserved, so you can animate your tab menu when changing routes.

I think 1 and 2 are really pretty trivial, and will not really be a challenge for any routing solution. #3 is the holy grail, and #3 is hard in Flutter. I think this is the bar we should be chasing. If we can bring that paradigm to the web, of a full stateful app, it will be very impressive.
I have a very ugly example, but it works:

This is all url-driven (not yet hooked up to Router, but should be easy)
This has 4 routes, all of them maintain state (text fields, scroll position, internal view state, all of it)
Notice that the InkWell animations on the menu buttons maintain their state we we navigate around (this shows the 2 scaffolds are fully maintaining their state as we change child routes)

https://user-images.githubusercontent.com/736973/114346715-23190380-9b21-11eb-85d9-35dd7be45126.mp4
This is constructed declaratively, from code looking like:
return PathStack(
  path: currentPath,
  childBuilder: (_, stack) => MainScaffold(child: stack),
  transitionBuilder: (_, stack, animation) => FadeTransition(opacity: animation, child: stack),
  entries: [
    /// Home
    PathStackEntry(path: "home", builder: (_) => HomePage("")),

    /// Settings
    PathStackEntry(
      path: "settings/",
      builder: (_) {
        return PathStack(
          path: currentPath,
          parentPath: "settings/",
          childBuilder: (_, stack) => SettingsScaffold(child: child),
          entries: [
            PathStackEntry(path: "profile", builder: (_) => ProfileSettings("${Random().nextInt(999)}")),
            PathStackEntry(path: "alerts", builder: (_) => AlertSettings("${Random().nextInt(999)}")),
            PathStackEntry(path: "billing", builder: (_) => BillingSettings("${Random().nextInt(999)}")),
          ],
        );
      },
    ),
  ],
);

It's all driven by a single ValueNotifier<String> urlValue right now, but shouldn't be too hard to tie into Router instead.
My plan right now with this is to release a path_stack package, that would have nothing to do with Navigation per se. Then build a very small nav_stack package that just wires up path_stack => MaterialApp.Router.

Just a quick small update, I've updated the "persistent navigator" prototype to support history, so we can easily go "back". This solves most use cases needed for "pop", and also gets us one consistent nav paradigm we can think of across all platforms.
https://user-images.githubusercontent.com/736973/114435199-2217be80-9b81-11eb-872d-f885ad87b161.mp4
The back button here looks like:
onPressed: () {
    String prevPath = PathStack.of(context).history.last;
    urlNotifier.value = prevPath; // todo: Change the router url instead
},

I think when I add a NavStack wrapper around PathStack, we can provide convenience methods like NavStack.of(context).goBack() to make these even easier.
This was made by using 3 nested path stacks, full screen routes site in the root stack, while routes wrapped by the main app scaffold set in the 2nd stack, under that all the Settings views are wrapped in a 3rd stack:
return PathStack(
  path: currentPath,
  key: pathStackKey,
  entries: [
    PathStackEntry(
        path: AppNav.tabsCategory,
        builder: (_) {
          /// Main-app path-stack, wraps all childed in MainScaffold
          return PathStack(
            path: currentPath,
            parentPath: AppNav.tabsCategory,
            // Main scaffold is wrapped here
            childBuilder: (_, stack) => MainScaffold(child: stack),
            transitionBuilder: (_, stack, animation) => FadeTransition(opacity: animation, child: stack),
            entries: [
              /// Home
              PathStackEntry(path: HomePage.path, builder: (_) => HomePage("")),

              /// Settings
              PathStackEntry(
                path: SettingsHome.path,
                builder: (_) {
                  /// Settings PathStack, wraps all Settings children in SettingsScaffold
                  return PathStack(
                    path: currentPath,
                    parentPath: AppNav.tabsCategory + SettingsHome.path,
                    // Settings scaffold is wrapped here
                    childBuilder: (_, child) => SettingsScaffold(child: child),
                    entries: [
                      PathStackEntry(path: ProfileSettings.path, builder: (_) => ProfileSettings("")),
                      PathStackEntry(path: AlertSettings.path, builder: (_) => AlertSettings("")),
                      PathStackEntry(path: BillingSettings.path, builder: (_) => BillingSettings("")),
                    ],
                  );
                },
              ),
            ],
          );
        }),

    /// Full-screen Routes, note that maintainState is deliberately turned off here, so we get a fresh compose sheet each time
    PathStackEntry(path: ComposePage.path, builder: (_) => ComposePage(""), maintainState: false)
  ],
);

@esDotDev Thank you for your investigation here. @johnpryan and a few others working on this project discussed this "offline" last week, and IIRC, we agreed that we need a separate Router for each layer of routes in a nested routing scenario in order to support 1) transition animations in each nested layer, and 2) preservation of state in each nested view/page.
Our current storyboard for the nested routing scenario does imply state preservation (e.g., when the user presses the browser's back button on Screen #4, they'd go back Screen #3 instead of Screen #2). Is there any change you'd suggest we make to the storyboard to make the requirements more explicit?

@InMatrix
We could have multiple nested routes scenarios for isolated problems.
Then we could introduce a more complex nested routes scenario to combine them.
What do you think?
After spent a lot of time for different problems with nested routes. I think this feature will influence the final decision when developers choosing a solution for them.

A couple things that could be added here are:

User scrolls down in StaffPicks, when they come back, scroll position is retained
User enters a searchFilter into StaffPicks, when they go back it is retained
The audiobook section has an first-load animation, that is only played once
When use changes tabs, the tab bar animates to the new position (doesn't matter how). This forces it to retain state, otherwise many effects are not possible, like this very common pattern:
https://user-images.githubusercontent.com/736973/114454857-49c65100-9b98-11eb-965a-e1ef6010ab37.mp4

The first 3 are handled automatically if the StatefulElement of each route is truly preserved in memory. Otherwise, it's a lot of work for devs to support. I think a truly great routing solution for Flutter would just handle this for us.
But maybe there is a way to piggyback on the new Restoration API to do something like this at the Widget level instead of the Router level... in which case it wouldn't be important to retain the StatefulElement, but to rather just define appropriate storage buckets for each route and they would restore themselves.

I've created an issue for StateRestoration at runtime, which would likely mitigate much of these issues and remove the need for a Router to try and maintain state for it's children:
https://github.com/flutter/flutter/issues/80303

We could have multiple nested routes scenarios for isolated problems.
Then we could introduce a more complex nested routes scenario to combine them.

@nguyenxndaidev So there might be a way to have a single scenario with a base version and a few advanced ones. The base version could show a tabbed UI within each page (e.g., the tabs within each books section in the current UXR storyboard). This base version should include customizable transition animations between tabs. A slightly more advanced version would preserve tab selections when switching between pages using the left menu. The most advanced version would preserve additional state within each page and each tab, such as scrollbar position, textfield input, etc, as @esDotDev has suggested. What do you think?

But maybe there is a way to piggyback on the new Restoration API to do something like this at the Widget level instead of the Router level...

@chunhtai Your thoughts on whether or not the Restoration API can help would be helpful here.

This base version should include customizable transition animations between tabs. A slightly more advanced version would preserve tab selections when switching between pages using the left menu. The most advanced version would preserve additional state within each page and each tab, such as scrollbar position, textfield input, etc

I think this's a good approach.

This is a great thread sorry to join late.
I see the topic of navigation as five topics.
Theory of navigation

What should be shown in screen?
This seems simple but it is rather complex. For static screens it is basically a snapshot of visual elements. For animations, we can think of a stream of snapshots. In abstract terms a uid/key/URL should identify a screen to be shown. This is what the URL does for web.

What data should be passed and kept in memory?
This is the book:id for deep link this is the data that should be passed to the screen for whatever reason. It is the metadata encoded on the uid/key/URL mentioned above. Anything can be encoded as data, since the characters themselves is data (i.e. www.exampleAAA.com where ...AAA is ASCII for 65 65 65)

What is underneath and above?
This is a special case for stacks, transitions, etc. when one removes a top layer/card from the stack. Here order is important, since removing one or more cards should reveal the screens in order. Of course we are dealing with 1 dimension here, in which x is either on top or below each other (2 dimensions would be x and y & 3 x, y ,z).

What is the history?
Self explanatory, a stack of navigation - the previous screens. One important question here is wether we should have a state-preserving history, in which we need not only the uid/key/URL but also the state, since sometimes the URL is not sufficient to recreate the state.

What is the hierarchy?
This is different form (3) and (4) because it is hypothetical. Take the example of a folder structure. It has a parent and child. The user can navigate directly to the child without going to the parent, so the history (4) is independent of the structure. The user can then go up one level, which reveals the parent. This is different from a stack (3) because one can have the same screen reference in multiple hierarchies (which does not happen on a folder structure).

Anything else I missed?
Hierarchical Routing

Here we are answering (1) and (4) simultaneously.

Router View / Router Outlets

Here we are answering (1) only which widget (and descendants) should be visible. Although it is hierarchical in the code of the widget tree, it is not hierarchical for navigation.

Nested Stacks

Here we are answering (1) and (3) since we specify which Pages are underneath.

Vision
Ideally we would like to have a simple but powerful navigation framework that can answer all these 5 questions. In the web, the idea of a traditional URL is that it can answer (1) (2) (5) simultaneously, leaving only (4) for the browser/client and (3) is not applicable. This is why URL is so powerful and almost complete. One could use 'data' portion of the URL to store the missing parts (3) and (4) - in which would be a very long URL.
But we don't need that.
Probably existing classes already exist and satisfy but if not, a new set of classes could be created to answer these questions.
class NavEntry{ // this is equivalent to a URL, and could be written in the URL form
    Widget view;
    dynamic data;
    Widget parent;

    NavEntry.fromURL(String URL) {...}
}

class Nav{ // this is the overall nav
    List<NavEntry> entries; // ordered
    List<NavEntry> history; // ordered
    List<NavEntry> stack; // this achieves the same as NavEntry.parent

    Nav.hierarchical(List<NavEntry> entries) {...} //by default, creates the stack, history, and hierarchy based on the URL hierarchy
}

With that I can:

Tell which screen/widgets to show
Read any data
Go up and down the stack
Go back and forward on the history
Go up and down the hierarchy

The only missing part is state perhaps is state-aware screens. Not sure if this is really a goal here.
Nested nav
Whether "a" screen is really one screen, or multiple screens has no visual implications, and I believe that this is a philosophical discussion. Consider bottomnav for instance, which could be a Navigator inside another, or two stacks of cards inside one another (if it was possible). Would you say, in a flat surface that it is two screens or one screen? It does not matter.
Now, in terms of navigation history, stack and hierarchy, one can decide to control them separately or together. If controlled together, then just need one Navigator. If controlled separately, two or more navigators are needed in which the top most screen should be visible.
I believe that if we dissect the problem this way we have a better easier understanding of the problem.

I think that thinking of things in web terms, and using a folder/page paradigm is spot on, because we are forced to do so on the web anyways. I'm not sure I agree that it makes sense to think of things in terms of entries vs stack... I'm not sure going "Up" is worth all the problems it inherently comes with, when a simple back() or goto(otherPage) will often do. The web has done without this paradigm for decades, they just embed links to specific "parent" pages to support this.
Just as a code example, I've gotten my "path_stack" to a pretty nice place. It handles all nesting scenarios I can imagine, can easily support history like the web, or similar patterns like popUntil to popMatching.
This creates a fairly complex nested route structure, with dedicated nested menus, persistent pages, and full-screen (non-persistent) routes. This essentially emulates the Twitter for Android app, and I could build the entire app with this approach:
return PathStack(
  path: currentPath, // eg.  settings/alerts  or details/99
  key: pathStackKey,
  routes: {
    [AppPaths.tabsCategory]: StackRouteBuilder(builder: (_, __) {
      /// Main-app path-stack, wraps all childed in MainScaffold
      return PathStack(
        path: currentPath,
        basePath: AppPaths.tabsCategory,
        // Main scaffold is wrapped here
        scaffoldBuilder: (_, stack) => MainScaffold(child: stack),
        transitionBuilder: (_, stack, animation) => FadeTransition(opacity: animation, child: stack),
        routes: {
          // Home
          [HomePage.path]: StackRouteBuilder(builder: (_, __) => HomePage("")),
          // Settings
          [SettingsHome.path]: StackRouteBuilder(
            builder: (_, __) {
              return PathStack(
                path: currentPath,
                basePath: AppPaths.tabsCategory + SettingsHome.path,
                // Settings scaffold is wrapped here
                scaffoldBuilder: (_, child) => SettingsScaffold(child: child),
                routes: {
                  [ProfileSettings.path]: ProfileSettings("").buildStackRoute(),
                  [AlertSettings.path]: AlertSettings("").buildStackRoute(),
                  [BillingSettings.path]: BillingSettings("").buildStackRoute(maintainState: false),
                },
              );
            },
          ),
        },
      );
    }),

    /// Full-screen Routes
    [ComposePage.path]: ComposePage().buildStackRoute(maintainState: false),
    [DetailsPage.path + ":id"]: StackRouteBuilder(
      maintainState: false,
      builder: (_, args) => DetailsPage(itemId: args["id"]),
    )
  },
);

I think this demonstrates a really nice mix of declarative structure, with imperative control and it's super flexible.
"Back" in this example is just walking a List<String> history, "Close" is just going back in history before it sees a page that is not Details, and it jumps there.
https://user-images.githubusercontent.com/736973/114611233-0d5d2880-9c5e-11eb-892e-5db3a90f64f6.mp4

@idkq I really like some of the idea your are trying to express. However there is two point where I can't agree.

But we don't need that.
Probably existing classes already exist and satisfy but if not, a new set of classes could be created to answer these questions.

Well we do need the url for Flutter web. Keep it as a second though and you will only get your API more completed when you will have  to take it into account.
Actually this is shown in your example, NavEntry.fromURL(String URL) {...} . The url has to store the information anyway since you convert it to your NavEntry here.

Whether "a" screen is really one screen, or multiple screens has no visual implications, and I believe that this is a philosophical discussion.

I desagree, take the example of a Scaffold with an animated BottomNavigationBar such as this one. If when navigating you only change the body of the Scaffold, the BottomNavigationBar will be animated nicely. If you change the entire screen however, this won't work.

Sorry.. this:

But we don't need that.

refers to:

One could use 'data' portion of the URL to store the missing parts (3) and (4) - in which would be a very long URL.

...In the sense we don't need history embedded in the URL. But agree, we need URL.

I desagree, take the example of a Scaffold with an animated BottomNavigationBar such as this one.

We can think of animation as a stream of frames. In that sense, each frame is visually/literally one screen painted each time.

I'm not sure going "Up" is worth all the problems it inherently comes with

Going up is very handy and simple. There is always one parent up to the root. If you pass a bunch of urls the app could easily built the navigation itself by inferring the paths. Going up is definitely not the ultimate solution, but should cover the most basic scenarios.
The complexities lies on how we implement it. It is nothing else but a goto parent.

Going up is very handy and simple. There is always one parent up to the root. If you pass a bunch of urls the app could easily built the navigation itself by inferring the paths. Going up is definitely not the ultimate solution, but should cover the most basic scenarios.
The complexities lies on how we implement it. It is nothing else but a goto parent.

Right, I didn't mean we should lose "up" as a navigational concept, it's just complifies things a lot at the routing level to define this declaratively.  Either the page can just know it's parent (as html has always done), or can sniff it out imperatively from the history stack, seems to be a better approach to me.

fwiw, I have released my nav_stack and path_stack packages:
https://pub.dev/packages/nav_stack
https://pub.dev/packages/path_stack
NavStack allows you to express a full routed, tabbed scaffold, with persistent state like:
return NavStack(
  stackBuilder: (context, controller) => PathStack(
    scaffoldBuilder: (_, stack) => _TabScaffold(["/home", "/profile"], child: stack),
    routes: {
      ["/home"]: LoginScreen().buildStackRoute(),
      ["/profile"]: ProfileScreen().buildStackRoute(),
}));
...
// Change path using a simple api:
void handleHomeTabPressed() => NavStack.of(context).path = "/home";
void handleProfileTabPressed() => NavStack.of(context).path = "/profile";

A more detailed example, with query args, and route guards, looks like:
bool isConnected = false; // change this to allow access
return NavStack(
  stackBuilder: (context, controller) {
    return PathStack(
      scaffoldBuilder: (_, stack) => _MyScaffold(stack),
      routes: {
        ["/login", "/"]: LoginScreen().buildStackRoute(),
        ["/in/"]: PathStack(
          routes: {
            ["profile/:profileId"]: StackRouteBuilder(
              builder: (_, args) => ProfileScreen(profileId: args["profileId"] ?? ""),
            ),
            ["settings"]: SettingsScreen().buildStackRoute(),
          },
        ).buildStackRoute(onBeforeEnter: (_) {
          // Redirect and show dialog warning
          if (!isConnected) controller.redirect("/login", () => showAuthWarning(context));
          return isConnected; // If we return false, the route will not be entered.
}),},);},);
...
NavStack.of(context).path = "/login"; // Allowed
NavStack.of(context).path = "/in/profile/99"; // Blocked!
NavStack.of(context).path = "/in/settings"; // Blocked!

I think one thing that would go really far to being able to compare example would be to separate the view code, from the routing code (as much as possible). Instead of snippets, have authors prepare a complete routing solution using shared views.
A set of pages, scaffolds and menus could be pre-built, and then each package author can make small tweaks to the views, but should generally leave them alone.
In my own demos for example,

My boilerplate view code is 300 lines (3 tab menus, 3 scaffolds, and 6 pages.)
My routing code to express it is 42 lines

There's nothing unique to my router in the 300 lines of view code, other than the onPressed handlers.
Currently I'm using this sort of layout to  adequately tested nesting scenarios, shows a mix of full-screen and tabbed views, and stateful and non-stateful, which you often want. This seems pretty exhaustive?
/tabs
    /home
    /settings
        /profile
        /alerts
        /billing
    /messages
      /friends
      /unread
      /archived
/compose (maintainState: false)
/details (maintainState: false)

@esDotDev this seems like a great exhaustive example. Can you share the code? I would like to test this UI with beamer.
I definitely agree with your goals of focusing on routing only and keeping the rest minimally changed. I suggested the same here :+1:

@esDotDev It is a great idea. Number of lines is one of the most important measures.

Sure, I took a pass on further extracting routing code from the views themselves, this led to me extracting a bunch of pre-made btns, which I assume we'll all have to customize.
So main routing table is here:
https://github.com/gskinnerTeam/flutter_nav_stack/blob/master/example/lib/advanced_tabs_demo.dart
Opinionated btns here:
https://github.com/gskinnerTeam/flutter_nav_stack/blob/master/example/lib/advanced_tabs_buttons.dart
Then agnostic supporting widgets are:
https://github.com/gskinnerTeam/flutter_nav_stack/blob/master/example/lib/advanced_tabs_demo_pages.dart
https://github.com/gskinnerTeam/flutter_nav_stack/blob/master/example/lib/advanced_tabs_demo_scaffold.dart
It's still a work in progress, I wrote much of it today and yesterday, but can definitely use another set of eye on it for some feedback. Happy to roll this into it's own repo too, which we could all share via a git dep.

I'm just going to shime in here, maybe it's not the right place though but I hope that in your future design you are going to have a clear delimitation between:

The chronological stack
Overlays
The back stack (I personally call it the upstack)

I also hope tabs are going to be handled by url.
Let me touch on a few of those:
Overlays
Modal dialog, bottom sheet, etc are mixed in the navigation system as you have to call Navigator.of(context).pop();
Things that should not change the url should be in a separate mechanism altogether. If something is in a dialog or any sort of overlay, then it's not supposed to be shown by direct navigation. Meaning that there is no url you can refresh and directly see a specific dialog (unless the developer specifically opens it when the page is opened like an onboarding dialog).
The chronological back stack
That's the essence of the router, navigating on a specific URL gets you on a page, going back goes to the page you were before.
The upstack
So that little arrow at the top of an app bar that let's you go a level up in your application until you reach the root.
For this I'll go against the grain, but unless the up stack as a performance benefit I don't think it's a good architecture to rely on. It would be much easier to either:

go back a level in the urls => eg: from /products/:id to /products then to / (and have at most 1 page on the stack)
or let the user specify it altogether, at that point it is just a link.

I personally built my nav 2.0 library by creating an upstack containing all the routes that matches a path. So the upstack for /products/:id contains 3 elements (ProductDetails, ProductList, Home). However I don't see any benefit on having 3 elements in the stack instead of one and I think ditching that concept would make things easier.

@cedvdb Good points I touched based on them with a different perspective here https://github.com/flutter/uxr/issues/35#issuecomment-818974846
Overlays -> My number: 1 - What is shown/displayed
Chronological back stack -> My number: 4 - History
The upstack -> My number 5: - The hierarchy
The question whether something changes the URL or not is an interesting discussion because in theory the URL text does not necessarily represent a view, but instead, the result of the URL resolution represents a view. There is a big difference between URL text and URL resolution. URL text is simple the characters on the navigation bar of the browser. URL resolution is the interpretation of the text, often using RegEx.
The reason I point out this difference is that sometimes on a overlay/popup/modal the URL does change - but it does not change to cause a change in the view. Example: 'www.mysite.com' and 'www.mysite.com/?showpopup'. In this example we are passing data but we could have a new view as well 'www.mysite.com/withpopup' that would resolve to the same view but with a different Boolean variable to switch the popup.

I disagree with this as for me things that are in an overlay should not be part of the URL.  Overlays are secondary  views that are not meant to be directly accessed. If it needs to be, for example an onboarding popup, then it's on the developer to do the necessary to open it.
However my point is that in all case overlays should not be part of the URL for the same reasons that whether an input is focussed should not be part of the URL. It's just the state of the page.

I am working on https://github.com/flutter/flutter/issues/80546 which will allow developer to store state that you want browser navigation to preserve and don't want it to be part of the url.

things that are in an overlay should not be part of the URL

Again, you are getting confused with URL text and URL resolving. Past the domain text, one can write anything he wants as URL text. You might not agree with the structure and best practices definitely exist but there is nothing that prevents it.
If Flutter is compatible with web, then, it has to deal with it.

Past the domain text, one can write anything he wants as URL text.

I don't know what we are discussing about tbh. Yes anything can be written in the path and it will resolve the path to a file (for an hosted website).
My point was more along the line of that window.history.back() will always bring you to the last page visited while Navigator.pop() might just pop an overlay. Yes they are not the same thing but I'm advocating for a more stateless approach.


Added missing details

https://github.com/MicrosoftDocs/office-docs-powershell/issues/3540

Docs Build status updates of commit 9ff25a7:
:clock10: Full build: the average full build time is 13 min(s) 47 sec(s), this is based on the last 474 build(s) for this repository.

Docs Build status updates of commit 9ff25a7:
:white_check_mark: Validation status: passed

File
Status
Preview URL
Details

skype/skype-ps/skype/Get-CsAdditionalInternalDomain.md
:white_check_mark:Succeeded
View (skype-ps)

For more details, please refer to the build report.
Note: If you changed an existing file name or deleted a file, broken links in other files to the deleted or renamed file are listed only in the full build report.

Docs Build status updates of commit 8fe2b0b:
:clock10: Full build: the average full build time is 13 min(s) 46 sec(s), this is based on the last 479 build(s) for this repository.

Docs Build status updates of commit 8fe2b0b:
:white_check_mark: Validation status: passed

File
Status
Preview URL
Details

skype/skype-ps/skype/Get-CsAdditionalInternalDomain.md
:white_check_mark:Succeeded
View (skype-ps)

For more details, please refer to the build report.
Note: If you changed an existing file name or deleted a file, broken links in other files to the deleted or renamed file are listed only in the full build report.


Added map-keys

Definition of map-keys:
Applies a function to each key of the object, and produces a new object with the new keys and the same values. The size of the result is the same size as the input.

Request for attention on this one. I believe the Travis error was not caused by the pull request itself, but some other dependencies.

Yes, you're right @pepkin88 version not found<EMAIL_ADDRESS>It's probably from istanbul. Maybe we can upgrade the modules and use istanbul nyc https://github.com/istanbuljs/nyc
Also the build process is a bit complex. Maybe it can be done through just the package.json unless Travis does need the makefile.


Image uploader

For attaching an image to a token on mint (or I think in meta - there may be a field in there)

or could just have small svgs and limit size a la https://github.com/CosmWasm/cw-plus/blob/main/packages/cw20/src/logo.rs

Or use cloudflare IPFS https://developers.cloudflare.com/distributed-web/ipfs-gateway

Others seem to be using https://slate.host/ for the uploading component of this (cflare just serves)

Beginning to think quite strongly that we should store on-chain SVGs as is supported by CW20 - could up the size to 10kb though? https://j.mirror.xyz/w8wSN3JLHK1_oNoi2lLF-67w60Wt1WypS_kIbmsYSfE

The reason on-chain SVGs matter is not why most people think. It's not just that they live on-chain with no dependencies, or that they have stronger guarantees of being around for a long time.

On-chain SVGs matter because an on-chain render function makes an NFT dynamic. Not in the sense that the asset itself contains animations, but rather - an on-chain render function can make the same item appear differently over time. The same way javascript turned websites from read-only documents into interactive ones, on-chain SVGs turn NFTs from static assets into living digital objects.

An item whose render function generates an SVG each time it's called doesn't need to return the same thing every time. The NFT itself can read any on-chain data and use it to decide how it should appear to its owner in the moment. It can look up relevant state changes, user actions, and external activity, and then display them either as literal information or as abstract visual characteristics. This allows the NFT to provide much stronger affordances to its holder as to its functional purpose.

This kind of dynamicism is really what makes on-chain SVGs so important. They take seriously the idea that NFTs are not just static media, but living digital objects we can use for all kinds of things online. As more people learn to build digital objects in this way, we'll accelerate towards a world where our understanding of NFTs today looks as outdated as the web before javascript.

Update:

SVGs up to 10kb should be sendable as embedded data
URis (e.g. IPFS) should be supported (still)

For MVP possibly okay to say that users should pin their own stuff, but no doubt we will get complaints.
Think first pass is probably to get IPFS URIs working

For MVP probably sufficient to literally have a link to something like https://app.pinata.cloud and say to provide the IPFS link

Got a screen for it with all the right hooks but still a bit borked until we wire up all the IPFS goodness. Pinata likely requires a backend so maybe a Next serverless function running the pinata stuff?

This is working for IPFS running on a desktop. Sadly will likely still have to go to pinata.


Is it possible to pass a list through an env var?

Having this config key:
raw-media-types = ["one", "two"]

I want to pass it through an env var like:
raw-media-types = "$(LIST)"

So I do export LIST=["one", "two"].
This will give an error:
Error parsing config file: expected a list

Having "$(LIST)" without quotes gives the following error: Error parsing config file: parsing support/configs/config: endOfInput
Is there some other way to pass the list to the env var?

No, interpolation currently treats all environment variables as plain strings. (This code is pretty much directly lifted from configurator-ng.)
The relevant part of the code is here: https://github.com/robx/configurator-pg/blob/master/src/Data/Configurator/Load.hs#L55

Hmm, I see. Maybe surrounding brackets "[]" in the string could be parsed an interpreted as a list.

That wouldn't be a backwards compatible change, though.
I'm not sure that developing this library further would be a worthwhile effort. That said, happy to apply patches.
(In that case, it might be a good idea to tie the interface more closely to what postgrest wants to do with it. In particular, make it so that postgrest doesn't need to perform the string->number coercion it currently does, and bring the file interpolation from postgrest/main/Main.hs into configurator-pg as some more general interpolation thing.)

@robx I understand. Maybe the simplest thing would be to patch PostgREST and not use a list for raw-media-types, instead having it be like:
raw-media-types = "text/html, image/png"

Will fix in PostgREST.


add unit test cases for core.pkg.k8s

Add unit test cases for core.pkg.k8s.GetNodeIP &core.pkg.k8s.GetPodDetails,
and change the wrong word 'retuned' to the correct value 'returned' in the previous test cases, thank you!

This change is

Coverage increased (+0.7%) to 43.088% when pulling 5b313737e0ed7affc643965750024a465885472d on chentao1596:add-unit-test-for-k8s into f1520a1232a8690b2a4138f14da73a4b94936ef3 on kubernetes:master.

@chentao1596 thanks!

/lgtm


jQuery.DataTables serverside processing + Bootstrap datetimepicker + yadcf

The yadcf when using with datetimepicker from eonasdan when pressing anything will render the yadcf filter to the tables of the date picker.
I am using serverside processing, and it seems like its rerendering the table and the filters when pressing anything when the boostrap picker is open.

fixed by editing the code

You can send a PR with your fix then

done creating PR, thanks for the library. really helped me on my projects.

Also please post a test page / html / js code with your issue, maybe your problem can be solved without yadcf modifications


update networking tasks to be idempotent.

https://github.com/clong/DetectionLab/issues/614

Fully updated

Hi @tbennett6421 - sorry, I'm not ignoring this, my personal life has just gotten considerably busier lately. Will review ASAP!

This is fixed in PR #622 by adding a small if-statement around it: https://github.com/clong/DetectionLab/pull/622/files#diff-85db5e0797df63e675042a6ca4f83b10b26ab438fc9cff05d6da05e11390e9c8R13


Patch 2 lang update

Cheers,
I have updated the translation, RO lang, for settings and Theme Conference. ;)

Perfect, thanks, pal! I will add it to the next release!