Skip to content

Instantly share code, notes, and snippets.

@jlongster
Last active July 19, 2024 06:07
Show Gist options
  • Save jlongster/3f32b2c7dce588f24c92 to your computer and use it in GitHub Desktop.
Save jlongster/3f32b2c7dce588f24c92 to your computer and use it in GitHub Desktop.
var dom = Bloop.dom;
var Box = Bloop.createClass({
getInitialState: function() {
return { number: 0 };
},
updateNumber: function() {
this.state.number++;
},
render: function() {
return dom.div(
dom.span(this.state.number),
dom.button({ onClick: this.updateNumber }, 'Increment')
);
}
});
var box = Box();
function render() {
Bloop.renderComponent(box, document.body);
requestAnimationFrame(render);
}
render();
var dom = Bloop.dom;
// components
var App = Bloop.createClass({
getInitialState: function() {
return { number: 0 };
},
updateNumber: function(value) {
this.state.number = value;
},
render: function() {
return dom.div(
dom.span(this.state.number),
Toolbar({
number: this.state.number,
onChange: this.updateNumber
})
);
}
});
var Toolbar = Bloop.createClass({
render: function() {
return dom.div(
dom.button({
onClick: this.props.onChange.bind(null, this.props.number - 1)
}, 'decrement'),
dom.button({
onClick: this.props.onChange.bind(null, this.props.number + 1)
}, 'increment')
);
}
});
// render
var app = App();
function render() {
Bloop.renderComponent(app, document.body);
requestAnimationFrame(render);
}
render();
var dom = Bloop.dom;
var App = Bloop.createClass({
getInitialState: function() {
var items = [
{ text: 'Would I rather be feared or loved? Easy, both. ' +
'I want people to be afraid of how much they love me. ' +
'- Michael Scott' },
{ text: 'Sorry I annoyed you with my friendship. -Andy ' },
{ text: 'I am not a security threat. And, my middle name is ' +
'Kurt, not Fart. - Dwight Schrute' }
];
return { settings: { bigFonts: false,
color: null },
selectedItem: 'list',
items: items };
},
changeTab: function(tab) {
this.state.selectedItem = tab;
},
componentDidRender: function() {
window.parent.postMessage(
JSON.stringify({ from: 'shift',
state: this.state }),
window.location.protocol + '//' + window.location.host
);
},
changeSetting: function(name, value) {
this.state.settings[name] = value;
},
render: function() {
var s = this.state;
var content;
if(s.selectedItem === 'list') {
content = ItemList({ items: s.items });
}
else if(s.selectedItem === 'settings') {
content = Settings({ bigFonts: s.settings.bigFonts,
onChange: this.changeSetting
});
}
else if(s.selectedItem === 'about') {
content = dom.div(
{ className: 'about' },
'This is a sample demo'
);
}
return dom.div(
{ className: 'app ' + (s.settings.bigFonts ? 'big' : ''),
style: { backgroundColor: s.settings.color } },
Tabs({ selectedItem: s.selectedItem,
onChange: this.changeTab }),
content
);
}
});
var Tabs = Bloop.createClass({
render: function() {
var props = this.props;
function tab(id) {
return dom.a({
href: '#',
className: props.selectedItem === id ? 'selected' : '',
onClick: props.onChange.bind(null, id)
}, id);
}
return dom.div(
{ className: 'tabs' },
dom.ul(
dom.li(tab('list')),
dom.li(tab('settings')),
dom.li(tab('about'))
)
);
}
});
var Settings = Bloop.createClass({
randomizeColor: function() {
this.props.onChange(
'color',
'rgb(0,' + (Math.random() * 125 | 0) + ',0)'
);
},
reset: function() {
this.props.onChange('bigFonts', false);
this.props.onChange('color', null);
},
render: function() {
return dom.div(
{ className: 'settings' },
dom.div(
dom.input({ type: 'checkbox',
checked: this.props.bigFonts,
onClick: this.props.onChange.bind(
null,
'bigFonts',
!this.props.bigFonts
)
}),
'big fonts'
),
dom.div(dom.button({
onClick: this.randomizeColor
}, 'random color')),
dom.div(dom.button({ onClick: this.reset }, 'reset'))
);
}
});
var ItemList = Bloop.createClass({
render: function() {
return dom.ul(
{ className: 'itemlist' },
this.props.items.map(function(item) {
return dom.li(item.text);
})
);
}
});
// render
var app = App();
function render() {
Bloop.renderComponent(app, document.body);
requestAnimationFrame(render);
}
render();
// state update
window.addEventListener('message', function(msg) {
app.state = JSON.parse(msg.data);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment