@master/css 2.0.0-alpha.7 → 2.0.0-alpha.70

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 (704) hide show
  1. package/esm/apis/configure.d.ts +2 -0
  2. package/esm/apis/configure.js +11 -0
  3. package/esm/apis/configure.js.map +1 -0
  4. package/esm/apis/extend.d.ts +5 -0
  5. package/esm/apis/extend.js +61 -0
  6. package/esm/apis/extend.js.map +1 -0
  7. package/esm/apis/fill-color-scale.d.ts +1 -0
  8. package/esm/apis/fill-color-scale.js +60 -0
  9. package/esm/apis/fill-color-scale.js.map +1 -0
  10. package/esm/apis/index.d.ts +7 -0
  11. package/esm/apis/index.js +8 -0
  12. package/esm/apis/index.js.map +1 -0
  13. package/esm/apis/init.d.ts +3 -0
  14. package/esm/apis/init.js +13 -0
  15. package/esm/apis/init.js.map +1 -0
  16. package/esm/apis/render-from-html.d.ts +3 -0
  17. package/esm/apis/render-from-html.js +19 -0
  18. package/esm/apis/render-from-html.js.map +1 -0
  19. package/esm/apis/render-into-html.d.ts +3 -0
  20. package/esm/apis/render-into-html.js +10 -0
  21. package/esm/apis/render-into-html.js.map +1 -0
  22. package/esm/apis/render.d.ts +3 -0
  23. package/esm/apis/render.js +14 -0
  24. package/esm/apis/render.js.map +1 -0
  25. package/esm/config/breakpoints.d.ts +13 -0
  26. package/esm/config/breakpoints.js +14 -0
  27. package/esm/config/breakpoints.js.map +1 -0
  28. package/esm/config/colors.d.ts +25 -0
  29. package/esm/config/colors.js +266 -0
  30. package/esm/config/colors.js.map +1 -0
  31. package/esm/config/index.d.ts +12 -0
  32. package/esm/config/index.js +22 -0
  33. package/esm/config/index.js.map +1 -0
  34. package/esm/config/root-size.d.ts +2 -0
  35. package/esm/config/root-size.js +3 -0
  36. package/esm/config/root-size.js.map +1 -0
  37. package/esm/config/rules.d.ts +3 -0
  38. package/esm/config/rules.js +390 -0
  39. package/esm/config/rules.js.map +1 -0
  40. package/esm/config/scheme.d.ts +8 -0
  41. package/esm/config/scheme.js +9 -0
  42. package/esm/config/scheme.js.map +1 -0
  43. package/esm/config/selectors.d.ts +19 -0
  44. package/esm/config/selectors.js +20 -0
  45. package/esm/config/selectors.js.map +1 -0
  46. package/esm/config/semantics.d.ts +82 -0
  47. package/esm/config/semantics.js +83 -0
  48. package/esm/config/semantics.js.map +1 -0
  49. package/esm/config/themes.d.ts +2 -0
  50. package/esm/config/themes.js +3 -0
  51. package/esm/config/themes.js.map +1 -0
  52. package/esm/config/values.d.ts +126 -0
  53. package/esm/config/values.js +85 -0
  54. package/esm/config/values.js.map +1 -0
  55. package/esm/constants/start-symbol.d.ts +5 -0
  56. package/esm/constants/start-symbol.js +6 -0
  57. package/esm/constants/start-symbol.js.map +1 -0
  58. package/esm/css.d.ts +74 -0
  59. package/esm/css.js +963 -0
  60. package/esm/css.js.map +1 -0
  61. package/esm/index.d.ts +4 -0
  62. package/esm/index.js +5 -0
  63. package/esm/index.js.map +1 -0
  64. package/esm/interfaces/config.d.ts +25 -0
  65. package/esm/interfaces/config.js +2 -0
  66. package/esm/interfaces/config.js.map +1 -0
  67. package/esm/interfaces/declaration.d.ts +5 -0
  68. package/esm/interfaces/declaration.js +2 -0
  69. package/esm/interfaces/declaration.js.map +1 -0
  70. package/esm/interfaces/media-feature-rule.d.ts +7 -0
  71. package/esm/interfaces/media-feature-rule.js +2 -0
  72. package/esm/interfaces/media-feature-rule.js.map +1 -0
  73. package/esm/interfaces/media.d.ts +8 -0
  74. package/esm/interfaces/media.js +2 -0
  75. package/esm/interfaces/media.js.map +1 -0
  76. package/esm/polyfills/css-escape.d.ts +2 -0
  77. package/esm/polyfills/css-escape.js +91 -0
  78. package/esm/polyfills/css-escape.js.map +1 -0
  79. package/esm/rule.d.ts +54 -0
  80. package/esm/rule.js +604 -0
  81. package/esm/rule.js.map +1 -0
  82. package/esm/rules/accent-color.d.ts +7 -0
  83. package/esm/rules/accent-color.js +8 -0
  84. package/esm/rules/accent-color.js.map +1 -0
  85. package/esm/rules/align-content.d.ts +6 -0
  86. package/esm/rules/align-content.js +7 -0
  87. package/esm/rules/align-content.js.map +1 -0
  88. package/esm/rules/align-items.d.ts +6 -0
  89. package/esm/rules/align-items.js +7 -0
  90. package/esm/rules/align-items.js.map +1 -0
  91. package/esm/rules/align-self.d.ts +6 -0
  92. package/esm/rules/align-self.js +7 -0
  93. package/esm/rules/align-self.js.map +1 -0
  94. package/esm/rules/animation-delay.d.ts +7 -0
  95. package/esm/rules/animation-delay.js +8 -0
  96. package/esm/rules/animation-delay.js.map +1 -0
  97. package/esm/rules/animation-direction.d.ts +6 -0
  98. package/esm/rules/animation-direction.js +7 -0
  99. package/esm/rules/animation-direction.js.map +1 -0
  100. package/esm/rules/animation-duration.d.ts +7 -0
  101. package/esm/rules/animation-duration.js +8 -0
  102. package/esm/rules/animation-duration.js.map +1 -0
  103. package/esm/rules/animation-fill-mode.d.ts +6 -0
  104. package/esm/rules/animation-fill-mode.js +7 -0
  105. package/esm/rules/animation-fill-mode.js.map +1 -0
  106. package/esm/rules/animation-iteration-count.d.ts +7 -0
  107. package/esm/rules/animation-iteration-count.js +8 -0
  108. package/esm/rules/animation-iteration-count.js.map +1 -0
  109. package/esm/rules/animation-name.d.ts +6 -0
  110. package/esm/rules/animation-name.js +7 -0
  111. package/esm/rules/animation-name.js.map +1 -0
  112. package/esm/rules/animation-play-state.d.ts +6 -0
  113. package/esm/rules/animation-play-state.js +7 -0
  114. package/esm/rules/animation-play-state.js.map +1 -0
  115. package/esm/rules/animation-timing-function.d.ts +6 -0
  116. package/esm/rules/animation-timing-function.js +7 -0
  117. package/esm/rules/animation-timing-function.js.map +1 -0
  118. package/esm/rules/animation.d.ts +8 -0
  119. package/esm/rules/animation.js +9 -0
  120. package/esm/rules/animation.js.map +1 -0
  121. package/esm/rules/appearance.d.ts +5 -0
  122. package/esm/rules/appearance.js +6 -0
  123. package/esm/rules/appearance.js.map +1 -0
  124. package/esm/rules/aspect-radio.d.ts +7 -0
  125. package/esm/rules/aspect-radio.js +8 -0
  126. package/esm/rules/aspect-radio.js.map +1 -0
  127. package/esm/rules/backdrop-filter.d.ts +11 -0
  128. package/esm/rules/backdrop-filter.js +26 -0
  129. package/esm/rules/backdrop-filter.js.map +1 -0
  130. package/esm/rules/background-attachment.d.ts +6 -0
  131. package/esm/rules/background-attachment.js +7 -0
  132. package/esm/rules/background-attachment.js.map +1 -0
  133. package/esm/rules/background-blend-mode.d.ts +5 -0
  134. package/esm/rules/background-blend-mode.js +6 -0
  135. package/esm/rules/background-blend-mode.js.map +1 -0
  136. package/esm/rules/background-clip.d.ts +9 -0
  137. package/esm/rules/background-clip.js +13 -0
  138. package/esm/rules/background-clip.js.map +1 -0
  139. package/esm/rules/background-color.d.ts +8 -0
  140. package/esm/rules/background-color.js +9 -0
  141. package/esm/rules/background-color.js.map +1 -0
  142. package/esm/rules/background-image.d.ts +7 -0
  143. package/esm/rules/background-image.js +8 -0
  144. package/esm/rules/background-image.js.map +1 -0
  145. package/esm/rules/background-origin.d.ts +6 -0
  146. package/esm/rules/background-origin.js +7 -0
  147. package/esm/rules/background-origin.js.map +1 -0
  148. package/esm/rules/background-position.d.ts +7 -0
  149. package/esm/rules/background-position.js +8 -0
  150. package/esm/rules/background-position.js.map +1 -0
  151. package/esm/rules/background-repeat.d.ts +6 -0
  152. package/esm/rules/background-repeat.js +7 -0
  153. package/esm/rules/background-repeat.js.map +1 -0
  154. package/esm/rules/background-size.d.ts +6 -0
  155. package/esm/rules/background-size.js +7 -0
  156. package/esm/rules/background-size.js.map +1 -0
  157. package/esm/rules/background.d.ts +8 -0
  158. package/esm/rules/background.js +9 -0
  159. package/esm/rules/background.js.map +1 -0
  160. package/esm/rules/border-collapse.d.ts +6 -0
  161. package/esm/rules/border-collapse.js +7 -0
  162. package/esm/rules/border-collapse.js.map +1 -0
  163. package/esm/rules/border-color.d.ts +11 -0
  164. package/esm/rules/border-color.js +15 -0
  165. package/esm/rules/border-color.js.map +1 -0
  166. package/esm/rules/border-image-outset.d.ts +5 -0
  167. package/esm/rules/border-image-outset.js +6 -0
  168. package/esm/rules/border-image-outset.js.map +1 -0
  169. package/esm/rules/border-image-repeat.d.ts +6 -0
  170. package/esm/rules/border-image-repeat.js +7 -0
  171. package/esm/rules/border-image-repeat.js.map +1 -0
  172. package/esm/rules/border-image-slice.d.ts +6 -0
  173. package/esm/rules/border-image-slice.js +7 -0
  174. package/esm/rules/border-image-slice.js.map +1 -0
  175. package/esm/rules/border-image-source.d.ts +6 -0
  176. package/esm/rules/border-image-source.js +7 -0
  177. package/esm/rules/border-image-source.js.map +1 -0
  178. package/esm/rules/border-image-width.d.ts +6 -0
  179. package/esm/rules/border-image-width.js +7 -0
  180. package/esm/rules/border-image-width.js.map +1 -0
  181. package/esm/rules/border-image.d.ts +6 -0
  182. package/esm/rules/border-image.js +7 -0
  183. package/esm/rules/border-image.js.map +1 -0
  184. package/esm/rules/border-radius.d.ts +9 -0
  185. package/esm/rules/border-radius.js +74 -0
  186. package/esm/rules/border-radius.js.map +1 -0
  187. package/esm/rules/border-spacing.d.ts +5 -0
  188. package/esm/rules/border-spacing.js +6 -0
  189. package/esm/rules/border-spacing.js.map +1 -0
  190. package/esm/rules/border-style.d.ts +9 -0
  191. package/esm/rules/border-style.js +13 -0
  192. package/esm/rules/border-style.js.map +1 -0
  193. package/esm/rules/border-width.d.ts +9 -0
  194. package/esm/rules/border-width.js +13 -0
  195. package/esm/rules/border-width.js.map +1 -0
  196. package/esm/rules/border.d.ts +10 -0
  197. package/esm/rules/border.js +14 -0
  198. package/esm/rules/border.js.map +1 -0
  199. package/esm/rules/box-decoration-break.d.ts +9 -0
  200. package/esm/rules/box-decoration-break.js +13 -0
  201. package/esm/rules/box-decoration-break.js.map +1 -0
  202. package/esm/rules/box-shadow.d.ts +7 -0
  203. package/esm/rules/box-shadow.js +8 -0
  204. package/esm/rules/box-shadow.js.map +1 -0
  205. package/esm/rules/box-sizing.d.ts +6 -0
  206. package/esm/rules/box-sizing.js +7 -0
  207. package/esm/rules/box-sizing.js.map +1 -0
  208. package/esm/rules/break-after.d.ts +5 -0
  209. package/esm/rules/break-after.js +6 -0
  210. package/esm/rules/break-after.js.map +1 -0
  211. package/esm/rules/break-before.d.ts +5 -0
  212. package/esm/rules/break-before.js +6 -0
  213. package/esm/rules/break-before.js.map +1 -0
  214. package/esm/rules/break-inside.d.ts +5 -0
  215. package/esm/rules/break-inside.js +6 -0
  216. package/esm/rules/break-inside.js.map +1 -0
  217. package/esm/rules/caret-color.d.ts +7 -0
  218. package/esm/rules/caret-color.js +8 -0
  219. package/esm/rules/caret-color.js.map +1 -0
  220. package/esm/rules/clear.d.ts +5 -0
  221. package/esm/rules/clear.js +6 -0
  222. package/esm/rules/clear.js.map +1 -0
  223. package/esm/rules/clip-path.d.ts +6 -0
  224. package/esm/rules/clip-path.js +7 -0
  225. package/esm/rules/clip-path.js.map +1 -0
  226. package/esm/rules/color.d.ts +8 -0
  227. package/esm/rules/color.js +9 -0
  228. package/esm/rules/color.js.map +1 -0
  229. package/esm/rules/column-span.d.ts +6 -0
  230. package/esm/rules/column-span.js +7 -0
  231. package/esm/rules/column-span.js.map +1 -0
  232. package/esm/rules/columns.d.ts +8 -0
  233. package/esm/rules/columns.js +9 -0
  234. package/esm/rules/columns.js.map +1 -0
  235. package/esm/rules/contain.d.ts +5 -0
  236. package/esm/rules/contain.js +6 -0
  237. package/esm/rules/contain.js.map +1 -0
  238. package/esm/rules/content.d.ts +5 -0
  239. package/esm/rules/content.js +6 -0
  240. package/esm/rules/content.js.map +1 -0
  241. package/esm/rules/counter-increment.d.ts +6 -0
  242. package/esm/rules/counter-increment.js +7 -0
  243. package/esm/rules/counter-increment.js.map +1 -0
  244. package/esm/rules/cursor.d.ts +5 -0
  245. package/esm/rules/cursor.js +6 -0
  246. package/esm/rules/cursor.js.map +1 -0
  247. package/esm/rules/cx.d.ts +6 -0
  248. package/esm/rules/cx.js +7 -0
  249. package/esm/rules/cx.js.map +1 -0
  250. package/esm/rules/cy.d.ts +6 -0
  251. package/esm/rules/cy.js +7 -0
  252. package/esm/rules/cy.js.map +1 -0
  253. package/esm/rules/direction.d.ts +5 -0
  254. package/esm/rules/direction.js +6 -0
  255. package/esm/rules/direction.js.map +1 -0
  256. package/esm/rules/display.d.ts +6 -0
  257. package/esm/rules/display.js +7 -0
  258. package/esm/rules/display.js.map +1 -0
  259. package/esm/rules/fill.d.ts +7 -0
  260. package/esm/rules/fill.js +8 -0
  261. package/esm/rules/fill.js.map +1 -0
  262. package/esm/rules/filter.d.ts +8 -0
  263. package/esm/rules/filter.js +20 -0
  264. package/esm/rules/filter.js.map +1 -0
  265. package/esm/rules/flex-basis.d.ts +5 -0
  266. package/esm/rules/flex-basis.js +6 -0
  267. package/esm/rules/flex-basis.js.map +1 -0
  268. package/esm/rules/flex-direction.d.ts +6 -0
  269. package/esm/rules/flex-direction.js +7 -0
  270. package/esm/rules/flex-direction.js.map +1 -0
  271. package/esm/rules/flex-grow.d.ts +6 -0
  272. package/esm/rules/flex-grow.js +7 -0
  273. package/esm/rules/flex-grow.js.map +1 -0
  274. package/esm/rules/flex-shrink.d.ts +6 -0
  275. package/esm/rules/flex-shrink.js +7 -0
  276. package/esm/rules/flex-shrink.js.map +1 -0
  277. package/esm/rules/flex-wrap.d.ts +6 -0
  278. package/esm/rules/flex-wrap.js +7 -0
  279. package/esm/rules/flex-wrap.js.map +1 -0
  280. package/esm/rules/flex.d.ts +7 -0
  281. package/esm/rules/flex.js +8 -0
  282. package/esm/rules/flex.js.map +1 -0
  283. package/esm/rules/float.d.ts +5 -0
  284. package/esm/rules/float.js +6 -0
  285. package/esm/rules/float.js.map +1 -0
  286. package/esm/rules/font-family.d.ts +6 -0
  287. package/esm/rules/font-family.js +7 -0
  288. package/esm/rules/font-family.js.map +1 -0
  289. package/esm/rules/font-size.d.ts +6 -0
  290. package/esm/rules/font-size.js +7 -0
  291. package/esm/rules/font-size.js.map +1 -0
  292. package/esm/rules/font-smoothing.d.ts +9 -0
  293. package/esm/rules/font-smoothing.js +34 -0
  294. package/esm/rules/font-smoothing.js.map +1 -0
  295. package/esm/rules/font-style.d.ts +7 -0
  296. package/esm/rules/font-style.js +8 -0
  297. package/esm/rules/font-style.js.map +1 -0
  298. package/esm/rules/font-variant-numeric.d.ts +6 -0
  299. package/esm/rules/font-variant-numeric.js +7 -0
  300. package/esm/rules/font-variant-numeric.js.map +1 -0
  301. package/esm/rules/font-weight.d.ts +7 -0
  302. package/esm/rules/font-weight.js +8 -0
  303. package/esm/rules/font-weight.js.map +1 -0
  304. package/esm/rules/font.d.ts +8 -0
  305. package/esm/rules/font.js +9 -0
  306. package/esm/rules/font.js.map +1 -0
  307. package/esm/rules/gap.d.ts +9 -0
  308. package/esm/rules/gap.js +17 -0
  309. package/esm/rules/gap.js.map +1 -0
  310. package/esm/rules/grid-area.d.ts +7 -0
  311. package/esm/rules/grid-area.js +8 -0
  312. package/esm/rules/grid-area.js.map +1 -0
  313. package/esm/rules/grid-auto-columns.d.ts +6 -0
  314. package/esm/rules/grid-auto-columns.js +7 -0
  315. package/esm/rules/grid-auto-columns.js.map +1 -0
  316. package/esm/rules/grid-auto-flow.d.ts +6 -0
  317. package/esm/rules/grid-auto-flow.js +7 -0
  318. package/esm/rules/grid-auto-flow.js.map +1 -0
  319. package/esm/rules/grid-auto-rows.d.ts +5 -0
  320. package/esm/rules/grid-auto-rows.js +6 -0
  321. package/esm/rules/grid-auto-rows.js.map +1 -0
  322. package/esm/rules/grid-column-end.d.ts +7 -0
  323. package/esm/rules/grid-column-end.js +8 -0
  324. package/esm/rules/grid-column-end.js.map +1 -0
  325. package/esm/rules/grid-column-start.d.ts +7 -0
  326. package/esm/rules/grid-column-start.js +8 -0
  327. package/esm/rules/grid-column-start.js.map +1 -0
  328. package/esm/rules/grid-column.d.ts +9 -0
  329. package/esm/rules/grid-column.js +14 -0
  330. package/esm/rules/grid-column.js.map +1 -0
  331. package/esm/rules/grid-columns.d.ts +10 -0
  332. package/esm/rules/grid-columns.js +21 -0
  333. package/esm/rules/grid-columns.js.map +1 -0
  334. package/esm/rules/grid-row-end.d.ts +6 -0
  335. package/esm/rules/grid-row-end.js +7 -0
  336. package/esm/rules/grid-row-end.js.map +1 -0
  337. package/esm/rules/grid-row-start.d.ts +6 -0
  338. package/esm/rules/grid-row-start.js +7 -0
  339. package/esm/rules/grid-row-start.js.map +1 -0
  340. package/esm/rules/grid-row.d.ts +9 -0
  341. package/esm/rules/grid-row.js +14 -0
  342. package/esm/rules/grid-row.js.map +1 -0
  343. package/esm/rules/grid-rows.d.ts +9 -0
  344. package/esm/rules/grid-rows.js +21 -0
  345. package/esm/rules/grid-rows.js.map +1 -0
  346. package/esm/rules/grid-template-areas.d.ts +5 -0
  347. package/esm/rules/grid-template-areas.js +6 -0
  348. package/esm/rules/grid-template-areas.js.map +1 -0
  349. package/esm/rules/grid-template-columns.d.ts +6 -0
  350. package/esm/rules/grid-template-columns.js +7 -0
  351. package/esm/rules/grid-template-columns.js.map +1 -0
  352. package/esm/rules/grid-template-rows.d.ts +5 -0
  353. package/esm/rules/grid-template-rows.js +6 -0
  354. package/esm/rules/grid-template-rows.js.map +1 -0
  355. package/esm/rules/grid-template.d.ts +6 -0
  356. package/esm/rules/grid-template.js +7 -0
  357. package/esm/rules/grid-template.js.map +1 -0
  358. package/esm/rules/grid.d.ts +6 -0
  359. package/esm/rules/grid.js +7 -0
  360. package/esm/rules/grid.js.map +1 -0
  361. package/esm/rules/group.d.ts +9 -0
  362. package/esm/rules/group.js +105 -0
  363. package/esm/rules/group.js.map +1 -0
  364. package/esm/rules/height.d.ts +6 -0
  365. package/esm/rules/height.js +7 -0
  366. package/esm/rules/height.js.map +1 -0
  367. package/esm/rules/inset.d.ts +9 -0
  368. package/esm/rules/inset.js +12 -0
  369. package/esm/rules/inset.js.map +1 -0
  370. package/esm/rules/isolation.d.ts +5 -0
  371. package/esm/rules/isolation.js +6 -0
  372. package/esm/rules/isolation.js.map +1 -0
  373. package/esm/rules/justify-content.d.ts +6 -0
  374. package/esm/rules/justify-content.js +7 -0
  375. package/esm/rules/justify-content.js.map +1 -0
  376. package/esm/rules/justify-items.d.ts +6 -0
  377. package/esm/rules/justify-items.js +7 -0
  378. package/esm/rules/justify-items.js.map +1 -0
  379. package/esm/rules/justify-self.d.ts +6 -0
  380. package/esm/rules/justify-self.js +7 -0
  381. package/esm/rules/justify-self.js.map +1 -0
  382. package/esm/rules/letter-spacing.d.ts +7 -0
  383. package/esm/rules/letter-spacing.js +8 -0
  384. package/esm/rules/letter-spacing.js.map +1 -0
  385. package/esm/rules/line-clamp.d.ts +9 -0
  386. package/esm/rules/line-clamp.js +12 -0
  387. package/esm/rules/line-clamp.js.map +1 -0
  388. package/esm/rules/line-height.d.ts +7 -0
  389. package/esm/rules/line-height.js +8 -0
  390. package/esm/rules/line-height.js.map +1 -0
  391. package/esm/rules/lines.d.ts +9 -0
  392. package/esm/rules/lines.js +17 -0
  393. package/esm/rules/lines.js.map +1 -0
  394. package/esm/rules/list-style-image.d.ts +6 -0
  395. package/esm/rules/list-style-image.js +7 -0
  396. package/esm/rules/list-style-image.js.map +1 -0
  397. package/esm/rules/list-style-position.d.ts +6 -0
  398. package/esm/rules/list-style-position.js +7 -0
  399. package/esm/rules/list-style-position.js.map +1 -0
  400. package/esm/rules/list-style-type.d.ts +6 -0
  401. package/esm/rules/list-style-type.js +7 -0
  402. package/esm/rules/list-style-type.js.map +1 -0
  403. package/esm/rules/list-style.d.ts +6 -0
  404. package/esm/rules/list-style.js +7 -0
  405. package/esm/rules/list-style.js.map +1 -0
  406. package/esm/rules/margin.d.ts +9 -0
  407. package/esm/rules/margin.js +14 -0
  408. package/esm/rules/margin.js.map +1 -0
  409. package/esm/rules/mask-image.d.ts +8 -0
  410. package/esm/rules/mask-image.js +12 -0
  411. package/esm/rules/mask-image.js.map +1 -0
  412. package/esm/rules/max-height.d.ts +6 -0
  413. package/esm/rules/max-height.js +7 -0
  414. package/esm/rules/max-height.js.map +1 -0
  415. package/esm/rules/max-width.d.ts +6 -0
  416. package/esm/rules/max-width.js +7 -0
  417. package/esm/rules/max-width.js.map +1 -0
  418. package/esm/rules/min-height.d.ts +6 -0
  419. package/esm/rules/min-height.js +7 -0
  420. package/esm/rules/min-height.js.map +1 -0
  421. package/esm/rules/min-width.d.ts +6 -0
  422. package/esm/rules/min-width.js +7 -0
  423. package/esm/rules/min-width.js.map +1 -0
  424. package/esm/rules/mix-blend-mode.d.ts +6 -0
  425. package/esm/rules/mix-blend-mode.js +7 -0
  426. package/esm/rules/mix-blend-mode.js.map +1 -0
  427. package/esm/rules/object-fit.d.ts +6 -0
  428. package/esm/rules/object-fit.js +7 -0
  429. package/esm/rules/object-fit.js.map +1 -0
  430. package/esm/rules/object-position.d.ts +6 -0
  431. package/esm/rules/object-position.js +7 -0
  432. package/esm/rules/object-position.js.map +1 -0
  433. package/esm/rules/opacity.d.ts +6 -0
  434. package/esm/rules/opacity.js +7 -0
  435. package/esm/rules/opacity.js.map +1 -0
  436. package/esm/rules/order.d.ts +7 -0
  437. package/esm/rules/order.js +9 -0
  438. package/esm/rules/order.js.map +1 -0
  439. package/esm/rules/outline-color.d.ts +7 -0
  440. package/esm/rules/outline-color.js +8 -0
  441. package/esm/rules/outline-color.js.map +1 -0
  442. package/esm/rules/outline-offset.d.ts +5 -0
  443. package/esm/rules/outline-offset.js +6 -0
  444. package/esm/rules/outline-offset.js.map +1 -0
  445. package/esm/rules/outline-style.d.ts +6 -0
  446. package/esm/rules/outline-style.js +7 -0
  447. package/esm/rules/outline-style.js.map +1 -0
  448. package/esm/rules/outline-width.d.ts +6 -0
  449. package/esm/rules/outline-width.js +7 -0
  450. package/esm/rules/outline-width.js.map +1 -0
  451. package/esm/rules/outline.d.ts +7 -0
  452. package/esm/rules/outline.js +8 -0
  453. package/esm/rules/outline.js.map +1 -0
  454. package/esm/rules/overflow.d.ts +9 -0
  455. package/esm/rules/overflow.js +27 -0
  456. package/esm/rules/overflow.js.map +1 -0
  457. package/esm/rules/overscroll-behavior.d.ts +8 -0
  458. package/esm/rules/overscroll-behavior.js +16 -0
  459. package/esm/rules/overscroll-behavior.js.map +1 -0
  460. package/esm/rules/padding.d.ts +9 -0
  461. package/esm/rules/padding.js +14 -0
  462. package/esm/rules/padding.js.map +1 -0
  463. package/esm/rules/place-content.d.ts +6 -0
  464. package/esm/rules/place-content.js +7 -0
  465. package/esm/rules/place-content.js.map +1 -0
  466. package/esm/rules/place-items.d.ts +6 -0
  467. package/esm/rules/place-items.js +7 -0
  468. package/esm/rules/place-items.js.map +1 -0
  469. package/esm/rules/place-self.d.ts +6 -0
  470. package/esm/rules/place-self.js +7 -0
  471. package/esm/rules/place-self.js.map +1 -0
  472. package/esm/rules/placement.d.ts +8 -0
  473. package/esm/rules/placement.js +30 -0
  474. package/esm/rules/placement.js.map +1 -0
  475. package/esm/rules/pointer-events.d.ts +5 -0
  476. package/esm/rules/pointer-events.js +6 -0
  477. package/esm/rules/pointer-events.js.map +1 -0
  478. package/esm/rules/position.d.ts +5 -0
  479. package/esm/rules/position.js +6 -0
  480. package/esm/rules/position.js.map +1 -0
  481. package/esm/rules/quotes.d.ts +5 -0
  482. package/esm/rules/quotes.js +6 -0
  483. package/esm/rules/quotes.js.map +1 -0
  484. package/esm/rules/resize.d.ts +5 -0
  485. package/esm/rules/resize.js +6 -0
  486. package/esm/rules/resize.js.map +1 -0
  487. package/esm/rules/rx.d.ts +6 -0
  488. package/esm/rules/rx.js +7 -0
  489. package/esm/rules/rx.js.map +1 -0
  490. package/esm/rules/ry.d.ts +6 -0
  491. package/esm/rules/ry.js +7 -0
  492. package/esm/rules/ry.js.map +1 -0
  493. package/esm/rules/scroll-behavior.d.ts +5 -0
  494. package/esm/rules/scroll-behavior.js +6 -0
  495. package/esm/rules/scroll-behavior.js.map +1 -0
  496. package/esm/rules/scroll-margin.d.ts +9 -0
  497. package/esm/rules/scroll-margin.js +46 -0
  498. package/esm/rules/scroll-margin.js.map +1 -0
  499. package/esm/rules/scroll-padding.d.ts +9 -0
  500. package/esm/rules/scroll-padding.js +46 -0
  501. package/esm/rules/scroll-padding.js.map +1 -0
  502. package/esm/rules/scroll-snap-align.d.ts +6 -0
  503. package/esm/rules/scroll-snap-align.js +7 -0
  504. package/esm/rules/scroll-snap-align.js.map +1 -0
  505. package/esm/rules/scroll-snap-stop.d.ts +6 -0
  506. package/esm/rules/scroll-snap-stop.js +7 -0
  507. package/esm/rules/scroll-snap-stop.js.map +1 -0
  508. package/esm/rules/scroll-snap-type.d.ts +6 -0
  509. package/esm/rules/scroll-snap-type.js +7 -0
  510. package/esm/rules/scroll-snap-type.js.map +1 -0
  511. package/esm/rules/shape-image-threshold.d.ts +6 -0
  512. package/esm/rules/shape-image-threshold.js +7 -0
  513. package/esm/rules/shape-image-threshold.js.map +1 -0
  514. package/esm/rules/shape-margin.d.ts +6 -0
  515. package/esm/rules/shape-margin.js +7 -0
  516. package/esm/rules/shape-margin.js.map +1 -0
  517. package/esm/rules/shape-outside.d.ts +6 -0
  518. package/esm/rules/shape-outside.js +7 -0
  519. package/esm/rules/shape-outside.js.map +1 -0
  520. package/esm/rules/spacing.d.ts +9 -0
  521. package/esm/rules/spacing.js +49 -0
  522. package/esm/rules/spacing.js.map +1 -0
  523. package/esm/rules/stroke-dasharray.d.ts +5 -0
  524. package/esm/rules/stroke-dasharray.js +6 -0
  525. package/esm/rules/stroke-dasharray.js.map +1 -0
  526. package/esm/rules/stroke-dashoffset.d.ts +5 -0
  527. package/esm/rules/stroke-dashoffset.js +6 -0
  528. package/esm/rules/stroke-dashoffset.js.map +1 -0
  529. package/esm/rules/stroke-width.d.ts +6 -0
  530. package/esm/rules/stroke-width.js +7 -0
  531. package/esm/rules/stroke-width.js.map +1 -0
  532. package/esm/rules/stroke.d.ts +6 -0
  533. package/esm/rules/stroke.js +7 -0
  534. package/esm/rules/stroke.js.map +1 -0
  535. package/esm/rules/table-layout.d.ts +5 -0
  536. package/esm/rules/table-layout.js +6 -0
  537. package/esm/rules/table-layout.js.map +1 -0
  538. package/esm/rules/text-align.d.ts +6 -0
  539. package/esm/rules/text-align.js +7 -0
  540. package/esm/rules/text-align.js.map +1 -0
  541. package/esm/rules/text-decoration-color.d.ts +7 -0
  542. package/esm/rules/text-decoration-color.js +8 -0
  543. package/esm/rules/text-decoration-color.js.map +1 -0
  544. package/esm/rules/text-decoration-line.d.ts +6 -0
  545. package/esm/rules/text-decoration-line.js +7 -0
  546. package/esm/rules/text-decoration-line.js.map +1 -0
  547. package/esm/rules/text-decoration-style.d.ts +6 -0
  548. package/esm/rules/text-decoration-style.js +7 -0
  549. package/esm/rules/text-decoration-style.js.map +1 -0
  550. package/esm/rules/text-decoration-thickness.d.ts +7 -0
  551. package/esm/rules/text-decoration-thickness.js +8 -0
  552. package/esm/rules/text-decoration-thickness.js.map +1 -0
  553. package/esm/rules/text-decoration.d.ts +8 -0
  554. package/esm/rules/text-decoration.js +9 -0
  555. package/esm/rules/text-decoration.js.map +1 -0
  556. package/esm/rules/text-fill-color.d.ts +10 -0
  557. package/esm/rules/text-fill-color.js +13 -0
  558. package/esm/rules/text-fill-color.js.map +1 -0
  559. package/esm/rules/text-indent.d.ts +5 -0
  560. package/esm/rules/text-indent.js +6 -0
  561. package/esm/rules/text-indent.js.map +1 -0
  562. package/esm/rules/text-orientation.d.ts +6 -0
  563. package/esm/rules/text-orientation.js +7 -0
  564. package/esm/rules/text-orientation.js.map +1 -0
  565. package/esm/rules/text-overflow.d.ts +6 -0
  566. package/esm/rules/text-overflow.js +7 -0
  567. package/esm/rules/text-overflow.js.map +1 -0
  568. package/esm/rules/text-rendering.d.ts +6 -0
  569. package/esm/rules/text-rendering.js +7 -0
  570. package/esm/rules/text-rendering.js.map +1 -0
  571. package/esm/rules/text-shadow.d.ts +6 -0
  572. package/esm/rules/text-shadow.js +7 -0
  573. package/esm/rules/text-shadow.js.map +1 -0
  574. package/esm/rules/text-size.d.ts +8 -0
  575. package/esm/rules/text-size.js +18 -0
  576. package/esm/rules/text-size.js.map +1 -0
  577. package/esm/rules/text-stroke-color.d.ts +10 -0
  578. package/esm/rules/text-stroke-color.js +13 -0
  579. package/esm/rules/text-stroke-color.js.map +1 -0
  580. package/esm/rules/text-stroke-width.d.ts +8 -0
  581. package/esm/rules/text-stroke-width.js +11 -0
  582. package/esm/rules/text-stroke-width.js.map +1 -0
  583. package/esm/rules/text-stroke.d.ts +8 -0
  584. package/esm/rules/text-stroke.js +11 -0
  585. package/esm/rules/text-stroke.js.map +1 -0
  586. package/esm/rules/text-transform.d.ts +6 -0
  587. package/esm/rules/text-transform.js +7 -0
  588. package/esm/rules/text-transform.js.map +1 -0
  589. package/esm/rules/text-underline-offset.d.ts +5 -0
  590. package/esm/rules/text-underline-offset.js +6 -0
  591. package/esm/rules/text-underline-offset.js.map +1 -0
  592. package/esm/rules/touch-action.d.ts +5 -0
  593. package/esm/rules/touch-action.js +6 -0
  594. package/esm/rules/touch-action.js.map +1 -0
  595. package/esm/rules/transform-box.d.ts +6 -0
  596. package/esm/rules/transform-box.js +7 -0
  597. package/esm/rules/transform-box.js.map +1 -0
  598. package/esm/rules/transform-origin.d.ts +7 -0
  599. package/esm/rules/transform-origin.js +8 -0
  600. package/esm/rules/transform-origin.js.map +1 -0
  601. package/esm/rules/transform-style.d.ts +6 -0
  602. package/esm/rules/transform-style.js +7 -0
  603. package/esm/rules/transform-style.js.map +1 -0
  604. package/esm/rules/transform.d.ts +9 -0
  605. package/esm/rules/transform.js +45 -0
  606. package/esm/rules/transform.js.map +1 -0
  607. package/esm/rules/transition-delay.d.ts +7 -0
  608. package/esm/rules/transition-delay.js +8 -0
  609. package/esm/rules/transition-delay.js.map +1 -0
  610. package/esm/rules/transition-duration.d.ts +7 -0
  611. package/esm/rules/transition-duration.js +8 -0
  612. package/esm/rules/transition-duration.js.map +1 -0
  613. package/esm/rules/transition-property.d.ts +6 -0
  614. package/esm/rules/transition-property.js +7 -0
  615. package/esm/rules/transition-property.js.map +1 -0
  616. package/esm/rules/transition-timing-function.d.ts +6 -0
  617. package/esm/rules/transition-timing-function.js +7 -0
  618. package/esm/rules/transition-timing-function.js.map +1 -0
  619. package/esm/rules/transition.d.ts +7 -0
  620. package/esm/rules/transition.js +8 -0
  621. package/esm/rules/transition.js.map +1 -0
  622. package/esm/rules/user-drag.d.ts +8 -0
  623. package/esm/rules/user-drag.js +12 -0
  624. package/esm/rules/user-drag.js.map +1 -0
  625. package/esm/rules/user-select.d.ts +8 -0
  626. package/esm/rules/user-select.js +12 -0
  627. package/esm/rules/user-select.js.map +1 -0
  628. package/esm/rules/variable.d.ts +9 -0
  629. package/esm/rules/variable.js +12 -0
  630. package/esm/rules/variable.js.map +1 -0
  631. package/esm/rules/vertical-align.d.ts +6 -0
  632. package/esm/rules/vertical-align.js +7 -0
  633. package/esm/rules/vertical-align.js.map +1 -0
  634. package/esm/rules/visibility.d.ts +5 -0
  635. package/esm/rules/visibility.js +6 -0
  636. package/esm/rules/visibility.js.map +1 -0
  637. package/esm/rules/white-space.d.ts +6 -0
  638. package/esm/rules/white-space.js +7 -0
  639. package/esm/rules/white-space.js.map +1 -0
  640. package/esm/rules/width.d.ts +6 -0
  641. package/esm/rules/width.js +7 -0
  642. package/esm/rules/width.js.map +1 -0
  643. package/esm/rules/will-change.d.ts +5 -0
  644. package/esm/rules/will-change.js +6 -0
  645. package/esm/rules/will-change.js.map +1 -0
  646. package/esm/rules/word-break.d.ts +6 -0
  647. package/esm/rules/word-break.js +7 -0
  648. package/esm/rules/word-break.js.map +1 -0
  649. package/esm/rules/word-spacing.d.ts +6 -0
  650. package/esm/rules/word-spacing.js +7 -0
  651. package/esm/rules/word-spacing.js.map +1 -0
  652. package/esm/rules/writing-mode.d.ts +6 -0
  653. package/esm/rules/writing-mode.js +7 -0
  654. package/esm/rules/writing-mode.js.map +1 -0
  655. package/esm/rules/x.d.ts +6 -0
  656. package/esm/rules/x.js +7 -0
  657. package/esm/rules/x.js.map +1 -0
  658. package/esm/rules/y.d.ts +6 -0
  659. package/esm/rules/y.js +7 -0
  660. package/esm/rules/y.js.map +1 -0
  661. package/esm/rules/z-index.d.ts +7 -0
  662. package/esm/rules/z-index.js +8 -0
  663. package/esm/rules/z-index.js.map +1 -0
  664. package/esm/utils/concat-arrays.d.ts +1 -0
  665. package/esm/utils/concat-arrays.js +8 -0
  666. package/esm/utils/concat-arrays.js.map +1 -0
  667. package/esm/utils/get-border-props.d.ts +3 -0
  668. package/esm/utils/get-border-props.js +44 -0
  669. package/esm/utils/get-border-props.js.map +1 -0
  670. package/esm/utils/get-css-property-text.d.ts +5 -0
  671. package/esm/utils/get-css-property-text.js +8 -0
  672. package/esm/utils/get-css-property-text.js.map +1 -0
  673. package/esm/utils/get-type.d.ts +7 -0
  674. package/esm/utils/get-type.js +10 -0
  675. package/esm/utils/get-type.js.map +1 -0
  676. package/esm/utils/hex-to-rgb.d.ts +1 -0
  677. package/esm/utils/hex-to-rgb.js +8 -0
  678. package/esm/utils/hex-to-rgb.js.map +1 -0
  679. package/esm/utils/is-plain-object.d.ts +8 -0
  680. package/esm/utils/is-plain-object.js +13 -0
  681. package/esm/utils/is-plain-object.js.map +1 -0
  682. package/esm/utils/is-symbol.d.ts +7 -0
  683. package/esm/utils/is-symbol.js +11 -0
  684. package/esm/utils/is-symbol.js.map +1 -0
  685. package/esm/utils/normalize-css-calc-text.d.ts +5 -0
  686. package/esm/utils/normalize-css-calc-text.js +56 -0
  687. package/esm/utils/normalize-css-calc-text.js.map +1 -0
  688. package/esm/utils/parse-value-unit.d.ts +2 -0
  689. package/esm/utils/parse-value-unit.js +48 -0
  690. package/esm/utils/parse-value-unit.js.map +1 -0
  691. package/esm/utils/parse-value.d.ts +6 -0
  692. package/esm/utils/parse-value.js +84 -0
  693. package/esm/utils/parse-value.js.map +1 -0
  694. package/esm/utils/rgb-to-hex.d.ts +1 -0
  695. package/esm/utils/rgb-to-hex.js +4 -0
  696. package/esm/utils/rgb-to-hex.js.map +1 -0
  697. package/index.js +3 -1
  698. package/index.js.map +7 -0
  699. package/package.json +18 -3
  700. package/breakpoints.js +0 -1
  701. package/color.scss +0 -1
  702. package/colors.js +0 -1
  703. package/master-css.min.js +0 -1
  704. package/render.js +0 -1
package/esm/css.js ADDED
@@ -0,0 +1,963 @@
1
+ import { defaultConfig } from './config';
2
+ import { init } from './apis/init';
3
+ import { MasterCSSRule } from './rule';
4
+ const selectorSymbols = [',', '.', '#', '[', '!', '*', '>', '+', '~', ':', '@'];
5
+ const vendorPrefixSelectorRegExp = /^::-[a-z]+-/m;
6
+ const hasDocument = typeof document !== 'undefined';
7
+ let STYLE;
8
+ if (hasDocument) {
9
+ STYLE = document.createElement('style');
10
+ STYLE.title = 'master';
11
+ }
12
+ const MAX_WIDTH = 'max-width';
13
+ const MIN_WIDTH = 'min-width';
14
+ const ATTRIBUTES = 'attributes';
15
+ const isBrowser = typeof window !== 'undefined';
16
+ const MutationObserver = isBrowser
17
+ ? window.MutationObserver
18
+ : Object;
19
+ export default class MasterCSS extends MutationObserver {
20
+ config;
21
+ root;
22
+ static init = init;
23
+ static defaultConfig = defaultConfig;
24
+ static instances = [];
25
+ static root;
26
+ /**
27
+ * 全部 sheet 根據目前蒐集到的所有 DOM class 重新 findAndNew
28
+ */
29
+ static refresh(config) {
30
+ for (const eachInstance of this.instances) {
31
+ eachInstance.refresh(config);
32
+ }
33
+ }
34
+ style;
35
+ rules = [];
36
+ ruleOfClass = {};
37
+ countOfClass = {};
38
+ host;
39
+ semantics;
40
+ classes;
41
+ colorsThemesMap;
42
+ colorNames;
43
+ themeNames;
44
+ relationThemesMap;
45
+ relations;
46
+ selectors;
47
+ schemeMQL;
48
+ constructor(config = defaultConfig, root) {
49
+ super((mutationRecords) => {
50
+ // console.time('css engine');
51
+ const correctionOfClassName = {};
52
+ const attributeMutationRecords = [];
53
+ const updatedElements = [];
54
+ const unchangedElements = [];
55
+ /**
56
+ * 取得所有深層後代的 class names
57
+ */
58
+ const handleClassNameDeeply = (element, remove) => {
59
+ if (remove) {
60
+ element.classList.forEach(removeClassName);
61
+ }
62
+ else {
63
+ element.classList.forEach(addClassName);
64
+ }
65
+ const children = element.children;
66
+ for (let i = 0; i < children.length; i++) {
67
+ const eachChildren = children[i];
68
+ if (eachChildren.classList) {
69
+ updatedElements.push(eachChildren);
70
+ handleClassNameDeeply(eachChildren, remove);
71
+ }
72
+ }
73
+ };
74
+ const addClassName = (className) => {
75
+ if (className in correctionOfClassName) {
76
+ correctionOfClassName[className]++;
77
+ }
78
+ else {
79
+ correctionOfClassName[className] = 1;
80
+ }
81
+ };
82
+ const removeClassName = (className) => {
83
+ if (className in correctionOfClassName) {
84
+ correctionOfClassName[className]--;
85
+ }
86
+ else {
87
+ correctionOfClassName[className] = -1;
88
+ }
89
+ };
90
+ const handleNodes = (nodes, remove) => {
91
+ for (let i = 0; i < nodes.length; i++) {
92
+ const eachNode = nodes[i];
93
+ if (eachNode.classList && !updatedElements.includes(eachNode) && !unchangedElements.includes(eachNode)) {
94
+ if (eachNode.isConnected !== remove) {
95
+ updatedElements.push(eachNode);
96
+ handleClassNameDeeply(eachNode, remove);
97
+ }
98
+ else {
99
+ unchangedElements.push(eachNode);
100
+ }
101
+ }
102
+ }
103
+ };
104
+ for (let i = 0; i < mutationRecords.length; i++) {
105
+ const mutationRecord = mutationRecords[i];
106
+ const { addedNodes, removedNodes, type, target, oldValue } = mutationRecord;
107
+ if (type === ATTRIBUTES) {
108
+ /**
109
+ * 防止同樣的 MutationRecord 重複執行
110
+ * According to this history,
111
+ * MutationObserver was designed to work that way.
112
+ * Any call to setAttribute triggers a mutation,
113
+ * regardless of whether the value is being changed or set to the current value
114
+ */
115
+ if (target['className'] === oldValue // prevent same class to execute
116
+ || attributeMutationRecords
117
+ .find((eachAttributeMutationRecord) => eachAttributeMutationRecord.target === target)) {
118
+ continue;
119
+ }
120
+ else {
121
+ /**
122
+ * 第一個匹配到的 oldValue 一定是該批變動前的原始狀態值
123
+ */
124
+ attributeMutationRecords.push(mutationRecord);
125
+ }
126
+ }
127
+ else {
128
+ // 先判斷節點新增或移除
129
+ handleNodes(addedNodes, false);
130
+ handleNodes(removedNodes, true);
131
+ }
132
+ }
133
+ if (!attributeMutationRecords.length && !Object.keys(correctionOfClassName).length) {
134
+ // console.timeEnd('css engine');
135
+ return;
136
+ }
137
+ for (const { oldValue, target } of attributeMutationRecords) {
138
+ /**
139
+ * 如果被操作的元素中包含了屬性變更的目標,
140
+ * 則將該目標從 existedAttributeMutationTargets 中移除,
141
+ * 以防止執行接下來的屬性變更處理
142
+ *
143
+ * 該批 mutationRecords 中,某個 target 同時有 attribute 及 childList 的變更,
144
+ * 則以 childList 節點插入及移除的 target.className 為主
145
+ */
146
+ const updated = updatedElements.includes(target);
147
+ const classNames = target.classList;
148
+ const oldClassNames = oldValue ? oldValue.split(' ') : [];
149
+ if (updated) {
150
+ if (target.isConnected) {
151
+ continue;
152
+ }
153
+ else {
154
+ for (const oldClassName of oldClassNames) {
155
+ if (!classNames.contains(oldClassName)) {
156
+ removeClassName(oldClassName);
157
+ }
158
+ }
159
+ }
160
+ }
161
+ else {
162
+ if (target.isConnected) {
163
+ classNames.forEach((className) => {
164
+ if (!oldClassNames.includes(className)) {
165
+ addClassName(className);
166
+ }
167
+ });
168
+ for (const oldClassName of oldClassNames) {
169
+ if (!classNames.contains(oldClassName)) {
170
+ removeClassName(oldClassName);
171
+ }
172
+ }
173
+ }
174
+ else {
175
+ for (const oldClassName of oldClassNames) {
176
+ removeClassName(oldClassName);
177
+ }
178
+ }
179
+ }
180
+ }
181
+ for (const className in correctionOfClassName) {
182
+ const correction = correctionOfClassName[className];
183
+ const count = (this.countOfClass[className] || 0) + correction;
184
+ if (count === 0) {
185
+ // remove
186
+ delete this.countOfClass[className];
187
+ /**
188
+ * class name 從 DOM tree 中被移除,
189
+ * 匹配並刪除對應的 rule
190
+ */
191
+ this.delete(className);
192
+ }
193
+ else {
194
+ if (!(className in this.countOfClass)) {
195
+ // add
196
+ /**
197
+ * 新 class name 被 connected 至 DOM tree,
198
+ * 匹配並創建對應的 Rule
199
+ */
200
+ this.findAndInsert(className);
201
+ }
202
+ this.countOfClass[className] = count;
203
+ }
204
+ }
205
+ // console.timeEnd('css engine');
206
+ });
207
+ this.config = config;
208
+ this.root = root;
209
+ this.cache();
210
+ if (hasDocument && root) {
211
+ const isDocumentRoot = root === document;
212
+ this.host = isDocumentRoot ? document.documentElement : root.host;
213
+ // sync theme
214
+ this.scheme = this.storageScheme || config.scheme.preference;
215
+ const container = isDocumentRoot ? document.head : root;
216
+ const styleSheets = isDocumentRoot ? document.styleSheets : root.styleSheets;
217
+ // @ts-ignore
218
+ for (const sheet of styleSheets) {
219
+ if (sheet.title === 'master') {
220
+ this.style = sheet.ownerNode;
221
+ }
222
+ }
223
+ if (this.style) {
224
+ for (let index = 0; index < this.style.sheet.cssRules.length; index++) {
225
+ const getRule = (cssRule) => {
226
+ if (cssRule.selectorText) {
227
+ const selectorTexts = cssRule.selectorText.split(', ');
228
+ const escapedClassNames = selectorTexts[0].split(' ');
229
+ for (let i = 0; i < escapedClassNames.length; i++) {
230
+ const eachSelectorText = escapedClassNames[i];
231
+ if (eachSelectorText[0] === '.') {
232
+ const escapedClassName = eachSelectorText.slice(1);
233
+ let className = '';
234
+ for (let j = 0; j < escapedClassName.length; j++) {
235
+ const char = escapedClassName[j];
236
+ const nextChar = escapedClassName[j + 1];
237
+ if (char === '\\') {
238
+ j++;
239
+ if (nextChar !== '\\') {
240
+ className += nextChar;
241
+ continue;
242
+ }
243
+ }
244
+ else if (selectorSymbols.includes(char)) {
245
+ break;
246
+ }
247
+ className += char;
248
+ }
249
+ if (!(className in this.ruleOfClass) && !(className in this.classes)) {
250
+ const currentRule = this.findAndNew(className);
251
+ if (currentRule)
252
+ return currentRule;
253
+ }
254
+ }
255
+ }
256
+ }
257
+ else if (cssRule.cssRules) {
258
+ for (let index = 0; index < cssRule.cssRules.length; index++) {
259
+ const currentRule = getRule(cssRule.cssRules[index]);
260
+ if (currentRule)
261
+ return currentRule;
262
+ }
263
+ }
264
+ };
265
+ const rule = getRule(this.style.sheet.cssRules[index]);
266
+ if (rule) {
267
+ this.rules.push(rule);
268
+ this.ruleOfClass[rule.className] = rule;
269
+ for (let i = 0; i < rule.natives.length; i++) {
270
+ rule.natives[i].cssRule = this.style.sheet.cssRules[index + i];
271
+ }
272
+ index += rule.natives.length - 1;
273
+ }
274
+ }
275
+ }
276
+ else {
277
+ this.style = STYLE.cloneNode();
278
+ /** 使用 prepend 而非 append 去降低 rules 類的優先層級,無法強制排在所有 <style> 之後 */
279
+ container.prepend(this.style);
280
+ }
281
+ }
282
+ MasterCSS.instances.push(this);
283
+ }
284
+ get storageScheme() {
285
+ const { storage } = this.config.scheme;
286
+ return localStorage.getItem(storage.key);
287
+ }
288
+ #scheme;
289
+ theme;
290
+ set scheme(scheme) {
291
+ if (scheme !== this.#scheme) {
292
+ this.#scheme = scheme;
293
+ let theme = '';
294
+ const { storage } = this.config.scheme;
295
+ if (scheme === 'system') {
296
+ // 按照系統的主題切換,目前只支援 light dark
297
+ this.schemeMQL = window.matchMedia('(prefers-color-scheme:dark)');
298
+ this.schemeMQL.addEventListener('change', this.onSchemeChange);
299
+ localStorage.removeItem(storage.key);
300
+ theme = this.schemeMQL.matches ? 'dark' : 'light';
301
+ }
302
+ else {
303
+ this.removeSchemeListener();
304
+ theme = scheme;
305
+ if (this.storageScheme !== theme && storage.sync) {
306
+ localStorage.setItem(storage.key, theme);
307
+ }
308
+ }
309
+ if (this.theme) {
310
+ this.host.classList.remove(this.theme);
311
+ }
312
+ if (this.host === document.documentElement) {
313
+ this.host.style.colorScheme = theme;
314
+ }
315
+ this.host.classList.add(theme);
316
+ this.theme = theme;
317
+ }
318
+ }
319
+ removeSchemeListener() {
320
+ if (this.schemeMQL) {
321
+ this.schemeMQL.removeEventListener('change', this.onSchemeChange);
322
+ this.schemeMQL = null;
323
+ }
324
+ }
325
+ onSchemeChange(mediaQueryList) {
326
+ this.scheme = mediaQueryList.matches ? 'dark' : 'light';
327
+ }
328
+ cache() {
329
+ this.semantics = [];
330
+ this.classes = {};
331
+ this.colorsThemesMap = {};
332
+ this.relationThemesMap = {};
333
+ this.relations = {};
334
+ this.colorNames = [];
335
+ this.themeNames = [''];
336
+ this.selectors = {};
337
+ const { semantics, classes, selectors, themes, colors } = this.config;
338
+ function escapeString(str) {
339
+ return str.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
340
+ }
341
+ if (semantics) {
342
+ for (const semanticName in semantics) {
343
+ this.semantics.push([new RegExp('^' + escapeString(semanticName) + '(?=!|\\*|>|\\+|~|:|\\[|@|_|\\.|$)', 'm'), semanticName]);
344
+ }
345
+ }
346
+ if (selectors) {
347
+ for (const [replacedSelectorText, newSelectorText] of Object.entries(selectors)) {
348
+ const regexp = new RegExp(escapeString(replacedSelectorText) + '(?![a-z-])');
349
+ for (const eachNewSelectorText of Array.isArray(newSelectorText) ? newSelectorText : [newSelectorText]) {
350
+ const vendor = eachNewSelectorText.match(vendorPrefixSelectorRegExp)?.[0] ?? '';
351
+ let selectorValues = this.selectors[vendor];
352
+ if (!selectorValues) {
353
+ selectorValues = this.selectors[vendor] = [];
354
+ }
355
+ let currentSelectValue = selectorValues.find(([_valueRegexp]) => _valueRegexp === regexp);
356
+ if (!currentSelectValue) {
357
+ currentSelectValue = [regexp, []];
358
+ selectorValues.push(currentSelectValue);
359
+ }
360
+ currentSelectValue[1].push(eachNewSelectorText);
361
+ }
362
+ }
363
+ }
364
+ const semanticNames = [
365
+ ...(classes ? Object.keys(classes) : []),
366
+ ...((themes && !Array.isArray(themes))
367
+ ? Object.entries(themes).flatMap(([_, { classes }]) => classes ? Object.keys(classes) : [])
368
+ : [])
369
+ ];
370
+ const handleSemanticName = (semanticName) => {
371
+ if (semanticName in this.classes)
372
+ return;
373
+ const currentClass = this.classes[semanticName] = [];
374
+ const handleClassNames = (theme, className) => {
375
+ if (!className)
376
+ return;
377
+ const classNames = Array.isArray(className)
378
+ ? className
379
+ : className
380
+ .replace(/(?:\n(?:\s*))+/g, ' ')
381
+ .trim()
382
+ .split(' ');
383
+ for (const eachClassName of classNames) {
384
+ const handle = (className) => {
385
+ if (className in this.relationThemesMap) {
386
+ if (theme in this.relationThemesMap[className]) {
387
+ this.relationThemesMap[className][theme].push(semanticName);
388
+ }
389
+ else {
390
+ this.relationThemesMap[className][theme] = [semanticName];
391
+ }
392
+ }
393
+ else {
394
+ this.relationThemesMap[className] = { [theme]: [semanticName] };
395
+ }
396
+ if (!currentClass.includes(className)) {
397
+ currentClass.push(className);
398
+ }
399
+ };
400
+ if (semanticNames.includes(eachClassName)) {
401
+ handleSemanticName(eachClassName);
402
+ for (const parentClassName of this.classes[eachClassName]) {
403
+ handle(parentClassName);
404
+ }
405
+ }
406
+ else {
407
+ handle(eachClassName);
408
+ }
409
+ }
410
+ };
411
+ handleClassNames('', classes?.[semanticName]);
412
+ if (themes && !Array.isArray(themes)) {
413
+ for (const [eachTheme, { classes }] of Object.entries(themes)) {
414
+ handleClassNames(eachTheme, classes?.[semanticName]);
415
+ }
416
+ }
417
+ };
418
+ for (const eachSemanticName of semanticNames) {
419
+ handleSemanticName(eachSemanticName);
420
+ }
421
+ for (const className in this.relationThemesMap) {
422
+ const currentRelation = this.relations[className] = [];
423
+ for (const semanticNames of Object.values(this.relationThemesMap[className])) {
424
+ for (const eachSemanticName of semanticNames) {
425
+ if (!currentRelation.includes(eachSemanticName)) {
426
+ currentRelation.push(eachSemanticName);
427
+ }
428
+ }
429
+ }
430
+ }
431
+ const mergeColors = (theme, colors) => {
432
+ if (!colors)
433
+ return;
434
+ for (const colorName in colors) {
435
+ let levels = colors[colorName];
436
+ if (typeof levels === 'string') {
437
+ levels = { '': levels };
438
+ }
439
+ if (colorName in this.colorsThemesMap) {
440
+ const levelsThemes = this.colorsThemesMap[colorName];
441
+ for (const level in levels) {
442
+ const color = levels[level];
443
+ if (level in levelsThemes) {
444
+ levelsThemes[level][theme] = color;
445
+ }
446
+ else {
447
+ levelsThemes[level] = { [theme]: color };
448
+ }
449
+ }
450
+ }
451
+ else {
452
+ this.colorNames.push(colorName);
453
+ this.colorsThemesMap[colorName] = Object
454
+ .entries(levels)
455
+ .reduce((obj, [level, color]) => {
456
+ obj[level] = { [theme]: color };
457
+ return obj;
458
+ }, {});
459
+ }
460
+ }
461
+ };
462
+ mergeColors('', colors);
463
+ if (themes) {
464
+ if (Array.isArray(themes)) {
465
+ this.themeNames.push(...themes);
466
+ }
467
+ else {
468
+ for (const eachTheme in themes) {
469
+ const themeValue = themes[eachTheme];
470
+ mergeColors(eachTheme, themeValue.colors);
471
+ this.themeNames.push(eachTheme);
472
+ }
473
+ }
474
+ }
475
+ }
476
+ observe(options = { subtree: true, childList: true }) {
477
+ if (options.subtree) {
478
+ /**
479
+ * 待所有 DOM 結構完成解析後,開始繪製 MasterCSSRule 樣式
480
+ */
481
+ this.host
482
+ .querySelectorAll('[class]')
483
+ .forEach((element) => {
484
+ element.classList.forEach((className) => {
485
+ if (className in this.countOfClass) {
486
+ this.countOfClass[className]++;
487
+ }
488
+ else {
489
+ this.countOfClass[className] = 1;
490
+ this.findAndInsert(className);
491
+ }
492
+ });
493
+ });
494
+ }
495
+ super.observe(this.root, {
496
+ ...options,
497
+ attributes: true,
498
+ attributeOldValue: true,
499
+ attributeFilter: ['class'],
500
+ });
501
+ return this;
502
+ }
503
+ disconnect() {
504
+ super.disconnect();
505
+ // @ts-ignore
506
+ this.ruleOfClass = {};
507
+ // @ts-ignore
508
+ this.countOfClass = {};
509
+ this.rules.length = 0;
510
+ const sheet = this.style.sheet;
511
+ if (sheet) {
512
+ for (let i = sheet.cssRules.length - 1; i >= 0; i--) {
513
+ sheet.deleteRule(i);
514
+ }
515
+ }
516
+ }
517
+ /**
518
+ * 尋找匹配的 MasterCSSRule 生成實例
519
+ */
520
+ findAndNew(name) {
521
+ const findAndNewRule = (className) => {
522
+ if (className in this.ruleOfClass)
523
+ return this.ruleOfClass[className];
524
+ for (const EachRule of this.config.Rules) {
525
+ const matching = EachRule.match(className, this.colorNames);
526
+ if (matching)
527
+ return new EachRule(className, matching, this);
528
+ }
529
+ for (const eachSemanticEntry of this.semantics) {
530
+ if (className.match(eachSemanticEntry[0]))
531
+ return new MasterCSSRule(className, { origin: 'semantics', value: eachSemanticEntry[1] }, this);
532
+ }
533
+ };
534
+ return name in this.classes
535
+ ? this.classes[name]
536
+ .map(findAndNewRule)
537
+ .filter(eachRule => eachRule)
538
+ : findAndNewRule(name);
539
+ }
540
+ /**
541
+ * 根據目前蒐集到的所有 DOM class 重新 findAndNew
542
+ */
543
+ refresh(config) {
544
+ this.config = config;
545
+ this.cache();
546
+ if (!this.style) {
547
+ return;
548
+ }
549
+ const element = STYLE.cloneNode();
550
+ this.style.replaceWith(element);
551
+ // @ts-ignore
552
+ this.style = style;
553
+ this.rules.length = 0;
554
+ // @ts-ignore
555
+ this.ruleOfClass = {};
556
+ /**
557
+ * 拿當前所有的 classNames 按照最新的 colors, breakpoints, config.Rules 匹配並生成新的 style
558
+ * 所以 refresh 過後 rules 可能會變多也可能會變少
559
+ */
560
+ for (const name in this.countOfClass) {
561
+ this.findAndInsert(name);
562
+ }
563
+ }
564
+ destroy() {
565
+ const instances = MasterCSS.instances;
566
+ this.disconnect();
567
+ instances.splice(instances.indexOf(this), 1);
568
+ this.style.remove();
569
+ this.removeSchemeListener();
570
+ }
571
+ /**
572
+ * 1. where
573
+ * 2. normal
574
+ * 3. where selectors
575
+ * 4. normal selectors
576
+ * 5. media where
577
+ * 6. media normal
578
+ * 7. media selectors
579
+ * 8. media width where
580
+ * 9. media width
581
+ * 10. media width selectors
582
+ */
583
+ insert(rule) {
584
+ if (this.ruleOfClass[rule.className])
585
+ return;
586
+ const { validateRule } = this.config;
587
+ if (validateRule && !validateRule(rule, this)) {
588
+ return;
589
+ }
590
+ let index;
591
+ /**
592
+ * 必須按斷點值遞增,並透過索引插入,
593
+ * 以實現響應式先後套用的規則
594
+ * @example <1 <2 <3 ALL >=1 >=2 >=3
595
+ * @description
596
+ */
597
+ const endIndex = this.rules.length - 1;
598
+ const { media, order, prioritySelectorIndex, hasWhere, className } = rule;
599
+ const findPrioritySelectorInsertIndex = (rules, findStartIndex, findEndIndex, ignoreRule) => {
600
+ let sIndex = 0;
601
+ let eIndex;
602
+ // 1. 找尋目標陣列
603
+ if (findStartIndex) {
604
+ sIndex = rules.findIndex(findStartIndex);
605
+ }
606
+ if (findEndIndex) {
607
+ eIndex = rules.findIndex(findEndIndex);
608
+ }
609
+ if (sIndex === -1) {
610
+ sIndex = rules.length;
611
+ }
612
+ if (eIndex === undefined || eIndex === -1) {
613
+ eIndex = rules.length;
614
+ }
615
+ const targetRules = rules.slice(sIndex, eIndex);
616
+ // 2. 由目標陣列找尋插入點
617
+ for (let i = 0; i < targetRules.length; i++) {
618
+ const currentRule = targetRules[i];
619
+ if (currentRule.prioritySelectorIndex === -1 || ignoreRule && ignoreRule(currentRule))
620
+ continue;
621
+ if (currentRule.prioritySelectorIndex < prioritySelectorIndex
622
+ || currentRule.prioritySelectorIndex === prioritySelectorIndex
623
+ && (hasWhere && !currentRule.hasWhere
624
+ || currentRule.order >= order))
625
+ return sIndex + i;
626
+ }
627
+ return sIndex + targetRules.length;
628
+ };
629
+ if (media) {
630
+ const mediaStartIndex = this.rules.findIndex(eachRule => eachRule.media);
631
+ if (mediaStartIndex !== -1) {
632
+ const maxWidthFeature = media.features[MAX_WIDTH];
633
+ const minWidthFeature = media.features[MIN_WIDTH];
634
+ if (maxWidthFeature && minWidthFeature) {
635
+ /**
636
+ * 範圍越小 ( 越限定 越侷限 ) 越優先,
637
+ * 按照範圍 max-width - min-width 遞減排序
638
+ * find 第一個所遇到同樣 feature 且範圍值比自己大的 rule,
639
+ * 並插入在該 rule 之後,讓自己優先被套用
640
+ */
641
+ const range = maxWidthFeature.value - minWidthFeature.value;
642
+ for (let i = endIndex; i >= mediaStartIndex; i--) {
643
+ index = i;
644
+ const eachRule = this.rules[i];
645
+ const eachMedia = eachRule.media;
646
+ const eachMaxWidthFeature = eachMedia.features[MAX_WIDTH];
647
+ const eachMinWidthFeature = eachMedia.features[MIN_WIDTH];
648
+ if (!eachMaxWidthFeature || !eachMinWidthFeature) {
649
+ index++;
650
+ break;
651
+ }
652
+ const eachRange = eachMaxWidthFeature.value - eachMinWidthFeature.value;
653
+ if (eachRange === range) {
654
+ if (hasWhere !== eachRule.hasWhere)
655
+ continue;
656
+ if (prioritySelectorIndex !== -1) {
657
+ const sameRangeRules = [this.rules[i]];
658
+ for (let j = i - 1; j >= mediaStartIndex; j--) {
659
+ const currentMediaRule = this.rules[j];
660
+ if (currentMediaRule.hasWhere !== hasWhere)
661
+ break;
662
+ const currentMedia = currentMediaRule.media;
663
+ const currentMaxWidthFeature = currentMedia.features[MAX_WIDTH];
664
+ const currentMinWidthFeature = currentMedia.features[MIN_WIDTH];
665
+ if (!currentMaxWidthFeature
666
+ || !currentMinWidthFeature
667
+ || (currentMaxWidthFeature.value - currentMinWidthFeature.value !== eachRange))
668
+ break;
669
+ sameRangeRules.unshift(this.rules[j]);
670
+ }
671
+ index = findPrioritySelectorInsertIndex(this.rules, eachRule => eachRule.media && eachRule.prioritySelectorIndex !== -1 && eachRule.media.features[MIN_WIDTH] && eachRule.media.features[MAX_WIDTH]);
672
+ }
673
+ break;
674
+ }
675
+ else if (eachRange > range) {
676
+ break;
677
+ }
678
+ }
679
+ }
680
+ else if (minWidthFeature) {
681
+ /**
682
+ * find 第一個所遇到同樣 feature 且值比自己大的 rule,
683
+ * 並插入在該 rule 之後,讓自己優先被套用
684
+ */
685
+ for (let i = mediaStartIndex; i <= endIndex; i++) {
686
+ index = i;
687
+ const eachRule = this.rules[i];
688
+ const eachMedia = eachRule.media;
689
+ const eachMaxWidthFeature = eachMedia.features[MAX_WIDTH];
690
+ const eachMinWidthFeature = eachMedia.features[MIN_WIDTH];
691
+ if (eachMaxWidthFeature) {
692
+ /**
693
+ * 永遠插入在 range feature 前
694
+ */
695
+ if (eachMinWidthFeature) {
696
+ break;
697
+ }
698
+ else {
699
+ continue;
700
+ }
701
+ }
702
+ const value = eachMinWidthFeature?.value;
703
+ if (value === minWidthFeature.value) {
704
+ if (!hasWhere && eachRule.hasWhere) {
705
+ index++;
706
+ continue;
707
+ }
708
+ if (prioritySelectorIndex !== -1) {
709
+ index = findPrioritySelectorInsertIndex(this.rules, eachRule => eachRule.media, eachRule => eachRule.media && eachRule.prioritySelectorIndex !== -1 && eachRule.media.features[MIN_WIDTH] && eachRule.media.features[MAX_WIDTH], eachRule => !eachRule.media.features[MIN_WIDTH] && !eachRule.media.features[MAX_WIDTH]);
710
+ }
711
+ else {
712
+ for (let j = i; j <= endIndex; j++) {
713
+ const currentMediaRule = this.rules[j];
714
+ const currentMedia = currentMediaRule.media;
715
+ const currentMinWidthFeature = currentMedia.features[MIN_WIDTH];
716
+ const currentMaxWidthFeature = currentMedia.features[MAX_WIDTH];
717
+ if (currentMaxWidthFeature)
718
+ continue;
719
+ if (currentMediaRule.hasWhere !== hasWhere
720
+ || currentMinWidthFeature.value !== value
721
+ || currentMediaRule.order >= order)
722
+ break;
723
+ index = j + 1;
724
+ }
725
+ }
726
+ break;
727
+ }
728
+ else if (value > minWidthFeature.value) {
729
+ break;
730
+ }
731
+ else {
732
+ index++;
733
+ }
734
+ }
735
+ }
736
+ else if (maxWidthFeature) {
737
+ /**
738
+ * find 第一個所遇到同樣 feature 且值比自己大的 rule,
739
+ * 並插入在該 rule 之後,讓自己優先被套用
740
+ */
741
+ for (let i = endIndex; i >= mediaStartIndex; i--) {
742
+ index = i;
743
+ const eachRule = this.rules[i];
744
+ const eachMedia = eachRule.media;
745
+ const eachMaxWidthFeature = eachMedia.features[MAX_WIDTH];
746
+ const eachMinWidthFeature = eachMedia.features[MIN_WIDTH];
747
+ if (eachMinWidthFeature) {
748
+ /**
749
+ * 永遠插入在 range feature 前
750
+ */
751
+ continue;
752
+ }
753
+ const value = eachMaxWidthFeature?.value;
754
+ if (!value || value > maxWidthFeature.value) {
755
+ index++;
756
+ break;
757
+ }
758
+ else if (value === maxWidthFeature.value) {
759
+ if (hasWhere && !eachRule.hasWhere)
760
+ continue;
761
+ if (prioritySelectorIndex !== -1) {
762
+ index = findPrioritySelectorInsertIndex(this.rules, eachRule => eachRule.media, eachRule => eachRule.media && eachRule.prioritySelectorIndex !== -1 && eachRule.media.features[MIN_WIDTH] && eachRule.media.features[MAX_WIDTH], eachRule => !eachRule.media.features[MIN_WIDTH] && !eachRule.media.features[MAX_WIDTH]);
763
+ }
764
+ else {
765
+ const sameRangeRules = [this.rules[i]];
766
+ for (let j = i - 1; j >= mediaStartIndex; j--) {
767
+ const currentMediaRule = this.rules[j];
768
+ const currentMedia = currentMediaRule.media;
769
+ const currentMinWidthFeature = currentMedia.features[MIN_WIDTH];
770
+ const currentMaxWidthFeature = currentMedia.features[MAX_WIDTH];
771
+ if (!currentMinWidthFeature
772
+ && (!currentMaxWidthFeature
773
+ || currentMaxWidthFeature.value !== value
774
+ || currentMediaRule.hasWhere !== hasWhere))
775
+ break;
776
+ sameRangeRules.unshift(currentMediaRule);
777
+ }
778
+ for (let j = 0; j < sameRangeRules.length; j++) {
779
+ const currentMediaRule = sameRangeRules[j];
780
+ if (currentMediaRule.media.features[MIN_WIDTH])
781
+ continue;
782
+ if (currentMediaRule.order >= order)
783
+ break;
784
+ index = i - sameRangeRules.length + 2 + j;
785
+ }
786
+ }
787
+ break;
788
+ }
789
+ }
790
+ }
791
+ }
792
+ /**
793
+ * 如果找不到目標位置則插在最後面
794
+ */
795
+ if (index === undefined) {
796
+ if (mediaStartIndex === -1) {
797
+ // 無任何 media 時,優先級最高
798
+ index = endIndex + 1;
799
+ }
800
+ else if (prioritySelectorIndex !== -1) {
801
+ // 含有優先 selector
802
+ index = mediaStartIndex +
803
+ findPrioritySelectorInsertIndex(this.rules.slice(mediaStartIndex), undefined, eachRule => eachRule.media.features[MAX_WIDTH] || eachRule.media.features[MIN_WIDTH]);
804
+ }
805
+ else if (hasWhere) {
806
+ // 不含優先 selector,且含有 where,優先級最低
807
+ let i = mediaStartIndex;
808
+ for (; i < this.rules.length; i++) {
809
+ const eachRule = this.rules[i];
810
+ if (eachRule.prioritySelectorIndex !== -1 || !eachRule.hasWhere || eachRule.order >= order) {
811
+ index = i;
812
+ break;
813
+ }
814
+ }
815
+ if (index === undefined) {
816
+ index = i;
817
+ }
818
+ }
819
+ else {
820
+ // 不含優先 selector,且不含有 where,優先級緊接非 min-width / max-width 的 where 之後
821
+ for (let i = mediaStartIndex; i <= endIndex; i++) {
822
+ index = i;
823
+ const eachRule = this.rules[i];
824
+ const eachMedia = eachRule.media;
825
+ if (eachRule.prioritySelectorIndex !== -1 || eachMedia.features[MAX_WIDTH] || eachMedia.features[MIN_WIDTH])
826
+ break;
827
+ if (eachRule.hasWhere) {
828
+ index++;
829
+ }
830
+ else if (eachRule.order >= order) {
831
+ break;
832
+ }
833
+ }
834
+ }
835
+ }
836
+ }
837
+ else {
838
+ if (prioritySelectorIndex === -1) {
839
+ // 不含優先 selector
840
+ if (hasWhere) {
841
+ // 含有 where,優先級最低
842
+ index = this.rules.findIndex(eachRule => !eachRule.hasWhere
843
+ || eachRule.media
844
+ || eachRule.prioritySelectorIndex !== -1
845
+ || eachRule.order >= order);
846
+ if (index === -1) {
847
+ index = endIndex + 1;
848
+ }
849
+ }
850
+ else {
851
+ // 不含 where,優先級緊接 where 之後
852
+ let i = 0;
853
+ for (; i < this.rules.length; i++) {
854
+ const eachRule = this.rules[i];
855
+ if (eachRule.media || !eachRule.hasWhere && (eachRule.order >= order || eachRule.prioritySelectorIndex !== -1)) {
856
+ index = i;
857
+ break;
858
+ }
859
+ }
860
+ if (index === undefined) {
861
+ index = i;
862
+ }
863
+ }
864
+ }
865
+ else {
866
+ // 含有優先 selector
867
+ index = findPrioritySelectorInsertIndex(this.rules, undefined, eachRule => eachRule.media);
868
+ }
869
+ }
870
+ this.rules.splice(index, 0, rule);
871
+ this.ruleOfClass[className] = rule;
872
+ // 只在瀏覽器端運行
873
+ if (this.style) {
874
+ const sheet = this.style.sheet;
875
+ let cssRuleIndex = 0;
876
+ const getCssRuleIndex = (index) => {
877
+ const previousRule = this.rules[index];
878
+ if (previousRule) {
879
+ if (!previousRule.natives.length)
880
+ return getCssRuleIndex(index - 1);
881
+ const lastNativeCssRule = previousRule.natives[previousRule.natives.length - 1].cssRule;
882
+ for (let i = 0; i < sheet.cssRules.length; i++) {
883
+ if (sheet.cssRules[i] === lastNativeCssRule) {
884
+ cssRuleIndex = i + 1;
885
+ break;
886
+ }
887
+ }
888
+ }
889
+ };
890
+ getCssRuleIndex(index - 1);
891
+ for (let i = 0; i < rule.natives.length;) {
892
+ try {
893
+ const native = rule.natives[i];
894
+ sheet.insertRule(native.text, cssRuleIndex);
895
+ native.cssRule = sheet.cssRules[cssRuleIndex++];
896
+ i++;
897
+ }
898
+ catch (error) {
899
+ console.error(error);
900
+ rule.natives.splice(i, 1);
901
+ }
902
+ }
903
+ }
904
+ }
905
+ delete(className) {
906
+ /**
907
+ * class name 從 DOM tree 中被移除,
908
+ * 匹配並刪除對應的 rule
909
+ */
910
+ const sheet = this.style.sheet;
911
+ const deleteRule = (name) => {
912
+ const rule = this.ruleOfClass[name];
913
+ if (!rule
914
+ || name in this.relations && this.relations[name].some(eachClassName => eachClassName in this.countOfClass))
915
+ return;
916
+ if (rule.natives.length) {
917
+ const firstNative = rule.natives[0];
918
+ for (let index = 0; index < sheet.cssRules.length; index++) {
919
+ const eachCssRule = sheet.cssRules[index];
920
+ if (eachCssRule === firstNative.cssRule) {
921
+ for (let i = 0; i < rule.natives.length; i++) {
922
+ sheet.deleteRule(index);
923
+ }
924
+ this.rules.splice(this.rules.indexOf(rule), 1);
925
+ break;
926
+ }
927
+ }
928
+ }
929
+ delete this.ruleOfClass[name];
930
+ };
931
+ if (className in this.classes) {
932
+ for (const eachClassName of this.classes[className]) {
933
+ if (!(eachClassName in this.countOfClass)) {
934
+ deleteRule(eachClassName);
935
+ }
936
+ }
937
+ delete this.ruleOfClass[className];
938
+ }
939
+ else {
940
+ deleteRule(className);
941
+ }
942
+ }
943
+ findAndInsert(className) {
944
+ const rule = this.findAndNew(className);
945
+ if (Array.isArray(rule)) {
946
+ for (const eachRule of rule) {
947
+ this.insert(eachRule);
948
+ }
949
+ }
950
+ else if (rule) {
951
+ this.insert(rule);
952
+ }
953
+ }
954
+ get text() {
955
+ return this.rules.map((eachRule) => eachRule.natives
956
+ .map((eachNativeRule) => eachNativeRule.text)
957
+ .join('')).join('');
958
+ }
959
+ }
960
+ if (isBrowser) {
961
+ window.MasterCSS = MasterCSS;
962
+ }
963
+ //# sourceMappingURL=css.js.map