center-center 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
Binary file
Binary file
@@ -0,0 +1,215 @@
1
+ <html>
2
+ <head>
3
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
4
+ <meta charset="utf-8" />
5
+ <script type="importmap">
6
+ {
7
+ "imports": {
8
+ "debug": "https://esm.sh/debug",
9
+ "center-center": "https://esm.sh/center-center"
10
+ }
11
+ }
12
+ </script>
13
+ <script type="module">
14
+ import debug from 'debug'
15
+
16
+ import {
17
+ getRects,
18
+ calculateLeft,
19
+ calculateTop
20
+ } from 'center-center'
21
+
22
+ const log = debug('center-center')
23
+
24
+ const resizeObserver = new ResizeObserver(handleResize)
25
+
26
+ function handleOrientationChange () {
27
+ log('orientationchange')
28
+
29
+ const container = document.querySelector('main')
30
+ const target = container.querySelector('.target')
31
+
32
+ render(container, target)
33
+ }
34
+
35
+ function handleScroll () {
36
+ log('scroll')
37
+
38
+ const container = document.querySelector('main')
39
+ const target = container.querySelector('.target')
40
+
41
+ render(container, target)
42
+ }
43
+
44
+ function handleResize () {
45
+ log('resize')
46
+
47
+ const container = document.querySelector('main')
48
+ const target = container.querySelector('.target')
49
+
50
+ render(container, target)
51
+ }
52
+
53
+ function handleDOMContentLoaded () {
54
+ log('DOMContentLoaded')
55
+
56
+ const container = document.querySelector('main')
57
+
58
+ resizeObserver.observe(container)
59
+
60
+ window.addEventListener('orientationchange', handleOrientationChange)
61
+
62
+ window.addEventListener('scroll', handleScroll)
63
+
64
+ document.addEventListener('scroll', handleScroll)
65
+
66
+ window.addEventListener('resize', handleResize)
67
+
68
+ document.addEventListener('resize', handleResize)
69
+ }
70
+
71
+ function render (container, target) {
72
+ log('render')
73
+
74
+ window.requestAnimationFrame(() => {
75
+ const rects = getRects(container, target)
76
+ const left = calculateLeft(rects)
77
+ const top = calculateTop(rects)
78
+
79
+ log('%d, %d', left, top)
80
+
81
+ const {
82
+ target: {
83
+ left: currentLeft,
84
+ top: currentTop
85
+ }
86
+ } = rects
87
+
88
+ if (currentLeft !== left) target.style.left = left + 'px'
89
+ if (currentTop !== top) target.style.top = top + 'px'
90
+ })
91
+ }
92
+
93
+ document.addEventListener('DOMContentLoaded', handleDOMContentLoaded)
94
+ </script>
95
+ <style>
96
+ *,
97
+ *::before,
98
+ *::after {
99
+ box-sizing: border-box;
100
+ }
101
+
102
+ :root {
103
+ font-size: 16px;
104
+ line-height: 1.5;
105
+ font-synthesis: none;
106
+ text-rendering: optimizelegibility;
107
+ -webkit-font-smoothing: antialiased;
108
+ -moz-osx-font-smoothing: grayscale;
109
+ text-size-adjust: 100%;
110
+ }
111
+
112
+ html {
113
+ overflow: auto
114
+ }
115
+
116
+ html,
117
+ body {
118
+ background-color: white;
119
+ min-height: 100vh;
120
+ min-height: 844px;
121
+ max-width: 100vw;
122
+ min-width: 390px;
123
+ margin: 0;
124
+ padding: 0;
125
+ border: none;
126
+ }
127
+
128
+ .container {
129
+ display: flex;
130
+ flex-direction: column;
131
+ width: 100%;
132
+ height: 100%;
133
+ }
134
+
135
+ header,
136
+ footer {
137
+ flex: 0 0 auto;
138
+ width: 100%;
139
+ padding: 2rem;
140
+ }
141
+
142
+ header h1 {
143
+ margin: 0
144
+ }
145
+
146
+ footer h2 {
147
+ margin: 0
148
+ }
149
+
150
+ main {
151
+ position: relative;
152
+ flex: 1;
153
+ background-color: #d3d3d3;
154
+ color: white;
155
+ padding: 2rem;
156
+ }
157
+
158
+ main p:first-child {
159
+ margin-top: 0;
160
+ }
161
+
162
+ main p:last-child {
163
+ margin-bottom: 0;
164
+ }
165
+
166
+ main .target {
167
+ position: absolute;
168
+ left: 0;
169
+ top: 0;
170
+ width: 50px;
171
+ height: 50px;
172
+ border-radius: 50%;
173
+ background-color: gold;
174
+ overflow: hidden;
175
+ z-index: 1;
176
+ }
177
+ </style>
178
+ </head><body>
179
+ <div class="container">
180
+ <header>
181
+ <h1>Center Center</h1>
182
+ </header>
183
+
184
+ <main>
185
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec nulla metus. Vivamus quis nisi ut elit pretium consectetur. Aliquam erat volutpat. Curabitur ornare massa sed ligula pretium bibendum. Vivamus condimentum eget lectus a volutpat. Maecenas ut massa in est lacinia molestie eget non arcu. Donec condimentum tincidunt tellus ac pellentesque. Curabitur augue nunc, vestibulum non aliquet eu, bibendum quis urna. Mauris volutpat vitae enim nec lobortis. Proin vitae nisl ac libero finibus pretium. Fusce ac lorem sed ex aliquet volutpat. Nullam vel est ut massa pharetra posuere. Aliquam sem ipsum, egestas eu velit auctor, ullamcorper laoreet est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; In accumsan mauris nec sem ultrices ullamcorper.</p>
186
+
187
+ <p>Maecenas feugiat risus ipsum, at facilisis dui molestie at. Curabitur eros diam, suscipit vitae sem sit amet, rhoncus varius arcu. Donec ultrices nisi nec scelerisque ornare. Nunc placerat tellus quis diam lobortis rhoncus. Proin convallis ultricies sollicitudin. Cras dictum lorem arcu, sit amet congue leo semper at. Etiam ultricies maximus velit, id facilisis orci suscipit eu. Fusce velit odio, consectetur ut laoreet quis, lobortis eu purus. Aliquam vel porttitor odio.</p>
188
+
189
+ <p>Maecenas eget lacus cursus justo accumsan pharetra vitae non purus. Nam risus risus, varius id lacus id, vestibulum porta turpis. Vestibulum varius odio ac purus viverra molestie. Nulla semper lectus non volutpat pharetra. Cras sed turpis eu lacus pharetra elementum id vitae dui. Praesent auctor felis a risus ultrices, quis aliquam velit auctor. Sed sagittis non augue in imperdiet. Aenean eget commodo urna. Mauris varius pulvinar nulla, vel aliquet justo malesuada eget. Pellentesque efficitur est at nunc rhoncus, sed ultrices lectus venenatis.</p>
190
+
191
+ <p>Mauris erat lorem, lobortis quis ligula et, commodo malesuada sem. Quisque pulvinar nec orci at vehicula. Donec a tempor nisl. Nam nec nibh cursus odio auctor pretium. Maecenas elementum in ante vitae venenatis. In bibendum tristique augue, in rhoncus neque semper eu. Aliquam rhoncus dignissim fermentum. Donec finibus neque velit, eget interdum nunc condimentum eu. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse ornare metus nisl, eget vulputate massa auctor id. Fusce tincidunt eros sit amet sapien gravida, a lacinia quam laoreet.</p>
192
+
193
+ <p>Suspendisse ut tortor vel libero facilisis hendrerit quis vel mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sit amet justo eget mauris lobortis luctus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc non lectus maximus, ultrices mauris sollicitudin, aliquet diam. Cras suscipit eros ac sagittis malesuada. Curabitur auctor ex sit amet metus imperdiet consequat. Aenean accumsan dictum augue. Etiam massa ex, mollis vitae tempus sed, ultricies ac sapien. Donec eu laoreet nisl. Nullam suscipit tincidunt eleifend.</p>
194
+
195
+ <p>Nam sed nisi id lacus lacinia ultrices efficitur ut dolor. Nam quis nibh porttitor, dictum magna tincidunt, tristique leo. Praesent vitae est ultricies, feugiat felis ac, euismod massa. In finibus, enim in feugiat fermentum, ante felis luctus turpis, et finibus risus metus sed mauris. Donec aliquet rutrum orci, et aliquam nisl rhoncus et. Integer dignissim lacus vitae egestas interdum. Aliquam semper eros eget eros viverra, quis placerat ex ultricies. Suspendisse tempor, justo a facilisis tempus, erat dui imperdiet orci, vel ullamcorper libero eros eu risus. Suspendisse mattis arcu arcu, ut rhoncus lacus semper sed.</p>
196
+
197
+ <p>Maecenas tempus lorem quam, sed aliquet erat rhoncus quis. In nibh eros, suscipit id accumsan et, dictum nec neque. Sed vitae ipsum et nisl dignissim molestie. Quisque eu auctor quam. Vestibulum sagittis lobortis ante, eu laoreet arcu pretium eu. In consectetur nisl semper bibendum venenatis. Phasellus non sollicitudin lacus, non efficitur dui. Proin scelerisque nunc ut venenatis sagittis. Integer faucibus diam non tortor pulvinar rutrum.</p>
198
+
199
+ <p>Cras fermentum tortor iaculis turpis placerat pellentesque. Curabitur tristique suscipit lorem, et ullamcorper leo faucibus ac. Nullam sit amet nulla eget arcu porttitor interdum eget in ante. Suspendisse tincidunt est et posuere porttitor. Pellentesque non turpis justo. Nunc malesuada ex vel risus pretium sodales. Donec quis condimentum est. Mauris bibendum egestas massa, nec malesuada nulla lobortis eu.</p>
200
+
201
+ <p>Sed a lectus feugiat, porttitor turpis ac, porta dui. Duis egestas elementum scelerisque. Pellentesque placerat interdum tortor, id hendrerit tellus tempor sed. Donec eu sapien nulla. Morbi convallis luctus rutrum. Nulla eget ex vel libero maximus vestibulum. Nam pretium maximus porttitor. Vestibulum porta, tellus ut posuere sodales, felis turpis scelerisque lorem, sed venenatis metus nibh ac velit. Donec vitae sollicitudin augue. Proin id ex et odio facilisis facilisis eu ac lectus. Morbi rutrum a metus vel eleifend. Vivamus convallis eros rutrum lectus vestibulum viverra. Sed fringilla pharetra nunc placerat rutrum.</p>
202
+
203
+ <p>Nullam auctor augue non tempus porta. Aliquam ante odio, dapibus id purus a, consequat ullamcorper dui. Nunc sodales metus felis, id volutpat lectus imperdiet eu. In lorem diam, luctus a neque convallis, suscipit luctus tortor. Duis tortor sapien, convallis eget placerat quis, volutpat nec velit. Quisque aliquam nunc orci, pharetra placerat orci gravida vitae. Donec eget congue mi. Pellentesque tellus risus, dictum ac ultrices nec, luctus eu mi. Proin sit amet blandit magna. Quisque diam est, rhoncus ut dictum eu, facilisis a ex. Aenean sed nisi sagittis, suscipit magna eu, congue neque. Donec porttitor sapien massa, sit amet pretium turpis rhoncus non. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p>
204
+
205
+ <div class="target">
206
+
207
+ </div>
208
+ </main>
209
+
210
+ <footer>
211
+ <h2>Center Center</h2>
212
+ </footer>
213
+ </div>
214
+ </body>
215
+ </html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "center-center",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
4
  "description": "Position an element at the center center of a container",
5
5
  "main": "./index.mjs",
6
6
  "type": "module",
@@ -9,6 +9,11 @@
9
9
  "email": "sequencemedia@sequencemedia.net",
10
10
  "url": "http://sequencemedia.net"
11
11
  },
12
+ "license": "MIT",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/sequencemedia/center-center.git"
16
+ },
12
17
  "scripts": {
13
18
  "lint": "cross-env NODE_ENV=production eslint . --ext .mjs,.cjs",
14
19
  "lint:fix": "npm run lint -- --fix",
@@ -1,316 +0,0 @@
1
- import {
2
- expect
3
- } from 'chai'
4
-
5
- import {
6
- getScrollingElement,
7
- getViewportRect,
8
- getElementRect,
9
- getRects,
10
- calculateLeft,
11
- calculateTop
12
- } from '#center-center'
13
-
14
- describe('`center-center`', () => {
15
- it('exports `getScrollingElement`', () => expect(getScrollingElement).to.be.a('function'))
16
-
17
- it('exports `getViewportRect`', () => expect(getViewportRect).to.be.a('function'))
18
-
19
- it('exports `getElementRect`', () => expect(getElementRect).to.be.a('function'))
20
-
21
- it('exports `getRects`', () => expect(getRects).to.be.a('function'))
22
-
23
- it('exports `calculateLeft`', () => expect(calculateLeft).to.be.a('function'))
24
-
25
- it('exports `calculateTop`', () => expect(calculateTop).to.be.a('function'))
26
-
27
- describe('`getScrollingElement()`', () => {
28
- describe('`scrollingElement` is defined', () => {
29
- describe('`scrollingElement` is null', () => {
30
- it('returns an object', () => {
31
- return (
32
- expect(getScrollingElement({ scrollingElement: null }))
33
- .to.eql({
34
- scrollLeft: 0,
35
- scrollTop: 0
36
- })
37
- )
38
- })
39
- })
40
-
41
- describe('`scrollingElement` is an object', () => {
42
- it('returns an object', () => {
43
- return (
44
- expect(getScrollingElement({ scrollingElement: { scrollLeft: 'MOCK SCROLL LEFT', scrollTop: 'MOCK SCROLL TOP' } }))
45
- .to.eql({
46
- scrollLeft: 'MOCK SCROLL LEFT',
47
- scrollTop: 'MOCK SCROLL TOP'
48
- })
49
- )
50
- })
51
- })
52
- })
53
-
54
- describe('`scrollingElement` is not defined', () => {
55
- it('returns an object', () => {
56
- return (
57
- expect(getScrollingElement({}))
58
- .to.eql({
59
- scrollLeft: 0,
60
- scrollTop: 0
61
- })
62
- )
63
- })
64
- })
65
- })
66
-
67
- describe('`getViewportRect()`', () => {
68
- beforeEach(() => {
69
- global.window = {
70
- innerWidth: 'MOCK INNER WIDTH',
71
- innerHeight: 'MOCK INNER HEIGHT'
72
- }
73
-
74
- global.document = {
75
- scrollingElement: {
76
- scrollLeft: 'MOCK SCROLL LEFT',
77
- scrollTop: 'MOCK SCROLL TOP'
78
- }
79
- }
80
- })
81
-
82
- afterEach(() => {
83
- delete global.window
84
- delete global.document
85
- })
86
-
87
- it('returns an object', () => expect(getViewportRect()).to.eql({
88
- top: 'MOCK SCROLL TOP',
89
- right: 'MOCK SCROLL LEFTMOCK INNER WIDTH',
90
- bottom: 'MOCK SCROLL TOPMOCK INNER HEIGHT',
91
- left: 'MOCK SCROLL LEFT',
92
- width: 'MOCK INNER WIDTH',
93
- height: 'MOCK INNER HEIGHT'
94
- }))
95
- })
96
-
97
- describe('`getElementRect()`', () => {
98
- const mockElement = {
99
- offsetLeft: 'MOCK OFFSET LEFT',
100
- offsetTop: 'MOCK OFFSET TOP',
101
- offsetWidth: 'MOCK OFFSET WIDTH',
102
- offsetHeight: 'MOCK OFFSET HEIGHT'
103
- }
104
-
105
- it('returns an object', () => {
106
- return (
107
- expect(getElementRect(mockElement))
108
- .to.eql({
109
- left: 'MOCK OFFSET LEFT',
110
- top: 'MOCK OFFSET TOP',
111
- width: 'MOCK OFFSET WIDTH',
112
- height: 'MOCK OFFSET HEIGHT',
113
- right: 'MOCK OFFSET LEFTMOCK OFFSET WIDTH',
114
- bottom: 'MOCK OFFSET TOPMOCK OFFSET HEIGHT'
115
- })
116
- )
117
- })
118
- })
119
-
120
- describe('`getRects()`', () => {
121
- const mockContainer = {
122
- offsetLeft: 'MOCK OFFSET LEFT',
123
- offsetTop: 'MOCK OFFSET TOP',
124
- offsetWidth: 'MOCK OFFSET WIDTH',
125
- offsetHeight: 'MOCK OFFSET HEIGHT'
126
- }
127
-
128
- const mockTarget = {
129
- offsetLeft: 'MOCK OFFSET LEFT',
130
- offsetTop: 'MOCK OFFSET TOP',
131
- offsetWidth: 'MOCK OFFSET WIDTH',
132
- offsetHeight: 'MOCK OFFSET HEIGHT'
133
- }
134
-
135
- beforeEach(() => {
136
- global.window = {
137
- innerWidth: 'MOCK INNER WIDTH',
138
- innerHeight: 'MOCK INNER HEIGHT'
139
- }
140
-
141
- global.document = {
142
- scrollingElement: {
143
- scrollLeft: 'MOCK SCROLL LEFT',
144
- scrollTop: 'MOCK SCROLL TOP'
145
- }
146
- }
147
- })
148
-
149
- afterEach(() => {
150
- delete global.window
151
- delete global.document
152
- })
153
-
154
- it('returns an object', () => {
155
- return (
156
- expect(getRects(mockContainer, mockTarget))
157
- .to.eql({
158
- viewport: {
159
- top: 'MOCK SCROLL TOP',
160
- right: 'MOCK SCROLL LEFTMOCK INNER WIDTH',
161
- bottom: 'MOCK SCROLL TOPMOCK INNER HEIGHT',
162
- left: 'MOCK SCROLL LEFT',
163
- width: 'MOCK INNER WIDTH',
164
- height: 'MOCK INNER HEIGHT'
165
- },
166
- container: {
167
- left: 'MOCK OFFSET LEFT',
168
- top: 'MOCK OFFSET TOP',
169
- width: 'MOCK OFFSET WIDTH',
170
- height: 'MOCK OFFSET HEIGHT',
171
- right: 'MOCK OFFSET LEFTMOCK OFFSET WIDTH',
172
- bottom: 'MOCK OFFSET TOPMOCK OFFSET HEIGHT'
173
- },
174
- target: {
175
- left: 'MOCK OFFSET LEFT',
176
- top: 'MOCK OFFSET TOP',
177
- width: 'MOCK OFFSET WIDTH',
178
- height: 'MOCK OFFSET HEIGHT',
179
- right: 'MOCK OFFSET LEFTMOCK OFFSET WIDTH',
180
- bottom: 'MOCK OFFSET TOPMOCK OFFSET HEIGHT'
181
- }
182
- })
183
- )
184
- })
185
- })
186
-
187
- describe('Container is shorter than the Window', () => {
188
- const rects = {
189
- viewport: {
190
- top: 0,
191
- right: 1440,
192
- bottom: 900,
193
- left: 0,
194
- width: 1440,
195
- height: 900
196
- },
197
- container: {
198
- x: 0,
199
- y: 90,
200
- top: 90,
201
- right: 1440,
202
- bottom: 810,
203
- left: 0,
204
- width: 1440,
205
- height: 720
206
- },
207
- target: {
208
- width: 50,
209
- height: 50
210
- }
211
- }
212
-
213
- describe('`calculateLeft()`', () => {
214
- /**
215
- * Window is 1440 x 900
216
- * Header is 1440 x 90
217
- * Container is 1440 x 720
218
- * Footer is 1440 x 90
219
- * Target is 50 x 50
220
- */
221
- it('returns an object', () => {
222
- /**
223
- * (1440 / 2) - (50 / 2)
224
- */
225
- return (
226
- expect(calculateLeft(rects))
227
- .to.equal(695)
228
- )
229
- })
230
- })
231
-
232
- describe('`calculateTop()`', () => {
233
- /**
234
- * Window is 1440 x 900
235
- * Header is 1440 x 90
236
- * Container is 1440 x 720
237
- * Footer is 1440 x 90
238
- * Target is 50 x 50
239
- */
240
- it('returns an object', () => {
241
- /**
242
- * (720 / 2) - (50 / 2)
243
- */
244
- return (
245
- expect(calculateTop(rects))
246
- .to.equal(335)
247
- )
248
- })
249
- })
250
- })
251
-
252
- describe('Container is taller than the Window', () => {
253
- const rects = {
254
- viewport: {
255
- top: 0,
256
- right: 1440,
257
- bottom: 900,
258
- left: 0,
259
- width: 1440,
260
- height: 900
261
- },
262
- container: {
263
- x: 0,
264
- y: 90,
265
- top: 90,
266
- right: 1440,
267
- bottom: 1080,
268
- left: 0,
269
- width: 1440,
270
- height: 990
271
- },
272
- target: {
273
- width: 50,
274
- height: 50
275
- }
276
- }
277
-
278
- describe('`calculateLeft()`', () => {
279
- /**
280
- * Window is 1440 x 900
281
- * Header is 1440 x 90
282
- * Container is 1440 x 990
283
- * Footer is 1440 x 90
284
- * Target is 50 x 50
285
- */
286
- it('returns an object', () => {
287
- /**
288
- * (1440 / 2) - (50 / 2)
289
- */
290
- return (
291
- expect(calculateLeft(rects))
292
- .to.equal(695)
293
- )
294
- })
295
- })
296
-
297
- describe('`calculateTop()`', () => {
298
- /**
299
- * Window is 1440 x 900
300
- * Header is 1440 x 90
301
- * Container is 1440 x 990
302
- * Footer is 1440 x 90
303
- * Target is 50 x 50
304
- */
305
- it('returns an object', () => {
306
- /**
307
- * (810 / 2) - (50 / 2)
308
- */
309
- return (
310
- expect(calculateTop(rects))
311
- .to.equal(380)
312
- )
313
- })
314
- })
315
- })
316
- })