django-handyhelpers 0.3.20__py3-none-any.whl → 0.3.35__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (571) hide show
  1. {django_handyhelpers-0.3.20.dist-info → django_handyhelpers-0.3.35.dist-info}/METADATA +16 -6
  2. {django_handyhelpers-0.3.20.dist-info → django_handyhelpers-0.3.35.dist-info}/RECORD +562 -75
  3. {django_handyhelpers-0.3.20.dist-info → django_handyhelpers-0.3.35.dist-info}/WHEEL +1 -1
  4. handyhelpers/__init__.py +6 -6
  5. handyhelpers/forms.py +9 -1
  6. handyhelpers/mixins/form_mixins.py +61 -0
  7. handyhelpers/mixins/model_mixins.py +21 -0
  8. handyhelpers/mixins/serializer_mixins.py +35 -0
  9. handyhelpers/mixins/view_mixins.py +5 -2
  10. handyhelpers/serializers.py +23 -3
  11. handyhelpers/static/handyhelpers/css/table_sortable.css +17 -0
  12. handyhelpers/static/handyhelpers/js/sidebar.js +8 -4
  13. handyhelpers/static/handyhelpers/js/table_sortable.js +119 -0
  14. handyhelpers/static/node_modules/.bin/acorn +4 -0
  15. handyhelpers/static/node_modules/.bin/css-b64-images +13 -0
  16. handyhelpers/static/node_modules/.bin/esbuild +0 -0
  17. handyhelpers/static/node_modules/.bin/html-minifier-terser +308 -0
  18. handyhelpers/static/node_modules/.bin/minify +98 -0
  19. handyhelpers/static/node_modules/.bin/terser +21 -0
  20. handyhelpers/static/node_modules/.bin/uglifyjs +624 -0
  21. handyhelpers/static/node_modules/.package-lock.json +750 -0
  22. handyhelpers/static/node_modules/@esbuild/linux-x64/README.md +3 -0
  23. handyhelpers/static/node_modules/@esbuild/linux-x64/bin/esbuild +0 -0
  24. handyhelpers/static/node_modules/@esbuild/linux-x64/package.json +20 -0
  25. handyhelpers/static/node_modules/@jridgewell/gen-mapping/LICENSE +19 -0
  26. handyhelpers/static/node_modules/@jridgewell/gen-mapping/README.md +227 -0
  27. handyhelpers/static/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs +230 -0
  28. handyhelpers/static/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs.map +1 -0
  29. handyhelpers/static/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js +246 -0
  30. handyhelpers/static/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js.map +1 -0
  31. handyhelpers/static/node_modules/@jridgewell/gen-mapping/dist/types/gen-mapping.d.ts +88 -0
  32. handyhelpers/static/node_modules/@jridgewell/gen-mapping/dist/types/sourcemap-segment.d.ts +12 -0
  33. handyhelpers/static/node_modules/@jridgewell/gen-mapping/dist/types/types.d.ts +36 -0
  34. handyhelpers/static/node_modules/@jridgewell/gen-mapping/package.json +76 -0
  35. handyhelpers/static/node_modules/@jridgewell/resolve-uri/LICENSE +19 -0
  36. handyhelpers/static/node_modules/@jridgewell/resolve-uri/README.md +40 -0
  37. handyhelpers/static/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs +232 -0
  38. handyhelpers/static/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs.map +1 -0
  39. handyhelpers/static/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js +240 -0
  40. handyhelpers/static/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js.map +1 -0
  41. handyhelpers/static/node_modules/@jridgewell/resolve-uri/dist/types/resolve-uri.d.ts +4 -0
  42. handyhelpers/static/node_modules/@jridgewell/resolve-uri/package.json +69 -0
  43. handyhelpers/static/node_modules/@jridgewell/set-array/LICENSE +19 -0
  44. handyhelpers/static/node_modules/@jridgewell/set-array/README.md +37 -0
  45. handyhelpers/static/node_modules/@jridgewell/set-array/dist/set-array.mjs +69 -0
  46. handyhelpers/static/node_modules/@jridgewell/set-array/dist/set-array.mjs.map +1 -0
  47. handyhelpers/static/node_modules/@jridgewell/set-array/dist/set-array.umd.js +83 -0
  48. handyhelpers/static/node_modules/@jridgewell/set-array/dist/set-array.umd.js.map +1 -0
  49. handyhelpers/static/node_modules/@jridgewell/set-array/dist/types/set-array.d.ts +32 -0
  50. handyhelpers/static/node_modules/@jridgewell/set-array/package.json +65 -0
  51. handyhelpers/static/node_modules/@jridgewell/source-map/LICENSE +19 -0
  52. handyhelpers/static/node_modules/@jridgewell/source-map/README.md +184 -0
  53. handyhelpers/static/node_modules/@jridgewell/source-map/dist/source-map.cjs +95 -0
  54. handyhelpers/static/node_modules/@jridgewell/source-map/dist/source-map.cjs.map +1 -0
  55. handyhelpers/static/node_modules/@jridgewell/source-map/dist/source-map.mjs +90 -0
  56. handyhelpers/static/node_modules/@jridgewell/source-map/dist/source-map.mjs.map +1 -0
  57. handyhelpers/static/node_modules/@jridgewell/source-map/dist/source-map.umd.js +1242 -0
  58. handyhelpers/static/node_modules/@jridgewell/source-map/dist/source-map.umd.js.map +1 -0
  59. handyhelpers/static/node_modules/@jridgewell/source-map/dist/types/source-map.d.ts +35 -0
  60. handyhelpers/static/node_modules/@jridgewell/source-map/package.json +71 -0
  61. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/LICENSE +21 -0
  62. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/README.md +264 -0
  63. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs +424 -0
  64. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map +1 -0
  65. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js +439 -0
  66. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js.map +1 -0
  67. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/dist/types/scopes.d.ts +49 -0
  68. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/dist/types/sourcemap-codec.d.ts +8 -0
  69. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/dist/types/strings.d.ts +15 -0
  70. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/dist/types/vlq.d.ts +6 -0
  71. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/package.json +75 -0
  72. handyhelpers/static/node_modules/@jridgewell/trace-mapping/LICENSE +19 -0
  73. handyhelpers/static/node_modules/@jridgewell/trace-mapping/README.md +257 -0
  74. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs +580 -0
  75. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs.map +1 -0
  76. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js +600 -0
  77. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js.map +1 -0
  78. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/any-map.d.ts +8 -0
  79. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/binary-search.d.ts +32 -0
  80. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/by-source.d.ts +7 -0
  81. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/resolve.d.ts +1 -0
  82. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/sort.d.ts +2 -0
  83. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/sourcemap-segment.d.ts +16 -0
  84. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/strip-filename.d.ts +4 -0
  85. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/trace-mapping.d.ts +79 -0
  86. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/types.d.ts +99 -0
  87. handyhelpers/static/node_modules/@jridgewell/trace-mapping/package.json +77 -0
  88. handyhelpers/static/node_modules/@popperjs/core/dist/cjs/enums.js +1 -1
  89. handyhelpers/static/node_modules/@popperjs/core/dist/cjs/popper-base.js +12 -170
  90. handyhelpers/static/node_modules/@popperjs/core/dist/cjs/popper-base.js.map +1 -1
  91. handyhelpers/static/node_modules/@popperjs/core/dist/cjs/popper-lite.js +14 -184
  92. handyhelpers/static/node_modules/@popperjs/core/dist/cjs/popper-lite.js.map +1 -1
  93. handyhelpers/static/node_modules/@popperjs/core/dist/cjs/popper.js +14 -197
  94. handyhelpers/static/node_modules/@popperjs/core/dist/cjs/popper.js.map +1 -1
  95. handyhelpers/static/node_modules/@popperjs/core/dist/esm/createPopper.js +6 -66
  96. handyhelpers/static/node_modules/@popperjs/core/dist/esm/modifiers/arrow.js +1 -12
  97. handyhelpers/static/node_modules/@popperjs/core/dist/esm/modifiers/computeStyles.js +2 -14
  98. handyhelpers/static/node_modules/@popperjs/core/dist/esm/utils/computeAutoPlacement.js +0 -4
  99. handyhelpers/static/node_modules/@popperjs/core/dist/esm/utils/userAgent.js +1 -1
  100. handyhelpers/static/node_modules/@popperjs/core/dist/umd/enums.js +1 -1
  101. handyhelpers/static/node_modules/@popperjs/core/dist/umd/enums.min.js +1 -1
  102. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper-base.js +12 -170
  103. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper-base.js.map +1 -1
  104. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper-base.min.js +2 -2
  105. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper-base.min.js.map +1 -1
  106. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper-lite.js +14 -184
  107. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper-lite.js.map +1 -1
  108. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper-lite.min.js +2 -2
  109. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper-lite.min.js.map +1 -1
  110. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper.js +14 -197
  111. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper.js.map +1 -1
  112. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper.min.js +2 -2
  113. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper.min.js.map +1 -1
  114. handyhelpers/static/node_modules/@popperjs/core/lib/createPopper.js +6 -66
  115. handyhelpers/static/node_modules/@popperjs/core/lib/createPopper.js.flow +2 -80
  116. handyhelpers/static/node_modules/@popperjs/core/lib/modifiers/arrow.js +1 -12
  117. handyhelpers/static/node_modules/@popperjs/core/lib/modifiers/arrow.js.flow +0 -22
  118. handyhelpers/static/node_modules/@popperjs/core/lib/modifiers/computeStyles.js +2 -14
  119. handyhelpers/static/node_modules/@popperjs/core/lib/modifiers/computeStyles.js.flow +3 -33
  120. handyhelpers/static/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js +0 -4
  121. handyhelpers/static/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js.flow +0 -12
  122. handyhelpers/static/node_modules/@popperjs/core/lib/utils/userAgent.js +1 -1
  123. handyhelpers/static/node_modules/@popperjs/core/lib/utils/userAgent.js.flow +1 -1
  124. handyhelpers/static/node_modules/@popperjs/core/package.json +1 -1
  125. handyhelpers/static/node_modules/@putout/minify/LICENSE +21 -0
  126. handyhelpers/static/node_modules/@putout/minify/README.md +110 -0
  127. handyhelpers/static/node_modules/@putout/minify/bundle/minify.min.js +52 -0
  128. handyhelpers/static/node_modules/@putout/minify/package.json +112 -0
  129. handyhelpers/static/node_modules/@swc/core/Visitor.d.ts +218 -0
  130. handyhelpers/static/node_modules/@swc/core/Visitor.js +1407 -0
  131. handyhelpers/static/node_modules/@swc/core/binding.d.ts +56 -0
  132. handyhelpers/static/node_modules/@swc/core/binding.js +351 -0
  133. handyhelpers/static/node_modules/@swc/core/index.d.ts +118 -0
  134. handyhelpers/static/node_modules/@swc/core/index.js +439 -0
  135. handyhelpers/static/node_modules/@swc/core/package.json +114 -0
  136. handyhelpers/static/node_modules/@swc/core/postinstall.js +148 -0
  137. handyhelpers/static/node_modules/@swc/core/spack.d.ts +51 -0
  138. handyhelpers/static/node_modules/@swc/core/spack.js +87 -0
  139. handyhelpers/static/node_modules/@swc/core/util.d.ts +1 -0
  140. handyhelpers/static/node_modules/@swc/core/util.js +104 -0
  141. handyhelpers/static/node_modules/@swc/core-linux-x64-gnu/README.md +3 -0
  142. handyhelpers/static/node_modules/@swc/core-linux-x64-gnu/package.json +45 -0
  143. handyhelpers/static/node_modules/@swc/core-linux-x64-gnu/swc.linux-x64-gnu.node +0 -0
  144. handyhelpers/static/node_modules/@swc/counter/CHANGELOG.md +7 -0
  145. handyhelpers/static/node_modules/@swc/counter/README.md +7 -0
  146. handyhelpers/static/node_modules/@swc/counter/index.js +1 -0
  147. handyhelpers/static/node_modules/@swc/counter/package.json +27 -0
  148. handyhelpers/static/node_modules/@swc/types/LICENSE +201 -0
  149. handyhelpers/static/node_modules/@swc/types/README.md +4 -0
  150. handyhelpers/static/node_modules/@swc/types/assumptions.d.ts +92 -0
  151. handyhelpers/static/node_modules/@swc/types/assumptions.js +2 -0
  152. handyhelpers/static/node_modules/@swc/types/index.d.ts +1977 -0
  153. handyhelpers/static/node_modules/@swc/types/index.js +2 -0
  154. handyhelpers/static/node_modules/@swc/types/package.json +39 -0
  155. handyhelpers/static/node_modules/acorn/CHANGELOG.md +928 -0
  156. handyhelpers/static/node_modules/acorn/LICENSE +21 -0
  157. handyhelpers/static/node_modules/acorn/README.md +282 -0
  158. handyhelpers/static/node_modules/acorn/bin/acorn +4 -0
  159. handyhelpers/static/node_modules/acorn/dist/acorn.d.mts +866 -0
  160. handyhelpers/static/node_modules/acorn/dist/acorn.d.ts +866 -0
  161. handyhelpers/static/node_modules/acorn/dist/acorn.js +6174 -0
  162. handyhelpers/static/node_modules/acorn/dist/acorn.mjs +6145 -0
  163. handyhelpers/static/node_modules/acorn/dist/bin.js +90 -0
  164. handyhelpers/static/node_modules/acorn/package.json +50 -0
  165. handyhelpers/static/node_modules/buffer-from/LICENSE +21 -0
  166. handyhelpers/static/node_modules/buffer-from/index.js +72 -0
  167. handyhelpers/static/node_modules/buffer-from/package.json +19 -0
  168. handyhelpers/static/node_modules/buffer-from/readme.md +69 -0
  169. handyhelpers/static/node_modules/camel-case/LICENSE +21 -0
  170. handyhelpers/static/node_modules/camel-case/README.md +47 -0
  171. handyhelpers/static/node_modules/camel-case/dist/index.d.ts +5 -0
  172. handyhelpers/static/node_modules/camel-case/dist/index.js +23 -0
  173. handyhelpers/static/node_modules/camel-case/dist/index.js.map +1 -0
  174. handyhelpers/static/node_modules/camel-case/dist/index.spec.d.ts +1 -0
  175. handyhelpers/static/node_modules/camel-case/dist/index.spec.js +26 -0
  176. handyhelpers/static/node_modules/camel-case/dist/index.spec.js.map +1 -0
  177. handyhelpers/static/node_modules/camel-case/dist.es2015/index.d.ts +5 -0
  178. handyhelpers/static/node_modules/camel-case/dist.es2015/index.js +17 -0
  179. handyhelpers/static/node_modules/camel-case/dist.es2015/index.js.map +1 -0
  180. handyhelpers/static/node_modules/camel-case/dist.es2015/index.spec.d.ts +1 -0
  181. handyhelpers/static/node_modules/camel-case/dist.es2015/index.spec.js +24 -0
  182. handyhelpers/static/node_modules/camel-case/dist.es2015/index.spec.js.map +1 -0
  183. handyhelpers/static/node_modules/camel-case/package.json +89 -0
  184. handyhelpers/static/node_modules/clean-css/History.md +1504 -0
  185. handyhelpers/static/node_modules/clean-css/LICENSE +19 -0
  186. handyhelpers/static/node_modules/clean-css/README.md +987 -0
  187. handyhelpers/static/node_modules/clean-css/index.js +1 -0
  188. handyhelpers/static/node_modules/clean-css/package.json +48 -0
  189. handyhelpers/static/node_modules/commander/LICENSE +22 -0
  190. handyhelpers/static/node_modules/commander/Readme.md +1134 -0
  191. handyhelpers/static/node_modules/commander/esm.mjs +16 -0
  192. handyhelpers/static/node_modules/commander/index.js +27 -0
  193. handyhelpers/static/node_modules/commander/package-support.json +16 -0
  194. handyhelpers/static/node_modules/commander/package.json +80 -0
  195. handyhelpers/static/node_modules/commander/typings/index.d.ts +889 -0
  196. handyhelpers/static/node_modules/css-b64-images/.npmignore +15 -0
  197. handyhelpers/static/node_modules/css-b64-images/.travis.yml +5 -0
  198. handyhelpers/static/node_modules/css-b64-images/README.md +78 -0
  199. handyhelpers/static/node_modules/css-b64-images/bin/css-b64-images +13 -0
  200. handyhelpers/static/node_modules/css-b64-images/draft.png +0 -0
  201. handyhelpers/static/node_modules/css-b64-images/draft.xcf +0 -0
  202. handyhelpers/static/node_modules/css-b64-images/package.json +30 -0
  203. handyhelpers/static/node_modules/css-b64-images/test/css-b64-images-test.js +38 -0
  204. handyhelpers/static/node_modules/css-b64-images/test/fixture/css/style.css +52 -0
  205. handyhelpers/static/node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.eot +0 -0
  206. handyhelpers/static/node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.svg +248 -0
  207. handyhelpers/static/node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.ttf +0 -0
  208. handyhelpers/static/node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.woff +0 -0
  209. handyhelpers/static/node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.eot +0 -0
  210. handyhelpers/static/node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.svg +245 -0
  211. handyhelpers/static/node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.ttf +0 -0
  212. handyhelpers/static/node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.woff +0 -0
  213. handyhelpers/static/node_modules/css-b64-images/test/fixture/img/background-pattern.gif +0 -0
  214. handyhelpers/static/node_modules/css-b64-images/test/fixture/img/dots.svg +6 -0
  215. handyhelpers/static/node_modules/css-b64-images/test/fixture/img/mixit-banner.png +0 -0
  216. handyhelpers/static/node_modules/debug/LICENSE +20 -0
  217. handyhelpers/static/node_modules/debug/README.md +481 -0
  218. handyhelpers/static/node_modules/debug/package.json +65 -0
  219. handyhelpers/static/node_modules/debug/src/browser.js +272 -0
  220. handyhelpers/static/node_modules/debug/src/common.js +292 -0
  221. handyhelpers/static/node_modules/debug/src/index.js +10 -0
  222. handyhelpers/static/node_modules/debug/src/node.js +263 -0
  223. handyhelpers/static/node_modules/dot-case/LICENSE +21 -0
  224. handyhelpers/static/node_modules/dot-case/README.md +37 -0
  225. handyhelpers/static/node_modules/dot-case/dist/index.d.ts +3 -0
  226. handyhelpers/static/node_modules/dot-case/dist/index.js +11 -0
  227. handyhelpers/static/node_modules/dot-case/dist/index.js.map +1 -0
  228. handyhelpers/static/node_modules/dot-case/dist/index.spec.d.ts +1 -0
  229. handyhelpers/static/node_modules/dot-case/dist/index.spec.js +26 -0
  230. handyhelpers/static/node_modules/dot-case/dist/index.spec.js.map +1 -0
  231. handyhelpers/static/node_modules/dot-case/dist.es2015/index.d.ts +3 -0
  232. handyhelpers/static/node_modules/dot-case/dist.es2015/index.js +7 -0
  233. handyhelpers/static/node_modules/dot-case/dist.es2015/index.js.map +1 -0
  234. handyhelpers/static/node_modules/dot-case/dist.es2015/index.spec.d.ts +1 -0
  235. handyhelpers/static/node_modules/dot-case/dist.es2015/index.spec.js +24 -0
  236. handyhelpers/static/node_modules/dot-case/dist.es2015/index.spec.js.map +1 -0
  237. handyhelpers/static/node_modules/dot-case/package.json +89 -0
  238. handyhelpers/static/node_modules/entities/LICENSE +11 -0
  239. handyhelpers/static/node_modules/entities/package.json +90 -0
  240. handyhelpers/static/node_modules/entities/readme.md +122 -0
  241. handyhelpers/static/node_modules/esbuild/LICENSE.md +21 -0
  242. handyhelpers/static/node_modules/esbuild/README.md +3 -0
  243. handyhelpers/static/node_modules/esbuild/bin/esbuild +0 -0
  244. handyhelpers/static/node_modules/esbuild/install.js +286 -0
  245. handyhelpers/static/node_modules/esbuild/package.json +47 -0
  246. handyhelpers/static/node_modules/find-up/index.d.ts +247 -0
  247. handyhelpers/static/node_modules/find-up/index.js +107 -0
  248. handyhelpers/static/node_modules/find-up/license +9 -0
  249. handyhelpers/static/node_modules/find-up/package.json +61 -0
  250. handyhelpers/static/node_modules/find-up/readme.md +160 -0
  251. handyhelpers/static/node_modules/fun-effects/LICENSE +674 -0
  252. handyhelpers/static/node_modules/fun-effects/README.md +10 -0
  253. handyhelpers/static/node_modules/fun-effects/dist/css/background_icons.min.css +1 -0
  254. handyhelpers/static/node_modules/fun-effects/dist/css/blur_group.min.css +1 -0
  255. handyhelpers/static/node_modules/fun-effects/dist/css/fades.min.css +1 -0
  256. handyhelpers/static/node_modules/fun-effects/dist/css/marquee.min.css +1 -0
  257. handyhelpers/static/node_modules/fun-effects/dist/css/scroller.min.css +1 -0
  258. handyhelpers/static/node_modules/fun-effects/dist/index.js +15 -0
  259. handyhelpers/static/node_modules/fun-effects/dist/js/background_icons.min.js +1 -0
  260. handyhelpers/static/node_modules/fun-effects/dist/js/marquee.min.js +1 -0
  261. handyhelpers/static/node_modules/fun-effects/dist/js/scroller.min.js +1 -0
  262. handyhelpers/static/node_modules/fun-effects/package.json +39 -0
  263. handyhelpers/static/node_modules/fun-effects/src/css/background_icons.css +39 -0
  264. handyhelpers/static/node_modules/fun-effects/src/css/blur_group.css +22 -0
  265. handyhelpers/static/node_modules/fun-effects/src/css/fades.css +94 -0
  266. handyhelpers/static/node_modules/fun-effects/src/css/marquee.css +45 -0
  267. handyhelpers/static/node_modules/fun-effects/src/css/scroller.css +144 -0
  268. handyhelpers/static/node_modules/fun-effects/src/index.js +15 -0
  269. handyhelpers/static/node_modules/fun-effects/src/js/background_icons.js +101 -0
  270. handyhelpers/static/node_modules/fun-effects/src/js/marquee.js +81 -0
  271. handyhelpers/static/node_modules/fun-effects/src/js/scroller.js +37 -0
  272. handyhelpers/static/node_modules/html-minifier-terser/LICENSE +22 -0
  273. handyhelpers/static/node_modules/html-minifier-terser/README.md +168 -0
  274. handyhelpers/static/node_modules/html-minifier-terser/cli.js +308 -0
  275. handyhelpers/static/node_modules/html-minifier-terser/dist/htmlminifier.cjs +1857 -0
  276. handyhelpers/static/node_modules/html-minifier-terser/dist/htmlminifier.esm.bundle.js +57509 -0
  277. handyhelpers/static/node_modules/html-minifier-terser/dist/htmlminifier.umd.bundle.js +57520 -0
  278. handyhelpers/static/node_modules/html-minifier-terser/dist/htmlminifier.umd.bundle.min.js +9 -0
  279. handyhelpers/static/node_modules/html-minifier-terser/package.json +105 -0
  280. handyhelpers/static/node_modules/html-minifier-terser/src/htmlminifier.js +1366 -0
  281. handyhelpers/static/node_modules/html-minifier-terser/src/htmlparser.js +565 -0
  282. handyhelpers/static/node_modules/html-minifier-terser/src/tokenchain.js +68 -0
  283. handyhelpers/static/node_modules/html-minifier-terser/src/utils.js +11 -0
  284. handyhelpers/static/node_modules/jju/LICENSE +21 -0
  285. handyhelpers/static/node_modules/jju/Makefile +20 -0
  286. handyhelpers/static/node_modules/jju/README.md +249 -0
  287. handyhelpers/static/node_modules/jju/index.js +32 -0
  288. handyhelpers/static/node_modules/jju/package.json +34 -0
  289. handyhelpers/static/node_modules/jju/package.yaml +36 -0
  290. handyhelpers/static/node_modules/locate-path/index.d.ts +92 -0
  291. handyhelpers/static/node_modules/locate-path/index.js +77 -0
  292. handyhelpers/static/node_modules/locate-path/license +9 -0
  293. handyhelpers/static/node_modules/locate-path/package.json +48 -0
  294. handyhelpers/static/node_modules/locate-path/readme.md +123 -0
  295. handyhelpers/static/node_modules/lower-case/LICENSE +21 -0
  296. handyhelpers/static/node_modules/lower-case/README.md +35 -0
  297. handyhelpers/static/node_modules/lower-case/dist/index.d.ts +8 -0
  298. handyhelpers/static/node_modules/lower-case/dist/index.js +53 -0
  299. handyhelpers/static/node_modules/lower-case/dist/index.js.map +1 -0
  300. handyhelpers/static/node_modules/lower-case/dist/index.spec.d.ts +1 -0
  301. handyhelpers/static/node_modules/lower-case/dist/index.spec.js +36 -0
  302. handyhelpers/static/node_modules/lower-case/dist/index.spec.js.map +1 -0
  303. handyhelpers/static/node_modules/lower-case/dist.es2015/index.d.ts +8 -0
  304. handyhelpers/static/node_modules/lower-case/dist.es2015/index.js +48 -0
  305. handyhelpers/static/node_modules/lower-case/dist.es2015/index.js.map +1 -0
  306. handyhelpers/static/node_modules/lower-case/dist.es2015/index.spec.d.ts +1 -0
  307. handyhelpers/static/node_modules/lower-case/dist.es2015/index.spec.js +34 -0
  308. handyhelpers/static/node_modules/lower-case/dist.es2015/index.spec.js.map +1 -0
  309. handyhelpers/static/node_modules/lower-case/package.json +87 -0
  310. handyhelpers/static/node_modules/minify/ChangeLog +1307 -0
  311. handyhelpers/static/node_modules/minify/LICENSE +22 -0
  312. handyhelpers/static/node_modules/minify/README.md +177 -0
  313. handyhelpers/static/node_modules/minify/bin/minify.js +98 -0
  314. handyhelpers/static/node_modules/minify/deno.json +5 -0
  315. handyhelpers/static/node_modules/minify/help.json +8 -0
  316. handyhelpers/static/node_modules/minify/package.json +65 -0
  317. handyhelpers/static/node_modules/ms/index.js +162 -0
  318. handyhelpers/static/node_modules/ms/license.md +21 -0
  319. handyhelpers/static/node_modules/ms/package.json +38 -0
  320. handyhelpers/static/node_modules/ms/readme.md +59 -0
  321. handyhelpers/static/node_modules/no-case/LICENSE +21 -0
  322. handyhelpers/static/node_modules/no-case/README.md +37 -0
  323. handyhelpers/static/node_modules/no-case/dist/index.d.ts +10 -0
  324. handyhelpers/static/node_modules/no-case/dist/index.js +35 -0
  325. handyhelpers/static/node_modules/no-case/dist/index.js.map +1 -0
  326. handyhelpers/static/node_modules/no-case/dist/index.spec.d.ts +1 -0
  327. handyhelpers/static/node_modules/no-case/dist/index.spec.js +59 -0
  328. handyhelpers/static/node_modules/no-case/dist/index.spec.js.map +1 -0
  329. handyhelpers/static/node_modules/no-case/dist.es2015/index.d.ts +10 -0
  330. handyhelpers/static/node_modules/no-case/dist.es2015/index.js +31 -0
  331. handyhelpers/static/node_modules/no-case/dist.es2015/index.js.map +1 -0
  332. handyhelpers/static/node_modules/no-case/dist.es2015/index.spec.d.ts +1 -0
  333. handyhelpers/static/node_modules/no-case/dist.es2015/index.spec.js +57 -0
  334. handyhelpers/static/node_modules/no-case/dist.es2015/index.spec.js.map +1 -0
  335. handyhelpers/static/node_modules/no-case/package.json +85 -0
  336. handyhelpers/static/node_modules/p-limit/index.d.ts +40 -0
  337. handyhelpers/static/node_modules/p-limit/index.js +68 -0
  338. handyhelpers/static/node_modules/p-limit/license +9 -0
  339. handyhelpers/static/node_modules/p-limit/package.json +54 -0
  340. handyhelpers/static/node_modules/p-limit/readme.md +99 -0
  341. handyhelpers/static/node_modules/p-locate/index.d.ts +49 -0
  342. handyhelpers/static/node_modules/p-locate/index.js +48 -0
  343. handyhelpers/static/node_modules/p-locate/license +9 -0
  344. handyhelpers/static/node_modules/p-locate/package.json +56 -0
  345. handyhelpers/static/node_modules/p-locate/readme.md +91 -0
  346. handyhelpers/static/node_modules/param-case/LICENSE +21 -0
  347. handyhelpers/static/node_modules/param-case/README.md +37 -0
  348. handyhelpers/static/node_modules/param-case/dist/index.d.ts +3 -0
  349. handyhelpers/static/node_modules/param-case/dist/index.js +11 -0
  350. handyhelpers/static/node_modules/param-case/dist/index.js.map +1 -0
  351. handyhelpers/static/node_modules/param-case/dist/index.spec.d.ts +1 -0
  352. handyhelpers/static/node_modules/param-case/dist/index.spec.js +24 -0
  353. handyhelpers/static/node_modules/param-case/dist/index.spec.js.map +1 -0
  354. handyhelpers/static/node_modules/param-case/dist.es2015/index.d.ts +3 -0
  355. handyhelpers/static/node_modules/param-case/dist.es2015/index.js +7 -0
  356. handyhelpers/static/node_modules/param-case/dist.es2015/index.js.map +1 -0
  357. handyhelpers/static/node_modules/param-case/dist.es2015/index.spec.d.ts +1 -0
  358. handyhelpers/static/node_modules/param-case/dist.es2015/index.spec.js +22 -0
  359. handyhelpers/static/node_modules/param-case/dist.es2015/index.spec.js.map +1 -0
  360. handyhelpers/static/node_modules/param-case/package.json +91 -0
  361. handyhelpers/static/node_modules/pascal-case/LICENSE +21 -0
  362. handyhelpers/static/node_modules/pascal-case/README.md +47 -0
  363. handyhelpers/static/node_modules/pascal-case/dist/index.d.ts +5 -0
  364. handyhelpers/static/node_modules/pascal-case/dist/index.js +24 -0
  365. handyhelpers/static/node_modules/pascal-case/dist/index.js.map +1 -0
  366. handyhelpers/static/node_modules/pascal-case/dist/index.spec.d.ts +1 -0
  367. handyhelpers/static/node_modules/pascal-case/dist/index.spec.js +25 -0
  368. handyhelpers/static/node_modules/pascal-case/dist/index.spec.js.map +1 -0
  369. handyhelpers/static/node_modules/pascal-case/dist.es2015/index.d.ts +5 -0
  370. handyhelpers/static/node_modules/pascal-case/dist.es2015/index.js +18 -0
  371. handyhelpers/static/node_modules/pascal-case/dist.es2015/index.js.map +1 -0
  372. handyhelpers/static/node_modules/pascal-case/dist.es2015/index.spec.d.ts +1 -0
  373. handyhelpers/static/node_modules/pascal-case/dist.es2015/index.spec.js +23 -0
  374. handyhelpers/static/node_modules/pascal-case/dist.es2015/index.spec.js.map +1 -0
  375. handyhelpers/static/node_modules/pascal-case/package.json +90 -0
  376. handyhelpers/static/node_modules/path-exists/index.d.ts +31 -0
  377. handyhelpers/static/node_modules/path-exists/index.js +19 -0
  378. handyhelpers/static/node_modules/path-exists/license +9 -0
  379. handyhelpers/static/node_modules/path-exists/package.json +41 -0
  380. handyhelpers/static/node_modules/path-exists/readme.md +52 -0
  381. handyhelpers/static/node_modules/readjson/ChangeLog +110 -0
  382. handyhelpers/static/node_modules/readjson/LICENSE +21 -0
  383. handyhelpers/static/node_modules/readjson/README.md +36 -0
  384. handyhelpers/static/node_modules/readjson/package.json +46 -0
  385. handyhelpers/static/node_modules/relateurl/README.md +159 -0
  386. handyhelpers/static/node_modules/relateurl/license +21 -0
  387. handyhelpers/static/node_modules/relateurl/package.json +46 -0
  388. handyhelpers/static/node_modules/simport/ChangeLog +77 -0
  389. handyhelpers/static/node_modules/simport/LICENSE +21 -0
  390. handyhelpers/static/node_modules/simport/README.md +81 -0
  391. handyhelpers/static/node_modules/simport/fixture/context.js +3 -0
  392. handyhelpers/static/node_modules/simport/fixture/default-frozen-function.mjs +2 -0
  393. handyhelpers/static/node_modules/simport/fixture/default-frozen-object.mjs +2 -0
  394. handyhelpers/static/node_modules/simport/package.json +65 -0
  395. handyhelpers/static/node_modules/simport/simport.js +84 -0
  396. handyhelpers/static/node_modules/simport/simport.mjs +22 -0
  397. handyhelpers/static/node_modules/source-map/CHANGELOG.md +301 -0
  398. handyhelpers/static/node_modules/source-map/LICENSE +28 -0
  399. handyhelpers/static/node_modules/source-map/README.md +742 -0
  400. handyhelpers/static/node_modules/source-map/dist/source-map.debug.js +3234 -0
  401. handyhelpers/static/node_modules/source-map/dist/source-map.js +3233 -0
  402. handyhelpers/static/node_modules/source-map/dist/source-map.min.js +2 -0
  403. handyhelpers/static/node_modules/source-map/dist/source-map.min.js.map +1 -0
  404. handyhelpers/static/node_modules/source-map/package.json +73 -0
  405. handyhelpers/static/node_modules/source-map/source-map.d.ts +98 -0
  406. handyhelpers/static/node_modules/source-map/source-map.js +8 -0
  407. handyhelpers/static/node_modules/source-map-support/LICENSE.md +21 -0
  408. handyhelpers/static/node_modules/source-map-support/README.md +284 -0
  409. handyhelpers/static/node_modules/source-map-support/browser-source-map-support.js +114 -0
  410. handyhelpers/static/node_modules/source-map-support/package.json +31 -0
  411. handyhelpers/static/node_modules/source-map-support/register-hook-require.js +1 -0
  412. handyhelpers/static/node_modules/source-map-support/register.js +1 -0
  413. handyhelpers/static/node_modules/source-map-support/source-map-support.js +625 -0
  414. handyhelpers/static/node_modules/terser/CHANGELOG.md +783 -0
  415. handyhelpers/static/node_modules/terser/LICENSE +27 -0
  416. handyhelpers/static/node_modules/terser/PATRONS.md +15 -0
  417. handyhelpers/static/node_modules/terser/README.md +1421 -0
  418. handyhelpers/static/node_modules/terser/bin/package.json +10 -0
  419. handyhelpers/static/node_modules/terser/bin/terser +21 -0
  420. handyhelpers/static/node_modules/terser/bin/uglifyjs +10 -0
  421. handyhelpers/static/node_modules/terser/dist/.gitkeep +0 -0
  422. handyhelpers/static/node_modules/terser/dist/bundle.min.js +32962 -0
  423. handyhelpers/static/node_modules/terser/dist/package.json +10 -0
  424. handyhelpers/static/node_modules/terser/main.js +27 -0
  425. handyhelpers/static/node_modules/terser/node_modules/commander/CHANGELOG.md +419 -0
  426. handyhelpers/static/node_modules/terser/node_modules/commander/LICENSE +22 -0
  427. handyhelpers/static/node_modules/terser/node_modules/commander/Readme.md +428 -0
  428. handyhelpers/static/node_modules/terser/node_modules/commander/index.js +1224 -0
  429. handyhelpers/static/node_modules/terser/node_modules/commander/package.json +38 -0
  430. handyhelpers/static/node_modules/terser/node_modules/commander/typings/index.d.ts +310 -0
  431. handyhelpers/static/node_modules/terser/package.json +153 -0
  432. handyhelpers/static/node_modules/terser/tools/domprops.js +9026 -0
  433. handyhelpers/static/node_modules/terser/tools/exit.cjs +7 -0
  434. handyhelpers/static/node_modules/terser/tools/props.html +68 -0
  435. handyhelpers/static/node_modules/terser/tools/terser.d.ts +216 -0
  436. handyhelpers/static/node_modules/tippy.js/LICENSE +21 -0
  437. handyhelpers/static/node_modules/tippy.js/README.md +63 -0
  438. handyhelpers/static/node_modules/tippy.js/animations/perspective-extreme.css +1 -0
  439. handyhelpers/static/node_modules/tippy.js/animations/perspective-subtle.css +1 -0
  440. handyhelpers/static/node_modules/tippy.js/animations/perspective.css +1 -0
  441. handyhelpers/static/node_modules/tippy.js/animations/scale-extreme.css +1 -0
  442. handyhelpers/static/node_modules/tippy.js/animations/scale-subtle.css +1 -0
  443. handyhelpers/static/node_modules/tippy.js/animations/scale.css +1 -0
  444. handyhelpers/static/node_modules/tippy.js/animations/shift-away-extreme.css +1 -0
  445. handyhelpers/static/node_modules/tippy.js/animations/shift-away-subtle.css +1 -0
  446. handyhelpers/static/node_modules/tippy.js/animations/shift-away.css +1 -0
  447. handyhelpers/static/node_modules/tippy.js/animations/shift-toward-extreme.css +1 -0
  448. handyhelpers/static/node_modules/tippy.js/animations/shift-toward-subtle.css +1 -0
  449. handyhelpers/static/node_modules/tippy.js/animations/shift-toward.css +1 -0
  450. handyhelpers/static/node_modules/tippy.js/dist/backdrop.css +1 -0
  451. handyhelpers/static/node_modules/tippy.js/dist/border.css +1 -0
  452. handyhelpers/static/node_modules/tippy.js/dist/svg-arrow.css +1 -0
  453. handyhelpers/static/node_modules/tippy.js/dist/tippy-bundle.umd.js +2516 -0
  454. handyhelpers/static/node_modules/tippy.js/dist/tippy-bundle.umd.js.map +1 -0
  455. handyhelpers/static/node_modules/tippy.js/dist/tippy-bundle.umd.min.js +2 -0
  456. handyhelpers/static/node_modules/tippy.js/dist/tippy-bundle.umd.min.js.map +1 -0
  457. handyhelpers/static/node_modules/tippy.js/dist/tippy.cjs.js +2497 -0
  458. handyhelpers/static/node_modules/tippy.js/dist/tippy.cjs.js.map +1 -0
  459. handyhelpers/static/node_modules/tippy.js/dist/tippy.css +1 -0
  460. handyhelpers/static/node_modules/tippy.js/dist/tippy.esm.js +2486 -0
  461. handyhelpers/static/node_modules/tippy.js/dist/tippy.esm.js.map +1 -0
  462. handyhelpers/static/node_modules/tippy.js/dist/tippy.umd.js +2496 -0
  463. handyhelpers/static/node_modules/tippy.js/dist/tippy.umd.js.map +1 -0
  464. handyhelpers/static/node_modules/tippy.js/dist/tippy.umd.min.js +2 -0
  465. handyhelpers/static/node_modules/tippy.js/dist/tippy.umd.min.js.map +1 -0
  466. handyhelpers/static/node_modules/tippy.js/headless/dist/tippy-headless.cjs.js +2388 -0
  467. handyhelpers/static/node_modules/tippy.js/headless/dist/tippy-headless.cjs.js.map +1 -0
  468. handyhelpers/static/node_modules/tippy.js/headless/dist/tippy-headless.esm.js +2377 -0
  469. handyhelpers/static/node_modules/tippy.js/headless/dist/tippy-headless.esm.js.map +1 -0
  470. handyhelpers/static/node_modules/tippy.js/headless/dist/tippy-headless.umd.js +2382 -0
  471. handyhelpers/static/node_modules/tippy.js/headless/dist/tippy-headless.umd.js.map +1 -0
  472. handyhelpers/static/node_modules/tippy.js/headless/dist/tippy-headless.umd.min.js +2 -0
  473. handyhelpers/static/node_modules/tippy.js/headless/dist/tippy-headless.umd.min.js.map +1 -0
  474. handyhelpers/static/node_modules/tippy.js/headless/package.json +16 -0
  475. handyhelpers/static/node_modules/tippy.js/index.d.ts +260 -0
  476. handyhelpers/static/node_modules/tippy.js/package.json +157 -0
  477. handyhelpers/static/node_modules/tippy.js/themes/light-border.css +1 -0
  478. handyhelpers/static/node_modules/tippy.js/themes/light.css +1 -0
  479. handyhelpers/static/node_modules/tippy.js/themes/material.css +1 -0
  480. handyhelpers/static/node_modules/tippy.js/themes/translucent.css +1 -0
  481. handyhelpers/static/node_modules/try-catch/ChangeLog +55 -0
  482. handyhelpers/static/node_modules/try-catch/LICENSE +21 -0
  483. handyhelpers/static/node_modules/try-catch/README.md +38 -0
  484. handyhelpers/static/node_modules/try-catch/package.json +34 -0
  485. handyhelpers/static/node_modules/try-to-catch/ChangeLog +64 -0
  486. handyhelpers/static/node_modules/try-to-catch/LICENSE +21 -0
  487. handyhelpers/static/node_modules/try-to-catch/README.md +74 -0
  488. handyhelpers/static/node_modules/try-to-catch/package.json +47 -0
  489. handyhelpers/static/node_modules/tslib/CopyrightNotice.txt +15 -0
  490. handyhelpers/static/node_modules/tslib/LICENSE.txt +12 -0
  491. handyhelpers/static/node_modules/tslib/README.md +164 -0
  492. handyhelpers/static/node_modules/tslib/SECURITY.md +41 -0
  493. handyhelpers/static/node_modules/tslib/modules/index.d.ts +38 -0
  494. handyhelpers/static/node_modules/tslib/modules/index.js +70 -0
  495. handyhelpers/static/node_modules/tslib/modules/package.json +3 -0
  496. handyhelpers/static/node_modules/tslib/package.json +47 -0
  497. handyhelpers/static/node_modules/tslib/tslib.d.ts +460 -0
  498. handyhelpers/static/node_modules/tslib/tslib.es6.html +1 -0
  499. handyhelpers/static/node_modules/tslib/tslib.es6.js +402 -0
  500. handyhelpers/static/node_modules/tslib/tslib.es6.mjs +401 -0
  501. handyhelpers/static/node_modules/tslib/tslib.html +1 -0
  502. handyhelpers/static/node_modules/tslib/tslib.js +484 -0
  503. handyhelpers/static/node_modules/uglify-js/LICENSE +29 -0
  504. handyhelpers/static/node_modules/uglify-js/README.md +1479 -0
  505. handyhelpers/static/node_modules/uglify-js/bin/uglifyjs +624 -0
  506. handyhelpers/static/node_modules/uglify-js/package.json +56 -0
  507. handyhelpers/static/node_modules/uglify-js/tools/domprops.html +456 -0
  508. handyhelpers/static/node_modules/uglify-js/tools/domprops.json +8327 -0
  509. handyhelpers/static/node_modules/uglify-js/tools/exports.js +8 -0
  510. handyhelpers/static/node_modules/uglify-js/tools/node.js +115 -0
  511. handyhelpers/static/node_modules/uglify-js/tools/tty.js +22 -0
  512. handyhelpers/static/node_modules/unicorn-magic/default.js +14 -0
  513. handyhelpers/static/node_modules/unicorn-magic/index.d.ts +29 -0
  514. handyhelpers/static/node_modules/unicorn-magic/license +9 -0
  515. handyhelpers/static/node_modules/unicorn-magic/node.js +7 -0
  516. handyhelpers/static/node_modules/unicorn-magic/package.json +49 -0
  517. handyhelpers/static/node_modules/unicorn-magic/readme.md +25 -0
  518. handyhelpers/static/node_modules/yocto-queue/index.d.ts +61 -0
  519. handyhelpers/static/node_modules/yocto-queue/index.js +78 -0
  520. handyhelpers/static/node_modules/yocto-queue/license +9 -0
  521. handyhelpers/static/node_modules/yocto-queue/package.json +48 -0
  522. handyhelpers/static/node_modules/yocto-queue/readme.md +70 -0
  523. handyhelpers/static/package.json +3 -1
  524. handyhelpers/static/yarn.lock +393 -20
  525. handyhelpers/templates/handyhelpers/generic/bs5/generic_index.html +5 -8
  526. handyhelpers/templates/handyhelpers/handyhelpers_base_bs5.htm +5 -1
  527. handyhelpers/templates/handyhelpers/handyhelpers_with_sidebar.htm +50 -3
  528. handyhelpers/templates/handyhelpers/htmx/bs5/filter_form/generic_modal_swap.htm +48 -0
  529. handyhelpers/templates/handyhelpers/htmx/bs5/form/form_wrapper.htm +48 -0
  530. handyhelpers/templates/handyhelpers/htmx/bs5/form/inline_form.htm +166 -0
  531. handyhelpers/templates/handyhelpers/htmx/bs5/form/inline_form_disabled.htm +125 -0
  532. handyhelpers/templates/handyhelpers/htmx/bs5/generic_modal_swap.htm +2 -3
  533. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/content_title.htm +38 -0
  534. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/controls.htm +21 -0
  535. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/examples/card.htm +17 -0
  536. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/examples/list.htm +11 -0
  537. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/examples/table.htm +21 -0
  538. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/filter_form_modal_swap.htm +48 -0
  539. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/full.html +6 -0
  540. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/wrapper_card.htm +7 -0
  541. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/wrapper_list.htm +7 -0
  542. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/wrapper_minimal.htm +7 -0
  543. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/wrapper_table.htm +18 -0
  544. handyhelpers/templates/handyhelpers/htmx/bs5/index.htm +34 -0
  545. handyhelpers/templates/handyhelpers/report/annual_stats.html +6 -0
  546. handyhelpers/templates/handyhelpers/report/annual_stats_content.htm +43 -0
  547. handyhelpers/templates/handyhelpers/report/chartjs/annual_progress_chart.htm +1 -1
  548. handyhelpers/templates/handyhelpers/report/chartjs/annual_progress_content.htm +40 -39
  549. handyhelpers/templates/handyhelpers/report/chartjs/annual_stats.html +25 -36
  550. handyhelpers/templates/handyhelpers/report/chartjs/annual_trends_content.htm +35 -34
  551. handyhelpers/templates/handyhelpers/report/chartjs/day_count_chart.htm +1 -1
  552. handyhelpers/templates/handyhelpers/report/chartjs/month_count_chart.htm +1 -1
  553. handyhelpers/templates/handyhelpers/report/chartjs/week_count_chart.htm +1 -1
  554. handyhelpers/templates/handyhelpers/report/chartjs/year_count_chart.htm +1 -1
  555. handyhelpers/templatetags/form_tags.py +47 -0
  556. handyhelpers/templatetags/htmx_tags.py +21 -0
  557. handyhelpers/views/action.py +3 -1
  558. handyhelpers/views/calendar.py +33 -14
  559. handyhelpers/views/htmx.py +396 -4
  560. handyhelpers/views/report.py +12 -5
  561. handyhelpers/management/commands/generate_admin.py +0 -110
  562. handyhelpers/static/node_modules/@popperjs/core/dist/esm/utils/format.js +0 -9
  563. handyhelpers/static/node_modules/@popperjs/core/dist/esm/utils/validateModifiers.js +0 -81
  564. handyhelpers/static/node_modules/@popperjs/core/lib/utils/format.d.ts +0 -1
  565. handyhelpers/static/node_modules/@popperjs/core/lib/utils/format.js +0 -9
  566. handyhelpers/static/node_modules/@popperjs/core/lib/utils/format.js.flow +0 -5
  567. handyhelpers/static/node_modules/@popperjs/core/lib/utils/validateModifiers.d.ts +0 -1
  568. handyhelpers/static/node_modules/@popperjs/core/lib/utils/validateModifiers.js +0 -81
  569. handyhelpers/static/node_modules/@popperjs/core/lib/utils/validateModifiers.js.flow +0 -151
  570. {django_handyhelpers-0.3.20.dist-info → django_handyhelpers-0.3.35.dist-info}/LICENSE +0 -0
  571. {django_handyhelpers-0.3.20.dist-info → django_handyhelpers-0.3.35.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,987 @@
1
+ <h1 align="center">
2
+ <br/>
3
+ <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
4
+ <br/>
5
+ <br/>
6
+ </h1>
7
+
8
+ [![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
9
+ [![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
10
+ [![PPC Linux Build Status](https://img.shields.io/travis/clean-css/clean-css/master.svg?style=flat&label=PPC%20Linux%20build)](https://travis-ci.org/clean-css/clean-css)
11
+ [![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
12
+ [![npm Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
13
+
14
+ clean-css is a fast and efficient CSS optimizer for [Node.js](http://nodejs.org/) platform and [any modern browser](https://clean-css.github.io/).
15
+
16
+ According to [tests](http://goalsmashers.github.io/css-minification-benchmark/) it is one of the best available.
17
+
18
+ **Table of Contents**
19
+
20
+ - [Node.js version support](#nodejs-version-support)
21
+ - [Install](#install)
22
+ - [Use](#use)
23
+ * [What's new in version 5.3](#whats-new-in-version-53)
24
+ * [What's new in version 5.0](#whats-new-in-version-50)
25
+ * [What's new in version 4.2](#whats-new-in-version-42)
26
+ * [What's new in version 4.1](#whats-new-in-version-41)
27
+ * [Important: 4.0 breaking changes](#important-40-breaking-changes)
28
+ * [Constructor options](#constructor-options)
29
+ * [Compatibility modes](#compatibility-modes)
30
+ * [Fetch option](#fetch-option)
31
+ * [Formatting options](#formatting-options)
32
+ * [Inlining options](#inlining-options)
33
+ * [Optimization levels](#optimization-levels)
34
+ + [Level 0 optimizations](#level-0-optimizations)
35
+ + [Level 1 optimizations](#level-1-optimizations)
36
+ + [Level 2 optimizations](#level-2-optimizations)
37
+ * [Plugins](#plugins)
38
+ * [Minify method](#minify-method)
39
+ * [Promise interface](#promise-interface)
40
+ * [CLI utility](#cli-utility)
41
+ - [FAQ](#faq)
42
+ * [How to optimize multiple files?](#how-to-optimize-multiple-files)
43
+ * [How to process multiple files without concatenating them into one output file?](#how-to-process-multiple-files-without-concatenating-them-into-one-output-file)
44
+ * [How to process remote `@import`s correctly?](#how-to-process-remote-imports-correctly)
45
+ * [How to apply arbitrary transformations to CSS properties?](#how-to-apply-arbitrary-transformations-to-css-properties)
46
+ * [How to specify a custom rounding precision?](#how-to-specify-a-custom-rounding-precision)
47
+ * [How to keep a CSS fragment intact?](#how-to-keep-a-css-fragment-intact)
48
+ * [How to preserve a comment block?](#how-to-preserve-a-comment-block)
49
+ * [How to rebase relative image URLs?](#how-to-rebase-relative-image-urls)
50
+ * [How to work with source maps?](#how-to-work-with-source-maps)
51
+ * [How to apply level 1 & 2 optimizations at the same time?](#how-to-apply-level-1--2-optimizations-at-the-same-time)
52
+ * [What level 2 optimizations do?](#what-level-2-optimizations-do)
53
+ * [What errors and warnings are?](#what-errors-and-warnings-are)
54
+ * [How to use clean-css with build tools?](#how-to-use-clean-css-with-build-tools)
55
+ * [How to use clean-css from web browser?](#how-to-use-clean-css-from-web-browser)
56
+ - [Contributing](#contributing)
57
+ * [How to get started?](#how-to-get-started)
58
+ - [Acknowledgments](#acknowledgments)
59
+ - [License](#license)
60
+
61
+ # Node.js version support
62
+
63
+ clean-css requires Node.js 10.0+ (tested on Linux, OS X, and Windows)
64
+
65
+ # Install
66
+
67
+ ```
68
+ npm install --save-dev clean-css
69
+ ```
70
+
71
+ # Use
72
+
73
+ ```js
74
+ var CleanCSS = require('clean-css');
75
+ var input = 'a{font-weight:bold;}';
76
+ var options = { /* options */ };
77
+ var output = new CleanCSS(options).minify(input);
78
+ ```
79
+
80
+ ## What's new in version 5.3
81
+
82
+ clean-css 5.3 introduces one new feature:
83
+
84
+ * variables can be optimized using level 1's `variableValueOptimizers` option, which accepts a list of [value optimizers](https://github.com/clean-css/clean-css/blob/master/lib/optimizer/level-1/value-optimizers.js) or a list of their names, e.g. `variableValueOptimizers: ['color', 'fraction']`.
85
+
86
+ ## What's new in version 5.0
87
+
88
+ clean-css 5.0 introduced some breaking changes:
89
+
90
+ * Node.js 6.x and 8.x are officially no longer supported;
91
+ * `transform` callback in level-1 optimizations is removed in favor of new [plugins](#plugins) interface;
92
+ * changes default Internet Explorer compatibility from 10+ to >11, to revert the old default use `{ compatibility: 'ie10' }` flag;
93
+ * changes default `rebase` option from `true` to `false` so URLs are not rebased by default. Please note that if you set `rebaseTo` option it still counts as setting `rebase: true` to preserve some of the backward compatibility.
94
+
95
+ And on the new features side of things:
96
+
97
+ * format options now accepts numerical values for all breaks, which will allow you to have more control over output formatting, e.g. `format: {breaks: {afterComment: 2}}` means clean-css will add two line breaks after each comment
98
+ * a new `batch` option (defaults to `false`) is added, when set to `true` it will process all inputs, given either as an array or a hash, without concatenating them.
99
+
100
+ ## What's new in version 4.2
101
+
102
+ clean-css 4.2 introduces the following changes / features:
103
+
104
+ * Adds `process` method for compatibility with optimize-css-assets-webpack-plugin;
105
+ * new `transition` property optimizer;
106
+ * preserves any CSS content between `/* clean-css ignore:start */` and `/* clean-css ignore:end */` comments;
107
+ * allows filtering based on selector in `transform` callback, see [example](#how-to-apply-arbitrary-transformations-to-css-properties);
108
+ * adds configurable line breaks via `format: { breakWith: 'lf' }` option.
109
+
110
+ ## What's new in version 4.1
111
+
112
+ clean-css 4.1 introduces the following changes / features:
113
+
114
+ * `inline: false` as an alias to `inline: ['none']`;
115
+ * `multiplePseudoMerging` compatibility flag controlling merging of rules with multiple pseudo classes / elements;
116
+ * `removeEmpty` flag in level 1 optimizations controlling removal of rules and nested blocks;
117
+ * `removeEmpty` flag in level 2 optimizations controlling removal of rules and nested blocks;
118
+ * `compatibility: { selectors: { mergeLimit: <number> } }` flag in compatibility settings controlling maximum number of selectors in a single rule;
119
+ * `minify` method improved signature accepting a list of hashes for a predictable traversal;
120
+ * `selectorsSortingMethod` level 1 optimization allows `false` or `'none'` for disabling selector sorting;
121
+ * `fetch` option controlling a function for handling remote requests;
122
+ * new `font` shorthand and `font-*` longhand optimizers;
123
+ * removal of `optimizeFont` flag in level 1 optimizations due to new `font` shorthand optimizer;
124
+ * `skipProperties` flag in level 2 optimizations controlling which properties won't be optimized;
125
+ * new `animation` shorthand and `animation-*` longhand optimizers;
126
+ * `removeUnusedAtRules` level 2 optimization controlling removal of unused `@counter-style`, `@font-face`, `@keyframes`, and `@namespace` at rules;
127
+ * the [web interface](https://clean-css.github.io/) gets an improved settings panel with "reset to defaults", instant option changes, and settings being persisted across sessions.
128
+
129
+ ## Important: 4.0 breaking changes
130
+
131
+ clean-css 4.0 introduces some breaking changes:
132
+
133
+ * API and CLI interfaces are split, so API stays in this repository while CLI moves to [clean-css-cli](https://github.com/clean-css/clean-css-cli);
134
+ * `root`, `relativeTo`, and `target` options are replaced by a single `rebaseTo` option - this means that rebasing URLs and import inlining is much simpler but may not be (YMMV) as powerful as in 3.x;
135
+ * `debug` option is gone as stats are always provided in output object under `stats` property;
136
+ * `roundingPrecision` is disabled by default;
137
+ * `roundingPrecision` applies to **all** units now, not only `px` as in 3.x;
138
+ * `processImport` and `processImportFrom` are merged into `inline` option which defaults to `local`. Remote `@import` rules are **NOT** inlined by default anymore;
139
+ * splits `inliner: { request: ..., timeout: ... }` option into `inlineRequest` and `inlineTimeout` options;
140
+ * remote resources without a protocol, e.g. `//fonts.googleapis.com/css?family=Domine:700`, are not inlined anymore;
141
+ * changes default Internet Explorer compatibility from 9+ to 10+, to revert the old default use `{ compatibility: 'ie9' }` flag;
142
+ * renames `keepSpecialComments` to `specialComments`;
143
+ * moves `roundingPrecision` and `specialComments` to level 1 optimizations options, see examples;
144
+ * moves `mediaMerging`, `restructuring`, `semanticMerging`, and `shorthandCompacting` to level 2 optimizations options, see examples below;
145
+ * renames `shorthandCompacting` option to `mergeIntoShorthands`;
146
+ * level 1 optimizations are the new default, up to 3.x it was level 2;
147
+ * `keepBreaks` option is replaced with `{ format: 'keep-breaks' }` to ease transition;
148
+ * `sourceMap` option has to be a boolean from now on - to specify an input source map pass it a 2nd argument to `minify` method or via a hash instead;
149
+ * `aggressiveMerging` option is removed as aggressive merging is replaced by smarter override merging.
150
+
151
+ ## Constructor options
152
+
153
+ clean-css constructor accepts a hash as a parameter with the following options available:
154
+
155
+ * `compatibility` - controls compatibility mode used; defaults to `ie10+`; see [compatibility modes](#compatibility-modes) for examples;
156
+ * `fetch` - controls a function for handling remote requests; see [fetch option](#fetch-option) for examples (since 4.1.0);
157
+ * `format` - controls output CSS formatting; defaults to `false`; see [formatting options](#formatting-options) for examples;
158
+ * `inline` - controls `@import` inlining rules; defaults to `'local'`; see [inlining options](#inlining-options) for examples;
159
+ * `inlineRequest` - controls extra options for inlining remote `@import` rules, can be any of [HTTP(S) request options](https://nodejs.org/api/http.html#http_http_request_options_callback);
160
+ * `inlineTimeout` - controls number of milliseconds after which inlining a remote `@import` fails; defaults to 5000;
161
+ * `level` - controls optimization level used; defaults to `1`; see [optimization levels](#optimization-levels) for examples;
162
+ * `rebase` - controls URL rebasing; defaults to `false`;
163
+ * `rebaseTo` - controls a directory to which all URLs are rebased, most likely the directory under which the output file will live; defaults to the current directory;
164
+ * `returnPromise` - controls whether `minify` method returns a Promise object or not; defaults to `false`; see [promise interface](#promise-interface) for examples;
165
+ * `sourceMap` - controls whether an output source map is built; defaults to `false`;
166
+ * `sourceMapInlineSources` - controls embedding sources inside a source map's `sourcesContent` field; defaults to false.
167
+
168
+ ## Compatibility modes
169
+
170
+ There is a certain number of compatibility mode shortcuts, namely:
171
+
172
+ * `new CleanCSS({ compatibility: '*' })` (default) - Internet Explorer 10+ compatibility mode
173
+ * `new CleanCSS({ compatibility: 'ie9' })` - Internet Explorer 9+ compatibility mode
174
+ * `new CleanCSS({ compatibility: 'ie8' })` - Internet Explorer 8+ compatibility mode
175
+ * `new CleanCSS({ compatibility: 'ie7' })` - Internet Explorer 7+ compatibility mode
176
+
177
+ Each of these modes is an alias to a [fine grained configuration](https://github.com/clean-css/clean-css/blob/master/lib/options/compatibility.js), with the following options available:
178
+
179
+ ```js
180
+ new CleanCSS({
181
+ compatibility: {
182
+ colors: {
183
+ hexAlpha: false, // controls 4- and 8-character hex color support
184
+ opacity: true // controls `rgba()` / `hsla()` color support
185
+ },
186
+ properties: {
187
+ backgroundClipMerging: true, // controls background-clip merging into shorthand
188
+ backgroundOriginMerging: true, // controls background-origin merging into shorthand
189
+ backgroundSizeMerging: true, // controls background-size merging into shorthand
190
+ colors: true, // controls color optimizations
191
+ ieBangHack: false, // controls keeping IE bang hack
192
+ ieFilters: false, // controls keeping IE `filter` / `-ms-filter`
193
+ iePrefixHack: false, // controls keeping IE prefix hack
194
+ ieSuffixHack: false, // controls keeping IE suffix hack
195
+ merging: true, // controls property merging based on understandability
196
+ shorterLengthUnits: false, // controls shortening pixel units into `pc`, `pt`, or `in` units
197
+ spaceAfterClosingBrace: true, // controls keeping space after closing brace - `url() no-repeat` into `url()no-repeat`
198
+ urlQuotes: true, // controls keeping quoting inside `url()`
199
+ zeroUnits: true // controls removal of units `0` value
200
+ },
201
+ selectors: {
202
+ adjacentSpace: false, // controls extra space before `nav` element
203
+ ie7Hack: true, // controls removal of IE7 selector hacks, e.g. `*+html...`
204
+ mergeablePseudoClasses: [':active', ...], // controls a whitelist of mergeable pseudo classes
205
+ mergeablePseudoElements: ['::after', ...], // controls a whitelist of mergeable pseudo elements
206
+ mergeLimit: 8191, // controls maximum number of selectors in a single rule (since 4.1.0)
207
+ multiplePseudoMerging: true // controls merging of rules with multiple pseudo classes / elements (since 4.1.0)
208
+ },
209
+ units: {
210
+ ch: true, // controls treating `ch` as a supported unit
211
+ in: true, // controls treating `in` as a supported unit
212
+ pc: true, // controls treating `pc` as a supported unit
213
+ pt: true, // controls treating `pt` as a supported unit
214
+ rem: true, // controls treating `rem` as a supported unit
215
+ vh: true, // controls treating `vh` as a supported unit
216
+ vm: true, // controls treating `vm` as a supported unit
217
+ vmax: true, // controls treating `vmax` as a supported unit
218
+ vmin: true // controls treating `vmin` as a supported unit
219
+ }
220
+ }
221
+ })
222
+ ```
223
+
224
+ You can also use a string when setting a compatibility mode, e.g.
225
+
226
+ ```js
227
+ new CleanCSS({
228
+ compatibility: 'ie9,-properties.merging' // sets compatibility to IE9 mode with disabled property merging
229
+ })
230
+ ```
231
+
232
+ ## Fetch option
233
+
234
+ The `fetch` option accepts a function which handles remote resource fetching, e.g.
235
+
236
+ ```js
237
+ var request = require('request');
238
+ var source = '@import url(http://example.com/path/to/stylesheet.css);';
239
+ new CleanCSS({
240
+ fetch: function (uri, inlineRequest, inlineTimeout, callback) {
241
+ request(uri, function (error, response, body) {
242
+ if (error) {
243
+ callback(error, null);
244
+ } else if (response && response.statusCode != 200) {
245
+ callback(response.statusCode, null);
246
+ } else {
247
+ callback(null, body);
248
+ }
249
+ });
250
+ }
251
+ }).minify(source);
252
+ ```
253
+
254
+ This option provides a convenient way of overriding the default fetching logic if it doesn't support a particular feature, say CONNECT proxies.
255
+
256
+ Unless given, the default [loadRemoteResource](https://github.com/clean-css/clean-css/blob/master/lib/reader/load-remote-resource.js) logic is used.
257
+
258
+ ## Formatting options
259
+
260
+ By default output CSS is formatted without any whitespace unless a `format` option is given.
261
+ First of all there are two shorthands:
262
+
263
+ ```js
264
+ new CleanCSS({
265
+ format: 'beautify' // formats output in a really nice way
266
+ })
267
+ ```
268
+
269
+ and
270
+
271
+ ```js
272
+ new CleanCSS({
273
+ format: 'keep-breaks' // formats output the default way but adds line breaks for improved readability
274
+ })
275
+ ```
276
+
277
+ however `format` option also accept a fine-grained set of options:
278
+
279
+ ```js
280
+ new CleanCSS({
281
+ format: {
282
+ breaks: { // controls where to insert breaks
283
+ afterAtRule: false, // controls if a line break comes after an at-rule; e.g. `@charset`; defaults to `false`
284
+ afterBlockBegins: false, // controls if a line break comes after a block begins; e.g. `@media`; defaults to `false`
285
+ afterBlockEnds: false, // controls if a line break comes after a block ends, defaults to `false`
286
+ afterComment: false, // controls if a line break comes after a comment; defaults to `false`
287
+ afterProperty: false, // controls if a line break comes after a property; defaults to `false`
288
+ afterRuleBegins: false, // controls if a line break comes after a rule begins; defaults to `false`
289
+ afterRuleEnds: false, // controls if a line break comes after a rule ends; defaults to `false`
290
+ beforeBlockEnds: false, // controls if a line break comes before a block ends; defaults to `false`
291
+ betweenSelectors: false // controls if a line break comes between selectors; defaults to `false`
292
+ },
293
+ breakWith: '\n', // controls the new line character, can be `'\r\n'` or `'\n'` (aliased as `'windows'` and `'unix'` or `'crlf'` and `'lf'`); defaults to system one, so former on Windows and latter on Unix
294
+ indentBy: 0, // controls number of characters to indent with; defaults to `0`
295
+ indentWith: 'space', // controls a character to indent with, can be `'space'` or `'tab'`; defaults to `'space'`
296
+ spaces: { // controls where to insert spaces
297
+ aroundSelectorRelation: false, // controls if spaces come around selector relations; e.g. `div > a`; defaults to `false`
298
+ beforeBlockBegins: false, // controls if a space comes before a block begins; e.g. `.block {`; defaults to `false`
299
+ beforeValue: false // controls if a space comes before a value; e.g. `width: 1rem`; defaults to `false`
300
+ },
301
+ wrapAt: false, // controls maximum line length; defaults to `false`
302
+ semicolonAfterLastProperty: false // controls removing trailing semicolons in rule; defaults to `false` - means remove
303
+ }
304
+ })
305
+ ```
306
+
307
+ Also since clean-css 5.0 you can use numerical values for all line breaks, which will repeat a line break that many times, e.g:
308
+
309
+ ```js
310
+ new CleanCSS({
311
+ format: {
312
+ breaks: {
313
+ afterAtRule: 2,
314
+ afterBlockBegins: 1, // 1 is synonymous with `true`
315
+ afterBlockEnds: 2,
316
+ afterComment: 1,
317
+ afterProperty: 1,
318
+ afterRuleBegins: 1,
319
+ afterRuleEnds: 1,
320
+ beforeBlockEnds: 1,
321
+ betweenSelectors: 0 // 0 is synonymous with `false`
322
+ }
323
+ }
324
+ })
325
+ ```
326
+
327
+ which will add nicer spacing between at rules and blocks.
328
+
329
+ ## Inlining options
330
+
331
+ `inline` option whitelists which `@import` rules will be processed, e.g.
332
+
333
+ ```js
334
+ new CleanCSS({
335
+ inline: ['local'] // default; enables local inlining only
336
+ })
337
+ ```
338
+
339
+ ```js
340
+ new CleanCSS({
341
+ inline: ['none'] // disables all inlining
342
+ })
343
+ ```
344
+
345
+ ```js
346
+ // introduced in clean-css 4.1.0
347
+
348
+ new CleanCSS({
349
+ inline: false // disables all inlining (alias to `['none']`)
350
+ })
351
+ ```
352
+
353
+ ```js
354
+ new CleanCSS({
355
+ inline: ['all'] // enables all inlining, same as ['local', 'remote']
356
+ })
357
+ ```
358
+
359
+ ```js
360
+ new CleanCSS({
361
+ inline: ['local', 'mydomain.example.com'] // enables local inlining plus given remote source
362
+ })
363
+ ```
364
+
365
+ ```js
366
+ new CleanCSS({
367
+ inline: ['local', 'remote', '!fonts.googleapis.com'] // enables all inlining but from given remote source
368
+ })
369
+ ```
370
+
371
+ ## Optimization levels
372
+
373
+ The `level` option can be either `0`, `1` (default), or `2`, e.g.
374
+
375
+ ```js
376
+ new CleanCSS({
377
+ level: 2
378
+ })
379
+ ```
380
+
381
+ or a fine-grained configuration given via a hash.
382
+
383
+ Please note that level 1 optimization options are generally safe while level 2 optimizations should be safe for most users.
384
+
385
+ ### Level 0 optimizations
386
+
387
+ Level 0 optimizations simply means "no optimizations". Use it when you'd like to inline imports and / or rebase URLs but skip everything else.
388
+
389
+ ### Level 1 optimizations
390
+
391
+ Level 1 optimizations (default) operate on single properties only, e.g. can remove units when not required, turn rgb colors to a shorter hex representation, remove comments, etc
392
+
393
+ Here is a full list of available options:
394
+
395
+ ```js
396
+ new CleanCSS({
397
+ level: {
398
+ 1: {
399
+ cleanupCharsets: true, // controls `@charset` moving to the front of a stylesheet; defaults to `true`
400
+ normalizeUrls: true, // controls URL normalization; defaults to `true`
401
+ optimizeBackground: true, // controls `background` property optimizations; defaults to `true`
402
+ optimizeBorderRadius: true, // controls `border-radius` property optimizations; defaults to `true`
403
+ optimizeFilter: true, // controls `filter` property optimizations; defaults to `true`
404
+ optimizeFont: true, // controls `font` property optimizations; defaults to `true`
405
+ optimizeFontWeight: true, // controls `font-weight` property optimizations; defaults to `true`
406
+ optimizeOutline: true, // controls `outline` property optimizations; defaults to `true`
407
+ removeEmpty: true, // controls removing empty rules and nested blocks; defaults to `true`
408
+ removeNegativePaddings: true, // controls removing negative paddings; defaults to `true`
409
+ removeQuotes: true, // controls removing quotes when unnecessary; defaults to `true`
410
+ removeWhitespace: true, // controls removing unused whitespace; defaults to `true`
411
+ replaceMultipleZeros: true, // contols removing redundant zeros; defaults to `true`
412
+ replaceTimeUnits: true, // controls replacing time units with shorter values; defaults to `true`
413
+ replaceZeroUnits: true, // controls replacing zero values with units; defaults to `true`
414
+ roundingPrecision: false, // rounds pixel values to `N` decimal places; `false` disables rounding; defaults to `false`
415
+ selectorsSortingMethod: 'standard', // denotes selector sorting method; can be `'natural'` or `'standard'`, `'none'`, or false (the last two since 4.1.0); defaults to `'standard'`
416
+ specialComments: 'all', // denotes a number of /*! ... */ comments preserved; defaults to `all`
417
+ tidyAtRules: true, // controls at-rules (e.g. `@charset`, `@import`) optimizing; defaults to `true`
418
+ tidyBlockScopes: true, // controls block scopes (e.g. `@media`) optimizing; defaults to `true`
419
+ tidySelectors: true, // controls selectors optimizing; defaults to `true`,
420
+ variableValueOptimizers: [] // controls value optimizers which are applied to variables
421
+ }
422
+ }
423
+ });
424
+ ```
425
+
426
+ There is an `all` shortcut for toggling all options at the same time, e.g.
427
+
428
+ ```js
429
+ new CleanCSS({
430
+ level: {
431
+ 1: {
432
+ all: false, // set all values to `false`
433
+ tidySelectors: true // turns on optimizing selectors
434
+ }
435
+ }
436
+ });
437
+ ```
438
+
439
+ ### Level 2 optimizations
440
+
441
+ Level 2 optimizations operate at rules or multiple properties level, e.g. can remove duplicate rules, remove properties redefined further down a stylesheet, or restructure rules by moving them around.
442
+
443
+ Please note that if level 2 optimizations are turned on then, unless explicitely disabled, level 1 optimizations are applied as well.
444
+
445
+ Here is a full list of available options:
446
+
447
+ ```js
448
+ new CleanCSS({
449
+ level: {
450
+ 2: {
451
+ mergeAdjacentRules: true, // controls adjacent rules merging; defaults to true
452
+ mergeIntoShorthands: true, // controls merging properties into shorthands; defaults to true
453
+ mergeMedia: true, // controls `@media` merging; defaults to true
454
+ mergeNonAdjacentRules: true, // controls non-adjacent rule merging; defaults to true
455
+ mergeSemantically: false, // controls semantic merging; defaults to false
456
+ overrideProperties: true, // controls property overriding based on understandability; defaults to true
457
+ removeEmpty: true, // controls removing empty rules and nested blocks; defaults to `true`
458
+ reduceNonAdjacentRules: true, // controls non-adjacent rule reducing; defaults to true
459
+ removeDuplicateFontRules: true, // controls duplicate `@font-face` removing; defaults to true
460
+ removeDuplicateMediaBlocks: true, // controls duplicate `@media` removing; defaults to true
461
+ removeDuplicateRules: true, // controls duplicate rules removing; defaults to true
462
+ removeUnusedAtRules: false, // controls unused at rule removing; defaults to false (available since 4.1.0)
463
+ restructureRules: false, // controls rule restructuring; defaults to false
464
+ skipProperties: [] // controls which properties won't be optimized, defaults to `[]` which means all will be optimized (since 4.1.0)
465
+ }
466
+ }
467
+ });
468
+ ```
469
+
470
+ There is an `all` shortcut for toggling all options at the same time, e.g.
471
+
472
+ ```js
473
+ new CleanCSS({
474
+ level: {
475
+ 2: {
476
+ all: false, // sets all values to `false`
477
+ removeDuplicateRules: true // turns on removing duplicate rules
478
+ }
479
+ }
480
+ });
481
+ ```
482
+
483
+ ## Plugins
484
+
485
+ In clean-css version 5 and above you can define plugins which run alongside level 1 and level 2 optimizations, e.g.
486
+
487
+ ```js
488
+ var myPlugin = {
489
+ level1: {
490
+ property: function removeRepeatedBackgroundRepeat(_rule, property, _options) {
491
+ // So `background-repeat:no-repeat no-repeat` becomes `background-repeat:no-repeat`
492
+ if (property.name == 'background-repeat' && property.value.length == 2 && property.value[0][1] == property.value[1][1]) {
493
+ property.value.pop();
494
+ property.dirty = true;
495
+ }
496
+ }
497
+ }
498
+ }
499
+
500
+ new CleanCSS({plugins: [myPlugin]})
501
+
502
+ ```
503
+
504
+ Search `test\module-test.js` for `plugins` or check out `lib/optimizer/level-1/property-optimizers` and `lib/optimizer/level-1/value-optimizers` for more examples.
505
+
506
+ __Important__: To rewrite your old `transform` as a plugin, check out [this commit](https://github.com/clean-css/clean-css/commit/b6ddc523267fc42cf0f6bd1626a79cad97319e17#diff-a71ef45f934725cdb25860dc0b606bcd59e3acee9788cd6df4f9d05339e8a153).
507
+
508
+ ## Minify method
509
+
510
+ Once configured clean-css provides a `minify` method to optimize a given CSS, e.g.
511
+
512
+ ```js
513
+ var output = new CleanCSS(options).minify(source);
514
+ ```
515
+
516
+ The output of the `minify` method is a hash with following fields:
517
+
518
+ ```js
519
+ console.log(output.styles); // optimized output CSS as a string
520
+ console.log(output.sourceMap); // output source map if requested with `sourceMap` option
521
+ console.log(output.errors); // a list of errors raised
522
+ console.log(output.warnings); // a list of warnings raised
523
+ console.log(output.stats.originalSize); // original content size after import inlining
524
+ console.log(output.stats.minifiedSize); // optimized content size
525
+ console.log(output.stats.timeSpent); // time spent on optimizations in milliseconds
526
+ console.log(output.stats.efficiency); // `(originalSize - minifiedSize) / originalSize`, e.g. 0.25 if size is reduced from 100 bytes to 75 bytes
527
+ ```
528
+ Example: Minifying a CSS string:
529
+
530
+ ```js
531
+ const CleanCSS = require("clean-css");
532
+
533
+ const output = new CleanCSS().minify(`
534
+
535
+ a {
536
+ color: blue;
537
+ }
538
+ div {
539
+ margin: 5px
540
+ }
541
+
542
+ `);
543
+
544
+ console.log(output);
545
+
546
+ // Log:
547
+ {
548
+ styles: 'a{color:#00f}div{margin:5px}',
549
+ stats: {
550
+ efficiency: 0.6704545454545454,
551
+ minifiedSize: 29,
552
+ originalSize: 88,
553
+ timeSpent: 6
554
+ },
555
+ errors: [],
556
+ inlinedStylesheets: [],
557
+ warnings: []
558
+ }
559
+ ```
560
+
561
+ The `minify` method also accepts an input source map, e.g.
562
+
563
+ ```js
564
+ var output = new CleanCSS(options).minify(source, inputSourceMap);
565
+ ```
566
+
567
+ or a callback invoked when optimizations are finished, e.g.
568
+
569
+ ```js
570
+ new CleanCSS(options).minify(source, function (error, output) {
571
+ // `output` is the same as in the synchronous call above
572
+ });
573
+ ```
574
+
575
+ To optimize a single file, without reading it first, pass a path to it to `minify` method as follows:
576
+
577
+ ```js
578
+ var output = new CleanCSS(options).minify(['path/to/file.css'])
579
+ ```
580
+
581
+ (if you won't enclose the path in an array, it will be treated as a CSS source instead).
582
+
583
+ There are several ways to optimize multiple files at the same time, see [How to optimize multiple files?](#how-to-optimize-multiple-files).
584
+
585
+ ## Promise interface
586
+
587
+ If you prefer clean-css to return a Promise object then you need to explicitely ask for it, e.g.
588
+
589
+ ```js
590
+ new CleanCSS({ returnPromise: true })
591
+ .minify(source)
592
+ .then(function (output) { console.log(output.styles); })
593
+ .catch(function (error) { // deal with errors });
594
+ ```
595
+
596
+ ## CLI utility
597
+
598
+ Clean-css has an associated command line utility that can be installed separately using `npm install clean-css-cli`. For more detailed information, please visit https://github.com/clean-css/clean-css-cli.
599
+
600
+ # FAQ
601
+
602
+ ## How to optimize multiple files?
603
+
604
+ It can be done either by passing an array of paths, or, when sources are already available, a hash or an array of hashes:
605
+
606
+ ```js
607
+ new CleanCSS().minify(['path/to/file/one', 'path/to/file/two']);
608
+ ```
609
+
610
+ ```js
611
+ new CleanCSS().minify({
612
+ 'path/to/file/one': {
613
+ styles: 'contents of file one'
614
+ },
615
+ 'path/to/file/two': {
616
+ styles: 'contents of file two'
617
+ }
618
+ });
619
+ ```
620
+
621
+ ```js
622
+ new CleanCSS().minify([
623
+ {'path/to/file/one': {styles: 'contents of file one'}},
624
+ {'path/to/file/two': {styles: 'contents of file two'}}
625
+ ]);
626
+ ```
627
+
628
+ Passing an array of hashes allows you to explicitly specify the order in which the input files are concatenated. Whereas when you use a single hash the order is determined by the [traversal order of object properties](http://2ality.com/2015/10/property-traversal-order-es6.html) - available since 4.1.0.
629
+
630
+ Important note - any `@import` rules already present in the hash will be resolved in memory.
631
+
632
+ ## How to process multiple files without concatenating them into one output file?
633
+
634
+ Since clean-css 5.0 you can, when passing an array of paths, hash, or array of hashes (see above), ask clean-css not to join styles into one output, but instead return stylesheets optimized one by one, e.g.
635
+
636
+ ```js
637
+ var output = new CleanCSS({ batch: true }).minify(['path/to/file/one', 'path/to/file/two']);
638
+ var outputOfFile1 = output['path/to/file/one'].styles // all other fields, like errors, warnings, or stats are there too
639
+ var outputOfFile2 = output['path/to/file/two'].styles
640
+ ```
641
+
642
+ ## How to process remote `@import`s correctly?
643
+
644
+ In order to inline remote `@import` statements you need to provide a callback to minify method as fetching remote assets is an asynchronous operation, e.g.:
645
+
646
+ ```js
647
+ var source = '@import url(http://example.com/path/to/remote/styles);';
648
+ new CleanCSS({ inline: ['remote'] }).minify(source, function (error, output) {
649
+ // output.styles
650
+ });
651
+ ```
652
+
653
+ If you don't provide a callback, then remote `@import`s will be left as is.
654
+
655
+ ## How to apply arbitrary transformations to CSS properties?
656
+
657
+ Please see [plugins](#plugins).
658
+
659
+ ## How to specify a custom rounding precision?
660
+
661
+ The level 1 `roundingPrecision` optimization option accept a string with per-unit rounding precision settings, e.g.
662
+
663
+ ```js
664
+ new CleanCSS({
665
+ level: {
666
+ 1: {
667
+ roundingPrecision: 'all=3,px=5'
668
+ }
669
+ }
670
+ }).minify(source)
671
+ ```
672
+
673
+ which sets all units rounding precision to 3 digits except `px` unit precision of 5 digits.
674
+
675
+ ## How to optimize a stylesheet with custom `rpx` units?
676
+
677
+ Since `rpx` is a non standard unit (see [#1074](https://github.com/clean-css/clean-css/issues/1074)), it will be dropped by default as an invalid value.
678
+
679
+ However you can treat `rpx` units as regular ones:
680
+
681
+ ```js
682
+ new CleanCSS({
683
+ compatibility: {
684
+ customUnits: {
685
+ rpx: true
686
+ }
687
+ }
688
+ }).minify(source)
689
+ ```
690
+
691
+ ## How to keep a CSS fragment intact?
692
+
693
+ Note: available since 4.2.0.
694
+
695
+ Wrap the CSS fragment in special comments which instruct clean-css to preserve it, e.g.
696
+
697
+ ```css
698
+ .block-1 {
699
+ color: red
700
+ }
701
+ /* clean-css ignore:start */
702
+ .block-special {
703
+ color: transparent
704
+ }
705
+ /* clean-css ignore:end */
706
+ .block-2 {
707
+ margin: 0
708
+ }
709
+ ```
710
+
711
+ Optimizing this CSS will result in the following output:
712
+
713
+ ```css
714
+ .block-1{color:red}
715
+ .block-special {
716
+ color: transparent
717
+ }
718
+ .block-2{margin:0}
719
+ ```
720
+
721
+ ## How to preserve a comment block?
722
+
723
+ Use the `/*!` notation instead of the standard one `/*`:
724
+
725
+ ```css
726
+ /*!
727
+ Important comments included in optimized output.
728
+ */
729
+ ```
730
+
731
+ ## How to rebase relative image URLs?
732
+
733
+ clean-css will handle it automatically for you in the following cases:
734
+
735
+ * when full paths to input files are passed in as options;
736
+ * when correct paths are passed in via a hash;
737
+ * when `rebaseTo` is used with any of above two.
738
+
739
+ ## How to work with source maps?
740
+
741
+ To generate a source map, use `sourceMap: true` option, e.g.:
742
+
743
+ ```js
744
+ new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory })
745
+ .minify(source, function (error, output) {
746
+ // access output.sourceMap for SourceMapGenerator object
747
+ // see https://github.com/mozilla/source-map/#sourcemapgenerator for more details
748
+ });
749
+ ```
750
+
751
+ You can also pass an input source map directly as a 2nd argument to `minify` method:
752
+
753
+ ```js
754
+ new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory })
755
+ .minify(source, inputSourceMap, function (error, output) {
756
+ // access output.sourceMap to access SourceMapGenerator object
757
+ // see https://github.com/mozilla/source-map/#sourcemapgenerator for more details
758
+ });
759
+ ```
760
+
761
+ or even multiple input source maps at once:
762
+
763
+ ```js
764
+ new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory }).minify({
765
+ 'path/to/source/1': {
766
+ styles: '...styles...',
767
+ sourceMap: '...source-map...'
768
+ },
769
+ 'path/to/source/2': {
770
+ styles: '...styles...',
771
+ sourceMap: '...source-map...'
772
+ }
773
+ }, function (error, output) {
774
+ // access output.sourceMap as above
775
+ });
776
+ ```
777
+
778
+ ## How to apply level 1 & 2 optimizations at the same time?
779
+
780
+ Using the hash configuration specifying both optimization levels, e.g.
781
+
782
+ ```js
783
+ new CleanCSS({
784
+ level: {
785
+ 1: {
786
+ all: true,
787
+ normalizeUrls: false
788
+ },
789
+ 2: {
790
+ restructureRules: true
791
+ }
792
+ }
793
+ })
794
+ ```
795
+
796
+ will apply level 1 optimizations, except url normalization, and default level 2 optimizations with rule restructuring.
797
+
798
+ ## What level 2 optimizations do?
799
+
800
+ All level 2 optimizations are dispatched [here](https://github.com/clean-css/clean-css/blob/master/lib/optimizer/level-2/optimize.js#L67), and this is what they do:
801
+
802
+ * `recursivelyOptimizeBlocks` - does all the following operations on a nested block, like `@media` or `@keyframe`;
803
+ * `recursivelyOptimizeProperties` - optimizes properties in rulesets and flat at-rules, like @font-face, by splitting them into components (e.g. `margin` into `margin-(bottom|left|right|top)`), optimizing, and restoring them back. You may want to use `mergeIntoShorthands` option to control whether you want to turn multiple components into shorthands;
804
+ * `removeDuplicates` - gets rid of duplicate rulesets with exactly the same set of properties, e.g. when including a Sass / Less partial twice for no good reason;
805
+ * `mergeAdjacent` - merges adjacent rulesets with the same selector or rules;
806
+ * `reduceNonAdjacent` - identifies which properties are overridden in same-selector non-adjacent rulesets, and removes them;
807
+ * `mergeNonAdjacentBySelector` - identifies same-selector non-adjacent rulesets which can be moved (!) to be merged, requires all intermediate rulesets to not redefine the moved properties, or if redefined to have the same value;
808
+ * `mergeNonAdjacentByBody` - same as the one above but for same-selector non-adjacent rulesets;
809
+ * `restructure` - tries to reorganize different-selector different-rules rulesets so they take less space, e.g. `.one{padding:0}.two{margin:0}.one{margin-bottom:3px}` into `.two{margin:0}.one{padding:0;margin-bottom:3px}`;
810
+ * `removeDuplicateFontAtRules` - removes duplicated `@font-face` rules;
811
+ * `removeDuplicateMediaQueries` - removes duplicated `@media` nested blocks;
812
+ * `mergeMediaQueries` - merges non-adjacent `@media` at-rules by the same rules as `mergeNonAdjacentBy*` above;
813
+
814
+ ## What errors and warnings are?
815
+
816
+ If clean-css encounters invalid CSS, it will try to remove the invalid part and continue optimizing the rest of the code. It will make you aware of the problem by generating an error or warning. Although clean-css can work with invalid CSS, it is always recommended that you fix warnings and errors in your CSS.
817
+
818
+ Example: Minify invalid CSS, resulting in two warnings:
819
+
820
+ ```js
821
+ const CleanCSS = require("clean-css");
822
+
823
+ const output = new CleanCSS().minify(`
824
+
825
+ a {
826
+ -notarealproperty-: 5px;
827
+ color:
828
+ }
829
+ div {
830
+ margin: 5px
831
+ }
832
+
833
+ `);
834
+
835
+ console.log(output);
836
+
837
+ // Log:
838
+ {
839
+ styles: 'div{margin:5px}',
840
+ stats: {
841
+ efficiency: 0.8695652173913043,
842
+ minifiedSize: 15,
843
+ originalSize: 115,
844
+ timeSpent: 1
845
+ },
846
+ errors: [],
847
+ inlinedStylesheets: [],
848
+ warnings: [
849
+ "Invalid property name '-notarealproperty-' at 4:8. Ignoring.",
850
+ "Empty property 'color' at 5:8. Ignoring."
851
+ ]
852
+ }
853
+ ```
854
+
855
+ Example: Minify invalid CSS, resulting in one error:
856
+
857
+ ```js
858
+ const CleanCSS = require("clean-css");
859
+
860
+ const output = new CleanCSS().minify(`
861
+
862
+ @import "idontexist.css";
863
+ a {
864
+ color: blue;
865
+ }
866
+ div {
867
+ margin: 5px
868
+ }
869
+
870
+ `);
871
+
872
+ console.log(output);
873
+
874
+ // Log:
875
+ {
876
+ styles: 'a{color:#00f}div{margin:5px}',
877
+ stats: {
878
+ efficiency: 0.7627118644067796,
879
+ minifiedSize: 28,
880
+ originalSize: 118,
881
+ timeSpent: 2
882
+ },
883
+ errors: [
884
+ 'Ignoring local @import of "idontexist.css" as resource is missing.'
885
+ ],
886
+ inlinedStylesheets: [],
887
+ warnings: []
888
+ }
889
+ ```
890
+ ## Clean-css for Gulp
891
+ An example of how you can include clean-css in gulp
892
+ ```js
893
+ const { src, dest, series } = require('gulp');
894
+ const CleanCSS = require('clean-css');
895
+ const concat = require('gulp-concat');
896
+
897
+ function css() {
898
+ const options = {
899
+ compatibility: '*', // (default) - Internet Explorer 10+ compatibility mode
900
+ inline: ['all'], // enables all inlining, same as ['local', 'remote']
901
+ level: 2 // Optimization levels. The level option can be either 0, 1 (default), or 2, e.g.
902
+ // Please note that level 1 optimization options are generally safe while level 2 optimizations should be safe for most users.
903
+ };
904
+
905
+ return src('app/**/*.css')
906
+ .pipe(concat('style.min.css'))
907
+ .on('data', function(file) {
908
+ const buferFile = new CleanCSS(options).minify(file.contents)
909
+ return file.contents = Buffer.from(buferFile.styles)
910
+ })
911
+ .pipe(dest('build'))
912
+ }
913
+ exports.css = series(css)
914
+ ```
915
+
916
+ ## How to use clean-css with build tools?
917
+
918
+ There is a number of 3rd party plugins to popular build tools:
919
+
920
+ * [Broccoli](https://github.com/broccolijs/broccoli#broccoli): [broccoli-clean-css](https://github.com/shinnn/broccoli-clean-css)
921
+ * [Brunch](http://brunch.io/): [clean-css-brunch](https://github.com/brunch/clean-css-brunch)
922
+ * [Grunt](http://gruntjs.com): [grunt-contrib-cssmin](https://github.com/gruntjs/grunt-contrib-cssmin)
923
+ * [Gulp](http://gulpjs.com/): [gulp-clean-css](https://github.com/scniro/gulp-clean-css)
924
+ * [Gulp](http://gulpjs.com/): [using vinyl-map as a wrapper - courtesy of @sogko](https://github.com/clean-css/clean-css/issues/342)
925
+ * [component-builder2](https://github.com/component/builder2.js): [builder-clean-css](https://github.com/poying/builder-clean-css)
926
+ * [Metalsmith](http://metalsmith.io): [metalsmith-clean-css](https://github.com/aymericbeaumet/metalsmith-clean-css)
927
+ * [Lasso](https://github.com/lasso-js/lasso): [lasso-clean-css](https://github.com/yomed/lasso-clean-css)
928
+ * [Start](https://github.com/start-runner/start): [start-clean-css](https://github.com/start-runner/clean-css)
929
+
930
+ ## How to use clean-css from web browser?
931
+
932
+ * https://clean-css.github.io/ (official web interface)
933
+ * http://refresh-sf.com/
934
+ * http://adamburgess.github.io/clean-css-online/
935
+
936
+ # Contributing
937
+
938
+ See [CONTRIBUTING.md](https://github.com/clean-css/clean-css/blob/master/CONTRIBUTING.md).
939
+
940
+ ## How to get started?
941
+
942
+ First clone the sources:
943
+
944
+ ```bash
945
+ git clone git@github.com:clean-css/clean-css.git
946
+ ```
947
+
948
+ then install dependencies:
949
+
950
+ ```bash
951
+ cd clean-css
952
+ npm install
953
+ ```
954
+
955
+ then use any of the following commands to verify your copy:
956
+
957
+ ```bash
958
+ npm run bench # for clean-css benchmarks (see [test/bench.js](https://github.com/clean-css/clean-css/blob/master/test/bench.js) for details)
959
+ npm run browserify # to create the browser-ready clean-css version
960
+ npm run check # to lint JS sources with [JSHint](https://github.com/jshint/jshint/)
961
+ npm test # to run all tests
962
+ ```
963
+
964
+ # Acknowledgments
965
+
966
+ Sorted alphabetically by GitHub handle:
967
+
968
+ * [@abarre](https://github.com/abarre) (Anthony Barre) for improvements to `@import` processing;
969
+ * [@alexlamsl](https://github.com/alexlamsl) (Alex Lam S.L.) for testing early clean-css 4 versions, reporting bugs, and suggesting numerous improvements.
970
+ * [@altschuler](https://github.com/altschuler) (Simon Altschuler) for fixing `@import` processing inside comments;
971
+ * [@ben-eb](https://github.com/ben-eb) (Ben Briggs) for sharing ideas about CSS optimizations;
972
+ * [@davisjam](https://github.com/davisjam) (Jamie Davis) for disclosing ReDOS vulnerabilities;
973
+ * [@facelessuser](https://github.com/facelessuser) (Isaac) for pointing out a flaw in clean-css' stateless mode;
974
+ * [@grandrath](https://github.com/grandrath) (Martin Grandrath) for improving `minify` method source traversal in ES6;
975
+ * [@jmalonzo](https://github.com/jmalonzo) (Jan Michael Alonzo) for a patch removing node.js' old `sys` package;
976
+ * [@lukeapage](https://github.com/lukeapage) (Luke Page) for suggestions and testing the source maps feature;
977
+ Plus everyone else involved in [#125](https://github.com/clean-css/clean-css/issues/125) for pushing it forward;
978
+ * [@madwizard-thomas](https://github.com/madwizard-thomas) for sharing ideas about `@import` inlining and URL rebasing.
979
+ * [@ngyikp](https://github.com/ngyikp) (Ng Yik Phang) for testing early clean-css 4 versions, reporting bugs, and suggesting numerous improvements.
980
+ * [@wagenet](https://github.com/wagenet) (Peter Wagenet) for suggesting improvements to `@import` inlining behavior;
981
+ * [@venemo](https://github.com/venemo) (Timur Kristóf) for an outstanding contribution of advanced property optimizer for 2.2 release;
982
+ * [@vvo](https://github.com/vvo) (Vincent Voyer) for a patch with better empty element regex and for inspiring us to do many performance improvements in 0.4 release;
983
+ * [@xhmikosr](https://github.com/xhmikosr) for suggesting new features, like option to remove special comments and strip out URLs quotation, and pointing out numerous improvements like JSHint, media queries, etc.
984
+
985
+ # License
986
+
987
+ clean-css is released under the [MIT License](https://github.com/clean-css/clean-css/blob/master/LICENSE).