Giter Site home page Giter Site logo

privatenumber / vue-frag Goto Github PK

View Code? Open in Web Editor NEW
214.0 3.0 14.0 759 KB

๐Ÿคฒ Create Fragments (multiple root-elements) in Vue 2

License: MIT License

JavaScript 21.88% TypeScript 78.12%
vue fragment directive ssr multiple root nodes vuejs component

vue-frag's Introduction

vue-frag

Use Vue 3's Fragment feature in Vue 2 to return multiple root elements.

<template>
    <Fragment> โฌ… This root element will not exist in the DOM

        <li>Element 1</li>
        <li>Element 2</li>
        <li>Element 3</li>
    </Fragment>
</template>

<script>
import { Fragment } from 'vue-frag'

export default {
    components: {
        Fragment
    }
}
</script>

๐Ÿ‘‰ Try it out on CodePen!

Features

  • โœ… Multiple root nodes Without creating a functional component!
  • ๐Ÿ”ฅ SSR Unwraps the root element on client-side post-hydration!
  • โšก๏ธ Directives Supports v-if, v-for, and v-html!
  • ๐Ÿ‘ฉโ€๐Ÿ”ฌ Battle-tested Checkout the tests here!
๐Ÿ”ฅ Pro-tip

Want to be able to just have multiple root-nodes in your SFC without a wrapper? Use vue-frag-plugin to automatically inject vue-frag so that you can return multiple root nodes without a fragment component!

Premium sponsor banner

๐Ÿš€ Install

npm i vue-frag

๐Ÿšฆ Quick Setup

You can either choose to use the Component or Directive API.

Component API

The Component API is designed to be used at the root of the template. It should feel intuitive to use and cover most use-cases.

Import Fragment and use it as the root element of your component:

<template>
    <Fragment>
        Hello world!
    </Fragment>
</template>

<script>
import { Fragment } from 'vue-frag'

export default {
    components: {
        Fragment
    }
}
</script>

Register globally

Globally registering the component lets you use it without needing to import it every time.

import { Fragment } from 'vue-frag'

Vue.component('Fragment', Fragment)

Directive API

Use the Directive API to have more nuanced control over placement. For example, if you want to unwrap the root node of a component on the usage-end.

The Component API uses the Directive API under the hood.

<template>
    <div v-frag>
        Hello world!
    </div>
</template>

<script>
import frag from 'vue-frag'

export default {
    directives: {
        frag
    }
}
</script>

Register globally

Make it available anywhere in your Vue application.

import frag from 'vue-frag'

Vue.directive('frag', frag)

๐Ÿ‘จ๐Ÿปโ€๐Ÿซ Examples

Returning multiple root nodes

Component API

<template>
    <Fragment> <!-- This element will be unwrapped -->

        <div v-for="i in 10">
            {{ i }}
        </div>
    </Fragment>
</template>

Directive API

<template>
    <div v-frag> <!-- This element will be unwrapped -->

        <div v-for="i in 10">
            {{ i }}
        </div>
    </div>
</template>

Unwrapping the root node from a component

Use the Directive API to unwrap the root node of a component.

<template>
    <div>
        <!-- Unwraps the root node of some-custom-component -->
        <SomeCustomComponent v-frag />
    </div>
</template>

Supports v-if too

<template>
    <div v-frag>
        <template v-if="isShown">
            Hello world!
        </template>
    </div>
</template>

Access fragment DOM nodes

<template>
    <div v-frag>
        Hello world
    </div>
</template>

<script>
export default {
    mounted() {
        console.log(this.$el.frag)
    }
}
</script>

Premium sponsor banner

๐Ÿ’โ€โ™€๏ธ FAQ

When would I want to return multiple root nodes?

Whenever you feel like the root-element of your component adds no value and is unnecessary, or is messing up your HTML output. This usually happens when you want to return a list of elements like <li>List Items</li> or <tr><td>Table Rows</td></tr> but you have to wrap it in a <div>.

In Vue 2, it's possible to return multiple nodes with a Functional Component but functional components are stateless (no data() or life-cycle hooks), doesn't support methods, doesn't have very good template support, and can lead to SSR bugs (eg. mismatching nodes).

Related VueJS Issues / Stackoverflow Qs:

How does this work?

vue-frag works by tricking Vue.js to think that the root element is still in the DOM, when it's actually not.

When vue-frag is applied to an element, it uses the inserted directive hook to swap the element out with its children to remove itself from the DOM. It then patches surrounding DOM nodes (eg. parent, sibling, children) to make them think that the element is still in the DOM.

Here are all the DOM APIs Vue.js uses that are patched:

Does v-show work?

Like in Vue 3, v-show does not work on components that return a fragment. v-show works by setting style="display: none" on the root element of the target component. With vue-frag removing the root element, there would be no grouping-element to apply the display: none to. If the fragment returned elements, it's possible to apply it to each child-node, but it's possible for them to be text-nodes which cannot be styled.

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง Related

  • vue-frag-plugin - Build-time plugin to seamlessly use multiple root nodes
  • vue-subslot - ๐Ÿ’ pick out specific elements from component <slot>s
  • vue-vnode-syringe - ๐Ÿงฌ Add attributes and event-listeners to <slot> content ๐Ÿ’‰
  • vue-proxi - ๐Ÿ’  Tiny proxy component
  • vue-pseudo-window - ๐Ÿ–ผ Declaratively interface window/document in your Vue template
  • vue-v - render vNodes via component template

Sponsors

Premium sponsor banner Premium sponsor banner

vue-frag's People

Contributors

h0rn3z0r avatar privatenumber avatar reinisv avatar superlipbalm avatar wobsoriano 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

vue-frag's Issues

Add sourcemaps

Right now when you get an error related to vue-frag, the error will read like this (I use Firefox - the Chrome error message is a bit different in this case):
can't access property Symbol(), a is null
Notice the a - there's no variable named a in the enteriety of src/frag.js. This is because the a comes from the already minified file frag.esm.js
The above error happens on line 1 of frag.esm.js, but that's not very helpful because the whole file is just one line (again - minification)
image

image

The error messages would be more helpful if they had access to sourcemaps (browsers will pick them up automatically obviously), they'd be like can't access property Symbol(), element is null at line 15 (or something like that)

When I install vue-frag and go to node_modules/vue-frag, I see only the dist folder, package.json and README.md
Since the original unminified source is not shipped in the package, it's not possible to "sourcemap" to any file

To show that my webpack configuration is correct, see what vuex.esm.js looks like (frag.esm.js was already shown above):
image

Using v-frag directive then changing routes multiple times

I am using nuxt and in my pages directory,

I have a page named abc.vue
it is wrapped with a

now, i have another page named def.vue
also wrapped in

switching between those pages back and fort with vue router causes

frag.esm.js?76e6:1 Uncaught TypeError: Cannot read property 'before' of undefined

v if on v-frag not working

When i set showAuthModal on true, he showing AuthModalComponent, but when i set showAuthModal on false, AuthModalComponent not hidden. show|hide wokring by v-if

Component by i call v-if
image

Called component - AuthModalComponent
image

Console error in Chrome devtool
image

Sorry for my english. I from Russia

ไฝ ๅฅฝ๏ผŒ่ฏท้—ฎไธ€ไธ‹๏ผŒ้€’ๅฝ’็ป„ไปถๆƒ…ๅ†ตไธ‹็š„้—ฎ้ข˜

ๆˆ‘่ฟ™่พนไฝฟ็”จไบ†vue-frag๏ผŒ่ฟ›่กŒ้€’ๅฝ’็ป„ไปถๆ“ไฝœใ€‚ไฝ†ๆ˜ฏๅ‘็Žฐ็ฌฌไธ€ๅฑ‚็”Ÿๆ•ˆ๏ผŒๅœจๅŠจๆ€ๅŠ ๅ‡ๆ•ฐๆฎ็š„ๆ—ถๅ€™ๅ‘็Žฐ้€’ๅฝ’็š„้‡Œ้ข้ƒฝไธ็”Ÿๆ•ˆใ€‚

image
image

IE11 issues

By default when I load a page using this directive in IE11 I get the error

Error in directive frag inserted hook: "TypeError: Unable to get property 'apply' of undefined or null reference"

This is pretty simple to fix by adding a polyfill for ParentElement.append and one for ChildElement.replaceWith.

The problem is that after I add the polyfill, I run into another issue altogether:

Error in directive frag inserted hook: "Error: Out of stack space"

It's pretty difficult to debug for me as the stack trace just looks like
image

Any ideas on what the issue is or what the solution is?

Not SSR compatible

Is there a way to make this work with Nuxt SSR ?
Maybe this is expected as this hack the v-dom, but currently I get :

vue.runtime.esm.js?2b0e:619 [Vue warn]: The client-side rendered virtual DOM tree is not matching server-rendered content. This is likely caused by incorrect HTML markup, for example nesting block-level elements inside <p>, or missing <tbody>. Bailing hydration and performing full client-side render.

Failed to load config "@pvtnbr" to extend from

Getting this error during the vite build command all of a sudden. I've cleared node_module and yarn.lock and it's still happening

[vite-plugin-eslint] Failed to load config "@pvtnbr" to extend from.
Referenced from: /Users/alexmccabe/Sites/ui-library/node_modules/vue-frag/package.json
file: /Users/alexmccabe/Sites/ui-library/node_modules/vue-frag/dist/frag.esm.js
error during build:
Error: Failed to load config "@pvtnbr" to extend from.
Referenced from: /Users/alexmccabe/Sites/ui-library/node_modules/vue-frag/package.json
    at configInvalidError (/Users/alexmccabe/Sites/ui-library/node_modules/@eslint/eslintrc/lib/config-array-factory.js:290:9)
    at ConfigArrayFactory._loadExtendedShareableConfig (/Users/alexmccabe/Sites/ui-library/node_modules/@eslint/eslintrc/lib/config-array-factory.js:883:23)
    at ConfigArrayFactory._loadExtends (/Users/alexmccabe/Sites/ui-library/node_modules/@eslint/eslintrc/lib/config-array-factory.js:781:25)
    at ConfigArrayFactory._normalizeObjectConfigDataBody (/Users/alexmccabe/Sites/ui-library/node_modules/@eslint/eslintrc/lib/config-array-factory.js:720:25)
    at _normalizeObjectConfigDataBody.next (<anonymous>)
    at ConfigArrayFactory._normalizeObjectConfigData (/Users/alexmccabe/Sites/ui-library/node_modules/@eslint/eslintrc/lib/config-array-factory.js:665:20)
    at _normalizeObjectConfigData.next (<anonymous>)
    at ConfigArrayFactory.loadInDirectory (/Users/alexmccabe/Sites/ui-library/node_modules/@eslint/eslintrc/lib/config-array-factory.js:511:28)
    at CascadingConfigArrayFactory._loadConfigInAncestors (/Users/alexmccabe/Sites/ui-library/node_modules/@eslint/eslintrc/lib/cascading-config-array-factory.js:379:46)
    at CascadingConfigArrayFactory._loadConfigInAncestors (/Users/alexmccabe/Sites/ui-library/node_modules/@eslint/eslintrc/lib/cascading-config-array-factory.js:398:20)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

TS error on Nuxt

Hi! I'm having an issue with using the plugin with Nuxt, it seems to work on the front-end (and is fantastic โค๏ธ), but it's throwing Typescript errors in my VS Code console, so I can't build. I didn't know if this might be an issue with my setup, or something in the package?

ERROR in plugins/vue-frag.ts:6:29
TS2769: No overload matches this call.
  The last overload gave the following error.
    Argument of type 'FragmentComponent' is not assignable to parameter of type 'ComponentOptions<Vue, DefaultData<Vue>, DefaultMethods<Vue>, DefaultComputed, PropsDefinition<DefaultProps>, DefaultProps>'.
      Types of property 'beforeRouteEnter' are incompatible.
        Type 'NavigationGuard<never> | undefined' is not assignable to type 'NavigationGuard<Vue> | undefined'.
          Type 'NavigationGuard<never>' is not assignable to type 'NavigationGuard<Vue>'.
            Type 'Vue' is not assignable to type 'never'.
    4 |
    5 | const myPlugin: Plugin = () => {
  > 6 |   Vue.component('Fragment', Fragment)
      |                             ^^^^^^^^
    7 | }
    8 |
    9 | export default myPlugin

Setup

nuxt.config.js

plugins: [
    '~/plugins/vue-frag',
],

vue-frag.ts

import Vue from 'vue'
import { Fragment } from 'vue-frag'
import { Plugin } from '@nuxt/types'

const myPlugin: Plugin = () => {
  Vue.component('Fragment', Fragment)
}

export default myPlugin

Error on Nuxt when use v-frag inside an transition component

Error: TypeError: Cannot read property 'splice' of undefined

How to reproduce

Create a Nuxt project and add this component (just an dumb example):

Component with v-frag:

<template>
  <div v-frag>
    <button>
      <slot></slot>
    </button>
    <div>
      <p>Content</p>
    </div>
  </div>
</template>

Add this component in a page (like index.vue) using an transition:

Page :

<template>
  <transition name="fade">
    <div v-if="isVisible">
      <ComponentWithVFrag>...</ComponentWithVFrag>
    </div>
  </transition>
</template>

Run yarn dev and open the page in the browser and open the console:
Screenshot from 2021-06-03 10-39-56

The page will break and you will not be able to view the component's content.

If I remove the transition component, the page will work normally.

Version details

nuxt@npm:2.15.6
vue-frag@npm: 1.1.5

Symbol() of null on v-if true after false

Setting v-if to false removes element, but changing back to true returns:
[Vue warn]: Error in directive frag inserted hook: "TypeError: Cannot read property 'Symbol()' of null"

TypeError: Cannot read property 'Symbol()' of null at eval (frag.esm.js?76e6:1) at inserted (frag.esm.js?76e6:1) at callHook$1 (vue.runtime.esm.js?2b0e:6680) at callInsert (vue.runtime.esm.js?2b0e:6619) at wrappedHook (vue.runtime.esm.js?2b0e:2235) at invokeWithErrorHandling (vue.runtime.esm.js?2b0e:1854) at Object.invoker [as insert] (vue.runtime.esm.js?2b0e:2175) at invokeInsertHook (vue.runtime.esm.js?2b0e:6346) at VueComponent.patch [as __patch__] (vue.runtime.esm.js?2b0e:6565) at VueComponent.Vue._update (vue.runtime.esm.js?2b0e:3948)

Global registration in Nuxt leads to Vue ReferenceError

Hello,

I've started a project with Nuxt (2.15.3) and tried vue-frag in my components, after using vue-fragment which does not work with server-side rendering.

The directive works as expected when I import it locally for each component.
But when I tried to globally register it as a plugin, a Vue ReferenceError is triggered.

Screenshot 2021-03-23 at 09 11 48

The browser console only says it encounters an error fetching the favicon
On the server side, no error message is logged.

My Nuxt settings are :

in a new file ./plugins/vue-frag.js

import frag from "vue-frag"
Vue.directive(frag)

in nuxt.config.js, I have added the plugins property to the default export :

export default {
  components: true,
  buildModules: ['nuxt-vite', '@nuxtjs/tailwindcss'],
  tailwindcss: { 
    jit: true
  },
  plugins: [
    '~/plugins/vue-frag.js',
  ]
}

Element is removed inside keep-alive

Demo: https://jsfiddle.net/580kqz4n

<template>
  <fragment>
    <keep-alive>
      <component :is="children[index]"></component>
    </keep-alive>
    
    <button @click="index++">next</button>
  </fragment>
</template>

<script>
const { Fragment } = Frag

export default {
  components: {
    Fragment,
    child1: { template: "<div>child1</div>" },
    child2: { template: "<div>child2</div>" },
    child3: { template: "<div>child3</div>" }
  },
  data() {
    return {
      index: 0,
      children: ["child1", "child2", "child1", "child3", "child1"]
    }
  }
}
</script>

How to reproduce

Click the button 4 times. You should see component names as they are listed in the children array. On the 4th click, instead of child1, nothing is shown. The element is removed from DOM. This does not happen without keep-alive or fragment.

Versions

Vue: 2.6.14
v-frag: 1.4.0

Fragment not rendered in build mode

Hi !

I'm trying to use nested v-frag in a table and everything is going fine in dev mode, but the subcomponents with v-frag are not rendered in build mode. Instead there is <!--function(a,b,e,n){return We(t,a,b,e,n,!0)}-->

I'm using nuxt-ts to run in dev and nuxt-ts build to build for prod

Here is a simplified version of my problem

page.vue

<template>
 <table>
   <MyComponent v-for="item in items" :key="item.id" :item="item" :level="0" />
 </table>
</template>
<script>
...
page.items = [
 { id: 0, name: '0', items: [ 
  { id: 1, name: '1', items: [] },
  { id: 2, name: '2', items: [] }
  ]
 },
 { id: 3, name: '3', items: [ 
  { id: 4, name: '4', items: [] },
  { id: 5, name: '5', items: [] }
  ]
 },
]
</script>

MyComponent.vue

<template>
 <div v-frag>
  <tr :level="level">{{ item.name }}</tr>
  <MyComponent v-for="subItem in item.items" :key="subItem.id" :item="subItem" :level="level + 1"/>
 </div>
</template>

expected output:

<table>
 <tr level="0">0</tr>
 <tr level="1">1</tr>
 <tr level="1">2</tr>
 <tr level="0">3</tr>
 <tr level="1">4</tr>
 <tr level="1">5</tr>
</table>

actual output:

<table>
 <tr level="0">0</tr>
 <!--function(a,b,e,n){return We(t,a,b,e,n,!0)}-->
 <tr level="0">3</tr>
 <!--function(a,b,e,n){return We(t,a,b,e,n,!0)}-->
</table>

Do you have any idea what might cause this ?

PS: Thanks for the great work

[nuxt] Html elements order is not preserved during navigation via nuxt-link

You can see this problem here: https://codesandbox.io/s/dazzling-currying-gdyi0?file=/pages/index.vue

  1. We have there two pages (index, about) and one layout (default).
  2. Notice that v-frag is used only on index page.
  3. When you navigate between pages (use links in header) you can see that page content is loading below all layout elements.

Notice:

  1. Section number 2) the green one, should be always in the middle.
  2. It happens only when navigating via links, it looks like server side rendering works fine (go to about page and click refresh button in codesandbox internal "browser").
  3. When you navigate from about (page without v-frag) to index (page with v-frag) it works fine (to see this, refresh codesandbox internal browser on about page).

Eslint error: Fragment not found in 'vue-frag'

Hey,

I get this error when importing fragment in a component:

Screenshot 2022-11-04 at 10 35 08

Workaround is to import like this:

import Frag from 'vue-frag'
(...)
  components: {
    Fragment: Frag.Fragment,
  }

Edit: strike the workaround, it got rid of the error, but the plugin stopped working. Just disabling eslint instead for now.

Improve TypeScript declarations

Currently it's not possible to use import { Fragment } from 'vue-frag'; cause it errors with something like

no exported Fragment

Error in nextTick: "TypeError: Cannot read property 'after' of undefined" (when using slots with v-if)

Hi there,
today I faced an issue with vue-frag in my implementation. I saw you did several tests for v-if scenarios but might miss a case when you have a slot with v-if causing a fatal error breaking the flow.
I managed to create some base test case for the issue but unfortunately didn't manage to fix it by myself without breaking other tests, so hopefully, you'll find it useful to prepare a proper fix :)

	test('v-if slot', async () => {
		const TestComponent = {
			template: `
				<div v-frag>
					<slot />
				</div>
			`,
			directives: {
				frag,
			},
		};

		const usage = {
			template: `
				<div class="wrapper">
					<test-component><div v-if="show">A</div></test-component>
				</div>
			`,
			components: {
				TestComponent,
			},
			data() {
				return {
					show: false,
				};
			},
		};

		const empty = '<div class="wrapper">\n  <!---->\n</div>';
		const ifTrue = '<div class="wrapper">\n  <div>A</div>\n</div>';

		const wrapper = mount(usage);
		expect(wrapper.html()).toBe(empty);

		wrapper.setData({show: true});
		await wrapper.vm.$nextTick();
		expect(wrapper.html()).toBe(ifTrue);

		wrapper.setData({show: false});
		await wrapper.vm.$nextTick();
		// expect(wrapper.html()).toBe(empty);

		wrapper.setData({show: true});
		await wrapper.vm.$nextTick();
		expect(wrapper.html()).toBe(ifTrue);
	});

The penultimate expectation (after setting show to false) that I commented out is also failing, but I wanted to show you the failing scenario I faced which is an error on the second attempt to show slot contents.

Order is not updated

For example, https://codepen.io/vmihailenco/pen/NWbPpOQ .

Expected. Order of rows is updated.
Got. Order is not updated. Instead empty divs are inserted.

frag-divs

PS I am more interested in getting rid of empty divs rather than fixing order. For some reasons v-frag does not always unwrap elements, but I can't fully reproduce it...

Elements inside vue-frag are invisible in Selenium

What's wrong

  1. Make this Vue component:
<!-- src/MyFrag.vue -->
<template>
<div v-frag>
  <div id="1">I'm invisible to selenium!</div>
  <div id="2">I'm invisible to selenium!</div>
</div>
</template>
<script>
export default {}
</script>
  1. Display it on localhost:3000
<!-- App.vue -->
<template>
  <MyFrag/>
</template>
<script>
import MyFrag from '@/MyFrag.vue'
export default {
  components: {MyFrag}
}
</script>
  1. Try to find the element using Selenium - it will be found, but Selenium will interpret it as if it's not visible.
    It's worth mentioning that:
  • The div v-frag children are visible in the HTML in the inspector
  • The children are also visible to the human eye - I'd be able to see the "I"m invisible to selenium!" texts.
  //selenium code in C#
  this.driver.FindElement(By.CssSelector("[id='1']")).Displayed //returns "False"

image

HTML in question:
image

Expected behavior

v-frag children that are clearly visible (no v-if etc.) should show up as displayed: true when trying to select them with Selenium.

Current behavior

v-frag children that are clearly visible (no v-if etc.) show up as displayed: false

Additional notes

  1. A related issue I've found in the Selenium repo is this - it talks about vue-fragment, not vue-frag but the issue is similar is here: SeleniumHQ/selenium#9668 . Not sure if it's very useful to this issue, since judging by the OP, vue-fragment's and vue-frag's implementations are very different.

  2. I've read through this part of the readme: https://github.com/privatenumber/vue-frag#how-does-this-work and immediately this part caught my attention:

The Frag directive simply replaces the root element of a component in the DOM with it's children upon DOM insertion, and monkey-patches native properties like parentNode on the children to make Vue think they're still using the component root element.

I'm suspecting there's some edge case in the monkey-patching that's making Selenium think the v-frag children are hidden. Since Selenium probably traverses the very same native properties that are monkeypatched.

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.