fronty-gem 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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>