dante2-editor 0.2.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/.babelrc +20 -0
  3. data/.eslint +13 -0
  4. data/.gitignore +15 -0
  5. data/README.md +5 -1
  6. data/dante2.gemspec +2 -4
  7. data/{app → demo}/assets/index.html +2 -2
  8. data/{app → demo}/assets/license.html +1 -1
  9. data/{app → demo}/assets/options.html +1 -5
  10. data/{app → demo}/assets/store.json +0 -0
  11. data/demo/data/poc.js +9 -0
  12. data/demo/demo.js +9 -0
  13. data/demo/initialize.js +7 -0
  14. data/{app → demo}/styles/layout/layout.scss +0 -0
  15. data/{app → demo}/styles/layout/normalize.css +0 -0
  16. data/{app → demo}/styles/layout/scaffold.scss +0 -0
  17. data/{app → demo}/styles/layout/tooltips.scss +0 -0
  18. data/dist/Dante2.js +2995 -0
  19. data/dist/Dante2.min.js +3 -0
  20. data/dist/Dante2.min.js.map +1 -0
  21. data/dist/DanteStyles.css +2 -0
  22. data/dist/DanteStyles.css.map +1 -0
  23. data/dist/DanteStyles.js +102 -0
  24. data/dist/DanteStyles.min.js +2 -0
  25. data/dist/DanteStyles.min.js.map +1 -0
  26. data/dist/dante-vendors.js +48316 -0
  27. data/dist/dante-vendors.min.js +29 -0
  28. data/dist/dante-vendors.min.js.map +1 -0
  29. data/{app/styles/fonts/dante → dist/fonts}/dante.eot +0 -0
  30. data/{app/styles/fonts/dante → dist/fonts}/dante.svg +0 -0
  31. data/{app/styles/fonts/dante → dist/fonts}/dante.ttf +0 -0
  32. data/{app/styles/fonts/dante → dist/fonts}/dante.woff +0 -0
  33. data/{app/styles/fonts/dante → dist/fonts}/fontello.eot +0 -0
  34. data/{app/styles/fonts/dante → dist/fonts}/fontello.svg +0 -0
  35. data/{app/styles/fonts/dante → dist/fonts}/fontello.ttf +0 -0
  36. data/{app/styles/fonts/dante → dist/fonts}/fontello.woff +0 -0
  37. data/docs/app.css +430 -1
  38. data/docs/app.css.map +1 -1
  39. data/docs/app.js +62 -2
  40. data/docs/app.js.map +1 -1
  41. data/docs/dante-vendors.js +49513 -22
  42. data/docs/dante-vendors.js.map +1 -1
  43. data/docs/dante.css +1602 -1
  44. data/docs/dante.css.map +1 -1
  45. data/docs/dante.js +3310 -3
  46. data/docs/dante.js.map +1 -1
  47. data/docs/doc.html +3 -7
  48. data/docs/index.html +4 -4
  49. data/docs/license.html +3 -3
  50. data/docs/options.html +53 -0
  51. data/package.json +47 -17
  52. data/rb_lib/dante2-editor/rails.rb +15 -0
  53. data/{lib → rb_lib}/dante2-editor/version.rb +1 -1
  54. data/{lib → rb_lib}/dante2-editor.rb +0 -0
  55. data/src/components/blocks/embed.js +126 -0
  56. data/src/components/blocks/image.js +377 -0
  57. data/src/components/blocks/placeholder.js +68 -0
  58. data/src/components/blocks/video.js +80 -0
  59. data/src/components/dante.js +291 -0
  60. data/src/components/dante_editor.js +928 -0
  61. data/src/components/debug.js +104 -0
  62. data/src/components/decorators/link.js +64 -0
  63. data/src/components/popovers/addButton.js +318 -0
  64. data/src/components/popovers/image.js +188 -0
  65. data/src/components/popovers/link.js +107 -0
  66. data/src/components/popovers/toolTip.js +402 -0
  67. data/{app/utils/logger.coffee → src/components/wrapper.js} +0 -0
  68. data/{app → src}/images/dante/media-loading-placeholder.png +0 -0
  69. data/{app → src}/images/site/dante-demo.png +0 -0
  70. data/{app → src}/images/site/dante-editor-logo.png +0 -0
  71. data/{app → src}/images/site/github-logo.png +0 -0
  72. data/src/index.js +9 -0
  73. data/{app → src}/model/index.js +0 -0
  74. data/src/style.js +3 -0
  75. data/{app → src}/styles/dante/_animations.scss +0 -0
  76. data/{app → src}/styles/dante/_caption.scss +0 -0
  77. data/{app → src}/styles/dante/_debug.scss +0 -0
  78. data/{app → src}/styles/dante/_fonts.scss +0 -0
  79. data/{app → src}/styles/dante/_graf.scss +0 -0
  80. data/{app → src}/styles/dante/_icons.scss +0 -0
  81. data/{app → src}/styles/dante/_media.scss +0 -0
  82. data/{app → src}/styles/dante/_menu.scss +0 -0
  83. data/{app → src}/styles/dante/_needsorder.scss +0 -0
  84. data/{app → src}/styles/dante/_popover.scss +0 -0
  85. data/{app → src}/styles/dante/_post.scss +0 -0
  86. data/{app → src}/styles/dante/_scaffold.scss +0 -0
  87. data/{app → src}/styles/dante/_tooltip.scss +0 -0
  88. data/{app → src}/styles/dante/_utilities.scss +0 -0
  89. data/{app → src}/styles/dante/_variables.scss +0 -0
  90. data/{app → src}/styles/dante/blame.scss +0 -0
  91. data/{app → src}/styles/dante.scss +0 -0
  92. data/{app → src}/styles/draft.css +0 -0
  93. data/src/styles/fonts/dante/dante.eot +0 -0
  94. data/src/styles/fonts/dante/dante.svg +18 -0
  95. data/src/styles/fonts/dante/dante.ttf +0 -0
  96. data/src/styles/fonts/dante/dante.woff +0 -0
  97. data/src/styles/fonts/dante/fontello.eot +0 -0
  98. data/src/styles/fonts/dante/fontello.svg +36 -0
  99. data/src/styles/fonts/dante/fontello.ttf +0 -0
  100. data/src/styles/fonts/dante/fontello.woff +0 -0
  101. data/src/utils/find_entities.js +17 -0
  102. data/src/utils/html2content.js +127 -0
  103. data/src/utils/save_content.js +80 -0
  104. data/{app → src}/utils/selection.js +0 -0
  105. data/tools/.eslintrc +9 -0
  106. data/tools/amd/README.md +7 -0
  107. data/tools/amd/bower.json +19 -0
  108. data/tools/amd/build.js +36 -0
  109. data/tools/build-cli.js +46 -0
  110. data/tools/build.js +30 -0
  111. data/tools/buildBabel.js +32 -0
  112. data/tools/constants.js +10 -0
  113. data/tools/dist/build.js +13 -0
  114. data/tools/docs/build.js +12 -0
  115. data/tools/es/build.js +27 -0
  116. data/tools/exec.js +50 -0
  117. data/tools/fs-utils.js +35 -0
  118. data/tools/lib/build.js +14 -0
  119. data/tools/promisify.js +14 -0
  120. data/webpack/base.config.js +89 -0
  121. data/webpack/docs.config.js +147 -0
  122. data/webpack/webpack.config.js +78 -0
  123. data/webpack.config-doc.js +5 -0
  124. data/webpack.config.js +3 -147
  125. data/yarn.lock +973 -718
  126. metadata +108 -64
  127. data/app/components/App.cjsx +0 -1083
  128. data/app/components/blocks/embed.cjsx +0 -109
  129. data/app/components/blocks/image.cjsx +0 -316
  130. data/app/components/blocks/placeholder.cjsx +0 -60
  131. data/app/components/blocks/video.cjsx +0 -75
  132. data/app/components/debug.cjsx +0 -96
  133. data/app/components/decorators/link.cjsx +0 -61
  134. data/app/components/popovers/addButton.cjsx +0 -247
  135. data/app/components/popovers/image.cjsx +0 -160
  136. data/app/components/popovers/link.cjsx +0 -87
  137. data/app/components/popovers/toolTip.cjsx +0 -326
  138. data/app/data/poc.js +0 -15
  139. data/app/demo.js +0 -7
  140. data/app/initialize.js +0 -4
  141. data/app/utils/find_entities.coffee +0 -20
  142. data/app/utils/html2content.coffee +0 -120
  143. data/app/utils/save_content.coffee +0 -63
  144. data/lib/dante2-editor/rails.rb +0 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b78a4eed0a1ef6eeae30783c70c7292b850998e2
4
- data.tar.gz: 5ec8a4832a950e7450e99f8bd38b108b8721153b
3
+ metadata.gz: 4cc96cd7a89c57b98ab49117b35fe752fa044b53
4
+ data.tar.gz: a1303c1ec507ba86a1478f0d65d8f5c158568cd7
5
5
  SHA512:
6
- metadata.gz: f608f000bc57b9e234cfd10f2f2de4e021f8c49267611bf841c636fdc9e63a9ff2a5e78599747cb4eac18dde96efed4addf0a00fc87b439e4d40186b2d63a817
7
- data.tar.gz: fa07fc3b9af66474ee8f8fa069cf6c5071b08f06fbed561538bceef8a6106ad3b788c08e18b2cd7187eea6ad7cbc85cfbb4b2944ca5a481d30bb438a2617e6fb
6
+ metadata.gz: 3694d5584c4f8fee58f3b5c2022aba7d71e5f2563f1f9c5c74018ba5f1d87ab871864c0070e0e64f859625435479f047f061e6a7b19e293f18c06fa6726cebb5
7
+ data.tar.gz: c76ffc305c44d597a62d1b73b50a53bbafc7300853ef05b34a1acff981344d808fd45c6124d7b789d3ab67f2c20292cec4621924a6ffbe6ae9f533cebc7ff23e
data/.babelrc ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "presets": [
3
+ ["es2015",{ loose: true }],
4
+ "stage-1",
5
+ "react"
6
+ ],
7
+ "plugins": [
8
+ "dev-expression",
9
+ "transform-runtime",
10
+ "transform-es3-member-expression-literals",
11
+ "transform-es3-property-literals",
12
+ "add-module-exports"
13
+ ],
14
+
15
+ "env": {
16
+ "test": {
17
+ "plugins": ["istanbul"]
18
+ }
19
+ }
20
+ }
data/.eslint ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "extends": ["rackt", "plugin:react/recommended"],
3
+ "globals": {
4
+ "__DEV__": false
5
+ },
6
+ "rules": {
7
+ "react/display-name": 0,
8
+ "react/jsx-wrap-multilines": 2
9
+ },
10
+ "plugins": [
11
+ "react"
12
+ ]
13
+ }
data/.gitignore CHANGED
@@ -31,3 +31,18 @@ public/
31
31
 
32
32
  # Bower stuff.
33
33
  bower_components/
34
+
35
+ # Build stuff
36
+ amd/
37
+ lib/
38
+ es/
39
+ !tools/amd/
40
+ !tools/lib/
41
+ !tools/es/
42
+ !tools/dist/
43
+ !tools/docs/
44
+ tmp-bower-repo/
45
+ tmp-docs-repo/
46
+ .babel-cache/
47
+
48
+ .npmignore
data/README.md CHANGED
@@ -104,4 +104,8 @@ If you are creating an open source application under a license compatible with t
104
104
 
105
105
  ### Alternatives
106
106
 
107
- If you are looking for alternatives you can always use the [MIT licensed Dante (1)](https://michelson.github.io/Dante) or choose along others [medium clones](http://howtox.com/medium-editor-clones-in-js) or check out [many many awesome draft-js based editors](https://github.com/nikgraf/awesome-draft-js)
107
+ If you are looking for alternatives you can always use the [MIT licensed Dante (1)](https://michelson.github.io/Dante) or choose along others [medium clones](http://howtox.com/medium-editor-clones-in-js) or check out [many many awesome draft-js based editors](https://github.com/nikgraf/awesome-draft-js)
108
+
109
+ ### Acknowledgments
110
+
111
+ The code from `tools` is based on the build tools from [ReactBoostrap](https://github.com/react-bootstrap/react-bootstrap)
data/dante2.gemspec CHANGED
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
- lib = File.expand_path('../lib', __FILE__)
2
+ lib = File.expand_path('../rb_lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'dante2-editor/version'
5
5
 
@@ -13,7 +13,5 @@ Gem::Specification.new do |gem|
13
13
  gem.homepage = "http://michelson.github.io/Dante/"
14
14
 
15
15
  gem.files = `git ls-files`.split($/)
16
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
- gem.require_paths = ["lib"]
16
+ gem.require_paths = ["rb_lib"]
19
17
  end
@@ -18,12 +18,12 @@
18
18
 
19
19
  <a class="menu-button" target="_blank" href="https://michelson.github.io/dante2/license.html">
20
20
  License
21
- </a>
21
+ </a>
22
22
  </div>
23
23
 
24
24
 
25
25
  <img src=<%= require('images/site/dante-editor-logo.png') %> alt="dante editor" height="21">
26
- <span>Dante Editor - 0.2.0 </span>
26
+ <span>Dante Editor - 0.3.1 </span>
27
27
 
28
28
  </div>
29
29
 
@@ -23,7 +23,7 @@
23
23
  </div>
24
24
 
25
25
  <img src='https://michelson.github.io/dante2/images/dante-editor-logo.png' alt="dante editor" height="21">
26
- <span>Dante Editor - 0.2.0 </span>
26
+ <span>Dante Editor - 0.3.1 </span>
27
27
 
28
28
  </div>
29
29
 
@@ -6,10 +6,6 @@
6
6
  <!-- WARNING: for iOS 7, remove the width=device-width and height=device-height attributes. See https://issues.apache.org/jira/browse/CB-4323 -->
7
7
  <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
8
8
  <title>Dante2</title>
9
- <link rel="stylesheet" type="text/css" href="/application.css">
10
- <script src="/vendor.js"></script>
11
- <script src="/application.js"></script>
12
- <script>require('initialize');</script>
13
9
  </head>
14
10
  <body>
15
11
 
@@ -27,7 +23,7 @@
27
23
 
28
24
 
29
25
  <img src='https://michelson.github.io/dante2/images/dante-editor-logo.png' alt="dante editor" height="21">
30
- <span>Dante Editor - 0.2.0 </span>
26
+ <span>Dante Editor - 0.3.1 </span>
31
27
 
32
28
  </div>
33
29
 
File without changes
data/demo/data/poc.js ADDED
@@ -0,0 +1,9 @@
1
+ const empty = null
2
+
3
+ const demo = {"entityMap":{"0":{"type":"LINK","mutability":"MUTABLE","data":{"href":"https://www.thenation.com/article/italys-five-star-movement-may-be-the-heir-to-mussolinis-fascists/","url":"https://www.thenation.com/article/italys-five-star-movement-may-be-the-heir-to-mussolinis-fascists/"}},"1":{"type":"LINK","mutability":"MUTABLE","data":{"href":"http://www.theverge.com/2015/10/28/9625968/rating-system-on-demand-economy-uber-olive-garden","url":"http://www.theverge.com/2015/10/28/9625968/rating-system-on-demand-economy-uber-olive-garden"}},"2":{"type":"LINK","mutability":"MUTABLE","data":{"href":"https://www.washingtonpost.com/news/the-intersect/wp/2015/09/30/everyone-you-know-will-be-able-to-rate-you-on-the-terrifying-yelp-for-people-whether-you-want-them-to-or-not/","url":"https://www.washingtonpost.com/news/the-intersect/wp/2015/09/30/everyone-you-know-will-be-able-to-rate-you-on-the-terrifying-yelp-for-people-whether-you-want-them-to-or-not/"}},"3":{"type":"LINK","mutability":"MUTABLE","data":{"href":"http://www.techtimes.com/articles/136493/20160225/facebook-addiction-affects-brain-like-cocaine-gambling-study.htm","url":"http://www.techtimes.com/articles/136493/20160225/facebook-addiction-affects-brain-like-cocaine-gambling-study.htm"}},"4":{"type":"LINK","mutability":"MUTABLE","data":{"href":"https://www.epa.gov/pollinator-protection/colony-collapse-disorder","url":"https://www.epa.gov/pollinator-protection/colony-collapse-disorder"}},"5":{"type":"LINK","mutability":"MUTABLE","data":{"href":"http://www.nytimes.com/2015/02/15/magazine/how-one-stupid-tweet-ruined-justine-saccos-life.html","url":"http://www.nytimes.com/2015/02/15/magazine/how-one-stupid-tweet-ruined-justine-saccos-life.html"}},"6":{"type":"LINK","mutability":"MUTABLE","data":{"href":"https://wyss.harvard.edu/technology/autonomous-flying-microrobots-robobees/","url":"https://wyss.harvard.edu/technology/autonomous-flying-microrobots-robobees/"}},"7":{"type":"LINK","mutability":"MUTABLE","data":{"href":"http://www.governing.com/gov-data/safety-justice/drones-state-local-law-enforcement-agencies-license-list.html","url":"http://www.governing.com/gov-data/safety-justice/drones-state-local-law-enforcement-agencies-license-list.html"}},"8":{"type":"LINK","mutability":"MUTABLE","data":{"href":"http://www.parentherald.com/articles/73928/20161015/google-secures-patent-smart-contact-lenses-designed-diabetics.htm","url":"http://www.parentherald.com/articles/73928/20161015/google-secures-patent-smart-contact-lenses-designed-diabetics.htm"}},"9":{"type":"LINK","mutability":"MUTABLE","data":{"href":"http://mashable.com/2016/04/05/samsung-smart-contact-lenses-patent/#fV7S6EX8DaqP","url":"http://mashable.com/2016/04/05/samsung-smart-contact-lenses-patent/#fV7S6EX8DaqP"}},"10":{"type":"LINK","mutability":"MUTABLE","data":{"href":"https://www.cnet.com/news/sony-patents-contact-lens-that-records-what-you-see/","url":"https://www.cnet.com/news/sony-patents-contact-lens-that-records-what-you-see/"}},"11":{"type":"LINK","mutability":"MUTABLE","data":{"href":"https://backchannel.com/twitch-could-be-a-20-billion-dollar-company-inside-amazon-2507b7f9aa6d","url":"https://backchannel.com/twitch-could-be-a-20-billion-dollar-company-inside-amazon-2507b7f9aa6d"}},"12":{"type":"LINK","mutability":"MUTABLE","data":{"href":"http://www.thewildernessdowntown.com/","url":"http://www.thewildernessdowntown.com/"}},"13":{"type":"LINK","mutability":"MUTABLE","data":{"href":"http://nightmare.mit.edu/","url":"http://nightmare.mit.edu/"}},"14":{"type":"LINK","mutability":"MUTABLE","data":{"href":"http://www.theverge.com/a/luka-artificial-intelligence-memorial-roman-mazurenko-bot","url":"http://www.theverge.com/a/luka-artificial-intelligence-memorial-roman-mazurenko-bot"}},"15":{"type":"LINK","mutability":"MUTABLE","data":{"href":"http://www.nolo.com/legal-encyclopedia/a-plan-your-digital-legacy.html","url":"http://www.nolo.com/legal-encyclopedia/a-plan-your-digital-legacy.html"}},"16":{"type":"LINK","mutability":"MUTABLE","data":{"href":"https://www.safebeyond.com/","url":"https://www.safebeyond.com/"}},"17":{"type":"LINK","mutability":"MUTABLE","data":{"href":"http://www.newyorker.com/culture/culture-desk/the-story-of-amanda-todd","url":"http://www.newyorker.com/culture/culture-desk/the-story-of-amanda-todd"}},"18":{"type":"LINK","mutability":"MUTABLE","data":{"href":"http://www.theverge.com/2016/6/21/11995032/mark-zuckerberg-webcam-tape-photo","url":"http://www.theverge.com/2016/6/21/11995032/mark-zuckerberg-webcam-tape-photo"}},"19":{"type":"LINK","mutability":"MUTABLE","data":{"href":"http://www.cnn.com/2012/07/14/world/americas/brazil-alternative-sentence-reduction/","url":"http://www.cnn.com/2012/07/14/world/americas/brazil-alternative-sentence-reduction/"}},"20":{"type":"LINK","mutability":"MUTABLE","data":{"href":"https://www.humanbrainproject.eu/","url":"https://www.humanbrainproject.eu/"}},"21":{"type":"LINK","mutability":"MUTABLE","data":{"href":"http://time.com/4043311/david-cameron-pig-gate-scandal/","url":"http://time.com/4043311/david-cameron-pig-gate-scandal/"}},"22":{"type":"LINK","mutability":"MUTABLE","data":{"href":"http://news.bbc.co.uk/2/hi/uk_news/661139.stm","url":"http://news.bbc.co.uk/2/hi/uk_news/661139.stm"}},"23":{"type":"LINK","mutability":"MUTABLE","data":{"href":"https://windagainstcurrent.files.wordpress.com/2014/07/manhattanhenge-8.jpg","url":"https://windagainstcurrent.files.wordpress.com/2014/07/manhattanhenge-8.jpg"}}},"blocks":[{"key":"lcva","text":"When the dark sci-fi TV show Black Mirror premiered in the UK in 2011, the series seemed to offer a cautionary tale of how, if we’re not careful, our relationship to technology could go terribly wrong. Since then, the show has become a yardstick to measure how close we are to a harrowing future; in the past week, as we reel from the 2016 presidential election, the world of Black Mirror seems nearer than ever to our current reality—less a warning than a crystal ball.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":23,"style":"BOLD"},{"offset":29,"length":12,"style":"ITALIC"},{"offset":376,"length":12,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"fti9h","text":"What makes Black Mirror so chilling isn’t just its technologies, but their uncanny interplay with human behavior. The show can feel gratuitously pessimistic, yet it’s rooted in reality: nearly every scenario parallels something in our current world. In particular, an early episode disturbingly foreshadows the rise of Donald Trump.It’s impossible to write off Black Mirror as fiction. So we’ve decided to nail down the parallels between the nightmares on screen and our world today. And so we present: the real-life equivalents of Black Mirror’s dystopias, loosely ordered by how closely each episode reflects our current reality. Spoilers ahead.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":11,"length":12,"style":"ITALIC"},{"offset":361,"length":12,"style":"ITALIC"},{"offset":532,"length":12,"style":"ITALIC"},{"offset":632,"length":15,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"69em1","text":"","type":"image","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"enabled":false,"aspect_ratio":{"width":800,"height":14,"ratio":1.7500000000000002},"width":800,"height":14,"forceUpload":false,"url":"https://cdn-images-1.medium.com/max/800/1*7558zQdffG0nE6eA8sIudQ.png","loading_progress":0,"selected":false,"loading":false,"file":null,"direction":"center"}},{"key":"anhe0","text":"The Waldo Moment (season 2, episode 3)","type":"header-four","depth":0,"inlineStyleRanges":[{"offset":0,"length":38,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"6mstu","text":"oijkopkpkop","type":"image","depth":0,"inlineStyleRanges":[{"offset":0,"length":11,"style":"BOLD"}],"entityRanges":[],"data":{"enabled":false,"aspect_ratio":{"width":800,"height":401,"ratio":50.125},"width":800,"height":401,"forceUpload":false,"url":"https://cdn-images-1.medium.com/max/800/1*u9nzrQNXIo5pvNx9Ywfc7w.jpeg","loading_progress":0,"selected":false,"loading":false,"file":null,"direction":"center"}},{"key":"b31i7","text":"","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"2isb4","text":"In “The Waldo Moment,” a brash cartoon bear voiced by a comedian winds up winning over the British public and running for political office. Waldo uses humor (he’s a cartoon, after all) to separate himself from career politicians, and he gains popularity in part because of his vulgar disdain for the system and his running mates. Bright blue cartooniness aside, he’s more or less a prescient version of our President-elect.Sure, there are also some parallels here to Italy’s Five Star Movement, a growing, far-right political party started by a comedian who got crowds of malcontent Italians to shout “Fuck off!” at corrupt politicians. And yes, the circumstances under which Waldo enters the race stem from an Anthony Weiner-esque sexting scandal that forces an incumbent politician to step out of office. But Waldo’s rise to power eerily mirrors Donald Trump’s, especially considering that this episode of Black Mirror was penned long before there were any signs that Trump might actually secure the presidency in 2016.Waldo, like Trump, begins as a candidate perceived as a joke, only to win the favor of voters who enjoy his lack of filter and “refreshing” sincerity. Waldo, too, makes for good entertainment, and that’s enough to get him votes. The episode’s final scene, in which the cartoon bear reigns as global dictator and wields what appears to be a brutal police regime, now reads as a dark foreshadowing of what might come out of a Trump presidency—and it’s not funny at all.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":22,"style":"BOLD"},{"offset":908,"length":12,"style":"ITALIC"}],"entityRanges":[{"offset":475,"length":18,"key":0}],"data":{}},{"key":"2udte","text":"Nosedive (season 3, episode 1)","type":"header-four","depth":0,"inlineStyleRanges":[{"offset":0,"length":30,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"9p0jl","text":"","type":"image","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"enabled":false,"aspect_ratio":{"width":800,"height":401,"ratio":50.125},"width":800,"height":401,"forceUpload":false,"url":"https://cdn-images-1.medium.com/max/800/1*VSYQZNBOryr5kxstmUKGKg.jpeg","loading_progress":0,"selected":false,"loading":false,"file":null,"direction":"center"}},{"key":"26fqh","text":"In the world of this episode, rating friends, coworkers, service workers, and even passersby is standard practice, and those crucial ratings determine everything from your career trajectory to your rent. It’s not so different from what we already see in the on-demand economy — Uber drivers, for example, are deactivated when they fall under a 4.6. One company has gone even further: Peeple endeavored to offer a rating system for people, regardless of whether they consented to be included. After the app was eviscerated by the press, it launched this March as a watered-down, opt-in version of the original concept. Perhaps fittingly, it now boasts a one-star rating in the iTunes app store.But what feels most immediately familiar in “Nosedive” is the way that protagonist Lacie (Bryce Dallas Howard) lights up each time she receives a positive rating. It’s only a slight exaggeration of the psychological rewardsmost people experience with every Facebook like or tweet fave. Case in point: while writing this paragraph, I checked the likes on my most recent Instagram approximately 13 times.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":29,"style":"BOLD"}],"entityRanges":[{"offset":309,"length":11,"key":1},{"offset":405,"length":32,"key":2},{"offset":895,"length":21,"key":3}],"data":{}},{"key":"c6rn8","text":"Hated in the Nation (season 3, episode 6)","type":"header-four","depth":0,"inlineStyleRanges":[{"offset":0,"length":41,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"6t14b","text":"","type":"image","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"enabled":false,"aspect_ratio":{"width":800,"height":401,"ratio":50.125},"width":800,"height":401,"forceUpload":false,"url":"https://cdn-images-1.medium.com/max/800/1*gnRUO5LE1qyOXMVo05BjZA.jpeg","loading_progress":0,"selected":false,"loading":false,"file":null,"direction":"center"}},{"key":"favaa","text":"In this episode, a hacker has figured out how to weaponize social media outrage. Each day, the most hated person on the internet faces a grisly death at the hands of hacked drone bees, thousands of which have been deployed as a solution to the bee-killing Colony Collapse Disorder. Though no furious social media mob in our current world has yet managed to commit murder, the tools for viral outrage are amply abused: Death threats run amok on the internet, and public outrage has managed to end careers and ruin lives. (See, for example, the stories of Justine Sacco and Lindsey Stone, who faced job-ending public shame after making misguided—but, in the grand scheme of things, fairly innocuous— posts to social media.)And those autonomous drone bees? A team at Harvard’s School of Engineering and Applied Sciences has been developing them for over a decade (and will hopefully make them as unhackable as possible). Autonomous Flying Microrobots, or RoboBees, are intended for potential use in cross-pollination, search and rescue missions, and surveillance.Speaking of surveillance, that’s another theme Black Mirror manages to pack into this episode: The drone bees have also been covertly conscripted by the British government to monitor the nation. In the real world, multiple municipalities across the country have adopted surveillance drones; notably, the ACLU recently found that the FBI had employed them in Baltimore during the protests over Freddie Gray’s killing. Mass surveillance—much like online abuse and robotic drone bees—is a reality. All that keeps this episode from becoming prescient documentary is a vigilante hacker coopting these forces to make a twisted public statement.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":16,"style":"BOLD"},{"offset":1107,"length":12,"style":"ITALIC"}],"entityRanges":[{"offset":256,"length":24,"key":4},{"offset":539,"length":46,"key":5},{"offset":952,"length":8,"key":6},{"offset":1322,"length":27,"key":7}],"data":{}},{"key":"28ekg","text":"Entire History of You (season 1, episode 3)","type":"header-four","depth":0,"inlineStyleRanges":[{"offset":0,"length":43,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"agdh8","text":"","type":"header-four","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"dido0","text":"","type":"image","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"enabled":false,"aspect_ratio":{"width":800,"height":401,"ratio":50.125},"width":800,"height":401,"forceUpload":false,"url":"https://cdn-images-1.medium.com/max/800/1*gJkyxh7jfu5hEgs6QJxnyA.jpeg","loading_progress":0,"selected":false,"loading":false,"file":null,"direction":"center"}},{"key":"6uhib","text":"In this episode’s world, most people sport a “Grain” — an implant and interactive contact lens system that allows them to record every moment of their lives and replay at will. It’s Google Glass on steroids, shrunk down and stuck inside our eyeballs. That technology is in the works: Google recently patented a smart contact lens that could wirelessly send data to any internet-connected device; similarly, Samsung and Sony have each patented smart contact lenses that could double as cameras. In “Entire History of You,” people also curate their Grains like you might selectively edit your social feeds today: on the Grain, you can get rid of an unsavory memory (like deleting a painful “On This Day” notification from Facebook) or replay one of your “greatest hits,” much as you might scroll your Instagrams of a particularly enjoyable trip.Meticulously recording one’s life in real time predates the futuristic lenses featured in this episode. In 1978, for instance, Steve Mann began developing a prosthetic that allowed his eye to function as both a camera and a TV display; in the early aughts, Gordon Bell similarly experimented with “lifelogging,” wearing a camera that took a photo every 30 seconds. Y Combinator partner Justin Kan has also been a prominent practitioner of this type of self-surveillance: For eight months in 2007 he streamed every moment of his life before shutting down that experiment and starting up the popular live-streaming service Twitch. Of course, beyond a few experimental technologists, it’s unclear whether the broader public wants real-time documentation of their every moment—and Black Mirror’s take is a pretty harrowing campaign against it.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":24,"style":"BOLD"},{"offset":1564,"length":5,"style":"ITALIC"},{"offset":1620,"length":13,"style":"ITALIC"}],"entityRanges":[{"offset":300,"length":29,"key":8},{"offset":407,"length":7,"key":9},{"offset":419,"length":4,"key":10},{"offset":1433,"length":37,"key":11}],"data":{}},{"key":"1qnu1","text":"Playtest (season 3, episode 2)","type":"header-four","depth":0,"inlineStyleRanges":[{"offset":0,"length":30,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"e37e8","text":"","type":"image","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"enabled":false,"aspect_ratio":{"width":800,"height":401,"ratio":50.125},"width":800,"height":401,"forceUpload":false,"url":"https://cdn-images-1.medium.com/max/800/1*bPQ7oBPEOg0ISwLUnsjLSw.jpeg","loading_progress":0,"selected":false,"loading":false,"file":null,"direction":"center"}},{"key":"bfgin","text":"“Playtest” follows wanderlust-stricken Cooper (Wyatt Russell) as he offers himself as a test subject for an augmented reality horror game—an experiment that turns fatal. All the tenets of this episode link back to reality: First, there’s the barely disguised TaskRabbit (dubbed “OddJobs”) on which Cooper finds his game-testing gig. The game he ends up playing is a mix of Pokémon Go and the myriad other augmented reality games out there; it also draws from biofeedback-enhanced games, such as Nevermind, which read players’ stress levels and adjust gameplay accordingly.But what really brings the terror in “Playtest” is that the game uses a neural net to learn and build on the player’s worst fears. For Cooper, those include spiders, a deranged doppelgänger of his recent hookup, and his mother suffering from Alzheimer’s. It’s a terrifying version of that 2010 Arcade Fire music video, which used Google Maps and html5 to set the video in the viewer’s childhood neighborhood. Pair that with MIT’s Nightmare Machineproject, which makes even the most innocuous of images scary, and you’ve got something pretty close to the freaky tech presented here — lethal side effects (hopefully) not included.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":45,"style":"BOLD"}],"entityRanges":[{"offset":878,"length":11,"key":12},{"offset":996,"length":23,"key":13}],"data":{}},{"key":"284s1","text":"Be Right Back (season 2, episode 1)","type":"header-four","depth":0,"inlineStyleRanges":[{"offset":0,"length":35,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"5ejn4","text":"","type":"image","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"enabled":false,"aspect_ratio":{"width":800,"height":401,"ratio":50.125},"width":800,"height":401,"forceUpload":false,"url":"https://cdn-images-1.medium.com/max/800/1*SODulysFlTl6eiGUwln2GQ.jpeg","loading_progress":0,"selected":false,"loading":false,"file":null,"direction":"center"}},{"key":"29bof","text":"After a car accident kills her partner, Martha (Hayley Atwell) uses a service to mine his online presence and recreate him: first as a chatbot, then a voice on the phone, and finally, most eerily, as a physical replica. Since the episode’s airing in 2013, the chatbot iteration of this technology has essentially been replicated: As detailed in The Verge, when Russian technologist Eugenia Kuyda’s close friend Roman died, she trained a bot to speak in his “voice” by feeding it hundreds of digital exchanges they had shared.Chatbots from beyond the grave aside, the question of what happens to the traces of ourselves that we leave online when we die is of the moment: Numerous companies offer services to help people manage their digital legacies. And Kuyda’s not the only entrepreneur to have attempted some version of the technology presented in “Be Right Back.” A startup called Eterni.me, for instance, promises that it’ll preserve you forever as a digital avatar, while Chatbot.me claims to be able to create a Twitter bot that sounds just like you. (In my personal experimentations, that latter bot just sounds deranged—but maybe that’s just me.)","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":39,"style":"BOLD"},{"offset":345,"length":10,"style":"ITALIC"}],"entityRanges":[{"offset":333,"length":8,"key":14},{"offset":689,"length":5,"key":15},{"offset":695,"length":8,"key":16}],"data":{}},{"key":"17h6j","text":"Shut Up and Dance (season 3, episode 3)","type":"header-four","depth":0,"inlineStyleRanges":[{"offset":0,"length":39,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"62dar","text":"","type":"image","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"enabled":false,"aspect_ratio":{"width":800,"height":401,"ratio":50.125},"width":800,"height":401,"forceUpload":false,"url":"https://cdn-images-1.medium.com/max/800/1*6cWjeI5k0SOxNl0trJTX_w.jpeg","loading_progress":0,"selected":false,"loading":false,"file":null,"direction":"center"}},{"key":"9t8q3","text":"In “Shut Up and Dance,” 19-year-old Kenny (Alex Lawther) downloads malware to his laptop, allowing hackers to film him masturbating to porn; that video then becomes ammunition for increasingly dark blackmail. Kenny’s not the hero—it turns out he was watching child pornography—but the hackers’ extortion of his panic echoes real-world ransomware attacks and “sextortion” scandals, maybe most notably the case of Amanda Todd, who was driven to suicide in 2012 after years of extortion and manipulation by an online stranger who’d collected topless photos of her.Kenny follows through on increasingly insane demands as the episode progresses: he robs a bank; he fights another blackmail victim to the death. Yet after all that, his hackers release the video anyway, with no explanation beyond a class Trollface meme—an echo of the hacking group LulzSec’s logo. Though Kenny winds up not so sympathetic, his plight is a chilling reminder that Mark Zuckerberg’s not crazy: You might just want to cover up that webcam.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":23,"style":"BOLD"}],"entityRanges":[{"offset":412,"length":11,"key":17},{"offset":940,"length":27,"key":18}],"data":{}},{"key":"5fcv3","text":"White Christmas (season 2, episode 4)","type":"header-four","depth":0,"inlineStyleRanges":[{"offset":0,"length":37,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"4fiur","text":"","type":"image","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"enabled":false,"aspect_ratio":{"width":800,"height":401,"ratio":50.125},"width":800,"height":401,"forceUpload":false,"url":"https://cdn-images-1.medium.com/max/800/1*wuL3VA4AgbpdMfs9RCIUwg.jpeg","loading_progress":0,"selected":false,"loading":false,"file":null,"direction":"center"}},{"key":"b9d70","text":"In Black Mirror’s Christmas special, a man enlists the help of relationship coach Matt (Jon Hamm), who uses smart contact lenses to watch him interact with women and offer him real-time advice. As in “Entire History of You,” camera-enabled lenses are certainly under development; Matt’s dating service isn’t so far from what’s available today, either. Jyst, for example, is an app that allows people to crowdsource dating advice, while Relationup lets you text a designated dating coach in real time.The dating service, however, is just Matt’s side project: his day job is torturing artificially intelligent home assistants into submission. An assistant is an exact replica of the brain of its owner, stashed in an object bearing an uncanny resemblance to Google Home. The upside: your assistant knows your exact preferences and can keep your home perfectly to your liking. The downside: It’s self aware, trapped, and has to be trained into compliance. It’s pretty futuristic AI—but give Google Home another few generations, and maybe we’ll all be cloning our consciousnesses into obedient domestic slaves.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":2,"style":"BOLD"},{"offset":3,"length":33,"style":"BOLD"},{"offset":3,"length":12,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"13aa","text":"Fifteen Million Merits (season 1, episode 2)","type":"header-four","depth":0,"inlineStyleRanges":[{"offset":0,"length":44,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"df89e","text":"","type":"image","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"enabled":false,"aspect_ratio":{"width":800,"height":401,"ratio":50.125},"width":800,"height":401,"forceUpload":false,"url":"https://cdn-images-1.medium.com/max/800/1*LXNImOG3Hp8MTn6JeBlqyg.jpeg","loading_progress":0,"selected":false,"loading":false,"file":null,"direction":"center"}},{"key":"ch54g","text":"In the world of “Fifteen Million Merits,” people spend their days riding electricity-generating stationary bikes, watching reality shows to pass the time. As they bike, they earn credits, which let them enter a reality show called Hot Shots. Getting on that show, a dark amalgam of American Idol and X Factor, is the only way to escape an endless future of cycling: Much as today’s reality shows lure contestants with the possibility of instant fame, Hot Shots promises its winners a life of luxury.But it’s the cycling that has the strongest real-world ties. Today, apps like Pact allow users to earn cash for meeting health goals, and generators like Pedal-A-Watt use cycling to generate electricity. Even more on the nose, in 2012 — the year after this episode aired — a Brazilian prison offered inmates the opportunity to reduce their sentences by cycling on stationary bikes to charge car batteries: For every three days an inmate biked, he could shave one day off of his sentence.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":41,"style":"BOLD"},{"offset":231,"length":9,"style":"ITALIC"},{"offset":282,"length":13,"style":"ITALIC"},{"offset":300,"length":8,"style":"ITALIC"},{"offset":451,"length":9,"style":"ITALIC"},{"offset":745,"length":5,"style":"ITALIC"}],"entityRanges":[{"offset":791,"length":31,"key":19}],"data":{}},{"key":"1iond","text":"Men Against Fire (season 3, episode 5 )","type":"header-four","depth":0,"inlineStyleRanges":[{"offset":0,"length":39,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"692t6","text":"","type":"image","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"enabled":false,"aspect_ratio":{"width":800,"height":401,"ratio":50.125},"width":800,"height":401,"forceUpload":false,"url":"https://cdn-images-1.medium.com/max/800/1*qf7CX4IYmgLGcISKFaDyEw.jpeg","loading_progress":0,"selected":false,"loading":false,"file":null,"direction":"center"}},{"key":"8lvfd","text":"A technologically enhanced soldier, Stripe (Malachi Kirby), seeks to eradicate what appears to be a zombie plague by hunting down infected human “roaches,” now reduced to Nosferatu doppelgängers. As it turns out, the “roaches” aren’t zombies at all—they’re average people deemed “undesirable” by some greater political power that’s running a eugenics program. An augmented reality system, fed by the soldiers’ neural implants, makes these people look inhuman—think Snap lenses, projected onto your eyeballs without your explicit consent.The point of the implant is to reduce the soldiers’ empathy, eliminating PTSD by allowing them to kill off vulnerable populations without guilt. It works—that is, until a virus infects Stripe’s implant, letting him see that he’s unknowingly killing off innocent people. The idea that we could rid soldiers of empathy is chilling, and in many ways these soldiers seem like the logical progression of projects such as the US military’s Nett Warrior and France’s “Future Soldier” programs, which equip troops with high-tech communications systems. Most notably, however, this episode seems like a parable of what right-wing Trump-fueled nationalism and xenophobia might bring about—technology only aids in the mission.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":35,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"6uprp","text":"San Junipero (season 3, episode 4 )","type":"header-four","depth":0,"inlineStyleRanges":[{"offset":0,"length":35,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"48kt0","text":"","type":"image","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"enabled":false,"aspect_ratio":{"width":800,"height":401,"ratio":50.125},"width":800,"height":401,"forceUpload":false,"url":"https://cdn-images-1.medium.com/max/800/1*exG3QaU4M3UcKyBfzEjkEA.jpeg","loading_progress":0,"selected":false,"loading":false,"file":null,"direction":"center"}},{"key":"c5v9","text":"In this episode, people can live forever in virtual reality by uploading their consciousnesses after death. It’s basically futurist Ray Kurzweil’s fantasy turned reality: He predicts we’ll be able to digitize our persons by 2045. We’re certainly not there yet—though initiatives to better understand the science of the human brain, like the Human Brain Project, are nudging us closer.What makes this episode particularly powerful is its protagonist’s motivations for prematurely “crossing over” to the virtual afterlife. Now elderly, Yorkie (Mackenzie Davis) has been paralyzed since 21, and for her, San Junipero isn’t an afterlife so much as a chance at fully experiencing life itself. It echoes the ways that many people with disabilities engage with virtual worlds such as Second Life and InWorldz, living there in ways they can’t in the physical world. We may be a long way from coding a virtual heaven, but the concept of virtual realities allowing people to broaden their life experiences isn’t fiction at all.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":16,"style":"BOLD"}],"entityRanges":[{"offset":341,"length":19,"key":20}],"data":{}},{"key":"egdol","text":"The National Anthem (season 1, episode 1)","type":"header-four","depth":0,"inlineStyleRanges":[{"offset":0,"length":41,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"3sc3e","text":"","type":"image","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"enabled":false,"aspect_ratio":{"width":800,"height":401,"ratio":50.125},"width":800,"height":401,"forceUpload":false,"url":"https://cdn-images-1.medium.com/max/800/1*uXZdF0yUsRAnqZ66Jg89EA.jpeg","loading_progress":0,"selected":false,"loading":false,"file":null,"direction":"center"}},{"key":"f2fqe","text":"In Black Mirror’s cringe-worthy pilot, Britain’s princess has been kidnapped and will only be released if the Prime Minister has sex with a pig on live television. Spoiler alert: he does. “The National Anthem” successfully functions as a scathing commentary on our society’s desire for sensationalism at any cost, yet it doesn’t take many fictional leaps. Indeed, the world it portrays is so similar to ours that it even bears coincidental resemblance to the tabloid-fueled “Piggate” rumors that erupted last fall (years after the episode premiered) accusing then-Prime Minister David Cameron of inserting his genitals in a dead pig’s mouth. Needless to say, whatever Cameron did or did not do with the pig was definitely notstreamed live for all of Britain to see.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":2,"style":"BOLD"},{"offset":3,"length":35,"style":"BOLD"},{"offset":3,"length":12,"style":"ITALIC"},{"offset":722,"length":3,"style":"ITALIC"}],"entityRanges":[{"offset":475,"length":7,"key":21}],"data":{}},{"key":"dlpuj","text":"White Bear (season 2, episode 2)","type":"header-four","depth":0,"inlineStyleRanges":[{"offset":0,"length":32,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"ebs45","text":"","type":"image","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"enabled":false,"aspect_ratio":{"width":800,"height":401,"ratio":50.125},"width":800,"height":401,"forceUpload":false,"url":"https://cdn-images-1.medium.com/max/800/1*BDMCIns12g67lhhQX2m96Q.jpeg","loading_progress":0,"selected":false,"loading":false,"file":null,"direction":"center"}},{"key":"caf0j","text":"In “White Bear” we watch Victoria (Lenora Crichlow) navigate a desolate world in which she’s trailed by cell phone zombies and violent predators. It turns out that the scenario is meant to be a fitting punishment: Victoria is being made to relive this nightmare after helping her boyfriend kidnap and murder a young girl, filming it all on her cell phone. Victoria’s story is loosely modeled on the Moors murders: Ian Brady and Myra Hindley abducted and murdered five children, earning Hindley the title of “most evil woman in Britain” (though in real life, the murderers were not punished by public torture or repeated memory wiping).Before this episode’s third-act twist, it appears to be making a statement about our tendency to disappear into our devices rather than experiencing the world firsthand (see: photos of hundreds of cell phone-wielding New Yorkers documenting Manhattanhenge). It then becomes clear that the people with the cell phones aren’t zombies at all, but rather attendees at the theme park that is the protagonist’s torture chamber. They’ve been told to film her, but ignore her pleas for help, mirroring Victoria’s own actions as she filmed her victim’s torture.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":33,"style":"BOLD"}],"entityRanges":[{"offset":498,"length":5,"key":22},{"offset":810,"length":6,"key":23}],"data":{}},{"key":"e7nlc","text":"","type":"image","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"enabled":false,"aspect_ratio":{"width":800,"height":14,"ratio":1.7500000000000002},"width":800,"height":14,"forceUpload":false,"url":"https://cdn-images-1.medium.com/max/800/1*GpmBzpGpmYrfDNiqABzipw.png","loading_progress":0,"selected":false,"loading":false,"file":null,"direction":"center"}},{"key":"9f7el","text":"Are you, too, turning to the dystopian world of Black Mirror as a dark oracle of things to come? Or maybe you’re just enjoying it for its entertainment value? Either way, if we missed a real-world parallel, let us know below.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":13,"style":"BOLD"},{"offset":48,"length":12,"style":"ITALIC"}],"entityRanges":[],"data":{}}]}
4
+
5
+ export const Readme = {"entityMap":{"0":{"type":"LINK","mutability":"MUTABLE","data":{"url":"https://michelson.github.io/Dante/"}},"1":{"type":"LINK","mutability":"MUTABLE","data":{"url":"https://michelson.github.io/dante2/doc.html"}},"2":{"type":"LINK","mutability":"MUTABLE","data":{"href":"https://www.gnu.org/licenses/gpl-3.0.html","url":"https://www.gnu.org/licenses/gpl-3.0.html"}},"3":{"type":"LINK","mutability":"MUTABLE","data":{"href":"https://michelson.github.io/dante2/license.html","url":"https://michelson.github.io/dante2/license.html"}},"4":{"type":"LINK","mutability":"MUTABLE","data":{"url":"https://michelson.github.io/Dante/"}},"5":{"type":"LINK","mutability":"MUTABLE","data":{"url":"http://howtox.com/medium-editor-clones-in-js/"}},"6":{"type":"LINK","mutability":"MUTABLE","data":{"url":"https://github.com/nikgraf/awesome-draft-js"}}},"blocks":[{"key":"761n6","text":"Dante II - The rematch","type":"header-one","depth":0,"inlineStyleRanges":[{"offset":0,"length":22,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"4d32s","text":"just another medium clone built on top of DraftJs","type":"header-two","depth":0,"inlineStyleRanges":[{"offset":0,"length":49,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"es43u","text":"","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"efvk7","text":"Dante II is a complete rewrite of DanteEditor. This version is built on top of Facebook's Draft-Js and reaches all Dante's features with a shiny ultra mega super uber maintainable architecture.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[{"offset":34,"length":11,"key":0}],"data":{}},{"key":"1vpkk","text":"This is a live demo:","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"56pap","text":"Please click the image or type everywere. Use it as you were using Medium. Have fun!","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"cuiuq","text":"","type":"image","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"enabled":false,"aspect_ratio":{"width":245,"height":223,"ratio":91.02040816326532},"width":245,"height":223,"forceUpload":false,"url":"https://media.giphy.com/media/LFSKh2FcRiFIQ/giphy.gif","loading_progress":0,"selected":false,"loading":true,"file":null,"direction":"center"}},{"key":"a4fmi","text":"Why rewrite a new version of Dante?","type":"header-two","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"9doa2","text":"The previous version of Dante relies a lot on DOM manipulation which causes a mix of presentation and logic. Even with their modular plugin system this condition suppose an sphagetti model to work with on every feature. The biggest problem with this approach is: if you want to make a change that affects the presentation of your users content, let's say you might want to change the default markup for paragraphs, you'll probably end updating all your content in your database, because dealing with \"DOM only\" suppose that you are going to save html into database, right ?","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"d64sc","text":"A redesign was needed!","type":"header-two","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"3jr17","text":"Draft-Js handles selection, ranges and markup blocks as a data layer contained in a structure known as editorState, with a clear separation on how rendering, styling and interaction works. So you save content data, not html. That's awesome because you can change the appearance of articles (styles & markup) without database changes. ","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":103,"length":13,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"9o709","text":"In Draft every change provided from user input is stacked in this editorState building an history of changes, out of the box. This means that pasting, undo/redo and replace/insert blocks at certain selection points are basically calls to the DraftJs API that updates the editorState without DOM manipulation. Also, all the custom blocks are composed as React components!. So, this version have some dependencies which are included in source. DraftJs, React, Immutable. no Jquery.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":66,"length":11,"style":"ITALIC"},{"offset":269,"length":11,"style":"ITALIC"},{"offset":351,"length":17,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"3die6","text":"New Features:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":13,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"c5o1","text":"Improved undo/redo.","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"s1rv","text":"Save Content as a data JSON structure.","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"6j5e9","text":"Load Content as a data JSON structure.","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"5iec6","text":"Handle image blocks on Copy/Paste and Drop.","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"ese26","text":"Global storage lock to handle file uploads.","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"bmj79","text":"Features:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":9,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"79ode","text":"Image upload for paste html.","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"s4sq","text":"Image upload for legacy images on existent texts.","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"4eq3s","text":"The medium (+) Tooltip to embed or upload media.","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"du9t3","text":"Tab navigation.","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"fap2m","text":"Pluggins are React components","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"5q9ck","text":"Embeds:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":7,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"e2lgl","text":"Image Uploader with preview and caption option with a lock system.","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"fnh91","text":"Embed data for pasted link through OEmbed services.","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"972kk","text":"Embed media information for pasted links through OEmbed services.","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"fh9nc","text":"Add or remove tooltip buttons with ease with plugin system.","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"4lrj5","text":"Add custom blocks many with custom options","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"3ibt6","text":"Usage","type":"header-two","depth":0,"inlineStyleRanges":[{"offset":0,"length":5,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"4agc1","text":"The interface to initialize is almost as the previous Dante version.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"8og8n","text":"new Dante(\n {\n upload_url: \"http://localhost:9292/uploads/new\",\n store_url: \"http://localhost:3333/store.json\",\n el: \"app\"\n }\n)","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"2h4m8","text":"Configurable options","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"c6hpj","text":"see many options in the documentation page","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":42,"style":"ITALIC"}],"entityRanges":[{"offset":24,"length":18,"key":1}],"data":{}},{"key":"8eikj","text":"Installation for development","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"7dd8","text":"node + webpack","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":14,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"1ts2g","text":"$ npm install or yarn install","type":"code-block","depth":0,"inlineStyleRanges":[{"offset":0,"length":13,"style":"ITALIC"},{"offset":17,"length":12,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"449oi","text":"web dev server","type":"header-four","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"1hrfs","text":"$ npm start or yarn start","type":"code-block","depth":0,"inlineStyleRanges":[{"offset":0,"length":11,"style":"ITALIC"},{"offset":15,"length":10,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"eq5ht","text":"Then open http://localhost:8080 ","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":32,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"6qd6m","text":"Build","type":"header-four","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"al89k","text":"$ npm build or yarn build","type":"code-block","depth":0,"inlineStyleRanges":[{"offset":0,"length":11,"style":"ITALIC"},{"offset":15,"length":10,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"6l12i","text":"Upload test server (ruby, optional)","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":35,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"5ur4a","text":"For development purposes we have a server, written in ruby, to handle file uploading","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"8pjcf","text":"$ bundle install","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"19kdt","text":"$ rackup","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"4kdt5","text":"and open http://localhost:9292","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"1f6cl","text":"As rubists we are you can install this library as a gem file.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"fiutc","text":"Just add the gem as dante2-editor","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":20,"length":13,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"air4n","text":"Open source & Commercial license","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"bhmof","text":"If you are creating an open source application under a license compatible with the GNU GPL license v3, you may use Dante2 under the terms of the GPLv3.\nRead more about Dante2's license.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":83,"length":18,"style":"UNDERLINE"},{"offset":152,"length":32,"style":"UNDERLINE"}],"entityRanges":[{"offset":83,"length":18,"key":2},{"offset":152,"length":32,"key":3}],"data":{}},{"key":"9d6pe","text":"Alternatives","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"9q9mo","text":"If you are looking for alternatives you can always use the MIT licensed Dante (1) or choose along others medium clones or check out many many awesome draft-js based editors","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[{"offset":59,"length":22,"key":4},{"offset":105,"length":13,"key":5},{"offset":132,"length":40,"key":6}],"data":{}}]};
6
+
7
+ export const License = {"entityMap":{"0":{"type":"LINK","mutability":"MUTABLE","data":{"href":"https://www.gnu.org/licenses/gpl-3.0.html","url":"https://www.gnu.org/licenses/gpl-3.0.html"}},"1":{"type":"LINK","mutability":"MUTABLE","data":{"href":"https://www.gnu.org/licenses/gpl-3.0.html#section5","url":"https://www.gnu.org/licenses/gpl-3.0.html#section5"}},"2":{"type":"LINK","mutability":"MUTABLE","data":{"href":"https://www.gnu.org/licenses/gpl-faq.html#GPLRequireSourcePostedPublic","url":"https://www.gnu.org/licenses/gpl-faq.html#GPLRequireSourcePostedPublic"}},"3":{"type":"LINK","mutability":"MUTABLE","data":{"url":"https://gum.co/dante2-dev"}},"4":{"type":"LINK","mutability":"MUTABLE","data":{"url":"https://gum.co/dante2-team"}},"5":{"type":"LINK","mutability":"MUTABLE","data":{"url":"https://gum.co/dante2-orgs"}},"6":{"type":"LINK","mutability":"MUTABLE","data":{"url":""}},"7":{"type":"LINK","mutability":"MUTABLE","data":{"url":"mailto:miguelmichelson@gmail.com"}},"8":{"type":"LINK","mutability":"MUTABLE","data":{"url":"mailto:miguelmichelson@gmail.com"}},"9":{"type":"LINK","mutability":"MUTABLE","data":{"href":"https://www.gnu.org/licenses/gpl-3.0.html","url":"https://www.gnu.org/licenses/gpl-3.0.html"}}},"blocks":[{"key":"e2vjv","text":"License","type":"header-one","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"4afkt","text":"Dante2 licenses","type":"header-two","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"asno5","text":"Dante2 has three kinds of licenses: open-source, commercial, and OEM.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"agtfa","text":"Open source license","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"4on6a","text":"The open source license is designed for you to use Dante2 to build open source and personal projects. The Dante2 open source license is GPLv3. The GPLv3 has many terms, but the most important is how it is sticky when you distribute your work publicly. From the GPL FAQ:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":205,"length":6,"style":"ITALIC"}],"entityRanges":[{"offset":136,"length":5,"key":0},{"offset":199,"length":51,"key":1},{"offset":261,"length":7,"key":2}],"data":{}},{"key":"f4ilr","text":"If you release the modified version to the public in some way, the GPL requires you to make the modified source code available to the program's users, under the GPL.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"c7vh6","text":"Releasing your project that uses Dante2 under the GPLv3, in turn, requires your project to be licensed under the GPLv3. If you are okay with this, feel free to use Dante2 under the GPLv3, without purchasing a commercial license.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"6cbmu","text":"Commercial license","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"ar9p0","text":"The commercial license is designed to for you to use Dante2 in commercial products and applications, without the provisions of the GPLv3. With the commercial license, your code is kept propietary, to yourself. If you want to use Dante2 to develop commercial sites, themes, projects, and applications, the commercial license is the appropriate license.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"2t0sl","text":"Purchasing a commercial license","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"5pf5","text":"Purchasing takes a minute. Our purchasing form accepts credit cards or PayPal. Once purchased, you’ll receive a commercial license PDF and you will be all set to use Dante2 in your commercial applications. With the purchase of a commercial license:","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"fem8b","text":"You may use Dante2 in as many commercial applications you like.","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"dudrf","text":"You may use Dante2 in your own commercial applications and products. For example: premium WordPress, Tumblr, or other CMS themes, plugins and templates.","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"5n9ki","text":"Customers and users of your products do not need to purchase their own license — so long as they are not developing their own commercial products with Dante2.","type":"unordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"5d82a","text":"Commercial Licenses are priced per team member. A team member is someone on your team working on a project that uses Dante2. The Dante2 Commercial Developer License is for individual developers. Each individual developer or team member needs to purchase a separate license.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":129,"length":35,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"6hdu9","text":"Dante2 Commercial Developer License for 1 developer $25 ","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":18,"length":9,"style":"BOLD"},{"offset":36,"length":16,"style":"ITALIC"}],"entityRanges":[{"offset":0,"length":55,"key":3}],"data":{}},{"key":"5l15v","text":"ttps://gum.co/dante2-dev","type":"embed","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"provisory_text":"https://gum.co/dante2-dev","endpoint":"//api.embed.ly/1/extract?key=86c28a410a104c8bb58848733c82f840&url=","type":"embed","embed_data":{"original_url":"https://gum.co/dante2-dev","provider_url":"http://gumroad.com","entities":[],"cache_age":86400,"favicon_url":"https://gumroad.com/favicon.ico","media":{"width":670,"html":"<iframe class=\"embedly-embed\" src=\"https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgumroad.com%2Fl%2FFtWIm%3Fas_embed%3Dtrue&url=https%3A%2F%2Fgumroad.com%2Fl%2Fdante2-dev&image=https%3A%2F%2Fstatic-2.gumroad.com%2Fres%2Fgumroad%2F210946281731%2Fasset_previews%2Ffa112fec60cb83d7232c888b4a3fbc7f%2Fretina%2Fcover.png&key=d42b91026ea041c0875fd61ff736cb79&type=text%2Fhtml&schema=gumroad\" width=\"670\" height=\"670\" scrolling=\"no\" frameborder=\"0\" allowfullscreen></iframe>","type":"rich","height":670},"authors":[],"keywords":[{"score":59,"name":"app"},{"score":24,"name":"download"},{"score":20,"name":"text"},{"score":17,"name":"password"},{"score":17,"name":"store"},{"score":14,"name":"link"},{"score":10,"name":"dante2"},{"score":8,"name":"please"},{"score":8,"name":"access"},{"score":6,"name":"account"}],"related":[],"safe":true,"published":null,"url":"https://gumroad.com/l/dante2-dev","offset":null,"provider_display":"gumroad.com","title":"Dante2 - Commercial Developer License","images":[{"url":"https://static-2.gumroad.com/res/gumroad/210946281731/asset_previews/fa112fec60cb83d7232c888b4a3fbc7f/retina/cover.png","width":873,"size":21037,"caption":null,"height":447}],"language":"English","provider_name":"Gumroad","content":null,"embeds":[],"type":"html","app_links":[],"favicon_colors":[{"color":[0,0,0],"weight":0.0197753906},{"color":[22,166,166],"weight":0.016357421900000002},{"color":[198,60,47],"weight":0.0109863281},{"color":[223,109,47],"weight":0.0104980469},{"color":[0,132,191],"weight":0.0048828125}],"lead":null,"description":"Grants commercial use of Dante2 for a single developer."},"error":""}},{"key":"d1csd","text":"The Dante2 Commercial Team License is for up to 8 team members. ","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":4,"length":30,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"eth0","text":"Dante2 Commercial Team License for up to 8 developers $110","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":18,"length":4,"style":"BOLD"},{"offset":31,"length":23,"style":"ITALIC"}],"entityRanges":[{"offset":0,"length":58,"key":4}],"data":{}},{"key":"ar11p","text":"ttps://gum.co/dante2-team","type":"embed","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"provisory_text":"https://gum.co/dante2-team","endpoint":"//api.embed.ly/1/extract?key=86c28a410a104c8bb58848733c82f840&url=","type":"embed","embed_data":{"original_url":"https://gum.co/dante2-team","provider_url":"http://gumroad.com","entities":[],"cache_age":86400,"favicon_url":"https://gumroad.com/favicon.ico","media":{"width":670,"html":"<iframe class=\"embedly-embed\" src=\"https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgumroad.com%2Fl%2FSpORj%3Fas_embed%3Dtrue&url=https%3A%2F%2Fgumroad.com%2Fl%2Fdante2-team&image=https%3A%2F%2Fstatic-2.gumroad.com%2Fres%2Fgumroad%2F210946281731%2Fasset_previews%2Fe77f49732df73fe9f4bd67a31be0d285%2Fretina%2Fcover.png&key=d42b91026ea041c0875fd61ff736cb79&type=text%2Fhtml&schema=gumroad\" width=\"670\" height=\"670\" scrolling=\"no\" frameborder=\"0\" allowfullscreen></iframe>","type":"rich","height":670},"authors":[],"keywords":[{"score":59,"name":"app"},{"score":24,"name":"download"},{"score":20,"name":"text"},{"score":17,"name":"password"},{"score":17,"name":"store"},{"score":14,"name":"link"},{"score":10,"name":"dante2"},{"score":8,"name":"please"},{"score":8,"name":"access"},{"score":6,"name":"account"}],"related":[],"safe":true,"published":null,"url":"https://gumroad.com/l/dante2-team","offset":null,"provider_display":"gumroad.com","title":"Dante2 - Commercial Team License","images":[{"url":"https://static-2.gumroad.com/res/gumroad/210946281731/asset_previews/e77f49732df73fe9f4bd67a31be0d285/retina/cover.png","width":873,"size":21037,"caption":null,"height":447}],"language":"English","provider_name":"Gumroad","content":null,"embeds":[],"type":"html","app_links":[],"favicon_colors":[{"color":[0,0,0],"weight":0.0197753906},{"color":[22,166,166],"weight":0.016357421900000002},{"color":[198,60,47],"weight":0.0109863281},{"color":[223,109,47],"weight":0.0104980469},{"color":[0,132,191],"weight":0.0048828125}],"lead":null,"description":"Grants commercial use of Dante2 for up to eight developers"},"error":""}},{"key":"5i3f5","text":"The Dante2 Commercial Organization License is for an unlimited number of team members. This license covers the entire team no matter how many people are working on it. ","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":4,"length":38,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"97g6t","text":"Dante2 Commercial Organization License for Unlimited developers $320 ","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":18,"length":12,"style":"BOLD"},{"offset":39,"length":25,"style":"ITALIC"}],"entityRanges":[{"offset":0,"length":68,"key":5}],"data":{}},{"key":"b4m5f","text":"ttps://gum.co/dante2-orgs","type":"embed","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{"provisory_text":"https://gum.co/dante2-orgs","endpoint":"//api.embed.ly/1/extract?key=86c28a410a104c8bb58848733c82f840&url=","type":"embed","embed_data":{"original_url":"https://gum.co/dante2-orgs","provider_url":"http://gumroad.com","entities":[],"cache_age":86258,"favicon_url":"https://gumroad.com/favicon.ico","media":{"width":670,"html":"<iframe class=\"embedly-embed\" src=\"https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgumroad.com%2Fl%2FyHXDe%3Fas_embed%3Dtrue&url=https%3A%2F%2Fgumroad.com%2Fl%2Fdante2-orgs&image=https%3A%2F%2Fstatic-2.gumroad.com%2Fres%2Fgumroad%2F210946281731%2Fasset_previews%2F3541963abf392061e1db200a5c96dffc%2Fretina%2Fcover.png&key=d42b91026ea041c0875fd61ff736cb79&type=text%2Fhtml&schema=gumroad\" width=\"670\" height=\"670\" scrolling=\"no\" frameborder=\"0\" allowfullscreen></iframe>","type":"rich","height":670},"authors":[],"keywords":[],"related":[],"safe":true,"published":null,"url":"https://gumroad.com/l/dante2-orgs","offset":null,"provider_display":"gumroad.com","title":"Dante2 - Commercial Organization license","images":[{"url":"https://static-2.gumroad.com/res/gumroad/210946281731/asset_previews/3541963abf392061e1db200a5c96dffc/retina/cover.png","width":873,"size":21037,"caption":null,"height":447}],"language":null,"provider_name":"Gumroad","content":null,"embeds":[],"type":"html","app_links":[],"favicon_colors":[{"color":[0,0,0],"weight":0.0197753906},{"color":[22,166,166],"weight":0.016357421900000002},{"color":[198,60,47],"weight":0.0109863281},{"color":[223,109,47],"weight":0.0104980469},{"color":[0,132,191],"weight":0.0048828125}],"lead":null,"description":"Grants commercial use of Dante2 for an unlimited number of developers for an organization"},"error":""}},{"key":"dtgn6","text":"Read the Dante2 Commercial License Agreement below for complete terms and details.For any questions about licensing, contact us miguelmichelson@gmail.com. ","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[{"offset":9,"length":35,"key":6},{"offset":128,"length":25,"key":7}],"data":{}},{"key":"bgv1n","text":"Commercial OEM license","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"vglc","text":"If you want to include Dante2 as part of a commercial interface builder, SDK, or toolkit, choose the Commercial OEM license. Commercial OEM licenses are customized for each customer. Contact miguelmichelson@gmail.com.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[{"offset":191,"length":25,"key":8}],"data":{}},{"key":"2on1q","text":"Below are the official Dante2 Commercial License terms, as well as a quote with a plain English summary of the terms. These summaries are provided for your convenience, but are not binding; your use of Dante2 is governed by the full license terms.","type":"blockquote","depth":0,"inlineStyleRanges":[{"offset":82,"length":13,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"cm5o3","text":"Dante2 Commercial License Agreement","type":"header-two","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"144ml","text":"This Software License Agreement (the “Agreement”) is between Miguel Michelson and You (including your agents and affiliates), a commercial licensee of Miguel Michelson's software. If you have not purchased a Dante2 commercial license from Michelson, these terms do not apply to you, and your use of the Miguel Michelson software is instead governed by the GNU General Public License, version 3. ","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":38,"length":9,"style":"BOLD"},{"offset":61,"length":16,"style":"BOLD"},{"offset":83,"length":3,"style":"BOLD"}],"entityRanges":[{"offset":357,"length":37,"key":9}],"data":{}},{"key":"204io","text":"Purchasing a Dante2 Commercial Developer License applies this Agreement to you. Otherwise, you may use Dante2 under the GPLv3.","type":"blockquote","depth":0,"inlineStyleRanges":[{"offset":11,"length":37,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"7e0im","text":"Purchasing a Dante2 Commercial Team License applies this Agreement to you. Otherwise, you may use Dante2 under the GPLv3.","type":"blockquote","depth":0,"inlineStyleRanges":[{"offset":11,"length":32,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"1gh8a","text":"Purchasing a Dante2 Commercial Organization License applies this Agreement to you. Otherwise, you may use Dante2 under the GPLv3.","type":"blockquote","depth":0,"inlineStyleRanges":[{"offset":11,"length":40,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"6doiv","text":"Definitions","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"5sh9f","text":"“Application” means any software, application, or elements that Your Licensed Developers develop using the Software or Modifications in accordance with this Agreement.","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":1,"length":11,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"84da2","text":"“End User” means an end user of Your Application who acquires a license to such solely for their own use and not for distribution, resale, user interface design, or software development purposes.","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":1,"length":8,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"8jjlf","text":"“Licensed Developer” shall mean an individual person permitted to use the Software and make Modifications for your Applications, whether such person is Your employee or a consultant or contractor providing services to You.","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":1,"length":18,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"424s5","text":"“Modification” means any revision, adaptation, or derivative of the Software produced by You.","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":1,"length":12,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"7t2kj","text":"The “Software” means Dante2 version .","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":5,"length":8,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"kgm0","text":"Commercial license grant","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"ert1","text":"Subject to the terms of this Agreement, Miguel Michelson grants to You a revocable, non-exclusive, non-transferable license: ","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"cti7l","text":"On developer license:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":21,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"a61gk","text":"(i) for one (1) Licensed Developer to use the Software to create Modifications and Applications; ","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"65s3m","text":"On team license:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":16,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"b6jia","text":"(i) for up to eight (8) Licensed Developer(s)","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"99u9e","text":"On organization license:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":24,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"1e65k","text":"(i) for an unlimited number of Licensed Developer(s) ","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"7c63k","text":"(ii) for You to distribute the Software and/or Modifications to an unlimited number of End Users solely as integrated into the Applications; and","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"e6bvo","text":" (iii) for End Users to use the Software as incorporated into Your Applications in accordance with the terms of this Agreement.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"d89fe","text":"developer license:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":18,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"1ou2h","text":"This license grants you one individual Developer to use Dante2 for an unlimited amount of Applications. It is not exclusive — others companies and developers can use Dante2 — and is non-transferable — you cannot transfer this license to another company.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"dgqif","text":"Team License:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":13,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"24iem","text":"This license grants you up to 8 Developers to use Dante2 for an unlimited amount of Applications. It is not exclusive — others companies and developers can use Dante2 — and is non-transferable — you cannot transfer this license to another company.","type":"blockquote","depth":0,"inlineStyleRanges":[{"offset":24,"length":18,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"ajkcu","text":"Commercial Organization License:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":32,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"690l4","text":"This license grants you an unlimited number of Developers to use Dante2 for an unlimited amount of Applications. It is not exclusive — others companies and developers can use Dante2 — and is non-transferable — you cannot transfer this license to another company.","type":"blockquote","depth":0,"inlineStyleRanges":[{"offset":27,"length":30,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"fcrv0","text":"You are entitled to receive all updates to the major version of the Software licensed by you, as well as any later version of the Software that Miguel Michelson, in writing, explicitly authorizes you to use. (For illustration purposes only, if you purchased a license for version .0, this licenses authorizes you to use version .9, but not NaN.0.) Miguel Michelson makes no representation that any update will be compatible with your Application.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"6vtdg","text":"You can use this license with Dante2 versions .x.x, as well as later versions if we authorize. Later versions of Dante2 may not be compatible with your Application.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"9g2io","text":"Ownership","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"cdi7n","text":"This is a license agreement and not an agreement for sale. Miguel Michelson reserves ownership of all intellectual property rights inherent in or relating to the Software and corresponding source code, which include all copyright, patent rights, all rights in relation to registered and unregistered trademarks (including service marks), confidential information (including trade secrets and know-how) and all rights other than those expressly granted by this Agreement.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"3033i","text":"This license is for use of Dante2, not ownership of its intellectual property. Miguel Michelson continues to own Dante2.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"4sdui","text":"You must not remove, obscure or interfere with any copyright, acknowledgment, attribution, trademark, warning or disclaimer statement affixed to, incorporated in or otherwise applied in connection with the Software. Notwithstanding the above, you are permitted to produce, use, and distribute compressed or “minified” copies of the Software that do not bear the notices contained in the Software’s source code, so long as you otherwise comply with the terms of this license.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"bhslp","text":"When you distribute your work with Dante2, do not remove or change any disclaimers from the source files. You can however minify the source files, which may remove or change the disclaimers.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"dmdbn","text":"Prohibited Uses","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"8i9qr","text":"Your Application must have substantially different functionality than, and must not compete directly with, the Software.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"b7ar1","text":"You cannot create something very similar to Dante2, like a super-Dante2. Make something unique.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"pu3","text":"You may not distribute the Software or Modifications except as included within Your Application. If You produce an Application for a customer, You are responsible for ensuring that your customer does not make use of the Software except with Applications licensed herein.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"5t2sn","text":"Do not re-package Dante2 unless it’s part of your Application. Likewise, your customer should be using Dante2 as part of your Application.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"a5tm6","text":"Your Application must not enable End Users to produce separate applications that incorporate the Software or Modifications. For example, if Your Application is a development toolkit or library, an application builder, a website builder that can be used to incorporate the Software into a new Application, You must obtain a separate OEM license from Miguel Michelson. ","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"6fj16","text":"You need to purchase a Commercial OEM License if you are creating an interface builder, SDK, or something that produces copies that each use Dante2.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"1q3m8","text":"Termination","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"91gs3","text":"This Agreement and the license granted hereunder shall continue until terminated in accordance with this Section. Unless otherwise specified in this Agreement, the license shall last as long as Your use of the Software is in compliance with the terms herein.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"88dp3","text":"This Agreement applies for as long as you use Dante2. ","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"7np9d","text":"Miguel Michelson shall have the right to terminate this Agreement and the license granted hereunder immediately if You breach any of the material terms of this Agreement, and You fail to cure such material breach within thirty (30) days of receipt of notice from Miguel Michelson. Upon termination of this Agreement, all licenses granted to You in this Agreement shall terminate automatically and You shall immediately cease use and distribution of the Software.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"70iuu","text":"We can end this Agreement if you breach any terms, and do not resolve the breach after 30 days after notice from Miguel Michelson. After termination, you must stop using and distributing Dante2.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"blfls","text":"Upon termination of this Agreement, You must cease all use of the Software. If, prior to your breach of this Agreement, you delivered Applications incorporating the Software to Your End Users, those End Users’ licenses shall survive termination.After termination, your end users may continue to use Dante2 in products that have already been distributed to them.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"6hrjb","text":"Disclaimer of Warranties","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"d0iln","text":"TO THE EXTENT PERMITTED BY LAW, MIGUEL MICHELSON DISCLAIMS ALL WARRANTIES AND CONDITIONS, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT, WITH REGARD TO THE SOFTWARE. WE DO NOT GUARANTEE THAT THE OPERATION OF THE SOFTWARE OR YOUR APPLICATION WILL BE UNINTERRUPTED OR ERROR-FREE, AND YOU ACKNOWLEDGE THAT IT IS NOT TECHNICALLY PRACTICABLE FOR US TO DO SO.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"atq5q","text":"We do not claim any warranties or gaurantees with using Dante2. There may be bugs.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"ansg3","text":"Limitation of Liabilities","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"bshj4","text":"TO THE EXTENT PERMITTED BY LAW, IN NO EVENT SHALL MIGUEL MICHELSON BE LIABLE UNDER ANY LEGAL OR EQUITABLE THEORY FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LAW) ARISING OUT OF THE USE OF OR INABILITY TO USE THE SOFTWARE OR THE CODE IT PRODUCES OR ANY OTHER SUBJECT MATTER RELATING TO THIS AGREEMENT, EVEN IF MIGUEL MICHELSON HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN ANY CASE, MIGUEL MICHELSON'S ENTIRE LIABILITY WITH RESPECT TO ANY SUBJECT MATTER RELATING TO THIS AGREEMENT SHALL BE LIMITED TO THE GREATER OF: (I) THE AMOUNT ACTUALLY PAID BY YOU FOR THE LICENSE, OR (II) FIVE HUNDRED DOLLARS ($500).","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"eh2un","text":"We aren’t liable if your business is harmed or you lose money as result of using Dante2.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"99bmq","text":"Indemnification","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"evh9v","text":"While redistributing the Software or Modifications thereof as part of Your Application, You may choose to offer acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this Agreement. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, and not on Miguel Michelson’s behalf.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"bub6d","text":"While distributing Dante2 to your end users, you can offer them support for Dante2, but only on your own behalf. That is your responsibility and not ours. ","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"9tffl","text":"You agree to indemnify, hold harmless, and defend Miguel Michelson and its owners, officers, agents, and affiliates from and against any and all claims, lawsuits and proceedings (collectively “Claims”), and all expenses, costs (including attorney's fees), judgments, damages and other liabilities resulting from such Claims, that arise or result from: (i) Your use of the Software in violation of this Agreement; (ii) the use or distribution of Your Application, except to the extent such claim is based solely on the inclusion of the Software therein; (iii) Your Modification of the Software’s source code; or (iv) Your accepting support, warranty, indemnity, or additional liability as described in Section 8.1.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"cbu81","text":"If someone sues Miguel Michelson as a result of your use of Dante2, you are responsible for any resulting cost to Miguel Michelson.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"50l30","text":"Payment and Taxes","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"cr10i","text":"All payments under this Agreement are due to Miguel Michelson upon Your purchase of a license to the Software. Each party shall be responsible for all taxes (including, but not limited to, taxes based upon its income) or levies imposed on it under applicable laws, regulations and tax treaties as a result of this Agreement and any payments made hereunder (including those required to be withheld or deducted from payments); provided that You shall be responsible for any value added tax, use tax, sales tax, or similar tax, and shall pay or reimburse Miguel Michelson for the same upon invoice. Each party shall furnish evidence of such paid taxes as is sufficient to enable the other party to obtain any credits available to it, including original tax withholding certificates.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"ddqsf","text":"We are each responsible for any taxes that we owe as a result of this agreement.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"bvqj8","text":"Miscellaneous","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"88krc","text":"Software Updates and Upgrades. The license granted herein applies only to the version of the Software available when purchased in connection with the terms of this Agreement, and to any updates and/or upgrades to which You may be entitled. Any previous or subsequent license granted to You for use of the Software shall be governed by the terms and conditions of the agreement entered in connection with purchase or download of that version of the Software.This license applies to Dante2 v. Previous licenses still apply if you have used a previous version with a different license. Survival. The provisions of sections 4 through 10 will survive termination of this Agreement. ","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":30,"style":"BOLD"},{"offset":583,"length":9,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"c5nou","text":"Compliance with Applicable Laws. You agree that You will comply with all applicable laws and regulations with respect to the Software, including without limitation all export control laws and regulations.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":32,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"2228q","text":"Marketing. You agree to Miguel Michelson’s use of Your name, trade name, and trademark, for use in Miguel Michelson’s marketing materials and its website, solely to identify you as a customer of Miguel Michelson.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":10,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"955gl","text":"You agree that we can use your name and your logo for marketing.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"9q8ff","text":"Assignment. This Agreement may be assigned by Miguel Michelson in whole or in part and will inure to the benefit of Miguel Michelson’s successors and assigns. You may not assign or transfer this Agreement without Miguel Michelson’s prior written consent. Notwithstanding the foregoing, however, if You transfer ownership of an Application to a customer for which it was developed, You may assign this Agreement to that customer (the “Assignee”) provided: (i) You provide written notice to Miguel Michelson prior to the effective date of such assignment; and (ii) there is a written agreement, wherein the Assignee accepts the terms of this Agreement.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":11,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"2qil5","text":"You may assign this license to a customer, or another company or organization, so long as you get our written permission.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"bl8se","text":"Entire Agreement. The terms and conditions stated herein set forth the entire agreement of the parties and replace and supersede all other contracts, agreements, and understandings, written or oral, relating to the subject matter hereof.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":17,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"222dl","text":"Your use of Dante2 is governed only by this agreement.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"aifb0","text":"Severability. In the event that any portion of this Agreement is held to be unenforceable, such portions shall not limit or otherwise modify or affect any other portion of this Agreement.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":13,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"76vrb","text":"If there is a problem with any part of this agreement, the rest of the agreement will remain in place.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"cdm12","text":"Modification; Waiver. This Agreement cannot be amended except by a written instrument executed by each of the parties. The failure of either party to enforce any provision of this Agreement may not be deemed a waiver of that or any other provision of this Agreement.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":21,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"1h3u4","text":"No changes to this Agreement, unless we confirm it in writing. All of these terms remain enforceable even if we don't enforce them at every opportunity.","type":"blockquote","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"ecatl","text":"Government Use. If the Software or any related documentation is licensed to the U.S. Government or any agency thereof, it will be considered to be “commercial computer software” or “commercial computer software documentation,” as those terms are used in 48 CFR § 12.212 or 48 CFR § 227.7202, and is being licensed with only those rights as are granted to all other licensees as set forth in this Agreement.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":15,"style":"BOLD"}],"entityRanges":[],"data":{}}]}
8
+
9
+ export const Doc = {"entityMap":{},"blocks":[{"key":"761n6","text":"Dante II - Options","type":"header-one","depth":0,"inlineStyleRanges":[{"offset":0,"length":18,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"4d32s","text":"guide to configure dante like a pro","type":"header-two","depth":0,"inlineStyleRanges":[{"offset":0,"length":35,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"fb62e","text":"","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"efvk7","text":"Dante2 provides some default options to configure how editor should work. The following is Dante in it's most basic form","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"4uub8","text":"new Dante({ el: \"app\"})","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"6326q","text":"when the editor initializes it support an object map with properties","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"2l5l3","text":"basic options:","type":"header-three","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"cag72","text":"","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"46h3m","text":"Content: ","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":7,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"57oi6","text":"Use this option to preload content on the editor, the content must be in form of editorState data.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":62,"length":5,"style":"BOLD"},{"offset":81,"length":12,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"291st","text":"Data Storage:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":12,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"9ihg2","text":"Date storage is an option that handles the way on how dante editor will hit your server to save the content, it will send an editorState serialized as json.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":125,"length":11,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"160qn","text":"data_storage: {","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"96l41","text":" failure_handler: func,","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"4q5d7","text":" interval: 1500,","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"f9ouc","text":" success_handler: func,","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"cd4um","text":" url: string with your endpoint","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"b4s7l","text":" method: \"POST\"","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"60jft","text":"}","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"ao50o","text":"Ajax:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":5,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"6qe1h","text":"The xhr option are a set of functions that will be called on any ajax operation, let's say you want to display a preloader when the editor is saving content and then display success or error messages when operation is done.","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":4,"length":3,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"2kd21","text":"xhr: {\n before_handler: func,\n success_handler: func,\n error_handler: func\n}","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"e1vqv","text":"Key Commands:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":13,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"c1p2f","text":"Use this option to configure command combinations to insert or toggle blocks. This configuration supports commands like alt-cmd, alt-shift & cmd. You must pass toggle_block:BLOCK_TYPE , toggle_inline:BLOCK_TYPE the following is an example of some default options:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":120,"length":8,"style":"BOLD"},{"offset":129,"length":9,"style":"BOLD"},{"offset":141,"length":5,"style":"BOLD"},{"offset":160,"length":23,"style":"BOLD"},{"offset":186,"length":25,"style":"BOLD"},{"offset":120,"length":8,"style":"ITALIC"},{"offset":129,"length":9,"style":"ITALIC"},{"offset":141,"length":5,"style":"ITALIC"},{"offset":160,"length":23,"style":"ITALIC"},{"offset":186,"length":25,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"6g7u2","text":"key_commands: {\n alt-cmd: [{cmd: \"toggle_block:header_one\", key: 49}, ... ],\n alt-shift: [{cmd: \"add-new-block\", key: 65}, ... ],\n cmd: [{cmd: \"toggle_inline:BOLD\", key: 66}, ...]\n}","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"145us","text":"Character convert mapping:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":26,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"184v4","text":"This option provides some mapping on character combination on the beggining of pharagraph. For example you may want to create some ordered list just by typing \"1.\" The following are some default character mappings:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":160,"length":4,"style":"BOLD"},{"offset":160,"length":4,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"8t92b","text":"character_convert_mapping: {\n \"1.\": \"ordered-list-item\",","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"80o4b","text":" \"#\": \"header-one\"\n}","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"8hc0v","text":"Contiuous blocks:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":17,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"811bt","text":"This option allows some fine tunning on which blocks should be created repeatedly after hitting ENTER key. This is useful on blockquotes or lists Example on how to enable this option:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":145,"length":1,"style":"BOLD"},{"offset":145,"length":1,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"27lqq","text":"contiuousBlocks: [\n \"unstyled\",\n \"blockquote\",","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"copok","text":" ....\n]","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"rrog","text":"Default wrappers:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":17,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"7iid8","text":"This option is just for style the default elements with a top level class, let's say you need to add the html class \".custom-h1\" to all your H1 elements, ","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":141,"length":2,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"d7fo4","text":"default_wrappers: [\n {block: \"unstyled\", className: \"custom-h1\"},\n ....\n]","type":"code-block","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"cq8bo","text":"Widgets:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":8,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"1co5p","text":"Widgets are just react components that you can use to render custom content on your component, note that all Dante's features are composed as components, the widgets option deserves a dedicated chapter, but this is a summary of how widgets works: ","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":158,"length":8,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"ditau","text":"first, widgets option is and array of option, each widget is contained in an array and should point to the name of the React component, some of the main options are:","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"95ajt","text":"block: string, the name of the React.Component.","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":0,"length":5,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"6g82l","text":"editable: bool, this configures if the component will be editable or not.","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":0,"length":8,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"1clrg","text":"renderable: bool, this configures if the component is renderable","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":0,"length":10,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"cqdde","text":"breakOnContinuous: bool, same as continuousBlock but for widgets.","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":0,"length":17,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"bd7jb","text":"handleEnterWithText: func, this handles the behaviour when you hit ENTER on the component and text is present.","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":0,"length":19,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"52vo","text":"handleEnterWihoutText: func, this handles the behaviour when you hit ENTER on the component and no text is present.","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":0,"length":21,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"dorg4","text":"selectedFn: func, this handles the behaviour when component is focused","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":0,"length":10,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"1lesu","text":"selected_class: string, this configures which class will be added when component is focused","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":0,"length":14,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"35i1n","text":"wrapper_class: string, this configures the default class that will wrapp the component","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":0,"length":13,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"75dqq","text":"options: Object, this are custom options that will be stored in your component for later use.","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":0,"length":7,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"9enkc","text":"widget_options: Object, this are custom options that will operate as a blockProps, this are volatile options, not to be stored in your content. ","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":0,"length":14,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"3v6ps","text":"Tooltips:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":9,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"a5m6g","text":"Tooltips are another kind of components that will be not rendered in your editor content but will interact with it rendered over it, like the tooltips you see when you hover links, or select words to toggle BOLD or ITALIC. The tooltips option is an array, The main options are:","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":207,"length":4,"style":"BOLD"},{"offset":227,"length":9,"style":"BOLD"},{"offset":215,"length":6,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"8aub","text":"component: Object, the object of your tooltip component.","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":0,"length":9,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"50lfa","text":"display:","type":"ordered-list-item","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"ie4h","text":"displayOnSelection: bool, this configures if the tooltip should display on selection.","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":0,"length":18,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"f11l2","text":"selectionElements: Array, this configures which elements should display tooltip when selected, use this with displayOnSelection: true","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":0,"length":17,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"6cfm3","text":"widget_options: Object, custom options","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":0,"length":14,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"c3fho","text":"ref: the name of ref element, to be used in main editor as a \"reference\" of the element.","type":"ordered-list-item","depth":0,"inlineStyleRanges":[{"offset":0,"length":3,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"cciaf","text":"","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"9up27","text":"FIN","type":"header-one","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"22c8t","text":"","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"a6gqv","text":"","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"cukcn","text":"","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"6ulbq","text":"","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}}]}
data/demo/demo.js ADDED
@@ -0,0 +1,9 @@
1
+ import './styles/layout/layout'
2
+ import './styles/layout/normalize'
3
+ import './styles/layout/scaffold'
4
+
5
+ import { Readme, License, Doc } from './data/poc.js'
6
+
7
+ window.PocData = Readme
8
+ window.PocDataLicense = License
9
+ window.Doc = Doc
@@ -0,0 +1,7 @@
1
+ import 'styles/dante'
2
+ import { Dante, DanteEditor } from '../src/index'
3
+ /*
4
+ module.exports = {
5
+ Dante,
6
+ DanteEditor
7
+ }*/
File without changes
File without changes
File without changes
File without changes