UNPKG

7.51 kBMarkdownView Raw
1![avatar](https://avatars3.githubusercontent.com/u/640101?s=80&v=4)
2
3# Curvature.js
4
5v.0.0.68
6
7![curvature](https://img.shields.io/npm/v/curvature?color=900&label=seanmorris%2Fcurvature&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACAAAAAfCAYAAACGVs%2BMAAAHb0lEQVR42pVWa1CU1xk2dSYzHSs4aEsEHZ0VAYEFBBGQAcRba5CxtUJpbeiIN2BdLgLLrizKQkx0ubhDMBCuy3UBuQuIGtAogSQ1pK026bSdtjO10TbRH06bJqPZp%2Bc5zLoyDJX9Zp7Z833f%2Bz7Pe97L%2BXbRPNdLtoVCoXBetWrVYwE4iMf0ncXpyOXm5pYsMLZ69eor%2Fv7%2BTwICAiB%2BFwTaKpXKJ8uXL7%2BydOnSMYHkBUjaI3R1dY3z8PC46%2BXlBW9vb4SGhiIsLMwqgAWA9tbw8HDs3bsX%2B%2FfvR0xMzF1BG7egbLi4uPiuWbPmEXeyZcsWK8U3b968YISEhCAwMJC%2BaGhowOjoqDUnJ4cbeUTu%2BXRtO1eyfhs3boRd2HEEBQXJAKqqqtDe3g6LxQKj0QhRTixZskQ5X%2Br3%2BPn53T9z5gx27txJEoeFufNDhw6hoqICZWVlaGxsRHNzM1paWvjLZ%2BS9v3jx4j2ztJ2cnBKjo6Ons7Ky0NHRgd27d5PMobSz8Tw9PaFWq9Hf389dS9Gmpia0traipqYGmZmZ0nbt2rXTosETn6Vg2bJlEwkJCRgZGbGazWZs376dhAsWZ7r37duHuLg45OfnU5zCNnBTzIqN08rGFgFMPAvA2dl5mN3a3d0NBhAbG4vg4GCSLyjtO3bs4G4pxHTPErdloLS09FlfcbpWrlw5PCsAZqCvr48OsnsTExPh6%2Bv7wmajjSifrHdbW9sccQbFrHAs6cMg7AHYu3%2BYZKxfZ2cnBgYGUFtbi5SUlOeb0XYe2MRlwxUWFsJgMDBzzMIc8cHBQWi1Wvj4%2BNCP%2FnMDcHd3HxaNgcjISOh0Ooni4mIcO3aMJxrTLMX9lP5Y77WBa7nzgoICClBoljADYUb0er1EUlISA54%2FAN7YTjyK2Y5dOnAkd%2B3ahZDNoQgO9EfoRhGQOCcio6JQVFTEjM0R5%2BzX19cjIiKCO7eJ%2F%2F8A%2BNCWXoJBsA9YVxL6Bgbj3PEDuNtWglfc3FFWXk5xe9PZA%2BAUsI94BPNQI5%2FjATADycnJaBdkASFhqNGr8O%2BxRmDKgvdrixETHQV3hSd%2B8csk0TP9FJfCGo2G5whHknxzJokjq%2FBYD2eXFfYAXv6eU%2F9axTq%2BtDWb%2BA1B1NZtSPhZIk4fScDD0Rrgd33AR53AdDeqNIdRfDQe6Un78fOkg1J8aGgIKpWKO2Qp54gT3qIkuyM24fCrUf1S%2FKYxM%2BhA7NbJ6LAQ%2BPj5zzSb2L2Xjy%2BUvj44uCdGCuI3vcAHlhlMtgO%2F7QP%2BcgUT1aexbUsI8vUFePPsWcTHx7Puc74lvCecV7iiIGkv%2FtBgmOzIPRi0qFOXjCfXxQwXZ8JV1JZRe673gMuKH0CVGAd80ounE214cquV4JoB2CDfPxiuhtc6BVxfWSn%2FjIhP%2BbynJjVaizLw9XgDqC0D%2BGLobeDXXRg5r5MEU7VFePqeGVPNpdDm5iAvO0siIz0dVW%2BeAj6%2BKDNhZQDMyFQ7vhypRl56KuIP%2FAq7Xt0Dl%2B%2B7InjTJvYBISfHzd0dVyv0wEdd%2BNelC%2FYAPu9%2FC%2Fj0Eu4N1%2BBHsXGoP3cKQ3XlaBC%2F53VqjDeU4mZTOSZbTLhWW4o642lmQgTdyZ6QgXS%2FfQ5TbZW40%2FMOJpvLYT6lgmLdOmzwVSJAlJSN90MR2P3LddSipj2Afw5eAO4MWL%2B81og3dNk4kpKGo0ePorIgC3%2B2lMwIfdIN3G7HZ0MXUPm6Xgb09Xst%2BEaUZby%2BBHnqVNEmJpEdi%2BDql1nSH0pAUIASCk9vbIvZKrhP4OG7ZqlFTVsA9%2F7eff6bbyda8ehyNcYrTiInMx0XCjLxJ4tRiF6cqfWHXZjqPofe5pNi3YnszAzcaCzDrWYTUlNSMWbSoa4yA7f7S2krxxWfXULuaz9GeEQkCk%2FmSe6HQoNa1KT2InGWf2fwdMr1Hv0R3CzPgfX9dug12bhaZxTp7bA323QvLEY1tGlx4t4Cgy4XqarjSBMoFGs2aJ54Rxva0kcGMdmG4eqz0OdJbqlBLWpSW45iU06Sf606MXK0OFV1y5SHdFWa8Kuw4k7fTKMRH%2Fegy5QBQ%2B4%2BmZX8vFwYTqRJ6LUaOapFmp%2FShrb0kYL4dEDso9KqFpzkpga1qCnF8dw%2F1K748O82Z79WWq5Vf2suOYXf91ZZMX2RPSAEevD55Qpcqy%2FASE0JjFpRgmoDwTWf8R1taCt96EsOcpGT3NSg1nPac29umDSW13NUX5kMOvxjpA5%2Fu1SDvw6%2Bgy%2BumnHbUikylIrL5Vp8NdZAcM1nfEcb2tJH%2BpKDXOScpfWi61p5blWD4QRSj6uhVkuImquRf0KN0TIN%2FnvdDHzYQXDNZ3xHG5u99CUHuRY5enVoDzbdMGnxcLzFyp0Q9wQeiDn%2Bj9i1rckIrvmM72hjs6cvOcjlcAD1xxM3XTdmdf2x5Q3OND9EVn4PCNaYjcjTk%2BCaz2zvaUsf%2BpKDXA5I22t0%2FvBPNoiRmbjXY3r6YOAtcXpVLAi0pQ99yfEcp%2BNBtKoPOIkD47EAHMRj%2Br5I%2FH8NrWvzntWI2gAAAABJRU5ErkJggg%3D%3D&style=rounded)
8[![Apache-2.0 Licence Badge](https://img.shields.io/npm/l/cv3-inject?logo=apache&color=770077&style=rounded)](https://github.com/seanmorris/cv3-inject/blob/master/LICENSE)
9![Size badge](https://img.shields.io/github/languages/code-size/seanmorris/curvature-2?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAQAAACFzfR7AAABF0lEQVQoFQXBQWvOAQDA4ef/7o29YWtqKU7ExWE5OIvm4LKcnXwD7aQ0N/kAczO1i1KOO0xJvQojaTm4KbJabnJysLSf5wFAa603CUB322yOAAitVT86BTTQ1+oJDYDQcv+qFRr3vC1ooYPqDkHoYgfVKmnSfhG62t/qBkHn2q8ekjRpryB0v/rZ2eh4r6tpY5pp3Gx7RTONoJfVLnpQfekYtNG0832rRj3tEaT31bOxQ5wc/oATrnnniEMfXfaZDFrAoEk71XajNN9OVVW7HYVeVZ9AF/pd3YPm267qbYs0tF597wygpaquQ7Nt9QLoVlWXCEK3q1oCCF2p6iYBpKGN6kNzATrdr2qVAACa9rgRQKPetAnAf1jX/qSkN8aIAAAAAElFTkSuQmCC&style=rounded)
10
11[![CircleCI](https://seanmorris-badger.herokuapp.com/curvature-2/test?timed=1&label=Build)](https://circleci.com/gh/seanmorris/curvature-2)
12
13Curvature is a lightweight javascript framework with an emphasis on **straightforwardness**.
14
15This document serves only as an overview. For more in-depth, interactive documentation, see http://curvature.seanmorr.is/.
16
17## Getting started
18
19Install with npm:
20
21```sh
22$ npm install curvature
23```
24
25## Creating Views
26
27Create a view class:
28
29```javascript
30import { View } from 'curvature/base/View';
31
32class MyView extends View
33{
34 constructor()
35 {
36 super();
37
38 this.template = `<b>Hello, world!</b>`;
39 }
40}
41```
42or an anonymous view:
43
44```javascript
45import { View } from 'curvature/base/View';
46
47const view = View.from(`<b>Hello, world!</b>`);
48
49```
50
51Render a view directly into an existing tag:
52
53```javascript
54import { View } from 'curvature/base/View';
55
56const view = View.from(`<b>Hello, world!</b>`);
57const div = document.querySelector('div.hello');
58
59view.render(div);
60```
61
62Render a view to the `<body>` tag as soon as the DOM is ready:
63
64```javascript
65import { View } from 'curvature/base/View';
66
67const view = View.from(`<b>Hello, world!</b>`);
68
69document.addEventListener('DOMContentLoaded', () => {
70 const body = document.querySelector('body');
71 view.render(body.element);
72});
73
74```
75## Separating Templates
76
77Writing HTML into a javascript string can be annoying.
78
79Use the `rawquire` babel macro to import templates directly from html files, and maintin your syntax highlighting.
80
81```sh
82$ npm install rawquire
83```
84
85**my-template.html**:
86```html
87<p>This is my template!</p>
88```
89
90**MyView.js**:
91```javascript
92import { rawquire } from 'rawquire/rawquire.macro';
93import { View } from 'curvature/base/View';
94
95class MyView extends View
96{
97 constructor()
98 {
99 super();
100
101 this.template = rawquire('./my-template.html');
102 }
103}
104```
105
106## Variable Binding
107
108Use the `cv-bind` attribute, or `[[squarebrackets]]` to insert variables from the `view.args` property into your templates:
109
110**my-template.html**
111```html
112<p><span cv-bind = "prefix"></span> [[time]]</p>
113```
114
115**MyView.js**
116```javascript
117import { rawquire } from 'rawquire/rawquire.macro';
118import { View } from 'curvature/base/View';
119
120class MyView extends View
121{
122 constructor()
123 {
124 super();
125
126 this.args.prefix = 'The time is';
127
128 this.onInterval(1, ()=>{
129 this.args.time = Date.now();
130 });
131
132 this.template = rawquire('my-template.html');
133 }
134}
135```
136
137## Event Listeners
138
139Use the `cv-on` attribute to listen for events on your view object:
140
141**clickable.html**
142```html
143<button cv-on = "click:click(event)">click me!</button>
144```
145
146**Clickable.js**
147```javascript
148import { rawquire } from 'rawquire/rawquire.macro';
149import { View } from 'curvature/base/View';
150
151class Clickable extends View
152{
153 constructor()
154 {
155 super();
156
157 this.template = rawquire('./clickable.html');
158 }
159
160 click(event)
161 {
162 alert('button clicked!');
163 }
164}
165```
166
167Or, for anonymous views:
168
169```javascript
170import { View } from 'curvature/base/View';
171
172const view = View.from(`<button cv-on = "click:click(event)">click me!</button>`);
173
174view.click = (event) => {
175 alert('button clicked!');
176};
177
178```
179
180If the event & method names match, you can just specify it once.
181
182```javascript
183import { View } from 'curvature/base/View';
184
185const view = View.from(`<button cv-on = "click(event)">click me!</button>`);
186
187view.click = (event) => {
188 alert('button clicked!');
189};
190
191```
192
193Multiple listeners may be provided in a ";" separated list:
194
195```javascript
196import { View } from 'curvature/base/View';
197
198const view = View.from(`<button cv-on = "click(event);hover(event)">click me!</button>`);
199
200view.click = (event) => {
201 alert('button clicked!');
202};
203
204view.hover = (event) => {
205 console.log('button hovered!');
206};
207
208```