@master/css 2.0.0-alpha.73 → 2.0.0-alpha.74

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 (698) 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 +75 -0
  59. package/esm/css.js +965 -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.map +7 -0
  698. package/package.json +1 -4
package/esm/css.js ADDED
@@ -0,0 +1,965 @@
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
+ theme = this.schemeMQL.matches ? 'dark' : 'light';
300
+ }
301
+ else {
302
+ this.removeSchemeListener();
303
+ theme = scheme;
304
+ }
305
+ if (this.storageScheme !== scheme && storage.sync) {
306
+ localStorage.setItem(storage.key, scheme);
307
+ }
308
+ if (this.theme) {
309
+ this.host.classList.remove(this.theme);
310
+ }
311
+ if (this.host === document.documentElement) {
312
+ this.host.style.colorScheme = theme;
313
+ }
314
+ this.host.classList.add(theme);
315
+ this.theme = theme;
316
+ }
317
+ }
318
+ get scheme() {
319
+ return this.#scheme;
320
+ }
321
+ removeSchemeListener() {
322
+ if (this.schemeMQL) {
323
+ this.schemeMQL.removeEventListener('change', this.onSchemeChange);
324
+ this.schemeMQL = null;
325
+ }
326
+ }
327
+ onSchemeChange(mediaQueryList) {
328
+ this.scheme = mediaQueryList.matches ? 'dark' : 'light';
329
+ }
330
+ cache() {
331
+ this.semantics = [];
332
+ this.classes = {};
333
+ this.colorsThemesMap = {};
334
+ this.relationThemesMap = {};
335
+ this.relations = {};
336
+ this.colorNames = [];
337
+ this.themeNames = [''];
338
+ this.selectors = {};
339
+ const { semantics, classes, selectors, themes, colors } = this.config;
340
+ function escapeString(str) {
341
+ return str.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
342
+ }
343
+ if (semantics) {
344
+ for (const semanticName in semantics) {
345
+ this.semantics.push([new RegExp('^' + escapeString(semanticName) + '(?=!|\\*|>|\\+|~|:|\\[|@|_|\\.|$)', 'm'), semanticName]);
346
+ }
347
+ }
348
+ if (selectors) {
349
+ for (const [replacedSelectorText, newSelectorText] of Object.entries(selectors)) {
350
+ const regexp = new RegExp(escapeString(replacedSelectorText) + '(?![a-z-])');
351
+ for (const eachNewSelectorText of Array.isArray(newSelectorText) ? newSelectorText : [newSelectorText]) {
352
+ const vendor = eachNewSelectorText.match(vendorPrefixSelectorRegExp)?.[0] ?? '';
353
+ let selectorValues = this.selectors[vendor];
354
+ if (!selectorValues) {
355
+ selectorValues = this.selectors[vendor] = [];
356
+ }
357
+ let currentSelectValue = selectorValues.find(([_valueRegexp]) => _valueRegexp === regexp);
358
+ if (!currentSelectValue) {
359
+ currentSelectValue = [regexp, []];
360
+ selectorValues.push(currentSelectValue);
361
+ }
362
+ currentSelectValue[1].push(eachNewSelectorText);
363
+ }
364
+ }
365
+ }
366
+ const semanticNames = [
367
+ ...(classes ? Object.keys(classes) : []),
368
+ ...((themes && !Array.isArray(themes))
369
+ ? Object.entries(themes).flatMap(([_, { classes }]) => classes ? Object.keys(classes) : [])
370
+ : [])
371
+ ];
372
+ const handleSemanticName = (semanticName) => {
373
+ if (semanticName in this.classes)
374
+ return;
375
+ const currentClass = this.classes[semanticName] = [];
376
+ const handleClassNames = (theme, className) => {
377
+ if (!className)
378
+ return;
379
+ const classNames = Array.isArray(className)
380
+ ? className
381
+ : className
382
+ .replace(/(?:\n(?:\s*))+/g, ' ')
383
+ .trim()
384
+ .split(' ');
385
+ for (const eachClassName of classNames) {
386
+ const handle = (className) => {
387
+ if (className in this.relationThemesMap) {
388
+ if (theme in this.relationThemesMap[className]) {
389
+ this.relationThemesMap[className][theme].push(semanticName);
390
+ }
391
+ else {
392
+ this.relationThemesMap[className][theme] = [semanticName];
393
+ }
394
+ }
395
+ else {
396
+ this.relationThemesMap[className] = { [theme]: [semanticName] };
397
+ }
398
+ if (!currentClass.includes(className)) {
399
+ currentClass.push(className);
400
+ }
401
+ };
402
+ if (semanticNames.includes(eachClassName)) {
403
+ handleSemanticName(eachClassName);
404
+ for (const parentClassName of this.classes[eachClassName]) {
405
+ handle(parentClassName);
406
+ }
407
+ }
408
+ else {
409
+ handle(eachClassName);
410
+ }
411
+ }
412
+ };
413
+ handleClassNames('', classes?.[semanticName]);
414
+ if (themes && !Array.isArray(themes)) {
415
+ for (const [eachTheme, { classes }] of Object.entries(themes)) {
416
+ handleClassNames(eachTheme, classes?.[semanticName]);
417
+ }
418
+ }
419
+ };
420
+ for (const eachSemanticName of semanticNames) {
421
+ handleSemanticName(eachSemanticName);
422
+ }
423
+ for (const className in this.relationThemesMap) {
424
+ const currentRelation = this.relations[className] = [];
425
+ for (const semanticNames of Object.values(this.relationThemesMap[className])) {
426
+ for (const eachSemanticName of semanticNames) {
427
+ if (!currentRelation.includes(eachSemanticName)) {
428
+ currentRelation.push(eachSemanticName);
429
+ }
430
+ }
431
+ }
432
+ }
433
+ const mergeColors = (theme, colors) => {
434
+ if (!colors)
435
+ return;
436
+ for (const colorName in colors) {
437
+ let levels = colors[colorName];
438
+ if (typeof levels === 'string') {
439
+ levels = { '': levels };
440
+ }
441
+ if (colorName in this.colorsThemesMap) {
442
+ const levelsThemes = this.colorsThemesMap[colorName];
443
+ for (const level in levels) {
444
+ const color = levels[level];
445
+ if (level in levelsThemes) {
446
+ levelsThemes[level][theme] = color;
447
+ }
448
+ else {
449
+ levelsThemes[level] = { [theme]: color };
450
+ }
451
+ }
452
+ }
453
+ else {
454
+ this.colorNames.push(colorName);
455
+ this.colorsThemesMap[colorName] = Object
456
+ .entries(levels)
457
+ .reduce((obj, [level, color]) => {
458
+ obj[level] = { [theme]: color };
459
+ return obj;
460
+ }, {});
461
+ }
462
+ }
463
+ };
464
+ mergeColors('', colors);
465
+ if (themes) {
466
+ if (Array.isArray(themes)) {
467
+ this.themeNames.push(...themes);
468
+ }
469
+ else {
470
+ for (const eachTheme in themes) {
471
+ const themeValue = themes[eachTheme];
472
+ mergeColors(eachTheme, themeValue.colors);
473
+ this.themeNames.push(eachTheme);
474
+ }
475
+ }
476
+ }
477
+ }
478
+ observe(options = { subtree: true, childList: true }) {
479
+ if (options.subtree) {
480
+ /**
481
+ * 待所有 DOM 結構完成解析後,開始繪製 MasterCSSRule 樣式
482
+ */
483
+ this.host
484
+ .querySelectorAll('[class]')
485
+ .forEach((element) => {
486
+ element.classList.forEach((className) => {
487
+ if (className in this.countOfClass) {
488
+ this.countOfClass[className]++;
489
+ }
490
+ else {
491
+ this.countOfClass[className] = 1;
492
+ this.findAndInsert(className);
493
+ }
494
+ });
495
+ });
496
+ }
497
+ super.observe(this.root, {
498
+ ...options,
499
+ attributes: true,
500
+ attributeOldValue: true,
501
+ attributeFilter: ['class'],
502
+ });
503
+ return this;
504
+ }
505
+ disconnect() {
506
+ super.disconnect();
507
+ // @ts-ignore
508
+ this.ruleOfClass = {};
509
+ // @ts-ignore
510
+ this.countOfClass = {};
511
+ this.rules.length = 0;
512
+ const sheet = this.style.sheet;
513
+ if (sheet) {
514
+ for (let i = sheet.cssRules.length - 1; i >= 0; i--) {
515
+ sheet.deleteRule(i);
516
+ }
517
+ }
518
+ }
519
+ /**
520
+ * 尋找匹配的 MasterCSSRule 生成實例
521
+ */
522
+ findAndNew(name) {
523
+ const findAndNewRule = (className) => {
524
+ if (className in this.ruleOfClass)
525
+ return this.ruleOfClass[className];
526
+ for (const EachRule of this.config.Rules) {
527
+ const matching = EachRule.match(className, this.colorNames);
528
+ if (matching)
529
+ return new EachRule(className, matching, this);
530
+ }
531
+ for (const eachSemanticEntry of this.semantics) {
532
+ if (className.match(eachSemanticEntry[0]))
533
+ return new MasterCSSRule(className, { origin: 'semantics', value: eachSemanticEntry[1] }, this);
534
+ }
535
+ };
536
+ return name in this.classes
537
+ ? this.classes[name]
538
+ .map(findAndNewRule)
539
+ .filter(eachRule => eachRule)
540
+ : findAndNewRule(name);
541
+ }
542
+ /**
543
+ * 根據目前蒐集到的所有 DOM class 重新 findAndNew
544
+ */
545
+ refresh(config) {
546
+ this.config = config;
547
+ this.cache();
548
+ if (!this.style) {
549
+ return;
550
+ }
551
+ const element = STYLE.cloneNode();
552
+ this.style.replaceWith(element);
553
+ // @ts-ignore
554
+ this.style = style;
555
+ this.rules.length = 0;
556
+ // @ts-ignore
557
+ this.ruleOfClass = {};
558
+ /**
559
+ * 拿當前所有的 classNames 按照最新的 colors, breakpoints, config.Rules 匹配並生成新的 style
560
+ * 所以 refresh 過後 rules 可能會變多也可能會變少
561
+ */
562
+ for (const name in this.countOfClass) {
563
+ this.findAndInsert(name);
564
+ }
565
+ }
566
+ destroy() {
567
+ const instances = MasterCSS.instances;
568
+ this.disconnect();
569
+ instances.splice(instances.indexOf(this), 1);
570
+ this.style.remove();
571
+ this.removeSchemeListener();
572
+ }
573
+ /**
574
+ * 1. where
575
+ * 2. normal
576
+ * 3. where selectors
577
+ * 4. normal selectors
578
+ * 5. media where
579
+ * 6. media normal
580
+ * 7. media selectors
581
+ * 8. media width where
582
+ * 9. media width
583
+ * 10. media width selectors
584
+ */
585
+ insert(rule) {
586
+ if (this.ruleOfClass[rule.className])
587
+ return;
588
+ const { validateRule } = this.config;
589
+ if (validateRule && !validateRule(rule, this)) {
590
+ return;
591
+ }
592
+ let index;
593
+ /**
594
+ * 必須按斷點值遞增,並透過索引插入,
595
+ * 以實現響應式先後套用的規則
596
+ * @example <1 <2 <3 ALL >=1 >=2 >=3
597
+ * @description
598
+ */
599
+ const endIndex = this.rules.length - 1;
600
+ const { media, order, prioritySelectorIndex, hasWhere, className } = rule;
601
+ const findPrioritySelectorInsertIndex = (rules, findStartIndex, findEndIndex, ignoreRule) => {
602
+ let sIndex = 0;
603
+ let eIndex;
604
+ // 1. 找尋目標陣列
605
+ if (findStartIndex) {
606
+ sIndex = rules.findIndex(findStartIndex);
607
+ }
608
+ if (findEndIndex) {
609
+ eIndex = rules.findIndex(findEndIndex);
610
+ }
611
+ if (sIndex === -1) {
612
+ sIndex = rules.length;
613
+ }
614
+ if (eIndex === undefined || eIndex === -1) {
615
+ eIndex = rules.length;
616
+ }
617
+ const targetRules = rules.slice(sIndex, eIndex);
618
+ // 2. 由目標陣列找尋插入點
619
+ for (let i = 0; i < targetRules.length; i++) {
620
+ const currentRule = targetRules[i];
621
+ if (currentRule.prioritySelectorIndex === -1 || ignoreRule && ignoreRule(currentRule))
622
+ continue;
623
+ if (currentRule.prioritySelectorIndex < prioritySelectorIndex
624
+ || currentRule.prioritySelectorIndex === prioritySelectorIndex
625
+ && (hasWhere && !currentRule.hasWhere
626
+ || currentRule.order >= order))
627
+ return sIndex + i;
628
+ }
629
+ return sIndex + targetRules.length;
630
+ };
631
+ if (media) {
632
+ const mediaStartIndex = this.rules.findIndex(eachRule => eachRule.media);
633
+ if (mediaStartIndex !== -1) {
634
+ const maxWidthFeature = media.features[MAX_WIDTH];
635
+ const minWidthFeature = media.features[MIN_WIDTH];
636
+ if (maxWidthFeature && minWidthFeature) {
637
+ /**
638
+ * 範圍越小 ( 越限定 越侷限 ) 越優先,
639
+ * 按照範圍 max-width - min-width 遞減排序
640
+ * find 第一個所遇到同樣 feature 且範圍值比自己大的 rule,
641
+ * 並插入在該 rule 之後,讓自己優先被套用
642
+ */
643
+ const range = maxWidthFeature.value - minWidthFeature.value;
644
+ for (let i = endIndex; i >= mediaStartIndex; i--) {
645
+ index = i;
646
+ const eachRule = this.rules[i];
647
+ const eachMedia = eachRule.media;
648
+ const eachMaxWidthFeature = eachMedia.features[MAX_WIDTH];
649
+ const eachMinWidthFeature = eachMedia.features[MIN_WIDTH];
650
+ if (!eachMaxWidthFeature || !eachMinWidthFeature) {
651
+ index++;
652
+ break;
653
+ }
654
+ const eachRange = eachMaxWidthFeature.value - eachMinWidthFeature.value;
655
+ if (eachRange === range) {
656
+ if (hasWhere !== eachRule.hasWhere)
657
+ continue;
658
+ if (prioritySelectorIndex !== -1) {
659
+ const sameRangeRules = [this.rules[i]];
660
+ for (let j = i - 1; j >= mediaStartIndex; j--) {
661
+ const currentMediaRule = this.rules[j];
662
+ if (currentMediaRule.hasWhere !== hasWhere)
663
+ break;
664
+ const currentMedia = currentMediaRule.media;
665
+ const currentMaxWidthFeature = currentMedia.features[MAX_WIDTH];
666
+ const currentMinWidthFeature = currentMedia.features[MIN_WIDTH];
667
+ if (!currentMaxWidthFeature
668
+ || !currentMinWidthFeature
669
+ || (currentMaxWidthFeature.value - currentMinWidthFeature.value !== eachRange))
670
+ break;
671
+ sameRangeRules.unshift(this.rules[j]);
672
+ }
673
+ index = findPrioritySelectorInsertIndex(this.rules, eachRule => eachRule.media && eachRule.prioritySelectorIndex !== -1 && eachRule.media.features[MIN_WIDTH] && eachRule.media.features[MAX_WIDTH]);
674
+ }
675
+ break;
676
+ }
677
+ else if (eachRange > range) {
678
+ break;
679
+ }
680
+ }
681
+ }
682
+ else if (minWidthFeature) {
683
+ /**
684
+ * find 第一個所遇到同樣 feature 且值比自己大的 rule,
685
+ * 並插入在該 rule 之後,讓自己優先被套用
686
+ */
687
+ for (let i = mediaStartIndex; i <= endIndex; i++) {
688
+ index = i;
689
+ const eachRule = this.rules[i];
690
+ const eachMedia = eachRule.media;
691
+ const eachMaxWidthFeature = eachMedia.features[MAX_WIDTH];
692
+ const eachMinWidthFeature = eachMedia.features[MIN_WIDTH];
693
+ if (eachMaxWidthFeature) {
694
+ /**
695
+ * 永遠插入在 range feature 前
696
+ */
697
+ if (eachMinWidthFeature) {
698
+ break;
699
+ }
700
+ else {
701
+ continue;
702
+ }
703
+ }
704
+ const value = eachMinWidthFeature?.value;
705
+ if (value === minWidthFeature.value) {
706
+ if (!hasWhere && eachRule.hasWhere) {
707
+ index++;
708
+ continue;
709
+ }
710
+ if (prioritySelectorIndex !== -1) {
711
+ 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]);
712
+ }
713
+ else {
714
+ for (let j = i; j <= endIndex; j++) {
715
+ const currentMediaRule = this.rules[j];
716
+ const currentMedia = currentMediaRule.media;
717
+ const currentMinWidthFeature = currentMedia.features[MIN_WIDTH];
718
+ const currentMaxWidthFeature = currentMedia.features[MAX_WIDTH];
719
+ if (currentMaxWidthFeature)
720
+ continue;
721
+ if (currentMediaRule.hasWhere !== hasWhere
722
+ || currentMinWidthFeature.value !== value
723
+ || currentMediaRule.order >= order)
724
+ break;
725
+ index = j + 1;
726
+ }
727
+ }
728
+ break;
729
+ }
730
+ else if (value > minWidthFeature.value) {
731
+ break;
732
+ }
733
+ else {
734
+ index++;
735
+ }
736
+ }
737
+ }
738
+ else if (maxWidthFeature) {
739
+ /**
740
+ * find 第一個所遇到同樣 feature 且值比自己大的 rule,
741
+ * 並插入在該 rule 之後,讓自己優先被套用
742
+ */
743
+ for (let i = endIndex; i >= mediaStartIndex; i--) {
744
+ index = i;
745
+ const eachRule = this.rules[i];
746
+ const eachMedia = eachRule.media;
747
+ const eachMaxWidthFeature = eachMedia.features[MAX_WIDTH];
748
+ const eachMinWidthFeature = eachMedia.features[MIN_WIDTH];
749
+ if (eachMinWidthFeature) {
750
+ /**
751
+ * 永遠插入在 range feature 前
752
+ */
753
+ continue;
754
+ }
755
+ const value = eachMaxWidthFeature?.value;
756
+ if (!value || value > maxWidthFeature.value) {
757
+ index++;
758
+ break;
759
+ }
760
+ else if (value === maxWidthFeature.value) {
761
+ if (hasWhere && !eachRule.hasWhere)
762
+ continue;
763
+ if (prioritySelectorIndex !== -1) {
764
+ 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]);
765
+ }
766
+ else {
767
+ const sameRangeRules = [this.rules[i]];
768
+ for (let j = i - 1; j >= mediaStartIndex; j--) {
769
+ const currentMediaRule = this.rules[j];
770
+ const currentMedia = currentMediaRule.media;
771
+ const currentMinWidthFeature = currentMedia.features[MIN_WIDTH];
772
+ const currentMaxWidthFeature = currentMedia.features[MAX_WIDTH];
773
+ if (!currentMinWidthFeature
774
+ && (!currentMaxWidthFeature
775
+ || currentMaxWidthFeature.value !== value
776
+ || currentMediaRule.hasWhere !== hasWhere))
777
+ break;
778
+ sameRangeRules.unshift(currentMediaRule);
779
+ }
780
+ for (let j = 0; j < sameRangeRules.length; j++) {
781
+ const currentMediaRule = sameRangeRules[j];
782
+ if (currentMediaRule.media.features[MIN_WIDTH])
783
+ continue;
784
+ if (currentMediaRule.order >= order)
785
+ break;
786
+ index = i - sameRangeRules.length + 2 + j;
787
+ }
788
+ }
789
+ break;
790
+ }
791
+ }
792
+ }
793
+ }
794
+ /**
795
+ * 如果找不到目標位置則插在最後面
796
+ */
797
+ if (index === undefined) {
798
+ if (mediaStartIndex === -1) {
799
+ // 無任何 media 時,優先級最高
800
+ index = endIndex + 1;
801
+ }
802
+ else if (prioritySelectorIndex !== -1) {
803
+ // 含有優先 selector
804
+ index = mediaStartIndex +
805
+ findPrioritySelectorInsertIndex(this.rules.slice(mediaStartIndex), undefined, eachRule => eachRule.media.features[MAX_WIDTH] || eachRule.media.features[MIN_WIDTH]);
806
+ }
807
+ else if (hasWhere) {
808
+ // 不含優先 selector,且含有 where,優先級最低
809
+ let i = mediaStartIndex;
810
+ for (; i < this.rules.length; i++) {
811
+ const eachRule = this.rules[i];
812
+ if (eachRule.prioritySelectorIndex !== -1 || !eachRule.hasWhere || eachRule.order >= order) {
813
+ index = i;
814
+ break;
815
+ }
816
+ }
817
+ if (index === undefined) {
818
+ index = i;
819
+ }
820
+ }
821
+ else {
822
+ // 不含優先 selector,且不含有 where,優先級緊接非 min-width / max-width 的 where 之後
823
+ for (let i = mediaStartIndex; i <= endIndex; i++) {
824
+ index = i;
825
+ const eachRule = this.rules[i];
826
+ const eachMedia = eachRule.media;
827
+ if (eachRule.prioritySelectorIndex !== -1 || eachMedia.features[MAX_WIDTH] || eachMedia.features[MIN_WIDTH])
828
+ break;
829
+ if (eachRule.hasWhere) {
830
+ index++;
831
+ }
832
+ else if (eachRule.order >= order) {
833
+ break;
834
+ }
835
+ }
836
+ }
837
+ }
838
+ }
839
+ else {
840
+ if (prioritySelectorIndex === -1) {
841
+ // 不含優先 selector
842
+ if (hasWhere) {
843
+ // 含有 where,優先級最低
844
+ index = this.rules.findIndex(eachRule => !eachRule.hasWhere
845
+ || eachRule.media
846
+ || eachRule.prioritySelectorIndex !== -1
847
+ || eachRule.order >= order);
848
+ if (index === -1) {
849
+ index = endIndex + 1;
850
+ }
851
+ }
852
+ else {
853
+ // 不含 where,優先級緊接 where 之後
854
+ let i = 0;
855
+ for (; i < this.rules.length; i++) {
856
+ const eachRule = this.rules[i];
857
+ if (eachRule.media || !eachRule.hasWhere && (eachRule.order >= order || eachRule.prioritySelectorIndex !== -1)) {
858
+ index = i;
859
+ break;
860
+ }
861
+ }
862
+ if (index === undefined) {
863
+ index = i;
864
+ }
865
+ }
866
+ }
867
+ else {
868
+ // 含有優先 selector
869
+ index = findPrioritySelectorInsertIndex(this.rules, undefined, eachRule => eachRule.media);
870
+ }
871
+ }
872
+ this.rules.splice(index, 0, rule);
873
+ this.ruleOfClass[className] = rule;
874
+ // 只在瀏覽器端運行
875
+ if (this.style) {
876
+ const sheet = this.style.sheet;
877
+ let cssRuleIndex = 0;
878
+ const getCssRuleIndex = (index) => {
879
+ const previousRule = this.rules[index];
880
+ if (previousRule) {
881
+ if (!previousRule.natives.length)
882
+ return getCssRuleIndex(index - 1);
883
+ const lastNativeCssRule = previousRule.natives[previousRule.natives.length - 1].cssRule;
884
+ for (let i = 0; i < sheet.cssRules.length; i++) {
885
+ if (sheet.cssRules[i] === lastNativeCssRule) {
886
+ cssRuleIndex = i + 1;
887
+ break;
888
+ }
889
+ }
890
+ }
891
+ };
892
+ getCssRuleIndex(index - 1);
893
+ for (let i = 0; i < rule.natives.length;) {
894
+ try {
895
+ const native = rule.natives[i];
896
+ sheet.insertRule(native.text, cssRuleIndex);
897
+ native.cssRule = sheet.cssRules[cssRuleIndex++];
898
+ i++;
899
+ }
900
+ catch (error) {
901
+ console.error(error);
902
+ rule.natives.splice(i, 1);
903
+ }
904
+ }
905
+ }
906
+ }
907
+ delete(className) {
908
+ /**
909
+ * class name 從 DOM tree 中被移除,
910
+ * 匹配並刪除對應的 rule
911
+ */
912
+ const sheet = this.style.sheet;
913
+ const deleteRule = (name) => {
914
+ const rule = this.ruleOfClass[name];
915
+ if (!rule
916
+ || name in this.relations && this.relations[name].some(eachClassName => eachClassName in this.countOfClass))
917
+ return;
918
+ if (rule.natives.length) {
919
+ const firstNative = rule.natives[0];
920
+ for (let index = 0; index < sheet.cssRules.length; index++) {
921
+ const eachCssRule = sheet.cssRules[index];
922
+ if (eachCssRule === firstNative.cssRule) {
923
+ for (let i = 0; i < rule.natives.length; i++) {
924
+ sheet.deleteRule(index);
925
+ }
926
+ this.rules.splice(this.rules.indexOf(rule), 1);
927
+ break;
928
+ }
929
+ }
930
+ }
931
+ delete this.ruleOfClass[name];
932
+ };
933
+ if (className in this.classes) {
934
+ for (const eachClassName of this.classes[className]) {
935
+ if (!(eachClassName in this.countOfClass)) {
936
+ deleteRule(eachClassName);
937
+ }
938
+ }
939
+ delete this.ruleOfClass[className];
940
+ }
941
+ else {
942
+ deleteRule(className);
943
+ }
944
+ }
945
+ findAndInsert(className) {
946
+ const rule = this.findAndNew(className);
947
+ if (Array.isArray(rule)) {
948
+ for (const eachRule of rule) {
949
+ this.insert(eachRule);
950
+ }
951
+ }
952
+ else if (rule) {
953
+ this.insert(rule);
954
+ }
955
+ }
956
+ get text() {
957
+ return this.rules.map((eachRule) => eachRule.natives
958
+ .map((eachNativeRule) => eachNativeRule.text)
959
+ .join('')).join('');
960
+ }
961
+ }
962
+ if (isBrowser) {
963
+ window.MasterCSS = MasterCSS;
964
+ }
965
+ //# sourceMappingURL=css.js.map