pages_core 3.12.0 → 3.12.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (199) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/app/assets/builds/fonts/661557ef.ttf +0 -0
  4. data/app/assets/builds/fonts/a18fc2d2.woff2 +0 -0
  5. data/app/assets/builds/fonts/b2c7b78f.woff2 +0 -0
  6. data/app/assets/builds/fonts/ceddc204.ttf +0 -0
  7. data/app/assets/builds/pages_core/admin-dist.js +60 -14
  8. data/app/assets/builds/pages_core/admin-dist.js.map +7 -0
  9. data/app/assets/builds/pages_core/admin.css +9272 -0
  10. data/app/assets/images/pages/admin/angle-down-solid.svg +1 -0
  11. data/app/assets/images/pages/admin/icon.svg +1 -0
  12. data/app/assets/stylesheets/pages_core/admin/components/archive.css +6 -0
  13. data/app/assets/stylesheets/{pages/admin/components/attachments.scss → pages_core/admin/components/attachments.css} +35 -28
  14. data/app/assets/stylesheets/{pages/admin.scss → pages_core/admin/components/base.css} +125 -123
  15. data/app/assets/stylesheets/pages_core/admin/components/forms.css +223 -0
  16. data/app/assets/stylesheets/{pages/admin/components/header.scss → pages_core/admin/components/header.css} +76 -46
  17. data/app/assets/stylesheets/{pages/admin/components/image_editor.scss → pages_core/admin/components/image_editor.css} +42 -31
  18. data/app/assets/stylesheets/{pages/admin/components/image_grid.scss → pages_core/admin/components/image_grid.css} +76 -64
  19. data/app/assets/stylesheets/{pages/admin/components/image_uploader.scss → pages_core/admin/components/image_uploader.css} +12 -12
  20. data/app/assets/stylesheets/{pages/admin/components/layout.scss → pages_core/admin/components/layout.css} +13 -9
  21. data/app/assets/stylesheets/pages_core/admin/components/links.css +40 -0
  22. data/app/assets/stylesheets/pages_core/admin/components/list_table.css +66 -0
  23. data/app/assets/stylesheets/{pages/admin/components/login.scss → pages_core/admin/components/login.css} +6 -5
  24. data/app/assets/stylesheets/{pages/admin/components/modal.scss → pages_core/admin/components/modal.css} +10 -12
  25. data/app/assets/stylesheets/{pages/admin/components/page_tree.scss → pages_core/admin/components/page_tree.css} +54 -55
  26. data/app/assets/stylesheets/{pages/admin/components/pagination.scss → pages_core/admin/components/pagination.css} +17 -17
  27. data/app/assets/stylesheets/pages_core/admin/components/search.css +27 -0
  28. data/app/assets/stylesheets/{pages/admin/components/sidebar.scss → pages_core/admin/components/sidebar.css} +8 -7
  29. data/app/assets/stylesheets/{pages/admin/components/tag_editor.scss → pages_core/admin/components/tag_editor.css} +10 -15
  30. data/app/assets/stylesheets/{pages/admin/components/textarea.scss → pages_core/admin/components/textarea.css} +1 -1
  31. data/app/assets/stylesheets/{pages/admin/components/toast.scss → pages_core/admin/components/toast.css} +5 -3
  32. data/app/assets/stylesheets/{pages/admin/components/toolbar.scss → pages_core/admin/components/toolbar.css} +56 -29
  33. data/app/assets/stylesheets/{pages/admin/controllers/pages.scss → pages_core/admin/controllers/pages.css} +69 -52
  34. data/app/assets/stylesheets/pages_core/admin/controllers/users.css +3 -0
  35. data/app/assets/stylesheets/pages_core/admin/vars.css +34 -0
  36. data/app/assets/stylesheets/pages_core/admin.postcss.css +9 -0
  37. data/app/controllers/admin/pages_controller.rb +12 -11
  38. data/app/controllers/concerns/pages_core/rss_controller.rb +17 -1
  39. data/app/controllers/pages_core/admin_controller.rb +6 -0
  40. data/app/controllers/pages_core/frontend/pages_controller.rb +9 -5
  41. data/app/controllers/pages_core/sitemaps_controller.rb +3 -5
  42. data/app/formatters/pages_core/image_embedder.rb +5 -27
  43. data/app/helpers/admin/calendars_helper.rb +8 -0
  44. data/app/helpers/admin/news_helper.rb +13 -0
  45. data/app/helpers/admin/pages_helper.rb +32 -0
  46. data/app/helpers/pages_core/admin/admin_helper.rb +11 -54
  47. data/app/helpers/pages_core/admin/deprecated_admin_helper.rb +40 -0
  48. data/app/helpers/pages_core/images_helper.rb +37 -0
  49. data/app/javascript/admin-dist.ts +2 -0
  50. data/app/javascript/components/Attachments/{Attachment.jsx → Attachment.tsx} +44 -35
  51. data/app/javascript/components/Attachments/{AttachmentEditor.jsx → AttachmentEditor.tsx} +23 -23
  52. data/app/javascript/components/{EditableImage.jsx → EditableImage.tsx} +28 -25
  53. data/app/javascript/components/{FileUploadButton.jsx → FileUploadButton.tsx} +15 -16
  54. data/app/javascript/components/ImageCropper/FocalPoint.tsx +94 -0
  55. data/app/javascript/components/ImageCropper/{Image.jsx → Image.tsx} +13 -14
  56. data/app/javascript/components/ImageCropper/{Toolbar.jsx → Toolbar.tsx} +19 -15
  57. data/app/javascript/components/ImageCropper/{useCrop.js → useCrop.ts} +80 -37
  58. data/app/javascript/components/{ImageCropper.jsx → ImageCropper.tsx} +17 -15
  59. data/app/javascript/components/ImageEditor/{Form.jsx → Form.tsx} +24 -23
  60. data/app/javascript/components/{ImageEditor.jsx → ImageEditor.tsx} +17 -15
  61. data/app/javascript/components/ImageGrid/{DragElement.jsx → DragElement.tsx} +12 -10
  62. data/app/javascript/components/ImageGrid/{GridImage.jsx → GridImage.tsx} +40 -30
  63. data/app/javascript/components/ImageGrid/{Placeholder.jsx → Placeholder.tsx} +5 -6
  64. data/app/javascript/components/ImageGrid.jsx +3 -4
  65. data/app/javascript/components/{ImageUploader.jsx → ImageUploader.tsx} +46 -41
  66. data/app/javascript/components/Modal.tsx +48 -0
  67. data/app/javascript/components/PageImages.tsx +28 -0
  68. data/app/javascript/components/{PageTreeDraggable.jsx → PageTree/Draggable.tsx} +79 -57
  69. data/app/javascript/components/{PageTreeNode.jsx → PageTree/Node.tsx} +86 -77
  70. data/app/javascript/components/PageTree/types.ts +15 -0
  71. data/app/javascript/components/PageTree.tsx +206 -0
  72. data/app/javascript/components/RichTextToolbarButton.tsx +17 -0
  73. data/app/javascript/components/TagEditor/{AddTagForm.jsx → AddTagForm.tsx} +9 -10
  74. data/app/javascript/components/TagEditor/{Tag.jsx → Tag.tsx} +8 -9
  75. data/app/javascript/components/{TagEditor.jsx → TagEditor.tsx} +12 -13
  76. data/app/javascript/components/Toast.tsx +61 -0
  77. data/app/javascript/components/drag/{draggedOrder.js → draggedOrder.ts} +22 -12
  78. data/app/javascript/components/drag/types.ts +28 -0
  79. data/app/javascript/components/drag/{useDragCollection.js → useDragCollection.ts} +40 -22
  80. data/app/javascript/components/drag/{useDragUploader.js → useDragUploader.ts} +34 -25
  81. data/app/javascript/components/drag/useDraggable.ts +21 -0
  82. data/app/javascript/components/{drag.js → drag.ts} +1 -0
  83. data/app/javascript/controllers/{EditPageController.js → EditPageController.ts} +3 -1
  84. data/app/javascript/controllers/{LoginController.js → LoginController.ts} +7 -3
  85. data/app/javascript/controllers/{MainController.js → MainController.ts} +19 -14
  86. data/app/javascript/{index.js → index.ts} +8 -7
  87. data/app/javascript/lib/{Tree.js → Tree.ts} +106 -85
  88. data/app/javascript/lib/{copyToClipboard.js → copyToClipboard.ts} +1 -1
  89. data/app/javascript/lib/{readyHandler.js → readyHandler.ts} +4 -2
  90. data/app/javascript/lib/{request.js → request.ts} +11 -5
  91. data/app/javascript/stores/useModalStore.ts +15 -0
  92. data/app/javascript/stores/useToastStore.ts +26 -0
  93. data/app/javascript/stores.ts +2 -0
  94. data/app/javascript/types.ts +30 -0
  95. data/app/mailers/admin_mailer.rb +1 -0
  96. data/app/models/invite.rb +8 -0
  97. data/app/policies/page_policy.rb +4 -0
  98. data/app/views/admin/calendars/_sidebar.html.erb +50 -0
  99. data/app/views/admin/calendars/show.html.erb +15 -53
  100. data/app/views/admin/invites/new.html.erb +2 -8
  101. data/app/views/admin/invites/show.html.erb +2 -4
  102. data/app/views/admin/news/_sidebar.html.erb +51 -0
  103. data/app/views/admin/news/index.html.erb +21 -56
  104. data/app/views/admin/pages/_list_item.html.erb +4 -22
  105. data/app/views/admin/pages/_search_bar.html.erb +12 -0
  106. data/app/views/admin/pages/deleted.html.erb +10 -8
  107. data/app/views/admin/pages/edit.html.erb +20 -11
  108. data/app/views/admin/pages/index.html.erb +10 -8
  109. data/app/views/admin/pages/new.html.erb +10 -14
  110. data/app/views/admin/pages/search.html.erb +54 -0
  111. data/app/views/admin/password_resets/show.html.erb +3 -5
  112. data/app/views/admin/users/deactivated.html.erb +6 -7
  113. data/app/views/admin/users/edit.html.erb +7 -9
  114. data/app/views/admin/users/index.html.erb +3 -6
  115. data/app/views/admin/users/login.html.erb +4 -5
  116. data/app/views/admin/users/new.html.erb +2 -4
  117. data/app/views/admin/users/new_password.html.erb +4 -5
  118. data/app/views/admin/users/show.html.erb +11 -9
  119. data/app/views/errors/401.html.erb +2 -1
  120. data/app/views/errors/403.html.erb +2 -1
  121. data/app/views/errors/404.html.erb +1 -3
  122. data/app/views/errors/405.html.erb +2 -1
  123. data/app/views/errors/422.html.erb +2 -1
  124. data/app/views/errors/500.html.erb +2 -3
  125. data/app/views/feeds/pages.rss.builder +3 -9
  126. data/app/views/layouts/admin/_header.html.erb +1 -2
  127. data/app/views/layouts/admin/_page_header.html.erb +4 -4
  128. data/app/views/layouts/admin.html.erb +3 -3
  129. data/app/views/layouts/errors.html.erb +127 -4
  130. data/config/routes.rb +1 -0
  131. data/lib/pages_core/configuration/pages.rb +0 -1
  132. data/lib/pages_core/engine.rb +4 -3
  133. data/lib/pages_core.rb +0 -1
  134. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +33 -17
  135. data/lib/rails/generators/pages_core/frontend/templates/application.html.erb +0 -1
  136. data/lib/rails/generators/pages_core/frontend/templates/javascript/lib/gridOverlay.ts +40 -0
  137. data/lib/rails/generators/pages_core/frontend/templates/javascript/lib/responsiveEmbeds.ts +68 -0
  138. data/lib/rails/generators/pages_core/frontend/templates/postcss.config.js +17 -0
  139. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/application.postcss.css +4 -0
  140. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/components/base.css +24 -0
  141. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/components/layout.css +21 -0
  142. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/config.css +5 -0
  143. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/global/animation.css +5 -0
  144. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/global/colors.css +18 -0
  145. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/global/fonts.css +6 -0
  146. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/global/grid.css +65 -0
  147. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/global/typography.css +131 -0
  148. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +0 -3
  149. metadata +104 -255
  150. data/app/assets/images/pages/admin/icon.png +0 -0
  151. data/app/assets/images/pages/admin/image-editor-bg.png +0 -0
  152. data/app/assets/images/pages/admin/list-table-pin-blue.gif +0 -0
  153. data/app/assets/images/pages/admin/list-table-pin-disabled.gif +0 -0
  154. data/app/assets/images/pages/admin/list-table-pin-green.gif +0 -0
  155. data/app/assets/images/pages/admin/list-table-pin-red.gif +0 -0
  156. data/app/assets/images/pages/admin/list-table-pin-yellow.gif +0 -0
  157. data/app/assets/images/pages/admin/loading-modal.gif +0 -0
  158. data/app/assets/images/pages/feed-icon-14x14.png +0 -0
  159. data/app/assets/stylesheets/pages/admin/components/archive.scss +0 -6
  160. data/app/assets/stylesheets/pages/admin/components/buttons.scss +0 -23
  161. data/app/assets/stylesheets/pages/admin/components/forms.scss +0 -169
  162. data/app/assets/stylesheets/pages/admin/components/links.scss +0 -43
  163. data/app/assets/stylesheets/pages/admin/components/list_table.scss +0 -61
  164. data/app/assets/stylesheets/pages/admin/controllers/users.scss +0 -3
  165. data/app/assets/stylesheets/pages/admin/mixins/breakpoints.scss +0 -21
  166. data/app/assets/stylesheets/pages/admin/mixins/clearfix.scss +0 -7
  167. data/app/assets/stylesheets/pages/admin/mixins/gradients.scss +0 -7
  168. data/app/assets/stylesheets/pages/admin/vars.scss +0 -30
  169. data/app/assets/stylesheets/pages/errors.css +0 -128
  170. data/app/javascript/admin-dist.js +0 -2
  171. data/app/javascript/components/ImageCropper/FocalPoint.jsx +0 -93
  172. data/app/javascript/components/Modal.jsx +0 -59
  173. data/app/javascript/components/PageImages.jsx +0 -25
  174. data/app/javascript/components/PageTree.jsx +0 -196
  175. data/app/javascript/components/RichTextToolbarButton.jsx +0 -20
  176. data/app/javascript/components/Toast.jsx +0 -72
  177. data/app/javascript/components/drag/useDraggable.js +0 -17
  178. data/app/javascript/stores/ModalStore.jsx +0 -12
  179. data/app/javascript/stores/ToastStore.jsx +0 -14
  180. data/app/javascript/stores.js +0 -2
  181. data/lib/rails/generators/pages_core/frontend/templates/javascript/lib/GridOverlay.js +0 -66
  182. data/lib/rails/generators/pages_core/frontend/templates/javascript/lib/ResponsiveEmbeds.js +0 -72
  183. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/application.sass.scss +0 -15
  184. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/components/base.scss +0 -12
  185. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/config.scss +0 -26
  186. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/framework/breakpoints.scss +0 -42
  187. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/framework/clearfix.scss +0 -7
  188. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/framework/fonts.scss +0 -32
  189. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/framework/grid.scss +0 -168
  190. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/framework/grid_overlay.scss +0 -44
  191. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/global/colors.scss +0 -8
  192. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/global/typography.scss +0 -90
  193. data/lib/rails/generators/pages_core/frontend/templates/stylesheets/vendor/normalize.css +0 -349
  194. data/vendor/assets/stylesheets/ReactCrop.css +0 -167
  195. /data/app/assets/stylesheets/{pages/admin/components/tabs.scss → pages_core/admin/components/tabs.css} +0 -0
  196. /data/app/javascript/components/Attachments/{Placeholder.jsx → Placeholder.tsx} +0 -0
  197. /data/app/javascript/components/ImageGrid/{FilePlaceholder.jsx → FilePlaceholder.tsx} +0 -0
  198. /data/app/javascript/{components.js → components.ts} +0 -0
  199. /data/app/javascript/{hooks.js → hooks.ts} +0 -0
@@ -1,196 +0,0 @@
1
- import React from "react";
2
- import PropTypes from "prop-types";
3
- import PageTreeDraggable from "./PageTreeDraggable";
4
- import Tree from "../lib/Tree";
5
- import { postJson, putJson } from "../lib/request";
6
-
7
- export default class PageTree extends React.Component {
8
- constructor(props) {
9
- super(props);
10
-
11
- this.state = { tree: this.buildTree(props.pages) };
12
-
13
- this.addChild = this.addChild.bind(this);
14
- this.movedPage = this.movedPage.bind(this);
15
- this.toggleCollapsed = this.toggleCollapsed.bind(this);
16
- this.updatePage = this.updatePage.bind(this);
17
- this.updateTree = this.updateTree.bind(this);
18
- }
19
-
20
- addChild(id, attributes) {
21
- let tree = this.state.tree;
22
- var index = tree.append(attributes, id);
23
- this.reorderChildren(id);
24
- this.setCollapsed(id, false);
25
- this.createPage(index, attributes);
26
- this.setState({tree: tree});
27
- }
28
-
29
- movedPage(id) {
30
- let tree = this.state.tree;
31
- let index = tree.getIndex(id);
32
- this.reorderChildren(index.parent);
33
-
34
- let parent = tree.getIndex(index.parent);
35
- let position = parent.children.indexOf(id) + 1;
36
-
37
- this.movePage(index, parent, position);
38
- this.setState({tree: tree});
39
- }
40
-
41
- toggleCollapsed(id) {
42
- let tree = this.state.tree;
43
- var node = tree.getIndex(id).node;
44
- this.setCollapsed(id, !node.collapsed);
45
- this.setState({tree: tree});
46
- }
47
-
48
- updatePage(id, attributes) {
49
- let tree = this.state.tree;
50
- let index = tree.getIndex(id);
51
- let url = `/admin/${index.node.locale}/pages/${index.node.id}.json`;
52
- this.updateNode(index, attributes);
53
- this.performUpdate(index, url, { page: attributes });
54
- }
55
-
56
- updateTree(tree) {
57
- this.setState({ tree: tree });
58
- }
59
-
60
- applyCollapsed(tree) {
61
- const depth = (t, index) => {
62
- var depth = 0;
63
- let pointer = t.getIndex(index.parent);
64
- while (pointer) {
65
- depth += 1;
66
- pointer = t.getIndex(pointer.parent);
67
- }
68
- return depth;
69
- };
70
-
71
- let collapsedState = this.collapsedState();
72
- let walk = function (id) {
73
- var index = tree.getIndex(id);
74
- var node = index.node;
75
- if (Object.prototype.hasOwnProperty.call(collapsedState, node.id)) {
76
- node.collapsed = collapsedState[node.id];
77
- } else if (node.news_page) {
78
- node.collapsed = true;
79
- } else if (depth(tree, index) > 1) {
80
- node.collapsed = true;
81
- }
82
- if (index.children && index.children.length) {
83
- index.children.forEach(c => walk(c));
84
- }
85
- };
86
- walk(1);
87
- }
88
-
89
- collapsedState() {
90
- if (window && window.localStorage &&
91
- typeof(window.localStorage.collapsedPages) != "undefined") {
92
- return JSON.parse(window.localStorage.collapsedPages);
93
- }
94
- return {};
95
- }
96
-
97
- createPage(index, attributes) {
98
- postJson(`/admin/${index.node.locale}/pages.json`, { page: attributes })
99
- .then(response => this.updateNode(index, response));
100
- }
101
-
102
- buildTree(pages) {
103
- // Build tree
104
- let parentMap = pages.reduce((m, page) => {
105
- let id = page.parent_page_id;
106
- m[id] = [...(m[id] || []), page];
107
- return m;
108
- }, {});
109
-
110
- pages.forEach((p) => p.children = parentMap[p.id] || []);
111
-
112
- let tree = new Tree({ name: "All Pages",
113
- locale: this.props.locale,
114
- permissions: this.props.permissions,
115
- root: true,
116
- children: parentMap[null] });
117
- this.applyCollapsed(tree);
118
- tree.updateNodesPosition();
119
- return tree;
120
- }
121
-
122
- movePage(index, parent, position) {
123
- let data = {
124
- parent_id: parent.node.id,
125
- position: position
126
- };
127
- let url = `/admin/${index.node.locale}/pages/${index.node.id}/move.json`;
128
- this.performUpdate(index, url, data);
129
- }
130
-
131
- performUpdate(index, url, data) {
132
- putJson(url, data).then(response => this.updateNode(index, response));
133
- }
134
-
135
- render() {
136
- return(
137
- <PageTreeDraggable tree={this.state.tree}
138
- addChild={this.addChild}
139
- movedPage={this.movedPage}
140
- toggleCollapsed={this.toggleCollapsed}
141
- updatePage={this.updatePage}
142
- updateTree={this.updateTree}
143
- locale={this.props.locale}
144
- dir={this.props.dir} />
145
- );
146
- }
147
-
148
- reorderChildren(id) {
149
- let tree = this.state.tree;
150
- var index = this.state.tree.getIndex(id);
151
- var node = index.node;
152
- if (!node.news_page) {
153
- return;
154
- }
155
- index.children = index.children.sort(function (a, b) {
156
- var aNode = tree.getIndex(a).node;
157
- var bNode = tree.getIndex(b).node;
158
- if (aNode.pinned == bNode.pinned) {
159
- return new Date(bNode.published_at) - new Date(aNode.published_at);
160
- } else {
161
- return aNode.pinned ? -1 : 1;
162
- }
163
- });
164
- tree.updateNodesPosition();
165
- }
166
-
167
- setCollapsed(id, value) {
168
- var node = this.state.tree.getIndex(id).node;
169
- node.collapsed = value;
170
- this.storeCollapsed(id, node.collapsed);
171
- this.state.tree.updateNodesPosition();
172
- }
173
-
174
- storeCollapsed(id, newState) {
175
- let node = this.state.tree.getIndex(id).node;
176
- var store = this.collapsedState();
177
- store[node.id] = newState;
178
- window.localStorage.collapsedPages = JSON.stringify(store);
179
- }
180
-
181
- updateNode(index, attributes) {
182
- for (var attr in attributes) {
183
- if (Object.prototype.hasOwnProperty.call(attributes, attr)) {
184
- index.node[attr] = attributes[attr];
185
- }
186
- }
187
- this.setState({ tree: this.state.tree });
188
- }
189
- }
190
-
191
- PageTree.propTypes = {
192
- pages: PropTypes.array,
193
- locale: PropTypes.string,
194
- dir: PropTypes.string,
195
- permissions: PropTypes.array
196
- };
@@ -1,20 +0,0 @@
1
- import React from "react";
2
- import PropTypes from "prop-types";
3
-
4
- export default class RichTextToolbarButton extends React.Component {
5
- render() {
6
- return (
7
- <a title={this.props.name}
8
- className={"button " + this.props.className}
9
- onClick={this.props.onClick}>
10
- <i className={"fa fa-" + this.props.className} />
11
- </a>
12
- );
13
- }
14
- }
15
-
16
- RichTextToolbarButton.propTypes = {
17
- className: PropTypes.string,
18
- name: PropTypes.string,
19
- onClick: PropTypes.func
20
- };
@@ -1,72 +0,0 @@
1
- import React from "react";
2
- import PropTypes from "prop-types";
3
- import ToastStore from "../stores/ToastStore";
4
-
5
- export default class Toast extends React.Component {
6
- constructor(props) {
7
- super(props);
8
- this.state = { toast: undefined,
9
- fadeout: false };
10
- this.store = ToastStore;
11
- this.timer = undefined;
12
- this.handleChange = this.handleChange.bind(this);
13
- }
14
-
15
- componentDidMount() {
16
- this.unsubscribe = this.store.subscribe(this.handleChange);
17
- if (this.props.error) {
18
- this.store.dispatch({ type: "ERROR", message: this.props.error });
19
- }
20
- if (this.props.notice) {
21
- this.store.dispatch({ type: "NOTICE", message: this.props.notice });
22
- }
23
- }
24
-
25
- componentWillUnmount() {
26
- this.unsubscribe();
27
- if (this.timer) {
28
- clearTimeout(this.timer);
29
- }
30
- }
31
-
32
- handleChange() {
33
- this.setState({ toast: this.store.getState()[0], fadeout: false });
34
- if (!this.timer) {
35
- this.timer = setTimeout(() => {
36
- this.setState({ fadeout: true });
37
- this.timer = setTimeout(() => {
38
- this.timer = undefined;
39
- this.setState({ fadeout: false });
40
- this.store.dispatch({ type: "NEXT" });
41
- }, 500);
42
- }, 4000);
43
- }
44
- }
45
-
46
- render() {
47
- let toast = this.state.toast;
48
- let classNames = ["toast"];
49
-
50
- if (toast) {
51
- classNames.push(toast.type);
52
- if (this.state.fadeout) {
53
- classNames.push("fadeout");
54
- }
55
- }
56
-
57
- return (
58
- <div className="toast-wrapper" aria-live="polite">
59
- {toast && (
60
- <div className={classNames.join(" ")}>
61
- {toast.message}
62
- </div>
63
- )}
64
- </div>
65
- );
66
- }
67
- }
68
-
69
- Toast.propTypes = {
70
- notice: PropTypes.string,
71
- error: PropTypes.string
72
- };
@@ -1,17 +0,0 @@
1
- import { useEffect, useRef } from "react";
2
-
3
- export default function useDraggable(draggable, startDrag) {
4
- const ref = useRef();
5
-
6
- const handleDrag = (evt) => {
7
- evt.preventDefault();
8
- evt.stopPropagation();
9
- startDrag(evt, draggable);
10
- };
11
-
12
- useEffect(() => {
13
- draggable.ref.current = ref.current;
14
- }, []);
15
-
16
- return { ref: ref, onDragStart: handleDrag, draggable: true };
17
- }
@@ -1,12 +0,0 @@
1
- import { createStore } from "redux";
2
-
3
- export default createStore((state = {}, action) => {
4
- switch(action.type) {
5
- case "OPEN":
6
- return {...state, component: action.payload };
7
- case "CLOSE":
8
- return {...state, component: null };
9
- default:
10
- return state;
11
- }
12
- });
@@ -1,14 +0,0 @@
1
- import { createStore } from "redux";
2
-
3
- export default createStore((state = [], action) => {
4
- switch(action.type) {
5
- case "ERROR":
6
- return [...state, { message: action.message, type: "error" }];
7
- case "NOTICE":
8
- return [...state, { message: action.message, type: "notice" }];
9
- case "NEXT":
10
- return state.slice(1);
11
- default:
12
- return state;
13
- }
14
- });
@@ -1,2 +0,0 @@
1
- export { default as ModalStore } from "./stores/ModalStore";
2
- export { default as ToastStore } from "./stores/ToastStore";
@@ -1,66 +0,0 @@
1
- class GridOverlay {
2
- constructor() {
3
- this.gridOverlay = null;
4
- this.showGrid = false;
5
- this.init = this.init.bind(this);
6
- }
7
-
8
- bindHotkey() {
9
- document.addEventListener("keyup", (evt) => {
10
- if (evt.ctrlKey && evt.which == 71) {
11
- this.toggle();
12
- }
13
- });
14
- }
15
-
16
- init() {
17
- this.gridOverlay = document.querySelector(".grid-overlay");
18
- if (this.gridOverlay) {
19
- this.restoreState();
20
- this.bindHotkey();
21
- this.updateDOM();
22
- }
23
- }
24
-
25
- ready(callback) {
26
- if (document.readyState === "complete" ||
27
- (document.readyState !== "loading" &&
28
- !document.documentElement.doScroll)) {
29
- callback();
30
- } else {
31
- document.addEventListener("DOMContentLoaded", callback);
32
- }
33
- }
34
-
35
- restoreState() {
36
- this.showGrid = window.localStorage.getItem("showGrid");
37
- }
38
-
39
- saveState() {
40
- if (this.showGrid) {
41
- window.localStorage.setItem("showGrid", "true");
42
- } else {
43
- window.localStorage.removeItem("showGrid");
44
- }
45
- }
46
-
47
- start() {
48
- this.ready(this.init);
49
- }
50
-
51
- toggle() {
52
- this.showGrid = !this.showGrid;
53
- this.saveState();
54
- this.updateDOM();
55
- }
56
-
57
- updateDOM() {
58
- if (this.showGrid) {
59
- this.gridOverlay.classList.add("grid-overlay--active");
60
- } else {
61
- this.gridOverlay.classList.remove("grid-overlay--active");
62
- }
63
- }
64
- }
65
-
66
- export default new GridOverlay();
@@ -1,72 +0,0 @@
1
- class ResponsiveEmbeds {
2
- readyHandler(fn) {
3
- if (document.readyState === "complete" || document.readyState === "interactive") {
4
- setTimeout(fn, 1);
5
- } else {
6
- document.addEventListener("DOMContentLoaded", fn);
7
- }
8
- }
9
-
10
- wrapEmbeds() {
11
- let selectors = [ "iframe[src*=\"bandcamp.com\"]",
12
- "iframe[src*=\"player.vimeo.com\"]",
13
- "iframe[src*=\"youtube.com\"]",
14
- "iframe[src*=\"youtube-nocookie.com\"]",
15
- "iframe[src*=\"spotify.com\"]",
16
- "iframe[src*=\"kickstarter.com\"][src*=\"video.html\"]" ];
17
-
18
- let embeds = Array.prototype.slice.call(
19
- document.querySelectorAll(selectors.join(","))
20
- );
21
-
22
- function wrapEmbed(embed) {
23
- const parent = embed.parentNode;
24
-
25
- // Recycle the existing container if the embed is already responsive.
26
- if (parent.tagName === "DIV" &&
27
- parent.childNodes.length === 1 &&
28
- parent.style.position === "relative") {
29
- return parent;
30
- }
31
-
32
- let wrapper = document.createElement("div");
33
- if (parent.tagName === "P") {
34
- parent.parentNode.replaceChild(wrapper, parent);
35
- } else {
36
- parent.replaceChild(wrapper, embed);
37
- }
38
- wrapper.appendChild(embed);
39
- return wrapper;
40
- }
41
-
42
- embeds.forEach(function (embed) {
43
- if (embed.parentNode &&
44
- embed.parentNode.classList.contains("responsive-embed")) {
45
- return;
46
- }
47
-
48
- let width = embed.offsetWidth;
49
- let height = embed.offsetHeight;
50
- let ratio = height / width;
51
- let wrapper = wrapEmbed(embed);
52
-
53
- wrapper.classList.add("responsive-embed");
54
- wrapper.style.position = "relative";
55
- wrapper.style.width = "100%";
56
- wrapper.style.paddingTop = 0;
57
- wrapper.style.paddingBottom = (ratio * 100) + "%";
58
-
59
- embed.style.position = "absolute";
60
- embed.style.width = "100%";
61
- embed.style.height = "100%";
62
- embed.style.top = "0";
63
- embed.style.left = "0";
64
- });
65
- }
66
-
67
- start() {
68
- this.readyHandler(() => this.wrapEmbeds());
69
- }
70
- }
71
-
72
- export default new ResponsiveEmbeds();
@@ -1,15 +0,0 @@
1
- // Entry point for your Sass build
2
- @import
3
- 'vendor/normalize',
4
- 'config',
5
-
6
- 'framework/breakpoints',
7
- 'framework/clearfix',
8
- 'framework/grid',
9
- 'framework/grid_overlay',
10
- 'framework/fonts',
11
-
12
- 'global/colors',
13
- 'global/typography',
14
-
15
- 'components/base';
@@ -1,12 +0,0 @@
1
- *, *:before, *:after {
2
- -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;
3
- }
4
-
5
- figure {
6
- padding: 0px;
7
- margin: 0px;
8
- }
9
-
10
- img {
11
- display: block;
12
- }
@@ -1,26 +0,0 @@
1
- $breakpoints: (mobile: 900px,
2
- large: 1400px);
3
-
4
- $grids : (default: (column-count: 12,
5
- column: 94px,
6
- gutter: 24px,
7
- padding: 24px),
8
- mobile: (column-count: 4,
9
- column: 60px,
10
- gutter: 16px,
11
- padding: 16px));
12
-
13
- $spacings: (1: 8px,
14
- 2: 16px,
15
- 3: 24px,
16
- 4: 32px,
17
- 5: 40px,
18
- 6: 48px,
19
- 8: 64px,
20
- 9: 72px,
21
- 10: 80px,
22
- 16: 128px,
23
- 20: 160px);
24
-
25
- // Uncomment to limit full width
26
- // $limit-width: 1600px;
@@ -1,42 +0,0 @@
1
- // ---- Defaults --------------------------------------------------------------
2
-
3
- $breakpoints: (mobile: 900px,
4
- large: 1400px) !default;
5
-
6
-
7
- // ---- Mixins ----------------------------------------------------------------
8
-
9
- @function breakpoint-value($value) {
10
- @if type-of($value) == "string" {
11
- @return map-get($breakpoints, $value);
12
- }
13
- @else {
14
- @return $value;
15
- }
16
- }
17
-
18
- @mixin breakpoint($min: "", $max: "", $orientation: "") {
19
- $query: "screen";
20
-
21
- @if $min != "" {
22
- $query: $query + ' and (min-width: #{breakpoint-value($min)})';
23
- }
24
-
25
- @if $max != "" {
26
- $query: $query + ' and (max-width: #{breakpoint-value($max)})';
27
- }
28
-
29
- @if $orientation != "" {
30
- $query: $query + ' and (orientation: #{$orientation})';
31
- }
32
-
33
- @media #{$query} {
34
- @content;
35
- }
36
- }
37
-
38
- @mixin mobile {
39
- @include breakpoint($max: mobile) {
40
- @content
41
- }
42
- }
@@ -1,7 +0,0 @@
1
- %clearfix {
2
- &:after {
3
- content: "";
4
- display: table;
5
- clear: both;
6
- }
7
- }
@@ -1,32 +0,0 @@
1
- @use "sass:list";
2
-
3
- @function font-extension($format) {
4
- $font-extensions: (opentype: "otf", truetype: "ttf");
5
- $value: map-get($font-extensions, $format);
6
- @if $value {
7
- @return $value;
8
- }
9
- @else {
10
- @return $format;
11
- }
12
- }
13
-
14
- @function font-sources($filename, $formats: ()) {
15
- $urls: ();
16
- @each $f in list.join((woff2 woff), $formats) {
17
- $urls: list.append(
18
- $urls,
19
- url("#{$filename}.#{font-extension($f)}") format("#{$f}")
20
- );
21
- }
22
- @return list.join($urls, (), comma);
23
- }
24
-
25
- @mixin font-face($name, $filename, $weight: 400, $style: normal, $formats: ()) {
26
- @font-face {
27
- font-family: $name;
28
- font-style: $style;
29
- font-weight: $weight;
30
- src: font-sources($filename, $formats);
31
- }
32
- }