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

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