├── .angular-cli.json
├── .editorconfig
├── .gitignore
├── README.md
├── circle.yml
├── e2e
├── app.e2e-spec.ts
├── app.po.ts
└── tsconfig.e2e.json
├── karma.conf.js
├── package.json
├── protractor.conf.js
├── src
├── app
│ ├── app.component.html
│ ├── app.component.scss
│ ├── app.component.spec.ts
│ ├── app.component.ts
│ ├── app.module.ts
│ └── services
│ │ ├── auto-draw.service.spec.ts
│ │ ├── auto-draw.service.ts
│ │ └── index.ts
├── assets
│ ├── .gitkeep
│ └── background.png
├── data
│ └── stencils.json
├── environments
│ ├── environment.prod.ts
│ └── environment.ts
├── favicon.ico
├── index.html
├── main.ts
├── polyfills.ts
├── styles.scss
├── test.ts
├── tsconfig.app.json
├── tsconfig.spec.json
└── typings.d.ts
├── tsconfig.json
└── tslint.json
/.angular-cli.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
3 | "project": {
4 | "name": "angular-autodraw"
5 | },
6 | "apps": [
7 | {
8 | "root": "src",
9 | "outDir": "dist",
10 | "assets": [
11 | "assets",
12 | "favicon.ico"
13 | ],
14 | "index": "index.html",
15 | "main": "main.ts",
16 | "polyfills": "polyfills.ts",
17 | "test": "test.ts",
18 | "tsconfig": "tsconfig.app.json",
19 | "testTsconfig": "tsconfig.spec.json",
20 | "prefix": "app",
21 | "styles": [
22 | "styles.scss"
23 | ],
24 | "scripts": [],
25 | "environmentSource": "environments/environment.ts",
26 | "environments": {
27 | "dev": "environments/environment.ts",
28 | "prod": "environments/environment.prod.ts"
29 | }
30 | }
31 | ],
32 | "e2e": {
33 | "protractor": {
34 | "config": "./protractor.conf.js"
35 | }
36 | },
37 | "lint": [
38 | {
39 | "project": "src/tsconfig.app.json"
40 | },
41 | {
42 | "project": "src/tsconfig.spec.json"
43 | },
44 | {
45 | "project": "e2e/tsconfig.e2e.json"
46 | }
47 | ],
48 | "test": {
49 | "karma": {
50 | "config": "./karma.conf.js"
51 | }
52 | },
53 | "defaults": {
54 | "styleExt": "scss",
55 | "component": {}
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # Editor configuration, see http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
11 | [*.md]
12 | max_line_length = off
13 | trim_trailing_whitespace = false
14 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See http://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # compiled output
4 | /dist
5 | /tmp
6 | /out-tsc
7 |
8 | # dependencies
9 | /node_modules
10 |
11 | # IDEs and editors
12 | /.idea
13 | .project
14 | .classpath
15 | .c9/
16 | *.launch
17 | .settings/
18 | *.sublime-workspace
19 |
20 | # IDE - VSCode
21 | .vscode/*
22 | !.vscode/settings.json
23 | !.vscode/tasks.json
24 | !.vscode/launch.json
25 | !.vscode/extensions.json
26 |
27 | # misc
28 | /.sass-cache
29 | /connect.lock
30 | /coverage
31 | /libpeerconnection.log
32 | npm-debug.log
33 | testem.log
34 | /typings
35 |
36 | # e2e
37 | /e2e/*.js
38 | /e2e/*.map
39 |
40 | # System Files
41 | .DS_Store
42 | Thumbs.db
43 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # AngularAutodraw
2 |
3 | AutoDraw is a Google’s AI experiment they launched few weeks ago which allows you to draw or at least to doodle anything you’d like to draw and then through AI and pre-trained artificial neural networks it recommends you possible icons you’d be looking for.
4 |
5 | This repo is the result of this blog post: [
6 | Integrating Google’s AutoDraw AI API with Angular](https://delgadillojuan.com/en/blog/integrating-googles-autodraw-ai-api-with-angular/?utm_source=Github&utm_medium=autodraw-repo) where you'll find more details how this code works.
7 |
8 | This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.0.0.
9 |
10 | ## Development server
11 |
12 | Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
13 |
14 | ## Code scaffolding
15 |
16 | Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive/pipe/service/class/module`.
17 |
18 | ## Build
19 |
20 | Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build.
21 |
22 | ## Running unit tests
23 |
24 | Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
25 |
26 | ## Running end-to-end tests
27 |
28 | Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
29 | Before running the tests make sure you are serving the app via `ng serve`.
30 |
31 | ## Further help
32 |
33 | To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
34 |
--------------------------------------------------------------------------------
/circle.yml:
--------------------------------------------------------------------------------
1 | machine:
2 | node:
3 | version: 6.9.0
4 |
--------------------------------------------------------------------------------
/e2e/app.e2e-spec.ts:
--------------------------------------------------------------------------------
1 | import { AngularAutodrawPage } from './app.po';
2 |
3 | describe('angular-autodraw App', () => {
4 | let page: AngularAutodrawPage;
5 |
6 | beforeEach(() => {
7 | page = new AngularAutodrawPage();
8 | });
9 |
10 | it('should display message saying app works', () => {
11 | page.navigateTo();
12 | expect(page.getParagraphText()).toEqual('app works!');
13 | });
14 | });
15 |
--------------------------------------------------------------------------------
/e2e/app.po.ts:
--------------------------------------------------------------------------------
1 | import { browser, element, by } from 'protractor';
2 |
3 | export class AngularAutodrawPage {
4 | navigateTo() {
5 | return browser.get('/');
6 | }
7 |
8 | getParagraphText() {
9 | return element(by.css('app-root h1')).getText();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/e2e/tsconfig.e2e.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "../out-tsc/e2e",
5 | "module": "commonjs",
6 | "target": "es5",
7 | "types":[
8 | "jasmine",
9 | "node"
10 | ]
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/karma.conf.js:
--------------------------------------------------------------------------------
1 | // Karma configuration file, see link for more information
2 | // https://karma-runner.github.io/0.13/config/configuration-file.html
3 |
4 | module.exports = function (config) {
5 | config.set({
6 | basePath: '',
7 | frameworks: ['jasmine', '@angular/cli'],
8 | plugins: [
9 | require('karma-jasmine'),
10 | require('karma-chrome-launcher'),
11 | require('karma-jasmine-html-reporter'),
12 | require('karma-coverage-istanbul-reporter'),
13 | require('@angular/cli/plugins/karma')
14 | ],
15 | client:{
16 | clearContext: false // leave Jasmine Spec Runner output visible in browser
17 | },
18 | files: [
19 | { pattern: './src/test.ts', watched: false }
20 | ],
21 | preprocessors: {
22 | './src/test.ts': ['@angular/cli']
23 | },
24 | mime: {
25 | 'text/x-typescript': ['ts','tsx']
26 | },
27 | coverageIstanbulReporter: {
28 | reports: [ 'html', 'lcovonly' ],
29 | fixWebpackSourcePaths: true
30 | },
31 | angularCli: {
32 | environment: 'dev'
33 | },
34 | reporters: config.angularCli && config.angularCli.codeCoverage
35 | ? ['progress', 'coverage-istanbul']
36 | : ['progress', 'kjhtml'],
37 | port: 9876,
38 | colors: true,
39 | logLevel: config.LOG_INFO,
40 | autoWatch: true,
41 | browsers: ['Chrome'],
42 | singleRun: false
43 | });
44 | };
45 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-autodraw",
3 | "version": "0.0.0",
4 | "license": "MIT",
5 | "scripts": {
6 | "ng": "ng",
7 | "start": "ng serve",
8 | "build": "ng build",
9 | "test": "ng test",
10 | "lint": "ng lint",
11 | "e2e": "ng e2e"
12 | },
13 | "private": true,
14 | "dependencies": {
15 | "@angular/common": "^4.0.0",
16 | "@angular/compiler": "^4.0.0",
17 | "@angular/core": "^4.0.0",
18 | "@angular/forms": "^4.0.0",
19 | "@angular/http": "^4.0.0",
20 | "@angular/platform-browser": "^4.0.0",
21 | "@angular/platform-browser-dynamic": "^4.0.0",
22 | "@angular/router": "^4.0.0",
23 | "core-js": "^2.4.1",
24 | "rxjs": "^5.1.0",
25 | "zone.js": "^0.8.4"
26 | },
27 | "devDependencies": {
28 | "@angular/cli": "1.0.0",
29 | "@angular/compiler-cli": "^4.0.0",
30 | "@types/jasmine": "2.5.38",
31 | "@types/node": "~6.0.60",
32 | "codelyzer": "~2.0.0",
33 | "jasmine-core": "~2.5.2",
34 | "jasmine-spec-reporter": "~3.2.0",
35 | "karma": "~1.4.1",
36 | "karma-chrome-launcher": "~2.0.0",
37 | "karma-cli": "~1.0.1",
38 | "karma-jasmine": "~1.1.0",
39 | "karma-jasmine-html-reporter": "^0.2.2",
40 | "karma-coverage-istanbul-reporter": "^0.2.0",
41 | "protractor": "~5.1.0",
42 | "ts-node": "~2.0.0",
43 | "tslint": "~4.5.0",
44 | "typescript": "~2.2.0"
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/protractor.conf.js:
--------------------------------------------------------------------------------
1 | // Protractor configuration file, see link for more information
2 | // https://github.com/angular/protractor/blob/master/lib/config.ts
3 |
4 | const { SpecReporter } = require('jasmine-spec-reporter');
5 |
6 | exports.config = {
7 | allScriptsTimeout: 11000,
8 | specs: [
9 | './e2e/**/*.e2e-spec.ts'
10 | ],
11 | capabilities: {
12 | 'browserName': 'chrome'
13 | },
14 | directConnect: true,
15 | baseUrl: 'http://localhost:4200/',
16 | framework: 'jasmine',
17 | jasmineNodeOpts: {
18 | showColors: true,
19 | defaultTimeoutInterval: 30000,
20 | print: function() {}
21 | },
22 | beforeLaunch: function() {
23 | require('ts-node').register({
24 | project: 'e2e/tsconfig.e2e.json'
25 | });
26 | },
27 | onPrepare() {
28 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
29 | }
30 | };
31 |
--------------------------------------------------------------------------------
/src/app/app.component.html:
--------------------------------------------------------------------------------
1 |
2 | Google's Autodraw AI API with Angular
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/src/app/app.component.scss:
--------------------------------------------------------------------------------
1 | .canvas {
2 | width: 365px;
3 | margin-bottom: 55px;
4 | vertical-align: top;
5 |
6 | canvas {
7 | border: 1px solid #B3C8B6;
8 | display: block;
9 | background-color: white;
10 | }
11 |
12 | .clear-canvas-button {
13 | margin-top: 10px;
14 | padding: 7px;
15 | font-size: 16px;
16 | border-radius: 5px;
17 | color: white;
18 | background-color: #ff4f75;
19 | cursor: pointer;
20 | position: absolute;
21 | margin-bottom: 40px;
22 | outline: none;
23 | }
24 | }
25 |
26 | .canvas, .autodraw-results, {
27 | margin-top: 45px;
28 | margin-left: 40px;
29 |
30 | }
31 |
32 | .canvas, .autodraw-results, canvas {
33 | border-radius: 10px;
34 | display: inline-block;
35 | }
36 |
37 | .autodraw-results {
38 | width: 650px;
39 | height: 350px;
40 | overflow-y: auto;
41 | background-color: white;
42 | box-shadow: 0px 1px 8px #B3C8B6;
43 | }
44 |
45 | .autodraw-image {
46 | border: 1px solid #B3C8B6;
47 | display: inline-block;
48 | width: 90px;
49 | height: 90px;
50 | padding: 0;
51 | margin: 5px;
52 | cursor: pointer;
53 | }
54 |
--------------------------------------------------------------------------------
/src/app/app.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { TestBed, async } from '@angular/core/testing';
2 | import { HttpModule } from '@angular/http';
3 |
4 | import { AppComponent } from './app.component';
5 | import { AutoDrawService } from './services';
6 |
7 | describe('AppComponent', () => {
8 | beforeEach(async(() => {
9 | TestBed.configureTestingModule({
10 | declarations: [
11 | AppComponent
12 | ],
13 | imports: [
14 | HttpModule
15 | ],
16 | providers: [
17 | AutoDrawService
18 | ]
19 | }).compileComponents();
20 | }));
21 |
22 | it('should create the app', async(() => {
23 | const fixture = TestBed.createComponent(AppComponent);
24 | const app = fixture.debugElement.componentInstance;
25 | expect(app).toBeTruthy();
26 | }));
27 | });
28 |
--------------------------------------------------------------------------------
/src/app/app.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core';
2 | import { Subscription } from 'rxjs/Subscription';
3 | import { Observable } from 'rxjs/Observable';
4 | import { AutoDrawService } from './services';
5 | import 'rxjs/add/observable/fromEvent';
6 |
7 | @Component({
8 | selector: 'app-root',
9 | templateUrl: './app.component.html',
10 | styleUrls: ['./app.component.scss']
11 | })
12 | export class AppComponent implements OnInit, OnDestroy {
13 |
14 | constructor (
15 | private autoDrawService: AutoDrawService
16 | ) {}
17 |
18 | @ViewChild('canvas') canvas;
19 |
20 | drawSuggestions: Array