GithubHelp home page GithubHelp logo

daniel-stoneuk / material-about-library Goto Github PK

View Code? Open in Web Editor NEW
1.1K 26.0 145.0 25.22 MB

Makes it easy to create beautiful about screens for your apps

License: Apache License 2.0

Java 100.00%
material card fragments about android library

material-about-library's Introduction

material-about-library

Release Downloads GitHub license GitHub issues

Makes it easy to create a beautiful about screen for your app. Generates an Activity or Fragment.

Idea from here: Heinrich Reimer's open-source-library-request-manager

Design inspired by Phonograph

If you use this library in your app, please let me know and I'll add it to the list.

Demo

Get it on Google Play

Screenshots

Light Dark Custom Cardview Background
Demo App Demo App Demo App

Features

  • Material design
  • Modular backend
  • Easy to implement
  • Simple but intuitive API
  • Dynamic item support

Dependency

material-about-library is available on jitpack.io.

Gradle dependency:

allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}
dependencies {
    implementation 'com.github.daniel-stoneuk:material-about-library:3.1.2'
}

Help test 3.2.0 with shared views between adapters (may cause crashes):

dependencies {
    implementation 'com.github.daniel-stoneuk:material-about-library:3.2.0-rc01'
}

Migration

View the migration guide here

Setup

Activity

Your Activity must extend MaterialAboutActivity and be in your AndroidManifest.xml:

public class ExampleMaterialAboutActivity extends MaterialAboutActivity {

    @Override
    @NonNull
    protected MaterialAboutList getMaterialAboutList(@NonNull Context context) {
        return new MaterialAboutList.Builder()
                .build(); // This creates an empty screen, add cards with .addCard()
    }

    @Override
    protected CharSequence getActivityTitle() {
        return getString(R.string.mal_title_about);
    }
    
}

Ensure that the theme extends a MaterialComponents theme, and apply primary & secondary colours:

<manifest ...>
    <application ...>
        <activity android:name=".ExampleMaterialAboutActivity"
            android:theme="@style/AppTheme.MaterialAboutActivity"/>
    </application>
</manifest>
<style name="AppTheme.MaterialAboutActivity" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
</style>

Fragment

Your Fragment must extend MaterialAboutFragment.

public class ExampleMaterialAboutFragment extends MaterialAboutFragment {

    @Override
    protected MaterialAboutList getMaterialAboutList(final Context activityContext) {
        return new MaterialAboutList.Builder()
                .build(); // This creates an empty screen, add cards with .addCard()
    }

}

Theming will follow the activity theme.

Add Cards:

Start building a "card" using MaterialAboutCard.Builder()

public class ExampleMaterialAboutActivity extends MaterialAboutActivity {

    @Override
    @NonNull
    protected MaterialAboutList getMaterialAboutList(@NonNull Context context) {
        MaterialAboutCard card = new MaterialAboutCard.Builder()
                // Configure card here
                .build();

        return new MaterialAboutList.Builder()
                    .addCard(card)
                    .build();
    }
}

Give the card a title by calling .title() on the MaterialAboutCard.Builder

MaterialAboutCard card = new MaterialAboutCard.Builder()
    .title("Author")
    .build();

Enable elevation and disable the outline to get a more classic design by calling .outline(false) on the MaterialAboutCard.Builder

MaterialAboutCard card = new MaterialAboutCard.Builder()
    .outline(false)
    .build();

Add Items to a card:

There are currently two types of items you can add to a card - MaterialAboutTitleItem and MaterialAboutActionItem. Other types of items are planned, for example "person" items which feature buttons to showcase a single person. Feel free to submit a PR or Issue for more item ideas.

  • MaterialAboutActionItem: Standard item with text, icon and optional subtext.
  • MaterialAboutTitleItem: Larger item with large icon (e.g. app icon) and larger text.

MaterialAboutTitleItem is created with MaterialAboutTitleItem.Builder() and lets you specify text and an icon.

MaterialAboutCard.Builder cardBuilder = new MaterialAboutCard.Builder();
cardBuilder.addItem(new MaterialAboutTitleItem.Builder()
        .text("Material About Library")
        .icon(R.mipmap.ic_launcher)
        .build());

MaterialAboutActionItem is created with MaterialAboutActionItem.Builder() and lets you specify text, sub-text, an icon and an OnClickAction.

cardBuilder.addItem(new MaterialAboutActionItem.Builder()
        .text("Version")
        .subText("1.0.0")
        .icon(R.drawable.ic_about_info)
        .setOnClickAction(new MaterialAboutActionItem.OnClickAction() {
            @Override
            public void onClick() {
                Toast.makeText(ExampleMaterialAboutActivity.this, "Version Tapped", Toast.LENGTH_SHORT)
                        .show();
            }
        })
        .build());

Return the list:

Create a MaterialAboutList using MaterialAboutList.Builder(), passing in the cards you would like to display.

MaterialAboutCard card = new MaterialAboutCard.Builder()
        .title("Hey! I'm a card")
        .build();

return new MaterialAboutList.Builder()
        .addCard(card)
        .build();

Check out a working example in Demo.java.

Tip: You can either use Strings / Drawables or Resources when creating MaterialAboutItem's

Tip: Use Android-Iconics for icons. "Android-Iconics - Use any icon font, or vector (.svg) as drawable in your application."

Tip: Use ConvenienceBuilder to easily create items or OnClickActions.

Tip: Customise text colour and card colour in your styles. Example below:

<style name="AppTheme.MaterialAboutActivity.Light.DarkActionBar.CustomCardView" parent="Theme.MaterialComponents.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="android:textColorPrimary">#ffffff</item>
        <item name="android:textColorSecondary">#ffffff</item>
        <item name="colorSurface">@color/colorPrimaryDark</item>
        <item name="colorOnSurface">#ffffff</item>
    </style>

Custom Adapters:

It is possible to replace the contents of a card with a custom adapter. If you do this, then none of the items associated with the card will be displayed. Check out the demo app, in which use LicenseAdapter (hence the INTERNET permission).

MaterialAboutCard.Builder customAdapterCardBuilder = new MaterialAboutCard.Builder();
// Create list of libraries
List<Library> libraries = new ArrayList<>();

// Add libraries that are hosted on GitHub with an Apache v2 license.
libraries.add(Licenses.fromGitHubApacheV2("yshrsmz/LicenseAdapter"));
libraries.add(Licenses.fromGitHubApacheV2("daniel-stoneuk/material-about-library"));

customAdapterCardBuilder.title("Custom Adapter (License Adapter)");
customAdapterCardBuilder.customAdapter(new LicenseAdapter(libraries));
});

Dynamic items:

It's possible to create dynamic items that either change on tap (or when any other event occurs). There are two examples in the sample application. Simply change the items in the list variable and then call refreshMaterialAboutList(). DiffUtil calculates the changes to animate in the RecyclerView.

final MaterialAboutActionItem item = new MaterialAboutActionItem.Builder()
            .text("Dynamic UI")
            .subText(subText)
            .icon(new IconicsDrawable(c)
                    .icon(CommunityMaterial.Icon.cmd_refresh)
                    .color(ContextCompat.getColor(c, R.color.mal_color_icon_dark_theme)
                    ).sizeDp(18))
            .build();
    item.setOnClickAction(new MaterialAboutItemOnClickAction() {
        @Override
        public void onClick() {
            item.setSubText("Random number: " + ((int) (Math.random() * 10)));
            refreshMaterialAboutList();
        }
    });

Custom card and Action layout

To get a layout that is similar to the 6th screenshot above simply override the files mal_material_about_action_item and mal_material_about_list_card by creating new layout resources with the same filename. See here.

Contributors

Apps using this library

License

Copyright 2016-2020 Daniel Stone

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

material-about-library's People

Contributors

alouanemed avatar beatbrot avatar broy98 avatar code-schreiber avatar daniel-stoneuk avatar designingknights avatar devgianlu avatar jonathan-caryl avatar kolyall avatar mikemee avatar pn avatar rabross avatar rainer-lang avatar robyer avatar rosuh avatar rubengees avatar syex avatar tukak avatar turing-tech 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

material-about-library's Issues

WebViewDialog just reacts strange.

It's still sideways scrollable.
If I use a WebView in AboutLibraries - all is fine, nothin to scroll, all visible, even with margin around the content. I have to investigate this issue tomorrow.

ConvenienceBuilder use "hardcoded" strings

When using ConvenienceBuilder.createWebViewDialogItem() or ConvenienceBuilder.createEmailItem() it internally uses string.mal_close and string.mal_send_email resources.

I'm not sure if that can be considered as a bug or intention, but user is not able to provide own string for "close dialog" button or "send email" selector. Actually I can provide by own string in strings.xml for mal_close and mal_send_email but it doesn't look as a clean way and also it's undocumented.

So providing additional parameter for own string would be nice. And maybe for the dialog's button allow null to hide the close button completely?

(Or alternatively at least document somewhere that users have to provide own translations for these internal strings.)

Why INTERNET permission

Hi, first of all, thanks for the library ;-)

Can you explain me why you need the android.permission.INTERNET permission?
I didn't need it before, and I prefer not to need it.

Disable animation on start

Library version: 1.8.2
AppCompat version: 25.3.1

When navigating to my MaterialAboutFragment subclass, it shows a short animation.
I do not have such animations for any other of my sections and thus it looks inconsistent.
Might it be possible to implement some kind of setting for disabling the animation?

Alert Dialog

Is it possible show an AlertDialog with a layout for the Changelog?

I try with:
LayoutInflater inflater = LayoutInflater.from(AboutActivity.this);
View view = inflater.inflate(R.layout.dialog_whatsnew, null);
AlertDialog.Builder builder = new AlertDialog.Builder(AboutActivity.this);
builder.setView(view)
.setTitle("New")
.setCancelable(false)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();

But It doesn´t work

onClickAction not working on Kotlin?

Hi, I am having the following problem with the following code:

 val dynamicItem = MaterialAboutActionItem.Builder()
                .text("aaa")
                .subText("bbb")
                .icon(IconicsDrawable(c)
                        .icon(CommunityMaterial.Icon.cmd_refresh)
                        .color(ContextCompat.getColor(c, colorIcon)
                        ).sizeDp(18))
                .build()

        dynamicItem.onClickAction = MaterialAboutItemOnClickAction {
            dynamicItem.subText = "ccc"
        }
        otherCardBuilder.addItem(dynamicItem)

I want to change the subtext from dynamic item to "ccc" when someone taps it. The 'onClickAction' is working fine, it is always called. However, I can't manage to solve why the method.subText isn't working. I am using the latest Kotlin version (1.2.10) and never had a problem before today.

support library mismatch with project

Hi, the current android support libraries are at 26.0.1, causing Android Studio to refuse to compile with the current library, since it's at 25.3.1.

email

Could you add your email to your github-account? I want to have the possibility to write you in private. :)

Change background color of a specific card

I have set the theme and everything is working fine, i would like to change the background color of a specific card rather than apply the customized theme color to all cards, how can i do that?

Disable sound effects on items that has no onClick action

Currently on clicking any item (including the MaterialAboutTitleItem and MaterialAboutActionItem) it plays the system "click" sound, but it does't make sense for static items without any attached onClick action.

Please disable sound effects on such items. In layout it can be done by using android:soundEffectsEnabled="false", there will be similar method to do it programatically.

Title description are not shown

in MaterialAboutTitleItem.java there is a bug.

`CharSequence desc = item.getDesc();
int descRes = item.getDescRes();

    holder.desc.setVisibility(View.VISIBLE);
    if (text != null) {
        holder.desc.setText(desc);
    } else if (descRes != 0) {
        holder.desc.setText(descRes);
    } else {
        holder.desc.setVisibility(GONE);
    }`

if (text != null) { should be if (desc != null) {

Fragments

Is there any way to make this work in a fragment instead of an activity?

App crashes when not setting a theme

Hey,

first of all: great library! I wanted to use it to just show all licenses for the libraries I use. So I created a very simple Activity extending your MaterialAboutActivity:

class LicenseActivity : MaterialAboutActivity() {

   override fun getActivityTitle(): CharSequence? {
        return getString(R.string.about_title)
    }

    override fun getMaterialAboutList(context: Context): MaterialAboutList {
        val appCardBuilder = MaterialAboutCard.Builder()

        appCardBuilder.addItem(MaterialAboutTitleItem.Builder()
                .text(R.string.app_name)
                .icon(R.mipmap.ic_launcher)
                .build())

        appCardBuilder.addItem(ConvenienceBuilder.createVersionActionItem(context,
                DrawableUtil.getDrawable(context, R.drawable.ic_info_outline_black_24dp),
                getString(R.string.version),
                false));

        val butterknifeLicenseCard = ConvenienceBuilder.createLicenseCard(context,
                null,
                "Butterknife", "2013", "Jake Wharton",
                OpenSourceLicense.APACHE_2)

        return MaterialAboutList(appCardBuilder.build(),
                butterknifeLicenseCard)
    }
}

When I ran my app to try it out it crashed with

android.view.InflateException: Binary XML file line #29: Binary XML file line #29: Error inflating class TextView
                                                       at android.view.LayoutInflater.inflate(LayoutInflater.java:558)
                                                       at android.view.LayoutInflater.inflate(LayoutInflater.java:434)
                                                       at com.danielstone.materialaboutlibrary.adapters.MaterialAboutListAdapter.onCreateViewHolder(MaterialAboutListAdapter.java:43)
                                                       at com.danielstone.materialaboutlibrary.adapters.MaterialAboutListAdapter.onCreateViewHolder(MaterialAboutListAdapter.java:21)
                                                       at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6367)

So I saw that mal_material_about_list_card.xml is causing the error. In the end it was crashing because I didn't set mal_color_primary resp. I didn't set a theme in my Activity. Adding

   override fun onCreate(savedInstanceState: Bundle?) {
        setTheme(R.style.Theme_Mal_Light_LightActionBar)
        super.onCreate(savedInstanceState)
    }

solved the problem, because it sets all of the required attributes.

While writing this I saw you write in the README to ensure setting a theme that extends one of yours. So I guess that is my own fault. Nevertheless I suggest that you check in MaterialAboutActivity if your attributes are set and, if not, fail with an explaining error message, as I'm probably not the only one that gets depressed seeing an InflateException from your layout file.

Copyright

I think there should be an option to add copyright info, it'll be useful for commercial apps also open-source apps have copyright too.

Dynamic UI

How does one use the Snackbar in the MaterialAboutActivity?

Also, after getMaterialAboutList() is come and gone, how could I update a .text() field that was generated by a MaterialAboutActionItem.Builder() ?

Thanks !

MinSDK15

Is there a reason for this? I'm currently using minSDK14 and don't really want to add flavors based on SDK int yet (my app is targeted towards older devices).

Featiure: add layout_behavior to Activty & RecyclerView

@daniel-stoneuk:
Could you Please add google layout behaviour for hide the actionbar on scrolling.
Just change the https://github.com/daniel-stoneuk/material-about-library/blob/master/library/src/main/res/layout/mal_material_about_activity.xml to:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MaterialAboutActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/Theme.Mal.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/mal_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/Theme.Mal.PopupOverlay"
            app:layout_collapseMode="pin"
            app:layout_scrollFlags="scroll|enterAlways"/>

    </android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/mal_recyclerview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:clipToPadding="false"
        android:paddingBottom="@dimen/mal_baseline_half"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        />

</LinearLayout>

Feature: custom layout file for single MaterialAboutActionItem

@daniel-stoneuk:
Can you please implement the option to set a custom layout file for a single MaterialAboutActionItem

something like that:
.layout(R.layout.myCustomMaterialAboutActionItem)

        MaterialAboutCard.Builder licenseCardBuilder = new MaterialAboutCard.Builder();
        licenseCardBuilder.title(getString(R.string.licenses));

        licenseCardBuilder.addItem(new MaterialAboutActionItem.Builder()
                .text(getString(R.string.open_source_licenses))
                .icon(R.drawable.ic_about_licenses_24dp)
                .layout(R.layout.myCustomMaterialAboutActionItem)
                .setOnClickListener(new MaterialAboutActionItem.OnClickListener() {
                    @Override
                    public void onClick() {
                        Intent i = new Intent(c, OpenSourceLicenseActivity.class);
                        startActivity(i);
                    }
                })
                .build());

Black Background "Overlay" on Dark Theme

I get a dark "overlay" color with the black theme. It's all over the screen as you can see in the screenshot.
What's wrong here and how can I solve this? Any tips? What did I wrong?
The white theme works perfectly.

about

Issues with missing colorPrimary are back

I just updated to 2.0.0 and I am seeing the issue with the incorrectly colored overscroll effect again:

device-2017-06-10-142432

Before that i used the commit faeb14f8ff from JitPack, which worked fine.

Thanks in advance for having a look!

Create MaterialAboutToggleItem

Hi! Is it possible to set a toggle state programmatically?

It looks like MaterialAboutToggleItem doesn't have such method.

I have a case when I should set toggle back depending on user answer. Like if user toggles “set fullscreen”, then we show him permission dialog and if the user denies to give the permission, we uncheck the toggle back programmatically.

Material keylines

The library uses 16dp of card margin instead of 8dp which causes some alignment issues:

screenshot_20161228-140944
Card layout keylines

screenshot_20161228-141011
Standard keylines

Both problems would be solved by using 8dp as card margin.
(16dp padding is perfectly fine)

Feature: customization card style

@daniel-stoneuk:
Thanks for this great lib!
Can you please implement the option to customize the card layout (overriding dimens) and add the follwowing parameters to the card style:

        <item name="android:foreground">?attr/selectableItemBackground</item>
        <item name="cardCornerRadius">4dp</item>
        <item name="cardElevation">4dp</item>
        <item name="cardMaxElevation">4dp</item>
        <item name="cardPreventCornerOverlap">false</item>
        <item name="cardUseCompatPadding">true</item>

Don't use LongClickListener by default

Because of this: 7ef52e4#diff-2fa9301a8938a1903a30c3ed37d9b6b2R279
and this: 7ef52e4#diff-085050164284a0d3154349c07c6bc0dcR168

there is no way to not have onLongClickListener set. Which means every clickable item now react to long clicks too. Which is not desired, because calling View.setOnLongClickListener() internally changes behavior of the view -- it add haptic feedback (slight vibration) on long click.

IMHO having 2 separate listeners (as Android uses it on View) is much better. Usually you don't set same reaction to single click and long click + most of the time you don't even need the longClick.

So I would vote for reverting that unified OnClickListener. But if that's not acceptable for you, could you at least give us method like .setLongClickEnabled(boolean enabled) or similar, and make the longClick disabled by default?

Note that also your ConvenienceBuilder's methods are affected by this and so long click on any such item makes same reaction as single click, and that just feels weird.

Thanks.

Remove item icon

Really awesome library! My only request is if it's possible to have a method in MaterialAboutActionItem.Builder that removes the icon and it's empty space. I want to create cards with just the title and some long descriptions. Thank you for your work :)

Feature: MaterialAboutList Methode add

@daniel-stoneuk:
Because now, i would like to use your lib for diffrent thins like About, Changelog and licences, i nedd a method to dynamically add cards to MaterialAboutList.

Could you please implement a .add Method to MaterialAboutList or a Constructor that accepts a List?

NullPointerException

Hi!
I am getting this crash, and I'm not sure what it is. Maybe something related to the theme? It has happened on Android 4.4 and 4.3.
screenshot_20170817-071502

Memory Leak when using ConvenienceBuilder.createAppTitleItem()

It seems when passing context to ConvenienceBuilder.createAppTitleItem() the activity instance is leaked.

Code to reproduce
    @NonNull
    @Override
    protected MaterialAboutList getMaterialAboutList(@NonNull Context context) {
        MaterialAboutCard card = new MaterialAboutCard.Builder()
                .addItem(ConvenienceBuilder.createAppTitleItem(context)) // This leaks the activity
                .build();
        
        return new MaterialAboutList.Builder()
                .addCard(card)
                .build();
    }
Leakcanary says

screenshot_1518513424

Now, from what I understand about it is this a known leak and affects JELLY_BEANup to MARSHMALLOW.

The way to easily avoid it in ConvenienceBuilder would be to pass the application context and not the activity directly.

Unable to change theme

This is my current style which has the required colors.

<style name="AppTheme.MaterialAboutActivity" parent="Theme.Mal.Dark.DarkActionBar" > @color/colorPrimary @color/colorPrimaryDark @color/colorAccent </style>

where,
Color primary is #2a2153
colorPrimaryDark is #221a45
colorAccent is #d1005b

Even though I have applied it, but my background color is not changing, its still set to some default value near "#212121". Am I doing anything wrong?

ConvenienceBuilder::createVersionActionItem -> without versionCode

I would like to have the version info without versionCode.
I could provide a method (PR):

  • new method like "createVersionActionItemWithoutVersionCode"
    or
  • old method with added parameter like "boolean includeVersionCode"

Would do you prefer - and do you support this?

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.