fronty-gem 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/Gemfile +6 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +39 -0
  6. data/Rakefile +2 -0
  7. data/app/controllers/concerns/dynamic_content.rb +160 -0
  8. data/app/controllers/designers_controller.rb +257 -0
  9. data/app/controllers/pages_controller.rb +23 -0
  10. data/app/views/designers/editor.html.erb +245 -0
  11. data/app/views/pages/404.html.erb +2 -0
  12. data/app/views/pages/welcome.html.erb +2 -0
  13. data/bin/console +14 -0
  14. data/bin/setup +8 -0
  15. data/config/initializers/assets.rb +2 -0
  16. data/config/routes.rb +20 -0
  17. data/fronty-gem.gemspec +37 -0
  18. data/lib/config/routes.rb +3 -0
  19. data/lib/fronty-gem.rb +5 -0
  20. data/lib/fronty-gem/version.rb +3 -0
  21. data/lib/tasks/fronty.rake +14 -0
  22. data/vendor/assets/demo/album/album.css +39 -0
  23. data/vendor/assets/demo/album/index.html +231 -0
  24. data/vendor/assets/demo/blog/blog.css +130 -0
  25. data/vendor/assets/demo/blog/index.html +230 -0
  26. data/vendor/assets/demo/carousel/carousel.css +91 -0
  27. data/vendor/assets/demo/carousel/index.html +186 -0
  28. data/vendor/assets/demo/narrow-jumbotron/index.html +82 -0
  29. data/vendor/assets/demo/narrow-jumbotron/narrow-jumbotron.css +80 -0
  30. data/vendor/assets/demo/offcanvas/index.html +158 -0
  31. data/vendor/assets/demo/offcanvas/offcanvas.css +79 -0
  32. data/vendor/assets/demo/offcanvas/offcanvas.js +7 -0
  33. data/vendor/assets/demo/pricing/index.html +141 -0
  34. data/vendor/assets/demo/pricing/pricing.css +25 -0
  35. data/vendor/assets/demo/product/index.html +177 -0
  36. data/vendor/assets/demo/product/product.css +79 -0
  37. data/vendor/assets/fonts/line-awesome.eot +0 -0
  38. data/vendor/assets/fonts/line-awesome.svg +2628 -0
  39. data/vendor/assets/fonts/line-awesome.ttf +0 -0
  40. data/vendor/assets/fonts/line-awesome.woff +0 -0
  41. data/vendor/assets/fonts/line-awesome.woff2 +0 -0
  42. data/vendor/assets/images/icons/alert.svg +66 -0
  43. data/vendor/assets/images/icons/arrow-down.svg +60 -0
  44. data/vendor/assets/images/icons/arrow-right.svg +60 -0
  45. data/vendor/assets/images/icons/badge.svg +81 -0
  46. data/vendor/assets/images/icons/breadcrumbs.svg +77 -0
  47. data/vendor/assets/images/icons/button.svg +78 -0
  48. data/vendor/assets/images/icons/button_group.svg +81 -0
  49. data/vendor/assets/images/icons/button_toolbar.svg +87 -0
  50. data/vendor/assets/images/icons/cart.svg +62 -0
  51. data/vendor/assets/images/icons/categories.svg +62 -0
  52. data/vendor/assets/images/icons/chart.svg +1 -0
  53. data/vendor/assets/images/icons/checkbox.svg +66 -0
  54. data/vendor/assets/images/icons/checkout.svg +62 -0
  55. data/vendor/assets/images/icons/chevron-down.svg +67 -0
  56. data/vendor/assets/images/icons/chevron-right.svg +67 -0
  57. data/vendor/assets/images/icons/components/cart.svg +16 -0
  58. data/vendor/assets/images/icons/components/checkbox.svg +1 -0
  59. data/vendor/assets/images/icons/components/contact-form.svg +13 -0
  60. data/vendor/assets/images/icons/components/map.svg +12 -0
  61. data/vendor/assets/images/icons/container.svg +66 -0
  62. data/vendor/assets/images/icons/facebook.svg +1 -0
  63. data/vendor/assets/images/icons/file.svg +1 -0
  64. data/vendor/assets/images/icons/filters.svg +62 -0
  65. data/vendor/assets/images/icons/folder.svg +1 -0
  66. data/vendor/assets/images/icons/form.svg +66 -0
  67. data/vendor/assets/images/icons/grid_row.svg +66 -0
  68. data/vendor/assets/images/icons/heading.svg +66 -0
  69. data/vendor/assets/images/icons/hr.svg +66 -0
  70. data/vendor/assets/images/icons/image.svg +62 -0
  71. data/vendor/assets/images/icons/instagram.svg +62 -0
  72. data/vendor/assets/images/icons/jumbotron.svg +66 -0
  73. data/vendor/assets/images/icons/label.svg +73 -0
  74. data/vendor/assets/images/icons/link.svg +1 -0
  75. data/vendor/assets/images/icons/list_group.svg +66 -0
  76. data/vendor/assets/images/icons/map.svg +62 -0
  77. data/vendor/assets/images/icons/maps.png +0 -0
  78. data/vendor/assets/images/icons/minus_round.svg +1 -0
  79. data/vendor/assets/images/icons/navbar.svg +66 -0
  80. data/vendor/assets/images/icons/pagination.svg +68 -0
  81. data/vendor/assets/images/icons/panel.svg +66 -0
  82. data/vendor/assets/images/icons/paragraph.svg +66 -0
  83. data/vendor/assets/images/icons/paypal.svg +1 -0
  84. data/vendor/assets/images/icons/play-button.svg +42 -0
  85. data/vendor/assets/images/icons/plus_round.svg +1 -0
  86. data/vendor/assets/images/icons/product.png +0 -0
  87. data/vendor/assets/images/icons/product.svg +62 -0
  88. data/vendor/assets/images/icons/product_gallery.svg +68 -0
  89. data/vendor/assets/images/icons/products.svg +62 -0
  90. data/vendor/assets/images/icons/progressbar.svg +67 -0
  91. data/vendor/assets/images/icons/radio.svg +66 -0
  92. data/vendor/assets/images/icons/search.svg +69 -0
  93. data/vendor/assets/images/icons/select_input.svg +67 -0
  94. data/vendor/assets/images/icons/slider.svg +62 -0
  95. data/vendor/assets/images/icons/table.svg +66 -0
  96. data/vendor/assets/images/icons/text_area.svg +66 -0
  97. data/vendor/assets/images/icons/text_input.svg +66 -0
  98. data/vendor/assets/images/icons/twitter.svg +55 -0
  99. data/vendor/assets/images/icons/user.svg +62 -0
  100. data/vendor/assets/images/icons/video.svg +45 -0
  101. data/vendor/assets/images/icons/well.svg +82 -0
  102. data/vendor/assets/images/svg/icon-a.svg +235 -0
  103. data/vendor/assets/images/svg/icon-b.svg +224 -0
  104. data/vendor/assets/images/svg/icon-c.svg +224 -0
  105. data/vendor/assets/images/svg/icon-d.svg +224 -0
  106. data/vendor/assets/images/svg/logo.svg +41 -0
  107. data/vendor/assets/images/thumbnails/XX__.png +0 -0
  108. data/vendor/assets/images/thumbnails/comparison.png +0 -0
  109. data/vendor/assets/images/thumbnails/details-with-title-complate.png +0 -0
  110. data/vendor/assets/images/thumbnails/details.png +0 -0
  111. data/vendor/assets/images/thumbnails/footer-with-links.png +0 -0
  112. data/vendor/assets/images/thumbnails/footer.png +0 -0
  113. data/vendor/assets/images/thumbnails/header.png +0 -0
  114. data/vendor/assets/images/thumbnails/jumbotron-with-title.png +0 -0
  115. data/vendor/assets/images/thumbnails/jumbotron.png +0 -0
  116. data/vendor/assets/images/thumbnails/linkbar.png +0 -0
  117. data/vendor/assets/images/thumbnails/liticle.png +0 -0
  118. data/vendor/assets/images/thumbnails/logobar.png +0 -0
  119. data/vendor/assets/images/thumbnails/page-title.png +0 -0
  120. data/vendor/assets/images/thumbnails/quiz-complate.png +0 -0
  121. data/vendor/assets/images/thumbnails/quiz-with-hero-complate.png +0 -0
  122. data/vendor/assets/images/thumbnails/result-complate.png +0 -0
  123. data/vendor/assets/images/thumbnails/review-section.png +0 -0
  124. data/vendor/assets/images/thumbnails/review-v2-complate.png +0 -0
  125. data/vendor/assets/images/thumbnails/review-v3-complate.png +0 -0
  126. data/vendor/assets/images/thumbnails/review_section_v4_complate.png +0 -0
  127. data/vendor/assets/images/thumbnails/split-hero-complate.png +0 -0
  128. data/vendor/assets/images/thumbnails/subtitle-with-button-complate.png +0 -0
  129. data/vendor/assets/images/thumbnails/subtitle-with-link.png +0 -0
  130. data/vendor/assets/images/thumbnails/unknown-complate.png +0 -0
  131. data/vendor/assets/images/thumbnails/unknown1-complate.png +0 -0
  132. data/vendor/assets/images/thumbnails/video-section-complate.png +0 -0
  133. data/vendor/assets/javascript/fronty-designer-init.js +491 -0
  134. data/vendor/assets/javascript/fronty-designer.js +16518 -0
  135. data/vendor/assets/stylesheets/fronty-designer.css +11255 -0
  136. 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">&times;</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">&times;</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>&ensp;{%=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>
@@ -0,0 +1,2 @@
1
+ <h1>Error 404</h1>
2
+ <h2>Page not found!</h2>
@@ -0,0 +1,2 @@
1
+ <h1><%= @title %></h1>
2
+ <a href="/designer">Make your first page with Fronty</a>
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
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,2 @@
1
+ Rails.application.config.assets.precompile +=
2
+ %w(*.png *.jpg *.jpeg *.gif *.svg *.ttf *.woff *.woff2 *.eot bootstrap.min fronty-designer.css fronty-designer.js fronty-designer-init.js)
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
@@ -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
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ get '/designer' => 'designers#index'
3
+ end
data/lib/fronty-gem.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "fronty-gem/version"
2
+
3
+ module FrontyGem
4
+ class Engine < ::Rails::Engine; end
5
+ end
@@ -0,0 +1,3 @@
1
+ module FrontyGem
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,14 @@
1
+ def get_token
2
+ print('Token: ')
3
+ STDIN.gets.chop
4
+ end
5
+
6
+ namespace :fronty do
7
+ task :login => :environment do
8
+ token = get_token()
9
+
10
+ File.open('.token', 'w+') do |f|
11
+ f.write(token)
12
+ end
13
+ end
14
+ end
@@ -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 &copy; 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>