@json-editor/json-editor 1.4.0-beta.0 → 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 (435) 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 +62 -16
  8. package/CHANGELOG.md +483 -113
  9. package/CONTRIBUTING.md +43 -4
  10. package/Makefile +26 -0
  11. package/README.md +632 -121
  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 -11550
  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 +42 -35
  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 +600 -582
  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 +9 -17
  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 +381 -327
  61. package/src/editor.js +733 -544
  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 +107 -130
  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 +141 -125
  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 +1190 -1068
  93. package/src/editors/radio.js +117 -101
  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 -433
  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 -265
  141. package/src/themes/bootstrap3.css +53 -0
  142. package/src/themes/bootstrap3.css.js +3 -0
  143. package/src/themes/bootstrap3.js +355 -262
  144. package/src/themes/bootstrap4.css +89 -0
  145. package/src/themes/bootstrap4.css.js +3 -0
  146. package/src/themes/bootstrap4.js +743 -237
  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 +535 -472
  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 -167
  156. package/src/themes/materialize.js +263 -292
  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 +909 -565
  165. package/src/validators/ip-validator.js +51 -0
  166. package/tests/Dockerfile +3 -0
  167. package/tests/README.md +25 -5
  168. package/tests/codeceptjs/codecept.json +9 -2
  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 -63
  174. package/tests/codeceptjs/editors/advanced_test.js +12 -9
  175. package/tests/codeceptjs/editors/array_any_of_test.js +50 -0
  176. package/tests/codeceptjs/editors/array_test.js +923 -657
  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 -6
  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 -64
  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 -7
  187. package/tests/codeceptjs/editors/number_test.js +75 -60
  188. package/tests/codeceptjs/editors/object_test.js +322 -80
  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 -10
  195. package/tests/codeceptjs/editors/select_test.js +47 -18
  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 +107 -91
  199. package/tests/codeceptjs/editors/table-confirm-delete_test.js +60 -54
  200. package/tests/codeceptjs/editors/tabs_test.js +15 -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 +11 -19
  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 +10 -8
  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 +10 -13
  301. package/tests/pages/grid.html +4 -7
  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 +56 -20
  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 -228
  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/src/class.js +0 -68
  430. package/src/editors/rating.js +0 -152
  431. package/src/ie9.js +0 -51
  432. package/src/intro.js +0 -23
  433. package/src/jquery.js +0 -64
  434. package/src/outro.js +0 -2
  435. 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,208 +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
- if (window.DOMPurify) el.innerHTML = window.DOMPurify.sanitize(text);
130
- else el.textContent = this.cleanText(text);
131
- return el;
132
- },
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
+ }
133
136
 
134
- /**
137
+ /**
135
138
  * Gets a header element.
136
139
  *
137
140
  * @param {string|HTMLElement} text The header text or element.
138
141
  * @returns {HTMLElement} The header element.
139
142
  */
140
- getHeader: function(text) {
143
+ getHeader (text, pathDepth) {
144
+ const el = document.createElement('h5')
141
145
 
142
- var el = document.createElement('h5');
143
-
144
- if (typeof text === 'string') {
145
- el.textContent = text;
146
- } else {
147
- el.appendChild(text);
148
- }
149
-
150
- return el;
151
-
152
- },
153
-
154
- getChildEditorHolder: function() {
155
-
156
- var el = document.createElement('div');
157
- el.marginBottom = '10px';
158
- return el;
159
-
160
- },
161
-
162
- getIndentedPanel: function() {
163
- var el = document.createElement("div");
164
- el.classList.add("card-panel");
165
- return el;
166
- },
167
-
168
- getTable: function() {
169
-
170
- var el = document.createElement('table');
171
- el.classList.add('striped', 'bordered');
172
- el.style.marginBottom = '10px';
173
- return el;
174
-
175
- },
146
+ if (typeof text === 'string') {
147
+ el.textContent = text
148
+ } else {
149
+ el.appendChild(text)
150
+ }
176
151
 
177
- getTableRow: function() {
178
- return document.createElement('tr');
179
- },
152
+ return el
153
+ }
180
154
 
181
- getTableHead: function() {
182
- return document.createElement('thead');
183
- },
155
+ getChildEditorHolder () {
156
+ const el = document.createElement('div')
157
+ el.marginBottom = '10px'
158
+ return el
159
+ }
184
160
 
185
- getTableBody: function() {
186
- return document.createElement('tbody');
187
- },
161
+ getIndentedPanel () {
162
+ const el = document.createElement('div')
163
+ el.classList.add('card-panel')
164
+ return el
165
+ }
188
166
 
189
- 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
+ }
190
173
 
191
- var el = document.createElement('th');
192
- el.textContent = text;
193
- return el;
174
+ getTableRow () {
175
+ return document.createElement('tr')
176
+ }
194
177
 
195
- },
178
+ getTableHead () {
179
+ return document.createElement('thead')
180
+ }
196
181
 
197
- getTableCell: function() {
182
+ getTableBody () {
183
+ return document.createElement('tbody')
184
+ }
198
185
 
199
- var el = document.createElement('td');
200
- return el;
186
+ getTableHeaderCell (text) {
187
+ const el = document.createElement('th')
188
+ el.textContent = text
189
+ return el
190
+ }
201
191
 
202
- },
192
+ getTableCell () {
193
+ const el = document.createElement('td')
194
+ return el
195
+ }
203
196
 
204
- /**
197
+ /**
205
198
  * Gets the tab holder element.
206
199
  *
207
200
  * @returns {HTMLElement} The tab holder component.
208
201
  * @see https://github.com/Dogfalo/materialize/issues/2542#issuecomment-233458602
209
202
  */
210
- getTabHolder: function() {
211
-
212
- var html =[
213
- '<div class="col s2">',
214
- ' <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;">',
215
- ' </ul>',
216
- '</div>',
217
- '<div class="col s10">',
218
- '<div>'
219
- ].join("\n");
220
-
221
- var el = document.createElement('div');
222
- el.classList.add('row', 'card-panel');
223
- el.innerHTML = html;
224
- return el;
225
-
226
- },
227
-
228
- /**
229
- * Add specified tab to specified holder element.
230
- *
231
- * @param {HTMLElement} holder The tab holder element.
232
- * @param {HTMLElement} tab The tab to add.
233
- */
234
- addTab: function(holder, tab) {
235
- holder.children[0].children[0].appendChild(tab);
236
- },
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
+ }
237
228
 
238
- /**
229
+ /**
239
230
  * Gets a single tab element.
240
231
  *
241
232
  * @param {HTMLElement} span The tab's content.
242
233
  * @returns {HTMLElement} The tab element.
243
234
  * @see https://github.com/Dogfalo/materialize/issues/2542#issuecomment-233458602
244
235
  */
245
- getTab: function(span) {
246
-
247
- var el = document.createElement('li');
248
- el.classList.add('tab');
249
- el.style = el.style || {};
250
- this.applyStyles(el,
251
- {
236
+ getTab (span) {
237
+ const el = document.createElement('li')
238
+ el.classList.add('tab')
239
+ el.style = el.style || {}
240
+ this.applyStyles(el,
241
+ {
252
242
  width: '100%',
253
243
  textAlign: 'left',
254
244
  lineHeight: '24px',
255
245
  height: '24px',
256
246
  fontSize: '14px',
257
247
  cursor: 'pointer'
258
- }
259
- );
260
- el.appendChild(span);
261
- return el;
262
- },
248
+ }
249
+ )
250
+ el.appendChild(span)
251
+ return el
252
+ }
263
253
 
264
- /**
254
+ /**
265
255
  * Marks specified tab as active.
266
256
  *
267
257
  * @returns {HTMLElement} The tab element.
268
258
  * @see https://github.com/Dogfalo/materialize/issues/2542#issuecomment-233458602
269
259
  */
270
- markTabActive: function(tab) {
271
-
272
- tab.style = tab.style || {};
273
- this.applyStyles(tab,
274
- {
260
+ markTabActive (tab) {
261
+ tab.style = tab.style || {}
262
+ this.applyStyles(tab,
263
+ {
275
264
  width: '100%',
276
265
  textAlign: 'left',
277
266
  lineHeight: '24px',
@@ -281,22 +270,20 @@ JSONEditor.defaults.themes.materialize = JSONEditor.AbstractTheme.extend(
281
270
  color: 'rgba(238,110,115,1)',
282
271
  transition: 'border-color .5s ease',
283
272
  borderRight: '3px solid #424242'
284
- }
285
- );
286
-
287
- },
273
+ }
274
+ )
275
+ }
288
276
 
289
- /**
277
+ /**
290
278
  * Marks specified tab as inactive.
291
279
  *
292
280
  * @returns {HTMLElement} The tab element.
293
281
  * @see https://github.com/Dogfalo/materialize/issues/2542#issuecomment-233458602
294
282
  */
295
- markTabInactive: function(tab) {
296
-
297
- tab.style = tab.style || {};
298
- this.applyStyles(tab,
299
- {
283
+ markTabInactive (tab) {
284
+ tab.style = tab.style || {}
285
+ this.applyStyles(tab,
286
+ {
300
287
  width: '100%',
301
288
  textAlign: 'left',
302
289
  lineHeight: '24px',
@@ -304,152 +291,136 @@ JSONEditor.defaults.themes.materialize = JSONEditor.AbstractTheme.extend(
304
291
  fontSize: '14px',
305
292
  cursor: 'pointer',
306
293
  color: 'rgba(238,110,115,0.7)'
307
- }
308
- );
309
-
310
- },
294
+ }
295
+ )
296
+ }
311
297
 
312
- /**
298
+ /**
313
299
  * Returns the element that holds the tab contents.
314
300
  *
315
301
  * @param {HTMLElement} tabHolder The full tab holder element.
316
302
  * @returns {HTMLElement} The content element inside specified tab holder.
317
303
  */
318
- getTabContentHolder: function(tabHolder) {
319
- return tabHolder.children[1];
320
- },
304
+ getTabContentHolder (tabHolder) {
305
+ return tabHolder.children[1]
306
+ }
321
307
 
322
- /**
308
+ /**
323
309
  * Creates and returns a tab content element.
324
310
  *
325
311
  * @returns {HTMLElement} The new tab content element.
326
312
  */
327
- getTabContent: function() {
328
- return document.createElement('div');
329
- },
313
+ getTabContent () {
314
+ return document.createElement('div')
315
+ }
330
316
 
331
- /**
317
+ /**
332
318
  * Adds an error message to the specified input element.
333
319
  *
334
320
  * @param {HTMLElement} input The input element that caused the error.
335
321
  * @param {string} text The error message.
336
322
  */
337
- addInputError: function(input, text) {
338
-
339
- // Get the parent element. Should most likely be a <div class="input-field" ... />.
340
- var parent = input.parentNode,
341
- el;
342
-
343
- 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
344
326
 
345
- // Remove any previous error.
346
- this.removeInputError(input);
327
+ if (!parent) return
347
328
 
348
- // Append an error message div.
349
- el = document.createElement('div');
350
- el.classList.add('error-text', 'red-text');
351
- el.textContent = text;
352
- parent.appendChild(el);
329
+ /* Remove any previous error. */
330
+ this.removeInputError(input)
353
331
 
354
- },
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
+ }
355
338
 
356
- /**
339
+ /**
357
340
  * Removes any error message from the specified input element.
358
341
  *
359
342
  * @param {HTMLElement} input The input element that previously caused the error.
360
343
  */
361
- removeInputError: function(input) {
362
-
363
- // Get the parent element. Should most likely be a <div class="input-field" ... />.
364
- var parent = input.parentElement,
365
- els;
366
-
367
- 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
368
347
 
369
- // Remove all elements having class .error-text.
370
- els = parent.getElementsByClassName('error-text');
371
- for (var i = 0; i < els.length; i++)
372
- parent.removeChild(els[i]);
348
+ if (!parent) return
373
349
 
374
- },
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
+ }
375
354
 
376
- addTableRowError: function(row) {
377
- },
355
+ addTableRowError (row) {
356
+ }
378
357
 
379
- removeTableRowError: function(row) {
380
- },
358
+ removeTableRowError (row) {
359
+ }
381
360
 
382
- /**
361
+ /**
383
362
  * Gets a select DOM element.
384
363
  *
385
364
  * @param {object} options The option values.
386
365
  * @return {HTMLElement} The DOM element.
387
366
  * @see http://materializecss.com/forms.html#select
388
367
  */
389
- getSelectInput: function(options) {
390
-
391
- var select = this._super(options);
392
- select.classList.add('browser-default');
393
- return select;
394
-
395
- },
368
+ getSelectInput (options, multiple) {
369
+ const select = super.getSelectInput(options)
370
+ select.classList.add('browser-default')
371
+ return select
372
+ }
396
373
 
397
- /**
374
+ /**
398
375
  * Gets a textarea DOM element.
399
376
  *
400
377
  * @returns {HTMLElement} The DOM element.
401
378
  * @see http://materializecss.com/forms.html#textarea
402
379
  */
403
- getTextareaInput: function() {
404
- var el = document.createElement('textarea');
405
- el.style.marginBottom = '5px';
406
- el.style.fontSize = '1rem';
407
- el.style.fontFamily = 'monospace';
408
- return el;
409
- },
410
-
411
- getCheckbox: function() {
412
-
413
- var el = this.getFormInputField('checkbox');
414
- el.id = this.createUuid();
415
- 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
+ }
416
387
 
417
- },
388
+ getCheckbox () {
389
+ const el = this.getFormInputField('checkbox')
390
+ el.id = this.createUuid()
391
+ return el
392
+ }
418
393
 
419
- /**
394
+ /**
420
395
  * Gets the modal element for displaying Edit JSON and Properties dialogs.
421
396
  *
422
397
  * @returns {HTMLElement} The modal DOM element.
423
398
  * @see http://materializecss.com/cards.html
424
399
  */
425
- getModal: function() {
426
-
427
- var el = document.createElement('div');
428
- el.classList.add('card-panel', 'z-depth-3');
429
- el.style.padding = '5px';
430
- el.style.position = 'absolute';
431
- el.style.zIndex = '10';
432
- el.style.display = 'none';
433
- return el;
434
-
435
- },
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
+ }
436
409
 
437
- /**
410
+ /**
438
411
  * Creates and returns a RFC4122 version 4 compliant unique id.
439
412
  *
440
413
  * @returns {string} A GUID.
441
414
  * @see https://stackoverflow.com/a/2117523
442
415
  */
443
- createUuid: function() {
444
-
445
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c)
446
- {
447
- var r = Math.random() * 16 | 0, v = c == 'x'? r: (r & 0x3 | 0x8);
448
- return v.toString(16);
449
- }
450
- );
451
-
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)
452
420
  }
453
-
421
+ )
454
422
  }
455
- );
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"' }