aboutsummaryrefslogtreecommitdiff
path: root/vnext
diff options
context:
space:
mode:
authorGravatar Vitaly Takmazov2017-12-20 13:28:12 +0300
committerGravatar Vitaly Takmazov2023-01-13 10:37:52 +0300
commit813c5e7eda90944733d60dd324459ced93c9c087 (patch)
treeb3a7e40532aef4544377e66fd00a0fc5eac21671 /vnext
parenta12975463c3389e506d24288341b30257419d8d2 (diff)
initial demo
Diffstat (limited to 'vnext')
-rw-r--r--vnext/package.json42
-rw-r--r--vnext/server.js15
-rw-r--r--vnext/src/app.js34
-rw-r--r--vnext/src/components/message.jsx26
-rw-r--r--vnext/src/style/main.css263
-rw-r--r--vnext/src/views/index.jade22
-rw-r--r--vnext/webpack.config.js34
7 files changed, 436 insertions, 0 deletions
diff --git a/vnext/package.json b/vnext/package.json
new file mode 100644
index 00000000..56640ed6
--- /dev/null
+++ b/vnext/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "juick",
+ "version": "1.0.0",
+ "description": "",
+ "main": "server.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "compile": "webpack --colors -p"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "devDependencies": {
+ "babel-core": "^6.7.2",
+ "babel-loader": "^6.2.4",
+ "babel-preset-es2015": "^6.6.0",
+ "babel-preset-react": "^6.5.0",
+ "babel-preset-stage-0": "^6.5.0",
+ "css-loader": "^0.23.1",
+ "extract-text-webpack-plugin": "^1.0.1",
+ "file-loader": "^0.8.5",
+ "jade": "^1.11.0",
+ "jade-html-loader": "0.0.3",
+ "jade-react-loader": "^1.0.2",
+ "react-hot-loader": "^1.3.0",
+ "style-loader": "^0.13.0",
+ "webpack": "^1.12.14",
+ "webpack-dev-server": "^1.14.1"
+ },
+ "babel": {
+ "presets": [
+ "es2015",
+ "react",
+ "stage-0"
+ ]
+ },
+ "dependencies": {
+ "react": "^0.14.7",
+ "react-dom": "^0.14.7",
+ "whatwg-fetch": "^0.11.0"
+ }
+}
diff --git a/vnext/server.js b/vnext/server.js
new file mode 100644
index 00000000..600e954a
--- /dev/null
+++ b/vnext/server.js
@@ -0,0 +1,15 @@
+var webpack = require("webpack");
+var WebPackDevServer = require("webpack-dev-server");
+var config = require("./webpack.config");
+
+new WebPackDevServer(webpack(config), {
+ publicPath: config.output.publicPath,
+ hot: true,
+ inline: true,
+ historyApiFallback: true
+}).listen(3000, 'localhost', function (err, result) {
+ if (err) {
+ return console.log(err);
+ }
+ console.log("listening")
+}) \ No newline at end of file
diff --git a/vnext/src/app.js b/vnext/src/app.js
new file mode 100644
index 00000000..52f35076
--- /dev/null
+++ b/vnext/src/app.js
@@ -0,0 +1,34 @@
+import "whatwg-fetch"
+import React, {PropTypes} from "react"
+import ReactDOM from "react-dom"
+
+import Message from "./components/Message.jsx"
+
+const Page = React.createClass({
+ getInitialState() {
+ return {msgs: [], loading: false}
+ },
+ propTypes: {
+ msgs: PropTypes.array,
+ source: PropTypes.string.isRequired
+ },
+ render() {
+ var nodes = this.state.msgs.map(msg => {
+ return (<Message key={msg.mid} mid={msg.mid} user={msg.user} body={msg.body} timestamp={msg.timestamp}/>)
+ });
+ return (<div className="msgs">{nodes}</div>)
+ },
+ componentDidMount() {
+ fetch(this.props.source)
+ .then(response => {
+ return response.json()
+ })
+ .then(data =>
+ this.setState({ msgs: data })
+ ).catch(ex => {
+ console.log(ex)
+ });
+ }
+});
+
+ReactDOM.render(<Page source="https://api.juick.com/messages" />, document.getElementById("content")); \ No newline at end of file
diff --git a/vnext/src/components/message.jsx b/vnext/src/components/message.jsx
new file mode 100644
index 00000000..faeb4b4e
--- /dev/null
+++ b/vnext/src/components/message.jsx
@@ -0,0 +1,26 @@
+import React, {PropTypes} from "react"
+
+const Message = React.createClass({
+ propTypes: {
+ mid: PropTypes.number.isRequired,
+ user: PropTypes.shape({
+ uid: PropTypes.number.isRequired,
+ uname: PropTypes.string.isRequired
+ }),
+ timestamp: PropTypes.string.isRequired,
+ body: PropTypes.string.isRequired
+ },
+ render() { return (
+ <article>
+ <aside>
+ <a href={this.props.user.uname + "/"}>
+ <img src={"//i.juick.com/a/" + this.props.user.uid + ".png"} alt=""/></a>
+ </aside>
+ <header className="u">@<a href={this.props.user.uname + "/"}>{this.props.user.uname}</a>: </header>
+ <header className="t"><a href={this.props.user.uname + "/" + this.props.mid}>
+ <time dateTime={this.props.timestamp} title={this.props.timestamp}>{this.props.timestamp}</time></a></header>
+ <p>{this.props.body}</p>
+ </article>) }
+});
+
+export default Message \ No newline at end of file
diff --git a/vnext/src/style/main.css b/vnext/src/style/main.css
new file mode 100644
index 00000000..a65e3389
--- /dev/null
+++ b/vnext/src/style/main.css
@@ -0,0 +1,263 @@
+html,body,div,h1,h2,ul,li,p,form,input,textarea,pre { margin: 0; padding: 0; }
+html,input,textarea { font-family: sans-serif; font-size: 12pt; }
+html { background: #EEEEE5; color: #000; }
+body { width: 1024px; margin: 0 auto; }
+h1,h2 { font-weight: normal; }
+ul { list-style-type: none; }
+a { text-decoration: none; color: #069; }
+img,hr { border: none; }
+hr { height: 1px; background: #CCC; margin: 10px 0; }
+pre { white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word; }
+span.u { text-decoration: underline; }
+
+#content { width: 728px; margin: 15px 0 0 40px; float: right; }
+#topwrapper { position: relative; clear: both; }
+
+/********/
+
+body>header { width: 1024px; }
+body>header a { color: #000; border-bottom: 1px dotted #666; font-size: 13pt; }
+
+#logo { float: left; width: 110px; height: 36px; margin: 7px 25px 0 20px; }
+#logo a { display: block; width: 110px; height: 36px; text-indent: 100%; white-space: nowrap; overflow: hidden; border: 0;
+background: url("//i.juick.com/logo.png") no-repeat; }
+@media screen and (-webkit-min-device-pixel-ratio: 2),
+ (min-resolution: 192dpi) {
+ #logo a {
+ background: url("//i.juick.com/logo_2x.png") no-repeat;
+ background-size: cover;
+ }
+}
+nav#global { float: left; }
+nav#global li { display: inline-block; margin: 14px 12px 0 0; }
+#search { float: right; margin: 12px 20px 12px 0; }
+#search input { background: #FFF; border: 1px solid #DDDDD5; padding: 4px; }
+
+#headdiv { clear: both; margin: 0 0 5px 0; padding: 0 20px; background: #DDDDD5; border-top: 1px solid #D5D5D0; border-bottom: 1px solid #D5D5D0; position: relative; }
+#headdiv li { display: inline-block; margin: 12px 12px 12px 0; }
+nav#actions { top: 0; right: 8px; position: absolute; }
+
+body>header nav li:after { display: inline-block; content: "/"; margin-left: 12px; color: #AAA; }
+body>header nav li:last-child:after { display: none; }
+
+body>header p { color: #000; font-size: 13pt; margin: 12px 0; text-align: center; }
+
+/********/
+
+#content>p, #content>h1, #content>h2 { margin: 1em 0; }
+
+#newmessage { background: #E5E5E0; padding: 15px; margin-bottom: 20px; }
+#newmessage textarea { border: 1px solid #CCC; padding: 4px; width: 688px; resize: vertical; min-height: 14pt; height: 14pt; margin: 0 0 5px 0; }
+#newmessage input { border: 1px solid #CCC; padding: 3px 6px 4px; /*margin: 5px 0;*/ }
+#newmessage>div { display: none; }
+#newmessage .img { width: 500px; }
+#newmessage .tags { width: 500px; }
+#newmessage .subm { width: 150px; background: #EEEEE5; }
+
+article { margin: 10px 0 20px 58px; background: #FFF; padding: 12px 13px; }
+article>aside { margin: -12px 0 0 -71px; width: 48px; height: 48px; float: left; }
+article>aside img { width: 48px; height: 48px; }
+article>header.u { overflow: hidden; display: inline-block; width: 460px; }
+article>header.t { width: 140px; text-align: right; float: right; }
+article time { color: #999; font-size: 10pt; border-bottom: 1px dotted #999; }
+article p { margin: 10px 0 15px 0; }
+article p.i { text-align: center; }
+article p.ir { float: right; margin-left: 10px; margin-bottom: 10px; }
+article p.ir a { cursor: -webkit-zoom-in; cursor: -moz-zoom-in; }
+article p.ir img { max-width: 200px; max-height: 200px; }
+article .irbr { clear: right; }
+article>nav.l { display: inline-block; font-size: 10pt; }
+article>nav.l a { color: #888; border-bottom: 1px dotted #AAA; margin-right: 15px; }
+article>nav.s { display: inline-block; text-align: right; float: right; }
+article>nav.s a { font-weight: bold; color: #222; }
+article a.likes { padding-left: 20px; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAXNSR0IArs4c6QAAAMRJREFUGBmtwbsuQ2EAAOCPX6LlKSRGD2E0YCKRGDqLQReDSVhIjI1r49bRdiZJn0GIQcPSxFO4HPHLOe1J2rpMvo//MaMl1batZNSWtlTLrK4JL5qqTqQO1aTqqppeTcrtexRklkTRskzw4Eju1rmOIIqCjrp7uRsNhQWLCmfu5C48Kxk05MmV3JR3xwatiaZ1rYg29Zr34VSPHdG6wpw3iaDPnmhDpiKVKPtmV7Sq4tOlET86EEUNw34RJK4Ffxgzrs8XpvA41+ECiwcAAAAASUVORK5CYII=") no-repeat 0px 1px; }
+article a.replies { margin-left: 18px; padding-left: 20px; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAANdJREFUOMvN069OgmEUBvAfSCUxNicFKTQ3bkCLyRvwDrgHZ5Q7MFlobAY3G9UrsOi0iIGNBIGgG00o53PvCMAHBJ7thPecPc/5+3IoKKKDIeZrbIi74CiFQBs3eMTbmmRnuMUID5nzG90cFXcxyEqHU3zlEBigkQoUor9N8Recf4Gdpr8XgV+Uc/DK+Ekdz/hAcwNyE594Sp0NTJYOZobriB/FjUwjNkE9m36GKq5wHO9zXOICtch4j1f0Q2QlSnjBGL10dXlQxXvSVmWbTZ3E/5ijtRxcAIj4MflVC0WJAAAAAElFTkSuQmCC") no-repeat 0px 1px; }
+article footer.comm { margin: 13px 0 0 0; }
+article textarea { width: 530px; padding: 2px; resize: vertical; vertical-align: top; min-height: 12pt; height: 12pt; border: 0; }
+article input { width: 50px; margin-left: 6px; vertical-align: top; border: 1px solid #CCC; background: #EEE; color: #999; }
+
+#yandex_ad_728 { width: 728px; height: 90px; margin: 20px 0; padding: 15px 0; background: #FFF; }
+.adslot1 { display: inline-block; width: 320px; height: 90px; }
+
+@media (min-width:500px) {.adslot1 {width: 468px; height: 60px;}}
+@media (min-width:800px) {.adslot1 {width: 728px; height: 90px; margin: 10px 0 20px 0; }}
+
+
+#geomap { width: 700px; height: 300px; margin-top: 1em; overflow: hidden; }
+
+.msg { margin: 10px 0 20px 0; }
+.ads { padding: 13px 10px 5px 10px; margin: 8px 0 16px 58px; background: #FFF; }
+.msgthread { margin-bottom: 0; }
+.msg-avatar { float: left; width: 48px; height: 48px; }
+.msg-avatar img { width: 48px; height: 48px; vertical-align: top; }
+.msg-cont { background: #FFF; margin-left: 58px; padding: 12px 15px; width: 640px; }
+.msg-menu { float: right; width: 16px; height: 16px; }
+.msg-menu>a { display: block; width: 16px; height: 16px; vertical-align: top; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAALRQTFRFAAAAldX/ncT/ksj/ltL/nMb/lMn/mcz/l9H/lcr/mZmZmcz/m83/mJiYmZmZmcz/mM7/mpqamsr/l8v/m83/mJiYmM7/l8v/mZmZmcz/mpqamMv/mcz/mM3/ms3/msv/mMv/mMz/mcz/msz/mc3/mMz/mcz/msz/mc3/mcv/mc3/mcv/mcz/mcz/mcz/mcz/mZmZmZmZmcz/mcz/mcz/mcz/mcz/mcz/mcz/mcz/mcz/mZmZiZsGCAAAADx0Uk5TAAwNDhESExQWGC0tLi8yMjQ1NTY4OTk7PDxESktNUVNUd3h5eoGCg4mKmMvMzc7P29zd3uLj7O3u8vT2+A5wCAAAAJFJREFUGBkFwQlCgkAAAMDRxEySkryyzDxSAc+gkvX//2oGAAB42J5COG46AJ+/+SiKxvl1DsyqJyCtZnBXxgDxdxPrHQDZCvvUNIFkalAgtCSXHr1LIqpRt+ifu91zn6hG8YLh7TbEoMAyg8kEsgWaZQzwWDbgvXoG0p83YH7Nx+32a/73AdDZHEIovu4BAMA/t6QMuyHliCkAAAAASUVORK5CYII=") no-repeat; }
+.msg-header { overflow: hidden; }
+.msg-ts { font-size: small; vertical-align: top; margin: 5px 0; }
+.msg-ts, .msg-ts>a { color: #999; }
+.msg-place { font-size: small; }
+.msg-place>a { color: #999; }
+.msg-txt { overflow: hidden; margin: 10px 0 12px 0; }
+.msg-media { text-align: center; }
+.msg-links { font-size: small; color: #999; margin: 5px 0 0 0; }
+.msg-comments { overflow: hidden; font-size: small; color: #AAA; text-indent: 10px; margin-top: 10px; }
+.msg-comment { margin: 5px 0; }
+.ta-wrapper { display: inline-block; border: 1px solid #DDD; }
+.msg-comment textarea { width: 634px; padding: 2px; resize: vertical; vertical-align: top; min-height: 12pt; height: 12pt; border: 0; }
+.msg-comment .narrow { width: 554px; }
+.msg-comment .narrowpm { width: 580px; }
+.attach-photo { display: inline-block; padding: 2px 4px; cursor: pointer; width: 16px; height: 13px; overflow: hidden; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAQAAAAKsiavAAAAAXNSR0IArs4c6QAAAKRJREFUGNNjZICC6Q5M+xlQwD/HzAMMDEwwLnM9AxqAiDDO/M+AFzCh8B4zhrDwsfAxBjHcggkhm/CY2SDlHYQ5TZD5EoMMmgmMhSnvZnrPfDLzyQyvrPf/CzGs+L2TgYFhBoM0gzTjDAaGX7uwuQG/I1ldGRj+pzM8YXjMmMrAwOGK6cibfy2z3sMdeYpBBTMcHjMU/9zJzsjo8r8DIk1yQGEBAFzpL+AuTCqZAAAAAElFTkSuQmCC") no-repeat 3px 4px; }
+.attach-photo-active { display: inline-block; padding: 2px 4px; cursor: pointer; width: 16px; height: 13px; overflow: hidden; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAMAAACXZR4WAAAAAXNSR0IArs4c6QAAAEVQTFRFAAAAAJUAAJ0AAJIAAJkAAJYAAJwAAJcAAJoAAJgAAJkAAJoAAJoAAJgAAJkAAJoAAJkAAJkAAJkAAJkAAJkAAJkAAJkA9z3GXQAAABZ0Uk5TAAwNDg8REkBHSktRU1RVv9jZ2+Lj5OeV7PgAAABSSURBVAhbdcjBFkAgFADRIUlE9Or9/6daUC0cs5pzAXD65niKFSJQv/aChHHcrg4yA9jcILCW4tkbDGRVwfzDhs+yEBqcFsCmBiqHmULSDr0P3JdgDbuscEckAAAAAElFTkSuQmCC") no-repeat 3px 4px; }
+.msg-comment input { width: 50px; margin-left: 6px; vertical-align: top; border: 1px solid #CCC; background: #EEE; color: #999; }
+.msg-recomms { margin-top: 10px; overflow: hidden; font-size: small; color: #AAA; text-indent: 10px; }
+.reply-new .msg-cont { border-right: 5px solid #0C0; }
+q:before, q:after { content: "";}
+q { border-left: 1px dashed #CCC; margin: 10px 0 10px 10px; padding-left: 10px; display: block; color: #666; }
+
+#mtoolbar { width: 670px; margin-left: 58px; background: #E5E5DD; border-top: 1px solid #CCC; }
+#mtoolbar ul, #mtoolbar a { padding: 5px; }
+#mtoolbar li { display: inline; }
+#mtoolbar div { display: inline-block; width: 16px; height: 16px; background: url(//static.juick.com/toolbar-icons.png) no-repeat; vertical-align: middle; margin: 5px; }
+
+.newmessage { width: 695px; padding: 2px; resize: vertical; border: 1px solid #DDD; } /* textarea */
+
+.users { width: 100%; margin: 10px 0; } /* table */
+.users td { width: 33%; padding: 6px 0; overflow: hidden; } /* table */
+.users img { width: 32px; height: 32px; vertical-align: middle; margin-right: 6px; } /* table */
+
+.title2 { padding: 10px 20px; margin: 20px 0; background: #DDDDD0; }
+.title2-right { float: right; line-height: 24px; }
+#content .title2 h2 { font-size: x-large; margin: 0; }
+
+.page { text-align: center; padding: 5px; background: #E5E5DD; }
+
+/* signup form */
+.signup-h1>img { vertical-align: middle; margin-right: 10px; }
+.signup-h1 { margin: 20px 0 10px 0; font-size: x-large; }
+.signup-h2 { font-size: large; margin: 10px 0 5px 0; }
+.signup-hr { margin: 20px 0; }
+
+/********/
+
+#readerlinks li { margin: 15px 0; }
+#readerlinks img { vertical-align: top; margin: 1px 7px 0 0; }
+#readerlinks a { color: #000; border-bottom: 1px dotted #666; }
+#readerlinks a:visited { color: #999; }
+
+/********/
+
+.newpm { margin: 20px 60px 30px 60px; }
+.newpm textarea { width: 100%; resize: vertical; }
+.newpm-send input { width: 100px; }
+
+/********/
+
+#column { width: 240px; padding-top: 10px; overflow: hidden; float: left; margin-left: 10px; }
+#column ul, #column p, #column hr { margin: 10px 0; }
+#column li { margin: 6px 0; }
+#column .margtop { margin-top: 15px; }
+#column p { font-size: 10pt; line-height: 140%; }
+#column .tags { text-align: justify; }
+#column .inp { width: 222px; padding: 3px; border: 1px solid #CCC; border-radius: 3px; background: #F5F5E9; }
+#ctitle { font-size: 14pt; }
+#ctitle img { vertical-align: middle; margin-right: 5px; }
+#ctoolbar { margin: 10px 0; padding: 5px; line-height: 0; background: #E5E5DD; }
+#ctoolbar li { display: inline; }
+#ctoolbar a { padding: 5px 10px;}
+#ctoolbar div { display: inline-block; width: 16px; height: 16px; background: url(//static.juick.com/toolbar-icons.png) no-repeat; vertical-align: middle; margin: 5px 0; }
+#ustats li { margin: 3px 0; font-size: 10pt; }
+#column table.iread { width: 100%; }
+#column table.iread td { text-align: center; }
+#column table.iread img { width: 48px; height: 48px; }
+
+/********/
+
+#dialogb { position: fixed; top: 0; left: 0; width: 100%; height: 100%; opacity: 0.6; background: #000; z-index: 10; }
+#dialogt { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 10; }
+#dialogt td { vertical-align: middle; text-align: center; }
+#dialogw { position: relative; display: inline-block; text-align: left; z-index: 11; }
+#dialogc { position: absolute; top: -15px; right: -15px; width: 30px; height: 30px; z-index: 12; cursor: pointer; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAQAAACROWYpAAAEEElEQVQ4y32Va2yTVRzGf23fd10vUNqxsY1dGIyba7BsTgiwhcRkgxHkFkJAuQzIggY0IXGYkKA4DeAQMQTIiIB+MyRAJn7hAxJRJKIRiJgQIhESZxYFEuja9f74oe1aoPh/vrx5z3nO/3qeA0+aBSvW+UaT2VBUb+91HXY3FDUUNZnzDaxYsfBcs2DDpHjqqC1ln07YU79t0oGX+mY1V3dWv1/VWVrqphgTW+EDLBjYS91tZZ/5v+34d1/sijIWv/bw2IXFy2urfKVu7BjP0q0YOCaMWVlzfF7wdJY2mLybzH4/+mpq3cxKrwcHBtanvTqrfK/X97+avCvFUn2xtjDBNJpDn8SGU1Ls+oXVTTUeL8587xYMHKN97fWnlikqnU/UDmWJWUwL/ZKQpPOvTZvg8eLI0W3Y8cyo+3hB4p50MmYLUgC24EdRSTq6rLIaD/Z06SyYuMdWvjnv4TfS+URhahpHYlLwR16gHDcmVrBSPNrXOv2LTimUrMoE3BiaO5Jz2dCmiDNIkGBRcCAuffde1WR8FGMDKy5n5cp5f34pHYqlt/tDkrQ7SpDgxNBASurLrHRFpPsXmUEFbgyw4fFM7FgQvi7NznirHQorTZ8cGkhJUm80vVIylJA0ppU6xlAEBiXj/EvWSI+TuewWhdP0xylJOhPPVeJGVNqxbdQ0xlIMprusoXnzW9LtRH5xFoUjmfHIpxL8Oiod3ed6kXE4wHRW+Od0dku/J57s7P1UmvxBNP//2ah0+CCNVOICk8qyOS3bpAeJfOpgSpISypUujZ+GpXd6HC8zPkM2Z9Vtiv0jZRvlGRrM5Lo4k/vWSHZUHsWlGW+YI+QKs7lh/Z1L0tuZLbPDuVzTpTsVT6+0haXB31hNUzbsMjMwZdWBz6XBuDOY7efWiG3kYuyOZmO6FJLOnWM5mYIZlDDd3lHVPXAt18/C2DAsBf8u2cECpqdbZcNDndHi27S5T5I2DD+POjccT0qHz9JJS3ZIrLioIGBbNu7dI6claVdB72uHI0np8lW6WUIgO55WivFRT6ttvffDQ/2SdCuyatiZR2wLXwlL0uVf6WEdrdRnL4YFEzfl+Gm3dXn2bun/67YkRZI3oscjxyM/Rx7FJenBwP6L7KWLdvy5K5kRA6qZSYety9nDiYM//HFLeXbvzsmr5kl66KKDmeSJQUaG8FJDgHbW0e3YzwnPmVe+33lz582Oy+P7OcF+ullHOwFqeEKGMgKIl2r8tLCUjWxnl7HH6KXX2GPdxXY2spQW/FTzlACOSC8eyplEgBYWsoI1rGUta1jBQloIMIlyCkhv9r2w48JLObVMwU+ARhoJ4GcKtZTjxZXL9Vm6BSsGJnYcOHFl4MSBHRMDK5b/e69yxzyNAvYf9TCL+HAwka4AAAAASUVORK5CYII="); }
+
+.dialoglogin { width: 300px; background: #EEEEE5; padding: 25px; }
+#signfb,#signvk { display: block; width: 100%; height: 32px; line-height: 32px; text-indent: 37px; text-decoration: none; overflow: hidden; margin: 10px 0; }
+#signfb { color: #FFF; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IArs4c6QAAADNQTFRFO1edX3ewl6bLnKrOoK3QrrrYvMXe2N7r3OLu3+Tv5urz7O/29vf6+Pn7+vv9/Pz9////ykQjsQAAAEZJREFUOMtjYBgFuAATO68ADxdOaUYuATDAqYBbAL8CFgECCjiBcqz4XMiPz3oQEKCtAgEkwEdIAQchBWyEFDAPkDdHsAIAhZkIwz/VK/UAAAAASUVORK5CYII=") no-repeat #3A569C; }
+#signvk { margin-bottom: 30px; color: #FFF; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IArs4c6QAAAHJQTFRFbY+zbo+zbpCzb5C0cpO1c5O2dZW3dpa4e5m6gJ29gZ69lq/In7bNo7jPrcDUs8XXvs3dv87dy9fkztnlz9rm0Nrm093o1N7o1+Dq3OTt3ubu4Ofv5Orw7fH27vL28PP38vX49Pb5+vv8+/z9/Pz9////2jSYlQAAAG5JREFUOMvtkEcOgDAMBE3vvXdIyP+/iMMRKfYHmMtcRtE6AD8f1Is8pyKgAs0RGYO2HSWqMQaoBHVRgYsS3AsrtyFlrqgdJlCLb95gxQO6IkZCqL+KCjz0TQU5ejOf2a3aJXPF7BOB2PvMhp8PDzGRFgEe7xvEAAAAAElFTkSuQmCC") no-repeat #6d8fb3; }
+.dialoglogin form { margin-top: 7px; }
+.signinput,.signsubmit { border: 1px solid #CCC; margin: 3px 0; padding: 3px; }
+.signinput { width: 292px; }
+.signsubmit { width: 70px; }
+
+.dialogshare { padding: 20px; background: #EEEEE5; border: 1px solid #999; min-width: 300px; overflow: auto; }
+.dialogl { padding: 5px; margin: 3px 0 20px; border: 1px solid #DDD; background: #F5F5E9; }
+.dialogshare li { float: left; margin: 5px 10px 0 0; }
+.dialogshare a { display: block; width: 32px; height: 32px; background-image: url(//static.juick.com/sharesocial.png); }
+
+.dialogtxt { background: #EEEEE5; padding: 20px; }
+
+/********/
+
+#wsthread { position: fixed; bottom: 20px; right: 20px; background: #CCC; cursor: pointer; padding: 5px 10px; display: none; }
+
+/********/
+
+#footer { clear: both; font-size: 10pt; padding: 10px 0; color: #999; width: 1004px; margin: 0 auto 20px 0; }
+#footer-social { float: left; }
+#footer-social a { display: inline-block; width: 32px; height: 32px; text-indent: 100%; white-space: nowrap; overflow: hidden; border: 0; margin: 0 15px 0 0; }
+#footer-left { margin-left: 286px; margin-right: 350px; }
+#footer-right { float: right; }
+
+/******************************************************************************/
+
+.sharenew { display: inline-block; padding: 0 12px 0 37px; min-height: 32px; line-height: 32px; min-width: 200px; color: #FFF; }
+
+.ico32-twi { background: #55acee url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IArs4c6QAAAM9QTFRFVazuVqzuV6zuWK3uWq7uXK/uXrDuYLHvY7PvZLPvZrTvZ7Tva7bwbLfwbbjwbrjwcbnwc7rxdbvxer7xfL/xf8Dyg8LyhcPyhsTyh8TzisXzi8bzjcfzjsfzksn0qNT1rNb2udz3v+D4weD4weH4w+H5w+L5yuT5yuX5y+X5zuf60ej51er61uv62uz62+374O/75fL76PP86vT87PX87vb87/f98Pf88Pf98fj99Pn99vr99/v++Pv9+vz9+/z9/P39/f39/f7+/v7+////bJnt2AAAAKlJREFUGBntwUdWAkEABNAaQJIOkpMSJCcDKEEJ2lTd/0wyD1bdbFiw43/g5kIJHJXf/2b1u2fY/IWPQO1botiBraBFNQqE2zIy3L/CFl9Tg6dUbiyjAx+2WE8kl29zBfZwZD5+xYDRwTQEW2RCUkfkiwdHerilTpiHK9zXCTWKwOWVVjSUZPiTxVnJJimRu6oH1/1DpbURjfRZDOGMx+7WkNRXI4Gba/gHx4AiZYtLseAAAAAASUVORK5CYII=") no-repeat; }
+.ico32-vk { background: #6d8fb3 url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IArs4c6QAAAHJQTFRFbY+zbo+zbpCzb5C0cpO1c5O2dZW3dpa4e5m6gJ29gZ69lq/In7bNo7jPrcDUs8XXvs3dv87dy9fkztnlz9rm0Nrm093o1N7o1+Dq3OTt3ubu4Ofv5Orw7fH27vL28PP38vX49Pb5+vv8+/z9/Pz9////2jSYlQAAAG5JREFUOMvtkEcOgDAMBE3vvXdIyP+/iMMRKfYHmMtcRtE6AD8f1Is8pyKgAs0RGYO2HSWqMQaoBHVRgYsS3AsrtyFlrqgdJlCLb95gxQO6IkZCqL+KCjz0TQU5ejOf2a3aJXPF7BOB2PvMhp8PDzGRFgEe7xvEAAAAAElFTkSuQmCC") no-repeat; }
+.ico32-fb { background: #3b579d url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IArs4c6QAAADNQTFRFO1edX3ewl6bLnKrOoK3QrrrYvMXe2N7r3OLu3+Tv5urz7O/29vf6+Pn7+vv9/Pz9////ykQjsQAAAEZJREFUOMtjYBgFuAATO68ADxdOaUYuATDAqYBbAL8CFgECCjiBcqz4XMiPz3oQEKCtAgEkwEdIAQchBWyEFDAPkDdHsAIAhZkIwz/VK/UAAAAASUVORK5CYII=") no-repeat; }
+.ico32-lj { background: #888888 url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IArs4c6QAAAlJQTFRFAAAAAAAAAFVVADNmACRtAEBgADNmADdtADBgADljADNmADFiADFjADVpADJjADRpADRoADFnADNmADJkADVlADJnADRnADJlADJnADJlADRnADNmADJnADNmADJmADRmADNlADRmADNnADNmADJmADRmADNmADRmADJmADNlADNmADNmADJmADNnADNlADNnADNmADNlADNmADNmADNmBTRmADNmADNmADNmWGh4ADNmBDZnK1J6LWCURmiIRmmLc4mfADNmKlyPADNmGkNsLF+SKFiIR3qtL1Z+ATRnDT9xE0Z5Gk2BN2ueOVh1UIO2DkFzE0Z5JVeLK1J5M2WYPlp1T3ehJEpuADNmK16QPG+iQHOmRFxze35/ADNmLV+SjIeCMVl/TmJ4BThqBzZnR3mtBjpsWo7AZ4KeFENxH0h0bJ7SADNmAzZpHz9sAzdqCzppEkBvF0RyO1+EP3OmBDZodKbafWR+ATRoDjlpQ3epADNmATNlDDdoQWOGaJvOBDVmBDZoQWWKRnmrUoS3AzZqBzdoWFZ4cKTVc4mgADNmBjdmCzhoVom5W47CADNmADNnAzRnBjVoWlh5opSHADNmATRlATRmCDlqcaXYh7rtADNmWYy/XI/CXpLFYZTHY5bJZZjLZpjLZpnMb2B9cmB8hbjrhp2zibvvjL7ylMj6l8r9l8v9mY6Fmcz/qneIrba+snqKuaKLwKeMxMbIx8jJy8vLzMzM1LOQ1dXV1d3m2YqR4LmS4uju7sGW78KV8cSX+fn5+smY/cqZ/f39/8yZQ9icRAAAAJt0Uk5TAAEDBQcICg4QEhkaHyIkJyw0QUJESE9RUlZeX2Fpa2x5e4GHiYqMmZ2rr7S2uL/Cw8nNzs/R19/g4OPj4+fn5+fo6Onp6erq6+zs7Ozs7Ozt7e3t7e3t7u/v7+/v7/Dw8PHx8vLy8/Pz9PT09fX19vb29vb29/f3+Pj4+fn5+fn6+vr6+vv7+/v7/Pz8/Pz9/f39/f3+/v7+/v7uuPuRAAABVElEQVQ4y83QU3sDURCA4U2dOrVtpbZt27Ztt2lTY6tTnxpb2/pf3dxPcp3vdt5n5jyHIIQpKSOXZS91/nPN4p6FvckuFr+5Hrn/wpmvbHBnwnMWt+1qdPD563LAhgECu9qLufGn37fDRmQIgm5Oh//DXflKaFkyVxkCDqT3w23ByCpFnUQFyQBAsTr8vjeyM46iqIM6e1FAaKGmlmkc00qLPtIMOmKOMjDeDTymRRapAQBxx6INjDd9zijqNDpXHhBy6Qk7GA+H0SuOSp0lAKFG5mGMM6toMTZrAT3DhByiRcgaLUqQDgBE2DXrGG9V+KX6FgazoRXSAfHbGMe+P378eXiCP67ETcQ45Y8uf0YMFAaoeSqHB66RAggY1u1JnzzwilRBQDDdlrJvaPDTrwsDQlLfFaUtfp9PmBL8YqhYcesRsiQEJGscgZwIgYlp2xJC0z8XJH2ZPhmkKgAAAABJRU5ErkJggg==") no-repeat; }
+.ico32-gp { background: #dc4a38 url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAAXNSR0IArs4c6QAAAa9JREFUSMftlTFoU1EUhr/3EguZFFzSIVVehyq03dxEJy3iIiJCi4Nr6eQmLoKggg46CaKj6FBB0OIgXcRJiQiKiFIf2KEJVsSCTWlN+Bx8eaQtaa5Dt57tP+/+/33n3P/cCzuxPeFh7/nRFdvxxtFw8m4f+tojJl62qT4xsRBOj511yT0Zuqjq5P/8/Lj6LEd9LqoLRt0Z8QY8Dqy2QbTGI6CfSrjAADDYgd8BUAgXWABG3Z/jH8Ai81lJE97pJfAYiJnK8RBwJWplaISTvZpYcEZteh7AQ9a90fH1ut96n0Ofl0zVOT/Y8mZurapVa65atert7iUQrUXXooQS9xkm5m6WbpCS8osmKSn1EEdcVfVWpweCSsgXH7Ch6rSlrQSKm9vICY4xxF5qVNjFGcqORQ0AXrLUa98x55x30oPG4LCfVDubtjX9tE2/tEcpm81XasNiCL1oTT23Idvvb7USYuURypmZO4+1xnv+8DNE4N8UHt20Zh9Po+WwHrxVGx5fl7tg3YHunHVXhYO8IEFmeE7KCglnKTMRfQ63T8kpZ/1uy2W/+sBTxjuPzLbHX6Ju9rcCQGEmAAAAAElFTkSuQmCC") no-repeat; }
+
+/******************************************************************************/
+
+@media screen and (max-width: 850px) {
+ body { text-size-adjust: 100%; -webkit-text-size-adjust: 100%;}
+ body,body>header,#topwrapper,#content,#footer,#mtoolbar { width: auto; min-width: 310px; margin: 0 auto; }
+
+ body>header { margin-bottom: 15px; }
+ body>header a { font-size: 12pt; }
+ #logo { display: none; }
+ nav#global { margin-left: 10px; }
+ nav#global li { margin-right: 10px; }
+ #search { float: none; display: inline-block; margin: 10px 10px; }
+ #headdiv { padding: 0 10px; }
+ #headdiv li { margin-right: 10px; }
+ nav#actions { position: relative; right: auto; }
+ #newmessage .img, #newmessage .tags { width: 100%; }
+ #column { /*float: none;*/ padding-top: 0; width: auto; margin: 0 10px; }
+
+ article { margin-left: 0; overflow: auto; }
+ article>aside { margin: 0 10px 0 0; width: 40px; height: 40px; }
+ article>aside img { width: 40px; height: 40px; }
+ article>header.u { margin: 0; width: auto; display: block; }
+ article>header.t { float: none; text-align: left; margin: 0; width: auto; display: block; }
+ article p { margin: 10px 0 8px 0; }
+ article>nav.l { display: block; float: left; width: 65%; line-height: 15pt; }
+ article>nav.s { display: block; }
+ article textarea { width: 205px; }
+ article footer { float: left; }
+
+ #content textarea { width: 100%; }
+
+ .msg,.msg-cont { width: auto; min-width: 280px; }
+ .msg-cont,.ads { margin-left: 0; }
+ .msg-avatar { margin: 10px 10px 0 10px; width: 40px; height: 40px; }
+ .msg-avatar img { width: 40px; height: 40px; }
+ .msg-comment textarea { width: 100%; }
+ .msg-txt { margin: 8px 0 0 0; }
+ .msg-media { overflow: auto; }
+
+ .title2 h2 { font-size: large; }
+
+ #footer { margin: 0 10px; }
+ #footer div { float: none; margin: 10px 0; }
+} \ No newline at end of file
diff --git a/vnext/src/views/index.jade b/vnext/src/views/index.jade
new file mode 100644
index 00000000..6fa70833
--- /dev/null
+++ b/vnext/src/views/index.jade
@@ -0,0 +1,22 @@
+doctype html
+html(lang="ru")
+ head
+ meta(charset="utf-8")
+ title Sample
+ script(type="text/javascript", src="/webpack-dev-server.js")
+ script(type="text/javascript", src="vendor.bundle.js")
+ link(rel="stylesheet", type="text/css", href="style.css")
+ body
+ header
+ div(id="logo")
+ a(href="/") Juick
+ nav(id="global")
+ ul
+ li
+ a(href="/") Популярные
+ li
+ a(href="/?show=all", rel="nofollow") Все сообщения
+ div(id="search")
+ aside(id="column")
+ section(id="content")
+ script(type="text/javascript", src="app.js") \ No newline at end of file
diff --git a/vnext/webpack.config.js b/vnext/webpack.config.js
new file mode 100644
index 00000000..8e2af202
--- /dev/null
+++ b/vnext/webpack.config.js
@@ -0,0 +1,34 @@
+var webpack = require("webpack");
+var ExtractTextPlugin = require("extract-text-webpack-plugin");
+module.exports = {
+ devtool: 'eval',
+ entry: {
+ "vendor": ['react', 'react-dom', 'whatwg-fetch'],
+ "app": [
+ 'file?name=index.html!jade-html!./src/views/index.jade',
+ __dirname + "/src/app.js",
+ __dirname + "/src/style/main.css",
+ 'webpack-dev-server/client?http://localhost:3000',
+ 'webpack/hot/only-dev-server'
+ ]
+ },
+ output: {
+ path: __dirname + "/public",
+ filename: "[name].js"
+ },
+ module: {
+ loaders: [
+ { test: /\.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader") },
+ { test: /\.js(x?)$/, exclude: /node_modules/, loader: "react-hot!babel" }
+ ]
+ },
+ plugins: [
+ new ExtractTextPlugin("style.css", {
+ allChunks: true
+ }),
+ new webpack.optimize.CommonsChunkPlugin(
+ "vendor", "vendor.bundle.js"
+ ),
+ new webpack.HotModuleReplacementPlugin()
+ ]
+};