Giter VIP home page Giter VIP logo

frontend-v2's Introduction

⛔️ This app is now deprecated

We have launched a new UI for the Balancer protocol, which is available at https://balancer.fi. The source code for the new UI is available at https://github.com/balancer/frontend-v3.

Note, there is an exception where by the veBAL page is still available at https://app.balancer.fi/vebal. We will continue to maintain the veBAL page of this UI until we migrate that functionality to the new UI.

Development

To setup the development environment first clone the repo:

git clone https://github.com/balancer/frontend-v2.git && cd frontend-v2

Local env

Install dependencies:

npm install

Start the app:

npm run dev

The app should be live at http://localhost:8080

Testing

Run unit tests:

npm run test:unit

Run unit tests in watch mode:

npm run test:unit:watch

Run unit tests with coverage:

npm run test:unit:coverage

Run unit tests with only lcov coverage (useful when doing exploratory testing):

npm run test:unit:silent:coverage

Build

Run build:

npm run build

Preview build:

npm run preview

Run build in watch mode:

npm run build:watch

This mode is useful when you need to reproduce/fix bugs/issues in a production-like environment.

Docker

If you'd rather spin up the app in a docker container, first install dependencies to you local folder:

docker-compose build
docker-compose run --rm web npm i

and start the app:

docker-compose up

The app should be live at http://localhost:8080

If you are on Apple Silicon, try this:

export DOCKER_DEFAULT_PLATFORM=linux/amd64

source: https://stackoverflow.com/questions/65612411/forcing-docker-to-use-linux-amd64-platform-by-default-on-macos

One Click Deploys

The frontend can easily be deployed to any static host. Use the buttons below to spin up an instance. You will be prompted to provide your Infura Project ID, Alchemy Key, and Blocknative Dapp ID as these are required for the frontend to work correctly.

Deploy to DO

Deploy to Netlify

Deploy with Vercel

Vite setup

This app is powered by vite, which:

  • Runs a development dev server with esbuild.
  • Builds production bundle with Rollup.

Both tools above rely on native ES modules but our app also depends on libraries like ethers.js which use Node.js built-in modules (like Buffer, stream or crypto) that require browser polyfills. Thats why our vite.config.ts uses node-pollyfills and rollup-plugin-polyfill-node.

unplugin-vue magic 🪄

We use some Vite plugins to improve the Vue developer experience.

unplugin-vue-components:

Auto imports components located in src/components/_global so that they are available from every other component in the application (and from vitest). (It also auto generates a d.ts file for the auto imported components).

Analyze bundle

Analyze and visualize the bundle dependencies:

npm run build:analyze

frontend-v2's People

Contributors

acryptosx avatar agualis avatar alter-eggo avatar arb000r avatar bakamoto20 avatar balopco avatar bonustrack avatar danielmkm avatar daveai avatar dependabot[bot] avatar endymionjkb avatar evgenyboxer avatar garethfuller avatar github-actions[bot] avatar gtaschuk avatar johngrantuk avatar markusbkoch avatar matthews3301 avatar maxcoto avatar mendesfabio avatar mikemcdonald avatar pkattera avatar rabmarut avatar simeonkerkola avatar timjrobinson avatar tomafrench avatar tritium-vlk avatar xeonus avatar zekraken-bot avatar zen-maxi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

frontend-v2's Issues

Trading price doesn't update in price chart when switching buy/sell pair back and forth

Describe the bug
Trading price doesn't update in price chart when switching buy/sell pair back and forth

To Reproduce
Steps to reproduce the behavior:

  1. Go to trading page
  2. Load USDC/ETH pair
  3. Switch pair to ETH/USDC, price updates
  4. Switch pair back to USDC/ETH pair, price stays ETH/USDC unless you hover over the price line which updates the price

Expected behavior
The chart prices should reflect the buy/sell pair that is loaded without hovering on the price line

Screenshots

Screenshot 2021-11-17 163734

Include Staking button on the Invest confirmation screen

Currently, at the end of the Invest flow, we don't offer the option to Stake the LP tokens. Let's provide users with the option to do so.

Solution
At the Invest confirmation screen:

  • If the pool is eligible for LM incentives: Add a new button, Stake this to earn extra. This should dismiss the current modal and trigger the same pop-up modal that happens when hitting the 'Stake' button on the Pool page.
  • If the pool is not eligible for LM, keep the 'Return to pool page' secondary link as is.

Screen Shot 2022-03-24 at 9 32 00 PM

Auto load new pools upon scrolling to bottom of invest page

Describe the solution you'd like
Auto "load more" upon scrolling down to a certain point

However Tom French made this note: Probably not a great idea while we have the issue of pools rearranging as stuff loads tbh. Would be nice once that's fixed.

Decentralize Balancer Frontend V2

Is your feature request related to a problem? Please describe.
Did you deploy Balancer on IPFS? I see that you design the frontend that is hostable on IPFS but I don't find the workflow to deploy on it.

Describe the solution you'd like
If you are interested in decentralizing the frontend on IPFS, don't hesitate to leave a comment, I'm working on some topics of Crust Network project (decentralized IPFS pinning service) and trying to bring web3 to the real world.

I already deployed your frontend on IPFS, you could find here https://balancer.unstoppabledefi.org
Maybe you use the "Securing With Allowlists" feature on Infura so the content isn't loaded on my domain.

Github workflow to deploy Pancake on IPFS:

  1. Build the static web (that requires some modifications on the router and image paths of your source code)
  2. Deploy on Pinata (centralized IPFS pinning service)
  3. Deploy on Crust Network (decentralized IPFS pinning service)
  4. Modify DNS

Additional context
How does this feature benefit Balancer users?

Centralized frontend:

  • Could be stopped (by external and internal factors)
  • Limited bandwidth (pay to use bandwidth)

Hosting app on IPFS:

  • Unstoppable
  • Unlimited bandwidth, there are currently 200k IPFS nodes (reference: https://protocol.ai/ - creator of IPFS), Pancake frontend could ask these nodes to store partial data on their cache for a short time, the more traffic Pancake has, the faster the frontend is

Arbitrum, give users more detailed error message when they don't have enough ETH for tx

Describe the bug
on Arbitrum, if you don't have enough eth for a transaction you get a generic JSON-RPC error (see screenshot)

To Reproduce
Steps to reproduce the behavior:

  1. Create ETH/USDC trade where you don't leave enough ETH to pay for tx
  2. Click preview trade
  3. Click confirm, generic error message shown

Expected behavior
Error message displayed calls out the fact you don't have enough ETH to pay for tx, "insufficient balance for transfer"

Screenshots
image

Hardcode the list of pools/gauges that user can stake

Describe the bug
Anyone can create a gauge. I just created a gauge for the 80/20 pool and now the UI shows a call to action for me to stake that pool's token.
image
The frontend should have a list of pre-approved gauges so we're not inviting users to stake for nothing

Other Network claim button links look incorrect

Describe the bug
It looks like the 'Incentives on other network' buttons link to '/claims' instead of '/claim'.

To Reproduce
Steps to reproduce the behavior:

  1. Go to Claims page
  2. Click on one of the claim buttons under the 'Incentives on other Networks' section.

Expected behavior
For each network to link to the '/claim' route.

Screenshots

Screen Shot 2022-03-22 at 11 20 09 PM

'Add' buttons in the My veBAL stats section is missing when user has zero balances

Describe the bug
The blue circular 'Add' buttons are currently not displaying if the user doesn't have any balances in the My 80BAL-20WETH or My locked 80BAL-20WETH containers.

To Reproduce
Steps to reproduce the behavior:

  1. Go to the Vote+Vest page with an empty wallet
  2. View the stats section.

Expected behavior
My 80BAL-20WETH and My locked 80BAL-20WETH containers should always have a + button which the user can click to get those LP tokens.

Current behavior

Screen Shot 2022-03-23 at 11 45 29 PM

Expected behavior when user has a zero balance

Screen Shot 2022-03-24 at 12 10 12 AM

Buttons text is scrambled / wrapped over itself

Describe the bug
The 'Other Network' buttons have scrambled text on smaller screen sizes. Note, it's also happening in the header on the 'Connect' button where the icon has disappeared.

To Reproduce
Steps to reproduce the behavior:

  1. Go to the Claim page.
  2. Scroll down to the 'Incentives on other networks' section.
  3. See the network buttons

Expected behavior
Normal unwrapped text

Screenshots

Screen Shot 2022-03-22 at 11 14 11 PM

Smartphone (please complete the following information):

  • Device: iPhone 13

When closing the 'Invest' flow, the user should be taken back to where they came from

Describe the bug
Right now, if a user goes from the veBAL page and hits the plus button to add liquidity to 80BAL/20WETH, and then close using the 'x' button, they are taken to the pool page. When closing the 'Invest' flow, the user should be taken back to where they came from. In this case, they should be returned back to the veBAL page.

See screen recording.

https://www.loom.com/share/a13ebc8b39f8430397112bf2108773f0

To Reproduce
Steps to reproduce the behavior:

  1. Go to veBAL
  2. Click on plus button to add liquidity.
  3. Hit the 'x' button

Expected behavior
User should be returned to where they came from.

Value of investment in unstaked table is incorrect

Describe the bug
Value of investment in unstaked table is incorrect, it seems to include the staked value as well. See screenshots.

To Reproduce
Steps to reproduce the behavior:

  1. Invest in a pool
  2. Stake it
  3. Invest again
  4. Don't stake it and see issue with values.

Expected behavior
My balance values in unstaked table is just the value of the unstaked investment.

Screenshots

Screenshot 2022-03-25 at 15 29 14

Screenshot 2022-03-25 at 15 29 22

L2 Staking incentives UI on Pool Page

Is your feature request related to a problem? Please describe.

I understand that there is initially no 'staking' on L2s. Anyone who is in an eligible pool will receive LM incentives (without having to stake). Therefore, we need to change the UI slightly.

Spec

  1. Let's change the label from 'Staking incentives' to 'Liquidity mining incentives' across the board, for L1's and L2s.

  2. If an L2 pool is eligible for LM incentives:

Screen Shot 2022-03-27 at 9 01 29 PM

Text:

Liquidity mining incentives

People who invest in this pool receive liquidity mining incentives. Unlike on Ethereum Mainnet, no staking is required for eligible pools on [Polygon*].
  • Ideally use the network that the user is on here.

Get LP Tokens link not working

Describe the bug
When clicking stake/unstake on a pool page (e.g. /#/pool/0x647c1fd457b95b75d0972ff08fe01d7d7bda05df000200000000000000000001) there is a link at the bottom of the modal saying "Get LP tokens: B-50WBTC-50WETH". Clicking on this link does nothing. You can right click and open in a new tab and it works, but single normal clicking doesn't work.

2022-03-25-142300_541x471_scrot

Lock preview modal immediately closes on `CREATE_LOCK` success

Describe the bug
On tx confirmation of a lock creation the preview modal immediately closes. It should stay open with fireworks and link to etherscan. Weirdly, this doesn't happen for other lock types like extensions or increasing the amount.

To Reproduce
Steps to reproduce the behavior:

  1. Go to lock page with no existing lock
  2. Proceed to create a lock
  3. Notice the modal close abruptly on success
  4. Then, try going through the flow of adding more to that lock
  5. Notice that the modal stays open as it should

Expected behavior
On lock creation success modal should stay open.

Stakable pool showing in both tables

Describe the bug
Maybe I'm looking at old designs, but IIUC in this case the BAL/USDC/WBTC pool should only be displayed in the My V2 Investments table with the stake button next to it, no?
image

Enhanced language around slippage when adding to pools

Describe the solution you'd like
Highlight if a user will receive a bonus depositing a particular token to a pool that is misweighted

MikeB's comments: I think there some improvements to be made in terms of how the UI demonstrates 'slippage' for stablepools. In most other stableswap platforms, there is an indication of whether the token you are depositing will result in a "bonus" while there is no such thing on balancer. its leading to misundertandings like this

Additional context
unknown

Cannot trade back to back swaps without refresh

Describe the bug
When making back to back swaps you have to refresh the screen otherwise the preview screen won't let you confirm the trade. button is not clickable and says "confirming..."

To Reproduce
Steps to reproduce the behavior:

  1. set up a trade for two tokens
  2. click preview trade
  3. click confirm trade
  4. confirm trade in MM
  5. click back to trading screen
  6. set up two other tokens to trade (can be the same as well)
  7. click preview trade
  8. issue: cannot click confirm trade

Expected behavior
would expect to be able to click confirm trade again without either refreshing or waiting for the first trade to be confirmed on chain

Screenshots
this is the preview screen for the 2nd swap
image

Desktop (please complete the following information):

  • OS: Windows 10
  • Browser: Firefox, Chrome

Error when trading V1 pool

Describe the bug
user facing error message when trying to trade through a V1 pool

To Reproduce
Steps to reproduce the behavior:

  1. Go to trade tab
  2. unselect gasless toggle
  3. trade WETH to METRIC

cannot estimate gas error message shown in screenshot

Expected behavior
No error message when confirming trade

Screenshots
image

My investments list should show stake column

Describe the bug
It looks like the table column conditions are mixed up. The 'My V2 Investments' table has no 'Stake' column which it should if any of the pools are stakeable.

To Reproduce
Steps to reproduce the behavior:

  1. Go to home page
  2. Connect wallet
  3. View My V2 Investments table
  4. See that it doesn't have a Stake column

Expected behavior
The My V2 Investments table should show you which of your investments you can stake.

Screenshots
Screenshot 2022-03-18 at 10 33 23

Remove pool from 'investment pool' if you are invested in the pool

Is your feature request related to a problem? Please describe.
A few users would like to see a pool they are invested in removed from the 'investment pools' section. otherwise there is a duplication of pools on the investment page

Describe the solution you'd like
Once a user has invested in a pool it will be removed from the 'investment pool' list; if they fully withdraw from a pool it will be added back to the 'investment pool' list

Trading Graph shows NaN %

Describe the bug
The trading graph for wmatic/matic will sometimes show NaN%

To Reproduce
Steps to reproduce the behavior:

  1. Go to trading on polyogn
  2. load Wmatic/Matic pair
  3. Hover over trading graph until you see NaN%

Expected behavior
Assuming you would just show zero instead of NaN%

Screenshots
image

Feat: show incentive breakdown by pool

Describe the solution you'd like
Users have recently brought up a few times they would like to see where their BAL rewards come from in terms of the different pools. This may be something that Xeonus can tackle with his community website.

Shouldn't show stake/migrate button in Investment pools list

Describe the bug
A stake button is currently shown in the Investment pools list when it shouldn't be. This list should be seen as a pool explorer and has nothing to do with the user's investments. There is no guarantee that the user is invested in any of these pools.

To Reproduce
Steps to reproduce the behavior:

  1. Go to the home page
  2. Connect wallet
  3. Scroll to the Investment pools table
  4. See stake/migrate column.

Expected behavior
The stake & migrate column should not be shown in the 'Investment pools' list.

Screenshots
Screenshot 2022-03-18 at 10 22 50

Fix typo and formatting in the gauge voting screen

There's currently a typo here and the warning container doesn't stretch full width:

Screen Shot 2022-03-24 at 12 15 51 AM

1. Text
Let's update the full text to be:

You need some veBAL to vote on gauges
Get veBAL by locking up LP tokens from the 80% BAL / 20% WETH pool.

2. Formatting

Add w-full rounded to the bal-alert div.

Screen Shot 2022-03-24 at 12 19 17 AM

This should get to:

Screen Shot 2022-03-24 at 12 25 36 AM

Switch Network message displayed when wallet is disconnected

Describe the bug
"Please switch to Ethereum Mainnet" banner with nonfunctional "Switch Network" button is displayed when an account is disconnected in Metamask wallet.

To Reproduce
Steps to reproduce the behavior:

  1. Go to https://app.balancer.fi/#/ and connect a MetaMask wallet
  2. Upon being connected, in MetaMask, click on the "Connected" status, then click on the triple dot icon beside active account.
  3. Disconnect the account.
  4. The banner/message is then incorrectly displayed on the site.

Expected behavior
The banner should not appear, as the wallet is disconnected. Switch network message should only appear when a wallet is connected and not on Ethereum Mainnet.

Screenshots
image
image
image

Desktop:

  • OS: Windows 11
  • Browser: Chrome
  • Version 99.0.4844.51 (Official Build) (64-bit)

QUESTION - Facing issue while integrating balancer-v2 frontend with balancer v1 contracts and subgraph

Hello, I'm trying to integrate balancer-v2 frontend with balancer v1 contracts and subgraph. During swaps, I'm facing issue when swaping between 2 token but getting error Not enough liquidity even if liquidity is present. With more digging in dependency code, got to know that SOR package is returning swaps value as 0(default) and it seems even if pools got fetched properly, it is considering pools empty. Any suggestion would be helpful to solve.

gas-less Swap USDT for ETH - ERROR

Describe the bug

Swapping 500 USDT for ETH results in ERROR

To Reproduce

  1. Set Relayer Approval
  2. Approve USDT spend limit (15000 USDT)
  3. swap gas-less 500 USDT for ETH

result : ERROR message with no reason

sellToken: 0xdac17f958d2ee523a2206206994597c13d831ec7
buyToken: 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
receiver: 0xc64ab................08bd68daed59ee
sellAmount: 435132232
buyAmount: 98260536789694117
validTo: 1637044266
appData: 0xe9f29ae547955463ed535162aefee525d8d309571a2b18bc26086c8c35d781eb
feeAmount: 64867768
kind: sell
partiallyFillable: false
sellTokenBalance: external
buyTokenBalance: erc20

Firefox console

Unknown reason for bad order submission Request body deserialize error: invalid type: map, expected a u256 encoded as a decimal encoded string at line 1 column 672 instrument.js:109:45
    m instrument.js:109
    getErrorMessage OperatorError.ts:93
    getErrorFromStatusCode OperatorError.ts:113
    sendSignedOrder gnosisProtocol.service.ts:63

Expected behavior
should receive ~ 0.1 ETH

Screenshots

image

image

Treatment of 80BAL/20WETH in My Investments

The 80BAL/20WETH pool cannot be staked. It can only be locked. This has some implications for the way it is displayed in the 'My Investments' section of the Invest page (or future Portfolio page):

  • The 80BAL/20WETH pool can only appear in the unstaked table.
  • A new CTA should be added to 'Lock' for the 80BAL/20WETH pool. This would apply if the lockable amount is greater than 0%.
  • If it is locked 100%, replace the 'Lock' CTA with the text 'locked'.

Example of an unlocked investment in 80BAL/20WETH pool:

Screen Shot 2022-03-23 at 11 28 38 PM

Example of an locked investment in 80BAL/20WETH pool:

Screen Shot 2022-03-23 at 11 28 56 PM

Invest table disappearing

Describe the bug
When entering 1 trillion DAI into the stable 3 pool invest table, the table disappears. I understand 1 trillion is unrealistic, but i think it has something to do with the price impact going over 100%

To Reproduce
Steps to reproduce the behavior:

  1. go to stable 3 pool on mainnet
  2. enter 1 trillion into DAI
  3. invest page disappears

Expected behavior
invest table doesn't disappear

Screenshots

before entering another zero
image

after
image

Desktop (please complete the following information):

  • Browser: Firefox

Mobile sidebar navigation is not working for primary nav items

Describe the bug
In the new mobile sidebar, tapping the primary nav options (Invest, Trade, veBAL and Claim), changes the page behind the lightbox, but the lightbox remains visible and is not dismissed.

To Reproduce
Steps to reproduce the behavior:

  1. Open the mobile hamburger nav
  2. Click on Invest / Trade / veBAL / Claim

Expected behavior
The sidebar should animate out, and the new page should be revealed.

Seeing this on mobile and desktop.

Input currency rounds up when output currency has fewer decimals causing insufficient balance when max button is pressed

Describe the bug
When the input token has more decimals than the output token, the input token gets rounded up instead of the output token getting rounded down which makes the "max" button nonfunctional since it rounds up--giving you an insufficient balance error.

To Reproduce
Go to the trading screen for Arbitrum and set the input as NDX and output as USDC.
Set 100.366613 NDX tokens as the input
100.366613 will get rounded up to 100.367 to account for the fewer decimals for the USDC token.
If you only had 100.366613 ndx in your account and hit the max button, because its rounding up, you would be unable to trade due to insufficient balance.

Update "My votes" when txn goes through

Describe the bug
After a vote txn goes through the UI table should auto-refresh to show the user's vote

To Reproduce
Vote on a gauge

Expected behavior
As soon as the UI detects the txn has been included in a block, "My votes" should reflect the new state

Screenshots
image

mismatch in veBAL on locking screens

mismatch in the veBAL acquired, popup says 0.0076 before locking and then directly after the main screens show 0.0086. is this due to the rounding since it isn't Thursday at 00:00 UTC when i locked?

Screen Shot 2022-03-24 at 10 58 21 PM

Screen Shot 2022-03-24 at 10 59 36 PM

Gnosis trade error message

Describe the bug
User tried to perform a USDC-KNX trade and received an error in the confirm screen

To Reproduce
Steps to reproduce the behavior:

  1. Go to trade screen
  2. Make sure trade gasless trade is selected
  3. swap 1620 USDC to KNX
  4. error message displayed: invalid BigNumber message appeared, however it was fixed upon refresh

Expected behavior
No error message and user can confirm trade

Screenshots
image

Error unwrapping ETH on Kovan

Describe the bug
I get the following error when trying to unwrap ETH on Kovan.

Screen Shot 2022-03-27 at 8 56 04 PM

Screen Shot 2022-03-27 at 8 57 30 PM

To Reproduce
Go to Trade interface on Kovan and try to convert from WETH to ETH

Expected behavior
Successful trade.

Desktop (please complete the following information):
Mac. Chrome. 99.0.4844.83

Next period votes is 0% for a gauge I've voted for

Describe the bug

On the veBAL gauge voting page it just ticked over to a new period, and now all the votes for next period say 0%. This is coming from the value gauge_relative_weight on the smart contract. Shouldn't users votes continue to go towards the gauge they chose until their vote lock runs out?

My account (0xDb4ff41B4C1222c2b1869A67Be115070688989a2) has some veBAL locked for 1 year and 80% of votes towards gauge 0xf34D5E5715CC6CC9493f5bD252185E8acdc1De0d (the last one in the table) but it shows 0% vote weight for next period.

Sort 'my investments' by 'my balance' in descending order

Is your feature request related to a problem? Please describe.
A few users have requested to have their portfolio section ordered in descending order by their investment size rather than using pool size to drive the ordering

Describe the solution you'd like
loading of the investments page will result in 'my investments' being sorted by 'my balance' in descending order

Additional context
image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.