nickschot / ember-mobile-menu Goto Github PK
View Code? Open in Web Editor NEWA draggable sidebar menu for Ember
Home Page: https://nickschot.github.io/ember-mobile-menu
License: MIT License
A draggable sidebar menu for Ember
Home Page: https://nickschot.github.io/ember-mobile-menu
License: MIT License
At this time it's really only used for the very compact Tween implementation it provides. Two options:
I've been thinking of a way to improve the usability of this addon on desktop browsers. I'm thinking of the following:
I'm aware this does not cover all use cases (yet?). Input is welcome!
To be considered: a mode where the sidebar pushes the content (like on emberlcear.io. cc @NullVoxPopuli ) where gestures can still be enabled (i.e. for ipad use). The downside of this mode (which I have used in the past too) is that it causes many many reflows resulting in a degraded framerate for the duration of the animation. I used to partially cover this up by delaying the resize of the main content until after the sidebar transition is done. This still gives good animated feel, but has better performance.
Hi.
ember install ember-mobile-menu
installs the latest release from npm. v2.1.1
is quite far behind master (with quite some outdated dependencies).
Especially ember-concurrency
needs an update to support ember 4. (master
may actually also need an update to ember-concurrency v2.2.0
).
Not sure about the plans/status regarding new releases and/or supporting ember 4, so asking here before making possible PRs, @nickschot.
When SASS is not present, import the base structural css automatically.
Some challenges:
Result:
in v1 this was intertwined with ember-mobile-core's lockPan function & panning service. I'd like to make this more general and decouple from ember-mobile-core.
We'll like need:
Investigate:
One of my projects need this feature which requires the menu to overlay all the contents below.
When running an app with ember-mobile-menu 3.0.0-beta.3
from embroider 1.5.0
and ember-source 4.3.0
, I get the following error:
TypeError: Cannot read properties of undefined (reading 'extend') at
eval (webpack://webapp/./node_modules/ember-mobile-menu/components/mobile-menu/link-to.js?:15:143)
Maybe be related to #229? or some build / package.json entanglement happening with the recent migration to monorepo? (I see there is a package.json
both in root and in /addon
). Please tell me if you are not able to reproduce โ I'll try to create a minimal reproduction.
The addon uses https://github.com/wnr/element-resize-detector under the hood which is quite a big library. Maybe we can use something simpler (for modern browsers).
Hi,
In demo page is menu shown in like div rectangle. I would like to show menu in position relative div but it is always shown over whole page. How can I achieve it?
Currently you can only close these menus through a drag or a click on a menu item.
Should implement a willDestroy hook which disables body-scroll-lock.
When using this addon in Fastboot it currently errors because a dependency is not whitelisted. This is actually a dependency of another addon ember-useragent
of this addon.
Possible solutions I can think of right now:
ember-useragent
as a package to the app in the blueprint of the addonua-parser-js
again (ugly?) in this addonRelated:
The ember-usable
ref in package.json is problematic when referencing ember-mobile-menu
in a project using Yarn 2.
The commit must be referenced with its entire 40 chars.
This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.
These updates are awaiting their schedule. Click on a checkbox to get an update now.
These updates have all been created already. Click a checkbox below to force a retry/rebase of any.
.github/workflows/ci.yml
actions/checkout v3
pnpm/action-setup v2.2.4
actions/setup-node v3
actions/checkout v3
pnpm/action-setup v2.2.4
actions/setup-node v3
actions/checkout v3
pnpm/action-setup v2.2.4
actions/setup-node v3
addon/package.json
@ember/legacy-built-in-components ^0.4.1
@ember/render-modifiers ^2.0.0
@ember/test-waiters ^3.0.0
@glimmer/component ^1.0.4
@glimmer/tracking ^1.0.4
body-scroll-lock ^3.0.1
ember-auto-import ^2.2.4
ember-cli-babel ^7.26.11
ember-cli-htmlbars ^6.0.1
ember-concurrency ^2.1.0
ember-could-get-used-to-this ^1.0.0
ember-gesture-modifiers ^3.0.0
ember-on-resize-modifier ^1.0.0
ember-set-body-class ^1.0.1
tracked-maps-and-sets ^3.0.0
wobble ^1.5.1
babel-eslint 10.1.0
ember-source 4.8.0
ember-template-lint 4.16.1
eslint 7.32.0
eslint-config-prettier 8.5.0
eslint-plugin-ember 11.1.0
eslint-plugin-node 11.1.0
eslint-plugin-prettier 4.2.1
eslint-plugin-qunit 7.3.1
npm-run-all 4.1.5
prettier 2.7.1
sass 1.55.0
webpack 5.74.0
ember-source *
node 14.* || >= 16
docs/package.json
@ember/optional-features 2.0.0
@ember/test-helpers 2.8.1
@glimmer/component 1.1.2
@glimmer/tracking 1.1.2
babel-eslint 10.1.0
broccoli-asset-rev 3.0.0
ember-auto-import 2.4.3
ember-cli 4.7.0
ember-cli-addon-docs 5.0.0
ember-cli-addon-docs-yuidoc 1.0.0
ember-cli-babel 7.26.11
ember-cli-dependency-checker 3.3.1
ember-cli-deploy 1.0.2
ember-cli-deploy-build 2.0.0
ember-cli-deploy-git 1.3.4
ember-cli-deploy-git-ci 1.0.1
ember-cli-htmlbars 6.1.1
ember-cli-inject-live-reload 2.1.0
ember-cli-sass 11.0.1
ember-cli-sri 2.1.1
ember-cli-terser 4.0.2
ember-data 4.7.3
ember-disable-prototype-extensions 1.1.3
ember-export-application-global 2.0.1
ember-load-initializers 2.1.2
ember-page-title 7.0.0
ember-qunit 6.0.0
ember-resize-observer-polyfill 0.0.1
ember-resolver 8.0.3
ember-source 4.8.0
ember-source-channel-url 3.0.0
ember-template-lint 4.16.1
ember-try 2.0.0
eslint 7.32.0
eslint-config-prettier 8.5.0
eslint-plugin-ember 11.1.0
eslint-plugin-node 11.1.0
eslint-plugin-prettier 4.2.1
eslint-plugin-qunit 7.3.1
loader.js 4.7.0
npm-run-all 4.1.5
prettier 2.7.1
qunit 2.19.2
qunit-dom 2.0.0
sass 1.55.0
webpack 5.74.0
node 14.* || >= 16
package.json
release-it 15.5.0
node 16.18.0
test-app/package.json
@ember/optional-features 2.0.0
@ember/test-helpers 2.8.1
@embroider/test-setup 1.8.3
@glimmer/component 1.1.2
@glimmer/tracking 1.1.2
babel-eslint 10.1.0
broccoli-asset-rev 3.0.0
ember-auto-import 2.4.3
ember-cli 4.7.0
ember-cli-babel 7.26.11
ember-cli-dependency-checker 3.3.1
ember-cli-htmlbars 6.1.1
ember-cli-inject-live-reload 2.1.0
ember-cli-sass 11.0.1
ember-cli-sri 2.1.1
ember-cli-terser 4.0.2
ember-disable-prototype-extensions 1.1.3
ember-export-application-global 2.0.1
ember-load-initializers 2.1.2
ember-page-title 7.0.0
ember-qunit 6.0.0
ember-resolver 8.0.3
ember-sinon 5.0.0
ember-sinon-qunit 6.0.0
ember-source 4.8.0
ember-source-channel-url 3.0.0
ember-template-lint 4.16.1
ember-try 2.0.0
eslint 7.32.0
eslint-config-prettier 8.5.0
eslint-plugin-ember 11.1.0
eslint-plugin-node 11.1.0
eslint-plugin-prettier 4.2.1
eslint-plugin-qunit 7.3.1
loader.js 4.7.0
npm-run-all 4.1.5
prettier 2.7.1
qunit 2.19.2
qunit-dom 2.0.0
sass 1.55.0
webpack 5.74.0
node 14.* || >= 16
.github/workflows/ci.yml
pnpm 7.13.5
just reading this page:
https://nickschot.github.io/ember-mobile-menu/versions/v2.0.0-beta.1/docs/usage
I don't use sass.
is there a way to have the compiled CSS used?
We only really have to make these calls if the MobileMenuWrapper element gets resized.
Currently the mobile-menu--open classes is set on the body which puts an overflow hidden on it so scroll is disabled. Great for mobile & certain modes, but not for desktop without mask or for squeeze modes.
Currently using <MobileMenu class='...'>
sets it on the container. I'd love to use tailwind to style the tray.
Is there a way to keep the menu visible and locked in desktop layout, but then toggle in mobile layout?
Menu immediately closes when you try this. We should fix this by cancelling the animation & taking the current position as the starting position for the pan handler.
Right now two things seem broken
I'm getting the following error when running in fastboot.
My Error:
window.addEventListener is not a function
TypeError: window.addEventListener is not a function
at eval (webpack://__ember_auto_import__/../node_modules/body-scroll-lock/lib/bodyScrollLock.esm.js?:30:10)
at Module.../node_modules/body-scroll-lock/lib/bodyScrollLock.esm.js (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/vendor.js:130247:1)
at __webpack_require__ (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/vendor.js:130089:30)
at Module.eval [as callback] (webpack://__ember_auto_import__//private/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/cache-732-bundler/staging/app.js?:22:51)
at Module.exports (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/vendor/loader/loader.js:106:1)
at Module._reify (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/vendor/loader/loader.js:143:1)
at Module.reify (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/vendor/loader/loader.js:130:1)
at Module.exports (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/vendor/loader/loader.js:104:1)
at Module._reify (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/vendor/loader/loader.js:143:1)
at Module.reify (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/vendor/loader/loader.js:130:1)
at Module.exports (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/vendor/loader/loader.js:104:1)
at requireModule (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/vendor/loader/loader.js:27:1)
at Class._extractDefaultExport (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/addon-tree-output/ember-resolver/resolvers/classic/index.js:463:1)
at Class.resolveOther (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/addon-tree-output/ember-resolver/resolvers/classic/index.js:123:1)
at Class.resolve (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/addon-tree-output/ember-resolver/resolvers/classic/index.js:186:1)
at resolve (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/container/index.js:1197:34)
at Registry.resolve (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/container/index.js:744:19)
at Registry.resolve (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/container/index.js:747:31)
at factoryFor (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/container/index.js:296:36)
at Container.factoryFor (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/container/index.js:215:12)
at Class.factoryFor (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/runtime/lib/mixins/container_proxy.js:126:31)
at componentFor (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/glimmer/index.js:8074:16)
at lookupComponentPair (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/glimmer/index.js:8083:19)
at lookupComponent (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/glimmer/index.js:8120:10)
at RuntimeResolver._lookupComponentDefinition (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/glimmer/index.js:8411:16)
at RuntimeResolver.lookupComponentHandle (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/glimmer/index.js:8233:35)
at CompileTimeResolver.lookupComponent (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/glimmer/index.js:2564:42)
at DefaultCompileTimeResolverDelegate.lookupComponent (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/opcode-compiler.js:122:34)
at resolveLayoutForTag (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/opcode-compiler.js:165:28)
at IfResolvedComponent (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/opcode-compiler.js:838:19)
at compileOp (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/opcode-compiler.js:743:14)
at pushCompileOp (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/opcode-compiler.js:705:29)
at concatStatements (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/opcode-compiler.js:1349:7)
at compileStatements (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/opcode-compiler.js:2050:5)
at maybeCompile (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/opcode-compiler.js:2039:16)
at CompilableTemplateImpl.compile (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/opcode-compiler.js:2019:12)
at JitVM.compile (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/runtime.js:5866:37)
at Object.evaluate (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/runtime.js:2645:19)
at AppendOpcodes.evaluate (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/runtime.js:1953:17)
at LowLevelVM.evaluateSyscall (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/runtime.js:4856:20)
at LowLevelVM.evaluateInner (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/runtime.js:4812:12)
at LowLevelVM.evaluateOuter (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/runtime.js:4804:12)
at JitVM.next (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/runtime.js:5751:22)
at TemplateIteratorImpl.next (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/runtime.js:5878:20)
at RootState.render (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/glimmer/index.js:8594:35)
at runInAutotrackingTransaction (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/validator.js:74:7)
at /var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/glimmer/index.js:8886:13
at inTransaction (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@glimmer/runtime.js:1908:7)
at InertRenderer._renderRoots (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/glimmer/index.js:8862:7)
at InertRenderer._renderRootsTransaction (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/glimmer/index.js:8921:12)
at InertRenderer._renderRoot (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/glimmer/index.js:8849:10)
at InertRenderer._appendDefinition (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/glimmer/index.js:8764:10)
at InertRenderer.appendOutletView (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/@ember/-internals/glimmer/index.js:8750:10)
at invokeWithOnError (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/backburner.js:275:24)
at Queue.flush (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/backburner.js:182:21)
at DeferredActionQueues.flush (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/backburner.js:341:27)
at Backburner._end (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/backburner.js:785:38)
at Backburner._boundAutorunEnd (/var/folders/95/z8nqp5t559g3g25s412gjft00000gn/T/broccoli-84775T52kzy8gpBPQ/out-733-append_ember_auto_import_analyzer/assets/backburner.js:516:18)
at processTicksAndRejections (internal/process/task_queues.js:95:5)
I think the following block within this file needs to be gated to only run in the browser and not in fastboot.
@action
toggleBodyScroll(target, [isClosed]) {
if (this.args.preventScroll && !this.args.embed) {
if (isClosed) {
enableBodyScroll(target);
} else {
disableBodyScroll(target);
}
}
I think the root of this issue is in this line from body-scroll-lock.
This is not supported at this moment and will unfortunately require substantial work.
Hi. I experience janky menu closing transitions whenever I'm entering a route that kicks off heavy rendering calculations. (the menu stops halfway until the entered route is finished with its heavy calculations)
I've thought of different ways to work around this with different ways to block heavy rendering until the menu is closed. All feels quite hackish:
a) keep track of the isOpen state whenever onToggle
fires, e.g. by tracking mobileMenuIsOpen
on the application controller
b) Listen for transitionend
event or similar on the mobile menu DOM-element (if possible?)
c) hard code a delay for safety
Then I saw that https://motion.dev/ promotes the safety of HW-accelerated transitions when doing heavy work on the main thread. @nickschot I know that you have some oversight on the Web Animations API and wanted to ask you if there are some simple tricks to be used to avoid the closing transition issue mentioned above? If not, maybe you know a more elegant way to use the ember-mobile-menu API make sure its transitions can finish before other blocking JS can start?
Thanks a lot,
Johan
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.