[FEATURE] BigQuery support?

I'm new to the idea of Data Vault 2.0 and I'm reading the Dan Linstedt book to understand it better.
To help me get a better perspective of how dbtvault works I would like to know how difficult do you think it would be to add support for BigQuery?
Are there specific features of Snowflake which makes it better for running dbt/dbtvault ?
Thanks,
Jacob

Jacob, thanks for your question.
Dan's book is a great introduction to Data Vault. It is quite a meaty tome, written for college/university students. I know Dan and Michael wrote a lot more material but there was a publisher's physical limit to how big the book could be.
The method has moved on a little since the book was written (a healthy thing, evolving to keep up with the market and listening to feedback and ideas from practitioners). The most obvious change Dan introduced is dropping the 'effective to' date in satellites and just using a single effective from - to better support write-only big data architectures.
If you have any questions about the Data Vault method as you read in, just ask us. It is similar to, but also sufficiently different from other data warehousing methods, so you're bound to have questions the book doesn't answer. We hope to launch a slack channel soon to support our community.
Snowflake is a great technology for any data warehouse, but not the only one. Lots of our clients are investigating Snowflake, Microsoft SQL Server or Azure Synapse Analytics cloud database platforms and I know that there is a sizeable community using BigQuery for the advantages GCP brings. We decided to build for Snowflake first just based on where the majority of our customers were looking.
As DBT supports BigQuery it should be possible to run dbtVault on that technology. We've obviously written the sql in the current release for Snowflake and we have a substantial automated test harness in place. Snowflake doesn't support merge statements (neither does synapse analytics) so we've coded left outer joins, which actually should make the code more portable. It shouldn't be a big step to adapt the SQL for BigQuery support and we want to add other technologies over time as stated on our roadmap.
We haven't tried to run dbtVault with Big Query yet. If you are planning to do something there and have some time to experiment let us know and perhaps we can get something going? It might be a trivial adaptation. Otherwise, we'll get around to BigQuery in due course.

@chapmanjacobd if you are considering BigQuery because you are using Google Cloud, keep in mind that Snowflake will be available on Google Cloud soon. As of Nov 19, 2019 it is available in Preview https://www.snowflake.com/blog/snowflake-on-google-cloud-platform-now-in-preview/

Hello again @chapmanjacobd We're getting a huge amount of interest in Bigquery support over on our slack, and a number of users have reached out to us who are currently in the process of porting it for themselves. We've just opened a new channel in our slack for discussing work around the port, and we hope this will allow us to start work on adding native support for Bigquery sooner!

Can you please tell me if you have already experienced the querying of a DV implemented in BigQuery or similar cloud databases?  My question is because several of these technologies suggest to use denormalised models for implementing Data Warehousing rather than normalised ones, with the main objective of avoiding joins when querying the data.  A Data Vault by design creates a larger of  number of tables that need to be joined even for the most simple query.  Can you please tell me your views and experience on this?  Thank you.

Remember that the data vault is not accessed by most users - that is what the presentation/mart layer is for. The data vault's main job is to hold a precise history of source feeds and a mapping of these into a business structure - that is why we use a relational structure. Marts can / should use a flat table structure for BigQuery. As for performance - I think it is best we ask the community about their experience? Join our slack to take this further - we have a BigQuery channel there.

Hi there,
Thanks for answer.
I do understand that.  In any case, the DV needs to be queried, either to produce Data Marts or other data extracts for business consumption in presentation layers.  Whenever querying the DV to refresh those presentation layer data structures, you still need to join the data out of the DVs.  Even some patterns suggest making these presentation layers as logical views on top of DV tables.  Will that work from performance perspective?
I’ll submit the question as suggested.  I understand that there might some implementations in Snowflake, but what about other cloud databases?
Thank you very much and have great w/e.

On 5 Jun 2020, at 5:17 pm, DVNeil<EMAIL_ADDRESS>wrote:
Remember that the data vault is not accessed by most users - that is what the presentation/mart layer is for. The data vault's main job is to hold a precise history of source feeds and a mapping of these into a business structure - that is why we use a relational structure. Marts can / should use a flat table structure for BigQuery. As for performance - I think it is best we ask the community about their experience? Join our slack to take this further - we have a BigQuery channel there.
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub https://github.com/Datavault-UK/dbtvault/issues/2#issuecomment-639303824, or unsubscribe https://github.com/notifications/unsubscribe-auth/AP3BQXIOWOHPPI5FRTCA4XTRVCLXNANCNFSM4J26SYAA.

Yes. My impression is that Snowflake or Postgres are much cheaper and better suited for relational-data tasks like joins. BigQuery and Datavault is totally possible but people should carefully evaluate their reasons for choosing BigQuery. It's a great tool but it only fills a niche. Datavault also fills a niche. It is extremely valuable when needed but I would say that it isn't needed for everything.
The needs of a system which would demand a BigQuery+Datavault solution are pretty unusual in my mind. I can't think of a data structure which wouldn't be better served by a more relational-focused DBMS+DV but I still think it is possible... though it will likely be quite expensive

Hi Neil,
Can you please remind me the url/link for joining your slack and specifically the BigQuery channel.  So I can post the question to the community.  Thank  you
Oscar

On 5 Jun 2020, at 5:17 pm, DVNeil<EMAIL_ADDRESS><EMAIL_ADDRESS>wrote:
Remember that the data vault is not accessed by most users - that is what the presentation/mart layer is for. The data vault's main job is to hold a precise history of source feeds and a mapping of these into a business structure - that is why we use a relational structure. Marts can / should use a flat table structure for BigQuery. As for performance - I think it is best we ask the community about their experience? Join our slack to take this further - we have a BigQuery channel there.
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub https://github.com/Datavault-UK/dbtvault/issues/2#issuecomment-639303824, or unsubscribe https://github.com/notifications/unsubscribe-auth/AP3BQXIOWOHPPI5FRTCA4XTRVCLXNANCNFSM4J26SYAA.

https://join.slack.com/t/dbtvault/shared_invite/enQtODY5MTY3OTIyMzg2LWJlZDMyNzM4YzAzYjgzYTY0MTMzNTNjN2EyZDRjOTljYjY0NDYyYzEwMTlhODMzNGY3MmU2ODNhYWUxYmM2NjA

We're planning Big Query support for the next major version of dbtvault (v0.8).
We understand that there are many users looking for BQ support.
It's important to understand that we are unable to work on this package full time, however we are working hard to get the release out as soon as we can.
Thank you!

Just released Hubs, Links and Satellites for BigQuery in dbtvault 0.8.0!!


Client Crash

https://mclo.gs/TRPpbCD

Hello and thanks for the report! I will work on it very soon as I was going to release a new version.
Could you tell me more about your issue, how did it happen? Were you manually changing music, is it the first music that tried to play, ... ?

I still would like to know the circumstances of your crash even though it must be already fixed


Proposal: Dedicated Shipwright Operator

This is a proposal to create a separate operator that installs
Shipwright Builds on a Kubernetes cluster with Operator Lifecycle
Manager (OLM) enabled. It provides details on a configuration Custom
Resource that is applied to the Shipwright Builds deployment.
This replaces #514 because it provides the means for installing Shipwright projects via OLM.

I've filed https://github.com/shipwright-io/build/issues/579 to ensure we move off of operator-sdk for generating CRDs.

@adambkaplan thanks for opening  #579 , I will open one more issue to tackle the dependencies to the operator-sdk packages we have, thats not related to an operator-sdk binary.

Added issue to remove operator-sdk from application code: https://github.com/shipwright-io/build/issues/584

/lgtm

/approve


Is this code suitable for data in nii format? Yes? How to use? Thanks.

If Yes? How to use? Thanks.

Absolutely. Please check https://github.com/MontaEllis/Pytorch-Medical-Segmentation#prepare-your-dataset

Thank you for your attention. You mean to convert NII to.mhd.zraw and then use this program.

No, I mean just change the settings in hparam.py.


Visualization of the results

@olegsinavski @jltorresm  Thanks for sharing the code base can we have the scripts for visualization code also to validate the results
Thanks in advance

@melights  any update on this thread !!!


Is it possible lazy loading image with srcset?

Description/Question

I have already checked various formats of images, including avif, webp.
But I could not find in the documentation whether it is possible to load images in lazy mode. Something like srcset:
preload-src="poor_me.jpg"
data-src="better_me.jpg"
data-srcset="better_me2x.jpg 400w, better_me.jpg 200w"

Hello @MaximSavin!
View360 doesn't provide that option with our API at the moment, but I think you can manually do that.
You can create an empty HTMLImageElement and set the srcset & src to that, then after load event use setImage method to apply that responsive image.
We will consider whether to add this feature to the next version :)
Thank you for the suggestion.

Wow, cool — good idea! Thanks a lot!


Marathon SD hardcodes expectation of a "prometheus" label

isValidApp is requiring the presence of a prometheus label for SD to work for a target. This is not going to be true in the general case, so instead all the labels should be exposed as meta labels and users with such a requirement can use relabelling to get just the targets they want.

Closed via #987


[Q] Speedport UI not accessible

Since I installed the integration, my Speedport UI is no longer accessible after a while, i.e. the router is still running but http://speedport.ip/ is not accessible. Could anyone else see this?

Hi, which error message do you get?

Hi, what do you mean? I see no error (just the HTTP 404).
After router restart everything is fine

I have never seen such behavior before and I couldn't explain why :thinking:
I don't know how to help, but I'll leave the issue open, let's see if there are more people affected.

I have never seen such behavior before and I couldn't explain why 🤔

Ok interesting. Thanks for the feedback.
Maybe other have also the same issue and have a hint for me how to solve it

It's that time again :)
Logger: custom_components.speedport.device
Source: helpers/update_coordinator.py:303
Integration: Speedport ([documentation](https://github.com/Andre0512/speedport/), [issues](https://github.com/Andre0512/speedport/issues))
First occurred: 29. November 2023 um 21:10:21 (1 occurrences)
Last logged: 29. November 2023 um 21:10:21

Error requesting Speedport Smart 4 Typ A data: Server disconnected

and
Timeout fetching Speedport data
27. November 2023 um 23:46:13 – (FEHLER) Speedport (benutzerdefinierte Integration)

I don't think SSL works without the client knowing the certificate. You should try your internal router address or ip.


issue with apero_reject  in 0.7.291

apero_reject.py --identifier=3094104,3094105 --test=True --autofill="1,1,1,24BQ13-Nov14_bad_pm_calib"
gives an error

apero_reject.py --identifier=3094104,3094105 --test=True --autofill="1,1,1,24BQ13-Nov14_bad_pm_calib"
21:12:52.445-  |REJECT| ***************************************************************************
21:12:52.451-  |REJECT| *
21:12:52.451-  |REJECT| *  SPIROU @PID-00017342107718117170-0W41 (V0.7.291)
21:12:52.452-  |REJECT| *         py3.9.16  git:v0.7.291-stable-test
21:12:52.452-  |REJECT| *
21:12:52.458-  |REJECT| ***************************************************************************
21:12:52.463-  |REJECT|           █████╗ ██████╗ ███████╗██████╗  ██████╗
21:12:52.469-  |REJECT|          ██╔══██╗██╔══██╗██╔════╝██╔══██╗██╔═══██╗
21:12:52.474-  |REJECT|          ███████║██████╔╝█████╗  ██████╔╝██║   ██║
21:12:52.480-  |REJECT|          ██╔══██║██╔═══╝ ██╔══╝  ██╔══██╗██║   ██║
21:12:52.486-  |REJECT|          ██║  ██║██║     ███████╗██║  ██║╚██████╔╝
21:12:52.491-  |REJECT|          ╚═╝  ╚═╝╚═╝     ╚══════╝╚═╝  ╚═╝ ╚═════╝
21:12:52.497-  |REJECT| ***************************************************************************
21:12:52.506-|REJECT| DRS Setup:
21:12:52.511-|REJECT|
21:12:52.512-|REJECT|         DRS_ROOT: /apero/apero-drs-v0.7.290/apero
21:12:52.512-|REJECT|         DRS_DATA_RAW: /data/spirou4/arlinks
21:12:52.512-|REJECT|         DRS_DATA_REDUC: /data/spirou4/apero-data/offline290/red
21:12:52.512-|REJECT|         DRS_DATA_WORKING: /data/spirou4/apero-data/offline290/tmp
21:12:52.512-|REJECT|         DRS_CALIB_DB: /data/spirou4/apero-data/offline290/calib
21:12:52.512-|REJECT|         DRS_TELLU_DB: /data/spirou4/apero-data/offline290/tellu
21:12:52.513-|REJECT|         DRS_DATA_ASSETS: /data/spirou4/apero-data/offline290/asset
21:12:52.513-|REJECT|         DRS_DATA_OUT: /data/spirou4/apero-data/offline290/out
21:12:52.513-|REJECT|         DRS_DATA_MSG: /data/spirou4/apero-data/offline290/msg
21:12:52.513-|REJECT|         DRS_DATA_RUN: /data/spirou4/apero-data/offline290/run
21:12:52.513-|REJECT|         DRS_DATA_PLOT: /data/spirou4/apero-data/offline290/plot
21:12:52.513-|REJECT|         DRS_DATA_OTHER: /data/spirou4/apero-data/offline290/other
21:12:52.513-|REJECT|         LBL_PATH: /data/spirou4/apero-data/offline290/lbl
21:12:52.514-|REJECT|         DRS_CONFIG: /apero/config/offline290/user_config.ini
21:12:52.514-|REJECT|         DRS_CONFIG: /apero/config/offline290/user_constants.ini
21:12:52.514-|REJECT|         DRS_CONFIG: apero.constants.default.default_config
21:12:52.514-|REJECT|         DRS_CONFIG: apero.constants.default.default_keywords
21:12:52.514-|REJECT|         DRS_CONFIG: config.instruments.spirou.default_config.py
21:12:52.514-|REJECT|         DRS_CONFIG: config.instruments.spirou.default_keywords.py
21:12:52.515-|REJECT|         DRS_CONFIG: core.instruments.default.default_constants.py
21:12:52.515-|REJECT|         DRS_CONFIG: core.instruments.spirou.default_constants.py
21:12:52.515-|REJECT|         DATABASE: MYSQL
21:12:52.515-|REJECT|         DATABASE-calib: aperooffline290@localhost:calib_offline290_db
21:12:52.515-|REJECT|         DATABASE-tellu: aperooffline290@localhost:tellu_offline290_db
21:12:52.515-|REJECT|         DATABASE-findex: aperooffline290@localhost:findex_offline290_db
21:12:52.515-|REJECT|         DATABASE-log: aperooffline290@localhost:log_offline290_db
21:12:52.516-|REJECT|         DATABASE-astrom: aperooffline290@localhost:astrom_offline290_db
21:12:52.516-|REJECT|         DATABASE-lang: aperooffline290@localhost:lang_offline290_db
21:12:52.516-|REJECT|         DATABASE-reject: aperooffline290@localhost:reject_offline290_db
21:12:52.516-|REJECT|         PRINT_LEVEL: all
21:12:52.516-|REJECT|         LOG_LEVEL: all
21:12:52.516-|REJECT|         DRS_PLOT: 0
21:12:52.522-  |REJECT| ***************************************************************************
21:12:52.528-|REJECT| Arguments used:
21:12:52.533-|REJECT|
21:12:52.533-|REJECT|         --IDENTIFIER: 3094104,3094105
21:12:52.533-|REJECT|         --OBJNAME: None
21:12:52.534-|REJECT|         --AUTOFILL: 1,1,1,24BQ13-Nov14_bad_pm_calib
21:12:52.534-|REJECT|         --TEST: True
21:12:52.539-  |REJECT| ***************************************************************************
21:12:54.163-!!|REJECT| E[01-010-00001]: Unhandled error has occurred: Error <class 'AttributeError'>
21:12:54.163-!!|REJECT|
21:12:54.164-!!|REJECT| Traceback (most recent call last):
21:12:54.164-!!|REJECT|  File "/apero/apero-drs-v0.7.290/apero/core/utils/drs_startup.py", line 439, in run
21:12:54.164-!!|REJECT|    llmain = func(recipe, params)
21:12:54.164-!!|REJECT|  File "/apero/apero-drs-v0.7.290/tools/bin/apero_reject.py", line 114, in main
21:12:54.164-!!|REJECT|    drs_reject.add_file_reject(params, recipe, identifier)
21:12:54.165-!!|REJECT|  File "/apero/apero-drs-v0.7.290/apero/tools/module/listing/drs_reject.py", line 79, in add_file_reject
21:12:54.165-!!|REJECT|    google_sheet = gspd.spread.Spread(sheet_id)
21:12:54.165-!!|REJECT|  File "/conda/miniconda3/envs/apero-env-v0.7.290/lib/python3.9/site-packages/gspread_pandas/spread.py", line 126, in init
21:12:54.165-!!|REJECT|    self.client = Client(user, config, scope, creds)
21:12:54.165-!!|REJECT|  File "/conda/miniconda3/envs/apero-env-v0.7.290/lib/python3.9/site-packages/gspread_pandas/client.py", line 96, in init
21:12:54.165-!!|REJECT|    self._root = self._drive_request(file_id="root", params={"fields": "name,id"})
21:12:54.166-!!|REJECT|  File "/conda/miniconda3/envs/apero-env-v0.7.290/lib/python3.9/site-packages/gspread_pandas/client.py", line 197, in _drive_request
21:12:54.166-!!|REJECT|    res = self.request(method, url, params=params, json=data)
21:12:54.166-!!|REJECT|  File "/conda/miniconda3/envs/apero-env-v0.7.290/lib/python3.9/site-packages/gspread_pandas/util.py", line 292, in request
21:12:54.166-!!|REJECT|    return ClientV4.request(client, *args, kwargs)
21:12:54.166-!!|REJECT| AttributeError: type object 'Client' has no attribute 'request'
21:12:54.167-!!|REJECT|
21:12:54.255-|REJECT| ***************************************************************************
21:12:54.265-@!|REJECT| W[40-003-00005]: Recipe apero_reject has NOT been successfully completed (2.440
21:12:54.265-@!|REJECT|         seconds)
21:12:54.275-**|REJECT| ***************************************************************************

By the way, @Neil, the example you gave me earlier this year was using identifier like
identifier=3094104d , so with a letter after the odometer, and this is the way I entered the last bad odomters for SPIRou.
Is this correct ?
Please let me know
I hope the apero_reject tool will work again soon.
apero_astrometrics.py seems to work.
Thanks
Luc

This is the same error as you've had before, its with gspread and gspread-pandas
21:12:54.166-!!|REJECT| return ClientV4.request(client, *args, kwargs)
21:12:54.166-!!|REJECT| AttributeError: type object 'Client' has no attribute 'request'

You should note down this error as you seem to get it a lot!
Can you please:

Check you are in the correct environment
Check the versions of gspread and gspread-pandas

They are both defined in the requirements file now so they should be exactly the same as that:
gspread-pandas==3.2.2
gspread==5.12.4

If they are not it means you:

are not in the correct environment that did the pip install -r requirements
have installed something with pip after the requirements file (which has updated these modules)

Otherwise I've no idea whats going on.
As far as I can tell now that we have both these requirements this isn't an apero issue.

The reject script (for SPIROU) uses the FILENAME header key so the identifier should be exactly the same as that key to be rejected.
i.e.
FILENAME= '2503707d'           / filename anticipated by fitspipe server

This actually means that most of the bad list is incorrect for SPIRou and I never realised...
I'm not sure how to fix this but here is the list and the "SPIROU" tab (note for NIRPS we use the filename itself)
https://docs.google.com/spreadsheets/d/1gvMp1nHmEcKCUpxsTxkx-5m115mLuQIGHhxJCyVoZCM/edit?usp=sharing

I had seen it was again with gspread but thought it has been corrected with the 291 upgrade of the tools.
a 'pip freeze' on my installation says
gspread==6.1.3
gspread-pandas==3.2.2
so I need to downgrade gspread.
I have another installation I'm using for tests running gspread==5.12.4

regarding the issue with FILENAME in the reject list, at least all odometers with 'OBJECT' string in the comment G column are o.fits files.
All other are calibrations (CALIB or calib) but unfortunately I don't know when it's d,f,a or c.fits.
I could re-run the script generating the full list, but it may take some time.

worth noting that the amount of bad calibration is not so large I believe.

ok  @njcuk9999
Chris only did a:
pip install gspread==5.12.4
after going into the correct env.
I tested with adding a new target with apero_astrometrics, and adding a new bad odometer (actuall FILENAME) and it worked.

Do we have any idea why gspread was the wrong version?
Re: the reject list - I'll have a think about what I can do maybe there is a way to use it as a prefix instead of an exact match but it will be a lot slower!

gspread was the wrong version on my quicklook and offline version, because they were both installed from the .290 stable test in sep or oct.   I had the gspread corrected on a third setup which I'm using for tests and other things (like astrometrics and reject);   I thought when upgrading quicklook and offline to new .291 source last week with updated tools it would had solved the issue with gspread (it did at least when I verified Gl699 was correctly identified as an existng obj with apero_astrometrics) but actually Chris and I only realised yesterday that the py packages had to be updated too.   Chris just downgraded gspread.

For the reject list, I guess you would have to query the db for each odometer to get the DPRTYPE and thus build the corresponding filename ?


Add Config setting for skipping preparations

Also incidentally fixes the CacheTests to work with the latest version of the SQLite module.
This PR definitely doesn't apply to the beta branch, but the migration entity name config seems to have vanished from that branch and I'm not sure it's appropriate to add this config setting there versus something else.

If you set migrationEntityName to null, you can get the same effect without changing the source of the provider. At least in theory.

@vzsg True, but suppose I want to skip preparations but also not hardcode the name of the migration entity in my code (a case I actually ran into in practice) - also it's possible to manually set the skipPreparations value using the memberwise-style initializer, which suggests to me that it should be available via Config as well.


Derive Eq and Deref for TilemapId

Derives Deref and DerefMut for convenience,
Also derives Eq and PartialEq as these are implemented on the Entity type.
Let me know if there's a potential problem with doing this

This looks good @Piturnah can you just update the conflict and we can get this merged. :+1:

merged in #542 , thanks @Piturnah !


Different Mb sizes on several pages/docs ...

Hi,

Jodd = tools + ioc + mvc + db + aop + tx + json + html < 1.6 Mb

the Mb value is different at following places:

[x] https://github.com/oblac/jodd (1.6 Mb)
[x] https://twitter.com/joddorg (1.7 Mb)
[x] http://jodd.org/about/ (1 Mb)
[x] http://joddframework.org/ (1.5 Mb)
[x] http://oblac.github.io/jodd/ (1.2 MB)

The mentioned Mb value should be equals at all places ;-)
Maybe, this issue can be solved with the upcoming task "update documentation" ;-)

Ah, yes, I have this pending long time now :))

Btw @moh-sushi you should join the Jodd team :))) This issue proves it :)

I hope you don't mind, Ive edited the issue to make a checklist and have added missing places that also have to be fixed.
btw we are going with 1.7 MB.

I hope you don't mind

no problem :-))
btw: checklist is a good idea!

Done! Even added a variable for site :)


[BugFix] Function framework support checkout overflow

Why I'm doing:
Some functions, such as concat,  bitmap_to_string, will generate a BinaryColumn exceeding 4G. There is no check in the current function framework, which may lead to OOM or invalid result.
mysql> select sum(length(cast(c1 as string))) from t2;
+-----------------------------------------+
| sum(length(CAST(c1 AS VARCHAR(65533)))) |
+-----------------------------------------+
|<PHONE_NUMBER> |
+-----------------------------------------+

Before the pr
mysql> select length(bitmap_to_string(bitmap_agg(c1))) from t2;
+------------------------------------------+
| length(bitmap_to_string(bitmap_agg(c1))) |
+------------------------------------------+
|<PHONE_NUMBER> |
+------------------------------------------+

After the pr
mysql> select length(bitmap_to_string(bitmap_agg(c1))) from t2;
ERROR 1064 (HY000): Result column of function bitmap_to_string exceed limit: Total byte size of binary column exceed the limit:<PHONE_NUMBER>

What I'm doing:
Determine whether to check overflown based on function configuration.
List of functions that currently require check overflow:
space
repeat
append_trailing_char_if_absent
concat
concat_ws
array_concat_ws
split_part
split
regexp_replace
replace_old
replace
to_binary
from_binary
bitmap_to_string
bitmap_to_base64
bitmap_to_binary
get_json_string
get_json_object
json_string
to_base64
array_join
array_concat

The corresponding test case will be added to StarRocksTest.
What type of PR is this:

[x] BugFix
[ ] Feature
[ ] Enhancement
[ ] Refactor
[ ] UT
[ ] Doc
[ ] Tool

Does this PR entail a change in behavior?

[ ] Yes, this PR will result in a change in behavior.
[x] No, this PR will not result in a change in behavior.

If yes, please specify the type of change:

[ ] Interface/UI changes: syntax, type conversion, expression evaluation, display information
[ ] Parameter changes: default values, similar parameters but with different default values
[ ] Policy changes: use new policy to replace old one, functionality automatically enabled
[ ] Feature removed
[ ] Miscellaneous: upgrade & downgrade compatibility, etc.

Checklist:

[ ] I have added test cases for my bug fix or my new feature
[ ] This pr needs user documentation (for new or modified features or behaviors)

[ ] I have added documentation for my new feature or new function

[ ] This is a backport pr

Bugfix cherry-pick branch check:

[x] I have checked the version labels which the pr will be auto-backported to the target branch

[x] 3.2
[x] 3.1
[x] 3.0
[x] 2.5

@Mergifyio rebase


How to track stream events from downloadSequence?

Hi @ido-pluto, thank you for creating this useful library to download multiple files easily.
I would like to ask how to properly use streaming events when I use the downloadSequence method? I can't track progress or completed events from 'DownloadEngineMultiDownload' (returned by downloadSequence method)
Here's my code:

On my previous attempt, I ran the downloader.download() method. It runs automatically and show completed download status (when I debug downloader.downloadStatues), but I don't receive any progress or completed event from downloader / DownloadEngineMultiDownload class
Any solution? Thanks!

The progress data of downloadSequence is the total progress of all files as a whole.
If you want to be notified when the sub-download started/finished, you can listen to childDownloadStarted and childDownloadClosed
If you want to listen to all progress but get each sub-download progress separately, check the data in downloader.downloadStatues
const downloader = await downloadSequence(...)

downloader.on("progress", () => {
    console.log(downloader.downloadStatues);
});

That may be related to the flag skipExisting, that is weird you did not get completion events (finished event).
I will check that in-depth later :)

That may be related to the flag skipExisting, that is weird you did not get completion events (finished event). For me, the finished event fired even when skipping existing files.
Can you provide more context or any details that may be relevant?

Thanks for your reply.
Here, I want to download 10 URLs (each URL on a different server), and I need to track the progress of everything in % (percentage), and it would be helpful if we could track the download speed.
So, from the documentation, we can use the progress event to track progress (This works for a while, and won't work anymore after the 2nd attempt), and sometimes we get stuck on a block loop when awaiting for the downloadSequence(...) method.
For the finished event, I've set up the debug code, we can use console.log or similar. And, it doesn't log anything

Which version of Node.js are you using? Please try upgrading to the latest version.
There's a retry algorithm in place. Disable it so that any errors are thrown immediately, as this might be causing delays.
downloadFile({
   ...
    retry: {
        retries: 0
    }
})

The downloadSequence gathers information about the downloads, which is why it can take some time. Maybe one of the servers is very slow, try removing some to see if one of them particularly causes delays.
Does disabling the skipExisting option make any difference?
The downloadSequence won't fire a finished event only if an error occurs. Try wrapping the downloader in a try-catch block.
If any of these suggestions help, please let me know. I want to improve ipull for future use :)


HTML anchors are case-sensitive

Well spotted @jhermann thank you!

Sorry, won't enter our internal CLA workflow for changing case of 3 letters.

Fair enough, we'll change it. Thanks again @jhermann

Thank you @jhermann I have made the change for you.


Migrate critical constants and acentric factors batch 4

@saikat-samanta  can you decrease the batch size from next PR seems pretty big for one PR.

@manufac-analytics/devs Try to get everything resolved here asap. Been open for a while now.


Remove openssl from ssl:cipher_suites() command

What
Remove openssl from the command rabbitmqctl eval 'ssl:cipher_suites().' when listing out cipher suites supported
Why
When listing the cipher suites with rabbitmqctl eval 'ssl:cipher_suites(openssl).' it outputs the list in OpenSSL format:
# rabbitmqctl eval 'ssl:cipher_suites(openssl).'
["ECDHE-ECDSA-AES256-GCM-SHA384","ECDHE-RSA-AES256-GCM-SHA384",
 "ECDHE-ECDSA-AES256-SHA384","ECDHE-RSA-AES256-SHA384",
 "ECDH-ECDSA-AES256-GCM-SHA384","ECDH-RSA-AES256-GCM-SHA384",
 "ECDH-ECDSA-AES256-SHA384","ECDH-RSA-AES256-SHA384",
 "DHE-RSA-AES256-GCM-SHA384","DHE-DSS-AES256-GCM-SHA384",
 "DHE-RSA-AES256-SHA256","DHE-DSS-AES256-SHA256","AES256-GCM-SHA384",
 "AES256-SHA256","ECDHE-ECDSA-AES128-GCM-SHA256",
 "ECDHE-RSA-AES128-GCM-SHA256","ECDHE-ECDSA-AES128-SHA256",
 "ECDHE-RSA-AES128-SHA256","ECDH-ECDSA-AES128-GCM-SHA256",
 "ECDH-RSA-AES128-GCM-SHA256","ECDH-ECDSA-AES128-SHA256",
 "ECDH-RSA-AES128-SHA256","DHE-RSA-AES128-GCM-SHA256",
 "DHE-DSS-AES128-GCM-SHA256","DHE-RSA-AES128-SHA256","DHE-DSS-AES128-SHA256",
 "AES128-GCM-SHA256","AES128-SHA256","ECDHE-ECDSA-AES256-SHA",
 "ECDHE-RSA-AES256-SHA","DHE-RSA-AES256-SHA","DHE-DSS-AES256-SHA",
 "ECDH-ECDSA-AES256-SHA","ECDH-RSA-AES256-SHA","AES256-SHA",
 "ECDHE-ECDSA-DES-CBC3-SHA","ECDHE-RSA-DES-CBC3-SHA","EDH-RSA-DES-CBC3-SHA",
 "EDH-DSS-DES-CBC3-SHA","ECDH-ECDSA-DES-CBC3-SHA","ECDH-RSA-DES-CBC3-SHA",
 "DES-CBC3-SHA","ECDHE-ECDSA-AES128-SHA","ECDHE-RSA-AES128-SHA",
 "DHE-RSA-AES128-SHA","DHE-DSS-AES128-SHA","ECDH-ECDSA-AES128-SHA",
 "ECDH-RSA-AES128-SHA","AES128-SHA"]

Which doesn't appear to be compatible when used in rabbitmq.config. Issuing rabbitmqctl eval 'ssl:cipher_suites().' results in a list in this format:
# rabbitmqctl eval 'ssl:cipher_suites().'
[{ecdhe_ecdsa,aes_256_gcm,null,sha384},
 {ecdhe_rsa,aes_256_gcm,null,sha384},
 {ecdhe_ecdsa,aes_256_cbc,sha384,sha384},
 {ecdhe_rsa,aes_256_cbc,sha384,sha384},
 {ecdh_ecdsa,aes_256_gcm,null,sha384},
 {ecdh_rsa,aes_256_gcm,null,sha384},
 {ecdh_ecdsa,aes_256_cbc,sha384,sha384},
 {ecdh_rsa,aes_256_cbc,sha384,sha384},
 {dhe_rsa,aes_256_gcm,null,sha384},
 {dhe_dss,aes_256_gcm,null,sha384},
 {dhe_rsa,aes_256_cbc,sha256},
 {dhe_dss,aes_256_cbc,sha256},
 {rsa,aes_256_gcm,null,sha384},
 {rsa,aes_256_cbc,sha256},
 {ecdhe_ecdsa,aes_128_gcm,null,sha256},
 {ecdhe_rsa,aes_128_gcm,null,sha256},
 {ecdhe_ecdsa,aes_128_cbc,sha256,sha256},
 {ecdhe_rsa,aes_128_cbc,sha256,sha256},
 {ecdh_ecdsa,aes_128_gcm,null,sha256},
 {ecdh_rsa,aes_128_gcm,null,sha256},
 {ecdh_ecdsa,aes_128_cbc,sha256,sha256},
 {ecdh_rsa,aes_128_cbc,sha256,sha256},
 {dhe_rsa,aes_128_gcm,null,sha256},
 {dhe_dss,aes_128_gcm,null,sha256},
 {dhe_rsa,aes_128_cbc,sha256},
 {dhe_dss,aes_128_cbc,sha256},
 {rsa,aes_128_gcm,null,sha256},
 {rsa,aes_128_cbc,sha256},
 {ecdhe_ecdsa,aes_256_cbc,sha},
 {ecdhe_rsa,aes_256_cbc,sha},
 {dhe_rsa,aes_256_cbc,sha},
 {dhe_dss,aes_256_cbc,sha},
 {ecdh_ecdsa,aes_256_cbc,sha},
 {ecdh_rsa,aes_256_cbc,sha},
 {rsa,aes_256_cbc,sha},
 {ecdhe_ecdsa,'3des_ede_cbc',sha},
 {ecdhe_rsa,'3des_ede_cbc',sha},
 {dhe_rsa,'3des_ede_cbc',sha},
 {dhe_dss,'3des_ede_cbc',sha},
 {ecdh_ecdsa,'3des_ede_cbc',sha},
 {ecdh_rsa,'3des_ede_cbc',sha},
 {rsa,'3des_ede_cbc',sha},
 {ecdhe_ecdsa,aes_128_cbc,sha},
 {ecdhe_rsa,aes_128_cbc,sha},
 {dhe_rsa,aes_128_cbc,sha},
 {dhe_dss,aes_128_cbc,sha},
 {ecdh_ecdsa,aes_128_cbc,sha},
 {ecdh_rsa,aes_128_cbc,sha},
 {rsa,aes_128_cbc,sha}]

Which is usable in rabbitmq.config

Sorry but that's not a reason to remove it. The output can be useful for other purposes (our TLS troubleshooting guide uses openssl tools, for instance). In fact, there is a separate CLI command that supports the same formats in master.

Actually, I see what you mean. Will update that section instead. Thanks.

I've deployed a similar patch that mentions both formats and that one of them uses Erlang terms. Thank you!


Upgrade to 4.7.0-0.okd-2021-03-07-090821 not available from 4.6.0-0.okd-2021-01-23-132511

https://origin-release.apps.ci.l2s4.p1.openshiftapps.com/releasestream/4-stable/release/4.7.0-0.okd-2021-03-07-090821 indicates that it upgrades from 4.6.0-0.okd-2021-01-23-132511 but it is not available as an upgrade from the console.

Make sure you have stable-4 channel selected

I am not sure what is different about your test and my two clusters.  My ClusterVersion spec.upstream: 'https://origin-release.apps.ci.l2s4.p1.openshiftapps.com/graph'

As far as I can tell from the UI okd does not have a stable-4 channel, I have stable-4.6 selected:

Wrong channel - in OKD we have stable-4 only. Unfortunately, channels are hardcoded in console now, so please avoid using UI to select it.
You can switch back by oc edit clusterversion, change spec.channel to stable-4

Thanks, that did it.  Is there a ticket about the hard coded channels?  I don't even see mention of it in the documentation as a caveat to look out for.

@vrutkovs, https://github.com/openshift/enhancements/pull/531 has been closed without merge but selecting the channel from the UI is still handled poorly (see attached screenshot).  There is no longer a drop down with choices that cause a problem but now there is a text input with text suggesting incorrect (at least as you have previously indicated) values.

Right, lets reopen this and we'll contact folks from console for instructions


Convert to Python3

using : find . -name '*.py' | xargs 2to3 -w

Hello,
Thanks for the pull request but I don't really understand the purpose. 4scanner is already written in python3.
All your commit did is add some parentheses in the print commands and break the travis tests (And maybe 4scanner, I didn't have a chance to test your changes)
Could you tell me what is the purpose of your changes are?

Just a few minor updates.. Thanks for comment !

Travis tests are still in errors.
And you didn't answer me, what is the purpose of these changes?

I am referring to following link to not the same module name like the folder name to make code clear.
http://stackoverflow.com/questions/1250103/attributeerror-module-object-has-no-attribute .

I'm sorry but you're saying you want to made the code clearer but you add binaries, log files, auto generated packaging files, and other random files into the repo.
You also added test for python 2.7 in travis but 4scanner does not even support it.
I can't merge this. This is anything but clearer. All this just for changing scanner to scann is really not worth it.


Release 1.4.2

What's Changed

Add @bufbuild/protobuf to the direct dependencies of protoc-gen-es by @timostamm in https://github.com/bufbuild/protobuf-es/pull/601
Update to google protobuf v25.0 by @timostamm in https://github.com/bufbuild/protobuf-es/pull/608

Full Changelog: https://github.com/bufbuild/protobuf-es/compare/v1.4.1...v1.4.2

Might need a clean install, the integrity values are removed from lock file

A clean install as in deleting node_modules and the lock file? This will potentially bump versions and affect the build - not something I want to do in a release.
The removal of the integrity fields are on npm. More context here https://github.com/bufbuild/protobuf-es/issues/526#issuecomment-1764787447. It's quite frustrating for nix, but it's also not feasible for us to work around the npm bugs.


Add Cinder CSI driver Dockerfiles

/hold
for 4.7 to open - we don't want to break Manila driver now

/hold cancel
(wrong PR :-)

/lgtm


Don't infer x/y coordinates interval breaks for cartopy plot axes

The DataArray.plot.pcolormesh() method modifies the x/y coordinates of its plots.  I'm finding that, at least for custom cartopy projections, the offset applied here causes some real issues downstream.
@clarkfitzg - Do you see any problem with treating the x/y offset in the same way as the axis limits?

Inferring x/y coordinate breaks solves the puzzle of losing the last row and column of data when plotting with pcolormesh.
Are your coordinates very unevenly spaced? I'm curious what goes wrong here -- it's nice to plot all the data if possible.

@shoyer - I'm not sure that problem exists when plotting with carotpy.  I'd have to check though.
Yes, my coordinates are quite unevenly spaced (Equal area projection over the north pole).
My suggestion is that we let cartopy handle locating the coordinates when applicable.

@jhamman Seems like that would work. Might write a test to make sure the edges don't get dropped. I'd say let cartopy do as much as possible! cartopy integration was a lower priority when I was working on this, but only because we wanted to get the base stuff working first. More seamless integration or documentation for how to use with cartopy would be a good thing.

A little example of where I'm seeing this go wrong (I think).  Here I'm plotting the terrain height variable across the Arctic region, the north pole is somewhere in the middle of the plot. As you can see, there is an odd streak across the plot when using the xarray pcolormesh.
import cartopy.crs as ccrs

# projection class
class Rasm(ccrs.Projection):

    def __init__(self):

        proj4_params = {'R': 6371200.0,
                        'lat_0': 90.0,
                        'lat_1': 90,
                        'lat_2': 90,
                        'lon_0': -114.0+360,
                        'proj': 'lcc',
                        'units': 'm',
                        'x_0': 9469302.950316086,
                        'y_0': 6201952.603370549}

        super(Rasm, self).__init__(proj4_params)

    @property
    def boundary(self):
        coords = ((self.x_limits[0], self.y_limits[0]),(self.x_limits[1], self.y_limits[0]),
                  (self.x_limits[1], self.y_limits[1]),(self.x_limits[0], self.y_limits[1]),
                  (self.x_limits[0], self.y_limits[0]))

        return ccrs.sgeom.Polygon(coords).exterior

    @property
    def threshold(self):
        return 100000.0

    @property
    def x_limits(self):
        return (0, 16423961.103252266)

    @property
    def y_limits(self):
        return (0, 12228062.194885937)

plt.figure()
ax = plt.subplot(projection=Rasm())
elev.plot.pcolormesh('longitude', 'latitude', transform=ccrs.PlateCarree(),
                     vmin=0, vmax=2500, cmap='terrain', add_colorbar=False)
ax.set_title('Using xarray plotting')

plt.figure()
ax = plt.subplot(projection=Rasm())
ax.pcolormesh(elev.longitude, elev.latitude, elev.to_masked_array(),
              transform=ccrs.PlateCarree(), cmap='terrain', vmin=0, vmax=2500)
ax.set_title('Using pyplot and Cartopy')

OK, that seem pretty compelling to me. You do lose one row of data across the top of the image, but that's better than the artifact.

Sorry to for joining so late but I am unhappy with this change - because now all the global cartopy maps look like this:

and more importantly - there is no way to change this. Thus, I would suggest to add a keyword argument to plot2d.
either
infer_interval_breaks : bool, optional
    Only applies to pcolormesh. If True calculates the edges of the coordinates and if
     False uses the given coordinates. Default True.

or if we don't want to break the current behaviour:
infer_interval_breaks : bool or None, optional
    Only applies to pcolormesh. For None infer_interval_breaks is set to True if the
    axis has no projection and else to False. If True calculates the edges of the coordinates, if
    False uses the given coordinates. Default None.

What is your opinion on this?
@pheidippides

Yes, this is definitely a problem.
See for example the differences between imshow (which does fine) and pcolormesh (which is clearly wrong)
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import xarray as xr

da = xr.DataArray(np.arange(20).reshape(4, 5), dims=['lat', 'lon'],
                  coords = {'lat': np.linspace(0, 30, 4),
                            'lon': np.linspace(-20, 20, 5)})

f = plt.figure()
ax = plt.axes(projection=ccrs.PlateCarree())
da.plot.pcolormesh(ax=ax, transform=ccrs.PlateCarree())
lon, lat = np.meshgrid(da.lon.values, da.lat.values)
ax.scatter(lon, lat, transform=ccrs.PlateCarree())
ax.coastlines()
ax.set_title('pcolormesh')

f = plt.figure()
ax = plt.axes(projection=ccrs.PlateCarree())
da.plot.imshow(ax=ax, transform=ccrs.PlateCarree())
ax.scatter(lon, lat, transform=ccrs.PlateCarree())
ax.coastlines()
ax.set_title('imshow')

plt.show()

What got us in trouble before was the approach we took to infering the interval breaks. If you're willing to work through the logic related to 1d and 2d non-uniform coordinates, we can address this.

I think a keyword argument is a pretty solid way to handle this. Detecting uniform coordinates specified with floating point numbers is pretty error prone.


如何建立以太阳为中心的天体轨道

我想建立一个以太阳为中心的天体运动轨道，地球，火星，木星等行星围绕太阳运行形成一个圆形轨道，请问cesium目前是否有支持该想法的技术

From Google Translate:

I want to build a sun-centered celestial orbit. Earth, Mars, Jupiter and other planets orbit around the sun to form a circular orbit. Does cesium have any technology to support this idea?

I would say there's nothing built-in to CesiumJS to support displaying multiple globes together at the same time. I think you could conceivably create other ellipsoids and fly to them, but I imagine precision issues will arise at interplanetary scales.

@OmarShehata ,我用椭圆体（ ellipsoid ）创建的轨道，但是所有的天体（包括太阳，火星，木星等）都是围绕地球旋转，如何使它们围绕太阳旋转，cesium有没有这种方法？

From Google Translate of the above:

I use the ellipsoid (ellipsoid) to create the orbit, but all the celestial bodies (including the sun, Mars, Jupiter, etc.) are rotating around the earth, how to make them rotate around the sun, is there any way for cesium?

I think you'll have to create these systems yourself. This class for computing the sun and moon's positions might help point you in the right direction:
https://github.com/AnalyticalGraphicsInc/cesium/blob/master/Source/Core/Simon1994PlanetaryPositions.js
Best of luck! If you do get something working feel free to share it with us on Twitter (https://twitter.com/cesiumjs) or on the forum!

@OmarShehata The questioner clearly lacks sufficient understanding of Cesium and knowledge of celestial orbits. In this situation, no one can say a few words to make the questioner clear what they should do. The questioner doesn't even know what they're talking about

@hanyingling 你先了解你的轨道数据来源  各种坐标系 常用的地固系和 地心ICRF , 如果”你想建立一个以太阳为中心的天体运动轨道，地球，火星，木星等行星围绕太阳运行形成一个圆形轨道“ , 我建议你使用别的库，例如SpaceKit.js,问题将会变得简单很多


Add Register API docs

Context
We need to document the new shiny API ✨ we made for the Register team 💙
Changes proposed in this pull request
Add OpenAPI spec
Guidance to review
visit /register-api-docs
Pay the most attention to the following new attributes:

gender
disabilities
ethnic_group
ethnic_background
comparable_uk_degree

Note: 422 ParameterInvalid is not showing in the Possible responses section because there is already 422 listed for ParameterMissing but we have a separate error for this. Not sure what to do about this.
We are also missing ParameterInvalid response in the Vendor API docs for GET /applications.
I added this as a separate commit which can be dropped or fixed up.
Link to Trello card
https://trello.com/c/yo8jZhLa/3499-spike-bare-bones-api-for-register
Things to check

[ ] This code does not rely on migrations in the same Pull Request
[ ] If this code includes a migration adding or changing columns, it also backfills existing records for consistency
[ ] API release notes have been updated if necessary
[ ] This code does not rely on the addition/removal of Azure config environment variables in the same Pull Request
[ ] New environment variables have been added to the Azure config

For guaranteed usefulness, I think this PR should include adding schema checks to the request specs a la https://github.com/DFE-Digital/apply-for-teacher-training/blob/4dd04dfaaecc4e1e796fa0d4f9b3e0f637e0d907/spec/requests/vendor_api/get_multiple_applications_spec.rb#L52

Just the one comment, looks good otherwise, only thing I also noticed when having a look locally is that examples are not rendered as code blocks (example to look at HTTP 200 - An array of applications in register vs vendor API)

This should be fixed by https://github.com/DFE-Digital/apply-for-teacher-training/pull/4437/commits/d3751849d8c0345a4b2f93e6f425808125aac01e


Removing transitive dependencies K4Kotlin and Android Databinding

When the QuickPermissions-Kotlin library is integrated into app projects, it unfortunately brings transitive dependencies with it, which the using application may not want.
The usage of K4Kotlin automatically introduces another transitive dependency on Android Databinding. Both of these libraries are then forced onto the using app, which also requires adding proguard rules for databinding.
The internal usage of K4Kotlin is very low. All of the usages can easily be replaced with default functionality from the support lib. This pull request does exactly that and so removes both of these dependencies.

@SebastianEngel  Thank you so much for the pull request. K4kotlin is pretty lightweight. I will review the changes and its impact. Please allow me some time

Hi @kirtan403, did you find some time to have a look into it?

I'm going to have to stop using your library. You depend on a deprecated Kotlin versoin, not to mention the issues above.

Decided to use @SebastianEngel 's commit instead. Please maintain your library.

@SebastianEngel  I have merged the changes. Will release the new version soon. Sorry for the delay..

@carterhudson  I couldn't get the much time. Sorry about that, I am updating versions now.

Release a new version: https://github.com/QuickPermissions/QuickPermissions-Kotlin/releases/tag/0.3.0


Add multiple config support

I've attempted to retain old configs by checking for it in the Config constructor, so hopefully no one losses theirs. I haven't done any work in C++ before, so hopefully this is all up to standard. Added some custom ImGui controls so I could get the window looking how I wanted it to (the hardcoded text paddings need to be set to the corresponding style variable).

I think I've fixed what you're looking for, not sure how I didn't use std::filesystem in the first place.

Still seems overcomplicated to me.

Ah well, happy for you to do whatever with it. What looks complicated for you? I could get rid of the old config support, and apart from that it seems straightforward to me.

I never had any configs to begin with so, i guess nothing was complicated, i made it work in the 1st time.

Merged, thanks for your contribution.


chore(docs): Docs revamp, update folder structure Boilerplate/*

This is an effort to improve the docs measurably, both in structure and filling in gaps of content.
It will break some documentation links, but since docs.infinite.red is new, I'd rather do it now before there are too many external links.
It's not yet ready to review but feel free to add your thoughts anytime.

Main changes:

Updated Boilerplate.md to be more of an entry point to discussing the folder structure (and boilerplate in general), rather than immediately jumping into folder structure discussion.
Created the full boilerplate folder tree in ./Boilerplate/*, such as ./Boilerplate/app/app.tsx.md. Each of these new docs discusses the purpose of the file and how it is used. It's a starting point for further expansion.
Updated the Boilerplate.md file to link to the new files in ./Boilerplate/*.
Moved ./Components into ./Boilerplate/components. This will probably break some external links.
Moved ./Theming as well.
Fixed internal links to the new locations.
Created an Expo section with Expo Go, CNG, and DIY pages. Also an EAS page.
Moved Expo-and-Ignite into the new Expo section.
Updated Styling a bit
Updated the docs/README.md to link to all the new docs

haha, these changes are going to conflict with mine in #2627. I'll take care of it.

:tada: This PR is included in version 9.4.5 :tada:
The release is available on:

npm package (@latest dist-tag)
GitHub release

Your semantic-release bot :package::rocket:


[ScrollArea] Create new ScrollArea component

[x] I have followed (at least) the PR section of the contributing guide.

Closes #649
Preview: https://deploy-preview-665--base-ui.netlify.app/components/react-scroll-area/

It's about https://github.com/mui/mui-x/issues/510 right? (adding a cross link)

@oliviertassinari

It's about https://github.com/mui/mui-x/issues/510, right?

No we didn't see this issue prior to planning this work. It's just a basic building block of high-quality web dev, so I had planned to add it from the beginning.

most applications don't have a custom scrollbar
Very many web apps (Slack, Linear, Radix docs etc. etc.) have custom scrollbars. It's not possible to build a high-quality web UI without them.

We could envision this component under the Base UI X brand umbrella

Do you think this belongs under the premium components? We need it for our new docs (for the sidebar and code blocks). It's not a huge investment, and Radix provides one for free.

No we didn't see this issue prior to planning this work. It's just a basic building block of high-quality web dev, so I had planned to add it from the beginning.

@colmtuite In any way, I mostly wanted to create a backlink between these two so it's easier to discover the link.

Very many web apps (Slack, Linear, Radix docs etc. etc.) have custom scrollbars. It's not possible to build a high-quality web UI without them.

For peak execution, I very much agree. For the average UIs, I don't know, I personally never implemented a custom scrollbar 😄.
I think to be careful about the opportunity cost: downloads https://npm-stat.com/charts.html?package=overlayscrollbars&package=react-dropzone&from=2018-10-05&to=2024-10-05 vs. effort to do it right: https://github.com/KingSora/OverlayScrollbars/issues?q=is%3Aissue+is%3Aclosed.
The platform exposes some primitives to customize this, e.g. https://codepen.io/oliviertassinari/pen/PoMzdJa
https://github.com/user-attachments/assets/360c88c7-39a4-458e-bfc6-4f814251b37a
but until they fix https://github.com/w3c/csswg-drafts/issues/9826, https://github.com/w3c/csswg-drafts/issues/10591, it doesn't feel like a viable option, far from it.

Do you think this belongs under the premium components? We need it for our new docs (for the sidebar and code blocks). It's not a huge investment, and Radix provides one for free.

Premium plan, no. Pro plan, maybe for the styled layer, it would make sense. Now, I get the feeling that 3 years from now, this component is no longer needed, built-in in the platform

The CSB version of the intro demo (https://codesandbox.io/p/sandbox/pydrhc?file=%2Fsrc%2Findex.tsx) looks slightly broken:

Likely a box-sizing issue?

Took it for a spin. Many notes, but overall it's great. I love how much control I have over when exactly the scrollbar would be shown or hidden.

Are we sure we don't want to remove the built-in scrollbar-width and ::-webkit-scrollbar styles by default? Having to add them manually is going to be a hurdle when Radix users migrate, especially if they use Tailwind, which doesn't provide classes for either property.
type="inlay" is an unusual value. I appreciate the symmetry with "overlay" but I don't think I had ever typed the word "inlay" in the code editor, or referred to these scrollbars in a conversation like that. "inset" or "classic" is what I'd expect to call that scrollbar type instead.

Since we provide little built-in styles here already, I almost wonder if gutter and type should be implemented by the user? I assume the difference is mainly in having position: absolute and setting the padding manually. Where do we draw the line between functional styles like this and styles like removing default scrollbar-width that you seem to have to do in all cases?

Arrow keys don't scroll the scroll area after clicking the scrollbar (works with native scrollbars)
Scrollbar visibility and size doesn't update when Root height changes (e.g. due to an imperative style change. It does update when children change).
overscroll-behavior: none on Root doesn't affect the Scrollbar part. In other words, scrolling with pointer over the Scrollbar part retains the default overscroll behaviour. This is problematic in designs where overscroll-behavior is important to remove.
It was a bit unintuitive to figure out that to always display scrollbars, you'd need to use hidden={false} (I assume this is the way?). I expected keepMounted or something like that coming from Radix. Not a big deal, just seems to be slightly inconsistent with how force rendering other components works.
Should it be data-hovered to converge with React Aria's data attribute and our own data-pressed?

Are we sure we don't want to remove the built-in scrollbar-width and ::-webkit-scrollbar styles by default? Having to add them manually is going to be a hurdle when Radix users migrate, especially if they use Tailwind, which doesn't provide classes for either property.

I think we can remove them by default, but Safari requires a <style> tag, right?

type="inlay" is an unusual value. I appreciate the symmetry with "overlay" but I don't think I had ever typed the word "inlay" in the code editor, or referred to these scrollbars in a conversation like that. "inset" or "classic" is what I'd expect to call that scrollbar type instead.

I got this naming from VS Code: it has a feature called "inlay hints" which are inline with the flow of the code

Since we provide little built-in styles here already, I almost wonder if gutter and type should be implemented by the user? I assume the difference is mainly in having position: absolute and setting the padding manually. Where do we draw the line between functional styles like this and styles like removing default scrollbar-width that you seem to have to do in all cases?

I think we can remove the scrollbar styles by default now, but removing the scrollbar is a lot easier than defining the padding (and the element node is not actually exposed by default).

Scrollbar visibility and size doesn't update when Root height changes (e.g. due to an imperative style change. It does update when children change).

There's a ResizeObserver but it might need to be lifted up to the root if it's defined on the viewport. Will check this.

overscroll-behavior: none on Root doesn't affect the Scrollbar part. In other words, scrolling with pointer over the Scrollbar part retains the default overscroll behaviour. This is problematic in designs where overscroll-behavior is important to remove.

I don't think this is possible to fix since it uses a wheel event, since the pointer events block scrolling otherwise. Radix also has this issue

It was a bit unintuitive to figure out that to always display scrollbars, you'd need to use hidden={false} (I assume this is the way?). I expected keepMounted or something like that coming from Radix. Not a big deal, just seems to be slightly inconsistent with how force rendering other components works.

They're visible by default, there's no hidden or anything. You can hide it by default then use the hovering/scrolling style hooks to show it.

Should it be data-hovered to converge with React Aria's data attribute and our own data-pressed?

hovering matches scrolling verb, but hover alone would match the CSS state. hovered sounds like you've potentially left the element already and doesn't seem accurate.

I don't think this is possible to fix since it uses a wheel event, since the pointer events block scrolling otherwise. Radix also has this issue

Is this approach too heavy-handed? I asked specifically because I had run into the overscroll-behavior issue before with Radix and it's really unpleasant with no workaround.

I think we can remove them by default, but Safari requires a <style> tag, right?

Yeah Safari is the main problem. We don't have a precedent for rendering a <style> tag yet, do we?

They're visible by default, there's no hidden or anything. You can hide it by default then use the hovering/scrolling style hooks to show it.

I'm seeing a hidden attribute when there is no overflow:

I'd expect to either not have this element rendered at all and force mount it, or have to handle the visibility myself.

hovering matches scrolling verb, but hover alone would match the CSS state. hovered sounds like you've potentially left the element already and doesn't seem accurate.

I think it's best when data attributes describe the state of the component itself rather than what the user is doing; in this sense data-hovered reads more like "the element is hovered" to me, same as data-selected, data-active, etc. Can go either way on data-scrolling since it's a transitory state though. Maybe best if we leave these discussions for the Monday calls

I'm seeing a hidden attribute when there is no overflow:

There are two separate "hidden" cases

There is no overflow, so no scrollbar should ever be shown - that's where hidden comes in
There is overflow, but you need to decide when to show it: hovering, scrolling, or both?

I thought there was no use case for showing the scrollbar with no overflow given our existing gutter prop keeps layout stable, hence hidden for that case. If we change it, a keepMounted prop could enable you to create a visual gutter for the inlay type when it's hidden with no overflow, separate from the gutter prop which creates a "virtual" invisible gutter. Is there a valid point to that?

Is https://github.com/radix-ui/primitives/pull/2200 too heavy-handed? I asked specifically because I had run into the overscroll-behavior issue before with Radix and it's really unpleasant with no workaround.

This looks smart, I'll give it a try.

Yeah Safari is the main problem. We don't have a precedent for rendering a


Agree to contract before generating keys or signing.

A pop-up window alerting the user that they are generating or using keys tweaked with the contract. They must accept to continue. There is already a function used for Export > addresses.

The pop-up only appears at the signing stage if the wallet is encrypted. This should be extended to request confirmation  for unencrypted wallets as well.


Device_Claim system call takes too much time

Since every thread on the same CPU shares the same kernel stack, we can't currently switch tasks within kernelspace. Therefore, we need to spend as little time there as possible.
The Device_Claim system call takes about a second on QEMU with only two devices in the device tree, and the scheduler is completely blocked during that time. This could be used as a sort of DoS attack, where a process sends many useless Device_Claim requests to the kernel, thereby severely reducing the system's responsiveness.
Simply optimizing the search won't be enough (although there are definite opportunities to do that), since there is no upper bound on the size of the device tree. Instead, we should make the whole thing asynchronous and delegate the search to a thread.
I see three possible ways to implement this:

A new userspace process with permission to assign ownership to devices. The kernel would have to construct the device tree itself (as it already does) and map the tree into that process's address space. This has the possible benefit of reducing the kernel's responsibilities.
Kernelspace threads. It shouldn't be too hard to allocate a new stack for each one, and it would lead to less context switching. It would also allow us to implement every asynchronous system call in a similar fashion, even the ones that can't reasonably be implemented in userspace.
Attach a Rust future to the thread when the system call is made. In Thread::run, instead of immediately entering userspace, see if it's waiting on a future. If so, poll the future; if not, enter userspace. This should have less overhead than option 2, and much less than option 1, but we would need to ensure that every such future can be polled in constant time. That would likely mean some messy unrolling of loops into multiple function calls.

Out of these options, I'm currently leaning toward number 3 for its potentially high throughput. We can put a reminder in the type name that this kind of future should be pollable in constant time.
When this system is in place, it won't matter much how long the search takes: in normal operation, it's only performed once per device, and no malicious or buggy thread will be able to extend its allotted time slice by performing the search multiple times.

I ended up going with a 4th option: return from the system call with a value that means it should be retried. This is much more lightweight than any of the other solutions I proposed above. That even includes option 3, since making a new future that userspace can await requires an allocation, which is slow and unbounded in its time complexity.
A consequence of this new implementation is that, while system calls are implemented in the kernel in an asynchronous fashion, they are synchronous from the perspective of userspace.
I'm leaving this issue up for now because I still haven't actually solved the problem. Device_Claim still takes an unbounded amount of time before returning to the system call. I've only made the infrastructure necessary for it to work. The system call needs to be broken into pieces, each of which finishes by storing its progress somewhere and saying to call it again.


Unresolvable JSON pointer when references are used together with default values

OpenAPI Spec validator version: 0.2.9
Python version: 3.7.7
Operating system: macOS Catalina 10.15.6

For complex OpenAPI types openapi-spec-validator fails when those types have a #ref reference and a default value specified.
Steps to reproduce the problem
For example, if I have the following cats_fail.yaml file:
openapi: 3.0.1
info:
  title: Cat API
  version: 2.0.0
paths:
  /yodeling:
    post:
      requestBody:
        description: Cats yodeling payload
        content:
          'application/json':
            schema:
              $ref: '#/components/schemas/catsRequest'
      responses:
        '200':
          description: cats yodeling success
components:
  schemas:
    catsRequest:
      type: object
      properties:
        name:
          $ref: "#/components/schemas/catName"
      default: {
        "name": "schrodinger"
      }

    catName:
      type: string

then running the following command:
openapi-spec-validator cats_fail.yaml

results in the following error message:
Unresolvable JSON pointer: 'components/schemas/catName'

However, for the following cats_success.yaml file:
openapi: 3.0.1
info:
  title: Cat API
  version: 2.0.0
paths:
  /yodeling:
    post:
      requestBody:
        description: Cats yodeling payload
        content:
          'application/json':
            schema:
              $ref: '#/components/schemas/catsRequest'
      responses:
        '200':
          description: cats yodeling success
components:
  schemas:
    catsRequest:
      type: object
      properties:
        name:
          type: string
      default: {
        "name": "schrodinger"
      }

running:
openapi-spec-validator cats_success.yaml

results in OK response.

Looks like it's the same issue I reported on #92.


Large lines causing horizontal scroll turns editor unresponsive

Pasting or opening a file with the following code, turns the editor unresponsive.
<script type="text/javascript">
    _characterList =  {"R01-S01-T01":[{"id":"Chloe Flower","name":"Chloe Flower","imageUrl":"/media/5801/SPKS2_PNGs_FRUIT__VEG_Chloe-Flower.png","bio":"A bit of a hippy, I'm all about 'Flower Power' but I'm loyal to the end! I never leaf my friends behind!","theName":"Fruit and Veg","theTeam":"This team hangs out in the fruit and vege department","shopkinsBFF":"Rockin' Broc","shopkinsHangout":"Fruit & Veg","favouriteHobby":"Leafing through the newspaper"},{"id":"Corny Cob","name":"Corny Cob","imageUrl":"/media/5802/SPKS2_PNGs_FRUIT__VEG_Corny-Cob.png","bio":"Famous for his corny jokes, he can’t help pop up to say hello when things get hot! After a big day of shopping, he loves to just flake out! And what sort of pet does Poppy Corn own? A corn dog of course! Oh how Corny can one Shopkin get!","theName":"Fruit and Veg","theTeam":"This team hangs out in the fruit and vege department","shopkinsBFF":"Poppy Corn","shopkinsHangout":"His Husky voice is always heard in the Fruit and Vegetable Department","favouriteHobby":"Doing Puzzles and Maizes"},{"id":"Dippy Avocado","name":"Dippy Avocado","imageUrl":"/media/5824/SPKS2_PNGs_FRUIT__VEG_Dippy-Avocado.png","bio":"A true greenie who likes to spread himself around. I sometimes like to spice things up!","theName":"Fruit and Veg","theTeam":"This team hangs out in the fruit and vege department","shopkinsBFF":"Silly Chilli & Brenda Blenda","shopkinsHangout":"Fruit & Veg","favouriteHobby":"Taking a dip on a hot day"},{"id":"Juicy Orange","name":"Juicy Orange","imageUrl":"/media/5803/SPKS2_PNGs_FRUIT__VEG_Juicy-Orange.png","bio":"She loves a juicy bargain and is always putting the squeeze of the shop owner for the best price! Her favorite color? – Orange! Her favorite flavor? – Orange!  Her favorite greeting? “Orange you glad to see me?” Now that’s an a-peeling joke!","theName":"Fruit and Veg","theTeam":"This team hangs out in the fruit and vege department","shopkinsBFF":"Sour Lemon","shopkinsHangout":"She’s squeezed into the Fruit and Veg Section.","favouriteHobby":"Keeping Juicy Secrets"},{"id":"Silly Chilli","name":"Silly Chilli","imageUrl":"/media/5825/SPKS2_PNGs_FRUIT__VEG_Silly-Chilli.png","bio":"Some friends say I come across as being cold, but really I'm just a little chilli!","theName":"Fruit and Veg","theTeam":"This team hangs out in the fruit and vege department","shopkinsBFF":"Dippy Avocado","shopkinsHangout":"Fruit & Veg","favouriteHobby":"Eating very HOT dogs"}],"R01-S01-T02":[{"id":"Brenda Blenda","name":"Brenda Blenda","imageUrl":"/media/5804/SPKS2_PNGs_HOMEWARES_Brenda-Blender.png","bio":"A real smooth operator who sometimes like to stir up trouble. I'm a wiz at blending in with a crowd!","theName":"Homewares","theTeam":"","shopkinsBFF":"Dippy Avocado","shopkinsHangout":"Homewares","favouriteHobby":"Mixing with her friends"},{"id":"Lana Lamp","name":"Lana Lamp","imageUrl":"/media/5805/SPKS2_PNGs_HOMEWARES_Lana-Lamp.png","bio":"A brilliant personality who loves light hearted jokes. I love coming up with bright ideas!","theName":"Homewares","theTeam":"","shopkinsBFF":"Lisa Litter","shopkinsHangout":"Homewares","favouriteHobby":"Reading in bed"},{"id":"Sizzles","name":"Sizzles","imageUrl":"/media/5826/SPKS2_PNGs_HOMEWARES_Sizzles.png","bio":"Warm hearted rather than hot tempered and a hard worker. I love to steam through my jobs each day!","theName":"Homewares","theTeam":"","shopkinsBFF":"Wendy Washer","shopkinsHangout":"Homewares","favouriteHobby":"Riding on steam trains"},{"id":"Toasty Pops","name":"Toasty Pops","imageUrl":"/media/5827/SPKS2_PNGs_HOMEWARES_Toasty-Pop.png","bio":"Toasty Pop is always popping up when it’s least expected but she always has a warm welcome for everyone!  The burning question is what’s here favorite type of bread? I’ve heard its raisin loaf! Spread the word!","theName":"Homewares","theTeam":"","shopkinsBFF":"Butter Cup","shopkinsHangout":"She’s always popping up in the Homewares Department ","favouriteHobby":"Throwing parties and giving toasts! "},{"id":"Zappy Microwave","name":"Zappy Microwave","imageUrl":"/media/5828/SPKS2_PNGs_HOMEWARES_Zappy-Microwave.png","bio":"A real fast thinker who wants everything done YESTERDAY! I can be a little inpatient so don't push my buttons!","theName":"Homewares","theTeam":"","shopkinsBFF":"Saucy Pan","shopkinsHangout":"Homewares","favouriteHobby":"Speed Reading"}],"R01-S01-T03":[{"id":"Carrie Carrot Cake","name":"Carrie Carrot Cake","imageUrl":"/media/5795/SPKS2_PNGs_BAKERY_Carrie-Carrot-Cake.png","bio":"Sweet but a little nutty! People say I have a heart of gold…  A 24 carrot heart of gold!","theName":"Bakery","theTeam":"","shopkinsBFF":"Pecanna Pie","shopkinsHangout":"Bakery","favouriteHobby":"Horse Riding"},{"id":"Fifi Fruit Tart","name":"Fifi Fruit Tart","imageUrl":"/media/5837/SPKS2_PNGs_BAKERY_Fifi-Fruit-Tart.png","bio":"","theName":"Bakery","theTeam":"","shopkinsBFF":"","shopkinsHangout":"","favouriteHobby":""},{"id":"Mary Meringue","name":"Mary Meringue","imageUrl":"/media/5796/SPKS2_PNGs_BAKERY_Mary-Meringue.png","bio":"SWEEEET and fluffy! Plus I always have my head in the clouds….. Sorry what was the question?","theName":"Bakery","theTeam":"","shopkinsBFF":"Lippy Lips","shopkinsHangout":"Bakery","favouriteHobby":"Whipping up treats"},{"id":"Pecanna Pie","name":"Pecanna Pie","imageUrl":"/media/5838/SPKS2_PNGs_BAKERY_Pecanna-Pie.png","bio":"A bit nutty in the head but a real sweetheart inside!","theName":"Bakery","theTeam":"","shopkinsBFF":"Carrie Carrot Cake","shopkinsHangout":"Bakery","favouriteHobby":"Going to the Ballet, especially 'The Nutcracker'"},{"id":"Slick Breadstick","name":"Slick Breadstick","imageUrl":"/media/5797/SPKS2_PNGs_BAKERY_Slick-Breadstick.png","bio":"Crusty on the outside but warm on the inside. It's a tall order being a breadstick!","theName":"Bakery","theTeam":"","shopkinsBFF":"Alpha Soup and Faster Pasta","shopkinsHangout":"Bakery","favouriteHobby":"Lunching in a French Cafe"}],"R01-S01-T04":[{"id":"Ice-cream Dream","name":"Ice-cream Dream","imageUrl":"/media/5789/SPKS2_PNGs_SWEET_TREATS_Ice-Cream-Dream.png","bio":"A little bit drippy but never loses her cool. I'm always cool, cone and collected!","theName":"Sweet Treats","theTeam":"","shopkinsBFF":"Ice-cream Dream & Waffle Sue","shopkinsHangout":"Sweet Treats ","favouriteHobby":"Chilling out alone in her cone"},{"id":"Minnie Mintie","name":"Minnie Mintie","imageUrl":"/media/5833/SPKS2_PNGs_SWEET_TREATS_Minnie-Mintie.png","bio":"A breath of fresh air! She's always cool to be around! Hugs and Kisses everyone!!!","theName":"Sweet Treats","theTeam":"","shopkinsBFF":"Yummy Gum","shopkinsHangout":"Sweet Treats ","favouriteHobby":"Yoga and deep breathing"},{"id":"Pamela Pancake","name":"Pamela Pancake","imageUrl":"/media/5834/SPKS2_PNGs_SWEET_TREATS_Pamela-Pancake.png","bio":"Stacks of fun! Overflowing with sweetness. But I'm never too syrupy! ","theName":"Sweet Treats","theTeam":"","shopkinsBFF":"Cheery Churro","shopkinsHangout":"Sweet Treats ","favouriteHobby":"Flipping out in the Diving pool"},{"id":"Poppy Corn","name":"Poppy Corn","imageUrl":"/media/5790/SPKS2_PNGs_SWEET_TREATS_Poppy-Corn.png","bio":"When it comes to shopping, no one does it butter! Poppy Corn really knows how to bag a bargain. She’ll shop till she pops and then some! She always gets into the cinema early so she can watch all the ads. They’re her favorite part of the movie!","theName":"Sweet Treats","theTeam":"","shopkinsBFF":"Corny Cob","shopkinsHangout":"Sweet Treats ","favouriteHobby":"Going to the movies "},{"id":"Waffle Sue","name":"Waffle Sue","imageUrl":"/media/5791/SPKS2_PNGs_SWEET_TREATS_Waffle-Sue.png","bio":"A total chatterbox who loves to stay toasty warm. Even if it means a meltdown on top!","theName":"Sweet Treats","theTeam":"","shopkinsBFF":"Ice-cream Dream","shopkinsHangout":"Sweet Treats ","favouriteHobby":"Waffling on about anything"}],"R01-S01-T05":[{"id":"Al Foil","name":"Al Foil","imageUrl":"/media/5829/SPKS2_PNGs_PANTRY_Al-Foil.png","bio":"Strong and protective but can get torn between friends. I love to shine!","theName":"Pantry","theTeam":"","shopkinsBFF":"Soda Pops","shopkinsHangout":"Pantry","favouriteHobby":"Wrapping with his friends"},{"id":"Cornell Mustard","name":"Cornell Mustard","imageUrl":"/media/5830/SPKS2_PNGs_PANTRY_Cornell-Mustard.png","bio":"He's hot stuff!  Once you meet me, I'm un-spagettable! ","theName":"Pantry","theTeam":"","shopkinsBFF":"Fi Fi Flour & Olivia Oil","shopkinsHangout":"Pantry","favouriteHobby":"Shooting hoops with meatballs"},{"id":"Fi Fi Flour","name":"Fi Fi Flour","imageUrl":"/media/5784/SPKS2_PNGs_PANTRY_Fi-Fi-Flour.png","bio":"A little bit messy to be around but I'll help anyone in a sticky situation!","theName":"Pantry","theTeam":"","shopkinsBFF":"Fasta Pasta","shopkinsHangout":"Pantry","favouriteHobby":"Creating Half baked inventions"},{"id":"Honeeey","name":"Honeeey","imageUrl":"/media/5785/SPKS2_PNGs_PANTRY_Honeeey.png","bio":"She can Bee Charming, she can Bee Helpful but most of all she love to Bee Sweeeet!","theName":"Pantry","theTeam":"","shopkinsBFF":"Lee Tea","shopkinsHangout":"Pantry","favouriteHobby":"The spelling bee and catching flies"}],"R01-S01-T06":[{"id":"Leafy","name":"Leafy","imageUrl":"/media/5798/SPKS2_PNGs_CLEANING__LAUNDRY_Leafy.png","bio":"A girl who knows her roll in life! She always feels flushed with success!","theName":"Cleaning and Laundry","theTeam":"","shopkinsBFF":"  Peta Plunger","shopkinsHangout":"Cleaning and Laundry","favouriteHobby":"Unwinding with a good magazine"},{"id":"Molly Mops","name":"Molly Mops","imageUrl":"/media/5799/SPKS2_PNGs_CLEANING__LAUNDRY_Molly-Mops.png","bio":"Molly Mops is buckets of fun! She’s a real hard worker with a shiny personality. When it comes to finding a bargain, she loves to clean up! Just don’t walk over her wet floor or she may fly off her handle!! After a hard days work she loves to watch the Moppets on TV!","theName":"Cleaning and Laundry","theTeam":"","shopkinsBFF":"Sweeps","shopkinsHangout":" Always looking spotless in the Cleaning and Laundry Aisle.","favouriteHobby":"Playing Mopscotch"},{"id":"Squeaky Clean","name":"Squeaky Clean","imageUrl":"/media/5800/SPKS2_PNGs_CLEANING__LAUNDRY_Squeaky-Clean.png","bio":"Honest and clean-cut. She's in a 'Glass of her own'! Every morning she loves to 'Rise and Shine'","theName":"Cleaning and Laundry","theTeam":"","shopkinsBFF":"Dishy Liquid and Leafy","shopkinsHangout":"Cleaning and Laundry","favouriteHobby":"Writing poetry"},{"id":"Sweeps","name":"Sweeps","imageUrl":"/media/5822/SPKS2_PNGs_CLEANING__LAUNDRY_Sweeps.png","bio":"Don't just brush past Sweeps, she'll be your friend from 'Dust till Dawn'! She can handle it all!","theName":"Cleaning and Laundry","theTeam":"","shopkinsBFF":"Molly Mops","shopkinsHangout":"Cleaning and Laundry","favouriteHobby":"Brushing up on her schooling"},{"id":"Wendy Washer","name":"Wendy Washer","imageUrl":"/media/5823/SPKS2_PNGs_CLEANING__LAUNDRY_Wendy-Washer.png","bio":"A truthful shopkin, she lays it on the line! She's a clean-living type of girl!","theName":"Cleaning and Laundry","theTeam":"","shopkinsBFF":"Sizzles & Sarah Softener","shopkinsHangout":"Cleaning and Laundry","favouriteHobby":"Spin cycle classes at the gym"}],"R01-S01-T07":[{"id":"Betty Boot","name":"Betty Boot","imageUrl":"/media/5831/SPKS2_PNGs_SHOES_Betty-Boot.png","bio":"She gets her kicks riding high in the saddle. She's the wildest boot in the west!","theName":"Shoes","theTeam":"","shopkinsBFF":"Heels","shopkinsHangout":"Shoes","favouriteHobby":"Boot Scootin'"},{"id":"Bun Bun Slipper","name":"Bun Bun Slipper","imageUrl":"/media/5786/SPKS2_PNGs_SHOES_Bun-Bun-Slipper.png","bio":"A bit of a snoozy head who is always ready for bed. She'd better hop to it before she falls asleep!  ","theName":"Shoes","theTeam":"","shopkinsBFF":"Cute Boot","shopkinsHangout":"Shoes","favouriteHobby":"Getting ready for bed"},{"id":"Heels","name":"Heels","imageUrl":"/media/5832/SPKS2_PNGs_SHOES_Heels.png","bio":"Always a hard worker, Mary Jane Buckles down and gets on with it! She's no Shoe-off!","theName":"Shoes","theTeam":"","shopkinsBFF":"Betty Boot","shopkinsHangout":"Shoes","favouriteHobby":"Tap Dancing"},{"id":"Prommy","name":"Prommy","imageUrl":"/media/5787/SPKS2_PNGs_SHOES_Prommy.png","bio":"High spirited and never flat, she is known for her fabulous style sense.","theName":"Shoes","theTeam":"","shopkinsBFF":"Wendy Wedge","shopkinsHangout":"Shoes","favouriteHobby":"Kicking up her heels"},{"id":"Sneaky Wedge","name":"Sneaky Wedge","imageUrl":"/media/5788/SPKS2_PNGs_SHOES_Sneaky-Wedge.png","bio":"Watch out! Sneaky Wedge is about! She’s always running from store to store hunting for bargains. She’s footloose and fancy-free but gets a little tongue-tied now and then. But no sweat! She’s always a step ahead of the other Shopkins.","theName":"Shoes","theTeam":"","shopkinsBFF":"Sneaky Sue","shopkinsHangout":"Feeling sporty in the Shoe Shop. ","favouriteHobby":"Playing “Hide and Sneak”"}],"R01-S01-T08":[{"id":"Baby Puff","name":"Baby Puff","imageUrl":"/media/5835/SPKS2_PNGs_BABY_Baby-Puff.png","bio":"A sweet smelling shopkin who never makes rash decisions! She's so fit she never runs out of puff!","theName":"Baby","theTeam":"","shopkinsBFF":"Nappy Dee","shopkinsHangout":"Baby","favouriteHobby":"Finding shapes in the clouds"},{"id":"Baby Swipes","name":"Baby Swipes","imageUrl":"/media/5836/SPKS2_PNGs_BABY_Baby-Swipes.png","bio":"A real clean machine! She keeps things shiny from top to bottom!","theName":"Baby","theTeam":"","shopkinsBFF":"Shampoo Sue","shopkinsHangout":"Baby","favouriteHobby":"Swiping out in a wave pool"},{"id":"Dribbles","name":"Dribbles","imageUrl":"/media/5792/SPKS2_PNGs_BABY_Dribbles.png","bio":"She's like a little super hero! When she hears a cry for help this little squirt can save the day!","theName":"Baby","theTeam":"","shopkinsBFF":"Ga Ga Gourmet","shopkinsHangout":"Baby","favouriteHobby":"Taking nice warm baths"},{"id":"Dum Mee Mee","name":"Dum Mee Mee","imageUrl":"/media/5793/SPKS2_PNGs_BABY_Dum-Mee-Mee.png","bio":"Dum Mee Mee is a peacekeeper that was born to shop! She’s no dummy when it comes to stopping tears! The only cries she likes to hear are cries of joy when the sales begin! She’s a sucker for a bargain and a real sooth mover!","theName":"Baby","theTeam":"","shopkinsBFF":"Sippy Sips","shopkinsHangout":"Baby ","favouriteHobby":"Rocking out with babies."},{"id":"Sippy Sips","name":"Sippy Sips","imageUrl":"/media/5794/SPKS2_PNGs_BABY_Sippy-Sips.png","bio":"Never spills a secret and likes to be held tight! She always loves to be sealed with a kiss!","theName":"Baby","theTeam":"","shopkinsBFF":"Dum Mee Mee","shopkinsHangout":"Baby","favouriteHobby":"Singing Lullabies "}],"R01-S01-T09":[{"id":"Angie Ankle Boot","name":"Angie Ankle Boot","imageUrl":"/media/5777/SPKS2_PNGs_LIMITED_EDITION_Angie-Ankle-Boot.png","bio":"Practical yet sleek. Known for taking problems in her stride and never thinking she's too big for her boots!","theName":"Limited Edition","theTeam":"","shopkinsBFF":"Cute Boot","shopkinsHangout":"Limited Edition","favouriteHobby":"Disco Dancing"},{"id":"Donna Donut","name":"Donna Donut","imageUrl":"/media/5778/SPKS2_PNGs_LIMITED_EDITION_Donna-Donut.png","bio":"Everyday is a great day with Donna, but the best days are Fry-Days! ","theName":"Limited Edition","theTeam":"","shopkinsBFF":"D'Lish Donut","shopkinsHangout":"Limited Edition","favouriteHobby":"A hole lot of stuff!"},{"id":"Lee Tea","name":"Lee Tea","imageUrl":"/media/5779/SPKS2_PNGs_LIMITED_EDITION_Lee-Tea.png","bio":"Sometimes he seems a little weak, but gets stronger with time! Loves a dip in a hot tub!","theName":"Limited Edition","theTeam":"","shopkinsBFF":"Sugar Lump","shopkinsHangout":"Limited Edition","favouriteHobby":"Doing a little Jig"},{"id":"Lenny Lime","name":"Lenny Lime","imageUrl":"/media/5780/SPKS2_PNGs_LIMITED_EDITION_Lenny-Lime.png","bio":"Born to please with just a little squeeze! He may be little but never call him a Pip-Squeak!","theName":"Limited Edition","theTeam":"","shopkinsBFF":"Sour Lemon","shopkinsHangout":"Limited Edition","favouriteHobby":"Sipping on a soda!"},{"id":"Marsha Mellow","name":"Marsha Mellow","imageUrl":"/media/5781/SPKS2_PNGs_LIMITED_EDITION_Marsha-Mellow.png","bio":"A real softie who doesn't like the heat! She loves sleeping out under the stars. Sweet Dreams!","theName":"Limited Edition","theTeam":"","shopkinsBFF":"Choco Lava","shopkinsHangout":"Limited Edition","favouriteHobby":"Camping Out around the fire"},{"id":"Rub-a-Glove","name":"Rub-a-Glove","imageUrl":"/media/5782/SPKS2_PNGs_LIMITED_EDITION_Rub-a-Glove.png","bio":"You've really got to hand it to her, She's the Queen of Clean when it comes to dishing up sparkling plates!","theName":"Limited Edition","theTeam":"","shopkinsBFF":"Molly Mops","shopkinsHangout":"Limited Edition","favouriteHobby":"Water Sports"}],"R01-S02-T01":[{"id":"Apple Blossom","name":"Apple Blossom","imageUrl":"/media/1399/SPKS1_FRUIT-N-VEG_Apple-Blossom.png","bio":"An adventurer with big dreams and kind to the core","theName":"Fruit and Veg","theTeam":"This team hangs out in the fruit and vege department","shopkinsBFF":"I have lots!","shopkinsHangout":"Fruit and vege","favouriteHobby":"Going on adventures!"},{"id":"Strawberry Kiss","name":"Strawberry Kiss","imageUrl":"/media/1398/SPKS1_FRUIT-N-VEG_Strawberry-Kiss-.png","bio":"A day dreamer with a huge imagination and often away with the fairies","theName":"Fruit and Veg","theTeam":"This team hangs out in the fruit and vege department","shopkinsBFF":"Apple Blossom","shopkinsHangout":"The fruit section","favouriteHobby":"Writing poetry"},{"id":"Pineapple Crush","name":"Pineapple Crush","imageUrl":"/media/1396/SPKS1_FRUIT-N-VEG_Pineapple-Crush.png","bio":"Silly and fun and a lover of the sun!","theName":"Fruit and Veg","theTeam":"This team hangs out in the fruit and vege department","shopkinsBFF":"Melonie Pips","shopkinsHangout":"The fruit section","favouriteHobby":"Surfing and sunbaking"},{"id":"Miss Mushy Moo","name":"Miss Mushy-Moo","imageUrl":"/media/1400/SPKS1_FRUIT-N-VEG_Miss-Mushy.png","bio":"A bit of a softy but with a good head on my shoulders","theName":"Fruit and Veg","theTeam":"This team hangs out in the fruit and vege department","shopkinsBFF":"Rockin' Broc","shopkinsHangout":"Vege department","favouriteHobby":"Making mud pies"},{"id":"Posh Pear","name":"Posh Pear","imageUrl":"/media/1397/SPKS1_FRUIT-N-VEG_Posh-Pear.png","bio":"A bit spoilt but a good listener and friendly","theName":"Fruit and Veg","theTeam":"This team hangs out in the fruit and vege department","shopkinsBFF":"Lippy Lips","shopkinsHangout":"In the fruit and vege department!","favouriteHobby":"Playing cards"}],"R01-S02-T02":[{"id":"Tommy Ketchup","name":"Tommy Ketchup","imageUrl":"/media/1402/SPKS1_PANTRY_Tommy-Ketchup.png","bio":"Extremely cheeky and always wanting to be a part of everything!","theName":"Pantry","theTeam":"","shopkinsBFF":"Frank Furter","shopkinsHangout":"Pantry","favouriteHobby":"Trolley Riding"},{"id":"Peppe Pepper","name":"Peppe Pepper","imageUrl":"/media/1405/SPKS1_PANTRY_Peppe-Pepper.png","bio":"Always sneezing! Hehe no, probably clever and kind and a bit of a daredevil - I like to spice things up!","theName":"Pantry","theTeam":"","shopkinsBFF":"Sally Shakes","shopkinsHangout":"On the pantry shelf","favouriteHobby":"Shaking it on the dance floor!"},{"id":"Sally Shakes","name":"Sally Shakes  ","imageUrl":"/media/1406/SPKS1_PANTRY_Salty-Shakes.png","bio":"hmm I think they would say I add some fun and flavour to any party!","theName":"Pantry","theTeam":"","shopkinsBFF":"Peppe Pepper","shopkinsHangout":"On the pantry shelf","favouriteHobby":"Dancing the Cha Cha"},{"id":"Sugar Lump","name":"Sugar Lump","imageUrl":"/media/1401/SPKS1_PANTRY_Sugar-Lump.png","bio":"A real sweety who gets along with everyone and is easy to be around.","theName":"Pantry","theTeam":"","shopkinsBFF":"Wishes","shopkinsHangout":"On the pantry shelf","favouriteHobby":"Perfecting the ultimate cup of tea"},{"id":"Breaky Crunch","name":"Breaky Crunch","imageUrl":"/media/1403/SPKS1_PANTRY_Breaky-Crunch.png","bio":"Full of energy and ready to go at a moments notice, definitely a morning Shopkin!","theName":"Pantry","theTeam":"","shopkinsBFF":"Spilt Milk","shopkinsHangout":"In the cereal aisle!","favouriteHobby":"Working out"},{"id":"Gran Jam","name":"Gran Jam","imageUrl":"/media/1404/SPKS1_PANTRY_Gran-Jam.png","bio":"Caring, gentle and the mother of the group.","theName":"Pantry","theTeam":"","shopkinsBFF":"Papa Tomato","shopkinsHangout":"Pantry","favouriteHobby":"Knitting"}],"R01-S02-T03":[{"id":"Bread Head","name":"Bread Head","imageUrl":"/media/1409/SPKS1_BAKERY_Bread-Head.png","bio":"Hmm maybe independent and confident and a bit of a chatter box!","theName":"Bakery","theTeam":"","shopkinsBFF":"Kooky Cookie ","shopkinsHangout":"On the bakery stand mainly","favouriteHobby":"Chatting on the phone"},{"id":"Dlish Donut","name":"D'Lish Donut","imageUrl":"/media/1410/SPKS1_BAKERY_Dlish-Donut.png","bio":"Super sweet but with a  competitive edge. I'm always trying for the perfect hole in one!","theName":"Bakery","theTeam":"","shopkinsBFF":"Cheeky Chocolate","shopkinsHangout":"In the bakery section","favouriteHobby":"Playing golf and basketball"},{"id":"Mini Muffin","name":"Mini Muffin","imageUrl":"/media/1408/SPKS1_BAKERY_Mini-Muffin.png","bio":"Sweet inside and out with a lot of energy! Oh, and an early riser too!","theName":"Bakery","theTeam":"","shopkinsBFF":"Spilt Milk","shopkinsHangout":"In the bakery aisle","favouriteHobby":"Going to brunch"},{"id":"Kooky Cookie","name":"Kooky Cookie","imageUrl":"/media/1407/SPKS1_BAKERY_Kooky-Cookie.png","bio":"I think they would say I'm really shy and sensitive. They're always getting me to try new things!","theName":"Bakery","theTeam":"","shopkinsBFF":"Bread Head & Apple Blossom","shopkinsHangout":"On the bakery stand ","favouriteHobby":"Acrobatics like somersaulting and also reading"}],"R01-S02-T04":[{"id":"Bubbles","name":"Bubbles","imageUrl":"/media/1414/SPKS1_SWEET-TREATS_Bubbles.png","bio":"hmm they sometimes say I talk so much that I'm chewing their ears off haha! But I think they would also say I'm kind and caring. ","theName":"Sweet Treats","theTeam":"","shopkinsBFF":"Lolli Poppins","shopkinsHangout":"In the party food section","favouriteHobby":"Singing a tune for anyone who’ll listen! "},{"id":"Candy Kisses","name":"Candy Kisses","imageUrl":"/media/1415/SPKS1_SWEET-TREATS_Candy-Kisses.png","bio":"Romantic and a smooth - I haven't got a date yet buuutt I chalk it up to bad luck!","theName":"Sweet Treats","theTeam":"","shopkinsBFF":"Candi Cotton","shopkinsHangout":"In the sweet treats section","favouriteHobby":"Writing poetry"},{"id":"Le Quorice","name":"Le Quorice","imageUrl":"/media/1412/SPKS1_SWEET-TREATS_LeQuorice.png","bio":"I think they would call me old fashioned but I can still be the life of any party! ","theName":"Sweet Treats","theTeam":"","shopkinsBFF":"Mandy Candy","shopkinsHangout":"In the confectionary aisle","favouriteHobby":"Hopscotch"},{"id":"Cheeky Chocolate","name":"Cheeky Chocolate","imageUrl":"/media/1416/SPKS1_SWEET-TREATS_Cheeky-Chocolate.png","bio":"Well, definitely cheeky and a prankster! Always laughing and having fun and never afraid to get dirty.","theName":"Sweet Treats","theTeam":"","shopkinsBFF":"D'Lish Donut and Apple Blossom","shopkinsHangout":"In the sweet treats section","favouriteHobby":"Pranking!"},{"id":"Jelly B","name":"Jelly B","imageUrl":"/media/1411/SPKS1_SWEET-TREATS_Jelly-B.png","bio":"Full of beans with a colourful personality! ","theName":"Sweet Treats","theTeam":"","shopkinsBFF":"Candy Kisses","shopkinsHangout":"In the sweet treats section","favouriteHobby":"Skipping!"},{"id":"Lolli Poppins","name":"Lolli Poppins","imageUrl":"/media/1413/SPKS1_SWEET-TREATS_Lolli-Poppins.png","bio":"As sweet as can be! I love smiling and making Shopkins laugh!","theName":"Sweet Treats","theTeam":"","shopkinsBFF":"Candi Cotton","shopkinsHangout":"In the sweets section","favouriteHobby":"Hairdressing"}],"R01-S02-T05":[{"id":"Chee Zee","name":"Chee Zee","imageUrl":"/media/1420/SPKS1_DAIRY_Chee-Zee.png","bio":"A confident and passionate performer who loves taking centre stage and is a little bit crackers!","theName":"Dairy","theTeam":"","shopkinsBFF":"Cheezey-B and Freezy Peazy","shopkinsHangout":"In the dairy aisle","favouriteHobby":"Rapping with my BFFs"},{"id":"Swiss Miss","name":"Swiss Miss","imageUrl":"/media/1419/SPKS1_DAIRY_Swiss-Miss.png","bio":"A hilarious jokester (If they say my jokes are cheesy they're lying! ;) ","theName":"Dairy","theTeam":"","shopkinsBFF":"Tommy Ketchup","shopkinsHangout":"In the dairy case","favouriteHobby":"Stand up comedian "},{"id":"Spilt Milk","name":"Spilt Milk","imageUrl":"/media/1418/SPKS1_DAIRY_Spilt-Milk.png","bio":"A bit of a klutz and a born risk-taker, I like to stir things up!","theName":"Dairy","theTeam":"","shopkinsBFF":"Breaky Crunch","shopkinsHangout":"Dairy department","favouriteHobby":"Splashing about in the local pool"},{"id":"Googy","name":"Googy","imageUrl":"/media/1417/SPKS1_DAIRY_Googy.png","bio":"Clumsy and shy. They're always trying to get me to come out of my shell","theName":"Dairy","theTeam":"","shopkinsBFF":"Split Milk","shopkinsHangout":"Dairy department","favouriteHobby":"Juggling"}],"R01-S02-T06":[{"id":"Pretz Elle","name":"Pretz-elle","imageUrl":"/media/1427/SPKS1_PARTY-FOODS_Pretz-elle.png","bio":"A bit scatter-brained maybe! But also cheeky and charming.","theName":"Party Food","theTeam":"","shopkinsBFF":"Sally Shakes  ","shopkinsHangout":"In the party section!","favouriteHobby":"Gymnastics"},{"id":"Wobbles","name":"Wobbles","imageUrl":"/media/1424/SPKS1_PARTY-FOODS_Wobbles.png","bio":"A bit klutzy and a bit of a worry wart! But  once she starts jiggling on the dance floor, no Shopkins can stop her! ","theName":"Party Food","theTeam":"","shopkinsBFF":"Snow Crush","shopkinsHangout":"In the party section!","favouriteHobby":"Hip Hop Dancing"},{"id":"Wishes","name":"Wishes","imageUrl":"/media/1423/SPKS1_PARTY-FOODS_Wishes.png","bio":"A real party starter and a bit of an attention seeker!","theName":"Party Food","theTeam":"","shopkinsBFF":"Soda Pops","shopkinsHangout":"In the party aisle","favouriteHobby":"Singing a tune for anyone who’ll listen! "},{"id":"Fairy Crumbs","name":"Fairy Crumbs","imageUrl":"/media/1426/SPKS1_PARTY-FOODS_Fairy-Crumbs.png","bio":"Cute and colourful with a love for all things pink and purple!","theName":"Party Food","theTeam":"","shopkinsBFF":"Soda Pops","shopkinsHangout":"Party food aisle","favouriteHobby":"Parties!"},{"id":"Cheezey B","name":"Cheezey B","imageUrl":"/media/1425/SPKS1_PARTY-FOODS_Cheezy-B.png","bio":"A Shopkin who never stops rhyming! I love to rap, so let's all clap, take off your hat and dat is dat…ok not my best work hehe","theName":"Party Food","theTeam":"","shopkinsBFF":"Freezy Peazy and Chee Zee","shopkinsHangout":"Party food","favouriteHobby":"Rapping with my BFFs"},{"id":"Soda Pops","name":"Soda Pops","imageUrl":"/media/1422/SPKS1_PARTY-FOODS_Soda-Pops.png","bio":"Super bubbly and sweet! I add fizz to any party!","theName":"Party Food","theTeam":"","shopkinsBFF":"Rainbow Bite","shopkinsHangout":"Where-ever there's a party!","favouriteHobby":"Shaking it on the dance floor!"}],"R01-S02-T07":[{"id":"Scrubs","name":"Scrubs","imageUrl":"/media/1428/SPKS1_HEALTH-BEAUTY_Scrubs.png","bio":"Chatty and always grinning. I love to make people smile!","theName":"Health and Beauty","theTeam":"","shopkinsBFF":"Toofs","shopkinsHangout":"In the beauty section","favouriteHobby":"Tubing "},{"id":"Lippy Lips","name":"Lippy Lips","imageUrl":"/media/1431/SPKS1_HEALTH-BEAUTY_Lippy-Lips.png","bio":"A fashionista with sassy style and maybe a bit bossy!","theName":"Health and Beauty","theTeam":"","shopkinsBFF":"Apple Blossom and Polly Polish","shopkinsHangout":"Health and beauty section","favouriteHobby":"Shopping of course!"},{"id":"Shampy","name":"Shampy","imageUrl":"/media/1429/SPKS1_HEALTH-BEAUTY_Shampy.png","bio":"Err is that Silky or Shampy? We never know! Heeheehee","theName":"Health and Beauty","theTeam":"","shopkinsBFF":"Silky","shopkinsHangout":"In the Beauty Section","favouriteHobby":"Swimming"},{"id":"Silky","name":"Silky","imageUrl":"/media/1430/SPKS1_HEALTH-BEAUTY_Silky.png","bio":"Partners in crime with Shampy with a great sense of style","theName":"Health and Beauty","theTeam":"","shopkinsBFF":"Shampy","shopkinsHangout":"In the beauty section","favouriteHobby":"Swimming"},{"id":"Poly Poshish","name":"Polly Polish","imageUrl":"/media/1432/SPKS1_HEALTH-BEAUTY_Polly-Polish.png","bio":"A fashion risk-taker who's always trying new colours and styles","theName":"Health and Beauty","theTeam":"","shopkinsBFF":"Lippy Lips","shopkinsHangout":"In the beauty section","favouriteHobby":"Shopping of course!!"}],"R01-S02-T08":[{"id":"Ice Cream Dream","name":"Ice Cream Dream","imageUrl":"/media/1433/SPKS1_FROZEN_Ice-Cream.png","bio":"Scoops of fun but maybe a bit of a headache at times! Lol","theName":"Frozen","theTeam":"","shopkinsBFF":"Cheeky Chocolate","shopkinsHangout":"Frozen section","favouriteHobby":"Igloo building"},{"id":"Popsi Cool","name":"Popsi Cool","imageUrl":"/media/1434/SPKS1_FROZEN_Popsi-Cool.png","bio":"Cold on the outside but warm and gooey on the inside!","theName":"Frozen","theTeam":"","shopkinsBFF":"Cool Cube","shopkinsHangout":"The frozen food section","favouriteHobby":"Ice Skating"},{"id":"Yo Chi","name":"Yo Chi","imageUrl":"/media/1436/SPKS1_FROZEN_Yo-Chi-.png","bio":"Well cultured and different each day!","theName":"Frozen","theTeam":"","shopkinsBFF":"Melonie Pips","shopkinsHangout":"Frozen section","favouriteHobby":"Swirling around the dance floor"},{"id":"Cool Cube","name":"Cool Cube","imageUrl":"/media/1437/SPKS1_FROZEN_Cool-Cube.png","bio":"A bit of a snow bunny, who hates hot weather. Seriously.  ","theName":"Frozen","theTeam":"","shopkinsBFF":"Snow Crush","shopkinsHangout":"The frozen food section","favouriteHobby":"Snowboarding, skiing, sledding and ice-Skating"},{"id":"Snow Crush","name":"Snow Crush","imageUrl":"/media/1435/SPKS1_FROZEN_Snow-Crush.png","bio":"A snowkin builder extraordinaire!!","theName":"Frozen","theTeam":"","shopkinsBFF":"Popsi Cool","shopkinsHangout":"Frozen section","favouriteHobby":"Snowkin building and curling "},{"id":"Freezy Peazy","name":"Freezy Peazy","imageUrl":"/media/1438/SPKS1_FROZEN_Freezy-Peazy.png","bio":"Super cool and the best rapper in the pod. ","theName":"Frozen","theTeam":"","shopkinsBFF":"Cheezey-B and Chee Zee","shopkinsHangout":"The frozen food section","favouriteHobby":"Rapping with my BFFs"}]};
    _navList = {"Shopkins":{"Season 2":["Fruit and Veg","Homewares","Bakery","Sweet Treats","Pantry","Cleaning and Laundry","Shoes","Baby","Limited Edition"],"Season 1":["Fruit and Veg","Pantry","Bakery","Sweet Treats","Dairy","Party Food","Health and Beauty","Frozen"]}};
</script>

This looks like a duplicate of https://github.com/atom/atom/issues/979. Please follow that for updates.


Settings items glitch

https://aeternity-blockchain.atlassian.net/browse/SW-254
Bug report (Reporter: Piwo)
What device are you using Superhero Wallet with?
Other Linux based OS
What application are you using?
Chrome extension
What version of Superhero Wallet are you using?
v.1.0.0
What part of Superhero Wallet is causing an issue for you
Other_ UI
Please describe your problem in detail.
Menu Items are glitching, changes when hovering
Upload screenshots if possible
At what time did you experience this problem?
every time I use superhero wallet
Do you have other issues, suggestions or comments to improve Superhero Wallet?
(experiencing on arch linux, chrome, wayland)
Environment selector
Chrome
Linux

Closing this.