closures 0.7.2 → 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -1,24 +1,15 @@
1
1
  # closures
2
2
 
3
- This is a fork of [petit-dom](https://github.com/yelouafi/petit-dom) by Yassine Elouafi, but with added "closure components" inspired by [Mithril.js](https://mithril.js.org/components.html#closure-component-state). For more thorough documentation, checkout the README for `petit-dom`. **This is experimental and not well-tested, so I recommend using Mithril.js or Preact instead.**
4
-
5
- ## Example
6
-
7
- [Live Example](https://flems.io/#0=N4IgZglgNgpgziAXAbVAOwIYFsZJAOgAsAXLKEAGhAGMB7NYmBvEAXwvW10QICsEqdBk2J4IWAA60ATsQAEwOYQpzpTACYxpK+gCUYWWgDcYc1nLDTaWOQHJqUWnACuauLYDcAHTQ+wztGpiCHo5AEEJCQAKRQg0CHlWAEoFHzk5AHoMuUdqDCg5OGIMRjkjCAw5BydXeDScmHk6APkAXjk4hO9fNHS1YldeqJTWgD45KPr0wijbdQgjWwop9KVZwgBGJaraFqTl3tXpqIARXYAjWBVFZoYzfZXjgBVpCAkrhR2W+4Oj49tzs5iMR6NtFPQHBBqABrRATEbjW7yADU7Q2ZhUtji1DUOAYtiSK0JhyS3VYPh8WUK4nepjoknoIjgfgCQRCvTOzkuMBiXzuyVSh36gzWtkIACZtki5AAqOTi0k+ck9KlFEowfwFelSNBMlmBYKhF5vWDDQXpIRwWiwfCOADmswAsrthOo5MbaQTuvU9AZjDyzWNzatLdaYLbaA7bABVNCGFowN0e2Be+rJb1Cxoi3nSgVBmZigDMUpd8jlhcVaGVPjUaE00iiMwiEmuHXixDhAFYfnJ1LRqM48cR8OdaOoAJ6kyggOAwWBs+gIHiF8WIAAshYAtAAGRDbtgcECYHB4fDUOACGj0RjMHhsAC6VCgcWhS9QR64eGqLjc09c5B4EhiAkOBECyAIJGhO0z2sDJv1qOAAAFt3wAB2fANgyeYijgxwf3gfAsDifB+GnYhxwkbgZxxN5RFYe9WCAA)
3
+ This is a fork of [petit-dom](https://github.com/yelouafi/petit-dom) by Yassine Elouafi, but with object components replaced with "closure components" inspired by [Mithril.js](https://mithril.js.org/components.html#closure-component-state).
8
4
 
9
5
  ```js
10
- import { h, render, onRemove } from 'closures';
11
-
12
- function App({ init }) {
13
- // local state via closures
14
- let count = init;
15
-
16
- return () => (
17
- h('div',
18
- h('h1', count),
19
- h(Double, { count }),
20
- h(Triple, { count }),
21
- h('button', { onclick: () => count += 1 }, 'increment')
6
+ const { h, app, onRemove } = closures;
7
+
8
+ function App() {
9
+ return (
10
+ h('div.monospace',
11
+ h('h1', 'A simple app'),
12
+ h(Counter, { initialCount: 0 })
22
13
  )
23
14
  );
24
15
  }
@@ -29,15 +20,34 @@ function Double({ count }) {
29
20
  }
30
21
 
31
22
  // stateful components
32
- function Triple() {
33
- console.log('Mounted Triple');
23
+ function Counter({ initialCount }) {
24
+ let count = initialCount;
34
25
 
35
26
  onRemove(() => {
36
- console.log('Unmounted Triple');
27
+ console.log('Unmounted Counter');
37
28
  });
38
29
 
39
- return ({ count }) => h('h3', count * 3);
30
+ return () => [
31
+ h('h2', count),
32
+ h('h3', 'doubled:'),
33
+ h(Double, { count }),
34
+ h('button', { onclick: () => count += 1 }, 'increment')
35
+ ];
40
36
  }
41
37
 
42
- render(h(App, { init: 5 }), document.body);
43
- ```
38
+ app(h(App), document.body);
39
+ ```
40
+
41
+ ## Install
42
+
43
+ ```bash
44
+ npm install closures
45
+ ```
46
+
47
+ ## Examples
48
+
49
+ [Counter Example](https://flems.io/#0=N4IgZglgNgpgziAXAbVAOwIYFsZJAOgAsAXLKEAGhAGMB7NYmBvEAXwvW10QICsEqdBk2J4hcYgAJgkwhUkYADovn0ASjCy0AbjEmtJAXknUotOAFcATvADcAHTSOwFtNWIR6kgILKAFACU0o6SkjbE1miSfiGhsn4A5AAmENr4WmjmihjUMAkUsXHxCYQAjPmSCd6ScBBYirAKygkBBVFF8QDCtK6MVvIyEGgQHhhQ3b2IkgAM+gGFkvPtAQ5orI6OAPSbNXUNenT19CJwzq7unlEAIj0ARrB+MnS9c8Ht4ZHFhABMFc8MkgAVJJvitHOsnGhtjViBhGC4oCZaEc0Cczm4PF4JsIrI9JEMRhAxtipKwgsBYrApP8pMYCaNxj0GKtYupNDoYH5AkYAHxvIriWiwfBmADmiQAqmgtL0YElJCSYFYWqtQmSWe8YBErFFuYY+cgFoREj8-kziK0jSaAMwVZJ3WBJRAtNpFY03Cz3GADJEvMmuuLGhK3CzEYj0CoyeimCDUADWUz1fJpkgA1MZSvp5AkhtQbDgGC1YgBdVYQxxKRR+Y2+RStSRJWjUCwF4j4W60JIATxWlBAcBgsAu9AQPGmiGmAFprd9EN8AOxsDggTA4PD4ahwAQ0eiMZg8dL0LI5PQyMC7ydgbDQLtTDLH3K2fR9gdDzFoUcgcfWgBsbGLVBQEMcajqgK5cGIZiWDY27WOQPAkMQihwIg2yuIocaihuyKbKY5jWPAAAC0z4PO+DfJsKQSLhUEEXA6RDPg-B9sQXaKNw-Z5hAiiiFQ2TENQhDwEgyCidMVCGKUFDUIYwDsCAAHIJOUngApFDICpCCKeJICGPYICIYoqFqaU84UKZFAACylJZVk2YpyA6Wgcb6VQinKVQWnqSpYBqY5EnAHAhC0AA7jw7k+X5ml+TpFA5KIAEWRZlkAKxSalpQOTpcIwOF6keapinRdpVAUIQNhgHlSmRUVnkxVQ7CEIYJk-uZrWWT+ACcVldVlVAwPg2isexbn5SpAD6UVUHG9W6TA+owAAZIt3wmWZFnzpZ4mbdMfUgN8hiHQNQ1sd6fkFTNtUgJNJVzfqwBUpIxCGLgAHfClFDvRQ84pa1P0-ntEBgH4AAch2GBaHw6pI50qZd3lUDd6k6X4A2CdASQaGAKxA34anWtaFAExQIOlOJpO7ep-kgAEUNRLD01Tdds2oxuhAY2t5lmSDlkgyTvN7amXaowEATyRFVAAKJM2os0vfdVKcxZnXTLZKuWYDwNg4dkNap8DMgNLV2y7drPo1AmMwNjti4-jhPE51P6tY7ANUzptN69DBtGwjIAm8jVBm+zFtK+t0yq+Z4ca27VBCyLYujdVVD+xpVAAMpy6jFDEBQVgBKHkfznzZNF3tWvg2g+cS37TMZ6b3ptujBelKUaXma3mUxyAorEIQthoKmqZV2Nye1yzDdsxAzfvetM97WgAF56w4sjyAde+z71OGFnFr6tPIPiaU3wH2XoPg3nBvr6nhvj9nk-N9avPmY-IN7T3fdWIPw9J2vTObyjE8m6JXWutVK3xzJgL2rnCgld7pM30qYDAW4AByXB9Lg2IMtPwz0EFQCQacGmicdIAEJpjnwAPyvTalZD6NkQagPoXtTkFpEBoGWgbLy19fK3WQMQYslD8ADmbilH65kREpUBiGRgyC0542rpwmqAcQC8IAjnC+wCuZiM6utFK2imHYNzgnA2AAVJmAA1TO3o0AUAgKNJK60fzHzasfJhMCbHSUTgVbhvtOE6UMHnBWVD7FtWtN1UoP5Ql7QCIEqQHCmbeK3sAPC0Fm4-hSofNJlMxJUDQBoLQugqpeKZr4hqNtgbaFRqknmbUeZ7T8BUmAos6bAHwK0uJV0EmxWGrlKSmQki5UbNQO2RNCbhO0W1PRXc-BYHjs01p+B2m+06aVbpiBemdgGU2YZxNTI-ikrszu2SDIYxsGgQpKlTFXQsabWgk8Q4aIst8b41oPpPJeXtSQUBiE63YdXFOKkr4o36FAVoXIC5PLSZ9b4aS6n9FoDA1oLS2nyPibNbOp01kwI2WpL6uKXmtWeb9KJVh8CKAsEFORq9Lm+2uUo1GKiEXgsstaMy3xmXziibYOZyLV4KKoMsygqzbLmxxa815qVbJspStHI5ZyrDL1ttXJG194bU3jg9LUTKQbgLZdq+eMAQqSAALJKE8Yo6+JTdK3MULQKsw9gnvXSZ9FK6SoHUBWI9RZXC5YDXGsQLlQSQHOs6jq3R3w9rPRziY8xt9rG2I4RQBJPkKCWrFjYEyYTurQseXsjlXc02ezQEihZKKOlotWXzEVb0xWfQiTqute1g6W0qtGq5LMc6V2koQcFaTJW9ojZEYtXrzVdIxSpB5rL5zTAJVO12sqNn6SMdXWl19biWOgZXcFFNPoUyYWgb5ENfmrxXSpNd9dSVWFtV5B1nVLJZtvZ1N+vdbDEC-gbE9VAz10pgAyklBdrTTCeUTQD4au6DgHPiYGBtlVw3HqLDVCVNEWQA9K4D0qmGtAgIEVo76mZfrVSS82SR-1jKJmMvaPIEOSFoM1auABJJm3hb5qJgf+p54CZxPKiXAv5Y967ZzNYzK6yqgWi0E7-K6-9A7eisDiqS3wpIzkhUpiRUzvTws7bhq6+GgVuIgKLNjINuoziM1A-TrRaArx-gxq6THbrbxk24-9AGOMub2rQWwj1qDiaTXVW6ZS-BVloPaoNBMREjJEXtZJBEfPFLlrc6LznSYjNJntOjSQcNKqZqq0TR6f4waE3Syui0TK0I+o-cORMtpZOpvgP1AAfer1A8tFKuqmgIVHEPBMfl9HrqmjnED8O6m2LXzXFSUVg56EB8Cin-alVqj8iVdymzNrUlKf6+f7LNUWWC0AQzmz+Pmj9Dt7Qhh6rUMNS1LLlmgPwJLFCXrmyDe2vNrRRLKrR1edGs58pAN4LOAqKAJZMqM+26SOPg72hbNOsJGDnL89d26rBEB+AS+zf9KVntE0x29ru0PYfzWHfytFwXWC4zQP+n8lXfzhz2qcz7P9qXXxXSjWxGXxP-PTizW5FPEqtXCVZb407BfTojSIPSIBXJad9jp6TQP74TsF1TpXNWdJSCgBQJIHiDZgBTcUxNaK5AWAoCoDAGbzLdXm+lX6hzqZG5N3FBnBVN4qRTqz1oXZDDeFk4r1K85CZ+9x0cpg78CpZaujliSaARQh660GjqAGeoAb2gAHkMKKZaWA0-Qey7NWwARcbaGQFgAuHVwtl7zUcs7hfkA54j7NYsB6LRA1Lz+ecZkOrt7qTJNAxeAI67i-ZqwyAQoAWa6329PVb17QAnAfxI+x+jf5ctTbcBlqWvwHGGAnvDrUE39vnFfMnGWSneJE-tOu67-3z2InhUlGGCL1gACTVS-zgU1ZN-tvYpNS7AvwwAAPLOHXDxX7OADxQHYLCgEKQeCgLAQeWwHFe9D-F5ZA-ramHvWvJVACTbOMWfOWYfWbRKcBI+D-N-Ug0DI5AgxfErauMAFfYpdfWaa-cGIZN6cSIXD-ZLE-VLLuLfG-eRB-ZAArcAQQyPNSF-RKUHKyA+cBXmQDPaQAs6WgkA-XbzCA1oUUScSccTYQsQrQ2wKhIDIDXmDgkw1XKgCwWSVgTzbPcPX2MQzzL+HvUvEGCJaQiJU7EFBA2gwfe-YfUfTXJ3HyegtrRg26a-OTT6dKFWDvGIvaLsJvchCwTA1eVfJgvg4sRAKNX3ENWIhcbvQwXvJIfvK7b1ezIvYoj7UvTqJ1O9V1LuP-A2b7b0XXbzX7f7b0MAtQknTLVeTnCTb9MqcTVVCaFmR-Q-HdKyR2PmO9E7LuQgA9DhLBWRTo1oMxIbPXDpLBSWAHVoW4DY9Q4eNlT6WydJSrM48w5RUfIIqgYxPwTbdYy1IHXon+fowFOXOQA2EYxGMY4vHFHVcBdJFlCgIEyvamQeVgcDPQOvew2afQqEy7JDMydJSFFEtAnSWPQgZSchL4pmETQOX-UUVMTKELTRdJcZcksEnSEKNPUUfPCQqlGNU2fwgCYLAuNKCyDkqk0qX-a4z43jK6d4kALOOQOsOxINNKR+EE0oR+PaWwLPG466fPX7OMfPAVQQp-cTX7AVJvLBS+H7NYv+XYigWXYU3vTU2-Q4tSayOyaU3RO0x9LufpfxZ4+HEAJnFSFnQOfoDLaw7xYJFKBcVqQM+cOdamc4d8REn+fDFSToW+eZdRJEkE74TqQmQM1MunDrR6XnX2GxfAxyUsFvPncyPmFKADUs8szWPwYhA2HM6+KeW6RrYhKsWspmBspRAIRrDAdbAqSuRrOslSfTRrds2rBrerVsq6EcnSC9K9HE6uAcqgKciSagRAH3ImYzbqMs44rcmVamIKIGQbF43sts-AmPNAHudk38U4q8vdd+HkUochIdeck826LtE5JgVc1gUVZ1EEllZEv8p9QgR8+ZCc32JcygIjdNRXaVEgmCig6mXaZHUC+stFCwEWA2LMi7RDa+ZaAAPz8DrL8QGnbPf1KE3OZTTIor2n0nwEXQNgC1wuwpUm-ndiowNjXOvmwqIsEUiIF2lXtP4sdOD0ESAlyB7JUiYpyVmmJICHwBsAaHZJP0BKUo+UXW8NXgXJAHAo3DwS3EVM0u0sQS3DnNXg4okukv0kkH0m-K+hdXOLOMBnPPEqksnKYKMrgACDdLMqoC4tKnmiCWLlLPTJBPTP0R0mrkkpXG2y-Orn8sa30hSG0H0hiqUUVQ0pfKUWv2+WQsHPSIPwAmJiAxdUDJCsDPiLUs9WrhHJUloDljQsaXIVKDygDKp2DNar2nIVnH9TSp-mqqoFqvsx1gCF7jXJavC1+kiy7iLROnYjdL6pAAGqUQoD9UQG9C33ZPnBshBM2t3LV1WooD4LdIMryq7BN0e2grfw+hEXenc2QiOuXhjMXOXjjPCPCBMmIMBM2ikhEWsgjQwCGHlh5ANkepABerpXQTUroA2pKvEXgqcgkCjIKm8EMBBoAHFDAwbqYDD8AAAxEyfZb60Mzcom+eCgAaA2JqW4Mm9IL3amtkfJfy-Ua1clY0Rpam05fpbykASsOWFwHMp1FuEEg+cSTHC-I5LOLmmBKw7bNi+coHJmeFcgezJFTmIq0mYM9WunDAMKA2UodgJW32aPLADANACwMYDQJIKwbW9gYjIffAAAEgNntoAAVJZjE6NjFxorgAB5I1caNQSWHGzzDBchAiwwO49TVoEle2l2t2j2r232-2wO2SCqVhCgbQPpXKGAdgElRgf-YgboYQBgCXVyNQO7NxC0TyvwKAOSq2AA8u70GujOjZCgGuiqZ41uwaTOl6BOAaKwVwQwPm4cW7RzPbOSTCqQRW2SeZWxeZNYQI6O2O92z2n2v2gOoOnqiadegLGulIGwC4XQOfYtXeiAfejwQ+igOe-APemAA++ARrOSKzHSJIRYt6UoPmEGUskGJ1THeo4PbUKIGjVtGlW+EFQI9kzqIzEEyBoSreaOp2125ehOo1WaJOvGxKD+igKnaYD6bB9Eny8XfSKXAU32IU8u+FC0cUzRKnUJLB6YSJLuWuy27WxUyK7BHuuWSjJIWu-01lKSKncLAR7kkACqeu-oA2KhTitFbh5u-pAuKnURBR-BkAbh9ukFA2ZeJmTXLujZCGZeampqToamrAQwVGum3JdkXQQG5milRpWaMkXsRKWyZXKnVMuhjM-vV8W+98T8ccPZMs-8VgIAA)
50
+
51
+ [Todo List](https://flems.io/#0=N4IgtglgJlA2CmIBcA2AjAOgEwFYA0IAZhAgM7IDaoAdgIZiJIgYAWALmLCAQMYD21NvEHIQAHigQAbgAJoAXgA6IWgAdVygHyLqMmTrEB6SVM3cQpeAh5sIA8kzRIsIAL54a9RswBW5XgJCIkz81KRsMsAyLHgyaqqxAgBK8GB8UvAyrjLyMjywfKQArgBO8KQA3Do6CBFsfFCFOTIUOnpRjdTwSDKEtLCWsUIAHmw9AORgtADWmbS9CGCkMvDD9KoI41l4bZEynd29-YMyI2My4wDutKQspyyZkrflW+67HQKHfQPwQ6vnV3603ujz4AHNSK8dABdKrUHSEIrUGx2XS0GAACgAlJFdvVGqQMKoircMcBdnoDj1viczhNxjtdFksXDXNVqIjkbYBHkELQStjcUz8U1ciLCcRYEIBRF5JoZABCNgYA4snRs+EcpEonkAQXUgvJTNqMjKUwg1AtYOa4owkulGNl8qVKs+WIwCGoYLYLAqenZejKbFKuhYGPGJgwaWohVUtB48AZFNODUKUbUjtTOW0TL0ejDEekSdzefz4YtxOV0dj8cTsSNpcbpwAnqpDuMeA8eNMAEZ8YbFpulzvwbvwKA9EWurqMod5gSd2hew5k078sHwCKuHFyoVz0tTg429ebjAjsdQOH7rLJ0vbxm3vMFitFKsCGsJhl7-dsVvts6DvuGy1iwfCwFA8AlBMlwsLQERdOOyz1DIPagl0AD8gFzk8tA9ggE4po006-I+pZSP0RSHFOZyzvuAgvucq5sCeW47vK1H-MeJQbsq5GwJRpHMo+WLJlitH+iWBaqF+Zq0BaVoyAA1BcpqpHJlpehg4xicmBY9q+9TUF+UQLrAEDdj06JQNsFxWdp4nROG+lsIZxkyKZ5nTD0+TwPyNkdnyJTabsarUBqOjxBiYb6qoYn7HwPBFAwggYDxACiizCGwABCzYAJJQOG8TaSy5iWNY3JhKIWAAAxIDVbgeCAdAMKIZ6kP4IChEEbBtdWpBxgmeyEIEAC0fSQLAzY9P1g3wH6rhlVYo6VQ4IB1QAzCgbjQgQZnUNMDhUM1XiiPkhSlOU5ilFwTDsGwqikEghiGEiqjTGCZ58GAhjncUZSkAAAjVGAAOzYMYEDhL9BT-eUUYWhgfjmL+baiKQPAlBAqi9QQcZsCOR0UBQNUEPIaB4Dw8jAO4IC7RQo0U0QdN4BQTPkPTpMgEoID3aoz0s2goN4ELeAACxoGL4uS-TJMEAdygEPTjMEBzrNM4QLNy9zwC3HwlxMMrGta+zWtc3g8a9btoui2LOAU3baCy1zcHdFrKvM-TpucwQeAsGUhCG6zHua17qtmwQ7gsPIgsoCLcdiygACc4vJ87BDwBgUio787tMwA+ibBDTBH3PwHK8AAGSVy41vC6LoNi6Tjc1enIBYPIneZ9nf5K8HTMl2HICFz7ZdysAJpsPIiC7bgeBz6DOBx4vKBtxAhAYgAHJ38hsFiQYhjIefF0Xw+lximediQUApIQLLrxiLMbRteDP3gm9oKTH+t6z2v75uh9j4gEHurAgI9WZcwvmeFg19Bb12FpvMWm935ILbopZsF8sRYlpkbAgaVT5JFLtPcetQ4Ei2FknGqUtKFizXhvbenc94HxKLoIB+Ch6ENHlAq+4Fb73w3k-F+b8k4oDjiI1ev8ub-2DCwo+uCQDsNASAThECCDcJgeBMhNsapUJFjo2hkiCDoMwdgvuDMmYqLZgQAAykQi+eA2B4BKFiLR9caqg2QZ-Dxbd6E72oC4+Rlima2K4b8ZUV9XEizQPbKJ9s27el9NQRSikAn9wIEEmx58wnQIgJEtAuB64FLbtQXazjXA4LSSAEJSjFHa3kPYveco8lYE3qTfJrSfFbx3s4oB1SrEKKyQ4nJeSNpIJFqMze8SfQVBKMk1J5jMlD1qZA7JES67kJFnbLAmycBYDbk4vA-jx6n2UPkG4pAAByXhlA7zYNXR0PMzkdWUGJUuCoardPQjPeO4t8CS03vXJBoM27wEdFiJA1Bq5ALVv00OqiQAUDYNCL5GBLB5JwIvEWGKcBr2cvAC51jH7yJhcbUeiLdqOJ6esm2OAk711pcCwxIBQWUtMUAgAKqfAAanY341A8AQD7jbeuKAWnxxaSCw5ArKZmJDqfGFXN5DOJId84V8cNopzQCgDVbcsQqoiNC0+cK6nAD+qUPJKAcBtMtT-YmXNqApDSBkIOCzPZKIVZHCoD8pAXwtYg+OiC24Yh9fALBzDqDAAwFGw1Q9jXmxzkgCmMYIJIEaDwQRr8X5arpfHOlQawAmPDZG6NxKjWlwcX+RNhyGjdDTRmt+Qt0DkPQG3DRUAyjUBdR7TlQ8eVcL4DkzR1LhZYCwBtfAo7x1txkLABUjCoWBNPn0yBJQ8CwDEhiIlGzRajstfPLAlqg2rr4IcsSxaMAxqUXG32Cak01pZnPR94645jqXrqkoRISRhg5dyrJ5LT2RKwGLDaI7gOMrtQQFkRao0XtLbG8tCapY8IfROiddspZAZwAYiDzUkAlHKQ-IB4D+kgO1iYiem5ANIO2UBzeeymVdEuDIAAsmoWVpL3VEIHaoPgqhsSAZwFa+egnbXa0piyE0l7YVEMzvnNgMzVXwOE0nGjtL6M4ano4n9vbBn8sFdCvAxqNZ4A9SAbBZRBaapTgend6BwN-1cNBktlSSUEGvdwBNyDkOz1Q-PbVNH-OtuvrfLtTMe1KL7fCx0p7KYsEA5ajDCW24yIjTBqTHGxO3qFUprAoMaovryxInDyb4AvIqa6yL-Sey8oOf4wD3957fxBdQOdu8F2VMq0zaroSiQlF42rNVWAk5i2s8NpOUzfRsDmUAzrBButRfgP+j9kSNo1VHa-Nb6ntZWEsHIAR8jiMDyyVgijVtt3C1W1hjbWGQViQgNiV58jZsgHm2Rj9PCoAreza-bNbdNCnfcjHeReVT66kGZSw5K3R3bI2tD3VxzF1D2XWosJ7GT5D2IyurBaOqmn2WSjpxD6KZYAprDvdZOcVMvsSe-xOPnuvZXVKiAWCoebxTrDtn+zmdiT4OVj2IOh5g9HvU34q7+UrdWzDyXbc+AVBNDwHHRnw6jy9RvPjfBUlqufhizNGK25mrKIr+VXGzywyKBLj+maP5twKo9yph30dRece111DvgHn38ZXQWfz8CjJ0a-JuomuYYDkwAH1DzwF3cqh6mZO5PFbYs56jNwMljEPB75R4y97eF9yp4QFSgnpeAe31Mrz6lTcW7XVK4sKXLB9zqC7wTygZBozm9t13hJzcciXNluF9QDEH7VB9YT5vIRSCNq6r9kDypeV7GuZALqex7m8ADvTdbLNQirUw6323cC1jmJCFC8rq9pdXBIAxKvmBK2cCj9fjfifTK98H-Lultz5aNeuAftQFbKB-dbR0W3B2tPq6uFv0pVpAoKlAHbq6hkrjv2hgN-tbHHFquLLVAnGgclllDzIrDNqfAzgTpfrksOqgb-iQUHgQBELAHgFADKkAoQCZvKoZuWjEEUHgAkLQJZiLCnHbE2jwU7EyiwWwRbMAR7LUhYufMzngM2PILqCUJEnbKDC-AoQ-jhsIAkh7AdqfKRoqtQB6GoWdmqonKtqnKtm3GIPIGCNXGAOYURloaXBUFiN6hQGAPIZasLInHrkyh3k4bYUPNoUrK1nvOvK4aDO4SgKEUGlTNQM4btHQcbsLiUBQJcLtJHq4cNqnMNm3LtKQEqkkSkZnm5tXNXqQNXKZhgLMNIZ3DwOUfAM2A+sgmKmLHlqTE0QAV4fINURUfMh7PPu5vIFIDEVPvIaDCTuLCMfwThlPs2HkfIMMPYnQTKvPqQDKsvhrngJcMkngGAMkhUA+qNmMeOgcZTjhlERQERrtNXtMNkUQokWCILNsvkmMSMU8VtlzLcfkV7vIoQEUfKqUaXDUZUR0Q+qTLVGMZbk0dbkyl0dCv0RQG7oQLCf4SzNHILBvuLK0tskgmtm3HMbnF8YsYwQrqsWJGCKNKNDjm7kiWSRUN8ututtRi0XRuQSAEUNTK4HLjYZoX4fYbAHMlEfIZvNquidqu3uursV8fEfCrkckdQSIRrD8THn8aPACUTvPA7JQu4RqW3M2IEehEUGcRKTHv8RUdCEgFpsQSNrluLCpvZpAqcVALEXBifsLgMQ6UMRaUnEJiNlam3DMUArPr8PQQrvPovr8MsUSe-tAR7LAcjiAPYjEEAqRgXOfAMS4bPA0cgiNs3taW3gIa1tCvcoSmGWJFymngwbGvcmlEvmJD2GWcSakkBvPFLFav7i2cyX6fIuyhiNXqWaZivlGeIUjoMgmfIkmWAimc4Q+jRtslaiBngLObaUYopK4DtpkL4UolSaNDST8N3mqlanuvuccdtl6D6IzOhImafJjmotMWCIpE7Jrkplajmk+YuSAJcOYWCA4SiZ2b+lwokTKRrpEvbKLMBa+VITMSOZUjGcOWwXbnuWgKMvOQhdhtrBUNYXKWAg4fPtMA4X0amY6T3vBqPIEfcr0nPiWXjtWXgPgXGdEWAARa6r0ZGakhLNLEhbSuxeNkyhBEqv2UfiAKAUzOAWoqulAeyXCnublnHLsqDEVtrNqJVN3q6q9kzAAMKDIwZUrnbzlDYvy7JJwqHazOIA6IFKICo3EkywjBFIEizII4CrZ2UOV0IYgKhAKmX9JEHwrh4Kh8ZuWnyeV-zh60CV4ez+Lh7uVMzM7h4BXB5h6h5+VDwxUEC9b9bnnyIRUEBJXcw8B4ZPzs4pz2WNmFUoVcy3DrxsDYg44ZUgBZVKp6EnlAVbTNlNXNYJKaBoDoTnoJVKJZWxbXwdp4aLQ+bCbzkgbCz2URFMoJKdVpbpX+XlofYWbEFYaPErWvEECtxn7dUeXlpFCYJAJYgA5nb9LVwAB+GI7liqmcnloxaABVwGelD1bcygGALyQCquGIp1x1TM8yUiAOQCchQ8x1V1qKqpKBWGHFENXFqhqKZkCYIVTM318spcd57oZQGwQFTRM5WN06Ly4plS1VWVpu5yGFzU81ypTypAaVlSgNSiwNRiyg+gIAKGI1ImpMbNa8XoCNyNiV-xlN4KANp89N3A5cqqnidl+l85+lIKGIXM8iSNZNo82CQCot4eygJgygQ18KhGc1vNypFRc621kVxptRGa62gmuyUtuy2peNkm8iAVTMfARCe1oa6ETgQFv+0lntbc6EWAZpH1QCDtBATtwujCWIPotNe5bh85bhxSwAPcbY-FQdIAId8KeAcmSAvwswQFoMks85udJVFBmdeAFR-FhNJtzYbBw+y1Ix+AGKKeTK-WZd5SKlmV5S6lypQY9xIsM5jcFMGKEsyW6kxCZg8irdIAHdUWNyeN-AOdlt2K61zU4QSlHsuo8g49AA4vIJPahZnAAGKCwUxoD92yUFWn3FJ4CZxALRw9iX1RgyF33JCpDpCi1yjcZfqYJ30doQS039LxBEKcgsxCbH3zmtLs1gNBqi6nyHJsm17-XpUr6nwnpcDC7FpkLm0fzSWYOAG0AGxAJoDuAoNKK6FTDUBFD9ApDtq4PuCfYJEYAAAkQC9DAACmlOynlOyvnAACIADyzG+cSQaUe9cuty6EF18gXZvwaxH69DLDbDHD3DfDAjQj1MAcEKeAUgJWmd7gH6ZwqlgQWBygisSQA+Uqe84KGIsAGAAcsxpjvwVjmjNaa61j8A9BaxDjJW08pimcJQSI8gnIOo-eouMDNMh1JoyD1MMGgqMGYUspMjcj7DnDvD-DgjwjOtSiyjaTG8VjkgZQKIGQOR56OTEAeTtgBTeAMTKoJTK00g5Q4eNM5WXMUA+Zs8aAyCm8dlm8QmN+PpTKACsifApNglBAwlcZ9jYkUA0+e5ScbO85Mz0NdSMjTDrDiTijzGpcmTgs7TeAv+NU+AuzR5XMPU2B5giOSisZpjJ6e82WGyv+GqOzNUOqTKLjVDlwpNCtDyoaRC-2UALjElI6FMv+OuQLr5Njcxq6KtQt5avzjjEEkSv+mKCLhzBAvzAca63RTM5S0DMLnjbA5Sd90cqld9YA8gG9j9Dqz9GQI979pIXzo824pU1sUspBv+BlDzBl0IsR5UNT9gogdU6A9lO0rgQAA)
52
+
53
+ [Async](https://flems.io/#0=N4IgtglgJlA2CmIBcA2AjAOgEwFYA0IAxgPYB2AzsQskVbAIYAO58UIB5hATncgNoAGPAIC6BAGYQE5fqFL0wiJCAwALAC5hY7WqXXw9NADxQIANwAE0ALwAdEE0b2AfLdIWLbowHpTZ5zosCITqEGQyymhIWCAAvnhyCkoqAFYyBCR6Buo0meTqFsAWqngWjhaxFtYWhLDE5ACuXPDkANxubvTkAJ6khBbiDX2hZBYA5vDqAArEANbwYGQAFPKKAJSFbhbN6k3u9ADu9BAF4pOEqksA5BrqzEje3oxz8EwQGCTeb95mWE8vi1I3iuFgA1BZVvA1lsLBh1KoDEtmuQqs5ti0MGllmtoe5YYR6OoLkslhtrGizMRoBYBLjYh1SINhmF3ABBRiMUmbPEIApQQn0do8yZWUiMBoFapXK5CjwwnZ7Cxc8lKmEeS5XPxXPBqjzFa4QMUS7XcvVmizqbqMeBICxXfQAD3U2t1ZsYDEI8FUVCg8C4tqu2T9Fme80BEKSLrx5osZEN4vUtqWRXU9C4EwKsTJaPjEqqFrTGYwZnosAa8B10fNJbLNtFCddFTWlcbGoARhL1GQTcBG2ayLUIIRZraur1+sq0b2qzGPPzU-nDscChmZmHlrn1GtZbOzZv89LWhZHjUEGn6xK++bmlAuIdSUeT81mqRfVwyhyrx56TOKqUriwaYXFczaNo2870FeAD8+pXIwzQmgAUgAygA8gAchg+RcIaYwQOI3RLBBpSkA0sCwKUWA4letoaowJpXOhxAWBBFh1PQvpQCBuobJ4eLbm4P5uHkBQ3neByLhySyXOyjDNixxCEA0ih6BgGYAKIICp6gAELdAAklA1yOCB26BPAwQjBQNACEgaAACxxAkICQjQHzkOkuj6IYyhtsQUDdIUAxkOoAC04gKFI3S2oC9SMPQnpHrE5mWSyEQgLZjmxGIICwIaswRHwiSKLkdSNMiOhNNoyi3PcjxDIwsxjB8xBgN4tT1E0LQAAICBgADs2C+BA+TtWVXXkBgkCkJinmWtaNCcDhjA5AQ8VEgihV8IIBDWGgeCENYwDxCAYh8KF+0gOIp14Hwl0yGdQggHYIC1Q8N1oP1eCfXg9kOb9DlnTtLmzPYBBnRdHA3XdEjQ09R3kN6BzKBDl3XWd91wwQeAJTkYg-T99k4PtRNoEDT2Eja0OQ1d0OY492OqM04go7dNPo7d9O3U98SqNYH0oN9gv2SgACcv1i+TBDwMW80VtTl0APp0wQsxY898DkvAABk2sxPjX0-f19lCMboi3cDWDWNbMtmHL4Ns5dasYwQysMxr5LALyFrWIgYi4HgAf9TggvBygUsgPhSwABzW9YW4Klw7gK6rKsgG73MEEsMsXFIUAAErwOI25RzdADMZd4BXeDR2gQi1+b21PWsifJ6jqcu+n6vZx8qh5x9htfdH9nRzXI8R6ChFQmsJ3tyA6lp-n6u+57vID99X2iwI9l4Fv9kR1HsfWwnkyKin8+L93Od97ABdFyX4hLOXlfV6LKCC2-4cW83rcWOfC+dyXu7Huudb7rwJgIbe31IH72-gQSe2ccSz0dgQIBnMCDIWXtnPA6g8BcDWOAw2Ah+qjzriQiOj8j7WFIAQueaCYYgEwcAis6he4QEId9NAxNOHEwjmMeErRSCglBLQlBIB6GXSYZnEA2DWG5w4WgXAhslER1IGIfBsRkHnUkWnAB0jrCyLWOSBRWBo5CEUWYihMc474PPlIhhejgayLYQosuI9vpuOjnwgRXBhGiO0Rg3RV8cEuINhvb6RMsARJwFgCOeC8A0M9mnewtQujkHQkkewcd1C6yWOoF6qSPL2GbOrAAhAIGxUE-ZC1+vgBy0dDYj36hHeAeS1hIFILrc+D10G03dnwdQIgqlYWqQTQ2OBg7fQmTgA+HZ9DoWQk-OePSGEc2BgMsQuDbFhIJjgUW4z9ktLyXgmeDsAkgAACppwAGpYIrKQPAEAHZjKFqY15Xi4EgHuY8g6Zz2ZpxWfDfBq9RmDyFmXcWaAUAQojkY5wXsRTdLTms+GwAOrlQUSgHA5isWN2BqQQuiwzBUznmsrmwNYitCjmYbOmLh5C2HhHJYNLp6t2ABgDlSLO4ouxnLOyCT-I2igIpZ+VdK5Qv2ULQ5nylhgEQS3U+Sd2WcuWci9WOCrQ2n2qQQVSBhWEFFdXT66AN7oAjjfW8BhWbnKuZ3W5wDiBsLATsr6WAsBl3wG6j1Ec2KlOPl0uhad7FPSRHgWAzYSQcLdViwOWAsVMq4HgYgCTmzKowFy3pPL2B8u1YKm6AcC0esFu6kOsKuAYHFIjJZYjbW9PtdI7OGyU1RvsmXV1rbmmfO3Gyjl6bVXcvVXyneoD82es9UTHeWAJ2qKQFwTRpc54ZwYc7Bt08EV43CT9Kd0conbtiZ80g8AJIAFkmB-LRgC5ejrniclES83A2LA44GxXEwg25vYZtWcvGWit1CtGaFGvZu6gMR3ybg8+taGH1qcd8p53S8BkokHgQFBAZ4AfxpC8Wcat3oE7U3VDsQe0qrESsi97sNXWiQKPEd-sx2B2hbuhj5q86FxZhBm53dcE0IOqoKNWLJ38dA3sNNn6yPSIo1q55YKsD9QEMW2TX98MuUFcUrRNNoOXTbHc+JNCo0N0Dg3FppA-XxwDWIjTBAtPMIrTwZgUbRb2Sww50W3jVCtHUH48+FmQBWdXU28tHCy4CDdVXYL+6lMWRYFYR+58l1OyvjiddgWBA4B3kF1LLTmwQFJCUue3nfNOPLaAtgLqq4SrK5LT58LvbEH5nPfSadWTBK2QkwLbqoll3a7CpJgbO7Bqziw89HdelLpDfg3LYj7GXUcSGisXB837SwPtTrMaVszJlRWZN3GvNpwK2NhJjycRtejuLTrJ24kQBxEmtTl0Gudya+7Axc2DuBaCx1t7EdiCtG9oQIbfTekoZAFSx+nJiB3rBRXCZYqJkR3RV1P7iGQCA+sI6uHr3a5itrhHQyE3zlxeG4VtYZm8dpxXU4mh2sPp1PwG4yBVcTZ4qehgX9AAfFnhBif-M7oDxL3sN0vLcQHQX62lPqCWG+qlnOxMMMB7k-J7wxiBaJoLNxpbPny7UpMat5zEc86J9rFY8clcoFHm4k3Ed47vsRf2zNy9SBIhs8QJX0cX4jzLrCvAfNz76WwaRggrJsFZqTR8D64qX7Yo6xHiOt9kKpn0Nammfv-sUqQEsVHfdAs4Bd1XLP7vPkx7j5rUTsNyNg9iFHUggWUB07LtXxnBAXx1ZrRx4BTyoC45phIwJDqMCV-xoLKFv0sByaH3J0D2QXpgx253PbA3g-yNK-ZONQgl-V9A2xPAUBfnn3EMhgFCH1UlAaHgRgOMPqYdqSa5XZNPlH5PzjJv5zHGXXoSGy7eBujWFZPNxfEzK5E36jzwi1IH4VUBpkXVJztwwAQBAP5zBRFiCwliCwjiMGsDGF1jAFQNi0gPdlaDWGpT4DAA4RFihxILw2BktwIOwM7jJyehEBMy3HwmIJQH6i+hFlYKZUOlIEIJylJUvUey4D4AODEA52YIcwlgcwjjEHIGsEEOEIOilwkF1l111kBwwHmE-2tkIHUPgG6HzVHjeXslkxX2MIt2sG0I0P8UTzVUezMB4M9ybxeSMKW1+n6iWziT5m6CEJEGsAdGwR31+ST3IF+SDzBzwAOGETwDAGEVaHzSc1cI9QSJF2Bi4L4FizEER1mGkOXkEMV3xiiUUVcLcKKPC2BlyJEMUKumUIBVUPVh0M0PMPzSEGH1cIxyMKx0+UsO6WsDsPxyuh6L4FoIdi93xjD1+jMSiRHmCwjj8PllJUCP31+1CObDGFClCj+z6KGJADWNaGqRCxCxHhaMOPrxAAaCOkpVgCwIgJoPVm+z8S4OIOjmhXGOhQt3DViL4O5xyO8M30f3ZmqO51qPdnqIW0DhJi3jYIhIjm6AYKggaDSM+IBzqI0JECQHA0X1Fhk1+kxPIJDVSKgF4JIxsP0TsIJIcOINFkfUcxfU+W8L+Nu0DwWPu19xCPVTCPPi70YWCRKHPjJyVm7jsKIP9gMNHkcxN2xPN1vxM26VyUWQrHIGbGuXFz325VyXUkD2bDbGVOWNESnUDh3mxTp0NJOLpIgyWERyVMByTQ7xfyDW5L+z5NdgFMIPzV3SiWxTbTwA9NxPgVBFiEi3gD-muN6S2J2IDKDM3S+mxRjWjOSKegMFAIuigl5LTlGyzi8LGFBDJnB3CWxUlTzJ9JAAOFQLGDwJGObztW7jkLEDBw4WJh+nrMLI-zpJ5N616X6xkQrBKDkik1zLQDcS9P7NgSU1aEwPpNdjwKT1mDwKzQGLAEJPOSTyzQYNyTsV90VN0Q1LwFnxkW4PnL+yXLZKOzED+gBkHL2XPJc0+V9FkOtIT0ukg0umg323b0pQ5heRiX6kFk-MU2BiGBCBZAjPOQK0ugAGFgle1tlIyvSsBRZK4Yk4KI58F10IQ05HlvjRBgcBZvpR4cAgtcL8KD5H5Slz4+9el2F3Y2dSlORSK04KLpE1g2d6BtcaYaE2cyKGFLs2d6LgZmd1A2daLO4eKmd4JiBmBky54OLLphLdpCBZ1y5TtxY8K9TlLhzgZEZ8IxcbSCApKCAZLnpy0YD+E6za8DTTKjNQDnA0AoIRNJK6L1VisXxZ1kpaMn0vS20oyPLXMbLe1BLyKHKLV0NoLUtCiQrSinpRBYh7ydL7LyMGhEFz41gUKN0GFdYAA-FYb9DAeilwtAJS1teCgqiOewDAYpc+YHJYNKlKy6fxZuFC8+H-XpFK+GGWHpXK78omfKvZFpLCPKT0Fiy6aqmK92LMtYDAZod0Os5wr05wn1YpD4sRXSyOOowpGQvyzilahgDyCSsRRqhhZq+BewTwEAUdNy59I0w0g+EAga4a-y4E1a9pBqtOA69gTWUZUhXChCr0hCo5OgsRIalydWGec+N6tnewPwewFy6RBdRa2K6Reov1da6S5E3Q0VELZ9GJb6mJaE+aj9OeHiy6J3R7eKqEKCKIOs6vb8ymiOKCLANEiq8+AmggIm-RY+NYeERqj8rFKM7m1RYAO2TVaK5azuFm4GPAX9JACseYOs-qf6CZQGdXSWvADQoWpa-S+ok-HgGWgOCZXAT7e4UizRECvSzRcC4EnYD6Ao9042faCZP6UDY4UgFeAIOeY2kAM2htLJeakgGWzG6ZcKnS-IICmmVkawN2gAcWsA9uBl2IwAADEPp9o0BbavylLU7VE8AZZz4+Y2xM6pov886yBCViBiVnbr0Ggq0oQ86Xw3w05HBl4mQbpH1k6vSzEhAs9IEmU5s0Knbjogb6rJKk005k1tBHtlV150ba5vyp6kLDgha0B4hR7ekZowB6BSJSxC5bxDh4gSt9Fy0AASc+feqYdSC5fSC5RWAAEVQmPUVnznUjju+2ySgkNwuWwTCIPuPtPvPqvpvrvofqOmZg6TwDMB1V9ElviHLUdHUFApCgn3sDBnzlDQeS3HaSWFgHGqLl8NDQrAwdAcFTDUwd3zCLwbAbetORli4CGGsCZAAuWGe17qzBQpHqOl7SeV7VIB3tkIwH3q-rPovuvtvvvsfphoYX-pEcfgwdMGaAAuJRkLTSkYgBkdCDkbwA4YwGkfgFkZaDZ2Oi0SeigGlP9jQFHmjlwujkfSzxpIi12CTljHHMuRb1XTDWbCgEcLBT2ROy9NFnO0+W4cPrnj4Z-sEfVnEY+lMbwDr3wCifHz0Enx0DbIYQ7NDWTS3F7J+mrwhUiYEBhU+Uwa3oOAcYBryV9lqt2nhSgCIYnv2mryh1qcLOZmwcTRBuevVUqfwd9A4Wr0mW6bjIIEqeZhcfPk0TQvabIfjk0Tzr5lArzrAGsHDsLoJQWBLrevJHLsrrKbiBxAWv+mr2ybgv2fdxyiCC0asnSlsnQDwriBEFiCAA)
package/dist/closures.cjs CHANGED
@@ -25,7 +25,7 @@ let NIL = void 0,
25
25
  CLOSURE_TO_FN = new WeakMap(),
26
26
  ON_CREATE_KEY = 'oncreate',
27
27
  NUM = 1,
28
- PARENT_DOM_KEY = '$$PETIT_DOM_REF',
28
+ PARENT_DOM_KEY = '$_REF',
29
29
  EMPTY_OBJECT = {},
30
30
  SVG_NS = 'http://www.w3.org/2000/svg',
31
31
  XLINK_NS = 'http://www.w3.org/1999/xlink',
@@ -90,6 +90,7 @@ let replaceDom = (parent, newRef, oldRef) => {
90
90
  };
91
91
 
92
92
  let setDomAttribute = (el, attr, value, isSVG) => {
93
+ if (attr === 'className') attr = 'class';
93
94
  if (value === true) el.setAttribute(attr, '');
94
95
  else if (value === false) el.removeAttribute(attr);
95
96
  else (isSVG && NS_ATTRS[attr])
@@ -492,7 +493,7 @@ let patch = (parentDomNode, newVnode, oldVnode, ref, env = { ...DEFAULT_ENV }) =
492
493
  };
493
494
 
494
495
  function h(_t, ...children) {
495
- let props = children[0];
496
+ let idx, props = children[0];
496
497
  if (props && isObj(props) && !isArr(props) && !(props._t || props.props))
497
498
  children.shift();
498
499
  else props = EMPTY_OBJECT;
@@ -504,15 +505,11 @@ function h(_t, ...children) {
504
505
  ? { ...props, children: children[0] }
505
506
  : props;
506
507
 
507
- // parse tag
508
- if (isStr(_t)) {
509
- let idx = _t.indexOf('.');
510
- if (~idx) {
511
- let className = _t.slice(idx + 1).replace(/\./g, ' ')
512
- props.class = props.class ? className + ' ' + String(props.class) : className;
513
- _t = _t.slice(0, idx);
514
- }
515
- _t = _t || 'div';
508
+ // inline class parsing
509
+ if (isStr(_t) && ~(idx = _t.indexOf('.'))) {
510
+ let className = _t.slice(idx + 1).replace(/\./g, ' ')
511
+ props.class = props.class ? className + ' ' + String(props.class) : className;
512
+ _t = _t.slice(0, idx);
516
513
  }
517
514
 
518
515
  if (props.key !== props.key) throw new Error("Invalid NaN key");
@@ -545,31 +542,12 @@ const Fragment = props => props.children;
545
542
 
546
543
  const onRemove = fn => ON_REMOVES.push(fn);
547
544
 
548
- function render(vnode, parentDomNode) {
545
+ function app(vnode, parentDomNode, opts = {}) {
549
546
  let ref,
550
- env = { ...DEFAULT_ENV, manualRedraw: 1 },
547
+ env = { ...DEFAULT_ENV, manualRedraw: opts.manualRedraw },
551
548
  rootRef = parentDomNode[PARENT_DOM_KEY];
552
- if (rootRef === NIL) {
553
- ref = mount(vnode, env);
554
- parentDomNode[PARENT_DOM_KEY] = { ref, vnode };
555
- parentDomNode.textContent = '';
556
- insertDom(parentDomNode, ref, NIL);
557
- } else {
558
- rootRef.ref = patchInPlace(
559
- parentDomNode,
560
- vnode,
561
- rootRef.vnode,
562
- rootRef.ref,
563
- env
564
- );
565
- rootRef.vnode = vnode;
566
- }
567
- }
568
549
 
569
- function run(vnode, parentDomNode, opts = {}) {
570
- let ref,
571
- env = { ...DEFAULT_ENV, ...opts },
572
- rootRef = parentDomNode[PARENT_DOM_KEY];
550
+ env.directives = { ...env.directives, ...(opts.directives || {}) };
573
551
 
574
552
  if (rootRef !== NIL)
575
553
  throw Error('App already mounted on this node');
@@ -579,19 +557,20 @@ function run(vnode, parentDomNode, opts = {}) {
579
557
  parentDomNode.textContent = '';
580
558
  insertDom(parentDomNode, ref, NIL);
581
559
 
582
- return env.redraw = _ => {
560
+ return env.redraw = (newVnode = vnode) => {
583
561
  rootRef.ref = patchInPlace(
584
562
  parentDomNode,
585
- vnode,
563
+ newVnode,
586
564
  rootRef.vnode,
587
565
  rootRef.ref,
588
566
  env
589
567
  );
568
+
569
+ rootRef.vnode = newVnode;
590
570
  };
591
571
  }
592
572
  exports.Fragment = Fragment;
573
+ exports.app = app;
593
574
  exports.h = h;
594
575
  exports.m = m;
595
- exports.onRemove = onRemove;
596
- exports.render = render;
597
- exports.run = run;
576
+ exports.onRemove = onRemove;
package/dist/closures.js CHANGED
@@ -25,7 +25,7 @@ let NIL = void 0,
25
25
  CLOSURE_TO_FN = new WeakMap(),
26
26
  ON_CREATE_KEY = 'oncreate',
27
27
  NUM = 1,
28
- PARENT_DOM_KEY = '$$PETIT_DOM_REF',
28
+ PARENT_DOM_KEY = '$_REF',
29
29
  EMPTY_OBJECT = {},
30
30
  SVG_NS = 'http://www.w3.org/2000/svg',
31
31
  XLINK_NS = 'http://www.w3.org/1999/xlink',
@@ -90,6 +90,7 @@ let replaceDom = (parent, newRef, oldRef) => {
90
90
  };
91
91
 
92
92
  let setDomAttribute = (el, attr, value, isSVG) => {
93
+ if (attr === 'className') attr = 'class';
93
94
  if (value === true) el.setAttribute(attr, '');
94
95
  else if (value === false) el.removeAttribute(attr);
95
96
  else (isSVG && NS_ATTRS[attr])
@@ -492,7 +493,7 @@ let patch = (parentDomNode, newVnode, oldVnode, ref, env = { ...DEFAULT_ENV }) =
492
493
  };
493
494
 
494
495
  export function h(_t, ...children) {
495
- let props = children[0];
496
+ let idx, props = children[0];
496
497
  if (props && isObj(props) && !isArr(props) && !(props._t || props.props))
497
498
  children.shift();
498
499
  else props = EMPTY_OBJECT;
@@ -504,15 +505,11 @@ export function h(_t, ...children) {
504
505
  ? { ...props, children: children[0] }
505
506
  : props;
506
507
 
507
- // parse tag
508
- if (isStr(_t)) {
509
- let idx = _t.indexOf('.');
510
- if (~idx) {
511
- let className = _t.slice(idx + 1).replace(/\./g, ' ')
512
- props.class = props.class ? className + ' ' + String(props.class) : className;
513
- _t = _t.slice(0, idx);
514
- }
515
- _t = _t || 'div';
508
+ // inline class parsing
509
+ if (isStr(_t) && ~(idx = _t.indexOf('.'))) {
510
+ let className = _t.slice(idx + 1).replace(/\./g, ' ')
511
+ props.class = props.class ? className + ' ' + String(props.class) : className;
512
+ _t = _t.slice(0, idx);
516
513
  }
517
514
 
518
515
  if (props.key !== props.key) throw new Error("Invalid NaN key");
@@ -545,31 +542,12 @@ export const Fragment = props => props.children;
545
542
 
546
543
  export const onRemove = fn => ON_REMOVES.push(fn);
547
544
 
548
- export function render(vnode, parentDomNode) {
545
+ export function app(vnode, parentDomNode, opts = {}) {
549
546
  let ref,
550
- env = { ...DEFAULT_ENV, manualRedraw: 1 },
547
+ env = { ...DEFAULT_ENV, manualRedraw: opts.manualRedraw },
551
548
  rootRef = parentDomNode[PARENT_DOM_KEY];
552
- if (rootRef === NIL) {
553
- ref = mount(vnode, env);
554
- parentDomNode[PARENT_DOM_KEY] = { ref, vnode };
555
- parentDomNode.textContent = '';
556
- insertDom(parentDomNode, ref, NIL);
557
- } else {
558
- rootRef.ref = patchInPlace(
559
- parentDomNode,
560
- vnode,
561
- rootRef.vnode,
562
- rootRef.ref,
563
- env
564
- );
565
- rootRef.vnode = vnode;
566
- }
567
- }
568
549
 
569
- export function run(vnode, parentDomNode, opts = {}) {
570
- let ref,
571
- env = { ...DEFAULT_ENV, ...opts },
572
- rootRef = parentDomNode[PARENT_DOM_KEY];
550
+ env.directives = { ...env.directives, ...(opts.directives || {}) };
573
551
 
574
552
  if (rootRef !== NIL)
575
553
  throw Error('App already mounted on this node');
@@ -579,13 +557,15 @@ export function run(vnode, parentDomNode, opts = {}) {
579
557
  parentDomNode.textContent = '';
580
558
  insertDom(parentDomNode, ref, NIL);
581
559
 
582
- return env.redraw = _ => {
560
+ return env.redraw = (newVnode = vnode) => {
583
561
  rootRef.ref = patchInPlace(
584
562
  parentDomNode,
585
- vnode,
563
+ newVnode,
586
564
  rootRef.vnode,
587
565
  rootRef.ref,
588
566
  env
589
567
  );
568
+
569
+ rootRef.vnode = newVnode;
590
570
  };
591
571
  }
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.closures={})}(this,(function(e){let t=void 0,r=e=>{},n=e=>({mount(t,r){t[e]=r},patch(t,r,n){r!==n&&(t[e]=r)},unmount(r){r[e]=t}}),i={isSVG:!1,redraw:r,directives:{selected:n("selected"),checked:n("checked"),value:n("value"),innerHTML:n("innerHTML")}},o=[],l=new WeakMap,d=1,c={},f="http://www.w3.org/1999/xlink",s={show:f,actuate:f,href:f},h=e=>"function"==typeof e,u=e=>"string"==typeof e,p=e=>null!==e&&"object"==typeof e,a=e=>Array.isArray(e),y=e=>JSON.stringify(e),v=e=>null===e||!1===e||e===t||a(e)&&0===e.length||e&&"="===e._t,w=e=>a(e)&&e.length>0,m=e=>u(e)||"number"==typeof e,g=e=>e&&1===e.vtype,_=e=>e&&2===e.vtype,k=e=>{let t=e.type;if(1===t)return e.node;if(8===t)return k(e.childRef);if(4===t)return k(e.children[0]);throw Error("Unknown ref type "+y(e))},E=e=>{let t=e.type;if(1===t)return e.node.nextSibling;if(8===t)return E(e.childRef);if(4===t)return E(e.children[e.children.length-1]);throw Error("Unknown ref type "+y(e))},R=(e,t,r)=>{let n=t.type;if(1===n)e.insertBefore(t.node,r);else if(8===n)R(e,t.childRef,r);else{if(4!==n)throw Error("Unknown ref type "+y(t));for(let n=0;n<t.children.length;n++)R(e,t.children[n],r)}},S=(e,t)=>{let r=t.type;if(1===r)e.removeChild(t.node);else if(8===r)S(e,t.childRef);else{if(4!==r)throw Error("Unknown ref type "+y(t));for(let r=0;r<t.children.length;r++)S(e,t.children[r])}},N=(e,t,r,n)=>{!0===r?e.setAttribute(t,""):!1===r?e.removeAttribute(t):n&&s[t]?e.setAttributeNS(s[t],t,r):e.setAttribute(t,r)},T=(e,n,i,c,f=r)=>{let s={closureId:i,closure:c,onRemove:f};if(v(e))return{...s,type:1,node:document.createComment("NULL")};if(m(e))return{...s,type:1,node:document.createTextNode(e)};if(g(e)){let r,{_t:i,props:o}=e;"svg"!==i||n.isSVG||(n={...n,isSVG:!0}),r=n.isSVG?document.createElementNS("http://www.w3.org/2000/svg",i):document.createElement(i),h(o.oncreate)&&o.oncreate(r),((e,t,r)=>{for(let n in t)"key"===n||"children"===n||"oncreate"===n||n in r.directives||(n.startsWith("on")?e[n.toLowerCase()]=e=>{t[n](e),!r.manualRedraw&&r.redraw()}:N(e,n,t[n],r.isSVG))})(r,o,n);let l=o.children===t?o.children:T(o.children,n);return l!==t&&R(r,l),((e,t,r)=>{for(let n in t)n in r.directives&&r.directives[n].mount(e,t[n])})(r,o,n),{...s,type:1,node:r,children:l}}if(w(e)){let t=0,r=[];for(;t<e.length;t++)r.push(T(e[t],n));return{...s,type:4,children:r}}if(_(e)){let t=e._t(e.props);if(h(t)){let i=d++,c=l.get(e._t)||new Map,f=o.pop()||r;c.set(i,t),l.set(e._t,c);let s=e._t;return e._t=t,T(e,n,i,s,f)}return{...s,type:8,childRef:T(t,n),childState:t}}if(e instanceof Node)return{...s,type:1,node:e};if(e===t)throw Error("mount: vnode is undefined");throw Error("mount: Invalid vnode")},V=(e,r,n)=>{if(g(e))((e,t,r)=>{for(let n in t)n in r.directives&&r.directives[n].unmount(e,t[n])})(r.node,e.props,n),e.props.children!==t&&V(e.props.children,r.children,n);else if(w(e))for(let t=0;t<e.length;t++)V(e[t],r.children[t],n);else if(_(e)){let e=r.closure,t=r.closureId,i=r.onRemove,o=l.get(e);o&&t&&o.get(t)&&(o.delete(t),!o.size&&l.delete(e),i()),V(r.childState,r.childRef,n)}},x=(e,t,r,n,i)=>{let o=I(e,t,r,n,i);return o!==n&&(((e,t,r)=>{R(e,t,k(r)),S(e,r)})(e,o,n),V(r,n,i)),o},I=(e,r,n,o,d={...i})=>{if(r&&"="===r._t)return o;let c,f;if(p(o)&&(c=o.closure,f=o.closureId),_(r)&&_(n)&&(r._t===n._t||c&&f)){let t,n=r._t,i=l.get(c);i&&f&&(t=i.get(f))&&(n=t);let s=n(r.props),h=I(e,s,o.childState,o.childRef,d);return h!==o.childRef?{type:8,childRef:h,childState:s}:(o.childState=s,o)}if(n===r||v(r)&&v(n))return o;if(m(r)&&m(n))return o.node.nodeValue=r,o;if(g(r)&&g(n)&&r._t===n._t){"svg"!==r._t||d.isSVG||(d={...d,isSVG:!0}),((e,r,n,i)=>{let o;for(o in r){if("key"===o||"children"===o||"oncreate"===o||o in i.directives)continue;let t=n[o],l=r[o];t!==l&&(o.startsWith("on")?e[o.toLowerCase()]=e=>{l(e),!i.manualRedraw&&i.redraw()}:N(e,o,l,i.isSVG))}for(o in n)"key"===o||"children"===o||o in r||o in i.directives||(o.startsWith("on")?e[o.toLowerCase()]=t:e.removeAttribute(o))})(o.node,r.props,n.props,d);let e=n.props.children,i=r.props.children;return e===t?i!==t&&(o.children=T(i,d),R(o.node,o.children)):i===t?(o.node.textContent="",V(e,o.children,d),o.children=t):o.children=x(o.node,i,e,o.children,d),((e,t,r,n)=>{let i;for(i in t)i in n.directives&&n.directives[i].patch(e,t[i],r[i]);for(i in r)i in n.directives&&!(i in t)&&n.directives[i].unmount(e,r[i])})(o.node,r.props,n.props,d),o}return w(r)&&w(n)?(((e,r,n,i,o)=>{let l,d,c,f,s,h,u,p,a=E(i),y=Array(r.length),v=i.children,w=0,m=0,g=r.length-1,_=n.length-1;for(;w<=g&&m<=_;)if(v[m]!==t)if(v[_]!==t)if(c=n[m],f=r[w],c&&f&&f.key===c.key)s=v[m],h=y[w]=x(e,f,c,s,o),w++,m++;else if(c=n[_],f=r[g],c&&f&&f.key===c.key)s=v[_],h=y[g]=x(e,f,c,s,o),g--,_--;else{if(u===t)for(l=m,u={};l<=_;l++)c=n[l],c&&c.key!==t&&(u[c.key]=l);f=r[w],d=f&&f.key!==t?u[f.key]:t,d!==t?(c=n[d],s=v[d],h=y[w]=I(e,f,c,s,o),R(e,h,k(v[m])),h!==s&&(S(e,s),V(c,s,o)),v[d]=t):(h=y[w]=T(f,o),R(e,h,k(v[m]))),w++}else _--;else m++;for(p=g<r.length-1?k(y[g+1]):a;w<=g;)h=T(r[w],o),y[w]=h,R(e,h,p),w++;for(;m<=_;)s=v[m],s!==t&&(S(e,s),V(n[m],s,o)),m++;i.children=y})(e,r,n,o,d),o):r instanceof Node&&n instanceof Node?(o.node=r,o):T(r,d)};function b(e,...r){let n=r[0];if(!n||!p(n)||a(n)||n._t||n.props?n=c:r.shift(),n=r.length>1?{...n,children:r}:1===r.length?{...n,children:r[0]}:n,u(e)){let t=e.indexOf(".");if(~t){let r=e.slice(t+1).replace(/\./g," ");n.class=n.class?r+" "+String(n.class):r,e=e.slice(0,t)}e=e||"div"}if(n.key!=n.key)throw new Error("Invalid NaN key");let i=u(e)?1:e&&h(e.mount)?VTYPE_COMPONENT:h(e)?2:t;if(i===t)throw new Error("Invalid VNode type");return{vtype:i,_t:e,key:n.key,props:n}}b.retain=e=>b("=");const A=b;e.Fragment=e=>e.children,e.h=b,e.m=A,e.onRemove=e=>o.push(e),e.render=function(e,r){let n,o={...i,manualRedraw:1},l=r.$$PETIT_DOM_REF;l===t?(n=T(e,o),r.$$PETIT_DOM_REF={ref:n,vnode:e},r.textContent="",R(r,n,t)):(l.ref=x(r,e,l.vnode,l.ref,o),l.vnode=e)},e.run=function(e,r,n={}){let o,l={...i,...n},d=r.$$PETIT_DOM_REF;if(d!==t)throw Error("App already mounted on this node");return o=T(e,l),d=r.$$PETIT_DOM_REF={ref:o,vnode:e},r.textContent="",R(r,o,t),l.redraw=t=>{d.ref=x(r,e,d.vnode,d.ref,l)}}}));
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.closures={})}(this,(function(e){let t=void 0,r=e=>{},n=e=>({mount(t,r){t[e]=r},patch(t,r,n){r!==n&&(t[e]=r)},unmount(r){r[e]=t}}),i={isSVG:!1,redraw:r,directives:{selected:n("selected"),checked:n("checked"),value:n("value"),innerHTML:n("innerHTML")}},o=[],l=new WeakMap,d=1,c={},s="http://www.w3.org/1999/xlink",f={show:s,actuate:s,href:s},h=e=>"function"==typeof e,u=e=>"string"==typeof e,p=e=>null!==e&&"object"==typeof e,a=e=>Array.isArray(e),y=e=>JSON.stringify(e),v=e=>null===e||!1===e||e===t||a(e)&&0===e.length||e&&"="===e._t,w=e=>a(e)&&e.length>0,m=e=>u(e)||"number"==typeof e,g=e=>e&&1===e.vtype,k=e=>e&&2===e.vtype,_=e=>{let t=e.type;if(1===t)return e.node;if(8===t)return _(e.childRef);if(4===t)return _(e.children[0]);throw Error("Unknown ref type "+y(e))},R=e=>{let t=e.type;if(1===t)return e.node.nextSibling;if(8===t)return R(e.childRef);if(4===t)return R(e.children[e.children.length-1]);throw Error("Unknown ref type "+y(e))},S=(e,t,r)=>{let n=t.type;if(1===n)e.insertBefore(t.node,r);else if(8===n)S(e,t.childRef,r);else{if(4!==n)throw Error("Unknown ref type "+y(t));for(let n=0;n<t.children.length;n++)S(e,t.children[n],r)}},E=(e,t)=>{let r=t.type;if(1===r)e.removeChild(t.node);else if(8===r)E(e,t.childRef);else{if(4!==r)throw Error("Unknown ref type "+y(t));for(let r=0;r<t.children.length;r++)E(e,t.children[r])}},N=(e,t,r,n)=>{"className"===t&&(t="class"),!0===r?e.setAttribute(t,""):!1===r?e.removeAttribute(t):n&&f[t]?e.setAttributeNS(f[t],t,r):e.setAttribute(t,r)},V=(e,n,i,c,s=r)=>{let f={closureId:i,closure:c,onRemove:s};if(v(e))return{...f,type:1,node:document.createComment("NULL")};if(m(e))return{...f,type:1,node:document.createTextNode(e)};if(g(e)){let r,{_t:i,props:o}=e;"svg"!==i||n.isSVG||(n={...n,isSVG:!0}),r=n.isSVG?document.createElementNS("http://www.w3.org/2000/svg",i):document.createElement(i),h(o.oncreate)&&o.oncreate(r),((e,t,r)=>{for(let n in t)"key"===n||"children"===n||"oncreate"===n||n in r.directives||(n.startsWith("on")?e[n.toLowerCase()]=e=>{t[n](e),!r.manualRedraw&&r.redraw()}:N(e,n,t[n],r.isSVG))})(r,o,n);let l=o.children===t?o.children:V(o.children,n);return l!==t&&S(r,l),((e,t,r)=>{for(let n in t)n in r.directives&&r.directives[n].mount(e,t[n])})(r,o,n),{...f,type:1,node:r,children:l}}if(w(e)){let t=0,r=[];for(;t<e.length;t++)r.push(V(e[t],n));return{...f,type:4,children:r}}if(k(e)){let t=e._t(e.props);if(h(t)){let i=d++,c=l.get(e._t)||new Map,s=o.pop()||r;c.set(i,t),l.set(e._t,c);let f=e._t;return e._t=t,V(e,n,i,f,s)}return{...f,type:8,childRef:V(t,n),childState:t}}if(e instanceof Node)return{...f,type:1,node:e};if(e===t)throw Error("mount: vnode is undefined");throw Error("mount: Invalid vnode")},b=(e,r,n)=>{if(g(e))((e,t,r)=>{for(let n in t)n in r.directives&&r.directives[n].unmount(e,t[n])})(r.node,e.props,n),e.props.children!==t&&b(e.props.children,r.children,n);else if(w(e))for(let t=0;t<e.length;t++)b(e[t],r.children[t],n);else if(k(e)){let e=r.closure,t=r.closureId,i=r.onRemove,o=l.get(e);o&&t&&o.get(t)&&(o.delete(t),!o.size&&l.delete(e),i()),b(r.childState,r.childRef,n)}},x=(e,t,r,n,i)=>{let o=A(e,t,r,n,i);return o!==n&&(((e,t,r)=>{S(e,t,_(r)),E(e,r)})(e,o,n),b(r,n,i)),o},A=(e,r,n,o,d={...i})=>{if(r&&"="===r._t)return o;let c,s;if(p(o)&&(c=o.closure,s=o.closureId),k(r)&&k(n)&&(r._t===n._t||c&&s)){let t,n=r._t,i=l.get(c);i&&s&&(t=i.get(s))&&(n=t);let f=n(r.props),h=A(e,f,o.childState,o.childRef,d);return h!==o.childRef?{type:8,childRef:h,childState:f}:(o.childState=f,o)}if(n===r||v(r)&&v(n))return o;if(m(r)&&m(n))return o.node.nodeValue=r,o;if(g(r)&&g(n)&&r._t===n._t){"svg"!==r._t||d.isSVG||(d={...d,isSVG:!0}),((e,r,n,i)=>{let o;for(o in r){if("key"===o||"children"===o||"oncreate"===o||o in i.directives)continue;let t=n[o],l=r[o];t!==l&&(o.startsWith("on")?e[o.toLowerCase()]=e=>{l(e),!i.manualRedraw&&i.redraw()}:N(e,o,l,i.isSVG))}for(o in n)"key"===o||"children"===o||o in r||o in i.directives||(o.startsWith("on")?e[o.toLowerCase()]=t:e.removeAttribute(o))})(o.node,r.props,n.props,d);let e=n.props.children,i=r.props.children;return e===t?i!==t&&(o.children=V(i,d),S(o.node,o.children)):i===t?(o.node.textContent="",b(e,o.children,d),o.children=t):o.children=x(o.node,i,e,o.children,d),((e,t,r,n)=>{let i;for(i in t)i in n.directives&&n.directives[i].patch(e,t[i],r[i]);for(i in r)i in n.directives&&!(i in t)&&n.directives[i].unmount(e,r[i])})(o.node,r.props,n.props,d),o}return w(r)&&w(n)?(((e,r,n,i,o)=>{let l,d,c,s,f,h,u,p,a=R(i),y=Array(r.length),v=i.children,w=0,m=0,g=r.length-1,k=n.length-1;for(;w<=g&&m<=k;)if(v[m]!==t)if(v[k]!==t)if(c=n[m],s=r[w],c&&s&&s.key===c.key)f=v[m],h=y[w]=x(e,s,c,f,o),w++,m++;else if(c=n[k],s=r[g],c&&s&&s.key===c.key)f=v[k],h=y[g]=x(e,s,c,f,o),g--,k--;else{if(u===t)for(l=m,u={};l<=k;l++)c=n[l],c&&c.key!==t&&(u[c.key]=l);s=r[w],d=s&&s.key!==t?u[s.key]:t,d!==t?(c=n[d],f=v[d],h=y[w]=A(e,s,c,f,o),S(e,h,_(v[m])),h!==f&&(E(e,f),b(c,f,o)),v[d]=t):(h=y[w]=V(s,o),S(e,h,_(v[m]))),w++}else k--;else m++;for(p=g<r.length-1?_(y[g+1]):a;w<=g;)h=V(r[w],o),y[w]=h,S(e,h,p),w++;for(;m<=k;)f=v[m],f!==t&&(E(e,f),b(n[m],f,o)),m++;i.children=y})(e,r,n,o,d),o):r instanceof Node&&n instanceof Node?(o.node=r,o):V(r,d)};function C(e,...r){let n,i=r[0];if(!i||!p(i)||a(i)||i._t||i.props?i=c:r.shift(),i=r.length>1?{...i,children:r}:1===r.length?{...i,children:r[0]}:i,u(e)&&~(n=e.indexOf("."))){let t=e.slice(n+1).replace(/\./g," ");i.class=i.class?t+" "+String(i.class):t,e=e.slice(0,n)}if(i.key!=i.key)throw new Error("Invalid NaN key");let o=u(e)?1:e&&h(e.mount)?VTYPE_COMPONENT:h(e)?2:t;if(o===t)throw new Error("Invalid VNode type");return{vtype:o,_t:e,key:i.key,props:i}}C.retain=e=>C("=");const G=C;e.Fragment=e=>e.children,e.app=function(e,r,n={}){let o,l={...i,manualRedraw:n.manualRedraw},d=r.$_REF;if(l.directives={...l.directives,...n.directives||{}},d!==t)throw Error("App already mounted on this node");return o=V(e,l),d=r.$_REF={ref:o,vnode:e},r.textContent="",S(r,o,t),l.redraw=(t=e)=>{d.ref=x(r,t,d.vnode,d.ref,l),d.vnode=t}},e.h=C,e.m=G,e.onRemove=e=>o.push(e)}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "closures",
3
- "version": "0.7.2",
3
+ "version": "0.7.3",
4
4
  "description": "Minimalist virtual dom library",
5
5
  "type": "module",
6
6
  "main": "dist/closures.cjs",