Giter Club home page Giter Club logo

vue-draggable-next's Introduction

vue-draggable-next

Vue 3 drag-and-drop component based on Sortable.js

Demo.

Installation

npm install vue-draggable-next
//or
yarn add vue-draggable-next

Typical use:

<template>
  <div class="flex m-10">
    <draggable class="dragArea list-group w-full" :list="list" @change="log">
      <div
        class="list-group-item bg-gray-300 m-1 p-3 rounded-md text-center"
        v-for="element in list"
        :key="element.name"
      >
        {{ element.name }}
      </div>
    </draggable>
  </div>
</template>
<script>
  import { defineComponent } from 'vue'
  import { VueDraggableNext } from 'vue-draggable-next'
  export default defineComponent({
    components: {
      draggable: VueDraggableNext,
    },
    data() {
      return {
        enabled: true,
        list: [
          { name: 'John', id: 1 },
          { name: 'Joao', id: 2 },
          { name: 'Jean', id: 3 },
          { name: 'Gerard', id: 4 },
        ],
        dragging: false,
      }
    },
    methods: {
      log(event) {
        console.log(event)
      },
    },
  })
</script>

With transition-group:

<draggable v-model="myArray">
  <transition-group>
    <div v-for="element in myArray" :key="element.id">{{element.name}}</div>
  </transition-group>
</draggable>

With Vuex:

<draggable v-model="myList"></draggable>
computed: {
    myList: {
        get() {
            return this.$store.state.elements
        },
        set(value) {
           this.$store.dispatch('updateElements', value)
        }
    }
}

Props

value

Type: Array
Required: false
Default: null

Input array to draggable component. Typically same array as referenced by inner element v-for directive.
This is the preferred way to use Vue.draggable as it is compatible with Vuex.
It should not be used directly but only though the v-model directive:

<draggable v-model="myArray"></draggable>

list

Type: Array
Required: false
Default: null

Alternative to the value prop, list is an array to be synchronized with drag-and-drop.
The main difference is that list prop is updated by draggable component using splice method, whereas value is immutable.
Do not use in conjunction with value prop.

All sortable options

New in version 2.19

Sortable options can be set directly as vue.draggable props since version 2.19.

This means that all sortable option are valid sortable props with the notable exception of all the method starting by "on" as draggable component expose the same API via events.

kebab-case propery are supported: for example ghost-class props will be converted to ghostClass sortable option.

Example setting handle, sortable and a group option:

<draggable
        v-model="list"
        handle=".handle"
        :group="{ name: 'people', pull: 'clone', put: false }"
        ghost-class="ghost"
        :sort="false"
        @change="log"
      >
      <!-- -->
</draggable>

tag

Type: String
Default: 'div'

HTML node type of the element that draggable component create as outer element.

component

Type: String
Default: 'null'

It is also possible to pass the name of vue component as element. In this case, draggable attribute will be passed to the create component.

componentData

Type: Function
Required: false
Default: null

if you need to set props or attrs to the created component.

clone

Type: Function
Required: false
Default: (original) => { return original;}

Function called on the source component to clone element when clone option is true. The unique argument is the viewModel element to be cloned and the returned value is its cloned version.
By default vue-draggable-next reuses the viewModel element, so you have to use this hook if you want to clone or deep clone it.

move

Type: Function
Required: false
Default: null

If not null this function will be called in a similar way as Sortable onMove callback. Returning false will cancel the drag operation.

function onMoveCallback(evt, originalEvent){
   ...
    // return false; — for cancel
}

evt object has same property as Sortable onMove event, and 3 additional properties:

  • draggedContext: context linked to dragged element
    • index: dragged element index
    • element: dragged element underlying view model element
    • futureIndex: potential index of the dragged element if the drop operation is accepted
  • relatedContext: context linked to current drag operation
    • index: target element index
    • element: target element view model element
    • list: target list
    • component: target VueComponent

HTML:

<draggable :list="list" :move="checkMove">

javascript:

checkMove: function(evt){
    return (evt.draggedContext.element.name!=='apple');
}

Events

  • Support for Sortable events:

    start, add, remove, update, end, choose, unchoose, sort, filter, clone
    Events are called whenever onStart, onAdd, onRemove, onUpdate, onEnd, onChoose, onUnchoose, onSort, onClone are fired by Sortable.js with the same argument.
    See here for reference

HTML:

<draggable :list="list" @end="onEnd">
  • change event

    change event is triggered when list prop is not null and the corresponding array is altered due to drag-and-drop operation.
    This event is called with one argument containing one of the following properties:

    • added: contains information of an element added to the array
      • newIndex: the index of the added element
      • element: the added element
    • removed: contains information of an element removed from to the array
      • oldIndex: the index of the element before remove
      • element: the removed element
    • moved: contains information of an element moved within the array
      • newIndex: the current index of the moved element
      • oldIndex: the old index of the moved element
      • element: the moved element

🌸 Thanks

This project is heavily inspired by the following awesome vue 2 projects.

Thanks!

vue-draggable-next's People

Contributors

anish2690 avatar donaldzou avatar romanovx 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

vue-draggable-next's Issues

Issues in Drag and Drop

image
Getting this error, while dragging the elements.

	<draggable
		class="q-pa-sm container"
		:list="items"
		item-key="name"
		:style="grid"
		ghost-class="ghost"
		:move="handleMove"
		@end="handleDragEnd"
	>
		<div
			class="list-group-item"
			:class="{ 'not-move': element.static,cell:element.i}"
			v-for="element in items"
			:key="element.i"
		>
			<span :class="`rotate-${element.screenRotation}`">{{ element.i }}</span>
		</div>
	</drggable>	

Grid display not working

Is it not possible to use grid display with this?
I tried and every new object goes to the next row instead of filling in the column.
When I remove the draggable tag it displays normally.

@Update not fired when moving item between sections

Please find attached a bug-report cq. feature request for vue-draggable-next:

Expected Result
I expected to @update event to be fired when moving an item between sections. Currently, @update is only fired when moving an item within a section.

Actual Result
Currently, @update is only fired when moving an item within a section. @EnD is the only event that contains the oldSection + oldIndex + newSection + newIndex information (since @change is fired twice when moving an item between sections).

Steps to reproduce issue
I uploaded a testcase @ https://github.com/mfjonker/anish-draggable-test2

Visual Proof (screenshots, videos, text)
I uploaded two gifs in the abovementioned repository:
a. move-within-section.gif shows that @update is correctly fired when moving an item within a section
b. move-between-sections.gif shows that @update is not fired when moving an item between sections (only @change and @EnD events are)

How to allow dragging between different lists?

Hello, thanks for making this plugin!

I'm currently using it for drag & drop to reorder items in two lists, but I also want to allow d&d between the two lists. Is that possible? If so, how?

Thanks!

[Vue warn]: (deprecation WATCH_ARRAY) "watch"

The Vue warn [Vue warn]: (deprecation WATCH_ARRAY) "watch" option or vm.$watch on an array value will no longer trigger on array mutation unless the "deep" option is specified. occurs.

I think the deep: true option is missing for realList.

How do you use Vuex with a nested structure?

The documentation says that you should use v-model with Vuex, but you're not allowed to use v-model on props passed down to nested components. How do we work around that limitation?

Get new List

Sorry, i only found new update position of single object in @change, how to get callback of new list?

blocked the oprations on 'input' tag

i can not double click to select, and select a range of text.
i can only click to focus, is there a way to completely disable the drag event?

Both v-model and :list are modified on drag&drop

Hi!
I don't know how to solve the problem I have with Drag&Drop.
Up to now I've had two buttons move up and move down to change the position of the elements of the list. Each change was requesting an update on the server and with a success the objects were moved (hence, every move required an ok from the server, then the list was updated). Being the list stored into the state part of a Pinia store, once they updated Vue proceeded to redraw the UI.
But, if I use the Drag&Drop, I can't have the same behaviour.
I manage the onEnd event, so I proceed with the call on the server once the user has stopped to drag the object. I've supposed that if use the v-model, as written on the documentation, no changes are performed on the model as long I return a false in the function. But it's not the case.
With both v-model and :list the content is changed. That means that I can't use the same function used in moveUp/moveDown, because otherwise I perform another change. The only way to obtain the original status is to add whole new set of functions that are used only for Drag&Drop.

Is this normal? I mean, is normal that both v-model and :list are not immutable?

non draggable item

there's a way to put an item thet is not draggable in the end of the list?

Duplicates during sorts

Hello!
I use Laravel Nova with the outl1ne/nova-sortable package for having the ability to sort items.
When I try to drag an item down, it duplicates. Actually, this problem was noticed by several developers. Look this issue please.

I dug into the core and realised that there's an issue especially with vue-draggable-next.

If the keys like so:

service-resource-items-0
service-resource-items-1
service-resource-items-2
...

everything works fine

However, if the keys like so:

service-resource-items-0-1
service-resource-items-1-2
service-resource-items-2-3
...

the issue happens.

A piece of the source code:

<draggable
        tag="tbody"
        v-model="fakeResources"
        draggable="tr"
        @update="updateOrder"
      >
        <ResourceTableRow
          v-for="(resource, index) in fakeResources"
          :key="`${resourceName}-items-${index}-${resource.id.value}`"
        />
 </draggable>

If I delete the "-${resource.id.value}" part from the :key attribute, sorting works fine.

evt.draggedContext.futureIndex not updated when dragging item from one section to another

Description:
I want to track the futureIndex of the dragged item within the onMove event in order to potentially return false (i.e. to cancel).

What happens:
As long as the dragged item remains within the section in which the drag originated, the evt.draggedContext.futureIndex returns the correct futureIndex. However, as soon as the item is dragged into another section, the futureIndex stays zero.

What I expected:
I expected evt.draggedContext.futureIndex to report the correct index (also after dragging an item into another section). See the attached .gif for an example screenshot.

output
.

Single-Axis Dragging

It would be really nice to restrict the dragging to either the x or y axis depending on the use-case. Using this library for a mobile app project in quasar and it's a little awkward being able to freely drag the list items anywhere. If I could restrict it to only tracking the y-axis that would make things much cleaner.

Nested v-model send update events too quickly

when using v-model with dragging objects between vue layers, two update events are generated update:modelValue with addition in the new layer and removing in the old one, which leads to unsynchronization since the data does not have time to spread

It turned out to achieve the desired behavior by deleting the object in the next tick

Does this package work with slot templating?

I am trying to make this package to work with , but the content rows does not stick to the new order when I moved them around. It always goes back to the original order. Is anyone having similar issues?

<template> <VueDraggableNext :list="dataList" @start="drag=true" @end="drag=false" > <div v-for="item in dataList" :item="item" :key="item.id"> <slot name="row"></slot> </div> </VueDraggableNext> </template>

vue-router dependency only used for demo

Hey,

After installing this package I can see that I now have vue-router installed. From what I can see, the router is only actually used in the demo application and is not actually a dependency of vue-draggable-next itself. Is there any reason for this, or can I submit a PR to move this into the dev dependencies?

vue-draggable blocks child onclick events

the vue-draggable component is blocking onclick events that are located inside a list element. when I comment out the draggable package my menu click works again. when I insert the draggable works but not the menu.

parent (the onclick event is located in VListItem prop append-icon. inside ListMenu i trigger an onclick on an icon that opens a menu ):
` <VueDraggableNext
:list="generalListData"
@change="($event) => updateClassifsListChange($event)"
ghostClass="ghost"
:style="isListItemClicked ? 'cursor: grabbing' : 'cursor: grab'"
@choose="() => (isListItemClicked = true)"
@unchoose="() => (isListItemClicked = false)"
>


<VListItem
class="bg-blue-grey-lighten-4"
v-bind="props"
:title="classifs.name"
:prepend-icon="
() => h(ListMenuIcons, { listOpen: Boolean(classifs.listOpen) })
"
:append-icon="
() =>
h(ListMenu, {
listItemIndex: { i: i, j: null, k: null },
isGeneralType: true,
iconType: 'menu',
iconColor: 'primary',
listType: 'B',
fieldId: dataSets.id,
targetedId: classifs.id,
fieldType: 'classifs',
colorPicker: false,
onShowSelectedAddFields: showSelectedField,
onOpenListMenuOpen: openListMenuOpen,
listOpenValue: classifs.listOpen,
})
"

          >
          </VListItem>

          <VCard :key="i" v-show="classifs.value" width="100%" class="pa-1">
            <VTextField
              hide-details="auto"
              density="compact"
              variant="outlined"
              v-model="clsInputText"
            />
            <div class="d-flex mt-2 justify-space-evenly">
              <div class="pr-4">
                <VBtn
                  size="x-small"
                  color="primary"
                  @click="() => addField('cls', classifs.id, dataSets.id, i, null)"
                  >OK</VBtn
                >
              </div>

              <VBtn
                @click="() => closeTextField(i)"
                size="x-small"
                class="text-primary bg-grey-lighten-3"
              >
                Abbrechen
              </VBtn>
            </div>
          </VCard>
        </template>

        <!-- classes-->

        <VListGroup
          v-if="classifs.classes"
          v-for="(clss, j) in classifs.classes"
          :key="j"
        >
          <template v-slot:activator="{ props }">
            <VListItem
              class="bg-blue-grey-lighten-5"
              v-bind="props"
              :title="clss.name"
              :prepend-icon="clss.listOpen ? 'mdi-chevron-up' : 'mdi-chevron-down'"
              :append-icon="
                () =>
                  h(ListMenu, {
                    isGeneralType: true,
                    listItemIndex: { i: i, j: j, k: null },
                    iconType: 'menu',
                    iconColor: 'primary',
                    listType: 'B',
                    fieldId: dataSets.id,
                    targetedId: clss.id,
                    fieldType: 'classItem',
                    colorPicker: false,
                    onShowSelectedAddFields: showSelectedField,
                  })
              "
              @click="() => (clss.listOpen = !clss.listOpen)"
            >
            </VListItem>

            <VCard key="j" v-if="clss" v-show="clss.value" width="100%" class="pa-1">
              <VTextField
                hide-details="auto"
                density="compact"
                variant="outlined"
                v-model="subClassInputText"
              />
              <div class="d-flex mt-2 justify-space-evenly">
                <div class="pr-4">
                  <VBtn
                    size="x-small"
                    color="primary"
                    @click="
                      () => addField('subClass', clss.id ?? '', dataSets.id, i, j)
                    "
                    >OK</VBtn
                  >
                </div>

                <VBtn
                  @click="() => closeSubTextField(i, j)"
                  size="x-small"
                  class="text-primary bg-grey-lighten-3"
                >
                  Abbrechen
                </VBtn>
              </div>
            </VCard>
          </template>

          <!-- subclasses-->

          <VListGroup
            v-if="clss.subclass"
            v-for="(subClss, k) in clss.subclass"
            :key="k"
          >
            <template v-slot:activator="{ props }">
              <VListItem
                :title="subClss.name"
                :append-icon="
                  () =>
                    h(ListMenu, {
                      isGeneralType: true,
                      listItemIndex: { i: i, j: j, k: k },
                      iconType: 'menu',
                      iconColor: 'primary',
                      listType: 'C',
                      fieldId: dataSets.id,
                      targetedId: subClss.id,
                      fieldType: 'subclass',
                      colorPicker: false,
                      onShowSelectedAddFields: showSelectedField,
                    })
                "
              >
              </VListItem>
            </template>
          </VListGroup>
        </VListGroup>
      </VListGroup>
     </VueDraggableNext> `
     
     `
     <script lang="ts">

import { defineComponent, PropType } from 'vue';
import { useAdminStore } from '~~/store';
import { v4 as uuid } from 'uuid';
import { IndexesIJK } from '../AdminTypes';
export default defineComponent({
name: 'ListMenu',
props: {
iconColor: {
required: false,
type: String,
default: 'primary',
},
iconType: {
required: true,
type: String as PropType<'menu' | 'add'>,
default: 'menu',
},
listType: {
required: false,
type: String as PropType<'A' | 'B' | 'C'>,
default: 'A',
},
targetedId: {
required: false,
type: String,
},
fieldType: {
required: false,
type: String as PropType<'classifs' | 'classItem' | 'subclass'>,
},
fieldId: {
required: true,
type: String,
},
colorPicker: {
required: true,
type: Boolean,
},
classificationType: {
required: false,
type: String as PropType<'PRIVATE' | 'LEGAL'>,
},
isGeneralType: {
require: false,
type: Boolean,
default: false,
},
listItemIndex: {
required: false,
type: Object as PropType,
default: null,
},
listOpenValue:{
required: true,
type: Boolean,
default: false
}
},
emits: ['showSelectedAddFields', 'updateClassifs', 'listMenuOpen'],
setup() {
const adminStore = useAdminStore();
return { adminStore };
},
data() {
return {
addDialogOpen: false,
newField: '',
listA: [
{ title: 'Löschen', value: 1 },
// { title: 'Bearbeiten', value: 2 },
],
listB: [
{ title: 'Hinzufügen', value: 1 },
{ title: 'Löschen', value: 2 },
// { title: 'Bearbeiten', value: 3 },
],
listC: [{ title: 'Löschen', value: 1 }],
};
},
methods: {
openFieldOverlay() {
this.addDialogOpen = true;
},

addItem() {
  const DTO = {
    id: uuid(),
    colorPicker: this.colorPicker,
    color: '',
    name: this.newField,
    fieldTypeClassificationId: this.fieldId,
    type: this.classificationType,
  };

  this.adminStore.addClassifsToFieldType(DTO);
  this.$emit('updateClassifs', { type: 'add', value: DTO });
  this.newField = '';
  this.addDialogOpen = false;
},
listAction(actionType: string) {
  if (actionType === 'Löschen' && this.targetedId && this.fieldType) {
    if (this.fieldType === 'classifs') {
      this.$emit('updateClassifs', {
        type: 'delete',
        value: this.targetedId,
      });
    }
    this.adminStore.deleteFieldType(
      this.fieldId,
      this.listItemIndex.i,
      this.listItemIndex.j,
      this.targetedId,
      this.fieldType,
    );
  } else if (actionType === 'Bearbeiten') {
    // this.$emit('triggerEditMode', true);
  } else {
    if (!this.isGeneralType) {
      this.addItem();
    } else {
      this.$emit('showSelectedAddFields', this.listItemIndex);
    }
  }
},
openListMenu() {
  this.$emit('listMenuOpen', {index: this.listItemIndex.i, listOpen: this.listOpenValue   })

}

},
});
</script>

Füge ein neues Feld hinzu
OK
      <VBtn
        size="small"
        class="text-primary bg-grey-lighten-3"
        @click="addDialogOpen = false"
        >Abbrechen</VBtn
      >
    </div>
  </VCard>
</VOverlay>
`

How to use sortablejs plugins

I want to use swap plugin like this https://github.com/SortableJS/Sortable/tree/master/plugins/Swap
but I don't know how or where to write the mount method

now my code is like this

<vue-draggable-next group="drapGroup" v-model="row.dropList" @change="dropChange($event, row, false)">
<div class="can-drop" v-for="item in row.dropList" :key="item.id">
	<div>{{item.name}}</div>
</div>
</vue-draggable-next>

<script setup>
import { VueDraggableNext } from 'vue-draggable-next'
...
</script>

what can i do next

sortablejs peerDependency is bundled in dist output

sortablejs is bundled in all but the TypeScript type definition files in /dist (https://www.jsdelivr.com/package/npm/vue-draggable-next?path=dist)

This leaves us with a missing peer dependency warning if we do not add it (which is annoying, but fine as we don't use TypeScript) or 7 copies of sortablejs if we install the peer dependency (the package and 6 copies of whichever version is bundled in a vue-draggable-next release)

It also has the side effect of the type definitions not being in sync with the version of sortablejs being used by vue-draggable-next for TypeScript users.

Can sortablejs be added as a dependency (preferred) or unbundle the peerDependency so the install instructions become (yarn add vue-draggable-next sortablejs)?

when use it in typescript ,it cannot be recognized correctly

image

My temporary solution is:

// shims-vue.d.ts
declare module "*.vue" {
    import { defineComponent } from "vue";
    const component: ReturnType<typeof defineComponent>;
    export default component;
}
// add
declare module "vue-draggable-next" {
    export { VueDraggableNext } from "vue-draggable-next/dist/src/index";
}

transition group no css effects

Im trying to implement the <transition-group> based on this demo https://vue-draggable-next.vercel.app/#/transition but no css effects. Did i miss something? Im using Nuxt 3 and here is my sample code

<table id="status-draggable">
            <thead>
                <th>Order</th>
                <th>Status Name</th>
                <th>Status Group</th>
            </thead>
            <tbody>
                <VueDraggableNext v-model="lists">
                    <transition-group>
                        <tr v-for="list in lists" :key="list.id">
                            <td>{{ list.id}}</td>
                            <td>{{ list.name }}</td>
                        </tr>
                    </transition-group>
                </VueDraggableNext>
            </tbody>
        </table>

and this is my lists.

const lists = ref([
    {
          id: 1,
         name: 'John Doe'
    },
   {
        id: 2,
       name: 'Peter Doe'
   }
])

Multi Drag

Are you planning to support Sortable's Multi option?

If you already support do you have an example that can be referenced, or is just a prop?

Unexpected mutation of "list" prop

Hi

<script setup>
  const list = ref([1,2,3])
</script>
<template>
  <Draggable :list="list"> <!-- <<< here -->
  ...

I expect: the list not will be change
Why? Because :list="list" is a prop

If we want to change, should work two ways:

  1. either
  <Draggable v-model="list">
  <Draggable :model-value="list2" @update:model-value="list2 = $event">
  1. or
  <Draggable :list="list" @change="manualChangeList">

but not

  <Draggable :list="list">

https://vuejs.org/guide/components/props.html#one-way-data-flow
I caught unexpected behavior, which gave rise to a couple of bugs in my code that I had to look for

On the problem of dragging elements across levels in tree recursive components

原来的move方法中是可以返回relatedContext参数的,其中能解构出 index,element,list,component,但是我在递归组件中跨层级移动元素relatedContext中只能解构出list,componet两个参数而且list值也不对,请您帮助我下,谢谢

The original move method can return relatedcontext parameters, in which ‘index’, ‘element’, ‘list’ and ‘component’ can be deconstructed, but I can only deconstruct ‘list’ and ‘component’ parameters in relatedcontext when I move elements across levels in recursive components, and the list value is also wrong. Please help me. Thank you

reimplement move prop

hello!
on the original vue.draggable library, there is a move property that allows a drag to be cancelled if the provided function returns false. it is implemented here in the original component.
this would be very helpful to have access to in this version. however, i realize that the original code used some functionality from vue 2 that isn't present anymore in vue-next, so you've left it stubbed in your code. would it be possible for you to make it at least run the function passed in the prop like it was before (like return onMove(evt, originalEvent);)?
thanks for your time!

Deep clone is not working

I am trying to deep clone the dragged object with nested childs, but it is not working.
When I change the dragged element's value, it mutates the original object. And all Draggable elements' value are being same after changing the dragged element.

 <VueDraggableNext
      class="dragArea list-group"
      :list="blocks"
      :group="{ name: 'people', pull: 'clone', put: false }"
      :sort="false"
      :clone="clone"
    >
 </VueDraggableNext>


function clone(e) {
  return JSON.parse(JSON.stringify(e));
}

"vue-draggable-next": "^2.1.1",

Ts error when assiging class to `draggable` attribute

Hello, I am getting a ts error on the draggable attribute (error shown below) and wondering what I can do here. I saw the draggable attribute on the Vue.Draggable library, but perhaps you just don't need it in your version?
The elements are all still draggable so maybe I can go without it?

Any input would be greatly appreciated!

Type '".machine"' is not assignable to type 'Booleanish | undefined'.
draggable=".machine"

ts error:
image

Section from the Vue.Draggable library using the draggable attribute:
image

Recommend Projects

  • React photo React

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

  • Vue.js photo Vue.js

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

  • Typescript photo Typescript

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

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

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

Recommend Topics

  • javascript

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

  • web

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

  • server

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

  • Machine learning

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

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

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

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.