@json-editor/json-editor 1.3.5 → 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (436) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/.env +2 -0
  3. package/.env-dist +2 -0
  4. package/.eslintrc +10 -0
  5. package/.github/PULL_REQUEST_TEMPLATE.md +9 -0
  6. package/.github/workflows/build.yml +70 -0
  7. package/.travis.yml +63 -9
  8. package/CHANGELOG.md +1152 -0
  9. package/CONTRIBUTING.md +44 -5
  10. package/Makefile +26 -0
  11. package/README.md +765 -138
  12. package/README_ADDON.md +577 -0
  13. package/UPGRADING.md +46 -0
  14. package/build/CssToJson.js +55 -0
  15. package/codecept.conf.js +35 -0
  16. package/config/.eslintrc +7 -0
  17. package/config/codeceptjs_helpers.js +146 -0
  18. package/config/helpers.js +10 -0
  19. package/config/karma.conf.js +89 -0
  20. package/config/readme.md +31 -0
  21. package/config/webpack.common.js +71 -0
  22. package/config/webpack.dev.js +15 -0
  23. package/config/webpack.nonmin.js +19 -0
  24. package/config/webpack.prod.js +24 -0
  25. package/dist/jsoneditor.js +2 -11013
  26. package/dist/jsoneditor.js.LICENSE.txt +15 -0
  27. package/dist/nonmin/jsoneditor.js +31392 -0
  28. package/dist/nonmin/jsoneditor.js.map +1 -0
  29. package/docs/basic.html +2 -2
  30. package/docs/basic_person.json +2 -1
  31. package/docs/choices.html +86 -0
  32. package/docs/cleave.html +11 -19
  33. package/docs/colorpicker.html +194 -0
  34. package/docs/css_integration.html +56 -54
  35. package/docs/custom-editor.html +92 -0
  36. package/docs/datetime.html +48 -21
  37. package/docs/describedby.html +161 -0
  38. package/docs/enumsource.html +67 -0
  39. package/docs/form-submission.html +162 -0
  40. package/docs/imask.html +192 -0
  41. package/docs/index.html +606 -423
  42. package/docs/materialize_css.html +1 -1
  43. package/docs/meta-schema.html +793 -0
  44. package/docs/meta_schema.json +446 -400
  45. package/docs/polyfills/assign.js +29 -0
  46. package/docs/radio.html +156 -0
  47. package/docs/recursive.html +15 -17
  48. package/docs/scripts/ajv-validator.js +8695 -0
  49. package/docs/select2.html +15 -9
  50. package/docs/selectize.html +11 -9
  51. package/docs/signature.html +12 -11
  52. package/docs/starrating.html +5 -17
  53. package/docs/upload.html +33 -23
  54. package/docs/uuid.html +70 -0
  55. package/docs/wysiwyg.html +14 -7
  56. package/jasmine.json +11 -0
  57. package/package.json +74 -25
  58. package/release-notes.md +90 -0
  59. package/src/core.js +411 -611
  60. package/src/defaults.js +385 -306
  61. package/src/editor.js +761 -520
  62. package/src/editors/ace.js +90 -0
  63. package/src/editors/array/choices.js +104 -0
  64. package/src/editors/array/select2.js +112 -0
  65. package/src/editors/array/selectize.js +108 -86
  66. package/src/editors/array.css +9 -0
  67. package/src/editors/array.css.js +3 -0
  68. package/src/editors/array.js +812 -695
  69. package/src/editors/autocomplete.js +59 -0
  70. package/src/editors/base64.js +148 -129
  71. package/src/editors/button.js +104 -0
  72. package/src/editors/checkbox.js +111 -76
  73. package/src/editors/choices.css +3 -0
  74. package/src/editors/choices.css.js +3 -0
  75. package/src/editors/choices.js +71 -0
  76. package/src/editors/colorpicker.js +105 -0
  77. package/src/editors/datetime.js +93 -79
  78. package/src/editors/describedby.js +190 -0
  79. package/src/editors/enum.js +131 -116
  80. package/src/editors/hidden.js +100 -86
  81. package/src/editors/index.js +81 -0
  82. package/src/editors/info.js +28 -0
  83. package/src/editors/integer.js +21 -8
  84. package/src/editors/ip.js +36 -0
  85. package/src/editors/jodit.js +66 -0
  86. package/src/editors/multiple.js +380 -241
  87. package/src/editors/multiselect.js +207 -207
  88. package/src/editors/null.js +15 -11
  89. package/src/editors/number.js +39 -30
  90. package/src/editors/object.css +41 -0
  91. package/src/editors/object.css.js +3 -0
  92. package/src/editors/object.js +1209 -1007
  93. package/src/editors/radio.js +128 -0
  94. package/src/editors/sceditor.js +74 -0
  95. package/src/editors/select.js +318 -342
  96. package/src/editors/select2.js +112 -0
  97. package/src/editors/selectize.js +89 -338
  98. package/src/editors/signature.js +100 -104
  99. package/src/editors/simplemde.js +103 -0
  100. package/src/{styles → editors}/starrating.css +11 -2
  101. package/src/editors/starrating.css.js +3 -0
  102. package/src/editors/starrating.js +126 -95
  103. package/src/editors/stepper.js +27 -0
  104. package/src/editors/string.js +352 -426
  105. package/src/editors/table.js +486 -410
  106. package/src/editors/upload.js +297 -131
  107. package/src/editors/uuid.js +49 -0
  108. package/src/iconlib.js +22 -27
  109. package/src/iconlibs/bootstrap.js +28 -0
  110. package/src/iconlibs/bootstrap2.js +28 -17
  111. package/src/iconlibs/bootstrap3.js +28 -17
  112. package/src/iconlibs/fontawesome3.js +28 -17
  113. package/src/iconlibs/fontawesome4.js +28 -18
  114. package/src/iconlibs/fontawesome5.js +28 -18
  115. package/src/iconlibs/foundation2.js +24 -17
  116. package/src/iconlibs/foundation3.js +28 -17
  117. package/src/iconlibs/index.js +27 -0
  118. package/src/iconlibs/jqueryui.js +28 -17
  119. package/src/iconlibs/materialicons.js +49 -44
  120. package/src/iconlibs/openiconic.js +28 -0
  121. package/src/iconlibs/spectre.js +28 -0
  122. package/src/resolvers.js +135 -0
  123. package/src/schemaloader.js +639 -0
  124. package/src/style.css +157 -0
  125. package/src/style.css.js +3 -0
  126. package/src/templates/default.js +46 -51
  127. package/src/templates/ejs.js +8 -10
  128. package/src/templates/handlebars.js +1 -3
  129. package/src/templates/hogan.js +7 -9
  130. package/src/templates/index.js +21 -0
  131. package/src/templates/lodash.js +6 -8
  132. package/src/templates/markup.js +6 -8
  133. package/src/templates/mustache.js +6 -8
  134. package/src/templates/swig.js +1 -3
  135. package/src/templates/underscore.js +6 -8
  136. package/src/theme.js +717 -426
  137. package/src/themes/barebones.css +35 -0
  138. package/src/themes/barebones.css.js +3 -0
  139. package/src/themes/barebones.js +31 -0
  140. package/src/themes/bootstrap2.js +302 -264
  141. package/src/themes/bootstrap3.css +53 -0
  142. package/src/themes/bootstrap3.css.js +3 -0
  143. package/src/themes/bootstrap3.js +356 -259
  144. package/src/themes/bootstrap4.css +89 -0
  145. package/src/themes/bootstrap4.css.js +3 -0
  146. package/src/themes/bootstrap4.js +744 -234
  147. package/src/themes/bootstrap5.css +97 -0
  148. package/src/themes/bootstrap5.css.js +3 -0
  149. package/src/themes/bootstrap5.js +687 -0
  150. package/src/themes/foundation.js +539 -465
  151. package/src/themes/html.css +60 -0
  152. package/src/themes/html.css.js +3 -0
  153. package/src/themes/html.js +69 -82
  154. package/src/themes/index.js +29 -0
  155. package/src/themes/jqueryui.js +181 -166
  156. package/src/themes/materialize.js +263 -291
  157. package/src/themes/spectre.css +208 -0
  158. package/src/themes/spectre.css.js +3 -0
  159. package/src/themes/spectre.js +443 -0
  160. package/src/themes/tailwind.css +303 -0
  161. package/src/themes/tailwind.css.js +3 -0
  162. package/src/themes/tailwind.js +469 -0
  163. package/src/utilities.js +127 -68
  164. package/src/validator.js +914 -551
  165. package/src/validators/ip-validator.js +51 -0
  166. package/tests/Dockerfile +3 -0
  167. package/tests/README.md +27 -6
  168. package/tests/codeceptjs/codecept.json +29 -5
  169. package/tests/codeceptjs/constrains/contains_test.js +37 -0
  170. package/tests/codeceptjs/constrains/dependentRequired_test.js +33 -0
  171. package/tests/codeceptjs/constrains/dependentSchemas_test.js +16 -0
  172. package/tests/codeceptjs/constrains/if-then-else_test.js +186 -0
  173. package/tests/codeceptjs/core_test.js +534 -68
  174. package/tests/codeceptjs/editors/advanced_test.js +12 -10
  175. package/tests/codeceptjs/editors/array_any_of_test.js +50 -0
  176. package/tests/codeceptjs/editors/array_test.js +935 -677
  177. package/tests/codeceptjs/editors/autocomplete_test.js +15 -0
  178. package/tests/codeceptjs/editors/button_test.js +50 -0
  179. package/tests/codeceptjs/editors/checkbox_test.js +21 -8
  180. package/tests/codeceptjs/editors/colorpicker_test.js +29 -0
  181. package/tests/codeceptjs/editors/datetime_test.js +33 -0
  182. package/tests/codeceptjs/editors/inheritance_test.js +10 -0
  183. package/tests/codeceptjs/editors/integer_test.js +82 -71
  184. package/tests/codeceptjs/editors/jodit_test.js +23 -0
  185. package/tests/codeceptjs/editors/multiple_test.js +27 -0
  186. package/tests/codeceptjs/editors/multiselect_test.js +6 -9
  187. package/tests/codeceptjs/editors/number_test.js +75 -67
  188. package/tests/codeceptjs/editors/object_test.js +337 -28
  189. package/tests/codeceptjs/editors/option-no_default_values_test.js +42 -0
  190. package/tests/codeceptjs/editors/programmatic-changes_test.js +20 -0
  191. package/tests/codeceptjs/editors/purify_test.js +26 -0
  192. package/tests/codeceptjs/editors/radio_test.js +9 -0
  193. package/tests/codeceptjs/editors/range_test.js +10 -0
  194. package/tests/codeceptjs/editors/rating_test.js +10 -16
  195. package/tests/codeceptjs/editors/select_test.js +46 -23
  196. package/tests/codeceptjs/editors/starrating_test.js +15 -0
  197. package/tests/codeceptjs/editors/stepper_test.js +37 -0
  198. package/tests/codeceptjs/editors/string_test.js +108 -101
  199. package/tests/codeceptjs/editors/table-confirm-delete_test.js +60 -55
  200. package/tests/codeceptjs/editors/tabs_test.js +14 -11
  201. package/tests/codeceptjs/editors/uuid_test.js +48 -0
  202. package/tests/codeceptjs/editors/validation_test.js +13 -9
  203. package/tests/codeceptjs/issues/issue-gh-1133_test.js +9 -0
  204. package/tests/codeceptjs/issues/issue-gh-1158-2_test.js +10 -0
  205. package/tests/codeceptjs/issues/issue-gh-1158_test.js +8 -0
  206. package/tests/codeceptjs/issues/issue-gh-1164_test.js +9 -0
  207. package/tests/codeceptjs/issues/issue-gh-1171_test.js +11 -0
  208. package/tests/codeceptjs/issues/issue-gh-1211_test.js +17 -0
  209. package/tests/codeceptjs/issues/issue-gh-1257_test.js +11 -0
  210. package/tests/codeceptjs/issues/issue-gh-1272_test.js +21 -0
  211. package/tests/codeceptjs/issues/issue-gh-1330_test.js +8 -0
  212. package/tests/codeceptjs/issues/issue-gh-1338_test.js +18 -0
  213. package/tests/codeceptjs/issues/issue-gh-1347_test.js +8 -0
  214. package/tests/codeceptjs/issues/issue-gh-1364_test.js +13 -0
  215. package/tests/codeceptjs/issues/issue-gh-1367_test.js +11 -0
  216. package/tests/codeceptjs/issues/issue-gh-1383_test.js +9 -0
  217. package/tests/codeceptjs/issues/issue-gh-1384_test.js +9 -0
  218. package/tests/codeceptjs/issues/issue-gh-1410_test.js +13 -0
  219. package/tests/codeceptjs/issues/issue-gh-1422_test.js +9 -0
  220. package/tests/codeceptjs/issues/issue-gh-1431_test.js +12 -0
  221. package/tests/codeceptjs/issues/issue-gh-1439_test.js +12 -0
  222. package/tests/codeceptjs/issues/issue-gh-1452_test.js +10 -0
  223. package/tests/codeceptjs/issues/issue-gh-1453_test.js +18 -0
  224. package/tests/codeceptjs/issues/issue-gh-1461_test.js +14 -0
  225. package/tests/codeceptjs/issues/issue-gh-1463_test.js +9 -0
  226. package/tests/codeceptjs/issues/issue-gh-1471_test.js +17 -0
  227. package/tests/codeceptjs/issues/issue-gh-1485_test.js +13 -0
  228. package/tests/codeceptjs/issues/issue-gh-1491_test.js +9 -0
  229. package/tests/codeceptjs/issues/issue-gh-1525_test.js +9 -0
  230. package/tests/codeceptjs/issues/issue-gh-1536_test.js +12 -0
  231. package/tests/codeceptjs/issues/issue-gh-1538_test.js +10 -0
  232. package/tests/codeceptjs/issues/issue-gh-1541_test.js +8 -0
  233. package/tests/codeceptjs/issues/issue-gh-1559_test.js +15 -0
  234. package/tests/codeceptjs/issues/issue-gh-1562_test.js +12 -0
  235. package/tests/codeceptjs/issues/issue-gh-1586_test.js +15 -0
  236. package/tests/codeceptjs/issues/issue-gh-1636_test.js +9 -0
  237. package/tests/codeceptjs/issues/issue-gh-795_test.js +13 -0
  238. package/tests/codeceptjs/issues/issue-gh-810_test.js +52 -0
  239. package/tests/codeceptjs/issues/issue-gh-812_test.js +25 -0
  240. package/tests/codeceptjs/meta-schema_test.js +85 -0
  241. package/tests/codeceptjs/schemaloader_test.js +14 -0
  242. package/tests/codeceptjs/steps.d.ts +13 -0
  243. package/tests/codeceptjs/steps_file.js +4 -4
  244. package/tests/codeceptjs/test-config.js +3 -0
  245. package/tests/codeceptjs/themes_test.js +564 -0
  246. package/tests/docker-compose-local.yml +5 -0
  247. package/tests/docker-compose.yml +23 -17
  248. package/tests/fixtures/basic_person.json +2 -1
  249. package/tests/fixtures/definitions.json +22 -0
  250. package/tests/fixtures/nested_object.json +26 -0
  251. package/tests/fixtures/properties.json +20 -0
  252. package/tests/fixtures/some_types.json +32 -0
  253. package/tests/fixtures/validation.json +1347 -0
  254. package/tests/pages/_demo.html +475 -0
  255. package/tests/pages/advanced.html +1 -1
  256. package/tests/pages/anyof-2.html +91 -0
  257. package/tests/pages/anyof.html +82 -0
  258. package/tests/pages/array-anyof.html +145 -0
  259. package/tests/pages/array-checkboxes-infotext.html +55 -0
  260. package/tests/pages/array-checkboxes.html +5 -2
  261. package/tests/pages/array-choices.html +48 -0
  262. package/tests/pages/array-events-table.html +70 -0
  263. package/tests/pages/array-events.html +75 -0
  264. package/tests/pages/array-header-template.html +60 -0
  265. package/tests/pages/array-integers.html +5 -2
  266. package/tests/pages/array-multiselects.html +5 -2
  267. package/tests/pages/array-nested-arrays.html +5 -2
  268. package/tests/pages/array-numbers.html +5 -2
  269. package/tests/pages/array-objects.html +5 -2
  270. package/tests/pages/array-ratings.html +5 -2
  271. package/tests/pages/array-selectize-create.html +63 -0
  272. package/tests/pages/array-selectize.html +54 -0
  273. package/tests/pages/array-selects.html +5 -2
  274. package/tests/pages/array-strings.html +5 -2
  275. package/tests/pages/array-table-responsive.html +66 -0
  276. package/tests/pages/array-unique-items-sort.html +81 -0
  277. package/tests/pages/array.html +5 -2
  278. package/tests/pages/assets/autocomplete.css +1 -0
  279. package/tests/pages/assets/autocomplete.min.js +1 -0
  280. package/tests/pages/assets/pages.css +130 -0
  281. package/tests/pages/autocomplete.html +72 -0
  282. package/tests/pages/button-callbacks.html +79 -0
  283. package/tests/pages/button-icons.html +39 -0
  284. package/tests/pages/button_state_mode_1.html +35 -0
  285. package/tests/pages/button_state_mode_2.html +36 -0
  286. package/tests/pages/checkbox-labels.html +116 -0
  287. package/tests/pages/colorpicker-no-3rd-party.html +45 -0
  288. package/tests/pages/colorpicker-use-vanilla-picker.html +52 -0
  289. package/tests/pages/container-attributes.html +51 -0
  290. package/tests/pages/contains.html +39 -0
  291. package/tests/pages/core.html +14 -7
  292. package/tests/pages/datetime.html +78 -0
  293. package/tests/pages/dependentRequired.html +72 -0
  294. package/tests/pages/dependentSchemas.html +53 -0
  295. package/tests/pages/disable-button-in-object-editors.html +57 -0
  296. package/tests/pages/editor-show-validation-errors.html +54 -0
  297. package/tests/pages/enforce-const.html +168 -0
  298. package/tests/pages/error-messages.html +48 -0
  299. package/tests/pages/form-name.html +111 -0
  300. package/tests/pages/grid-strict.html +308 -0
  301. package/tests/pages/grid.html +281 -0
  302. package/tests/pages/if-else.html +58 -0
  303. package/tests/pages/if-then-else-allOf.html +118 -0
  304. package/tests/pages/if-then-else-disable-fields.html +70 -0
  305. package/tests/pages/if-then-else.html +65 -0
  306. package/tests/pages/if-then.html +58 -0
  307. package/tests/pages/inheritance.html +80 -0
  308. package/tests/pages/integer.html +17 -10
  309. package/tests/pages/issues/_template.html +50 -0
  310. package/tests/pages/issues/issue-gh-1133.html +64 -0
  311. package/tests/pages/issues/issue-gh-1158-2.html +189 -0
  312. package/tests/pages/issues/issue-gh-1158.html +50 -0
  313. package/tests/pages/issues/issue-gh-1164.html +71 -0
  314. package/tests/pages/issues/issue-gh-1165.html +63 -0
  315. package/tests/pages/issues/issue-gh-1165.json +8 -0
  316. package/tests/pages/issues/issue-gh-1171.html +39 -0
  317. package/tests/pages/issues/issue-gh-1211.html +1022 -0
  318. package/tests/pages/issues/issue-gh-1233-failing.html +46 -0
  319. package/tests/pages/issues/issue-gh-1233-passing.html +49 -0
  320. package/tests/pages/issues/issue-gh-1257.html +77 -0
  321. package/tests/pages/issues/issue-gh-1272.html +167 -0
  322. package/tests/pages/issues/issue-gh-1330.html +52 -0
  323. package/tests/pages/issues/issue-gh-1338.html +74 -0
  324. package/tests/pages/issues/issue-gh-1347.html +142 -0
  325. package/tests/pages/issues/issue-gh-1364.html +64 -0
  326. package/tests/pages/issues/issue-gh-1367.html +49 -0
  327. package/tests/pages/issues/issue-gh-1383.html +31 -0
  328. package/tests/pages/issues/issue-gh-1383.json +14 -0
  329. package/tests/pages/issues/issue-gh-1384.html +31 -0
  330. package/tests/pages/issues/issue-gh-1384.json +36 -0
  331. package/tests/pages/issues/issue-gh-1410.html +57 -0
  332. package/tests/pages/issues/issue-gh-1422.html +68 -0
  333. package/tests/pages/issues/issue-gh-1431.html +49 -0
  334. package/tests/pages/issues/issue-gh-1439.html +69 -0
  335. package/tests/pages/issues/issue-gh-1452.html +98 -0
  336. package/tests/pages/issues/issue-gh-1453.html +45 -0
  337. package/tests/pages/issues/issue-gh-1461.html +55 -0
  338. package/tests/pages/issues/issue-gh-1463.html +41 -0
  339. package/tests/pages/issues/issue-gh-1466.html +63 -0
  340. package/tests/pages/issues/issue-gh-1471.html +49 -0
  341. package/tests/pages/issues/issue-gh-1485.html +59 -0
  342. package/tests/pages/issues/issue-gh-1491.html +59 -0
  343. package/tests/pages/issues/issue-gh-1525.html +62 -0
  344. package/tests/pages/issues/issue-gh-1536.html +55 -0
  345. package/tests/pages/issues/issue-gh-1538.html +56 -0
  346. package/tests/pages/issues/issue-gh-1541.html +51 -0
  347. package/tests/pages/issues/issue-gh-1541.json +9 -0
  348. package/tests/pages/issues/issue-gh-1559.html +68 -0
  349. package/tests/pages/issues/issue-gh-1562.html +170 -0
  350. package/tests/pages/issues/issue-gh-1586.html +48 -0
  351. package/tests/pages/issues/issue-gh-1636.html +52 -0
  352. package/tests/pages/issues/issue-gh-795.html +58 -0
  353. package/tests/pages/issues/issue-gh-810.html +149 -0
  354. package/tests/pages/issues/issue-gh-812.html +113 -0
  355. package/tests/pages/issues/issue-gh-823-meta-schema.html +35 -0
  356. package/tests/pages/issues/issue-gh-848.html +81 -0
  357. package/tests/pages/keep_only_existing_values.html +81 -0
  358. package/tests/pages/load-events.html +61 -0
  359. package/tests/pages/maxContains.html +40 -0
  360. package/tests/pages/meta-schema.html +793 -0
  361. package/tests/pages/meta_schema.json +740 -0
  362. package/tests/pages/minContains.html +40 -0
  363. package/tests/pages/number.html +53 -6
  364. package/tests/pages/object-case-sensitive-property-search-false.html +42 -0
  365. package/tests/pages/object-case-sensitive-property-search-true.html +42 -0
  366. package/tests/pages/object-no-additional-properties.html +68 -0
  367. package/tests/pages/object-no-duplicated-id.html +70 -0
  368. package/tests/pages/object-required-properties.html +261 -0
  369. package/tests/pages/object-show-opt-in.html +111 -0
  370. package/tests/pages/object-with-dependencies-array.html +58 -0
  371. package/tests/pages/object-with-dependencies.html +62 -0
  372. package/tests/pages/object.html +5 -3
  373. package/tests/pages/oneof-2.html +91 -0
  374. package/tests/pages/oneof.html +105 -0
  375. package/tests/pages/opt-in-widget.html +134 -0
  376. package/tests/pages/option-dependencies.html +107 -0
  377. package/tests/pages/option-no_default_values.html +60 -0
  378. package/tests/pages/per-editor-options.html +44 -0
  379. package/tests/pages/placeholder-options.html +57 -0
  380. package/tests/pages/programmatic-changes.html +121 -0
  381. package/tests/pages/prompt-paste-max-length-reached.html +51 -0
  382. package/tests/pages/purify.html +66 -0
  383. package/tests/pages/range.html +62 -0
  384. package/tests/pages/read-only.html +60 -8
  385. package/tests/pages/ready.html +44 -0
  386. package/tests/pages/references.html +168 -0
  387. package/tests/pages/remove-false-properties.html +85 -0
  388. package/tests/pages/select-values.html +91 -0
  389. package/tests/pages/select.html +4 -3
  390. package/tests/pages/show-validation-errors.html +73 -0
  391. package/tests/pages/starrating.html +86 -0
  392. package/tests/pages/stepper-manual.html +59 -0
  393. package/tests/pages/stepper.html +61 -0
  394. package/tests/pages/string-ace-editor.html +7 -3
  395. package/tests/pages/string-cleave.html +48 -0
  396. package/tests/pages/string-custom-attributes.html +9 -6
  397. package/tests/pages/string-formats.html +54 -0
  398. package/tests/pages/string-formats2.html +59 -0
  399. package/tests/pages/{array-move-events.html → string-jodit-editor.html} +21 -29
  400. package/tests/pages/string-sceditor.html +9 -7
  401. package/tests/pages/string-simplemde-editor.html +83 -0
  402. package/tests/pages/switcher-option.html +69 -0
  403. package/tests/pages/table.html +4 -2
  404. package/tests/pages/tabs.html +1 -1
  405. package/tests/pages/themes.html +517 -0
  406. package/tests/pages/title-hidden.html +75 -0
  407. package/tests/pages/translate-property.html +248 -0
  408. package/tests/pages/urn.html +98 -0
  409. package/tests/pages/use-name-attributes.html +207 -0
  410. package/tests/pages/uuid.html +113 -0
  411. package/tests/pages/validation-messages.json +705 -0
  412. package/tests/pages/validation.html +20 -730
  413. package/tests/unit/.eslintrc +8 -0
  414. package/tests/unit/core.spec.js +320 -0
  415. package/tests/unit/defaults.spec.js +40 -0
  416. package/tests/unit/editor.spec.js +172 -0
  417. package/tests/unit/editors/array.spec.js +87 -0
  418. package/tests/unit/editors/object.spec.js +81 -0
  419. package/tests/unit/editors/table.spec.js +93 -0
  420. package/tests/unit/readme.md +35 -0
  421. package/tests/unit/schemaloader.spec.js +576 -0
  422. package/tests/unit/validator.spec.js +104 -0
  423. package/tests/unit/validators/ip-validator.spec.js +62 -0
  424. package/Gruntfile.js +0 -226
  425. package/dist/css/jsoneditor.min.css +0 -1
  426. package/dist/jsoneditor.js.map +0 -1
  427. package/dist/jsoneditor.min.js +0 -19
  428. package/dist/jsoneditor.min.js.map +0 -1
  429. package/docs/demo.html +0 -646
  430. package/src/class.js +0 -68
  431. package/src/editors/rating.js +0 -152
  432. package/src/ie9.js +0 -51
  433. package/src/intro.js +0 -23
  434. package/src/jquery.js +0 -64
  435. package/src/outro.js +0 -2
  436. package/src/themes/jsoneditor.barebones-theme.js +0 -60
@@ -1,37 +1,37 @@
1
- JSONEditor.defaults.themes.materialize = JSONEditor.AbstractTheme.extend(
2
- {
1
+ import { AbstractTheme } from '../theme.js'
3
2
 
4
- /**
3
+ export class materializeTheme extends AbstractTheme {
4
+ /**
5
5
  * Applies grid size to specified element.
6
6
  *
7
7
  * @param {HTMLElement} el The DOM element to have specified size applied.
8
- * @param {int} size The grid column size.
8
+ * @param {Integer} size The grid column size.
9
9
  * @see http://materializecss.com/grid.html
10
10
  */
11
- setGridColumnSize: function(el, size) {
12
- el.classList.add('col');
13
- el.classList.add('s' + size);
14
- },
11
+ setGridColumnSize (el, size) {
12
+ el.classList.add('col')
13
+ el.classList.add(`s${size}`)
14
+ }
15
15
 
16
- /**
16
+ /**
17
17
  * Gets a wrapped button element for a header.
18
18
  *
19
19
  * @returns {HTMLElement} The wrapped button element.
20
20
  */
21
- getHeaderButtonHolder: function() {
22
- return this.getButtonHolder();
23
- },
21
+ getHeaderButtonHolder () {
22
+ return this.getButtonHolder()
23
+ }
24
24
 
25
- /**
25
+ /**
26
26
  * Gets a wrapped button element.
27
27
  *
28
28
  * @returns {HTMLElement} The wrapped button element.
29
29
  */
30
- getButtonHolder: function() {
31
- return document.createElement('span');
32
- },
30
+ getButtonHolder () {
31
+ return document.createElement('span')
32
+ }
33
33
 
34
- /**
34
+ /**
35
35
  * Gets a single button element.
36
36
  *
37
37
  * @param {string} text The button text.
@@ -40,27 +40,39 @@ JSONEditor.defaults.themes.materialize = JSONEditor.AbstractTheme.extend(
40
40
  * @returns {HTMLElement} The button object.
41
41
  * @see http://materializecss.com/buttons.html
42
42
  */
43
- getButton: function(text, icon, title) {
43
+ getButton (text, icon, title) {
44
+ /* Prepare icon. */
45
+ if (icon) {
46
+ icon.classList.add('left')
47
+ icon.style.marginRight = '5px'
48
+ }
44
49
 
45
- // Prepare icon.
46
- if (text) {
47
- icon.classList.add('left');
48
- icon.style.marginRight = '5px';
49
- }
50
+ /* Create and return button. */
51
+ const el = super.getButton(text, icon, title)
52
+ el.classList.add('waves-effect', 'waves-light', 'btn')
53
+ el.style.fontSize = '0.75rem'
54
+ el.style.height = '24px'
55
+ el.style.lineHeight = '24px'
56
+ el.style.marginLeft = '5px'
57
+ el.style.padding = '0 0.5rem'
58
+ return el
59
+ }
50
60
 
51
- // Create and return button.
52
- var el = this._super(text, icon, title);
53
- el.classList.add('waves-effect', 'waves-light', 'btn');
54
- el.style.fontSize = '0.75rem';
55
- el.style.height = '24px';
56
- el.style.lineHeight = '24px';
57
- el.style.marginLeft = '5px';
58
- el.style.padding = '0 0.5rem';
59
- return el;
61
+ afterInputReady (input) {
62
+ let label = input.previousSibling
60
63
 
61
- },
64
+ if (input.type && input.type === 'range') {
65
+ label = input.parentElement.previousSibling
66
+ }
67
+
68
+ if (input.value || (input.dataset && input.dataset.containerFor && input.dataset.containerFor === 'radio')) {
69
+ if (label && label.localName === 'label') {
70
+ label.classList.add('active')
71
+ }
72
+ }
73
+ }
62
74
 
63
- /**
75
+ /**
64
76
  * Gets a form control object consisiting of several sub objects.
65
77
  *
66
78
  * @param {HTMLElement} label The label element.
@@ -70,207 +82,185 @@ JSONEditor.defaults.themes.materialize = JSONEditor.AbstractTheme.extend(
70
82
  * @returns {HTMLElement} The assembled DOM element.
71
83
  * @see http://materializecss.com/forms.html
72
84
  */
73
- getFormControl: function(label, input, description, infoText) {
74
-
75
- var ctrl,
76
- type = input.type;
77
-
78
- // Checkboxes get wrapped in p elements.
79
- if (type && type === 'checkbox') {
80
-
81
- ctrl = document.createElement('p');
82
- if (label) {
83
- var span = document.createElement('span');
84
- span.innerHTML = label.innerHTML;
85
- label.innerHTML = '';
86
- label.setAttribute('for', input.id);
87
- ctrl.appendChild(label);
88
- label.appendChild(input);
89
- label.appendChild(span);
90
- }
91
- else {
92
- ctrl.appendChild(input);
93
- }
94
-
95
- return ctrl;
96
-
85
+ getFormControl (label, input, description, infoText) {
86
+ let ctrl
87
+ const { type } = input
88
+
89
+ /* Checkboxes get wrapped in p elements. */
90
+ if (type && (type === 'checkbox' || type === 'radio')) {
91
+ ctrl = document.createElement('p')
92
+ if (label) {
93
+ const span = document.createElement('span')
94
+ span.innerHTML = label.innerHTML
95
+ label.innerHTML = ''
96
+ label.setAttribute('for', input.id)
97
+ ctrl.appendChild(label)
98
+ label.appendChild(input)
99
+ label.appendChild(span)
100
+ } else {
101
+ ctrl.appendChild(input)
97
102
  }
98
103
 
99
- // Anything else gets wrapped in divs.
100
- ctrl = this._super(label, input, description, infoText);
101
-
102
- // Not .input-field for select wrappers.
103
- if (!type || !type.startsWith('select'))
104
- ctrl.classList.add('input-field');
105
-
106
- // Color needs special attention.
107
- if (type && type === 'color') {
108
- input.style.height = '3rem';
109
- input.style.width = '100%';
110
- input.style.margin = '5px 0 20px 0';
111
- input.style.padding = '3px';
112
-
113
- if (label) {
114
- label.style.transform = 'translateY(-14px) scale(0.8)';
115
- label.style['-webkit-transform'] = 'translateY(-14px) scale(0.8)';
116
- label.style['-webkit-transform-origin'] = '0 0';
117
- label.style['transform-origin'] = '0 0';
118
- }
119
- }
104
+ return ctrl
105
+ }
120
106
 
121
- return ctrl;
107
+ /* Anything else gets wrapped in divs. */
108
+ ctrl = super.getFormControl(label, input, description, infoText)
109
+
110
+ /* Color needs special attention. */
111
+ if (type && type === 'color') {
112
+ input.style.height = '3rem'
113
+ input.style.width = '100%'
114
+ input.style.margin = '5px 0 20px 0'
115
+ input.style.padding = '3px'
116
+
117
+ if (label) {
118
+ label.style.transform = 'translateY(-14px) scale(0.8)'
119
+ label.style['-webkit-transform'] = 'translateY(-14px) scale(0.8)'
120
+ label.style['-webkit-transform-origin'] = '0 0'
121
+ label.style['transform-origin'] = '0 0'
122
+ }
123
+ }
122
124
 
123
- },
125
+ return ctrl
126
+ }
124
127
 
125
- getDescription: function(text) {
126
- var el = document.createElement('div');
127
- el.classList.add('grey-text');
128
- el.style.marginTop = '-15px';
129
- el.innerHTML = text;
130
- return el;
131
- },
128
+ getDescription (text) {
129
+ const el = document.createElement('div')
130
+ el.classList.add('grey-text')
131
+ /* el.style.marginTop = '-15px' */
132
+ if (window.DOMPurify) el.innerHTML = window.DOMPurify.sanitize(text)
133
+ else el.textContent = this.cleanText(text)
134
+ return el
135
+ }
132
136
 
133
- /**
137
+ /**
134
138
  * Gets a header element.
135
139
  *
136
140
  * @param {string|HTMLElement} text The header text or element.
137
141
  * @returns {HTMLElement} The header element.
138
142
  */
139
- getHeader: function(text) {
143
+ getHeader (text, pathDepth) {
144
+ const el = document.createElement('h5')
140
145
 
141
- var el = document.createElement('h5');
142
-
143
- if (typeof text === 'string') {
144
- el.textContent = text;
145
- } else {
146
- el.appendChild(text);
147
- }
148
-
149
- return el;
150
-
151
- },
152
-
153
- getChildEditorHolder: function() {
154
-
155
- var el = document.createElement('div');
156
- el.marginBottom = '10px';
157
- return el;
158
-
159
- },
160
-
161
- getIndentedPanel: function() {
162
- var el = document.createElement("div");
163
- el.classList.add("card-panel");
164
- return el;
165
- },
166
-
167
- getTable: function() {
168
-
169
- var el = document.createElement('table');
170
- el.classList.add('striped', 'bordered');
171
- el.style.marginBottom = '10px';
172
- return el;
173
-
174
- },
146
+ if (typeof text === 'string') {
147
+ el.textContent = text
148
+ } else {
149
+ el.appendChild(text)
150
+ }
175
151
 
176
- getTableRow: function() {
177
- return document.createElement('tr');
178
- },
152
+ return el
153
+ }
179
154
 
180
- getTableHead: function() {
181
- return document.createElement('thead');
182
- },
155
+ getChildEditorHolder () {
156
+ const el = document.createElement('div')
157
+ el.marginBottom = '10px'
158
+ return el
159
+ }
183
160
 
184
- getTableBody: function() {
185
- return document.createElement('tbody');
186
- },
161
+ getIndentedPanel () {
162
+ const el = document.createElement('div')
163
+ el.classList.add('card-panel')
164
+ return el
165
+ }
187
166
 
188
- getTableHeaderCell: function(text) {
167
+ getTable () {
168
+ const el = document.createElement('table')
169
+ el.classList.add('striped', 'bordered')
170
+ el.style.marginBottom = '10px'
171
+ return el
172
+ }
189
173
 
190
- var el = document.createElement('th');
191
- el.textContent = text;
192
- return el;
174
+ getTableRow () {
175
+ return document.createElement('tr')
176
+ }
193
177
 
194
- },
178
+ getTableHead () {
179
+ return document.createElement('thead')
180
+ }
195
181
 
196
- getTableCell: function() {
182
+ getTableBody () {
183
+ return document.createElement('tbody')
184
+ }
197
185
 
198
- var el = document.createElement('td');
199
- return el;
186
+ getTableHeaderCell (text) {
187
+ const el = document.createElement('th')
188
+ el.textContent = text
189
+ return el
190
+ }
200
191
 
201
- },
192
+ getTableCell () {
193
+ const el = document.createElement('td')
194
+ return el
195
+ }
202
196
 
203
- /**
197
+ /**
204
198
  * Gets the tab holder element.
205
199
  *
206
200
  * @returns {HTMLElement} The tab holder component.
207
201
  * @see https://github.com/Dogfalo/materialize/issues/2542#issuecomment-233458602
208
202
  */
209
- getTabHolder: function() {
210
-
211
- var html =[
212
- '<div class="col s2">',
213
- ' <ul class="tabs" style="height: auto; margin-top: 0.82rem; -ms-flex-direction: column; -webkit-flex-direction: column; flex-direction: column; display: -webkit-flex; display: flex;">',
214
- ' </ul>',
215
- '</div>',
216
- '<div class="col s10">',
217
- '<div>'
218
- ].join("\n");
219
-
220
- var el = document.createElement('div');
221
- el.classList.add('row', 'card-panel');
222
- el.innerHTML = html;
223
- return el;
224
-
225
- },
226
-
227
- /**
228
- * Add specified tab to specified holder element.
229
- *
230
- * @param {HTMLElement} holder The tab holder element.
231
- * @param {HTMLElement} tab The tab to add.
232
- */
233
- addTab: function(holder, tab) {
234
- holder.children[0].children[0].appendChild(tab);
235
- },
203
+ getTabHolder () {
204
+ const html = [
205
+ '<div class="col s2">',
206
+ ' <ul class="tabs" style="height: auto; margin-top: 0.82rem; -ms-flex-direction: column; -webkit-flex-direction: column; flex-direction: column; display: -webkit-flex; display: flex;">',
207
+ ' </ul>',
208
+ '</div>',
209
+ '<div class="col s10">',
210
+ '<div>'
211
+ ].join('\n')
212
+
213
+ const el = document.createElement('div')
214
+ el.classList.add('row', 'card-panel')
215
+ el.innerHTML = html
216
+ return el
217
+ }
218
+
219
+ /**
220
+ * Add specified tab to specified holder element.
221
+ *
222
+ * @param {HTMLElement} holder The tab holder element.
223
+ * @param {HTMLElement} tab The tab to add.
224
+ */
225
+ addTab (holder, tab) {
226
+ holder.children[0].children[0].appendChild(tab)
227
+ }
236
228
 
237
- /**
229
+ /**
238
230
  * Gets a single tab element.
239
231
  *
240
232
  * @param {HTMLElement} span The tab's content.
241
233
  * @returns {HTMLElement} The tab element.
242
234
  * @see https://github.com/Dogfalo/materialize/issues/2542#issuecomment-233458602
243
235
  */
244
- getTab: function(span) {
245
-
246
- var el = document.createElement('li');
247
- el.classList.add('tab');
248
- el.style = el.style || {};
249
- this.applyStyles(el,
250
- {
236
+ getTab (span) {
237
+ const el = document.createElement('li')
238
+ el.classList.add('tab')
239
+ el.style = el.style || {}
240
+ this.applyStyles(el,
241
+ {
251
242
  width: '100%',
252
243
  textAlign: 'left',
253
244
  lineHeight: '24px',
254
245
  height: '24px',
255
246
  fontSize: '14px',
256
247
  cursor: 'pointer'
257
- }
258
- );
259
- el.appendChild(span);
260
- return el;
261
- },
248
+ }
249
+ )
250
+ el.appendChild(span)
251
+ return el
252
+ }
262
253
 
263
- /**
254
+ /**
264
255
  * Marks specified tab as active.
265
256
  *
266
257
  * @returns {HTMLElement} The tab element.
267
258
  * @see https://github.com/Dogfalo/materialize/issues/2542#issuecomment-233458602
268
259
  */
269
- markTabActive: function(tab) {
270
-
271
- tab.style = tab.style || {};
272
- this.applyStyles(tab,
273
- {
260
+ markTabActive (tab) {
261
+ tab.style = tab.style || {}
262
+ this.applyStyles(tab,
263
+ {
274
264
  width: '100%',
275
265
  textAlign: 'left',
276
266
  lineHeight: '24px',
@@ -280,22 +270,20 @@ JSONEditor.defaults.themes.materialize = JSONEditor.AbstractTheme.extend(
280
270
  color: 'rgba(238,110,115,1)',
281
271
  transition: 'border-color .5s ease',
282
272
  borderRight: '3px solid #424242'
283
- }
284
- );
285
-
286
- },
273
+ }
274
+ )
275
+ }
287
276
 
288
- /**
277
+ /**
289
278
  * Marks specified tab as inactive.
290
279
  *
291
280
  * @returns {HTMLElement} The tab element.
292
281
  * @see https://github.com/Dogfalo/materialize/issues/2542#issuecomment-233458602
293
282
  */
294
- markTabInactive: function(tab) {
295
-
296
- tab.style = tab.style || {};
297
- this.applyStyles(tab,
298
- {
283
+ markTabInactive (tab) {
284
+ tab.style = tab.style || {}
285
+ this.applyStyles(tab,
286
+ {
299
287
  width: '100%',
300
288
  textAlign: 'left',
301
289
  lineHeight: '24px',
@@ -303,152 +291,136 @@ JSONEditor.defaults.themes.materialize = JSONEditor.AbstractTheme.extend(
303
291
  fontSize: '14px',
304
292
  cursor: 'pointer',
305
293
  color: 'rgba(238,110,115,0.7)'
306
- }
307
- );
308
-
309
- },
294
+ }
295
+ )
296
+ }
310
297
 
311
- /**
298
+ /**
312
299
  * Returns the element that holds the tab contents.
313
300
  *
314
301
  * @param {HTMLElement} tabHolder The full tab holder element.
315
302
  * @returns {HTMLElement} The content element inside specified tab holder.
316
303
  */
317
- getTabContentHolder: function(tabHolder) {
318
- return tabHolder.children[1];
319
- },
304
+ getTabContentHolder (tabHolder) {
305
+ return tabHolder.children[1]
306
+ }
320
307
 
321
- /**
308
+ /**
322
309
  * Creates and returns a tab content element.
323
310
  *
324
311
  * @returns {HTMLElement} The new tab content element.
325
312
  */
326
- getTabContent: function() {
327
- return document.createElement('div');
328
- },
313
+ getTabContent () {
314
+ return document.createElement('div')
315
+ }
329
316
 
330
- /**
317
+ /**
331
318
  * Adds an error message to the specified input element.
332
319
  *
333
320
  * @param {HTMLElement} input The input element that caused the error.
334
321
  * @param {string} text The error message.
335
322
  */
336
- addInputError: function(input, text) {
337
-
338
- // Get the parent element. Should most likely be a <div class="input-field" ... />.
339
- var parent = input.parentNode,
340
- el;
341
-
342
- if (!parent) return;
323
+ addInputError (input, text) {
324
+ /* Get the parent element. Should most likely be a <div class="input-field" ... />. */
325
+ const parent = input.parentNode
343
326
 
344
- // Remove any previous error.
345
- this.removeInputError(input);
327
+ if (!parent) return
346
328
 
347
- // Append an error message div.
348
- el = document.createElement('div');
349
- el.classList.add('error-text', 'red-text');
350
- el.textContent = text;
351
- parent.appendChild(el);
329
+ /* Remove any previous error. */
330
+ this.removeInputError(input)
352
331
 
353
- },
332
+ /* Append an error message div. */
333
+ const el = document.createElement('div')
334
+ el.classList.add('error-text', 'red-text')
335
+ el.textContent = text
336
+ parent.appendChild(el)
337
+ }
354
338
 
355
- /**
339
+ /**
356
340
  * Removes any error message from the specified input element.
357
341
  *
358
342
  * @param {HTMLElement} input The input element that previously caused the error.
359
343
  */
360
- removeInputError: function(input) {
361
-
362
- // Get the parent element. Should most likely be a <div class="input-field" ... />.
363
- var parent = input.parentElement,
364
- els;
365
-
366
- if (!parent) return;
344
+ removeInputError (input) {
345
+ /* Get the parent element. Should most likely be a <div class="input-field" ... />. */
346
+ const parent = input.parentElement
367
347
 
368
- // Remove all elements having class .error-text.
369
- els = parent.getElementsByClassName('error-text');
370
- for (var i = 0; i < els.length; i++)
371
- parent.removeChild(els[i]);
348
+ if (!parent) return
372
349
 
373
- },
350
+ /* Remove all elements having class .error-text. */
351
+ const els = parent.getElementsByClassName('error-text')
352
+ for (let i = 0; i < els.length; i++) { parent.removeChild(els[i]) }
353
+ }
374
354
 
375
- addTableRowError: function(row) {
376
- },
355
+ addTableRowError (row) {
356
+ }
377
357
 
378
- removeTableRowError: function(row) {
379
- },
358
+ removeTableRowError (row) {
359
+ }
380
360
 
381
- /**
361
+ /**
382
362
  * Gets a select DOM element.
383
363
  *
384
364
  * @param {object} options The option values.
385
365
  * @return {HTMLElement} The DOM element.
386
366
  * @see http://materializecss.com/forms.html#select
387
367
  */
388
- getSelectInput: function(options) {
389
-
390
- var select = this._super(options);
391
- select.classList.add('browser-default');
392
- return select;
393
-
394
- },
368
+ getSelectInput (options, multiple) {
369
+ const select = super.getSelectInput(options)
370
+ select.classList.add('browser-default')
371
+ return select
372
+ }
395
373
 
396
- /**
374
+ /**
397
375
  * Gets a textarea DOM element.
398
376
  *
399
377
  * @returns {HTMLElement} The DOM element.
400
378
  * @see http://materializecss.com/forms.html#textarea
401
379
  */
402
- getTextareaInput: function() {
403
- var el = document.createElement('textarea');
404
- el.style.marginBottom = '5px';
405
- el.style.fontSize = '1rem';
406
- el.style.fontFamily = 'monospace';
407
- return el;
408
- },
409
-
410
- getCheckbox: function() {
411
-
412
- var el = this.getFormInputField('checkbox');
413
- el.id = this.createUuid();
414
- return el;
380
+ getTextareaInput () {
381
+ const el = document.createElement('textarea')
382
+ el.style.marginBottom = '5px'
383
+ el.style.fontSize = '1rem'
384
+ el.style.fontFamily = 'monospace'
385
+ return el
386
+ }
415
387
 
416
- },
388
+ getCheckbox () {
389
+ const el = this.getFormInputField('checkbox')
390
+ el.id = this.createUuid()
391
+ return el
392
+ }
417
393
 
418
- /**
394
+ /**
419
395
  * Gets the modal element for displaying Edit JSON and Properties dialogs.
420
396
  *
421
397
  * @returns {HTMLElement} The modal DOM element.
422
398
  * @see http://materializecss.com/cards.html
423
399
  */
424
- getModal: function() {
425
-
426
- var el = document.createElement('div');
427
- el.classList.add('card-panel', 'z-depth-3');
428
- el.style.padding = '5px';
429
- el.style.position = 'absolute';
430
- el.style.zIndex = '10';
431
- el.style.display = 'none';
432
- return el;
433
-
434
- },
400
+ getModal () {
401
+ const el = document.createElement('div')
402
+ el.classList.add('card-panel', 'z-depth-3')
403
+ el.style.padding = '5px'
404
+ el.style.position = 'absolute'
405
+ el.style.zIndex = '10'
406
+ el.style.display = 'none'
407
+ return el
408
+ }
435
409
 
436
- /**
410
+ /**
437
411
  * Creates and returns a RFC4122 version 4 compliant unique id.
438
412
  *
439
413
  * @returns {string} A GUID.
440
414
  * @see https://stackoverflow.com/a/2117523
441
415
  */
442
- createUuid: function() {
443
-
444
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c)
445
- {
446
- var r = Math.random() * 16 | 0, v = c == 'x'? r: (r & 0x3 | 0x8);
447
- return v.toString(16);
448
- }
449
- );
450
-
416
+ createUuid () {
417
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
418
+ const r = Math.random() * 16 | 0; const v = c === 'x' ? r : (r & 0x3 | 0x8)
419
+ return v.toString(16)
451
420
  }
452
-
421
+ )
453
422
  }
454
- );
423
+ }
424
+
425
+ /* Custom stylesheet rules. format: "selector" : "CSS rules" */
426
+ materializeTheme.rules = { 'div[data-schemaid="root"]:after': 'position:relative;color:red;margin:10px 0;font-weight:600;display:block;width:100%;text-align:center;content:"This is an old JSON-Editor 1.x Theme and might not display elements correctly when used with the 2.x version"' }