Skip to content

Commit 294c98e

Browse files
author
pemrouz
committed
proxy classes and attributes
1 parent 1b18648 commit 294c98e

File tree

4 files changed

+62
-42
lines changed

4 files changed

+62
-42
lines changed

.popper.yml

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ tests: (npm run build > /dev/null) && browserify ./test.js
66
-i colors
77
-i chai
88
| sed -E "s/require\('chai'\)/window.chai/"
9-
| uglifyjs
109

1110
watch:
1211
- src

dist/index.js

+15-15
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,27 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
1818
function shadow(ripple) {
1919
if (!_client2.default) return;
2020
log('creating', document.head.createShadowRoot ? 'encapsulation' : 'closing gap');
21+
ripple.render = render(ripple.render);
22+
return ripple;
23+
}
2124

22-
var render = ripple.render;
23-
24-
ripple.render = function (el) {
25-
el.createShadowRoot ? (!el.shadowRoot && el.createShadowRoot() && reflect(el), retarget(el)) : (el.shadowRoot = el, el.shadowRoot.host = el);
25+
var render = function render(next) {
26+
return function (el) {
27+
el.createShadowRoot ? !el.shadowRoot && el.createShadowRoot() && (reflect(el), retarget(el)) : (el.shadowRoot = el, el.shadowRoot.host = el);
2628

27-
return render(el);
29+
return next(el);
2830
};
31+
};
2932

30-
return ripple;
31-
}
32-
33-
function reflect(el) {
34-
el.shadowRoot.innerHTML = el.innerHTML;
35-
}
33+
var reflect = function reflect(el) {
34+
return el.shadowRoot.innerHTML = el.innerHTML;
35+
};
3636

37-
function retarget(el) {
38-
keys(el).concat(['on', 'once', 'emit']).map(function (d) {
39-
return el.shadowRoot[d] = el[d];
37+
var retarget = function retarget(el) {
38+
return keys(el).concat(['on', 'once', 'emit', 'classList', 'getAttribute', 'setAttribute']).map(function (d) {
39+
return el.shadowRoot[d] = is.fn(el[d]) ? el[d].bind(el) : el[d];
4040
});
41-
}
41+
};
4242

4343
var log = require('utilise/log')('[ri/shadow]'),
4444
err = require('utilise/err')('[ri/shadow]');

src/index.js

+17-23
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,26 @@
44
export default function shadow(ripple){
55
if (!client) return;
66
log('creating', document.head.createShadowRoot ? 'encapsulation' : 'closing gap')
7-
8-
var render = ripple.render
9-
10-
ripple.render = function(el){
11-
el.createShadowRoot
12-
? (!el.shadowRoot && el.createShadowRoot() && reflect(el)
13-
, retarget(el))
14-
: ( el.shadowRoot = el
15-
, el.shadowRoot.host = el)
16-
17-
return render(el)
18-
}
19-
7+
ripple.render = render(ripple.render)
208
return ripple
219
}
2210

23-
function reflect(el) {
24-
el.shadowRoot.innerHTML = el.innerHTML
25-
}
11+
const render = next => el => {
12+
el.createShadowRoot
13+
? (!el.shadowRoot && el.createShadowRoot() && (reflect(el), retarget(el)))
14+
: ( el.shadowRoot = el
15+
, el.shadowRoot.host = el)
2616

27-
function retarget(el) {
28-
keys(el)
29-
.concat(['on', 'once', 'emit'])
30-
.map(d => el.shadowRoot[d] = el[d])
17+
return next(el)
3118
}
3219

33-
import client from 'utilise/client'
34-
var log = require('utilise/log')('[ri/shadow]')
35-
, err = require('utilise/err')('[ri/shadow]')
20+
const reflect = el => el.shadowRoot.innerHTML = el.innerHTML
21+
22+
const retarget = el => keys(el)
23+
.concat(['on', 'once', 'emit', 'classList', 'getAttribute', 'setAttribute'])
24+
.map(d => el.shadowRoot[d] = is.fn(el[d]) ? el[d].bind(el) : el[d])
25+
26+
const log = require('utilise/log')('[ri/shadow]')
27+
, err = require('utilise/err')('[ri/shadow]')
28+
29+
import client from 'utilise/client'

test.js

+30-3
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ describe('Shadow DOM', function(){
7575

7676
expect(el2.shadowRoot.__data__).to.be.eql(el2.__data__)
7777
expect(el2.shadowRoot.state).to.be.eql(el2.state)
78-
expect(el2.shadowRoot.on).to.be.eql(el2.on)
79-
expect(el2.shadowRoot.once).to.be.eql(el2.once)
80-
expect(el2.shadowRoot.emit).to.be.eql(el2.emit)
78+
expect(el2.shadowRoot.on).to.be.a('function')
79+
expect(el2.shadowRoot.once).to.be.a('function')
80+
expect(el2.shadowRoot.emit).to.be.a('function')
8181

8282
el2.on('foo', function(d){
8383
expect(d).to.be.eql('bar')
@@ -87,5 +87,32 @@ describe('Shadow DOM', function(){
8787
el2.shadowRoot.emit('foo', 'bar')
8888
})
8989

90+
it('should retarget .classed and .attr', function(){
91+
var ripple = shadow(components(fn(data(core()))))
92+
93+
ripple('component-2', noop)
94+
ripple.render(el2)
95+
96+
var root = el2.shadowRoot
97+
98+
expect(root.classList).to.be.eql(el2.classList)
99+
expect(root.getAttribute).to.be.a('function')
100+
expect(root.setAttribute).to.be.a('function')
101+
102+
if (el2.classList) {
103+
expect(el2.className).to.be.eql('')
104+
root.classList.add('foo')
105+
expect(el2.className).to.be.eql('foo')
106+
root.classList.remove('foo')
107+
expect(el2.className).to.be.eql('')
108+
}
109+
110+
expect(el2.getAttribute('foo')).to.be.eql(null)
111+
expect(root.getAttribute('foo')).to.be.eql(null)
112+
root.setAttribute('foo', 'bar')
113+
114+
expect(el2.getAttribute('foo')).to.be.eql('bar')
115+
expect(root.getAttribute('foo')).to.be.eql('bar')
116+
})
90117

91118
})

0 commit comments

Comments
 (0)