arclight 0.5.0 → 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (216) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc +11 -4
  3. data/.github/workflows/ruby.yml +24 -11
  4. data/.rspec +0 -1
  5. data/.rubocop.yml +286 -2
  6. data/.rubocop_todo.yml +18 -195
  7. data/CONTRIBUTING.md +5 -5
  8. data/Gemfile +12 -12
  9. data/README.md +18 -12
  10. data/app/assets/javascripts/arclight/arclight.js +3 -7
  11. data/app/assets/javascripts/arclight/oembed_viewer.js +64 -39
  12. data/app/assets/javascripts/arclight/truncate_controller.js +27 -0
  13. data/app/assets/stylesheets/arclight/application.scss +1 -5
  14. data/app/assets/stylesheets/arclight/modules/hierarchy_and_online_contents.scss +104 -130
  15. data/app/assets/stylesheets/arclight/modules/icons.scss +14 -3
  16. data/app/assets/stylesheets/arclight/modules/layout.scss +120 -100
  17. data/app/assets/stylesheets/arclight/modules/mastheads.scss +15 -57
  18. data/app/assets/stylesheets/arclight/modules/repositories.scss +2 -2
  19. data/app/assets/stylesheets/arclight/modules/repository_card.scss +4 -48
  20. data/app/assets/stylesheets/arclight/modules/search_results.scss +86 -35
  21. data/app/assets/stylesheets/arclight/modules/show_collection.scss +5 -32
  22. data/app/assets/stylesheets/arclight/modules/truncator.scss +56 -0
  23. data/app/assets/stylesheets/arclight/variables.scss +7 -4
  24. data/app/components/arclight/access_component.html.erb +14 -0
  25. data/app/components/arclight/access_component.rb +25 -0
  26. data/app/components/arclight/bookmark_component.html.erb +25 -0
  27. data/app/components/arclight/bookmark_component.rb +9 -0
  28. data/app/components/arclight/breadcrumb_component.rb +40 -0
  29. data/app/components/arclight/breadcrumbs_hierarchy_component.html.erb +34 -0
  30. data/app/components/arclight/breadcrumbs_hierarchy_component.rb +25 -0
  31. data/app/components/arclight/collection_context_component.html.erb +12 -0
  32. data/app/components/arclight/collection_context_component.rb +27 -0
  33. data/app/components/arclight/collection_info_component.html.erb +28 -0
  34. data/app/components/arclight/collection_info_component.rb +26 -0
  35. data/app/components/arclight/collection_sidebar_component.html.erb +15 -0
  36. data/app/components/arclight/collection_sidebar_component.rb +41 -0
  37. data/app/{views/catalog/_search_results_repository.html.erb → components/arclight/constraints_component.html.erb} +2 -1
  38. data/app/components/arclight/constraints_component.rb +17 -0
  39. data/app/components/arclight/document_collection_context_component.html.erb +29 -0
  40. data/app/components/arclight/document_collection_context_component.rb +28 -0
  41. data/app/components/arclight/document_collection_hierarchy_component.html.erb +46 -0
  42. data/app/components/arclight/document_collection_hierarchy_component.rb +62 -0
  43. data/app/components/arclight/document_component.html.erb +39 -0
  44. data/app/components/arclight/document_component.rb +49 -0
  45. data/app/components/arclight/document_components_hierarchy_component.html.erb +32 -0
  46. data/app/components/arclight/document_components_hierarchy_component.rb +28 -0
  47. data/app/components/arclight/document_download_component.html.erb +24 -0
  48. data/app/components/arclight/document_download_component.rb +71 -0
  49. data/app/components/arclight/embed_component.html.erb +10 -0
  50. data/app/components/arclight/embed_component.rb +43 -0
  51. data/app/components/arclight/group_component.html.erb +30 -0
  52. data/app/components/arclight/group_component.rb +23 -0
  53. data/app/components/arclight/header_component.html.erb +5 -0
  54. data/app/components/arclight/header_component.rb +10 -0
  55. data/app/components/arclight/index_metadata_field_component.html.erb +17 -0
  56. data/app/components/arclight/index_metadata_field_component.rb +20 -0
  57. data/app/components/arclight/masthead_component.html.erb +15 -0
  58. data/app/components/arclight/masthead_component.rb +10 -0
  59. data/app/components/arclight/metadata_section_component.html.erb +13 -0
  60. data/app/components/arclight/metadata_section_component.rb +22 -0
  61. data/app/components/arclight/oembed_viewer_component.html.erb +5 -0
  62. data/app/components/arclight/oembed_viewer_component.rb +16 -0
  63. data/app/components/arclight/online_content_filter_component.html.erb +15 -0
  64. data/app/components/arclight/online_content_filter_component.rb +19 -0
  65. data/app/components/arclight/online_status_indicator_component.rb +19 -0
  66. data/app/components/arclight/repository_breadcrumb_component.html.erb +10 -0
  67. data/app/components/arclight/repository_breadcrumb_component.rb +17 -0
  68. data/app/components/arclight/repository_location_component.html.erb +20 -0
  69. data/app/components/arclight/repository_location_component.rb +10 -0
  70. data/app/components/arclight/search_bar_component.html.erb +25 -0
  71. data/app/components/arclight/search_bar_component.rb +32 -0
  72. data/app/components/arclight/search_result_breadcrumbs_component.html.erb +3 -0
  73. data/app/components/arclight/search_result_breadcrumbs_component.rb +37 -0
  74. data/app/components/arclight/search_result_component.html.erb +20 -0
  75. data/app/components/arclight/search_result_component.rb +24 -0
  76. data/app/components/arclight/search_result_title_component.html.erb +13 -0
  77. data/app/components/arclight/search_result_title_component.rb +15 -0
  78. data/app/components/arclight/sidebar_component.html.erb +9 -0
  79. data/app/components/arclight/sidebar_component.rb +19 -0
  80. data/app/components/arclight/upper_metadata_layout_component.rb +10 -0
  81. data/app/components/blacklight/icons/bookmark_component.rb +12 -0
  82. data/app/components/blacklight/icons/collection_component.rb +14 -0
  83. data/app/components/blacklight/icons/compact_component.rb +12 -0
  84. data/app/components/blacklight/icons/container_component.rb +14 -0
  85. data/app/components/blacklight/icons/ead_component.rb +12 -0
  86. data/app/components/blacklight/icons/file_component.rb +14 -0
  87. data/app/components/blacklight/icons/folder_component.rb +12 -0
  88. data/app/components/blacklight/icons/online_component.rb +15 -0
  89. data/app/components/blacklight/icons/pdf_component.rb +12 -0
  90. data/app/components/blacklight/icons/repository_component.rb +12 -0
  91. data/app/controllers/arclight/repositories_controller.rb +4 -4
  92. data/app/{controllers/concerns → helpers}/arclight/ead_format_helpers.rb +4 -7
  93. data/app/helpers/arclight/field_config_helpers.rb +26 -0
  94. data/app/helpers/arclight_helper.rb +15 -253
  95. data/app/models/arclight/document_downloads.rb +12 -15
  96. data/app/models/arclight/parent.rb +5 -0
  97. data/app/models/arclight/parents.rb +2 -1
  98. data/app/models/arclight/requests/aeon_external_request.rb +1 -1
  99. data/app/models/arclight/requests/aeon_web_ead.rb +8 -3
  100. data/app/models/arclight/requests/google_form.rb +8 -3
  101. data/app/models/concerns/arclight/catalog.rb +25 -15
  102. data/app/models/concerns/arclight/search_behavior.rb +12 -26
  103. data/app/models/concerns/arclight/solr_document.rb +70 -73
  104. data/app/presenters/arclight/show_presenter.rb +34 -7
  105. data/app/views/arclight/_requests.html.erb +2 -2
  106. data/app/views/arclight/repositories/_repository.html.erb +21 -40
  107. data/app/views/arclight/repositories/index.html.erb +3 -1
  108. data/app/views/arclight/repositories/show.html.erb +4 -6
  109. data/app/views/arclight/requests/_aeon_external_request_endpoint.html.erb +4 -5
  110. data/app/views/arclight/requests/_aeon_web_ead.html.erb +2 -3
  111. data/app/views/arclight/requests/_google_form.html.erb +4 -6
  112. data/app/views/catalog/_group.html.erb +1 -18
  113. data/app/views/catalog/_group_toggle.html.erb +1 -1
  114. data/app/views/catalog/_search_results_header.html.erb +3 -0
  115. data/app/views/catalog/hierarchy.html.erb +19 -0
  116. data/app/views/catalog/index.html.erb +16 -7
  117. data/app/views/shared/_breadcrumbs.html.erb +2 -14
  118. data/app/views/shared/_main_menu_links.html.erb +1 -1
  119. data/arclight.gemspec +7 -6
  120. data/config/breadcrumbs.rb +24 -0
  121. data/config/i18n-tasks.yml +9 -8
  122. data/config/importmap.rb +3 -0
  123. data/config/locales/arclight.en.yml +31 -30
  124. data/config/routes.rb +1 -1
  125. data/docker-compose.yml +16 -0
  126. data/lib/arclight/digital_object.rb +2 -1
  127. data/lib/arclight/engine.rb +18 -31
  128. data/lib/arclight/exceptions.rb +1 -0
  129. data/lib/arclight/hash_absolute_xpath.rb +2 -1
  130. data/lib/arclight/normalized_id.rb +2 -0
  131. data/lib/arclight/normalized_title.rb +2 -0
  132. data/lib/arclight/repository.rb +43 -54
  133. data/lib/arclight/routes/hierarchy.rb +19 -0
  134. data/lib/arclight/routes.rb +8 -0
  135. data/lib/arclight/traject/ead2_component_config.rb +292 -0
  136. data/lib/arclight/traject/ead2_config.rb +66 -287
  137. data/lib/arclight/version.rb +1 -1
  138. data/lib/arclight/year_range.rb +4 -3
  139. data/lib/arclight.rb +6 -1
  140. data/lib/generators/arclight/install_generator.rb +59 -21
  141. data/lib/generators/arclight/templates/arclight.scss +4 -3
  142. data/lib/generators/arclight/templates/catalog_controller.rb +150 -169
  143. data/lib/generators/arclight/templates/config/locales/arclight.en.yml +53 -0
  144. data/lib/generators/arclight/templates/config/repositories.yml +20 -27
  145. data/lib/tasks/index.rake +14 -17
  146. data/package.json +11 -13
  147. data/solr/conf/schema.xml +40 -36
  148. data/solr/conf/solrconfig.xml +33 -31
  149. data/tasks/arclight.rake +8 -7
  150. data/template.rb +0 -1
  151. metadata +111 -104
  152. data/.babelrc +0 -3
  153. data/app/assets/javascripts/arclight/collection_navigation.js +0 -100
  154. data/app/assets/javascripts/arclight/collection_scrollspy.js +0 -6
  155. data/app/assets/javascripts/arclight/context_navigation.js +0 -351
  156. data/app/assets/javascripts/arclight/truncator.js.erb +0 -29
  157. data/app/assets/stylesheets/arclight/bootstrap_overrides.scss +0 -26
  158. data/app/assets/stylesheets/arclight/modules/context_navigation.scss +0 -75
  159. data/app/controllers/concerns/arclight/field_config_helpers.rb +0 -102
  160. data/app/factories/blacklight_field_configuration_factory.rb +0 -30
  161. data/app/views/arclight/repositories/_in_person_repository.html.erb +0 -19
  162. data/app/views/arclight/repositories/_repository_contact.html.erb +0 -9
  163. data/app/views/arclight/viewers/_oembed.html.erb +0 -8
  164. data/app/views/catalog/_access_contents.html.erb +0 -15
  165. data/app/views/catalog/_arclight_abstract_or_scope.html.erb +0 -5
  166. data/app/views/catalog/_arclight_bookmark_control.html.erb +0 -38
  167. data/app/views/catalog/_arclight_document_header_icon.html.erb +0 -1
  168. data/app/views/catalog/_arclight_document_index_header.html.erb +0 -13
  169. data/app/views/catalog/_arclight_document_index_header_hierarchy_default.html.erb +0 -0
  170. data/app/views/catalog/_arclight_document_index_header_online_contents_default.html.erb +0 -0
  171. data/app/views/catalog/_arclight_index_compact_default.html.erb +0 -22
  172. data/app/views/catalog/_arclight_index_default.html.erb +0 -45
  173. data/app/views/catalog/_arclight_index_group_document_compact_default.html.erb +0 -19
  174. data/app/views/catalog/_arclight_index_group_document_default.html.erb +0 -18
  175. data/app/views/catalog/_arclight_online_content_indicator.html.erb +0 -3
  176. data/app/views/catalog/_arclight_rangelimit.html.erb +0 -24
  177. data/app/views/catalog/_arclight_viewer_default.html.erb +0 -1
  178. data/app/views/catalog/_collection_contents.html.erb +0 -4
  179. data/app/views/catalog/_collection_context.html.erb +0 -15
  180. data/app/views/catalog/_collection_context_nav.html.erb +0 -12
  181. data/app/views/catalog/_collection_online_contents.html.erb +0 -17
  182. data/app/views/catalog/_component_context.html.erb +0 -5
  183. data/app/views/catalog/_containers.html.erb +0 -3
  184. data/app/views/catalog/_context_card.html.erb +0 -27
  185. data/app/views/catalog/_context_sidebar.html.erb +0 -8
  186. data/app/views/catalog/_custom_metadata.html.erb +0 -16
  187. data/app/views/catalog/_document_downloads.html.erb +0 -14
  188. data/app/views/catalog/_group_header_compact_default.html.erb +0 -15
  189. data/app/views/catalog/_group_header_default.html.erb +0 -20
  190. data/app/views/catalog/_home.html.erb +0 -1
  191. data/app/views/catalog/_index_breadcrumb_default.html.erb +0 -6
  192. data/app/views/catalog/_index_collection_context_default.html.erb +0 -53
  193. data/app/views/catalog/_index_default.html.erb +0 -17
  194. data/app/views/catalog/_index_header.html.erb +0 -7
  195. data/app/views/catalog/_index_header_online_contents_default.html.erb +0 -1
  196. data/app/views/catalog/_index_online_contents_default.html.erb +0 -6
  197. data/app/views/catalog/_online_content_label.html.erb +0 -5
  198. data/app/views/catalog/_search_form.html.erb +0 -38
  199. data/app/views/catalog/_search_results.html.erb +0 -28
  200. data/app/views/catalog/_show_actions_box_default.html.erb +0 -27
  201. data/app/views/catalog/_show_breadcrumbs_default.html.erb +0 -6
  202. data/app/views/catalog/_show_collection.html.erb +0 -66
  203. data/app/views/catalog/_show_default.html.erb +0 -70
  204. data/app/views/catalog/_show_upper_metadata_collection.html.erb +0 -1
  205. data/app/views/catalog/_show_upper_metadata_default.html.erb +0 -14
  206. data/app/views/catalog/_sort_and_per_page.html.erb +0 -8
  207. data/app/views/catalog/_within_collection_dropdown.html.erb +0 -26
  208. data/app/views/layouts/catalog_result.html.erb +0 -7
  209. data/app/views/shared/_context_sidebar.html.erb +0 -8
  210. data/app/views/shared/_header_navbar.html.erb +0 -61
  211. data/app/views/shared/_show_breadcrumbs.html.erb +0 -27
  212. data/lib/arclight/viewer.rb +0 -45
  213. data/lib/arclight/viewers/oembed.rb +0 -57
  214. data/solr/conf/scripts.conf +0 -24
  215. data/vendor/assets/javascripts/responsiveTruncator.js +0 -69
  216. data/vendor/assets/javascripts/stickyfill.js +0 -480
@@ -1,480 +0,0 @@
1
- /*!
2
- * Stickyfill -- `position: sticky` polyfill
3
- * v. 1.1.4 | https://github.com/wilddeer/stickyfill
4
- * Copyright Oleg Korsunsky | http://wd.dizaina.net/
5
- *
6
- * MIT License
7
- */
8
- (function(doc, win) {
9
- var watchArray = [],
10
- scroll,
11
- initialized = false,
12
- html = doc.documentElement,
13
- noop = function() {},
14
- checkTimer,
15
-
16
- //visibility API strings
17
- hiddenPropertyName = 'hidden',
18
- visibilityChangeEventName = 'visibilitychange';
19
-
20
- //fallback to prefixed names in old webkit browsers
21
- if (doc.webkitHidden !== undefined) {
22
- hiddenPropertyName = 'webkitHidden';
23
- visibilityChangeEventName = 'webkitvisibilitychange';
24
- }
25
-
26
- //test getComputedStyle
27
- if (!win.getComputedStyle) {
28
- seppuku();
29
- }
30
-
31
- //test for native support
32
- var prefixes = ['', '-webkit-', '-moz-', '-ms-'],
33
- block = document.createElement('div');
34
-
35
- for (var i = prefixes.length - 1; i >= 0; i--) {
36
- try {
37
- block.style.position = prefixes[i] + 'sticky';
38
- }
39
- catch(e) {}
40
- if (block.style.position != '') {
41
- seppuku();
42
- }
43
- }
44
-
45
- updateScrollPos();
46
-
47
- //commit seppuku!
48
- function seppuku() {
49
- init = add = rebuild = pause = stop = kill = noop;
50
- }
51
-
52
- function mergeObjects(targetObj, sourceObject) {
53
- for (var key in sourceObject) {
54
- if (sourceObject.hasOwnProperty(key)) {
55
- targetObj[key] = sourceObject[key];
56
- }
57
- }
58
- }
59
-
60
- function parseNumeric(val) {
61
- return parseFloat(val) || 0;
62
- }
63
-
64
- function updateScrollPos() {
65
- scroll = {
66
- top: win.pageYOffset,
67
- left: win.pageXOffset
68
- };
69
- }
70
-
71
- function onScroll() {
72
- if (win.pageXOffset != scroll.left) {
73
- updateScrollPos();
74
- rebuild();
75
- return;
76
- }
77
-
78
- if (win.pageYOffset != scroll.top) {
79
- updateScrollPos();
80
- recalcAllPos();
81
- }
82
- }
83
-
84
- //fixes flickering
85
- function onWheel(event) {
86
- setTimeout(function() {
87
- if (win.pageYOffset != scroll.top) {
88
- scroll.top = win.pageYOffset;
89
- recalcAllPos();
90
- }
91
- }, 0);
92
- }
93
-
94
- function recalcAllPos() {
95
- for (var i = watchArray.length - 1; i >= 0; i--) {
96
- recalcElementPos(watchArray[i]);
97
- }
98
- }
99
-
100
- function recalcElementPos(el) {
101
- if (!el.inited) return;
102
-
103
- var currentMode = (scroll.top <= el.limit.start? 0: scroll.top >= el.limit.end? 2: 1);
104
-
105
- if (el.mode != currentMode) {
106
- switchElementMode(el, currentMode);
107
- }
108
- }
109
-
110
- //checks whether stickies start or stop positions have changed
111
- function fastCheck() {
112
- for (var i = watchArray.length - 1; i >= 0; i--) {
113
- if (!watchArray[i].inited) continue;
114
-
115
- var deltaTop = Math.abs(getDocOffsetTop(watchArray[i].clone) - watchArray[i].docOffsetTop),
116
- deltaHeight = Math.abs(watchArray[i].parent.node.offsetHeight - watchArray[i].parent.height);
117
-
118
- if (deltaTop >= 2 || deltaHeight >= 2) return false;
119
- }
120
- return true;
121
- }
122
-
123
- function initElement(el) {
124
- if (isNaN(parseFloat(el.computed.top)) || el.isCell || el.computed.display == 'none') return;
125
-
126
- el.inited = true;
127
-
128
- if (!el.clone) clone(el);
129
- if (el.parent.computed.position != 'absolute' &&
130
- el.parent.computed.position != 'relative') el.parent.node.style.position = 'relative';
131
-
132
- recalcElementPos(el);
133
-
134
- el.parent.height = el.parent.node.offsetHeight;
135
- el.docOffsetTop = getDocOffsetTop(el.clone);
136
- }
137
-
138
- function deinitElement(el) {
139
- var deinitParent = true;
140
-
141
- el.clone && killClone(el);
142
- mergeObjects(el.node.style, el.css);
143
-
144
- //check whether element's parent is used by other stickies
145
- for (var i = watchArray.length - 1; i >= 0; i--) {
146
- if (watchArray[i].node !== el.node && watchArray[i].parent.node === el.parent.node) {
147
- deinitParent = false;
148
- break;
149
- }
150
- };
151
-
152
- if (deinitParent) el.parent.node.style.position = el.parent.css.position;
153
- el.mode = -1;
154
- }
155
-
156
- function initAll() {
157
- for (var i = watchArray.length - 1; i >= 0; i--) {
158
- initElement(watchArray[i]);
159
- }
160
- }
161
-
162
- function deinitAll() {
163
- for (var i = watchArray.length - 1; i >= 0; i--) {
164
- deinitElement(watchArray[i]);
165
- }
166
- }
167
-
168
- function switchElementMode(el, mode) {
169
- var nodeStyle = el.node.style;
170
-
171
- switch (mode) {
172
- case 0:
173
- nodeStyle.position = 'absolute';
174
- nodeStyle.left = el.offset.left + 'px';
175
- nodeStyle.right = el.offset.right + 'px';
176
- nodeStyle.top = el.offset.top + 'px';
177
- nodeStyle.bottom = 'auto';
178
- nodeStyle.width = 'auto';
179
- nodeStyle.marginLeft = 0;
180
- nodeStyle.marginRight = 0;
181
- nodeStyle.marginTop = 0;
182
- break;
183
-
184
- case 1:
185
- nodeStyle.position = 'fixed';
186
- nodeStyle.left = el.box.left + 'px';
187
- nodeStyle.right = el.box.right + 'px';
188
- nodeStyle.top = el.css.top;
189
- nodeStyle.bottom = 'auto';
190
- nodeStyle.width = 'auto';
191
- nodeStyle.marginLeft = 0;
192
- nodeStyle.marginRight = 0;
193
- nodeStyle.marginTop = 0;
194
- break;
195
-
196
- case 2:
197
- nodeStyle.position = 'absolute';
198
- nodeStyle.left = el.offset.left + 'px';
199
- nodeStyle.right = el.offset.right + 'px';
200
- nodeStyle.top = 'auto';
201
- nodeStyle.bottom = 0;
202
- nodeStyle.width = 'auto';
203
- nodeStyle.marginLeft = 0;
204
- nodeStyle.marginRight = 0;
205
- break;
206
- }
207
-
208
- el.mode = mode;
209
- }
210
-
211
- function clone(el) {
212
- el.clone = document.createElement('div');
213
-
214
- var refElement = el.node.nextSibling || el.node,
215
- cloneStyle = el.clone.style;
216
-
217
- cloneStyle.height = el.height + 'px';
218
- cloneStyle.width = el.width + 'px';
219
- cloneStyle.marginTop = el.computed.marginTop;
220
- cloneStyle.marginBottom = el.computed.marginBottom;
221
- cloneStyle.marginLeft = el.computed.marginLeft;
222
- cloneStyle.marginRight = el.computed.marginRight;
223
- cloneStyle.padding = cloneStyle.border = cloneStyle.borderSpacing = 0;
224
- cloneStyle.fontSize = '1em';
225
- cloneStyle.position = 'static';
226
- cloneStyle.cssFloat = el.computed.cssFloat;
227
-
228
- el.node.parentNode.insertBefore(el.clone, refElement);
229
- }
230
-
231
- function killClone(el) {
232
- el.clone.parentNode.removeChild(el.clone);
233
- el.clone = undefined;
234
- }
235
-
236
- function getElementParams(node) {
237
- var computedStyle = getComputedStyle(node),
238
- parentNode = node.parentNode,
239
- parentComputedStyle = getComputedStyle(parentNode),
240
- cachedPosition = node.style.position;
241
-
242
- node.style.position = 'relative';
243
-
244
- var computed = {
245
- top: computedStyle.top,
246
- marginTop: computedStyle.marginTop,
247
- marginBottom: computedStyle.marginBottom,
248
- marginLeft: computedStyle.marginLeft,
249
- marginRight: computedStyle.marginRight,
250
- cssFloat: computedStyle.cssFloat,
251
- display: computedStyle.display
252
- },
253
- numeric = {
254
- top: parseNumeric(computedStyle.top),
255
- marginBottom: parseNumeric(computedStyle.marginBottom),
256
- paddingLeft: parseNumeric(computedStyle.paddingLeft),
257
- paddingRight: parseNumeric(computedStyle.paddingRight),
258
- borderLeftWidth: parseNumeric(computedStyle.borderLeftWidth),
259
- borderRightWidth: parseNumeric(computedStyle.borderRightWidth)
260
- };
261
-
262
- node.style.position = cachedPosition;
263
-
264
- var css = {
265
- position: node.style.position,
266
- top: node.style.top,
267
- bottom: node.style.bottom,
268
- left: node.style.left,
269
- right: node.style.right,
270
- width: node.style.width,
271
- marginTop: node.style.marginTop,
272
- marginLeft: node.style.marginLeft,
273
- marginRight: node.style.marginRight
274
- },
275
- nodeOffset = getElementOffset(node),
276
- parentOffset = getElementOffset(parentNode),
277
-
278
- parent = {
279
- node: parentNode,
280
- css: {
281
- position: parentNode.style.position
282
- },
283
- computed: {
284
- position: parentComputedStyle.position
285
- },
286
- numeric: {
287
- borderLeftWidth: parseNumeric(parentComputedStyle.borderLeftWidth),
288
- borderRightWidth: parseNumeric(parentComputedStyle.borderRightWidth),
289
- borderTopWidth: parseNumeric(parentComputedStyle.borderTopWidth),
290
- borderBottomWidth: parseNumeric(parentComputedStyle.borderBottomWidth)
291
- }
292
- },
293
-
294
- el = {
295
- node: node,
296
- box: {
297
- left: nodeOffset.win.left,
298
- right: html.clientWidth - nodeOffset.win.right
299
- },
300
- offset: {
301
- top: nodeOffset.win.top - parentOffset.win.top - parent.numeric.borderTopWidth,
302
- left: nodeOffset.win.left - parentOffset.win.left - parent.numeric.borderLeftWidth,
303
- right: -nodeOffset.win.right + parentOffset.win.right - parent.numeric.borderRightWidth
304
- },
305
- css: css,
306
- isCell: computedStyle.display == 'table-cell',
307
- computed: computed,
308
- numeric: numeric,
309
- width: nodeOffset.win.right - nodeOffset.win.left,
310
- height: nodeOffset.win.bottom - nodeOffset.win.top,
311
- mode: -1,
312
- inited: false,
313
- parent: parent,
314
- limit: {
315
- start: nodeOffset.doc.top - numeric.top,
316
- end: parentOffset.doc.top + parentNode.offsetHeight - parent.numeric.borderBottomWidth -
317
- node.offsetHeight - numeric.top - numeric.marginBottom
318
- }
319
- };
320
-
321
- return el;
322
- }
323
-
324
- function getDocOffsetTop(node) {
325
- var docOffsetTop = 0;
326
-
327
- while (node) {
328
- docOffsetTop += node.offsetTop;
329
- node = node.offsetParent;
330
- }
331
-
332
- return docOffsetTop;
333
- }
334
-
335
- function getElementOffset(node) {
336
- var box = node.getBoundingClientRect();
337
-
338
- return {
339
- doc: {
340
- top: box.top + win.pageYOffset,
341
- left: box.left + win.pageXOffset
342
- },
343
- win: box
344
- };
345
- }
346
-
347
- function startFastCheckTimer() {
348
- checkTimer = setInterval(function() {
349
- !fastCheck() && rebuild();
350
- }, 500);
351
- }
352
-
353
- function stopFastCheckTimer() {
354
- clearInterval(checkTimer);
355
- }
356
-
357
- function handlePageVisibilityChange() {
358
- if (!initialized) return;
359
-
360
- if (document[hiddenPropertyName]) {
361
- stopFastCheckTimer();
362
- }
363
- else {
364
- startFastCheckTimer();
365
- }
366
- }
367
-
368
- function init() {
369
- if (initialized) return;
370
-
371
- updateScrollPos();
372
- initAll();
373
-
374
- win.addEventListener('scroll', onScroll);
375
- win.addEventListener('wheel', onWheel);
376
-
377
- //watch for width changes
378
- win.addEventListener('resize', rebuild);
379
- win.addEventListener('orientationchange', rebuild);
380
-
381
- //watch for page visibility
382
- doc.addEventListener(visibilityChangeEventName, handlePageVisibilityChange);
383
-
384
- startFastCheckTimer();
385
-
386
- initialized = true;
387
- }
388
-
389
- function rebuild() {
390
- if (!initialized) return;
391
-
392
- deinitAll();
393
-
394
- for (var i = watchArray.length - 1; i >= 0; i--) {
395
- watchArray[i] = getElementParams(watchArray[i].node);
396
- }
397
-
398
- initAll();
399
- }
400
-
401
- function pause() {
402
- win.removeEventListener('scroll', onScroll);
403
- win.removeEventListener('wheel', onWheel);
404
- win.removeEventListener('resize', rebuild);
405
- win.removeEventListener('orientationchange', rebuild);
406
- doc.removeEventListener(visibilityChangeEventName, handlePageVisibilityChange);
407
-
408
- stopFastCheckTimer();
409
-
410
- initialized = false;
411
- }
412
-
413
- function stop() {
414
- pause();
415
- deinitAll();
416
- }
417
-
418
- function kill() {
419
- stop();
420
-
421
- //empty the array without loosing the references,
422
- //the most performant method according to http://jsperf.com/empty-javascript-array
423
- while (watchArray.length) {
424
- watchArray.pop();
425
- }
426
- }
427
-
428
- function add(node) {
429
- //check if Stickyfill is already applied to the node
430
- for (var i = watchArray.length - 1; i >= 0; i--) {
431
- if (watchArray[i].node === node) return;
432
- };
433
-
434
- var el = getElementParams(node);
435
-
436
- watchArray.push(el);
437
-
438
- if (!initialized) {
439
- init();
440
- }
441
- else {
442
- initElement(el);
443
- }
444
- }
445
-
446
- function remove(node) {
447
- for (var i = watchArray.length - 1; i >= 0; i--) {
448
- if (watchArray[i].node === node) {
449
- deinitElement(watchArray[i]);
450
- watchArray.splice(i, 1);
451
- }
452
- };
453
- }
454
-
455
- //expose Stickyfill
456
- win.Stickyfill = {
457
- stickies: watchArray,
458
- add: add,
459
- remove: remove,
460
- init: init,
461
- rebuild: rebuild,
462
- pause: pause,
463
- stop: stop,
464
- kill: kill
465
- };
466
- })(document, window);
467
-
468
-
469
- //if jQuery is available -- create a plugin
470
- if (window.jQuery) {
471
- (function($) {
472
- $.fn.Stickyfill = function(options) {
473
- this.each(function() {
474
- Stickyfill.add(this);
475
- });
476
-
477
- return this;
478
- };
479
- })(window.jQuery);
480
- }