Giter VIP home page Giter VIP logo

reearth-visualizer's People

Contributors

aidatorajiro avatar airslice avatar akiyatomohiro avatar atnagata avatar awakot avatar ed0424 avatar hideba avatar int-tt avatar isoppp avatar issmail-basel avatar jashanbhullar avatar kawaite avatar keisukeyamashita avatar keiya01 avatar lavalse avatar m-abe-dev avatar mimoham24 avatar mkumbobeaty avatar nina992 avatar nourbalaha avatar orisano avatar pyshx avatar renovate[bot] avatar rot1024 avatar tomoyane avatar yk-eukarya avatar yu1hpa avatar yuuri111 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  avatar  avatar  avatar  avatar  avatar  avatar

reearth-visualizer's Issues

Pre-commit formatter seems to be broken

Describe the bug
The pre-commit formatter seems not working.
Because of that, unnecessary changes are detected.

Additional context
Todo:

  • Investigate if the formatted works or not
  • If not, fix it
  • If yes, list up other possibilities which cause this problem

Export a scene as a set of HTML/CSS/JS

User story

Users want to export the scene as a set of HTML/CSS/JS (we can see the archive with self-hosting), that is why users can host their own archives even if app.reearth.io does no longer live.

Acceptance criteria

  • Can export without collapse
  • If you deploy exported files, the site works

Completion condition

  • All PRs were passed CI, code-reviewed, and merged
  • Tested on staging env
  • A demonstration was held

Note

Update dataset setting page

image

πŸ‘† still using the old style, which is ok, but just a little different from other page and the whole design system.
If can update like πŸ‘‡ will be much better.

image
File is here


And also need to think about in this page, the add dataset button can only support uploading file from local, should we also need to support uploading data from Google spread sheet ?

Cannot import shapefiles properly

Describe the bug
When the user wants to import shapefile as a layer, it fails.

To Reproduce
Steps to reproduce the behavior:

  1. Go to scene editor page
  2. Open outline pane
  3. Click add layer
  4. Import shapefile
  5. It doesn't import well

Expected behavior
The shapefile zip file should be imported properly.

Screenshots
If applicable, add screenshots to help explain your problem.

Notify users how long before the data has been saved on UI

User story

Re: Earth is basically auto-save, but it doesn't know if the current operation is saved or not.
By implementing the feedback from the service "Autosaved OO seconds ago", you can know how far you are currently saved and edit with confidence.

Auth0 redirect URL is incorrect when users log in from a page other than the top page

Describe the bug
Auth0 returns an error because the top page is only allowed as redirection URL.

src/auth/hooks.ts

login: () =>
      loginWithRedirect({
        redirectUri: `${window.location.pathname === "/" ? "" : window.location.pathname}${
          window.location.search
        }`,
      }),

should be

login: () =>
      loginWithRedirect({
        redirect_uri: window.location.origin,
      }),

Storytelling collapse when the layer is deleted

Describe the bug
When the layer that is registered as the storytelling story is deleted, it remains as the story though it doesn't exist on the digital Earth.

To Reproduce
Steps to reproduce the behavior:

  1. add a couple of layers to the earth
  2. activate storytelling
  3. add them to the storytelling list
  4. delete a layer from the outline window
  5. play with storytelling
  6. storytelling will collapse since there isn't the layer which storytelling expects to have

11/10/2021 KaWaite

  • Seems storytelling's property references the Layers (stories), which on Layer deletion of course doesn't search through all widgets that might reference that Layer and delete references to it. Either do a sweep (probably not a good solution) or create a warning before Layer deletion.

Some uploaded images aren't shown on asset modal

Describe the bug
The assets which had been uploaded from the asset modal are not shown there.

To Reproduce
Steps to reproduce the behavior:

  1. Open asset modal
  2. Upload image(The number of total image should be more than 10)
  3. You won't see images you've just uploaded there
  4. Go to settings page, asset section
  5. The images are there(Image can be uploaded, but not fetched on front-end)

Expected behavior
All uploaded images should be shown.

Theme: enable to set theme for the scene

Leader

@issmail-basel

User story

Users want a consistent design for the published project. Now, most of the component's colors can be changed but some of them are not. Users want to define the basic theme which is used for all components on the scene. With this feature, users don't need to care about the consistency of the design.

Requirements

  • There are 5 preset themes for published page
  • This theme would be used as a base theme for the entire project
  • This theme is not affected by UI theme
  • Theme can be passed to plugins widget
  • write document
    • Front-end
    • Back-end

The design link

here

Acceptance criteria

  • design approved
  • develop front-end and back-end

Testing list

  • Editor
    • Add storytelling widget, Infobox, and menu widget
      • Default dark theme is selected
      • Change theme to predefined (forest/light) themes
      • Choose custom theme
    • Return to the dashboard and re-open the project, previously selected scene them should appear
  • Preview page
    • Predefined theme (Same as Figma)
      • Check storytelling color
      • Check menu colors
      • Check info box colors
    • Custom colors (Same as user preferences and Figma rules)
      • Check storytelling color
      • Check menu colors
      • Check info box colors
  • Published page
    • Predefined theme (Same as Figma)
      • Check storytelling color
      • Check menu colors
      • Check info box colors
    • Custom colors (Same as user preferences and Figma rules)
      • Check storytelling color
      • Check menu colors
      • Check info box colors

design: Align System Editor

UI for when editing plugin alignments.
Needs:

  • Have inner and outer grids( refer to Whiteboard in Figma)
  • be toggle-able
  • User can drag into grid areas, then drag to re-order
  • Editor mode must show real alignment but allow user to easily access all grid areas.

Uploaded images do not show in local environment

Describe the bug
After uploading an image into the assets, the image cannot be shown. All data for each asset is received, but URL is not accessible.

To Reproduce
Steps to reproduce the behavior:

  1. Upload image from asset modal or asset settings page.
  2. See blank asset card.
  3. Try using image asset.
  4. See that it can't be used for icons/photo overlays/etc.

Expected behavior
Once an image asset is uploaded, it should be viewable in the asset modal and asset settings page. It should also be displayed where it is used in the project.

Screenshots
image

Optimize assets

  • Current asset modal loads full size images
  • With many assets, modal becomes too heavy and slows down

Options:

  • infinite scroll (convert to frontend task)
  • compression
  • size limit (convert to frontend task)
  • create thumbnail on asset upload

Widget align system

Leader

@KaWaite

γƒ¦γƒΌγ‚ΆγƒΌγ‚ΉγƒˆγƒΌγƒͺγƒΌ / User story

Users want to align multiple widgets to screens. Now where the widgets can be placed are left-top, left-bottom, right-top and right-bottom. After the plugins feature has been released, users might want to use them developed by external developers. Plugins developers can't expect where theirs will be placed and might conflict with others. Users want us to support a widget alignment system that allows them to align plugins well automatically.

Requirements

  • Can support these alignments

γ‚Ήγ‚―γƒͺγƒΌγƒ³γ‚·γƒ§γƒƒγƒˆ 2021-04-28 13 35 12

  • When the user moves the widget to a droppable area, it should collapse or expand automatically.
  • Can align multiple same kinds of widget
  • Droppable area has the option to choose how to align(left, center, right, etc) the widget which is inside of it.

Examples

Image (ToolStrip of Windows Form):

image

Acceptance criteria

  • write document
    • Front-end
    • Back-end

Completion condition

  • All PRs were passed CI, code-reviewed, and merged
  • Tested on staging env
  • Released in the production env
  • A demonstration was held

Not all text updates on language change

Describe the bug
When changing the language in account setting page, most text in the app will change except for the Scene and Widgets property panel (right panel).

Expected behavior
Users should be allowed to add multiple custom domains

Screenshots
image

MIGHT be related to #112

[BE] add mongo tests

Implement unit tests in internal/infrastructure/mongo

Refer to reearth/reearth-backend#139 to learn about how to write tests for mongo.

  • asset.go (WIP: reearth/reearth-backend#139)
  • auth_request.go
  • dataset.go
  • dataset_schema.go
  • layer.go
  • lock.go
  • plugin.go
  • project.go (WIP: in test/project_repo_layer branch)
  • property.go
  • property_schema.go
  • scene.go
  • scene_lock.go
  • tag.go
  • team.go
  • user.go
  • transaction.go (you can ignore)

Sphere is added on the same place

Describe the bug
When the sphere is added to the earth, sometimes it's added to the same location.

To Reproduce
Steps to reproduce the behavior:

  1. add sphere from the toolbar
  2. with selecting the sphere which has been added, add another sphere
  3. the location of the second one will be the same as the first one although it's been dropped different location.

Expected behavior
Adding a new sphere should always be shown where it is dropped.

Prepare for OSS release

  • Created a repository in the reearth organization (still private, no code up yet)
  • Add backend functionality: frontend file distribution functionality for all-in-one (additional functionality, so work on SaaS side)
  • OSS backend: remove domain authentication (verifyDomain in GQL, domain in project type, etc.) (try as much as possible to avoid conflicts, put together as initial commit)
  • OSS frontend: remove UI for domain authentication (make it an initial commit in the repository, try to avoid conflicts)
  • SaaS: set up upstream, merge, and check operation
  • Create all-in-one repository, create Dockerfile, test.
  • Configure each repository CICD
  • First version release (automate release process with Action, automatically generate release text)
  • Check code and publish repository

Writing READMEs and other documentation is outside the scope of this issue.

It would be great if we could create a mechanism for the SaaS side to automatically create a PR to be merged when a new OSS release is available.

The ability to authenticate without Auth0 will also be needed soon, but is a separate issue.

Switch view mode

User story

Mapping on the current location map is the base, but by making these views switchable, such as in article mode, the range of expression can be expanded, and data for which location information is not important can be handled more easily.

Property Migration

Leader

@rot1024

Plug-ins can change their property schemas when they are updated. When you update a plugin, you can change the structure of existing properties to match the new schema, and you can also change the Without it, data would be lost, but that feature is not currently fully implemented.

Acceptance criteria

Should be Newly install Upgrade to the same version Upgrade to the diff version Uninstall
Layers / Widgets / Blocks - If the extension is deleted, they should be deleted Plugin field should be replaced / If the extension is deleted, they should be deleted Should be deleted
Property - Should be migrated (plugin field should be replaced) / If the extension is deleted, they should be deleted Should be migrated (plugin field should be replaced) / If the extension is deleted, they should be deleted Should be deleted
Property schemas Should be saved If the extension is deleted, they should be deleted. Otherwise they should be recreated and saved. / If the plugin is scene-specific, the previous property schemas should be deleted If the extension is deleted, they should be deleted. Otherwise they should be recreated and saved. / If the plugin is scene-specific, the previous property schemas should be deleted Should be deleted
Plugin Should be saved Should be recreated and saved / If the plugin is scene-specific, the previous plugin should be deleted Should be recreated and saved / If the plugin is scene-specific, the previous plugin should be deleted Should be deleted

Completion condition

  • All PRs were pass CI, code-reviewed and merged
  • Tested on staging env
  • Released in the production env
  • A demonstration was held

Install Plugin to the app

Description

There are two "installation" of plugins.

  1. Installing plugin to app - only required in the first time for each plugin. Note that it is treated as different plugin even if only version is different
  2. Installing plugin to scene

1. Installing plugin to app

  1. Fetch archive data from GitHub
    • URL is https://github.com/OWNER_NAME/REPOSTIROY_NAME/archive/BRANCH_NAME.zip but OWNER_NAME, REPOSTIROY_NAME and BRANCH_NAME will be changed for each plugin.
    • You can impl the logic in internal/infrastructure/github
  2. Extract and find reearth.json file (there is partial impl in internal/infrastructure/npm)
    • You can impl the logic in internal/infrastructure/github
  3. Parse it with pkg/plugin/manifest and you'll get plugin.Plugin struct and some property.Schema structs. If no error, you can save them (plugin and property schemas).
    • You can impl the logic in pkg/scene/sceneops (e.g. PluginInstaller)
  • PluginMetadata: created
  • PluginInstaller
    • Accept any gateway.PluginRepository in constructor
    • func Install(PluginMetadata) (manifest.Manifest, error)
  • internal/infrastructure/github

2. Installing plugin to scene

You can implement the following in usecase layer.

  1. Load the scene
  2. Add a new plugin to scene.PluginSystem
  3. If the same plugin is already installed, an error should be occurred.

Fix infobox title color

Describe the bug
Infobox's title color cannot be changed.

To Reproduce
Steps to reproduce the behavior:

  1. Create infobox
  2. Change the text color of the infobox
  3. Text color should be changed
  4. You'll see that only the infobox's title color isn't changed

Members section shown in personal workspace

Describe the bug
Even the personal workspace settings page shows the member section (even though personal workspaces can't have multiple users).

To Reproduce
Steps to reproduce the behavior:

  1. Go to the Settings.
  2. Click on the workspace list tab.
  3. Select your personal workspace (it will auto redirect to the workspace's settings page).

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
image

Dataset modal doesn't reset after close

Describe the bug
Whether the dataset modal is closed by clicking away, the cancel button, the X button, or after adding the dataset, if you open the modal again it still shows the currently selected dataset.

Expected behavior
If the dataset modal is closed, when it is opened again it should open from the method select page.

Screenshots
image

Tagging system

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

Describe the solution you'd like
A clear and concise description of what you want to happen.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

front-end plugins feature

Leader

@HideBa

Currently, the system is designed to run each function as a plug-in, but it is not possible to install and use external plug-ins. By enabling the use of external plug-ins, it will be possible to proceed with development using resources other than internal resources, and users will be able to use more functions.

  • Users can see a list of installable plug-ins.
  • Users can install, update, and uninstall installable plugins.
  • Developers can upload and use plugins that they are developing.
  • You can install them by entering the GitHub link.
  • Re:Earth automatically resolves inconsistencies caused by differences between the version of Re:Earth and the version of external plug-ins, allowing users to use plug-ins without worrying about version differences.
  • Developers can include their plug-ins in the list by submitting a PR to have them included.
  • Developers can publish the front-end part of their plug-ins so that Re:Earth can load it and run it as a Sandbox.

Tasks

  • Write document
  • Front-end
  • Back-end

Completion condition

  • All PRs were passed CI, code-reviewed, and merged
  • Tested on staging env
  • Released in the production env
  • A demonstration was held

Prohibit to upload the same name assets

User Story

Now users can upload any image though some are the same.
If there is an image whose name is the same as the one user is about to upload, the user wants to replace the old with a new one.

Plugin align system backend

  • Design domain models
  • Implement domain logic
  • Implement Usecases
  • Implement GraphQL
  • Implement Mongodoc
  • Migrations (scene and plugin)

Fix storybook build

Describe the bug
The storybook is broken now.

Expected behavior
Storybook should be accessible on local and be deployed successfully.

Front-end E2E test

Test list

  • Login
  • Create a project
  • Select a project
  • Earth Editor
    • create layer
    • add layer
    • create folder
    • delete layer
    • select layer
    • change layer's order
    • open the folder
    • rename layer
    • invisible layer
    • create infobox
    • change property value
      • text
      • drop down
      • color picker
      • camera
      • [ ]
    • create block
    • delete block
    • export layer
    • widgets
    • publish

備考 / Note

Tag system(Basic)

Leader

@HideBa

User story

Users want to switch the contents on the map by attributes. For example, They want to switch the display of contents on the map by any attribute such as "nature/animals," "buildings," "traditional events," "OO town," "OO village," or "Edo period," "Meiji period," etc.

Requirements

  • Ability to add arbitrary tags to layers
    • Create tags from the layer's property window
    • Attach tags on each layer
    • Detach tags from each layer
    • Can't delete tags from layer's property window
    • Create tag groups
    • When adding linked layers
      • Create tags that don't exist(internally)
      • Attach tags to each layer
  • Manage tags from tag manager
    • Inside the scene properties, tag manager should exist
    • From tag manager users can create tags and tag groups
    • Tags and tag groups can be deleted except the default tag group only when they don't have any tags inside.
  • Tag cloud widget
    • Activate widget
    • All existing tags should be shown
    • User can choose the text color, select color, and the bg color of the widget.
    • By clicking the tags inside of the tag cloud widget, the layers and storytelling should be filtered by them.

Examples

γ‚Ήγ‚―γƒͺγƒΌγƒ³γ‚·γƒ§γƒƒγƒˆ 2021-04-28 13 20 55

γ‚Ήγ‚―γƒͺγƒΌγƒ³γ‚·γƒ§γƒƒγƒˆ 2021-04-28 13 21 59

Testing list

  • Editor
    • Tag manager
      • When tag manager is selected
        • Tag manager properties are shown on right panel
        • Tag manager has "Default" tag group as default
        • "Default" tag group cannot be deleted
        • "Defaut" tag group doesn't have "x" button
        • All tag groups which belongs to the scene are show
        • All tag groups has bin icon button except "Default" tag group
        • All tag groups has input area
        • At the most buttom of Tag manager properties, Input area is shown to create a tag group
        • If user input "hello", tag can be created with "hello" label inside of the tag group
        • Tag has delete button
        • When delete button of the tag whose label is "hello" clicked
          • Tag is deleted
          • Tag should be detached from all layers which the tag originally attached
          • If user input "hello" user can create the tag whose label is "hello" again
        • When user input text, the existing tags are not shown(There is no feature to attach tag to something)
        • When user click delete button of the tag group(label is "year", tags are "1990", "2000", "2010")
          • All tags(whose label are "1990", "2000", "2010") which belong to the tag group (label is "year") are deleted
          • All tags(whose label is "1990", "2000", "2010") are detached from all layers
        • Same labeled tag group cannot be created
        • Same labeled tag cannot be created under the same tag group
    • Layer
      Case:
      • Scene has two tag groups
        • "Year" This tag group has
          • "1990"
          • "2000"
          • 2010"
        • "Place"
          • "Japan"
          • "China"
          • "Canada"
          • "Syria"
      • When the layer is selected
        • Right window has "Tags" tab with tag icon
        • Tag tab has "Default" tag group
        • "Default" tag group cannot be detached from any layers
        • When user focus on input area inside of "Year" tag group
          • "1990", "2000", "2010" tags are show
          • "Japan", "China", "Canada", "Syria" are not shown
          • When user hover the tag, its color changes
          • Tags are clickable
          • When user input "20"
            • "2000" and "2010" are shown
            • "1990" are not shown
          • When user click "1990" tag inside of pull-down list
            • "1990" tag is attached on the layer
            • "1990" tag is shown inside of "Year" tag group with "x" icon
          • When user click "x" button of "1990" tag
            • "1990" tag is detached from the layer
          • When user click "x" button of "Year" tag group
            • "Year" tag group is detached from the layer
            • "1990", "2000", "2010" tags are detached from the layer
        • When user blur on input area
          • Pull down collapse
    • Layer group
      Case: same as an above layer test case
      • Same test as an above layer test
      • When the layer group has "Year" tag group
        • All children have "Year" tag group
        • When the layer group has "1990" tag
          • All children have "1990" tag inside of "Year" tag group
          • Children cannot detached "1990" from own tag properties
          • Layer group can detatch "1990" tag by clicking "x" button
          • When the child adds "2000" tag
            • The child has "1990" and "2000" tag
            • Other children only has "1990" tag unless they has own tag which has been added manually
            • [ ]

Undo(cmd + Z)

User story

Users may accidentally make an operation while editing a project. At that time, by implementing Undo(Cmd+Z), the operation can be undone and the user can edit with ease.

[FE]support custom webfont

User story

Users currently only have a choice of fonts from Re:Earth, and would like to use their own webfont with Infobox, Label, etc. We would like to use unique webfonts for Infobox, Label, etc. This will give us a wider range of design option

Requirements

  • Can input webfont URL or JS code
  • The fonts which are added by users can be chosen from the fonts pull-down list
  • Web font works on published page as well

Change layer's position by drag and drop

Leader

@HideBa

User story

Currently, once you add a Layer, you can only change its position once you have changed its latitude and longitude from the Property window. In this case, the user needs to know the latitude and longitude. If not, the user has to get the latitude and longitude from Google Earth and enter it again from the Input field. By implementing this feature, the user can change the position of the layer by dragging and dropping, which makes it easier to adjust the layer.

Requirements

  • Can change the layer's position by drag and drop
  • Can't drop outside of the canvas
  • If the layer is linked to the dataset, it should overwrite the value by dragging and dropping
  • write document
    • Front-end
    • Back-end

Testing list

  • Editor
    Press "left" key down and hold 1 sec
    • Screen covered with blue overlay
    • cursor becomes "grab"
    • Layer which is in the US is draggable
    • Layer whose height is 1000000 is draggable
    • The earth can't be rotated while the layer is being dragged
      When the layer is being dropped
    • The layer's property updates
    • The layer drops down where it has been
    • The layer which is in the folder should also be draggable
    • The layer which is a member of LinkedLayerFolder should also be draggable
    • The layer which receives the position value from its parent should have overwritten value and its color changes yellow from blue
    • If it's extruded and has a vertical line, it should follow to the layer
      When the layer is being dropped out of the earth
    • The layer should go back to where it was originally
    • The layer's property value shouldn't change
      After a couple of layers are dragged and dropped
    • FPS shouldn't differ from before
    • The earth should be rotated
      Behavior shouldn't be changed with this feature
    • When the layer is clicked
      • indicator will be shown
      • if it has the infobox, infobox should be shown
      • if its type is 'photooverlay', photo-overlay should be played
  • Published page
    • Any layers aren't draggable

Completion condition

  • All PRs were passed CI, code-reviewed, and merged
  • Tested on staging env
  • Released in the production env
  • A demonstration was held

Workspace invitation bug

Describe the bug
When the user invites other users to the workspace, even after sending the mutation invited users are not shown in the member's list. With reloading, works fine. Removing the members from the workspace neither.

Published project is not showing

Describe the bug
When you published your project and navigate to its URL the project is not found.
Actual returned error: notfound

Refine dataset import

Leader

@yk-eukarya

User story

The user wants to create layers other than Marker from the dataset. Currently, the layers that can be created from a dataset are limited to Marker. By design, it is not possible to create multiple layers from a single dataset, so the user must choose which Primitive type to use when creating a layer from a dataset.

Requirements

  • Can preview the dataset and dataset schema
  • Can select which primitive type they use to create layers from the dataset
  • write document
    • Front-end
    • Back-end

Design data link

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.