segmentio / daydream Goto Github PK
View Code? Open in Web Editor NEWA chrome extension to record your actions into a nightmare or puppeteer script
Home Page: https://open.segment.com
A chrome extension to record your actions into a nightmare or puppeteer script
Home Page: https://open.segment.com
Hi there,
Your extension is awesome, something i was looking for. I was playing with https://github.com/ebrehault/resurrectio which is for Casperjs.
Anyway, check the screenshot below how styled code i got. Tell me is this normal, or should be nice like on ur screenshot.
that is all.
Hi!
I tried the extension and I am curious about the behaviour of the content script. I tried to run the extension on a react app, and I noticed that it could not record me typing stuff into the input box.
I've added a few console.log statements to see what's happening, and this part:
const inputs = document.querySelectorAll('input, textarea')
console.log('inputs', inputs)
returns 0. Basically, it means that it tries to bind the listeners before the react app has actually booted, hence no inputs exist on the page.
Is there a reason why the extension works this way? Wouldn't it be better for the content script to bind listeners only once the badge has been clicked? At least the user would be aware whether or not DOM has completely loaded.
The documentation says that in order to capture text from an input, you have to press the Tab key.
It works fine when the page only has one input.
But for example, on a login form when you press Tab key, the focus jumps to the next input and the text doesn't get captured in Daydream.
The last input's text gets captured as expected.
would be sweet to get a.js working in here so that we have a canonical example to point our customers to!
Neither Nightmare nor Puppeteer tabs work anymore. I assume something is wrong with catching events? Anyone else is also experiencing?
Ran into the following issue when running make
Can you help out?
Cloning into 'daydream'...
remote: Counting objects: 663, done.
remote: Total 663 (delta 0), reused 0 (delta 0), pack-reused 663
Receiving objects: 100% (663/663), 3.74 MiB | 806.00 KiB/s, done.
Resolving deltas: 100% (336/336), done.
Checking connectivity... done.
npm WARN deprecated [email protected]: Jade has been renamed to pug, please install the latest version of pug instead of jade
npm WARN deprecated [email protected]: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
npm WARN deprecated [email protected]: graceful-fs v3.0.0 and before will fail on node releases >= v7.0. Please update to graceful-fs@^4.0.0 as soon as possible. Use 'npm ls graceful-fs' to find it in the tree.
npm WARN deprecated [email protected]: use uuid module instead
npm WARN deprecated [email protected]: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
npm WARN deprecated [email protected]: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
[email protected] /Users/mtaylor/dev/labs/daydream
└─┬ [email protected]
├── [email protected]
├─┬ [email protected]
│ └── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├─┬ [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ └── [email protected]
├─┬ [email protected]
│ └── [email protected]
├─┬ [email protected]
│ └── [email protected]
├─┬ [email protected]
│ └── [email protected]
├── [email protected]
├─┬ [email protected]
│ └── [email protected]
├── [email protected]
├── [email protected]
├─┬ [email protected]
│ └─┬ [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ └── [email protected]
├─┬ [email protected]
│ └─┬ [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ └─┬ [email protected]
│ └── [email protected]
├─┬ [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ └─┬ [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ ├─┬ [email protected]
│ │ │ │ │ └── [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ └── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ ├─┬ [email protected]
│ │ │ │ │ └── [email protected]
│ │ │ │ └── [email protected]
│ │ │ └─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ └── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ └── [email protected]
│ │ │ └─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ └── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ └── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ └─┬ [email protected]
│ │ │ │ └── [email protected]
│ │ │ └── [email protected]
│ │ └─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ └── [email protected]
│ │ └── [email protected]
│ └── [email protected]
├── [email protected]
├─┬ [email protected]
│ └── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ └── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ └─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ └─┬ [email protected]
│ │ │ └── [email protected]
│ │ └─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ └── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ └─┬ [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ └─┬ [email protected]
│ │ │ │ └── [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected] (git://github.com/component/queue.git#23dbce0f19a714b020b4fc52ed07ac0365c9b449)
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ └─┬ [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├─┬ [email protected]
│ │ │ │ │ └── [email protected]
│ │ │ │ ├─┬ [email protected]
│ │ │ │ │ └─┬ [email protected]
│ │ │ │ │ ├── [email protected]
│ │ │ │ │ └── [email protected]
│ │ │ │ └── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ └── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ └─┬ [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├─┬ [email protected]
│ │ │ │ │ └── [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ └── [email protected]
│ │ │ ├── [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ └── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ └── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ └── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ └── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ └─┬ [email protected]
│ └── [email protected]
├─┬ [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ └─┬ [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └─┬ [email protected]
│ │ └── [email protected]
│ └── [email protected]
├── [email protected]
├─┬ [email protected]
│ ├─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ └── [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ └── [email protected]
├── [email protected]
├─┬ [email protected]
│ └─┬ [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected] (git://github.com/ariya/esprima.git#a65a3eb93b9a5dce9a1184ca2d1bd0b184c6b8fd)
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ └── [email protected]
├── [email protected]
├─┬ [email protected]
│ └─┬ [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ └── [email protected]
├─┬ [email protected]
│ └─┬ [email protected]
│ └── [email protected]
├─┬ [email protected]
│ └── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
└── [email protected]
npm WARN [email protected] No license field.
building : lib/foreground/popup/index.js
installed : [email protected]
installed : [email protected]
installed : [email protected]
error : TypeError: Path must be a string. Received undefined
at assertPath (path.js:7:11)
at extname (path.js:1433:5)
at extension (/Users/mtaylor/dev/labs/daydream/node_modules/duo-main/index.js:135:10)
at dependency (/Users/mtaylor/dev/labs/daydream/node_modules/duo-main/index.js:83:16)
at coerce (/Users/mtaylor/dev/labs/daydream/node_modules/duo-main/index.js:31:7)
at Duo.resolve (/Users/mtaylor/dev/labs/daydream/node_modules/duo/lib/duo.js:716:22)
at next (native)
at next (/Users/mtaylor/dev/labs/daydream/node_modules/co/index.js:74:21)
at Duo.<anonymous> (/Users/mtaylor/dev/labs/daydream/node_modules/co/index.js:45:5)
at Duo.next (/Users/mtaylor/dev/labs/daydream/node_modules/co/index.js:90:21)
make: *** [build] Error 1
➜ daydream git:(master) make
make: Nothing to be done for `default'.```
The Chrome Extension Generates almost the same code, so what's the difference?
:)
Example:
In order to record "cool project", you have to press "Tab" key.
=> OK
Now, how can we submit the form ? There is no "Submit" button on the page and daydream doesn't record neither the "Enter" key pressed nor the submitted text if "tab" key is not pressed.
Thank you
I see that analytics.js is mentioned in the readme, and also listed as dependency in package.json, but I can't find it's use anywhere in the codebase. How is it being used?
I want to add tracking to a chrome extension so I'm trying to find examples for it. Isn't exposing our write a security issue?
when I follow your step,I meet this problem:
error : Error: Command failed: /bin/sh -c git ls-remote --tags --heads https://github.com/component/emitter
error: The requested URL returned error: 403 while accessing https://github.com/component/emitter/info/refs
how can i resolve it ? Thank you
Hi guys.
Does this extension support navigation to a new browser tab? As I tested, It seems when user clicks on a link to open it on a new tab, recording is stopped there. Is there any workaround for that?
now that we have a good solution for people writing chrome extensions would be good to have an example to show them: https://github.com/segmentio/analytics-node/blob/master/analytics-node.js
Attempting to automate login:
After entering a card number and pressing tab, the tab freezes and eventually says "Woops.. something went wrong".
Entering a card number and pressing tab works as expected when not recording actions via daydream.
https://chrome.google.com/webstore/detail/daydream/oajnmbophdhdobfpalhkfgahchpcoali
THis link does not work anymore please update it! :)
building : lib/foreground/popup/index.js
/Volumes/Data/chrome/daydream/node_modules/duo/node_modules/step.js/index.js:87
co(fn).apply(ctx, args.concat(next));
^
TypeError: Object # has no method 'apply'
at call (/Volumes/Data/chrome/daydream/node_modules/duo/node_modules/step.js/index.js:87:14)
at null._onTimeout (/Volumes/Data/chrome/daydream/node_modules/duo/node_modules/step.js/index.js:68:5)
at Timer.listOnTimeout as ontimeout
make: *** [build] Error 8
Hi!
Really love the idea of the Daydream Chrome extension!
However each time I try to use it, following the instructions in https://github.com/segmentio/daydream#usage only one single action/step gets recorded ...
When I click on the black daydream
icon it turns green, but as soon as I perform any action on the page e.g. click a link the daydream
icon turns black again and stops recording. 😢
I'm running Chrome Version 56.0.2924.87 (64-bit) for Mac OS Sierra 10.12.3 (16D32)
(both OS and Chrome are the latest versions)
I must be doing something wrong but I cannot figure out what! I've tried deleting the plugin and re-installing it from the Chrome Store but not had luck so far.
Any help diagnosing this would be much appreciated!
There's a bit on analytics-node in the README, which I think is leftover from a scaffolder or something. A quick run-through about how to use it couldn't hurt either.
Cool extension otherwise though!
Not able to generate any recordings. Took a look at the background page console and saw a bunch of errors.
Unrecognized Content-Security-Policy directive 'https://*.segment.com'.
Unchecked runtime.lastError while running tabs.executeScript: Cannot access contents of url "chrome-devtools://devtools/bundled/inspector.html?remoteBase=https://chrome-devtools-frontend.appspot.com/serve_file/@dc3469be277cc962ba01d9c0cb5bb1a265676c36/&dockSide=undocked". Extension manifest must request permission to access this host.
Unchecked runtime.lastError while running tabs.executeScript: Cannot access a chrome-extension:// URL of different extension at Recorder.handleCompletedNavigation (eval at 248 (chrome-extension://oajnmbophdhdobfpalhkfgahchpcoali/background.js:761:1), <anonymous>:46:21)
Unchecked runtime.lastError while running tabs.executeScript: Cannot access a chrome:// URL at Recorder.handleCompletedNavigation (eval at 248 (chrome-extension://oajnmbophdhdobfpalhkfgahchpcoali/background.js:761:1), <anonymous>:46:21)
OSX Chrome Version 65.0.3325.181 (Official Build) (64-bit)
This appears to only support standard "input" elements. Would it not be possible to bind to the value changed event for inputs to handle support for things like checkboxes or input buttons? I'm using this to test asp webforms and the default button is an and this isn't picking up their clicks. This could support the following list of types fairly easily. https://www.w3schools.com/tags/att_input_type.asp
I'm developing an electron base app from this template.
I notice that if I can make the e2e-test by just record it (then tweak it a little) then that will save development time a lot.
Can I install daydream in electron like devtron or vue-devtools?
After #10 is finished, add feature to replay recordings
https://chrome.google.com/webstore/detail/daydream/oajnmbophdhdobfpalhkfgahchpcoali
Title + screenshots could be updated
A chrome extension to record your actions into a nightmare script.
To
A chrome extension to record your actions into a nightmare or puppeteer script
First of all, I really really really really really appreciate for building such an awesome tool.
sometimes I don't see the results so question - why can't i see the code being generated inside the day dream icon while its working ?
This will help me make sure that the button is clicked , or any other event ?
Type I'm feeling lucky into an input field, and the generated output is not escaped
Actual
.type('input', 'I'm feeling lucky')
Expected
.type('input', 'I'm feeling lucky')
Was not supporting typing passwords intentional?
I haven't tried the addon yet--I just got home, but I noticed in your screenshot and in https://github.com/segmentio/daydream/blob/master/src/popup/components/App.js#L84 that the puppeteer output contains an ASI hazard. specifically the ident/function call and IIFE one.
perhaps prepend the IIFE with a semicolon? ;(async () => ...etc
I'd like to be able to record an entire user session, similar to how a tool like Hotjar or Mouseflow does session recording / replays, and be able to replay that session through nightmare to perfectly simulate a real user session.
Any plans on implementing this? If not, anyone aware of any other libraries that can help me accomplish this?
Thanks!
Daydream isn't capturing text input for me, only clicks. Running Chrome Version 50.0.2661.102 (64-bit) on Mac OS X 10.11, Daydream Version: 2.1.1.
Steps to reproduce:
Go to Github.com
Click Daydream Icon
Click Search box
Type in any text.
Press Enter
Click Daydream Icon again.
Result:
var Nightmare = require('nightmare');
yield Nightmare()
.click('html..is-copy-enabled.emoji-size-boost.is-u2f-enabled body.logged-in.env-production.macintosh.page-dashboard div.header.header-logged-in.true div.container.clearfix div.header-search.js-site-search form.js-site-search-form label.form-control.header-search-wrapper.js-chromeless-input-container.focus input.form-control.header-search-input.js-site-search-focus.')
There's no input to be found. Similar results can be achieved through any normal input box as well.
How to use your extension? I just need to record a few consecutive mouse clicks and make them repeat at the right time.
Add feature to save recordings for future use
Idea:
cssPath
is currently doing).Able to replicate this issue on both:
System: Ubuntu 16.04, Chrome Version 65.0.3325.146 (Official Build) (64-bit)
System: Windows 10, Version 64.0.3282.186 (Official Build) (64-bit)
Example 1: Google. Navigate to google, click on input, add text, search. Daydream is only returning
const Nightmare = require('nightmare')
const nightmare = Nightmare({ show: true })
nightmare
.goto('https://www.google.com/')
.end()
.then(function (result) {
console.log(result)
})
.catch(function (error) {
console.error('Error:', error);
});
and
const puppeteer = require('puppeteer')
(async () => {
const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.goto('https://www.google.com/')
await browser.close()
})()
Example 2: Github. Navigate to github daydream repository, click on search input for this repository, add text, search. Daydream is only returning:
const Nightmare = require('nightmare')
const nightmare = Nightmare({ show: true })
nightmare
.goto('https://github.com/segmentio/daydream')
.end()
.then(function (result) {
console.log(result)
})
.catch(function (error) {
console.error('Error:', error);
});
and
const puppeteer = require('puppeteer')
(async () => {
const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.goto('https://github.com/segmentio/daydream')
await browser.close()
})()
Tried the same on Wikipedia and Wiktionary with the same results.
Is there a way to record a path that spans multiple pages? The idea is that I have a site that is not a single page app, and I click on links that will refresh the page.
This might be of interest to visitors! I'm building puppeteer recorder to record Puppeteer scripts. See it as a spiritual successor to Daydream. As of writing, it is in alpha and not published on the Chrome Store yet, but it's actively being developed so I won't be too long.
Feature requests are welcome! 😀
I'm clicking the record button, doing things, but all it reports is the basic template.
Let me know what information you need.
when i try to click buttons on a page, it doesn capture it..
Please help me I really need it to work
const Nightmare = require('nightmare')
const nightmare = Nightmare({ show: true })
nightmare
.end()
.then(function (result) {
console.log(result)
})
.catch(function (error) {
console.error('Error:', error);
});
restart
Give the user the option to add their own custom query function (in place of what csspath is doing)
Is there a way to shorten the selectors generated by Daydream? Or a way to let Daydream know when to generate relative selector paths? Here is a snippet of a generated click:
.click(
'html..js.flexbox.flexboxlegacy.canvas.canvastext.webgl.no-touch.geolocation.postmessage.websqldatabase.indexeddb.hashchange.history.draganddrop.websockets.rgba.hsla.multiplebgs.backgroundsize.borderimage.borderradius.boxshadow.textshadow.opacity.cssanimations.csscolumns.cssgradients.cssreflections.csstransforms.csstransforms3d.csstransitions.fontface.generatedcontent.video.audio.localstorage.sessionstorage.webworkers.applicationcache.svg.inlinesvg.smil.svgclippaths body div.header-nav div.container div.top-main-nav.navbar.navbar-inverse div.navbar-inner.container div.nav-collapse.collapse ul#megamenu.nav li#toys.dropdown.main-nav-item.mmenu-item.activated a.main-nav-item'
)
This was generated by clicking the "issues" link in this github repositoty:
click('html..is-copy-enabled.is-u2f-enabled body.logged_in.env-production.macintosh.vis-public div.main-content div div#js-repo-pjax-container.context-loader-container.js-repo-nav-next div.pagehead.repohead.instapaper_ignore.readability-menu.experiment-repo-nav div.container nav.reponav.js-repo-nav.js-sidenav-container-pjax.js-octicon-loaders a.js-selected-navigation-item.reponav-item')
This is huge und unnecessary. Any ideas? Thanks
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.