Skip to content

Commit 665c2ab

Browse files
committed
Moving to mixin-macros source code
1 parent aef0768 commit 665c2ab

9 files changed

+208
-57
lines changed

README.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ This plugin is a JavaScript module that works with [JS-in-CSS stylesheets](https
88

99
## Downloading
1010

11-
You can download `index.js` and add it to your codebase, or download it with npm:
11+
You can download jsincss-element-query and add it to your codebase manually, or download it with npm:
1212

1313
```bash
1414
npm install jsincss-element-query
@@ -18,26 +18,26 @@ Another option that works for building or testing, that isn't ideal for producti
1818

1919
```html
2020
<script type=module>
21-
import element from 'https://unpkg.com/jsincss-element-query/index.js'
21+
import element from 'https://unpkg.com/jsincss-element-query/index.vanilla.js'
2222
</script>
2323
```
2424

2525
## Importing
2626

27-
You can import the plugin into your own JavaScript modules in a couple of ways.
27+
This plugin exists in three different formats:
2828

29-
The first way is using the native [`import` statement](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import) in JavaScript. Here you can assign any name you want to the function you are importing, and you only need to provide a path to the plugin's `index.js` file:
29+
- CommonJS module: [index.js](index.js)
30+
- Vanilla JS module: [index.vanilla.js](index.vanilla.js)
31+
- Browser function: [index.browser.js](index.browser.js)
3032

31-
```js
32-
import element from './node_modules/jsincss-element-query/index.js'
33-
```
34-
35-
If you want to use `require` to load this plugin instead, and use a bundler like Webpack or Parcel, make sure to add `.default` as you require it:
33+
You can import this plugin using the native [`import`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import) statement in JavaScript. Here you can assign any name you want to the function you are importing, and you only need to provide a path to the plugin's `index.vanilla.js` file:
3634

3735
```js
38-
const element = require('jsincss-element-query').default
36+
import element from './index.vanilla.js'
3937
```
4038

39+
You can also use the CommonJS-formatted module located at [index.js](index.js) with `require()` for use with bundlers that don't use vanilla JS modules.
40+
4141
Once you have imported this plugin into your module, you can use the plugin as `element()`
4242

4343
## Using JS-in-CSS Stylesheets
@@ -78,8 +78,8 @@ This example will use the `jsincss` plugin to load a JS-in-CSS stylesheet making
7878

7979
```html
8080
<script type=module>
81-
import jsincss from 'https://unpkg.com/jsincss/index.js'
82-
import element from 'https://unpkg.com/jsincss-element-query/index.js'
81+
import jsincss from 'https://unpkg.com/jsincss/index.vanilla.js'
82+
import element from 'https://unpkg.com/jsincss-element-query/index.vanilla.js'
8383
8484
jsincss(() => `
8585
@@ -96,7 +96,7 @@ This example will use the `jsincss` plugin to load a JS-in-CSS stylesheet making
9696
It's also possible to write your stylesheets as a separate JavaScript module like this, where you import any helper plugins at the top of the stylesheet:
9797

9898
```js
99-
import element from 'https://unpkg.com/jsincss-element-query/index.js'
99+
import element from 'https://unpkg.com/jsincss-element-query/index.vanilla.js'
100100

101101
export default () => `
102102
@@ -112,7 +112,7 @@ export default () => `
112112
And then import both the `jsincss` plugin and the stylesheet into your code and run them like this, suppling any `selector` or `events` list the `jsincss` plugin might need to apply the stylesheet only the the element(s) and event(s) you require, depending on what you're doing:
113113

114114
```js
115-
import jsincss from 'https://unpkg.com/jsincss/index.js'
115+
import jsincss from 'https://unpkg.com/jsincss/index.vanilla.js'
116116
import stylesheet from './path/to/stylesheet.js'
117117

118118
jsincss(stylesheet)
@@ -121,7 +121,7 @@ jsincss(stylesheet)
121121
For a more advanced example, check out the [test](https://tomhodgins.github.io/jsincss-element-query/test/index) file which includes [element-query.js](test/element-query.js) and [element-query-scroll.js](test/element-query-scroll.js) and includes them in a module like this:
122122

123123
```javascript
124-
import jsincss from '//unpkg.com/jsincss/index.js'
124+
import jsincss from '//unpkg.com/jsincss/index.vanilla.js'
125125
import stylesheet from './element-query-test.js'
126126
import scrollStyles from './element-query-scroll-test.js'
127127

index.browser.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
function element(selector, conditions, stylesheet) {
2+
3+
const features = {
4+
minWidth: (el, number) => number <= el.offsetWidth,
5+
maxWidth: (el, number) => number >= el.offsetWidth,
6+
minHeight: (el, number) => number <= el.offsetHeight,
7+
maxHeight: (el, number) => number >= el.offsetHeight,
8+
minChildren: (el, number) => number <= el.children.length,
9+
children: (el, number) => number === el.children.length,
10+
maxChildren: (el, number) => number >= el.children.length,
11+
minCharacters: (el, number) => number <= ((el.value && el.value.length) || el.textContent.length),
12+
characters: (el, number) => number === ((el.value && el.value.length) || el.textContent.length),
13+
maxCharacters: (el, number) => number >= ((el.value && el.value.length) || el.textContent.length),
14+
minScrollX: (el, number) => number <= el.scrollLeft,
15+
maxScrollX: (el, number) => number >= el.scrollLeft,
16+
minScrollY: (el, number) => number <= el.scrollTop,
17+
maxScrollY: (el, number) => number >= el.scrollTop,
18+
minAspectRatio: (el, number) => number <= el.offsetWidth / el.offsetHeight,
19+
maxAspectRatio: (el, number) => number >= el.offsetWidth / el.offsetHeight,
20+
orientation: (el, string) => {
21+
switch (string) {
22+
case 'portrait': return el.offsetWidth < el.offsetHeight
23+
case 'square': return el.offsetWidth === el.offsetHeight
24+
case 'landscape': return el.offsetWidth > el.offsetHeight
25+
}
26+
}
27+
}
28+
29+
return Array.from(document.querySelectorAll(selector))
30+
31+
.reduce((styles, tag, count) => {
32+
33+
const attr = (selector + Object.keys(conditions) + Object.values(conditions)).replace(/\W/g, '')
34+
35+
if (
36+
Object.entries(conditions).every(test =>
37+
features[test[0]](tag, test[1])
38+
)
39+
) {
40+
41+
tag.setAttribute(`data-element-${attr}`, count)
42+
styles += stylesheet.replace(
43+
/:self|\$this/g,
44+
`[data-element-${attr}="${count}"]`
45+
)
46+
count++
47+
48+
} else {
49+
50+
tag.setAttribute(`data-element-${attr}`, '')
51+
52+
}
53+
54+
return styles
55+
56+
}, '')
57+
58+
}

index.js

Lines changed: 34 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,58 @@
1-
export default (selector, conditions, stylesheet) => {
1+
module.exports = (selector, conditions, stylesheet) => {
22

33
const features = {
4-
minWidth: (el, number) => number <= el.offsetWidth,
5-
maxWidth: (el, number) => number >= el.offsetWidth,
6-
minHeight: (el, number) => number <= el.offsetHeight,
7-
maxHeight: (el, number) => number >= el.offsetHeight,
8-
minChildren: (el, number) => number <= el.children.length,
9-
children: (el, number) => number === el.children.length,
10-
maxChildren: (el, number) => number >= el.children.length,
11-
minCharacters: (el, number) => number <= ((el.value && el.value.length) || el.textContent.length),
12-
characters: (el, number) => number === ((el.value && el.value.length) || el.textContent.length),
13-
maxCharacters: (el, number) => number >= ((el.value && el.value.length) || el.textContent.length),
14-
minScrollX: (el, number) => number <= el.scrollLeft,
15-
maxScrollX: (el, number) => number >= el.scrollLeft,
16-
minScrollY: (el, number) => number <= el.scrollTop,
17-
maxScrollY: (el, number) => number >= el.scrollTop,
18-
minAspectRatio: (el, number) => number <= el.offsetWidth / el.offsetHeight,
19-
maxAspectRatio: (el, number) => number >= el.offsetWidth / el.offsetHeight,
20-
orientation: (el, string) => {
21-
switch (string) {
22-
case 'portrait': return el.offsetWidth < el.offsetHeight
23-
case 'square': return el.offsetWidth === el.offsetHeight
24-
case 'landscape': return el.offsetWidth > el.offsetHeight
25-
}
26-
}
27-
}
4+
minWidth: (el, number) => number <= el.offsetWidth,
5+
maxWidth: (el, number) => number >= el.offsetWidth,
6+
minHeight: (el, number) => number <= el.offsetHeight,
7+
maxHeight: (el, number) => number >= el.offsetHeight,
8+
minChildren: (el, number) => number <= el.children.length,
9+
children: (el, number) => number === el.children.length,
10+
maxChildren: (el, number) => number >= el.children.length,
11+
minCharacters: (el, number) => number <= ((el.value && el.value.length) || el.textContent.length),
12+
characters: (el, number) => number === ((el.value && el.value.length) || el.textContent.length),
13+
maxCharacters: (el, number) => number >= ((el.value && el.value.length) || el.textContent.length),
14+
minScrollX: (el, number) => number <= el.scrollLeft,
15+
maxScrollX: (el, number) => number >= el.scrollLeft,
16+
minScrollY: (el, number) => number <= el.scrollTop,
17+
maxScrollY: (el, number) => number >= el.scrollTop,
18+
minAspectRatio: (el, number) => number <= el.offsetWidth / el.offsetHeight,
19+
maxAspectRatio: (el, number) => number >= el.offsetWidth / el.offsetHeight,
20+
orientation: (el, string) => {
21+
switch (string) {
22+
case 'portrait': return el.offsetWidth < el.offsetHeight
23+
case 'square': return el.offsetWidth === el.offsetHeight
24+
case 'landscape': return el.offsetWidth > el.offsetHeight
25+
}
26+
}
27+
}
2828

2929
return Array.from(document.querySelectorAll(selector))
3030

3131
.reduce((styles, tag, count) => {
3232

33-
const identifier = (
34-
selector
35-
+ Object.keys(conditions)
36-
+ Object.values(conditions)
37-
).replace(/\W/g, '')
33+
const attr = (selector + Object.keys(conditions) + Object.values(conditions)).replace(/\W/g, '')
3834

3935
if (
40-
Object.entries(conditions).every(test =>
41-
features[test[0]](tag, test[1])
42-
)
43-
) {
36+
Object.entries(conditions).every(test =>
37+
features[test[0]](tag, test[1])
38+
)
39+
) {
4440

45-
tag.setAttribute(`data-${identifier}`, count)
41+
tag.setAttribute(`data-element-${attr}`, count)
4642
styles += stylesheet.replace(
4743
/:self|\$this/g,
48-
`[data-${identifier}="${count}"]`
44+
`[data-element-${attr}="${count}"]`
4945
)
5046
count++
5147

5248
} else {
5349

54-
tag.setAttribute(`data-${identifier}`, '')
50+
tag.setAttribute(`data-element-${attr}`, '')
5551

5652
}
5753

5854
return styles
5955

6056
}, '')
6157

62-
}
58+
}

index.vanilla.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
export default (selector, conditions, stylesheet) => {
2+
3+
const features = {
4+
minWidth: (el, number) => number <= el.offsetWidth,
5+
maxWidth: (el, number) => number >= el.offsetWidth,
6+
minHeight: (el, number) => number <= el.offsetHeight,
7+
maxHeight: (el, number) => number >= el.offsetHeight,
8+
minChildren: (el, number) => number <= el.children.length,
9+
children: (el, number) => number === el.children.length,
10+
maxChildren: (el, number) => number >= el.children.length,
11+
minCharacters: (el, number) => number <= ((el.value && el.value.length) || el.textContent.length),
12+
characters: (el, number) => number === ((el.value && el.value.length) || el.textContent.length),
13+
maxCharacters: (el, number) => number >= ((el.value && el.value.length) || el.textContent.length),
14+
minScrollX: (el, number) => number <= el.scrollLeft,
15+
maxScrollX: (el, number) => number >= el.scrollLeft,
16+
minScrollY: (el, number) => number <= el.scrollTop,
17+
maxScrollY: (el, number) => number >= el.scrollTop,
18+
minAspectRatio: (el, number) => number <= el.offsetWidth / el.offsetHeight,
19+
maxAspectRatio: (el, number) => number >= el.offsetWidth / el.offsetHeight,
20+
orientation: (el, string) => {
21+
switch (string) {
22+
case 'portrait': return el.offsetWidth < el.offsetHeight
23+
case 'square': return el.offsetWidth === el.offsetHeight
24+
case 'landscape': return el.offsetWidth > el.offsetHeight
25+
}
26+
}
27+
}
28+
29+
return Array.from(document.querySelectorAll(selector))
30+
31+
.reduce((styles, tag, count) => {
32+
33+
const attr = (selector + Object.keys(conditions) + Object.values(conditions)).replace(/\W/g, '')
34+
35+
if (
36+
Object.entries(conditions).every(test =>
37+
features[test[0]](tag, test[1])
38+
)
39+
) {
40+
41+
tag.setAttribute(`data-element-${attr}`, count)
42+
styles += stylesheet.replace(
43+
/:self|\$this/g,
44+
`[data-element-${attr}="${count}"]`
45+
)
46+
count++
47+
48+
} else {
49+
50+
tag.setAttribute(`data-element-${attr}`, '')
51+
52+
}
53+
54+
return styles
55+
56+
}, '')
57+
58+
}

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"version": "1.1.2",
44
"description": "An element query plugin for jsincss",
55
"main": "index.js",
6+
"module": "index.vanilla.js",
67
"scripts": {
78
"test": "echo \"Error: no test specified\" && exit 1"
89
},
@@ -11,6 +12,8 @@
1112
"url": "git+https://github.com/tomhodgins/jsincss-element-query.git"
1213
},
1314
"keywords": [
15+
"jsincss",
16+
"js-in-css",
1417
"element",
1518
"query",
1619
"container",

source/element.sexp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
mixin('element', ['selector', 'conditions', 'stylesheet'],
2+
prelude(' const features = {\n\
3+
minWidth: (el, number) => number <= el.offsetWidth,\n\
4+
maxWidth: (el, number) => number >= el.offsetWidth,\n\
5+
minHeight: (el, number) => number <= el.offsetHeight,\n\
6+
maxHeight: (el, number) => number >= el.offsetHeight,\n\
7+
minChildren: (el, number) => number <= el.children.length,\n\
8+
children: (el, number) => number === el.children.length,\n\
9+
maxChildren: (el, number) => number >= el.children.length,\n\
10+
minCharacters: (el, number) => number <= ((el.value && el.value.length) || el.textContent.length),\n\
11+
characters: (el, number) => number === ((el.value && el.value.length) || el.textContent.length),\n\
12+
maxCharacters: (el, number) => number >= ((el.value && el.value.length) || el.textContent.length),\n\
13+
minScrollX: (el, number) => number <= el.scrollLeft,\n\
14+
maxScrollX: (el, number) => number >= el.scrollLeft,\n\
15+
minScrollY: (el, number) => number <= el.scrollTop,\n\
16+
maxScrollY: (el, number) => number >= el.scrollTop,\n\
17+
minAspectRatio: (el, number) => number <= el.offsetWidth / el.offsetHeight,\n\
18+
maxAspectRatio: (el, number) => number >= el.offsetWidth / el.offsetHeight,\n\
19+
orientation: (el, string) => {\n\
20+
switch (string) {\n\
21+
case \'portrait\': return el.offsetWidth < el.offsetHeight\n\
22+
case \'square\': return el.offsetWidth === el.offsetHeight\n\
23+
case \'landscape\': return el.offsetWidth > el.offsetHeight\n\
24+
}\n\
25+
}\n\
26+
}\n\n',
27+
returnValue('Array.from(document.querySelectorAll(selector))',
28+
plainReduce(
29+
createAttribute(['selector', 'Object.keys(conditions)', 'Object.values(conditions)'],
30+
ifElseReset('\n\
31+
Object.entries(conditions).every(test =>\n\
32+
features[test[0]](tag, test[1])\n\
33+
)\n\
34+
',
35+
'tag',
36+
'element'))))))

test/element-query-scroll.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import element from '../index.js'
1+
import element from '../index.vanilla.js'
22

33
export default () => `
44

test/element-query.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import element from '../index.js'
1+
import element from '../index.vanilla.js'
22

33
export default () => `
44

test/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,11 @@ <h3>max-aspect-ratio</h3>
201201
<div class=maxaspectratio data-drag=both>class="maxaspectratio"</div>
202202

203203
<script type=module>
204-
import jsincss from 'https://unpkg.com/jsincss/index.js'
204+
import jsincss from 'https://unpkg.com/jsincss/index.vanilla.js'
205205
import stylesheet from './element-query.js'
206206
import scrollStyles from './element-query-scroll.js'
207207

208-
jsincss(stylesheet)
208+
jsincss(stylesheet, window, ['load', 'resize', 'input', 'click', 'mouseup'])
209209
jsincss(scrollStyles, window, ['load'])
210210
jsincss(scrollStyles, '[class*="-scroll-"]', ['scroll'])
211211
</script>

0 commit comments

Comments
 (0)