fronty-gem 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/README.md +39 -0
- data/Rakefile +2 -0
- data/app/controllers/concerns/dynamic_content.rb +160 -0
- data/app/controllers/designers_controller.rb +257 -0
- data/app/controllers/pages_controller.rb +23 -0
- data/app/views/designers/editor.html.erb +245 -0
- data/app/views/pages/404.html.erb +2 -0
- data/app/views/pages/welcome.html.erb +2 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/config/initializers/assets.rb +2 -0
- data/config/routes.rb +20 -0
- data/fronty-gem.gemspec +37 -0
- data/lib/config/routes.rb +3 -0
- data/lib/fronty-gem.rb +5 -0
- data/lib/fronty-gem/version.rb +3 -0
- data/lib/tasks/fronty.rake +14 -0
- data/vendor/assets/demo/album/album.css +39 -0
- data/vendor/assets/demo/album/index.html +231 -0
- data/vendor/assets/demo/blog/blog.css +130 -0
- data/vendor/assets/demo/blog/index.html +230 -0
- data/vendor/assets/demo/carousel/carousel.css +91 -0
- data/vendor/assets/demo/carousel/index.html +186 -0
- data/vendor/assets/demo/narrow-jumbotron/index.html +82 -0
- data/vendor/assets/demo/narrow-jumbotron/narrow-jumbotron.css +80 -0
- data/vendor/assets/demo/offcanvas/index.html +158 -0
- data/vendor/assets/demo/offcanvas/offcanvas.css +79 -0
- data/vendor/assets/demo/offcanvas/offcanvas.js +7 -0
- data/vendor/assets/demo/pricing/index.html +141 -0
- data/vendor/assets/demo/pricing/pricing.css +25 -0
- data/vendor/assets/demo/product/index.html +177 -0
- data/vendor/assets/demo/product/product.css +79 -0
- data/vendor/assets/fonts/line-awesome.eot +0 -0
- data/vendor/assets/fonts/line-awesome.svg +2628 -0
- data/vendor/assets/fonts/line-awesome.ttf +0 -0
- data/vendor/assets/fonts/line-awesome.woff +0 -0
- data/vendor/assets/fonts/line-awesome.woff2 +0 -0
- data/vendor/assets/images/icons/alert.svg +66 -0
- data/vendor/assets/images/icons/arrow-down.svg +60 -0
- data/vendor/assets/images/icons/arrow-right.svg +60 -0
- data/vendor/assets/images/icons/badge.svg +81 -0
- data/vendor/assets/images/icons/breadcrumbs.svg +77 -0
- data/vendor/assets/images/icons/button.svg +78 -0
- data/vendor/assets/images/icons/button_group.svg +81 -0
- data/vendor/assets/images/icons/button_toolbar.svg +87 -0
- data/vendor/assets/images/icons/cart.svg +62 -0
- data/vendor/assets/images/icons/categories.svg +62 -0
- data/vendor/assets/images/icons/chart.svg +1 -0
- data/vendor/assets/images/icons/checkbox.svg +66 -0
- data/vendor/assets/images/icons/checkout.svg +62 -0
- data/vendor/assets/images/icons/chevron-down.svg +67 -0
- data/vendor/assets/images/icons/chevron-right.svg +67 -0
- data/vendor/assets/images/icons/components/cart.svg +16 -0
- data/vendor/assets/images/icons/components/checkbox.svg +1 -0
- data/vendor/assets/images/icons/components/contact-form.svg +13 -0
- data/vendor/assets/images/icons/components/map.svg +12 -0
- data/vendor/assets/images/icons/container.svg +66 -0
- data/vendor/assets/images/icons/facebook.svg +1 -0
- data/vendor/assets/images/icons/file.svg +1 -0
- data/vendor/assets/images/icons/filters.svg +62 -0
- data/vendor/assets/images/icons/folder.svg +1 -0
- data/vendor/assets/images/icons/form.svg +66 -0
- data/vendor/assets/images/icons/grid_row.svg +66 -0
- data/vendor/assets/images/icons/heading.svg +66 -0
- data/vendor/assets/images/icons/hr.svg +66 -0
- data/vendor/assets/images/icons/image.svg +62 -0
- data/vendor/assets/images/icons/instagram.svg +62 -0
- data/vendor/assets/images/icons/jumbotron.svg +66 -0
- data/vendor/assets/images/icons/label.svg +73 -0
- data/vendor/assets/images/icons/link.svg +1 -0
- data/vendor/assets/images/icons/list_group.svg +66 -0
- data/vendor/assets/images/icons/map.svg +62 -0
- data/vendor/assets/images/icons/maps.png +0 -0
- data/vendor/assets/images/icons/minus_round.svg +1 -0
- data/vendor/assets/images/icons/navbar.svg +66 -0
- data/vendor/assets/images/icons/pagination.svg +68 -0
- data/vendor/assets/images/icons/panel.svg +66 -0
- data/vendor/assets/images/icons/paragraph.svg +66 -0
- data/vendor/assets/images/icons/paypal.svg +1 -0
- data/vendor/assets/images/icons/play-button.svg +42 -0
- data/vendor/assets/images/icons/plus_round.svg +1 -0
- data/vendor/assets/images/icons/product.png +0 -0
- data/vendor/assets/images/icons/product.svg +62 -0
- data/vendor/assets/images/icons/product_gallery.svg +68 -0
- data/vendor/assets/images/icons/products.svg +62 -0
- data/vendor/assets/images/icons/progressbar.svg +67 -0
- data/vendor/assets/images/icons/radio.svg +66 -0
- data/vendor/assets/images/icons/search.svg +69 -0
- data/vendor/assets/images/icons/select_input.svg +67 -0
- data/vendor/assets/images/icons/slider.svg +62 -0
- data/vendor/assets/images/icons/table.svg +66 -0
- data/vendor/assets/images/icons/text_area.svg +66 -0
- data/vendor/assets/images/icons/text_input.svg +66 -0
- data/vendor/assets/images/icons/twitter.svg +55 -0
- data/vendor/assets/images/icons/user.svg +62 -0
- data/vendor/assets/images/icons/video.svg +45 -0
- data/vendor/assets/images/icons/well.svg +82 -0
- data/vendor/assets/images/svg/icon-a.svg +235 -0
- data/vendor/assets/images/svg/icon-b.svg +224 -0
- data/vendor/assets/images/svg/icon-c.svg +224 -0
- data/vendor/assets/images/svg/icon-d.svg +224 -0
- data/vendor/assets/images/svg/logo.svg +41 -0
- data/vendor/assets/images/thumbnails/XX__.png +0 -0
- data/vendor/assets/images/thumbnails/comparison.png +0 -0
- data/vendor/assets/images/thumbnails/details-with-title-complate.png +0 -0
- data/vendor/assets/images/thumbnails/details.png +0 -0
- data/vendor/assets/images/thumbnails/footer-with-links.png +0 -0
- data/vendor/assets/images/thumbnails/footer.png +0 -0
- data/vendor/assets/images/thumbnails/header.png +0 -0
- data/vendor/assets/images/thumbnails/jumbotron-with-title.png +0 -0
- data/vendor/assets/images/thumbnails/jumbotron.png +0 -0
- data/vendor/assets/images/thumbnails/linkbar.png +0 -0
- data/vendor/assets/images/thumbnails/liticle.png +0 -0
- data/vendor/assets/images/thumbnails/logobar.png +0 -0
- data/vendor/assets/images/thumbnails/page-title.png +0 -0
- data/vendor/assets/images/thumbnails/quiz-complate.png +0 -0
- data/vendor/assets/images/thumbnails/quiz-with-hero-complate.png +0 -0
- data/vendor/assets/images/thumbnails/result-complate.png +0 -0
- data/vendor/assets/images/thumbnails/review-section.png +0 -0
- data/vendor/assets/images/thumbnails/review-v2-complate.png +0 -0
- data/vendor/assets/images/thumbnails/review-v3-complate.png +0 -0
- data/vendor/assets/images/thumbnails/review_section_v4_complate.png +0 -0
- data/vendor/assets/images/thumbnails/split-hero-complate.png +0 -0
- data/vendor/assets/images/thumbnails/subtitle-with-button-complate.png +0 -0
- data/vendor/assets/images/thumbnails/subtitle-with-link.png +0 -0
- data/vendor/assets/images/thumbnails/unknown-complate.png +0 -0
- data/vendor/assets/images/thumbnails/unknown1-complate.png +0 -0
- data/vendor/assets/images/thumbnails/video-section-complate.png +0 -0
- data/vendor/assets/javascript/fronty-designer-init.js +491 -0
- data/vendor/assets/javascript/fronty-designer.js +16518 -0
- data/vendor/assets/stylesheets/fronty-designer.css +11255 -0
- metadata +235 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
class PagesController < ApplicationController
|
2
|
+
include DynamicContent
|
3
|
+
|
4
|
+
def index
|
5
|
+
set_dynamic_content('pages', request.path)
|
6
|
+
|
7
|
+
id = @dynamic_content.id
|
8
|
+
|
9
|
+
if id
|
10
|
+
if @dynamic_content.redirect_to
|
11
|
+
return redirect_to @dynamic_content.redirect_to
|
12
|
+
end
|
13
|
+
render 'page-' + id.to_s, layout: false
|
14
|
+
|
15
|
+
else
|
16
|
+
if csv_is_empty('pages')
|
17
|
+
render 'welcome'
|
18
|
+
else
|
19
|
+
render '404'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,245 @@
|
|
1
|
+
<!DOCTYPE html><html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="description" content=""> <meta name="author" content=""> <base href=""> <title>Fronty Designer</title> <%= csrf_meta_tag %><%= stylesheet_link_tag "fronty-designer" %>
|
2
|
+
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.0/css/all.css" integrity="sha384-Mmxa0mLqhmOeaE8vgOSbKacftZcsNYDjQzuCOm6D02luYSzBG8vpaOykv9lFQ51Y" crossorigin="anonymous"></head><body><script id="fronty-filemanager-page-custom" type="text/html">
|
3
|
+
<li data-url="{%=url%}" data-page="{%=name%}">
|
4
|
+
<a href="#" class="page-remove mr-4 pull-right text-decoration-none"><i class="la la-remove"></i></a>
|
5
|
+
<a href="#" class="page-edit mr-2 pull-right text-decoration-none">
|
6
|
+
<i class="la la-pencil"></i>
|
7
|
+
</a>
|
8
|
+
<label for="{%=name%}">
|
9
|
+
<a href="{%=url%}" {%if (thumbnail && !redirect_to) { %}data-thumbnail="{%=thumbnail%}" {% } %} {%if (redirect_to)
|
10
|
+
{ %}data-redirect="{%=redirect_to%}" {% } %} rel="popover"
|
11
|
+
data-placement="right" data-trigger="hover">
|
12
|
+
{%=title%}
|
13
|
+
{%if (redirect_to) { %}<i class="la la-share-square"></i>{% } %}
|
14
|
+
</a>
|
15
|
+
</label>
|
16
|
+
<input type="checkbox" checked id="{%=name%}"/>
|
17
|
+
<ol></ol>
|
18
|
+
</li>
|
19
|
+
</script>
|
20
|
+
|
21
|
+
<script id="fronty-input-popoverinput" type="text/html">
|
22
|
+
<div class="btn-group">
|
23
|
+
<a class="btn btn-outline-secondary btn-sm dropdown-toggle" href="#" role="button" data-toggle="dropdown"
|
24
|
+
aria-haspopup="true" aria-expanded="false">
|
25
|
+
{%= value %}
|
26
|
+
</a>
|
27
|
+
<div class="dropdown-menu">
|
28
|
+
<div class="btn-group-sm {%if (extraclass) { %}{%=extraclass%}{% } %}" data-toggle="buttons">
|
29
|
+
{% for ( var i = 0; i < options.length; i++ ) { %}
|
30
|
+
<label class="btn mt-0 {%if (options[i].checked) { %}active{% } %}" for="{%=key%}{%=i%} "
|
31
|
+
title="{%=options[i].title%}">
|
32
|
+
<input name="{%=key%}" class="custom-control-input" type="radio" value="{%=options[i].value%}"
|
33
|
+
id="{%=key%}{%=i%}" {%if (options[i].checked) { %}checked="{%=options[i].checked%}" {% } %}>
|
34
|
+
{%if (options[i].icon) { %}<i class="{%=options[i].icon%}"></i>{% } %}
|
35
|
+
{%if (options[i].text) { %}<span>{%=options[i].text%}</span>{% } %}
|
36
|
+
</label>
|
37
|
+
{% } %}
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
</div>
|
41
|
+
</script>
|
42
|
+
|
43
|
+
<script id="fronty-input-rangeinputtest" type="text/html">
|
44
|
+
<div>
|
45
|
+
<div class="row no-gutters">
|
46
|
+
<div class="col-9">
|
47
|
+
<input name="{%=key%}" type="range" min="{%=min%}" max="{%=max%}" step="{%=step%}" class="form-control"/>
|
48
|
+
</div>
|
49
|
+
<div class="col-3">
|
50
|
+
<span class="ml-2"></span>px
|
51
|
+
</div>
|
52
|
+
</div>
|
53
|
+
</div>
|
54
|
+
</script>
|
55
|
+
|
56
|
+
<script id="fronty-input-textinput-id" type="text/html">
|
57
|
+
|
58
|
+
<div>
|
59
|
+
<input name="{%=key%}" type="text" class="form-control"/>
|
60
|
+
<input type="hidden">
|
61
|
+
</div>
|
62
|
+
|
63
|
+
</script>
|
64
|
+
|
65
|
+
<script id="fronty-input-event-tracker" type="text/html">
|
66
|
+
<div class="toggle">
|
67
|
+
<input type="checkbox" name="{%=key%}" value="{%=on%}" data-value-off="{%=off%}" data-value-on="{%=on%}"
|
68
|
+
class="toggle-checkbox" id="{%=key%}">
|
69
|
+
<label class="toggle-label" for="{%=key%}">
|
70
|
+
<span class="toggle-inner"></span>
|
71
|
+
<span class="toggle-switch" style="height: 16px;"></span>
|
72
|
+
</label>
|
73
|
+
<br>
|
74
|
+
<textarea name="event-code" cols="30" rows="10" class="d-none"></textarea>
|
75
|
+
<button class="d-none">Save</button>
|
76
|
+
</div>
|
77
|
+
</script>
|
78
|
+
|
79
|
+
|
80
|
+
<!-- Modal -->
|
81
|
+
<div class="modal fade" id="editModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"
|
82
|
+
aria-hidden="true">
|
83
|
+
<div class="modal-dialog" role="document">
|
84
|
+
<div class="modal-content">
|
85
|
+
<div class="modal-header">
|
86
|
+
<h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
|
87
|
+
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
88
|
+
<span aria-hidden="true">×</span>
|
89
|
+
</button>
|
90
|
+
</div>
|
91
|
+
<div class="modal-body">
|
92
|
+
<form name="editForm">
|
93
|
+
<input type="hidden" name="id">
|
94
|
+
<div class="form-group row">
|
95
|
+
<label class="col-sm-3 control-label">
|
96
|
+
<p>Title</p>
|
97
|
+
</label>
|
98
|
+
<div class="col-sm-9 input">
|
99
|
+
<input type="text" class="form-control" placeholder="Title" name="title">
|
100
|
+
</div>
|
101
|
+
</div>
|
102
|
+
<div class="form-group row">
|
103
|
+
<label class="col-sm-3 control-label">
|
104
|
+
<p>Route</p>
|
105
|
+
</label>
|
106
|
+
<div class="col-sm-9 input">
|
107
|
+
<input type="text" class="form-control" placeholder="Route" name="route">
|
108
|
+
</div>
|
109
|
+
</div>
|
110
|
+
<div class="form-group row">
|
111
|
+
<label class="col-sm-3 control-label">
|
112
|
+
<p>Redirect Url</p>
|
113
|
+
</label>
|
114
|
+
<div class="col-sm-9 input">
|
115
|
+
<input type="text" class="form-control" placeholder="Redirect Url" name="redirect">
|
116
|
+
</div>
|
117
|
+
</div>
|
118
|
+
<div class="form-group">
|
119
|
+
<button class="btn btn-primary">Save</button>
|
120
|
+
</div>
|
121
|
+
</form>
|
122
|
+
</div>
|
123
|
+
<div class="modal-footer">
|
124
|
+
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
125
|
+
</div>
|
126
|
+
</div>
|
127
|
+
</div>
|
128
|
+
</div>
|
129
|
+
|
130
|
+
|
131
|
+
<div class="modal fade" id="new-page-modal" tabindex="-1" role="dialog" style=""
|
132
|
+
aria-modal="true">
|
133
|
+
<div class="modal-dialog" role="document">
|
134
|
+
<form>
|
135
|
+
<div class="modal-content">
|
136
|
+
<div class="modal-header"><p class="modal-title text-primary"><i class="la la-lg la-file"></i> New page</p>
|
137
|
+
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true"><small><i
|
138
|
+
class="la la-close"></i></small></span></button>
|
139
|
+
</div>
|
140
|
+
<div class="modal-body text">
|
141
|
+
<div class="form-group row border-bottom pt-1 pb-3 font-weight-bold">
|
142
|
+
<label class="col-6">
|
143
|
+
<input checked="" name="new_page_type" value="new_page_type_existing" type="radio">
|
144
|
+
Based on existing page
|
145
|
+
</label>
|
146
|
+
<label class="col-6">
|
147
|
+
<input name="new_page_type" value="new_page_type_upload" type="radio">
|
148
|
+
Upload new design
|
149
|
+
</label>
|
150
|
+
</div>
|
151
|
+
<div class="form-group row page-type new_page_type_existing pb-3" data-key="type">
|
152
|
+
<label class="col-sm-3 control-label" for="input-model">
|
153
|
+
Template <abbr class="badge badge-pill badge-secondary"
|
154
|
+
title="This template will be used as a start">?</abbr>
|
155
|
+
</label>
|
156
|
+
<div class="col-sm-9 input">
|
157
|
+
<div>
|
158
|
+
<select class="form-control custom-select" name="startTemplateUrl">
|
159
|
+
<option value=""></option>
|
160
|
+
</select>
|
161
|
+
</div>
|
162
|
+
</div>
|
163
|
+
</div>
|
164
|
+
<div class="form-group row page-type new_page_type_upload d-none my-3 pb-3">
|
165
|
+
<label class="col-sm-4 mr-1 control-label">Upload new design: </label>
|
166
|
+
<input name="image" value="Browse a page design" type="file">
|
167
|
+
</div>
|
168
|
+
<div class="form-group row" data-key="href">
|
169
|
+
<label class="col-sm-3 control-label" for="input-model">
|
170
|
+
<p>Title</p>
|
171
|
+
</label>
|
172
|
+
<div class="col-sm-9 input">
|
173
|
+
<div><input name="title" class="form-control" placeholder="My page" required="" type="text"></div>
|
174
|
+
</div>
|
175
|
+
</div>
|
176
|
+
<div class="form-group row" data-key="href">
|
177
|
+
<label class="col-sm-3 control-label" for="input-model">
|
178
|
+
<p>Route</p>
|
179
|
+
</label>
|
180
|
+
<div class="col-sm-9 input">
|
181
|
+
<div>
|
182
|
+
<input name="route" class="form-control" placeholder="/index" required="" type="text">
|
183
|
+
<label for="is_home">is homepage?</label>
|
184
|
+
<input name="is_home" value="1" type="checkbox">
|
185
|
+
</div>
|
186
|
+
</div>
|
187
|
+
</div>
|
188
|
+
<div class="form-group row" data-key="href">
|
189
|
+
<label class="col-sm-3 control-label" for="input-model"><p>Redirect</p></label>
|
190
|
+
<div class="col-sm-9 input">
|
191
|
+
<div>
|
192
|
+
<input name="redirectUrl" class="form-control" placeholder="Redirect URL" type="text">
|
193
|
+
</div>
|
194
|
+
</div>
|
195
|
+
</div>
|
196
|
+
</div>
|
197
|
+
<div class="modal-footer">
|
198
|
+
<button class="btn btn-primary btn-lg" type="submit"><i class="la la-check"></i> Create page</button>
|
199
|
+
<button class="btn btn-secondary btn-lg" type="reset" data-dismiss="modal"><i class="la la-close"></i> Cancel
|
200
|
+
</button>
|
201
|
+
</div>
|
202
|
+
</div>
|
203
|
+
<input name="authenticity_token"
|
204
|
+
value="<%= form_authenticity_token %>"
|
205
|
+
type="hidden"></form>
|
206
|
+
</div>
|
207
|
+
</div>
|
208
|
+
|
209
|
+
<div class="alert flash-message d-none">
|
210
|
+
<span class="alert-text"></span>
|
211
|
+
<button class="alert-close close">
|
212
|
+
<span aria-hidden="true">×</span>
|
213
|
+
</button>
|
214
|
+
</div>
|
215
|
+
|
216
|
+
<!-- Image edit modal-->
|
217
|
+
<div class="modal fade" id="image-edit-modal" tabindex="-1" role="dialog" aria-hidden="true">
|
218
|
+
<div class="modal-dialog modal-xl h-100 my-0 py-3 py-lg-4 modal-xl" role="document">
|
219
|
+
<div class="modal-content" style="min-height: 100%;">
|
220
|
+
<div class="modal-body p-0">
|
221
|
+
<div id="tui-image-editor"></div>
|
222
|
+
</div>
|
223
|
+
<button type="button" data-dismiss="modal" style="right: 14px;top: 12px;"
|
224
|
+
class="btn btn-secondary btn-sm rounded-circle position-absolute ">
|
225
|
+
<i class="la la-close" style="vertical-align: middle;"></i>
|
226
|
+
</button>
|
227
|
+
</div>
|
228
|
+
</div>
|
229
|
+
</div>
|
230
|
+
|
231
|
+
<link rel="stylesheet" href="https://uicdn.toast.com/tui-image-editor/latest/tui-image-editor.css">
|
232
|
+
<link rel="stylesheet" type="text/css" href="https://uicdn.toast.com/tui-color-picker/latest/tui-color-picker.css">
|
233
|
+
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.6.7/fabric.js"></script>
|
234
|
+
<script type="text/javascript" src="https://uicdn.toast.com/tui.code-snippet/v1.5.0/tui-code-snippet.min.js"></script>
|
235
|
+
<script type="text/javascript" src="https://uicdn.toast.com/tui-color-picker/v2.2.0/tui-color-picker.js"></script>
|
236
|
+
<script src="https://uicdn.toast.com/tui-image-editor/latest/tui-image-editor.js"></script>
|
237
|
+
<div id="fronty-builder"><div id="top-panel"><img src="/assets/svg/logo.svg" alt="Fronty" class="float-left" id="logo"><div class="btn-group mr-3" role="group"> <button class="btn btn-light" title="Undo (Ctrl/Cmd + Z)" id="undo-btn" data-fronty-action="undo" data-fronty-shortcut="ctrl+z"> <i class="la la-undo"></i> </button> <button class="btn btn-light" title="Redo (Ctrl/Cmd + Shift + Z)" id="redo-btn" data-fronty-action="redo" data-fronty-shortcut="ctrl+shift+z"> <i class="la la-undo la-flip-horizontal"></i> </button></div><div class="btn-group mr-3" role="group"> <button class="btn btn-light" title="Designer Mode (Free component dragging)" id="designer-mode-btn" data-toggle="button" aria-pressed="false" data-fronty-action="setDesignerMode"> <i class="la la-hand-grab-o"></i> </button> <button class="btn btn-light" title="Preview" id="preview-btn" type="button" data-toggle="button" aria-pressed="false" data-fronty-action="preview"> <i class="la la-eye"></i> </button> <button class="btn btn-light" title="Fullscreen (F11)" id="fullscreen-btn" data-toggle="button" aria-pressed="false" data-fronty-action="fullscreen"> <i class="la la-arrows"></i> </button></div><div class="btn-group mr-3" role="group"> <button class="btn btn-light" title="Save locally" id="save-btn" data-fronty-shortcut="ctrl+e"> <i class="la la-save"></i> </button> <button class="btn btn-light" title="Download" id="save-btn" data-fronty-action="download" download="index.html"> <i class="la la-download"></i> </button></div><div class="btn-group float-right responsive-btns" role="group"> <button id="mobile-view" data-view="mobile" class="btn btn-light" title="Mobile view" data-fronty-action="viewport"> <i class="la la-mobile-phone"></i> </button> <button id="tablet-view" data-view="tablet" class="btn btn-light" title="Tablet view" data-fronty-action="viewport"> <i class="la la-tablet"></i> </button> <button id="desktop-view" data-view="" class="btn btn-light" title="Desktop view" data-fronty-action="viewport"> <i class="la la-laptop"></i> </button></div></div><div id="left-panel"> <div id="filemanager"> <div class="header"><a href="#" class="text-secondary">Pages</a><div class="btn-group responsive-btns mr-4 float-right" role="group"> <button class="btn btn-link btn-sm" title="New file" id="new-file-btn" data-fronty-action="newPage" data-fronty-shortcut=""> <i class="la la-file"></i> <small>New page</small> </button> </div></div><div class="tree"><ol></ol></div> </div> <div class="drag-elements"><div class="header"><ul class="nav nav-tabs" id="elements-tabs" role="tablist"> <li class="nav-item component-tab"><a class="nav-link active" id="components-tab" data-toggle="tab" href="#components" role="tab" aria-controls="components" aria-selected="true"><i class="la la-lg la-cube"></i> <div><small>Components</small></div></a> </li> <li class="nav-item blocks-tab"><a class="nav-link" id="blocks-tab" data-toggle="tab" href="#blocks" role="tab" aria-controls="blocks" aria-selected="false"><i class="la la-lg la-image"></i> <div><small>Blocks</small></div></a> </li> <li class="nav-item component-properties-tab" style="display:none"><a class="nav-link" id="components-tab" data-toggle="tab" href="#properties" role="tab" aria-controls="blocks" aria-selected="false"><i class="la la-lg la-cog"></i> <div><small>Properties</small></div></a> </li></ul><div class="tab-content"> <div class="tab-pane fade show active" id="components" role="tabpanel" aria-labelledby="components-tab"> <div class="search"> <input class="form-control form-control-sm component-search" placeholder="Search components" type="text" data-fronty-action="componentSearch" data-fronty-on="keyup"> <button class="clear-backspace" data-fronty-action="clearComponentSearch"> <i class="la la-close"></i> </button> </div><div class="drag-elements-sidepane sidepane"> <div> <ul class="components-list clearfix" data-type="leftpanel"></ul> </div></div> </div> <div class="tab-pane fade" id="blocks" role="tabpanel" aria-labelledby="blocks-tab"> <div class="search"> <input class="form-control form-control-sm block-search" placeholder="Search blocks" type="text" data-fronty-action="blockSearch" data-fronty-on="keyup"> <button class="clear-backspace" data-fronty-action="clearBlockSearch"> <i class="la la-close"></i> </button> </div><div class="drag-elements-sidepane sidepane"> <div> <ul class="blocks-list clearfix" data-type="leftpanel"></ul> </div></div> </div><div class="tab-pane fade" id="properties" role="tabpanel" aria-labelledby="blocks-tab"><div class="component-properties-sidepane"><div><div class="component-properties"><div class="mt-4 text-center">Click on an element to edit.</div></div></div></div></div></div></div> </div></div><div id="canvas"><div id="iframe-wrapper"><div id="iframe-layer"><div id="highlight-box"><div id="highlight-name"></div><div id="section-actions"><a id="add-section-btn" href="" title="Add element"><i class="la la-plus"></i></a></div></div><div id="select-box"><div id="wysiwyg-editor"><a id="bold-btn" href="" title="Bold"><i><strong>B</strong></i></a><a id="italic-btn" href="" title="Italic"><i>I</i></a><a id="underline-btn" href="" title="Underline"><u>u</u></a><a id="strike-btn" href="" title="Strikeout"><strike>S</strike></a><a id="link-btn" href="" title="Create link"><strong>a</strong></a></div><div id="select-actions"><a id="drag-btn" href="" title="Drag element"><i class="la la-arrows"></i></a><a id="parent-btn" href="" title="Select parent"><i class="la la-level-down la-rotate-180"></i></a><a id="up-btn" href="" title="Move element up"><i class="la la-arrow-up"></i></a><a id="down-btn" href="" title="Move element down"><i class="la la-arrow-down"></i></a><a id="clone-btn" href="" title="Clone element"><i class="la la-copy"></i></a><a id="delete-btn" href="" title="Remove element"><i class="la la-trash"></i></a></div></div><div id="add-section-box" class="drag-elements"><div class="header"><ul class="nav nav-tabs" id="box-elements-tabs" role="tablist"> <li class="nav-item component-tab"><a class="nav-link active" id="box-components-tab" data-toggle="tab" href="#box-components" role="tab" aria-controls="components" aria-selected="true"><i class="la la-lg la-cube"></i> <div><small>Components</small></div></a> </li> <li class="nav-item blocks-tab"><a class="nav-link" id="box-blocks-tab" data-toggle="tab" href="#box-blocks" role="tab" aria-controls="blocks" aria-selected="false"><i class="la la-lg la-image"></i> <div><small>Blocks</small></div></a> </li> <li class="nav-item component-properties-tab" style="display:none"><a class="nav-link" id="components-tab" data-toggle="tab" href="#box-properties" role="tab" aria-controls="blocks" aria-selected="false"><i class="la la-lg la-cog"></i> <div><small>Properties</small></div></a> </li></ul><div class="section-box-actions"><div id="close-section-btn" class="btn btn-light btn-sm bg-white btn-sm float-right"><i class="la la-close"></i></div><div class="small mt-1 mr-3 float-right"><div class="custom-control custom-radio custom-control-inline"> <input type="radio" id="add-section-insert-mode-after" value="after" checked="true" name="add-section-insert-mode" class="custom-control-input"> <label class="custom-control-label" for="add-section-insert-mode-after">After</label></div><div class="custom-control custom-radio custom-control-inline"> <input type="radio" id="add-section-insert-mode-inside" value="inside" name="add-section-insert-mode" class="custom-control-input"> <label class="custom-control-label" for="add-section-insert-mode-inside">Inside</label></div></div></div><div class="tab-content"> <div class="tab-pane fade show active" id="box-components" role="tabpanel" aria-labelledby="components-tab"> <div class="search"> <input class="form-control form-control-sm component-search" placeholder="Search components" type="text" data-fronty-action="addBoxComponentSearch" data-fronty-on="keyup"> <button class="clear-backspace" data-fronty-action="clearComponentSearch"> <i class="la la-close"></i> </button> </div><div> <div> <ul class="components-list clearfix" data-type="addbox"></ul> </div></div> </div> <div class="tab-pane fade" id="box-blocks" role="tabpanel" aria-labelledby="blocks-tab"> <div class="search"> <input class="form-control form-control-sm block-search" placeholder="Search blocks" type="text" data-fronty-action="addBoxBlockSearch" data-fronty-on="keyup"> <button class="clear-backspace" data-fronty-action="clearBlockSearch"> <i class="la la-close"></i> </button> </div><div> <div> <ul class="blocks-list clearfix" data-type="addbox"></ul> </div></div> </div><div class="tab-pane fade" id="box-properties" role="tabpanel" aria-labelledby="blocks-tab"><div class="component-properties-sidepane"><div><div class="component-properties"><div class="mt-4 text-center">Click on an element to edit.</div></div></div></div></div></div></div></div></div><iframe src="about:none" id="iframe1"></iframe></div></div><div id="right-panel"><div class="component-properties"></div></div><div id="bottom-panel"><div class="btn-group" role="group"> <button id="code-editor-btn btn-sm" data-view="mobile" class="btn btn-light btn-sm" title="Code editor" data-fronty-action="toggleEditor"> <i class="la la-code"></i> Code editor </button> <div id="toggleEditorJsExecute" class="custom-control custom-checkbox mt-1" style="display:none"><input type="checkbox" class="custom-control-input" id="customCheck" name="example1" data-fronty-action="toggleEditorJsExecute"><label class="custom-control-label" for="customCheck"><small>Run javascript code on edit</small></label></div></div><div id="fronty-code-editor"><textarea class="form-control"></textarea><div></div></div></div><script id="fronty-input-textinput" type="text/html"><div><input name="{%=key%}" type="text" class="form-control"/></div></script><script id="fronty-input-checkboxinput" type="text/html"><div class="custom-control custom-checkbox"> <input name="{%=key%}" class="custom-control-input" type="checkbox" id="{%=key%}_check"> <label class="custom-control-label" for="{%=key%}_check">{% if (typeof text !== 'undefined') { %} {%=text%} {% } %}</label></div></script><script id="fronty-input-radioinput" type="text/html"><div>{% for ( var i = 0; i < options.length; i++ ) { %}<label class="custom-control custom-radio {% if (typeof inline !== 'undefined' && inline == true) { %}custom-control-inline{% } %}" title="{%=options[i].title%}"> <input name="{%=key%}" class="custom-control-input" type="radio" value="{%=options[i].value%}" id="{%=key%}{%=i%}" {%if (options[i].checked) { %}checked="{%=options[i].checked%}"{% } %}> <label class="custom-control-label" for="{%=key%}{%=i%}">{%=options[i].text%}</label></label>{% } %}</div></script><script id="fronty-input-radiobuttoninput" type="text/html"><div class="btn-group btn-group-toggle {%if (extraclass) { %}{%=extraclass%}{% } %} clearfix" data-toggle="buttons">{% for ( var i = 0; i < options.length; i++ ) { %}<label class="btn btn-outline-primary {%if (options[i].checked) { %}active{% } %}" for="{%=key%}{%=i%} " title="{%=options[i].title%}"> <input name="{%=key%}" class="custom-control-input" type="radio" value="{%=options[i].value%}" id="{%=key%}{%=i%}" {%if (options[i].checked) { %}checked="{%=options[i].checked%}"{% } %}> {%if (options[i].icon) { %}<i class="{%=options[i].icon%}"></i>{% } %} {%=options[i].text%}</label>{% } %}</div></script><script id="fronty-input-toggle" type="text/html"> <div class="toggle"> <input type="checkbox" name="{%=key%}" value="{%=on%}" data-value-off="{%=off%}" data-value-on="{%=on%}" class="toggle-checkbox" id="{%=key%}"> <label class="toggle-label" for="{%=key%}"> <span class="toggle-inner"></span> <span class="toggle-switch"></span> </label> </div></script><script id="fronty-input-header" type="text/html"><h6 class="header">{%=header%}</h6></script><script id="fronty-input-select" type="text/html"><div><select class="form-control custom-select">{% for ( var i = 0; i < options.length; i++ ) { %}<option value="{%=options[i].value%}">{%=options[i].text%}</option>{% } %}</select></div></script><script id="fronty-input-listinput" type="text/html"><div class="row">{% for ( var i = 0; i < options.length; i++ ) { %}<div class="col-6"><div class="input-group"><input name="{%=key%}_{%=i%}" type="text" class="form-control" value="{%=options[i].text%}"/><div class="input-group-append"><button class="input-group-text btn btn-sm btn-danger"><i class="la la-trash la-lg"></i></button></div> </div> <br/></div>{% } %}{% if (typeof hide_remove === 'undefined') { %}<div class="col-12"><button class="btn btn-sm btn-outline-primary"><i class="la la-trash la-lg"></i> Add new</button></div>{% } %}</div></script><script id="fronty-input-grid" type="text/html"><div class="row"><div class="mb-1 col-12"><label>Flexbox</label><select class="form-control custom-select" name="col"><option value="">None</option>{% for ( var i = 1; i <= 12; i++ ) { %}<option value="{%=i%}" {% if ((typeof col !== 'undefined') && col == i) { %} selected {% } %}>{%=i%}</option>{% } %}</select><br/></div><div class="col-6"><label>Extra small</label><select class="form-control custom-select" name="col-xs"><option value="">None</option>{% for ( var i = 1; i <= 12; i++ ) { %}<option value="{%=i%}" {% if ((typeof col_xs !== 'undefined') && col_xs == i) { %} selected {% } %}>{%=i%}</option>{% } %}</select><br/></div><div class="col-6"><label>Small</label><select class="form-control custom-select" name="col-sm"><option value="">None</option>{% for ( var i = 1; i <= 12; i++ ) { %}<option value="{%=i%}" {% if ((typeof col_sm !== 'undefined') && col_sm == i) { %} selected {% } %}>{%=i%}</option>{% } %}</select><br/></div><div class="col-6"><label>Medium</label><select class="form-control custom-select" name="col-md"><option value="">None</option>{% for ( var i = 1; i <= 12; i++ ) { %}<option value="{%=i%}" {% if ((typeof col_md !== 'undefined') && col_md == i) { %} selected {% } %}>{%=i%}</option>{% } %}</select><br/></div><div class="col-6 mb-1"><label>Large</label><select class="form-control custom-select" name="col-lg"><option value="">None</option>{% for ( var i = 1; i <= 12; i++ ) { %}<option value="{%=i%}" {% if ((typeof col_lg !== 'undefined') && col_lg == i) { %} selected {% } %}>{%=i%}</option>{% } %}</select><br/></div>{% if (typeof hide_remove === 'undefined') { %}<div class="col-12"><button class="btn btn-sm btn-outline-light text-danger"><i class="la la-trash la-lg"></i> Remove</button></div>{% } %}</div></script><script id="fronty-input-textvalue" type="text/html"><div class="row"><div class="col-6 mb-1"><label>Value</label><input name="value" type="text" value="{%=value%}" class="form-control"/></div><div class="col-6 mb-1"><label>Text</label><input name="text" type="text" value="{%=text%}" class="form-control"/></div>{% if (typeof hide_remove === 'undefined') { %}<div class="col-12"><button class="btn btn-sm btn-outline-light text-danger"><i class="la la-trash la-lg"></i> Remove</button></div>{% } %}</div></script><script id="fronty-input-rangeinput" type="text/html"><div><input name="{%=key%}" type="range" min="{%=min%}" max="{%=max%}" step="{%=step%}" class="form-control"/></div></script><script id="fronty-input-imageinput" type="text/html"><div><input name="{%=key%}" type="text" class="form-control"/><input name="file" type="file" class="form-control"/></div></script><script id="fronty-input-colorinput" type="text/html"><div><input name="{%=key%}" type="color" {% if (typeof value !== 'undefined' && value != false) { %} value="{%=value%}" {% } %} pattern="#[a-f0-9]{6}" class="form-control"/></div></script><script id="fronty-input-numberinput" type="text/html"><div><input name="{%=key%}" type="number" value="{%=value%}" {% if (typeof min !== 'undefined' && min != false) { %}min="{%=min%}"{% } %} {% if (typeof max !== 'undefined' && max != false) { %}max="{%=max%}"{% } %} {% if (typeof step !== 'undefined' && step != false) { %}step="{%=step%}"{% } %} class="form-control"/></div></script><script id="fronty-input-button" type="text/html"><div><button class="btn btn-sm btn-primary"><i class="la {% if (typeof icon !== 'undefined') { %} {%=icon%} {% } else { %} la-plus {% } %} la-lg"></i> {%=text%}</button></div></script><script id="fronty-input-cssunitinput" type="text/html"><div class="input-group" id="cssunit-{%=key%}"><input name="number" type="number" {% if (typeof value !== 'undefined' && value != false) { %} value="{%=value%}" {% } %} {% if (typeof min !== 'undefined' && min != false) { %}min="{%=min%}"{% } %} {% if (typeof max !== 'undefined' && max != false) { %}max="{%=max%}"{% } %} {% if (typeof step !== 'undefined' && step != false) { %}step="{%=step%}"{% } %} class="form-control"/> <div class="input-group-append"><select class="form-control custom-select small-arrow" name="unit"><option value="em">em</option><option value="px">px</option><option value="%">%</option><option value="rem">rem</option><option value="auto">auto</option></select></div></div></script><script id="fronty-filemanager-page" type="text/html"><li data-url="{%=url%}" data-page="{%=name%}"><label for="{%=name%}"><span>{%=title%}</span></label> <input type="checkbox" checked id="{%=name%}" /><ol></ol></li></script><script id="fronty-filemanager-component" type="text/html"><li data-url="{%=url%}" data-component="{%=name%}" class="file"><a href="{%=url%}"><span>{%=title%}</span></a></li></script><script id="fronty-input-sectioninput" type="text/html"><label class="header" data-header="{%=key%}" for="header_{%=key%}"><span> {%=header%}</span> <div class="header-arrow"></div></label> <input class="header_check" type="checkbox" {% if (typeof expanded !== 'undefined' && expanded == false) { %} {% } else { %}checked="true"{% } %} id="header_{%=key%}"> <div class="section" data-section="{%=key%}"></div></script><script id="fronty-property" type="text/html"><div class="form-group {% if (typeof col !== 'undefined' && col != false) { %} col-sm-{%=col%} d-inline-block {% } else { %}row{% } %}" data-key="{%=key%}" {% if (typeof group !== 'undefined' && group != null) { %}data-group="{%=group%}" {% } %}>{% if (typeof name !== 'undefined' && name != false) { %}<label class="{% if (typeof inline === 'undefined' ) { %}col-sm-4{% } %} control-label" for="input-model">{%=name%}</label>{% } %}<div class="{% if (typeof inline === 'undefined') { %}col-sm-{% if (typeof name !== 'undefined' && name != false) { %}8{% } else { %}12{% } } %} input"></div></div> </script><script id="fronty-input-autocompletelist" type="text/html"><div><input name="{%=key%}" type="text" class="form-control"/><div class="form-control autocomplete-list" style="min=height: 150px; overflow: auto;"> <div id="featured-product43"><i class="la la-close"></i> MacBook <input name="product[]" value="43" type="hidden"> </div> <div id="featured-product40"><i class="la la-close"></i> iPhone <input name="product[]" value="40" type="hidden"> </div> <div id="featured-product42"><i class="la la-close"></i> Apple Cinema 30" <input name="product[]" value="42" type="hidden"> </div> <div id="featured-product30"><i class="la la-close"></i> Canon EOS 5D <input name="product[]" value="30" type="hidden"> </div></div></div></script><div class="modal fade" id="textarea-modal" tabindex="-1" role="dialog" aria-labelledby="textarea-modal" aria-hidden="true"> <div class="modal-dialog modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <p class="modal-title text-primary"><i class="la la-lg la-save"></i> Export html</p> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true"><small><i class="la la-close"></i></small></span> </button> </div> <div class="modal-body"> <textarea rows="25" cols="150" class="form-control"></textarea> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary btn-lg" data-dismiss="modal"><i class="la la-close"></i> Close</button> </div> </div> </div></div><div class="modal fade" id="message-modal" tabindex="-1" role="dialog"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <p class="modal-title text-primary"><i class="la la-lg la-comment"></i> Fronty Designer</p> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true"><small><i class="la la-close"></i></small></span> </button> </div> <div class="modal-body"> <p>Page was successfully saved!.</p> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary btn-lg" data-dismiss="modal"><i class="la la-close"></i> Close</button> </div> </div> </div></div><div class="modal fade" id="new-page-modal" tabindex="-1" role="dialog"> <div class="modal-dialog" role="document"> <form> <div class="modal-content"> <div class="modal-header"> <p class="modal-title text-primary"><i class="la la-lg la-file"></i> New page</p> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true"><small><i class="la la-close"></i></small></span> </button> </div> <div class="modal-body text"><div class="form-group row" data-key="type"> <label class="col-sm-3 control-label" for="input-model">Template <abbr class="badge badge-pill badge-secondary" title="This template will be used as a start">?</abbr> </label> <div class="col-sm-9 input"><div> <select class="form-control custom-select" name="startTemplateUrl"> </select> </div></div> </div><div class="form-group row" data-key="href"> <label class="col-sm-3 control-label" for="input-model"><p>Page name</p></label> <div class="col-sm-9 input"><div> <input name="title" type="text" class="form-control" placeholder="My page" required> </div></div> </div><div class="form-group row" data-key="href"> <label class="col-sm-3 control-label" for="input-model"><p>File name</p></label> <div class="col-sm-9 input"><div> <input name="fileName" type="text" class="form-control" placeholder="my-page.html" required> </div></div> </div> </div> <div class="modal-footer"> <button class="btn btn-primary btn-lg" type="submit"><i class="la la-check"></i> Create page</button> <button class="btn btn-secondary btn-lg" type="reset" data-dismiss="modal"><i class="la la-close"></i> Cancel</button> </div> </div> </form> </div></div><%= javascript_include_tag "fronty-designer" %><%= javascript_include_tag "fronty-designer-init" %>
|
238
|
+
|
239
|
+
<link rel="stylesheet" href="https://uicdn.toast.com/tui-image-editor/latest/tui-image-editor.css">
|
240
|
+
<link rel="stylesheet" type="text/css" href="https://uicdn.toast.com/tui-color-picker/latest/tui-color-picker.css">
|
241
|
+
<script src="https://cdn.jsdelivr.net/npm/tui-code-snippet@1.5.0/dist/tui-code-snippet.min.js"></script>
|
242
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.0/fabric.require.min.js"></script>
|
243
|
+
<script src="https://uicdn.toast.com/tui-color-picker/latest/tui-color-picker.js"></script>
|
244
|
+
<script src="https://uicdn.toast.com/tui-image-editor/latest/tui-image-editor.js"></script>
|
245
|
+
</body></html>
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "fronty_designer"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/config/routes.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Rails.application.routes.draw do
|
2
|
+
root 'pages#index', as: 'home'
|
3
|
+
|
4
|
+
get 'designer' => 'designers#index'
|
5
|
+
get 'get_pages' => 'designers#get_pages'
|
6
|
+
|
7
|
+
# Git
|
8
|
+
match '/designer/git_pull', to: 'designers#git_pull', via: 'post'
|
9
|
+
match '/designer/git_push', to: 'designers#git_push', via: 'post'
|
10
|
+
|
11
|
+
match '/designer/create', to: 'designers#create', via: 'post'
|
12
|
+
match '/designer/remove', to: 'designers#remove', via: 'post'
|
13
|
+
match '/designer/update', to: 'designers#update', via: 'post'
|
14
|
+
match '/designer/get_page_by_route', to: 'designers#get_page_by_route', via: 'post'
|
15
|
+
match '/designer/save', to: 'designers#save', via: 'post'
|
16
|
+
match '/designer/create_new_page', to: 'designers#create_new_page', via: 'post'
|
17
|
+
get '/designer/get_status/*job_id' => 'designers#get_status'
|
18
|
+
|
19
|
+
get '*path', to: 'pages#index'
|
20
|
+
end
|
data/fronty-gem.gemspec
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "fronty-gem/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "fronty-gem"
|
8
|
+
spec.version = FrontyGem::VERSION
|
9
|
+
spec.authors = ["Miqayel Manvelyan"]
|
10
|
+
spec.email = ["miqayel.m@vardanyan.am"]
|
11
|
+
|
12
|
+
spec.summary = 'asd'
|
13
|
+
spec.description = 'asdasdasd'
|
14
|
+
spec.homepage = "http://google.com"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
18
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
19
|
+
if spec.respond_to?(:metadata)
|
20
|
+
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
21
|
+
else
|
22
|
+
raise "RubyGems 2.0 or newer is required to protect against " \
|
23
|
+
"public gem pushes."
|
24
|
+
end
|
25
|
+
|
26
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
27
|
+
f.match(%r{^(test|spec|features)/})
|
28
|
+
end
|
29
|
+
spec.bindir = "exe"
|
30
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
31
|
+
spec.require_paths = ["lib"]
|
32
|
+
|
33
|
+
spec.add_development_dependency "bundler", "~> 2"
|
34
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
35
|
+
spec.add_dependency "interactor", "~> 3.0"
|
36
|
+
spec.add_dependency "rest-client"
|
37
|
+
end
|
data/lib/fronty-gem.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
:root {
|
2
|
+
--jumbotron-padding-y: 3rem;
|
3
|
+
}
|
4
|
+
|
5
|
+
.jumbotron {
|
6
|
+
padding-top: var(--jumbotron-padding-y);
|
7
|
+
padding-bottom: var(--jumbotron-padding-y);
|
8
|
+
margin-bottom: 0;
|
9
|
+
background-color: #fff;
|
10
|
+
}
|
11
|
+
@media (min-width: 768px) {
|
12
|
+
.jumbotron {
|
13
|
+
padding-top: calc(var(--jumbotron-padding-y) * 2);
|
14
|
+
padding-bottom: calc(var(--jumbotron-padding-y) * 2);
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
.jumbotron p:last-child {
|
19
|
+
margin-bottom: 0;
|
20
|
+
}
|
21
|
+
|
22
|
+
.jumbotron-heading {
|
23
|
+
font-weight: 300;
|
24
|
+
}
|
25
|
+
|
26
|
+
.jumbotron .container {
|
27
|
+
max-width: 40rem;
|
28
|
+
}
|
29
|
+
|
30
|
+
footer {
|
31
|
+
padding-top: 3rem;
|
32
|
+
padding-bottom: 3rem;
|
33
|
+
}
|
34
|
+
|
35
|
+
footer p {
|
36
|
+
margin-bottom: .25rem;
|
37
|
+
}
|
38
|
+
|
39
|
+
.box-shadow { box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); }
|
@@ -0,0 +1,231 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
6
|
+
<meta name="description" content="">
|
7
|
+
<meta name="author" content="">
|
8
|
+
<link rel="icon" href="../../../../favicon.ico">
|
9
|
+
|
10
|
+
<title>Album example for Bootstrap</title>
|
11
|
+
|
12
|
+
<!-- Bootstrap core CSS -->
|
13
|
+
<link href="../../css/editor.css" rel="stylesheet">
|
14
|
+
|
15
|
+
<!-- Custom styles for this template -->
|
16
|
+
<link href="album.css" rel="stylesheet">
|
17
|
+
</head>
|
18
|
+
|
19
|
+
<body>
|
20
|
+
|
21
|
+
<header>
|
22
|
+
<div class="collapse bg-dark" id="navbarHeader">
|
23
|
+
<div class="container">
|
24
|
+
<div class="row">
|
25
|
+
<div class="col-sm-8 col-md-7 py-4">
|
26
|
+
<h4 class="text-white">About</h4>
|
27
|
+
<p class="text-muted">Add some information about the album below, the author, or any other background context. Make it a few sentences long so folks can pick up some informative tidbits. Then, link them off to some social networking sites or contact information.</p>
|
28
|
+
</div>
|
29
|
+
<div class="col-sm-4 offset-md-1 py-4">
|
30
|
+
<h4 class="text-white">Contact</h4>
|
31
|
+
<ul class="list-unstyled">
|
32
|
+
<li><a href="#" class="text-white">Follow on Twitter</a></li>
|
33
|
+
<li><a href="#" class="text-white">Like on Facebook</a></li>
|
34
|
+
<li><a href="#" class="text-white">Email me</a></li>
|
35
|
+
</ul>
|
36
|
+
</div>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
<div class="navbar navbar-dark bg-dark box-shadow">
|
41
|
+
<div class="container d-flex justify-content-between">
|
42
|
+
<a href="#" class="navbar-brand d-flex align-items-center">
|
43
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="mr-2"><path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"></path><circle cx="12" cy="13" r="4"></circle></svg>
|
44
|
+
<strong>Album</strong>
|
45
|
+
</a>
|
46
|
+
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarHeader" aria-controls="navbarHeader" aria-expanded="false" aria-label="Toggle navigation">
|
47
|
+
<span class="navbar-toggler-icon"></span>
|
48
|
+
</button>
|
49
|
+
</div>
|
50
|
+
</div>
|
51
|
+
</header>
|
52
|
+
|
53
|
+
<main role="main">
|
54
|
+
|
55
|
+
<section class="jumbotron text-center">
|
56
|
+
<div class="container">
|
57
|
+
<h1 class="jumbotron-heading">Album example</h1>
|
58
|
+
<p class="lead text-muted">Something short and leading about the collection below—its contents, the creator, etc. Make it short and sweet, but not too short so folks don't simply skip over it entirely.</p>
|
59
|
+
<p>
|
60
|
+
<a href="#" class="btn btn-primary my-2">Main call to action</a>
|
61
|
+
<a href="#" class="btn btn-secondary my-2">Secondary action</a>
|
62
|
+
</p>
|
63
|
+
</div>
|
64
|
+
</section>
|
65
|
+
|
66
|
+
<div class="album py-5 bg-light">
|
67
|
+
<div class="container">
|
68
|
+
|
69
|
+
<div class="row">
|
70
|
+
<div class="col-md-4">
|
71
|
+
<div class="card mb-4 box-shadow">
|
72
|
+
<img class="card-img-top" data-src="holder.js/100px225?theme=thumb&bg=55595c&fg=eceeef&text=Thumbnail" alt="Card image cap">
|
73
|
+
<div class="card-body">
|
74
|
+
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
|
75
|
+
<div class="d-flex justify-content-between align-items-center">
|
76
|
+
<div class="btn-group">
|
77
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
|
78
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
|
79
|
+
</div>
|
80
|
+
<small class="text-muted">9 mins</small>
|
81
|
+
</div>
|
82
|
+
</div>
|
83
|
+
</div>
|
84
|
+
</div>
|
85
|
+
<div class="col-md-4">
|
86
|
+
<div class="card mb-4 box-shadow">
|
87
|
+
<img class="card-img-top" data-src="holder.js/100px225?theme=thumb&bg=55595c&fg=eceeef&text=Thumbnail" alt="Card image cap">
|
88
|
+
<div class="card-body">
|
89
|
+
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
|
90
|
+
<div class="d-flex justify-content-between align-items-center">
|
91
|
+
<div class="btn-group">
|
92
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
|
93
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
|
94
|
+
</div>
|
95
|
+
<small class="text-muted">9 mins</small>
|
96
|
+
</div>
|
97
|
+
</div>
|
98
|
+
</div>
|
99
|
+
</div>
|
100
|
+
<div class="col-md-4">
|
101
|
+
<div class="card mb-4 box-shadow">
|
102
|
+
<img class="card-img-top" data-src="holder.js/100px225?theme=thumb&bg=55595c&fg=eceeef&text=Thumbnail" alt="Card image cap">
|
103
|
+
<div class="card-body">
|
104
|
+
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
|
105
|
+
<div class="d-flex justify-content-between align-items-center">
|
106
|
+
<div class="btn-group">
|
107
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
|
108
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
|
109
|
+
</div>
|
110
|
+
<small class="text-muted">9 mins</small>
|
111
|
+
</div>
|
112
|
+
</div>
|
113
|
+
</div>
|
114
|
+
</div>
|
115
|
+
|
116
|
+
<div class="col-md-4">
|
117
|
+
<div class="card mb-4 box-shadow">
|
118
|
+
<img class="card-img-top" data-src="holder.js/100px225?theme=thumb&bg=55595c&fg=eceeef&text=Thumbnail" alt="Card image cap">
|
119
|
+
<div class="card-body">
|
120
|
+
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
|
121
|
+
<div class="d-flex justify-content-between align-items-center">
|
122
|
+
<div class="btn-group">
|
123
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
|
124
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
|
125
|
+
</div>
|
126
|
+
<small class="text-muted">9 mins</small>
|
127
|
+
</div>
|
128
|
+
</div>
|
129
|
+
</div>
|
130
|
+
</div>
|
131
|
+
<div class="col-md-4">
|
132
|
+
<div class="card mb-4 box-shadow">
|
133
|
+
<img class="card-img-top" data-src="holder.js/100px225?theme=thumb&bg=55595c&fg=eceeef&text=Thumbnail" alt="Card image cap">
|
134
|
+
<div class="card-body">
|
135
|
+
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
|
136
|
+
<div class="d-flex justify-content-between align-items-center">
|
137
|
+
<div class="btn-group">
|
138
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
|
139
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
|
140
|
+
</div>
|
141
|
+
<small class="text-muted">9 mins</small>
|
142
|
+
</div>
|
143
|
+
</div>
|
144
|
+
</div>
|
145
|
+
</div>
|
146
|
+
<div class="col-md-4">
|
147
|
+
<div class="card mb-4 box-shadow">
|
148
|
+
<img class="card-img-top" data-src="holder.js/100px225?theme=thumb&bg=55595c&fg=eceeef&text=Thumbnail" alt="Card image cap">
|
149
|
+
<div class="card-body">
|
150
|
+
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
|
151
|
+
<div class="d-flex justify-content-between align-items-center">
|
152
|
+
<div class="btn-group">
|
153
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
|
154
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
|
155
|
+
</div>
|
156
|
+
<small class="text-muted">9 mins</small>
|
157
|
+
</div>
|
158
|
+
</div>
|
159
|
+
</div>
|
160
|
+
</div>
|
161
|
+
|
162
|
+
<div class="col-md-4">
|
163
|
+
<div class="card mb-4 box-shadow">
|
164
|
+
<img class="card-img-top" data-src="holder.js/100px225?theme=thumb&bg=55595c&fg=eceeef&text=Thumbnail" alt="Card image cap">
|
165
|
+
<div class="card-body">
|
166
|
+
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
|
167
|
+
<div class="d-flex justify-content-between align-items-center">
|
168
|
+
<div class="btn-group">
|
169
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
|
170
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
|
171
|
+
</div>
|
172
|
+
<small class="text-muted">9 mins</small>
|
173
|
+
</div>
|
174
|
+
</div>
|
175
|
+
</div>
|
176
|
+
</div>
|
177
|
+
<div class="col-md-4">
|
178
|
+
<div class="card mb-4 box-shadow">
|
179
|
+
<img class="card-img-top" data-src="holder.js/100px225?theme=thumb&bg=55595c&fg=eceeef&text=Thumbnail" alt="Card image cap">
|
180
|
+
<div class="card-body">
|
181
|
+
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
|
182
|
+
<div class="d-flex justify-content-between align-items-center">
|
183
|
+
<div class="btn-group">
|
184
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
|
185
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
|
186
|
+
</div>
|
187
|
+
<small class="text-muted">9 mins</small>
|
188
|
+
</div>
|
189
|
+
</div>
|
190
|
+
</div>
|
191
|
+
</div>
|
192
|
+
<div class="col-md-4">
|
193
|
+
<div class="card mb-4 box-shadow">
|
194
|
+
<img class="card-img-top" data-src="holder.js/100px225?theme=thumb&bg=55595c&fg=eceeef&text=Thumbnail" alt="Card image cap">
|
195
|
+
<div class="card-body">
|
196
|
+
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
|
197
|
+
<div class="d-flex justify-content-between align-items-center">
|
198
|
+
<div class="btn-group">
|
199
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
|
200
|
+
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
|
201
|
+
</div>
|
202
|
+
<small class="text-muted">9 mins</small>
|
203
|
+
</div>
|
204
|
+
</div>
|
205
|
+
</div>
|
206
|
+
</div>
|
207
|
+
</div>
|
208
|
+
</div>
|
209
|
+
</div>
|
210
|
+
|
211
|
+
</main>
|
212
|
+
|
213
|
+
<footer class="text-muted">
|
214
|
+
<div class="container">
|
215
|
+
<p class="float-right">
|
216
|
+
<a href="#">Back to top</a>
|
217
|
+
</p>
|
218
|
+
<p>Album example is © Bootstrap, but please download and customize it for yourself!</p>
|
219
|
+
<p>New to Bootstrap? <a href="../../">Visit the homepage</a> or read our <a href="../../getting-started/">getting started guide</a>.</p>
|
220
|
+
</div>
|
221
|
+
</footer>
|
222
|
+
|
223
|
+
<!-- Bootstrap core JavaScript
|
224
|
+
================================================== -->
|
225
|
+
<!-- Placed at the end of the document so the pages load faster -->
|
226
|
+
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
|
227
|
+
<script src="../../js/vendor/popper.min.js"></script>
|
228
|
+
<script src="../../js/bootstrap.min.js"></script>
|
229
|
+
<script src="https://cdn.jsdelivr.net/npm/holderjs@2.9.4/holder.js"></script>
|
230
|
+
</body>
|
231
|
+
</html>
|