Giter Club home page Giter Club logo

spruceui's Introduction

SpruceUI

Java 21 GitHub license Environment: Client Mod loader: Fabric

A Minecraft mod API which adds some GUI utilities.

Build

Just do ./gradlew build and everything should build just fine!

To test SpruceUI, you can run the testmod with ./gradlew runTestmodClient.

Use inside a mod

You can look at the SpruceUI test mod for examples of use.

Import inside a project

Add this to your build.gradle in addition of the base Fabric mod build.gradle:

repositories {
    mavenLocal()
    maven {
        name 'Gegy'
        url 'https://maven.gegy.dev'
    }
}

dependencies {
    /* Fabric definitions */

    include(modImplementation("dev.lambdaurora:spruceui:${project.spruceui_version}"))
}

And this to your gradle.properties:

spruceui_version=5.1.0+1.21

It will JAR-in-JAR SpruceUI so users of your mod don't need to download it separately!

spruceui's People

Contributors

acikek avatar adri326 avatar amirhan-taipovjan-greatest-i avatar ampflower avatar enjarai avatar felix14-v2 avatar flashyreese avatar ims212 avatar lambdaurora avatar macbrayne avatar madis0 avatar motschen avatar neubulae avatar notlin4 avatar patbox avatar philipp0205 avatar tibinonest avatar yoghurt4c 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

spruceui's Issues

Add List options to SpruceUI

Is your feature request related to a problem? Please describe.
Currently, there is no support for lists of values to be added as options in SpruceUI.

Describe the solution you'd like
Add List options to SpruceUI

Additional context
Maybe also add support for Lists of custom objects and nesting lists

SpruceTextAreaWidgets cause a crash if clicked on without writing text into them from code

Describe the bug
Adding a text area directly to a screen, without first calling SpruceTextAreaWidget#write(String) on it with some string, will make the game crash when the user clicks on the widget.

To Reproduce
Steps to reproduce the behavior:

  1. Create a new TextAreaWidget
  2. Add it to a screen
  3. Launch the game, open the screen, and click into the text area
  4. Game crash

Expected behavior
Cursor to be at the beginning of an empty line

Version Info:

  • OS: Linux, Debian Testing
  • Minecraft 1.16.4
  • Fabric 0.25.1+build.416-1.16
  • Mods: modmenu v1.14.6+build.31
  • Version 1.6.4

Add the required version of Spruceui to the release tab in order to download it and run the dynamic lights mod - 1.19

Is your feature request related to a problem? Please describe.
Not at the UI itself, just on the Github page of it (missing the UI which I was asked to download to run the dynamic lights mod)

Describe the solution you'd like
Add the UI at the required version of it to run the dynamic lights mod in the releases tab

Describe alternatives you've considered
None

Additional context
None

BTW - So sry fore being pushy just want to make sure ur aware of it

Collasping TabEntry / Collasping Container Entry

Add an implementation of some form of collapsible entry for containers and/or Tabbed Entries.

For situations where multiple repeating sets of settings exist (Example: Biome toggles for feature generation) sifting through said sets can become both time-consuming and confusing. with the ability to denote sections of tabbed entries, screens, or widgets as collapsible a door is opened which allows for vast user customization while maintaining understand-ability and ease of use.

Possible solution: Expand upon the Separator entry to allow them to act as collapsing buttons. Widgets found between Separators are categorized and collapsed into the Separator above them. This feature could be made into a boolean, where in current Separator functionality is maintained in one state, while collapsing functionality is added in the other. Some form of name or identifier would have to be added to a separators functionality in this scenario though that in and of itself has its uses.

I do not yet know of a good way of implementing the described feature to a container itself, yet i still believe said functionality would be an immensely powerful tool in our tool-belt

Deprecated ModMenu Stuff

Describe the bug
The following is spammed in logs: [main/WARN]: WARNING! Mod spruceui is only using deprecated 'modmenu:api' custom value! This will be removed in 1.18 snapshots, so ask the author of this mod to support the new API.

Add a color picker

Hi!
It would be nice if you could add a color picker widget (and option).

I imagine it like this, that you can enter a color as hex code into a normal text field. Next to the field is a square in the color you specified in the text field. Furthermore you should be able to set the color in a color picker, like you know it from most image editing programs, by pressing the color preview. Alternatively you could also make a small color palette from which you can choose.

I tried to make a small sketch to show my idea a little better ๐Ÿ˜…
Color picker sketch

But it is only one possible solution, I am also open for other solutions.

Don't duplicate vanilla strings

Is your feature request related to a problem? Please describe.
SpruceUI language file seems to contain strings that don't really need to be re-translated, as they are already available in vanilla strings. Why not use them directly?

Describe the solution you'd like
In your mods, use these vanilla phrases instead of creating a custom one:

  • spruceui.reset - mco.brokenworld.reset
  • spruceui.not_bound - key.keyboard.unknown
  • spruceui.options.generic.default - generator.default
  • spruceui.options.generic.fancy - options.graphics.fancy
  • spruceui.options.generic.fast - options.graphics.fast
  • spruceui.options.generic.none - gui.none
  • spruceui.options.generic.unbound - key.keyboard.unknown

Describe alternatives you've considered
Some strings can still be created if the context is very different, but most should still be vanilla for better compatibility with several languages.

Additional context
See also: #10

Can we get some screenshots

Is your feature request related to a problem? Please describe.
I just want to see how good it will be if I use it.
Describe the solution you'd like
Give some screenshots of how it will look after completion

Describe alternatives you've considered
Not now but alternative would be just to make it myself

Additional context
Nothing

Build just ded

"Just do ./gradlew build and everything should build just fine!"
nuh uh

C:\Users\ALEKS\Downloads\SpruceUI-1.20>gradlew build

Configure project :
Fabric Loom: 1.2.7
:remapping 6 mods from modImplementation (java-api)
:remapping 1 mods from modLocalRuntime (java-runtime)
:remapping sources

Task :checkLicenseMain FAILED

  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\background\Background.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\background\DirtTexturedBackground.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\background\EmptyBackground.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\background\SimpleColorBackground.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\border\Border.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\border\EmptyBorder.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\border\SimpleBorder.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\event\EventUtil.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\event\OpenScreenCallback.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\event\ResolutionChangeCallback.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\hud\component\TextHudComponent.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\hud\Hud.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\hud\HudComponent.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\hud\HudManager.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\mixin\MinecraftClientMixin.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\navigation\NavigationDirection.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\navigation\NavigationUtils.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\option\SpruceBooleanOption.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\option\SpruceCheckboxBooleanOption.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\option\SpruceCyclingOption.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\option\SpruceDoubleInputOption.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\option\SpruceDoubleOption.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\option\SpruceFloatInputOption.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\option\SpruceIntegerInputOption.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\option\SpruceOption.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\option\SpruceSeparatorOption.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\option\SpruceSimpleActionOption.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\option\SpruceStringOption.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\option\SpruceToggleBooleanOption.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\Position.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\screen\SpruceHandledScreen.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\screen\SpruceScreen.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\SprucePositioned.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\SpruceTexts.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\Tooltip.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\Tooltipable.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\util\ColorUtil.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\util\Identifiable.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\util\MultilineText.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\util\Nameable.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\util\RenderUtil.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\util\ScissorManager.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\util\SpruceUtil.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\AbstractSpruceBooleanButtonWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\AbstractSpruceButtonWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\AbstractSpruceIconButtonWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\AbstractSprucePressableButtonWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\AbstractSpruceWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\container\AbstractSpruceParentWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\container\SpruceContainerWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\container\SpruceEntryListWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\container\SpruceOptionListWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\container\SpruceParentWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\container\tabbed\SpruceTabbedWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\option\SpruceOptionSliderWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\SpruceButtonWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\SpruceCheckboxWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\SpruceElement.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\SpruceIconButtonWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\SpruceLabelWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\SpruceSeparatorWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\SpruceSliderWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\SpruceTexturedButtonWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\SpruceToggleSwitch.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\SpruceWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\text\AbstractSpruceTextInputWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\text\SpruceNamedTextFieldWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\text\SpruceTextAreaWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\text\SpruceTextFieldWidget.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\WithBackground.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\widget\WithBorder.java - license checks have failed.
  • C:\Users\ALEKS\Downloads\SpruceUI-1.20\src\main\java\dev\lambdaurora\spruceui\wrapper\VanillaButtonWrapper.java - license checks have failed.

FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ':checkLicenseMain'.

License header checks have failed on 72 out of 72 files.

  • Try:

Run with --stacktrace option to get the stack trace.
Run with --info or --debug option to get more log output.
Run with --scan to get full insights.

BUILD FAILED in 52s
7 actionable tasks: 7 executed

Replace LiteralText with Text.literal in testmod

To make the test mod working on Minecraft 1.19 LiteralText needs to be replaced with Text.literal.

From Fabric Discord Bot:

Minecraft 1.19 changed how text components work. They are now created with methods on the Text interface instead of constructors of subclasses.

Here are the transformations for the basic text types:
new LiteralText(...) -> Text.literal(...)
new TranslatableText(...) -> Text.translatable(...)
new KeybindText(...) -> Text.keybind(...)
new SelectorText(...) -> Text.selector(...)
new ScoreText(...) -> Text.score(...)
Text.EMPTY -> Text.empty()

Nbt text was reworked largely. It's now one method (Text.nbt(...)) that takes a NbtDataSource as an argument.
NbtDataSource has implementations for all the different sources that were previously subclasses of NbtText."

Bottom and top bars not showing in game

Describe the bug
I tried using this amazing api for creating an option screen for my mod, but I can't get the top and bottom dirt textured bars to show up. I tried figuring things out with the test mod, but I couldn't.

The code I'm using for my screen is the following:

public class configScreen extends SpruceScreen {

    private final Screen parent;

    private final SpruceOption doubleHotbarToggle;
    private final SpruceOption betterMountHudToggle;

    public configScreen(@Nullable Screen parent) {
        super(Text.literal("Armorhud test GUI"));
        this.parent = parent;

        this.doubleHotbarToggle = new SpruceBooleanOption("Double hotbar", () -> config.DOUBLE_HOTBAR, newValue -> config.DOUBLE_HOTBAR = newValue, Text.literal("Toggles double hotbar config"));
        this.betterMountHudToggle = new SpruceBooleanOption("Better mount HUD", () -> config.BETTER_MOUNT_HUD, newValue -> config.BETTER_MOUNT_HUD = newValue, Text.literal("Toggles the better mount hud config"));
    }

    @Override
    protected void init() {
        super.init();

        SpruceOptionListWidget list = new SpruceOptionListWidget(Position.of(0, 34), this.width, this.height - 69);
        list.addOptionEntry(this.doubleHotbarToggle, null);
        list.addOptionEntry(this.betterMountHudToggle, null);

        this.addDrawableChild(list);

        this.addDrawableChild(new SpruceButtonWidget(Position.of(this.width / 2 - 50, this.height - 30), 100, 20, Text.literal("Done"), button -> this.applyChanges()));
    }

    @Override
    public void renderTitle(DrawContext context, int MouseX, int MouseY, float delta) {
        context.drawCenteredTextWithShadow(this.textRenderer, this.title, this.width / 2, 8, 16777215);
    }

    public void applyChanges() {
        config config = armorHud.CONFIG;
        Properties properties = new Properties();
        config.write(properties);
        config.save();
        this.client.setScreen(parent);
    }

}

This will show the dirt top and bottom bars if you aren't in a world, but won't show them in game. I'm sorry if the solution is very simple, I'm trying to make a mod that's fun for me, but I'm not that experienced in java.

To Reproduce
Steps to reproduce the behavior:

  1. Download mod menu to open the option screen
  2. Open the screen from the title screen, everything seems fine
  3. Open the screen from a world, the top and bottom bars have suddenly dissappeared

Expected behavior
It is expected that the top and bottom bars are visible in a minecraft world

Screenshots
2023-10-23_14 33 29
2023-10-23_14 33 38

Desktop (please complete the following information):

  • OS: MacOS Ventura 13.5.2
  • Minecraft: 1.20.2
  • Fabric: 0.14.23
  • Mods: modmenu 8.0.0
  • Version: 5.0.3+1.20.2
  • Branch: 1.20.2

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.