Initial commit

This commit is contained in:
zhongjin
2020-06-15 10:58:47 +08:00
commit 4f1dfe7564
8590 changed files with 1516878 additions and 0 deletions
@@ -0,0 +1,19 @@
<div class="Modal">
<div class="Modal-header">
<div class="Modal-headerContainer">
<h2 class="CDB-Text CDB-Size-huge is-light u-bSpace"><%- _t('components.modals.add-analysis.modal-title') %></h2>
<h3 class="CDB-Text CDB-Size-medium u-secondaryTextColor"><%- _t('components.modals.add-analysis.modal-desc') %></h3>
</div>
</div>
<div class="Modal-container Modal-container--analysis">
<div class="Modal-inner js-body">
</div>
</div>
<div class="Modal-footer">
<div class="Modal-footerContainer u-flex u-justifyEnd">
<button class="CDB-Button CDB-Button--primary CDB-Button--big is-disabled js-add">
<span class="CDB-Button-Text CDB-Text is-semibold CDB-Size-medium u-upperCase"><%- _t('components.modals.add-analysis.add-btn') %></span>
</button>
</div>
</div>
</div>
@@ -0,0 +1,106 @@
var _ = require('underscore');
var CoreView = require('backbone/core-view');
var AnalysisOptionsCollection = require('./analysis-options-collection');
var analysisOptions = require('./analysis-options');
var AnalysisViewPane = require('./analysis-view-pane');
var renderLoading = require('builder/components/loading/render-loading');
var DataServicesApiCheck = require('builder/editor/layers/layer-content-views/analyses/analyses-quota/analyses-quota-info');
var checkAndBuildOpts = require('builder/helpers/required-opts');
var REQUIRED_OPTS = [
'modalModel',
'configModel',
'userModel',
'layerDefinitionModel'
];
/**
* View to add a new analysis node.
* Expected to be rendered in a modal.
*/
module.exports = CoreView.extend({
className: 'Dialog-content Dialog-content--expanded',
initialize: function (opts) {
checkAndBuildOpts(opts, REQUIRED_OPTS, this);
this._analysisDefinitionNodeModel = this._layerDefinitionModel.getAnalysisDefinitionNodeModel();
this._queryGeometryModel = this._analysisDefinitionNodeModel.queryGeometryModel;
this.listenTo(this._queryGeometryModel, 'change', this.render);
this._analysisOptions = analysisOptions({
userModel: this._userModel,
configModel: this._configModel,
queryGeometryModel: this._queryGeometryModel
});
this._analysisOptionsCollection = new AnalysisOptionsCollection();
this._dataservicesApiHealth = DataServicesApiCheck.get();
if (!this._isFetchingGeometry()) {
this._queryGeometryModel.fetch();
}
this._initOptions();
},
render: function () {
this.clearSubViews();
var render = this.render.bind(this);
var dsApiNeedsCheck = this._dataservicesApiHealth.needsCheck();
if (dsApiNeedsCheck) {
this._dataservicesApiHealth.fetch({
success: render
});
}
if (this._isFetchingGeometry() || dsApiNeedsCheck) {
this._renderLoadingView();
} else {
this._renderStackView();
}
return this;
},
_renderLoadingView: function () {
this.$el.html(
renderLoading({
title: _t('components.modals.add-widgets.loading-title')
})
);
},
_renderStackView: function () {
var view = new AnalysisViewPane({
modalModel: this._modalModel,
analysisOptions: this._analysisOptions,
analysisOptionsCollection: this._analysisOptionsCollection,
layerDefinitionModel: this._layerDefinitionModel,
queryGeometryModel: this._queryGeometryModel
});
this.$el.html(view.render().$el);
this.addView(view);
},
_isFetchingGeometry: function () {
return this._queryGeometryModel.get('status') === 'fetching';
},
_initOptions: function () {
// Flatten the options hierarchy to a flat array structure that's easier to handle programmatically.
var modelsAttrs = _.reduce(Object.keys(this._analysisOptions), function (memo, category) {
var categoryDef = this._analysisOptions[category];
categoryDef.analyses.forEach(function (d) {
memo.push(_.extend({}, d, { category: category, type: d.nodeAttrs.type }));
});
return memo;
}, [], this);
this._analysisOptionsCollection.reset(modelsAttrs);
}
});
@@ -0,0 +1,51 @@
var _ = require('underscore');
var AnalysisCategoryView = require('./analysis-category-pane-view');
module.exports = function (analysisOptions) {
return [{
type: 'create_clean',
createTabPaneItem: function (optionsCollection, opts) {
return {
label: _t('analysis-category.create-clean'),
name: 'create_clean',
createContentView: function () {
return new AnalysisCategoryView(_.extend({
analysisOptions: analysisOptions,
analysisType: 'create_clean',
collection: optionsCollection
}, opts));
}
};
}
}, {
type: 'analyze_predict',
createTabPaneItem: function (optionsCollection, opts) {
return {
label: _t('analysis-category.analyze-predict'),
name: 'analyze_predict',
createContentView: function () {
return new AnalysisCategoryView(_.extend({
analysisOptions: analysisOptions,
analysisType: 'analyze_predict',
collection: optionsCollection
}, opts));
}
};
}
}, {
type: 'data_transformation',
createTabPaneItem: function (optionsCollection, opts) {
return {
label: _t('analysis-category.data-transformation'),
name: 'data_transformation',
createContentView: function () {
return new AnalysisCategoryView(_.extend({
analysisOptions: analysisOptions,
analysisType: 'data_transformation',
collection: optionsCollection
}, opts));
}
};
}
}];
};
@@ -0,0 +1,46 @@
var CoreView = require('backbone/core-view');
var ScrollView = require('builder/components/scroll/scroll-view');
var AnalysisCategoryPane = require('./analysis-category-pane');
/**
* View to add a new analysis node.
* Expected to be rendered in a modal.
*/
module.exports = CoreView.extend({
className: 'Dialog-content Dialog-content--expanded',
initialize: function (opts) {
if (!opts.modalModel) throw new Error('modalModel is required');
if (!opts.analysisOptionsCollection) throw new Error('analysisOptionsCollection is required');
if (!opts.analysisType) throw new Error('analysisType is required');
if (!opts.analysisOptions) throw new Error('analysisOptions is required');
if (!opts.queryGeometryModel) throw new Error('queryGeometryModel is required');
this._modalModel = opts.modalModel;
this._queryGeometryModel = opts.queryGeometryModel;
this._analysisOptionsCollection = opts.analysisOptionsCollection;
this._analysisType = opts.analysisType;
this._analysisOptions = opts.analysisOptions;
},
render: function () {
this.clearSubViews();
var view = new ScrollView({
createContentView: function () {
return new AnalysisCategoryPane({
collection: this._analysisOptionsCollection,
title: this.options.categoryTitle || this.options.category,
category: this._analysisType === 'all' ? null : this._analysisType,
categoryTitle: this._analysisType === 'all' ? null : this._analysisOptions[this._analysisType].label,
simpleGeometryType: this._queryGeometryModel.get('simple_geom')
});
}.bind(this)
});
this.addView(view);
this.$el.append(view.render().el);
return this;
}
});
@@ -0,0 +1,50 @@
var CoreView = require('backbone/core-view');
var AnalysisOptionView = require('./analysis-option-view');
var template = require('./analysis-category.tpl');
/**
* View to render an individual analysis category and its analysis options
*/
module.exports = CoreView.extend({
className: 'Modal-analysisContainer',
options: {
category: '',
categoryTitle: '',
simpleGeometryType: ''
},
render: function () {
this.clearSubViews();
this.$el.html(this._html());
this.collection.each(this._renderOption, this);
return this;
},
_html: function () {
return template({
title: this.options.title
});
},
_renderOption: function (analysisOptionModel) {
if (this.options.category && !analysisOptionModel.belongsTo(this.options.category)) {
return;
}
var view = new AnalysisOptionView({
model: analysisOptionModel,
simpleGeometryTypeInput: this.options.simpleGeometryType
});
this.addView(view);
this._$list().append(view.render().el);
},
_$list: function () {
return this.$('.js-analyses-list');
}
});
@@ -0,0 +1 @@
<ul class="ModalBlockList js-analyses-list"></ul>
@@ -0,0 +1,51 @@
var _ = require('underscore');
var Backbone = require('backbone');
var camshaftReference = require('builder/data/camshaft-reference');
var nodeIds = require('builder/value-objects/analysis-node-ids');
module.exports = Backbone.Model.extend({
defaults: {
title: '',
category: '',
selected: false,
type_group: '',
desc: '',
link: ''
},
initialize: function (attrs, opts) {
if (!opts.nodeAttrs) throw new Error('nodeAttrs is required');
this._nodeAttrs = opts.nodeAttrs;
},
belongsTo: function (category) {
return this.get('category') === category;
},
acceptsGeometryTypeAsInput: function (simpleGeometryType) {
if (this.get('dummy') === true) return true;
return camshaftReference.isValidInputGeometryForType(simpleGeometryType, this._nodeAttrs.type);
},
getValidInputGeometries: function () {
return camshaftReference.getValidInputGeometriesForType(this._nodeAttrs.type);
},
getFormAttrs: function (layerDefModel) {
var letter = layerDefModel.get('letter');
var sourceId = layerDefModel.get('source');
return _.extend(
{
source: sourceId,
id: letter === nodeIds.letter(sourceId)
? nodeIds.next(sourceId)
: letter + '1'
},
this._nodeAttrs
);
}
});
@@ -0,0 +1,22 @@
var _ = require('underscore');
var AnalysisOptionModel = require('./analysis-option-model');
/**
* Custom model for deprecated SQL function type, to set correct primary source
*/
module.exports = AnalysisOptionModel.extend({
/**
* @override {AnalysisOptionModel.getNodeAttrs}
*/
getFormAttrs: function (layerDefModel) {
var attrs = AnalysisOptionModel.prototype.getFormAttrs.apply(this, arguments);
delete attrs.source;
_.extend(attrs, {
primary_source: layerDefModel.get('source')
});
return attrs;
}
});
@@ -0,0 +1,35 @@
var _ = require('underscore');
var AnalysisOptionModel = require('./analysis-option-model');
var camshaftReference = require('builder/data/camshaft-reference');
/**
* Model to represent a generated analysis option.
*/
module.exports = AnalysisOptionModel.extend({
/**
* @override {AnalysisOptionModel.getNodeAttrs}
*/
getFormAttrs: function () {
var attrs = AnalysisOptionModel.prototype.getFormAttrs.apply(this, arguments);
this._removeSourceIfThereAreMultipleSources(attrs);
return attrs;
},
_removeSourceIfThereAreMultipleSources: function (attrs) {
var params = camshaftReference.paramsForType(attrs.type);
var sourceCount = _.reduce(Object.keys(params), function (memo, name) {
if (params[name].type === 'node') {
memo++;
}
return memo;
}, 0);
if (sourceCount > 1) {
delete attrs.source;
}
}
});
@@ -0,0 +1,24 @@
var _ = require('underscore');
var AnalysisOptionModel = require('./analysis-option-model');
/**
* Custom model for merge type, to set correct primary source
*/
module.exports = AnalysisOptionModel.extend({
/**
* @override {AnalysisOptionModel.getNodeAttrs}
*/
getFormAttrs: function (layerDefModel) {
var attrs = AnalysisOptionModel.prototype.getFormAttrs.apply(this, arguments);
delete attrs.source;
_.extend(attrs, {
primary_source_name: 'left_source',
left_source: layerDefModel.get('source')
});
return attrs;
}
});
@@ -0,0 +1,91 @@
var _ = require('underscore');
var $ = require('jquery');
var CoreView = require('backbone/core-view');
var template = require('./analysis-option.tpl');
var Analyses = require('builder/data/analyses');
/**
* View for an individual analysis option.
*/
module.exports = CoreView.extend({
tagName: 'li',
className: 'ModalBlockList-item',
events: {
'mouseenter': '_onMouseEnter',
'mouseleave': '_onMouseLeave',
'click': '_onClick'
},
initialize: function (opts) {
this._simpleGeometryTypeInput = opts.simpleGeometryTypeInput; // might be undefined/null, so don't check
this.listenTo(this.model, 'change:selected', this.render);
},
render: function () {
var props = this.model.pick('title', 'type_group', 'desc', 'selected', 'link');
props.enabled = this._acceptsInputGeometry();
if (!props.enabled) {
props.desc = this._disabledDesc();
}
var analysisType = this.model.get('type');
var analysisItem = Analyses.getAnalysisByType(analysisType);
var animationTemplate = analysisItem && analysisItem.animationTemplate;
var genericType = '';
if (animationTemplate) {
genericType = analysisItem.genericType || analysisType;
}
this.$el.html(template(_.extend(props, { type: genericType })));
if (animationTemplate) {
this.$('.js-animation').append(animationTemplate);
}
this.$el.toggleClass('is-selected', this.model.get('selected'));
this.$el.toggleClass('is-disabled', !props.enabled);
return this;
},
_onMouseEnter: function () {
if (this._acceptsInputGeometry()) {
this.$('.js-animation').addClass('has-autoplay');
}
},
_onMouseLeave: function () {
if (this._acceptsInputGeometry()) {
this.$('.js-animation').removeClass('has-autoplay');
}
},
_onClick: function (event) {
var linkClicked = event && event.target && $(event.target).hasClass('js-more');
if (!linkClicked && this._acceptsInputGeometry()) {
this.model.set('selected', true);
}
},
_disabledDesc: function (desc) {
return _t('components.modals.add-analysis.disabled-option-desc', {
simpleGeometryType: this._simpleGeometryTypeInput || _t('components.modals.add-analysis.unknown-geometry-type'),
requiredInputGeometries: this._getRequiredInputGeometries()
});
},
_getRequiredInputGeometries: function () {
return _t('components.modals.add-analysis.geometry-types.' + this.model.getValidInputGeometries());
},
_acceptsInputGeometry: function () {
return this.model.acceptsGeometryTypeAsInput(this._simpleGeometryTypeInput);
}
});
@@ -0,0 +1,27 @@
<div class="Analysis-animation <% if (enabled) { %>is-enabled<% } %> <% if (type) { %>is-<%- type %><% } %> js-animation u-flex u-alignCenter u-justifyCenter"></div>
<div class="Analysis-info u-flex">
<div class="ModalBlockList-itemInput CDB-Size-large">
<input class="CDB-Radio" type="radio" value="true"
<% if (selected) { %>checked="checked"<% } %>
<% if (!enabled) { %>disabled="disabled"<% } %>
>
<span class="u-iBlock CDB-Radio-face"></span>
</div>
<div class="ModalBlockList-inner">
<div class="ModalBlockList-item-header u-bSpace">
<h2 class="ModalBlockList-item-headerTitle CDB-Text CDB-Size-large u-rSpace--m u-ellipsis" title="<%- title %>">
<%- title %>
</h2>
</div>
<div class="ModalBlockList-item-body">
<p class="CDB-Text CDB-Size-small u-secondaryTextColor">
<%- desc %>
</p>
<% if (link) { %>
<a class="Analysis-link CDB-Text CDB-Size-small u-tSpace-xl u-actionTextColor u-upperCase js-more track-<%- type %>-modal-learn" href="<%- link %>" target="_blank">
<%- _t('components.modals.add-analysis.more-info') %>
</a>
<% } %>
</div>
</div>
</div>
@@ -0,0 +1,28 @@
var _ = require('underscore');
var Backbone = require('backbone');
var AnalysisOptionModel = require('./analysis-option-models/analysis-option-model');
module.exports = Backbone.Collection.extend({
model: function (d, opts) {
var Model = d.Model || AnalysisOptionModel;
var attrs = _.omit(d, 'Model', 'nodeAttrs');
return new Model(attrs, {nodeAttrs: d.nodeAttrs});
},
initialize: function (models, opts) {
this.on('change:selected', this._onSelectedChange, this);
},
_onSelectedChange: function (changedModel, isSelected) {
if (isSelected) {
this.each(function (m) {
if (m !== changedModel) {
m.set('selected', false);
}
});
}
}
});
@@ -0,0 +1,64 @@
var _ = require('underscore');
var GeneratedAnalysisOptionModel = require('./analysis-option-models/generated-analysis-option-model');
var camshaftReference = require('camshaft-reference');
var latestCamshaftReference = camshaftReference.getVersion('latest');
var Analyses = require('builder/data/analyses');
/**
* Analysis definitions, organized in buckets per top-level category
*
* - {Obj} -> options (userModel, configModel, queryGeometryModel)
*/
module.exports = function (options) {
var categories = {
create_clean: {
title: _t('analysis-category.create-clean'),
analyses: Analyses.getAnalysesByModalCategory('create_clean', options)
},
data_transformation: {
title: _t('analysis-category.data-transformation'),
analyses: Analyses.getAnalysesByModalCategory('data_transformation', options)
},
analyze_predict: {
title: _t('analysis-category.analyze-predict'),
analyses: Analyses.getAnalysesByModalCategory('analyze_predict', options)
}
};
var alsoGenerateFromCamshaftReference = options.userModel.featureEnabled('generate_analysis_options');
if (alsoGenerateFromCamshaftReference) {
var implementedAnalyses = _.reduce(Object.keys(categories), function (memo, category) {
return memo.concat(
categories[category].analyses.map(function (analysis) {
return analysis.nodeAttrs.type;
})
);
}, []);
categories['generated'] = {
title: 'Generated analyses by the Camshaft reference v' + _.last(camshaftReference.versions),
analyses: _.compact(
Object
.keys(latestCamshaftReference.analyses)
.filter(function (type) {
return type !== 'source' && !_.contains(implementedAnalyses, type);
})
.map(function (type) {
if (!Analyses.isAnalysisValidByType(type, options)) {
return false;
}
return {
Model: GeneratedAnalysisOptionModel,
nodeAttrs: {type: type},
title: type,
desc: JSON.stringify(latestCamshaftReference.analyses[type])
};
})
)
};
}
return categories;
};
@@ -0,0 +1,122 @@
var _ = require('underscore');
var CoreView = require('backbone/core-view');
var AnalysisCategoryView = require('./analysis-category-pane-view');
var createTemplateTabPane = require('builder/components/tab-pane/create-template-tab-pane');
var template = require('./add-analyses.tpl');
var tabPaneButtonTemplate = require('./tab-pane-button-template.tpl');
var tabPaneTemplate = require('./tab-pane-template.tpl');
var analysesTypes = require('./analyses-types');
var Router = require('builder/routes/router');
/**
* View to select the analysis to create.
*/
module.exports = CoreView.extend({
className: 'Dialog-content Dialog-content--expanded',
events: {
'click .js-add': '_onAddAnalysis'
},
initialize: function (opts) {
if (!opts.modalModel) throw new Error('modalModel is required');
if (!opts.analysisOptionsCollection) throw new Error('analysisOptionsCollection is required');
if (!opts.analysisOptions) throw new Error('analysisOptions is required');
if (!opts.layerDefinitionModel) throw new Error('layerDefinitionModel is required');
if (!opts.queryGeometryModel) throw new Error('queryGeometryModel is required');
this._modalModel = opts.modalModel;
this._analysisOptions = opts.analysisOptions;
this._analysisOptionsCollection = opts.analysisOptionsCollection;
this._layerDefinitionModel = opts.layerDefinitionModel;
this._queryGeometryModel = opts.queryGeometryModel;
this.listenTo(this._analysisOptionsCollection, 'change:selected', this._toggleAddButton);
this._generateTabPaneItems();
},
render: function () {
this.clearSubViews();
this.$el.html(template());
var options = {
tabPaneOptions: {
template: tabPaneTemplate,
tabPaneItemOptions: {
tagName: 'li',
klassName: 'CDB-NavMenu-item'
}
},
tabPaneTemplateOptions: {
tagName: 'button',
className: 'CDB-NavMenu-link u-upperCase',
template: tabPaneButtonTemplate
}
};
this._tabPane = createTemplateTabPane(this._tabPaneItems, options);
this.addView(this._tabPane);
this._$body().append(this._tabPane.render().el);
return this;
},
goToTabItem: function (tabItemName) {
var tabItem = _.first(this._tabPane.collection.where({ name: tabItemName }));
if (tabItem) {
tabItem.set('selected', true);
this._toggleAddButton(); // set the right state for the add button
}
},
_generateTabPaneItems: function () {
var availableTypes = _.unique(_.keys(this._analysisOptions));
this._tabPaneItems = _.map(analysesTypes(this._analysisOptions), function (d) {
if (_.contains(availableTypes, d.type)) {
return d.createTabPaneItem(this._analysisOptionsCollection, {
modalModel: this._modalModel,
analysisOptionsCollection: this._analysisOptionsCollection,
queryGeometryModel: this._queryGeometryModel
});
}
}.bind(this));
this._tabPaneItems.unshift({
label: _t('analysis-category.all'),
name: 'all',
createContentView: function () {
return new AnalysisCategoryView({
analysisType: 'all',
modalModel: this._modalModel,
analysisOptions: this._analysisOptions,
analysisOptionsCollection: this._analysisOptionsCollection,
queryGeometryModel: this._queryGeometryModel
});
}.bind(this)
});
},
_$body: function () {
return this.$('.js-body');
},
_onAddAnalysis: function () {
var selectedOptionModel = this._analysisOptionsCollection.find(this._isSelected);
var layerDefinitionModel = this._layerDefinitionModel;
if (selectedOptionModel) {
var analysisFormAttrs = selectedOptionModel.getFormAttrs(layerDefinitionModel);
this._modalModel.destroy(analysisFormAttrs);
Router.goToAnalysisNode(layerDefinitionModel.get('id'), analysisFormAttrs.id);
}
},
_toggleAddButton: function () {
this.$('.js-add').toggleClass('is-disabled', !this._analysisOptionsCollection.any(this._isSelected));
},
_isSelected: function (m) {
return !!m.get('selected');
}
});
@@ -0,0 +1,16 @@
<svg width="308px" height="98px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g fill="#9DE0AD" fill-rule="evenodd" transform="translate(50, 8)">
<circle class="aoi-area area01" fill="#5A7E6D" cx="20" cy="36" r="20"></circle>
<circle class="aoi-point area-point01" cx="20" cy="36" r="4"></circle>
<circle class="aoi-area area02" fill="#5A7E6D" cx="56" cy="28" r="20"></circle>
<circle class="aoi-point area-point02" cx="56" cy="28" r="4"></circle>
<circle class="aoi-area area03" fill="#5A7E6D" cx="76" cy="44" r="20"></circle>
<circle class="aoi-point area-point03" cx="76" cy="44" r="4"></circle>
<circle class="aoi-area area04" fill="#5A7E6D" cx="138" cy="60" r="20"></circle>
<circle class="aoi-point area-point04" cx="138" cy="60" r="4"></circle>
<circle class="aoi-area area05" fill="#5A7E6D" cx="156" cy="20" r="20"></circle>
<circle class="aoi-point area-point05" cx="156" cy="20" r="4"></circle>
<circle class="aoi-area area06" fill="#5A7E6D" cx="188" cy="28" r="20"></circle>
<circle class="aoi-point area-point06" cx="188" cy="28" r="4"></circle>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,16 @@
<svg width="148px" height="141px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g fill="#636D72" fill-rule="evenodd">
<circle class="Centroid-pointsHighlight" fill="#9DE0AD" cx="74" cy="70" r="4"></circle>
<circle class="Centroid-line" fill="none" stroke="#9DE0AD" cx="74.5" cy="70" r="70"></circle>
<circle class="Centroid-points Centroid-points01" cx="4" cy="65" r="4"></circle>
<circle class="Centroid-points Centroid-points02" cx="34" cy="85" r="4"></circle>
<circle class="Centroid-points Centroid-points03" cx="103" cy="50" r="4"></circle>
<circle class="Centroid-points Centroid-points04" cx="83" cy="40" r="4"></circle>
<circle class="Centroid-points Centroid-points05" cx="63" cy="90" r="4"></circle>
<circle class="Centroid-points Centroid-points06" cx="144" cy="65" r="4"></circle>
<circle class="Centroid-points Centroid-points07" cx="93" cy="96" r="4"></circle>
<circle class="Centroid-points Centroid-points08" cx="44" cy="55" r="4"></circle>
<circle class="Centroid-points Centroid-points09" cx="112" cy="83" r="4"></circle>
<circle class="Centroid-points Centroid-points10" cx="24" cy="45" r="4"></circle>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,37 @@
<svg width="306" height="98" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g transform="translate(30, 16)" fill="#636D72">
<g>
<path class="Line Line-01" d="M109,32 L42,29"></path>
<path class="Line Line-02" d="M109,32 L72,49"></path>
<path class="Line Line-03" d="M109,32 L101,54"></path>
<path class="Line Line-04" d="M109,32 L131,60"></path>
<path class="Line Line-05" d="M109,32 L82,19"></path>
<path class="Line Line-06" d="M109,32 L150,47"></path>
<path class="Line Line-07" d="M109,32 L121,4"></path>
<path class="Line Line-08" d="M109,32 L141,14"></path>
<path class="Line Line-09" d="M109,32 L159,25"></path>
</g>
<circle class="Dot Dot--withColorChange Dot-01" cx="42" cy="29" r="4"></circle>
<circle class="Dot Dot--withColorChange Dot-02" cx="72" cy="49" r="4"></circle>
<circle class="Dot Dot--withColorChange Dot-03" cx="101" cy="54" r="4"></circle>
<circle class="Dot Dot--withColorChange Dot-04" cx="131" cy="60" r="4"></circle>
<circle class="Dot Dot--withColorChange Dot-05" cx="82" cy="19" r="4"></circle>
<circle class="Dot Dot--withColorChange Dot-06" cx="150" cy="47" r="4"></circle>
<circle class="Dot Dot--withColorChange Dot-07" cx="141" cy="14" r="4"></circle>
<circle class="Dot Dot--withColorChange Dot-08" cx="121" cy="4" r="4"></circle>
<circle class="Dot Dot--withColorChange Dot-09" cx="159" cy="25" r="4"></circle>
<circle class="Dot Dot--withFadeOut Dot-10" cx="52" cy="54" r="4"></circle>
<circle class="Dot Dot--withFadeOut Dot-11" cx="4" cy="54" r="4"></circle>
<circle class="Dot Dot--withFadeOut Dot-12" cx="28" cy="14" r="4"></circle>
<circle class="Dot Dot--withFadeOut Dot-13" cx="188" cy="6" r="4"></circle>
<circle class="Dot Dot--withFadeOut Dot-14" cx="196" cy="46" r="4"></circle>
<circle class="Dot Dot--withFadeOut Dot-15" cx="228" cy="26" r="4"></circle>
<circle class="Dot Dot--withFadeOut Dot-16" cx="182" cy="29" r="4"></circle>
<circle class="Dot Dot--withFadeOut Dot-17" cx="62" cy="9" r="4"></circle>
<circle class="Dot" fill="white" cx="109" cy="32" r="4"></circle>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -0,0 +1,16 @@
<svg width="148px" height="64px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="none" fill="#636D72">
<polyline class="Line" stroke="#9DE0AD" points="4.08007812 29.7382812 34.2617188 49.4335938 24.2285156 9.83007812 43.7246094 18.7578125 62.9414062 54.7128906 73.6425781 30.9160156 92.3808594 59.359375 83.328125 3.75585938 103.042969 14.6777344 111.734375 47.1640625 144.171875 28.3574219"></polyline>
<circle class="Dot Dot-01" cx="4" cy="29" r="4"></circle>
<circle class="Dot Dot-02" cx="34" cy="49" r="4"></circle>
<circle class="Dot Dot-03" cx="24" cy="9" r="4"></circle>
<circle class="Dot Dot-04" cx="44" cy="19" r="4"></circle>
<circle class="Dot Dot-05" cx="63" cy="54" r="4"></circle>
<circle class="Dot Dot-06" cx="74" cy="32" r="4"></circle>
<circle class="Dot Dot-07" cx="93" cy="60" r="4"></circle>
<circle class="Dot Dot-08" cx="83" cy="4" r="4"></circle>
<circle class="Dot Dot-09" cx="103" cy="14" r="4"></circle>
<circle class="Dot Dot-10" cx="112" cy="47" r="4"></circle>
<circle class="Dot Dot-11" cx="144" cy="29" r="4"></circle>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,54 @@
<svg width="302px" height="98px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<rect id="path-1" x="0" y="0" width="304" height="96"></rect>
<rect id="path-3" x="48" y="0" width="48" height="64"></rect>
<mask id="mask-4" x="0" y="0" width="48" height="64" fill="white">
<use xlink:href="#path-3"></use>
</mask>
<rect id="path-5" x="0" y="31" width="49" height="33"></rect>
<mask id="mask-6" x="0" y="0" width="49" height="33" fill="white">
<use xlink:href="#path-5"></use>
</mask>
<rect id="path-7" x="95" y="0" width="57" height="24"></rect>
<mask id="mask-8" x="0" y="0" width="57" height="24" fill="white">
<use xlink:href="#path-7"></use>
</mask>
<rect id="path-9" x="151" y="8" width="18" height="16"></rect>
<mask id="mask-10" x="0" y="0" width="18" height="16" fill="white">
<use xlink:href="#path-9"></use>
</mask>
<rect id="path-11" x="24" y="16" width="25" height="16"></rect>
<mask id="mask-12" x="0" y="0" width="25" height="16" fill="white">
<use xlink:href="#path-11"></use>
</mask>
<rect id="path-13" x="95" y="23" width="25" height="25"></rect>
<mask id="mask-14" x="0" y="0" width="25" height="25" fill="white">
<use xlink:href="#path-13"></use>
</mask>
<rect id="path-15" x="119" y="23" width="58" height="33"></rect>
<mask id="mask-16" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="58" height="33" fill="white">
<use xlink:href="#path-15"></use>
</mask>
</defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g>
<g>
<g>
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="Rectangle-10" xlink:href="#path-1"></use>
</g>
<g transform="translate(64, 16)" stroke="#282C2F" stroke-width="2" fill="#9DE0AD">
<use class="rect-01" mask="url(#mask-4)" fill-opacity="0.32" xlink:href="#path-3"></use>
<use class="rect-02" mask="url(#mask-6)" fill-opacity="0.8" xlink:href="#path-5"></use>
<use class="rect-03" mask="url(#mask-8)" fill-opacity="0.639999986" xlink:href="#path-7"></use>
<use class="rect-04" mask="url(#mask-10)" fill-opacity="0.160000011" xlink:href="#path-9"></use>
<use class="rect-05" mask="url(#mask-12)" fill-opacity="0.48" xlink:href="#path-11"></use>
<use class="rect-06" mask="url(#mask-14)" xlink:href="#path-13"></use>
<use class="rect-07" mask="url(#mask-16)" fill-opacity="0.800000012" xlink:href="#path-15"></use>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

@@ -0,0 +1,24 @@
<svg width="306" height="98" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<circle class="Dot" cx="117" cy="33" r="4"></circle>
<circle class="Dot" cx="91" cy="57" r="4"></circle>
<circle class="Dot--withSplash Dot--withSplash--01" cx="91" cy="57" r="4"></circle>
<circle class="Dot" cx="73" cy="27" r="4"></circle>
<circle class="Dot" cx="223" cy="39" r="4"></circle>
<circle class="Dot--withSplash Dot--withSplash--02" cx="223" cy="39" r="4"></circle>
<circle class="Dot" cx="125" cy="69" r="4"></circle>
<circle class="Dot" cx="64" cy="65" r="4"></circle>
<circle class="Dot" cx="151" cy="71" r="4"></circle>
<circle class="Dot--withSplash Dot--withSplash--03" cx="151" cy="71" r="4"></circle>
<circle class="Dot" cx="205" cy="75" r="4"></circle>
<circle class="Dot" cx="163" cy="61" r="4"></circle>
<circle class="Dot" cx="133" cy="43" r="4"></circle>
<circle class="Dot" cx="189" cy="46" r="4"></circle>
<circle class="Dot--withSplash Dot--withSplash--04" cx="189" cy="46" r="4"></circle>
<circle class="Dot" cx="242" cy="45" r="4"></circle>
<circle class="Dot" cx="155" cy="39" r="4"></circle>
<circle class="Dot" cx="195" cy="23" r="4"></circle>
<circle class="Dot--green Dot-01" cx="91" cy="57" r="4"></circle>
<circle class="Dot--green Dot-02" cx="223" cy="39" r="4"></circle>
<circle class="Dot--green Dot-03" cx="151" cy="71" r="4"></circle>
<circle class="Dot--green Dot-04" cx="189" cy="46" r="4"></circle>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,38 @@
<svg width="304" height="96" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g fill="#636D72" stroke="none" stroke-width="1">
<g stroke="#FFFFFF" stroke-linecap="square">
<path class="Line" d="M174.5,58.5 L166.5,35.5" id="Line"></path>
<path class="Line" d="M174.5,58.5 L145.5,40.5" id="Line"></path>
<path class="Line" d="M128.5,29.5 L145.5,40.5" id="Line"></path>
<path class="Line" d="M128.5,29.5 L84.5,24.5" id="Line"></path>
<path class="Line--withHighlight" d="M174.5,58.5 L136.5,66.5" id="Line"></path>
<path class="Line--withHighlight" d="M103.5,53.5 L136.5,66.5" id="Line"></path>
<path class="Line--withHighlight" d="M76.5,61.5 L104.5,53.5" id="Line"></path>
<path class="Line" d="M174.5,58.5 L162.5,68.5" id="Line"></path>
<path class="Line" d="M174.5,58.5 L217.5,71.5" id="Line"></path>
<path class="Line" d="M235.5,35.5 L217.5,71.5" id="Line"></path>
<path class="Line" d="M235.5,35.5 L253.5,41.5" id="Line"></path>
<path class="Line" d="M202.5,42.5 L166.5,35.5" id="Line"></path>
<path class="Line" d="M202.5,42.5 L207.5,18.5" id="Line"></path>
<path class="Line--withFade" d="M174.5,58.5 L136.5,66.5" id="Line"></path>
<path class="Line--withFade" d="M103.5,53.5 L136.5,66.5" id="Line"></path>
<path class="Line--withFade" d="M76.5,61.5 L104.5,53.5" id="Line"></path>
</g>
<circle class="Dot Dot-01" cx="129" cy="30" r="4"></circle>
<circle class="Dot Dot-02" cx="85" cy="24" r="4"></circle>
<circle class="Dot Dot-03" cx="235" cy="36" r="4"></circle>
<circle class="Dot Dot-04" cx="163" cy="68" r="4"></circle>
<circle class="Dot Dot-05" cx="217" cy="72" r="4"></circle>
<circle class="Dot Dot-06" cx="145" cy="40" r="4"></circle>
<circle class="Dot Dot-07" cx="201" cy="43" r="4"></circle>
<circle class="Dot Dot-08" cx="254" cy="42" r="4"></circle>
<circle class="Dot Dot-09" cx="167" cy="36" r="4"></circle>
<circle class="Dot Dot-10" cx="207" cy="20" r="4"></circle>
<circle class="Dot-11 Dot--withHighlight" cx="103" cy="54" r="4"></circle>
<circle class="Dot-12 Dot--withHighlight" cx="137" cy="66" r="4"></circle>
<circle class="Dot-13 Dot--withHighlight" cx="76" cy="62" r="4"></circle>
<circle class="Dot-14 Dot--withHighlight" cx="175" cy="58" r="4"></circle>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

@@ -0,0 +1,19 @@
<svg width="306px" height="98px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g fill="#636D72" fill-rule="evenodd" transform="translate(70, 15)">
<polygon fill="none" class="Filter-line" stroke="#9DE0AD" points="73.703125 13.6435547 97.5439453 17.5722656 106.554688 42.9824219 92.5517578 55.5849609 63.3261719 53.5224609 54.0126953 15.3515625 59.0839844 11.4414062"></polygon>
<circle class="Filter-dotHighlight Filter-dotHighlight--01" cx="95" cy="20" r="4"></circle>
<circle class="Filter-dotHighlight Filter-dotHighlight--06" cx="73" cy="24" r="4"></circle>
<circle class="Filter-dotHighlight Filter-dotHighlight--02" cx="103" cy="42" r="4"></circle>
<circle class="Filter-dotHighlight Filter-dotHighlight--03" cx="91" cy="52" r="4"></circle>
<circle class="Filter-dotHighlight Filter-dotHighlight--05" cx="57" cy="14" r="4"></circle>
<circle class="Filter-dotHighlight Filter-dotHighlight--04" cx="65" cy="50" r="4"></circle>
<circle class="Filter-dot circle08" cx="163" cy="20" r="4"></circle>
<circle class="Filter-dot circle07" cx="31" cy="38" r="4"></circle>
<circle class="Filter-dot circle06" cx="13" cy="8" r="4"></circle>
<circle class="Filter-dot circle05" cx="4" cy="46" r="4"></circle>
<circle class="Filter-dot circle04" cx="145" cy="56" r="4"></circle>
<circle class="Filter-dot circle03" cx="129" cy="27" r="4"></circle>
<circle class="Filter-dot circle02" cx="182" cy="26" r="4"></circle>
<circle class="Filter-dot circle01" cx="135" cy="4" r="4"></circle>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,16 @@
<svg width="302px" height="99px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g fill="#9DE0AD" fill-rule="evenodd">
<path d="M0.5,41.5 L305.5,24.5" class="Georeference-street00" stroke="#282C2F" stroke-width="8" stroke-linecap="square"></path>
<path d="M134,0 L141,91" class="Georeference-street01" stroke="#282C2F" stroke-width="8" stroke-linecap="square"></path>
<path d="M258,0 L265,91" class="Georeference-street02" stroke="#282C2F" stroke-width="8" stroke-linecap="square"></path>
<text class="Georeference-point02-text" font-family="Open Sans" font-size="10" font-weight="300" fill="#FFFFFF">
<tspan x="63" y="62">-63.578373</tspan>
<tspan x="63" y="76">44.642619</tspan>
</text>
<text class="Georeference-point01-text" font-family="Open Sans" font-size="10" font-weight="300" fill="#FFFFFF">
<tspan x="198" y="54">IP 214.80.33.47</tspan>
</text>
<circle class="Dot Dot-01" fill="#9DE0AD" cx="43" cy="40" r="8"></circle>
<circle class="Dot Dot-02" fill="#9DE0AD" cx="183" cy="32" r="8"></circle>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,20 @@
<svg width="176" height="64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g fill="#9DE0AD">
<polygon fill="none" class="Group-line" stroke="#9EE0AD" points="88.4493047 0.0859375 175.58896 0.0859375 175.58896 23.2574383 135.581141 32.7431641 135.581141 54.9504597 117.092373 54.9504597 101.982508 63.6816406 59.4503976 63.6816406 44.9366094 55.6914063 1 55.6914063 1 24.8914834 44.6201536 24.8914834 56.9346563 0"></polygon>
<circle class="Group-point Group-point01" cx="60" cy="60" r="4"></circle>
<circle class="Group-point Group-point02" cx="100" cy="4" r="4"></circle>
<circle class="Group-point Group-point03" cx="132" cy="52" r="4"></circle>
<circle class="Group-point Group-point04" cx="116" cy="52" r="4"></circle>
<circle class="Group-point Group-point05" cx="116" cy="36" r="4"></circle>
<circle class="Group-point Group-point06" cx="116" cy="20" r="4"></circle>
<circle class="Group-point Group-point07" cx="172" cy="20" r="4"></circle>
<circle class="Group-point Group-point08" cx="172" cy="4" r="4"></circle>
<circle class="Group-point Group-point09" cx="44" cy="28" r="4"></circle>
<circle class="Group-point Group-point10" cx="4" cy="28" r="4"></circle>
<circle class="Group-point Group-point11" cx="4" cy="52" r="4"></circle>
<circle class="Group-point Group-point12" cx="44" cy="52" r="4"></circle>
<circle class="Group-point Group-point13" cx="100" cy="60" r="4"></circle>
<circle class="Group-point Group-point14" cx="132" cy="36" r="4"></circle>
<circle class="Group-point Group-point15" cx="60" cy="4" r="4"></circle>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,19 @@
<svg width="308px" height="98px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g fill="#636D72" fill-rule="evenodd" transform="translate(55, 15)">
<circle class="intersect intersect-layer" fill="#5A7E6D" stroke="#9DE0AD" cx="101" cy="32" r="32"></circle>
<circle class="intersect intersect-circle1" cx="57" cy="14" r="4"></circle>
<circle class="intersect intersect-circle2" cx="31" cy="38" r="4"></circle>
<circle class="intersect intersect-circle3" cx="13" cy="8" r="4"></circle>
<circle class="intersect intersect-circle4" cx="163" cy="20" r="4"></circle>
<circle class="intersect intersect-circle5" cx="65" cy="50" r="4"></circle>
<circle class="intersect intersect-circle6" cx="4" cy="46" r="4"></circle>
<circle class="intersect intersect-circle1Highlight" cx="91" cy="52" r="4"></circle>
<circle class="intersect intersect-circle7" cx="145" cy="56" r="4"></circle>
<circle class="intersect intersect-circle2Highlight" cx="103" cy="42" r="4"></circle>
<circle class="intersect intersect-circle3Highlight" cx="73" cy="24" r="4"></circle>
<circle class="intersect intersect-circle4Highlight" cx="129" cy="27" r="4"></circle>
<circle class="intersect intersect-circle8" cx="182" cy="26" r="4"></circle>
<circle class="intersect intersect-circle5Highlight" cx="95" cy="20" r="4"></circle>
<circle class="intersect intersect-circle9" cx="135" cy="4" r="4"></circle>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,13 @@
<svg width="185px" height="64px" viewBox="512 388 185 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="Group" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(513.000000, 389.000000)">
<polygon class="Path Path-01" stroke="#FFFFFF" points="7.92876627e-08 47 22.7004054 47 22.7004054 62.1132254 0 62.1132254"></polygon>
<polygon class="Path Path-03" stroke="#FFFFFF" points="160 24 182.700012 24 182.700012 38.9848139 160 38.9848139"></polygon>
<polygon class="Path Path-02" stroke="#FFFFFF" points="87.7216797 0.278320312 110.836973 0.278320312 110.836973 24.2279707 87.8211856 24.2279707"></polygon>
<polygon class="Path Path-03Green" stroke="#9DE0AD" points="128 24 182.862039 24 182.862039 55.6141883 128.202651 55.6141883"></polygon>
<polygon class="Path Path-01Green" stroke="#9DE0AD" points="0.0502868199 31 47.7467919 31 47.7467919 62.177811 0 62.177811"></polygon>
<polygon class="Path Path-02Green" stroke="#9DE0AD" points="63.9970703 0.033203125 110.710209 0.033203125 110.710209 62.0109574 63.8597689 62.0109574"></polygon>
<circle class="Dot Dot-01" fill="#FFFFFF" cx="7" cy="55" r="4"></circle>
<circle class="Dot Dot-02" fill="#FFFFFF" cx="99" cy="11" r="4"></circle>
<circle class="Dot Dot-03" fill="#FFFFFF" cx="171" cy="31" r="4"></circle>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1,18 @@
<svg width="306" height="98" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g transform="translate(50, 20)">
<circle class="Dot Dot--01 Dot--gray" cx="4" cy="46" r="4"></circle>
<circle class="Dot Dot--02 Dot--gray" cx="31" cy="38" r="4"></circle>
<circle class="Dot Dot--03 Dot--gray" cx="13" cy="8" r="4"></circle>
<circle class="Dot Dot--04 Dot--green" cx="57" cy="14" r="4"></circle>
<circle class="Dot Dot--05 Dot--green" cx="65" cy="50" r="4"></circle>
<circle class="Dot Dot--06 Dot--green" cx="91" cy="52" r="4"></circle>
<circle class="Dot Dot--07 Dot--green" cx="103" cy="42" r="4"></circle>
<circle class="Dot Dot--08 Dot--green" cx="73" cy="24" r="4"></circle>
<circle class="Dot Dot--09 Dot--green" cx="95" cy="20" r="4"></circle>
<circle class="Dot Dot--10 Dot--darkGray" cx="145" cy="56" r="4"></circle>
<circle class="Dot Dot--11 Dot--darkGray" cx="129" cy="27" r="4"></circle>
<circle class="Dot Dot--12 Dot--darkGray" cx="135" cy="4" r="4"></circle>
<circle class="Dot Dot--13 Dot--white" cx="163" cy="20" r="4"></circle>
<circle class="Dot Dot--14 Dot--white" cx="182" cy="26" r="4"></circle>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,36 @@
<svg width="306px" height="98px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="Mod-Analysis" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g fill="#9DE0AD">
<text x="8" y="19" class="Text Text-LH" font-family="OpenSans, Open Sans" font-size="10" font-weight="normal">
<%- _t('components.modals.add-analysis.option-types.moran-cluster.low-high') %>
</text>
<text x="227" y="19" class="Text Text-HH" font-family="OpenSans, Open Sans" font-size="10" font-weight="normal">
<%- _t('components.modals.add-analysis.option-types.moran-cluster.high-high') %>
</text>
<text x="233" y="85" class="Text Text-HL" font-family="OpenSans, Open Sans" font-size="10" font-weight="normal">
<%- _t('components.modals.add-analysis.option-types.moran-cluster.high-low') %>
</text>
<text x="10" y="85" class="Text Text-LL" font-family="OpenSans, Open Sans" font-size="10" font-weight="normal">
<%- _t('components.modals.add-analysis.option-types.moran-cluster.low-low') %>
</text>
</g>
<g fill="#FFF">
<circle class="Dot Dot-04" fill-opacity="0.4" cx="106" cy="57" r="4"></circle>
<circle class="Dot Dot-04" fill-opacity="0.4" cx="137" cy="66" r="4"></circle>
<circle class="Dot Dot-04" fill-opacity="0.4" cx="79" cy="62" r="4"></circle>
<circle class="Dot Dot-06" fill-opacity="0.6" cx="193" cy="70" r="4"></circle>
<circle class="Dot Dot-06" fill-opacity="0.6" cx="175" cy="58" r="4"></circle>
<circle class="Dot Dot-08" fill-opacity="0.8" cx="129" cy="30" r="4"></circle>
<circle class="Dot Dot-08" fill-opacity="0.8" cx="145" cy="40" r="4"></circle>
<circle class="Dot Dot-1" cx="231" cy="36" r="4"></circle>
<circle class="Dot Dot-1" cx="197" cy="40" r="4"></circle>
<circle class="Dot Dot-1" cx="250" cy="38" r="4"></circle>
<circle class="Dot Dot-1" cx="167" cy="36" r="4"></circle>
<circle class="Dot Dot-1" cx="203" cy="20" r="4"></circle>
</g>
<g stroke="#9DE0AD">
<path d="M0,49 L304,49" class="Line Line-horizontal" stroke-dasharray="2,3"></path>
<path d="M152,0 L152,98" class="Line Line-vertical" stroke-dasharray="2,3"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -0,0 +1,37 @@
<svg width="306px" height="98px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g transform="translate(87, 22)" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="square">
<path class="Arrow-04" d="M98.5,45.5 L97.5,40.5" stroke="#9CE0AC"></path>
<path class="Arrow-04" d="M98.5,45.5 L92.5,46.5" stroke="#9CE0AC"></path>
<path class="Line-04" d="M75.5,34.5 L98.5,45.5" stroke="#9DE0AD"></path>
<path class="Line-03" d="M0.5,44.5 L3.5,39.5" stroke="#9CE0AC"></path>
<path class="Line-03" d="M0.5,44.5 L5.5,47.5" stroke="#9CE0AC"></path>
<path class="Line-03" d="M0.5,44.5 L55.5,32.5" stroke="#9DE0AD"></path>
<g transform="translate(75.000000, 1.000000)">
<path class="Arrow-01" d="M31.5,8.5 L32.5,2.5" stroke="#95D6A6"></path>
<path class="Arrow-01" d="M26.5,0.5 L32.5,2.5" stroke="#95D6A6"></path>
<path class="Line-01" d="M0.5,18.5 L32.5,2.5" stroke="#9DE0AD"></path>
</g>
<g transform="translate(19.000000, 0.000000)" stroke="#979797">
<path class="Arrow-02" d="M36.5,19.5 L35.5,14.5"></path>
<path class="Arrow-02" d="M36.5,19.5 L31.5,21.5"></path>
<path class="Line-02" d="M0.5,0.5 L36.5,19.5"></path>
</g>
</g>
</g>
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g stroke="#636D72">
<path d="M0,49 L304,49" class="Line Line-horizontal" stroke-dasharray="2,3"></path>
<path d="M152,0 L152,98" class="Line Line-vertical" stroke-dasharray="2,3"></path>
</g>
</g>
<g transform="translate(72, 11)">
<circle class="Dot Dot--center" cx="80" cy="38" r="4" stroke="#9DE0AD" fill="#2E3C43"></circle>
<circle class="Dot Dot-01" fill="#9DE0AD" cx="133" cy="10" r="4"></circle>
<circle class="Dot Dot-02" fill="#979EA1" cx="24" cy="4" r="4"></circle>
<circle class="Dot Dot-03" fill="#9DE0AD" cx="4" cy="57" r="4"></circle>
<circle class="Dot Dot-04" fill="#9DE0AD" cx="122" cy="61" r="4"></circle>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

@@ -0,0 +1,22 @@
<svg width="306" height="98" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g transform="translate(30, 16)" fill="#9DE0AD">
<circle class="Dot" cx="42" cy="29" r="4"></circle>
<circle class="Dot--withFadeOut Dot-01" cx="72" cy="49" r="4"></circle>
<circle class="Dot" cx="52" cy="54" r="4"></circle>
<circle class="Dot--withFadeOut Dot-02" cx="4" cy="54" r="4"></circle>
<circle class="Dot--withFadeOut Dot-03" cx="28" cy="14" r="4"></circle>
<circle class="Dot" cx="188" cy="6" r="4"></circle>
<circle class="Dot" cx="196" cy="46" r="4"></circle>
<circle class="Dot--withFadeOut Dot-03" cx="159" cy="25" r="4"></circle>
<circle class="Dot" cx="228" cy="26" r="4"></circle>
<circle class="Dot" cx="141" cy="14" r="4"></circle>
<circle class="Dot--withFadeOut Dot-04" cx="121" cy="4" r="4"></circle>
<circle class="Dot" cx="101" cy="54" r="4"></circle>
<circle class="Dot" cx="182" cy="29" r="4"></circle>
<circle class="Dot--withFadeOut Dot-05" cx="131" cy="60" r="4"></circle>
<circle class="Dot" cx="82" cy="19" r="4"></circle>
<circle class="Dot" cx="150" cy="47" r="4"></circle>
<circle class="Dot--withFadeOut Dot-06" cx="62" cy="9" r="4"></circle>
<circle class="Dot" cx="109" cy="32" r="4"></circle>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1 @@
<%- label %>
@@ -0,0 +1,5 @@
<div class="Modal-navigation">
<ul class="Modal-navigationInner CDB-Text is-semibold CDB-Size-medium js-menu"></ul>
</div>
<div class="Modal-inner Modal-inner--with-navigation js-content">
</div>