@jomae/catalog 0.7.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/dist/baseline.d.ts +41 -2
  2. package/dist/baseline.d.ts.map +1 -1
  3. package/dist/baseline.js +52 -10
  4. package/dist/baseline.js.map +1 -1
  5. package/dist/detect.d.ts +26 -0
  6. package/dist/detect.d.ts.map +1 -1
  7. package/dist/detect.js +27 -1
  8. package/dist/detect.js.map +1 -1
  9. package/dist/generated/baseline-history.d.ts.map +1 -1
  10. package/dist/generated/baseline-history.js +17 -5
  11. package/dist/generated/baseline-history.js.map +1 -1
  12. package/dist/generated/baseline.d.ts.map +1 -1
  13. package/dist/generated/baseline.js +411 -35
  14. package/dist/generated/baseline.js.map +1 -1
  15. package/dist/generated/guides.d.ts.map +1 -1
  16. package/dist/generated/guides.js +26 -3
  17. package/dist/generated/guides.js.map +1 -1
  18. package/dist/generated/lint-rules.d.ts +26 -0
  19. package/dist/generated/lint-rules.d.ts.map +1 -0
  20. package/dist/generated/lint-rules.js +361 -0
  21. package/dist/generated/lint-rules.js.map +1 -0
  22. package/dist/generated/sizes.d.ts.map +1 -1
  23. package/dist/generated/sizes.js +408 -38
  24. package/dist/generated/sizes.js.map +1 -1
  25. package/dist/generated/support-claims.d.ts.map +1 -1
  26. package/dist/generated/support-claims.js +34 -3
  27. package/dist/generated/support-claims.js.map +1 -1
  28. package/dist/index.d.ts +5 -3
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +5 -3
  31. package/dist/index.js.map +1 -1
  32. package/dist/lint.d.ts +53 -0
  33. package/dist/lint.d.ts.map +1 -0
  34. package/dist/lint.js +41 -0
  35. package/dist/lint.js.map +1 -0
  36. package/dist/markdown.d.ts +7 -0
  37. package/dist/markdown.d.ts.map +1 -1
  38. package/dist/markdown.js +81 -2
  39. package/dist/markdown.js.map +1 -1
  40. package/dist/rules/abort-controller.d.ts.map +1 -1
  41. package/dist/rules/abort-controller.js +3 -0
  42. package/dist/rules/abort-controller.js.map +1 -1
  43. package/dist/rules/accordion.d.ts.map +1 -1
  44. package/dist/rules/accordion.js +3 -0
  45. package/dist/rules/accordion.js.map +1 -1
  46. package/dist/rules/array-grouping.d.ts.map +1 -1
  47. package/dist/rules/array-grouping.js +1 -0
  48. package/dist/rules/array-grouping.js.map +1 -1
  49. package/dist/rules/aspect-ratio.d.ts.map +1 -1
  50. package/dist/rules/aspect-ratio.js +4 -0
  51. package/dist/rules/aspect-ratio.js.map +1 -1
  52. package/dist/rules/base64.d.ts.map +1 -1
  53. package/dist/rules/base64.js +3 -0
  54. package/dist/rules/base64.js.map +1 -1
  55. package/dist/rules/broadcast-channel.d.ts.map +1 -1
  56. package/dist/rules/broadcast-channel.js +3 -0
  57. package/dist/rules/broadcast-channel.js.map +1 -1
  58. package/dist/rules/carousel.d.ts.map +1 -1
  59. package/dist/rules/carousel.js +5 -0
  60. package/dist/rules/carousel.js.map +1 -1
  61. package/dist/rules/clipboard.d.ts.map +1 -1
  62. package/dist/rules/clipboard.js +3 -0
  63. package/dist/rules/clipboard.js.map +1 -1
  64. package/dist/rules/color-functions.d.ts.map +1 -1
  65. package/dist/rules/color-functions.js +4 -0
  66. package/dist/rules/color-functions.js.map +1 -1
  67. package/dist/rules/container-queries.d.ts.map +1 -1
  68. package/dist/rules/container-queries.js +4 -0
  69. package/dist/rules/container-queries.js.map +1 -1
  70. package/dist/rules/cookie-store.d.ts +3 -0
  71. package/dist/rules/cookie-store.d.ts.map +1 -0
  72. package/dist/rules/cookie-store.js +38 -0
  73. package/dist/rules/cookie-store.js.map +1 -0
  74. package/dist/rules/css-has.d.ts +3 -0
  75. package/dist/rules/css-has.d.ts.map +1 -0
  76. package/dist/rules/css-has.js +35 -0
  77. package/dist/rules/css-has.js.map +1 -0
  78. package/dist/rules/css-nesting.d.ts +3 -0
  79. package/dist/rules/css-nesting.d.ts.map +1 -0
  80. package/dist/rules/css-nesting.js +35 -0
  81. package/dist/rules/css-nesting.js.map +1 -0
  82. package/dist/rules/date-format.d.ts +3 -0
  83. package/dist/rules/date-format.d.ts.map +1 -0
  84. package/dist/rules/date-format.js +33 -0
  85. package/dist/rules/date-format.js.map +1 -0
  86. package/dist/rules/date-time-input.d.ts.map +1 -1
  87. package/dist/rules/date-time-input.js +4 -0
  88. package/dist/rules/date-time-input.js.map +1 -1
  89. package/dist/rules/diacritics.d.ts +3 -0
  90. package/dist/rules/diacritics.d.ts.map +1 -0
  91. package/dist/rules/diacritics.js +34 -0
  92. package/dist/rules/diacritics.js.map +1 -0
  93. package/dist/rules/dialog.d.ts.map +1 -1
  94. package/dist/rules/dialog.js +4 -0
  95. package/dist/rules/dialog.js.map +1 -1
  96. package/dist/rules/discrete-transitions.d.ts.map +1 -1
  97. package/dist/rules/discrete-transitions.js +4 -0
  98. package/dist/rules/discrete-transitions.js.map +1 -1
  99. package/dist/rules/display-names.d.ts +3 -0
  100. package/dist/rules/display-names.d.ts.map +1 -0
  101. package/dist/rules/display-names.js +37 -0
  102. package/dist/rules/display-names.js.map +1 -0
  103. package/dist/rules/drag-and-drop.d.ts.map +1 -1
  104. package/dist/rules/drag-and-drop.js +4 -0
  105. package/dist/rules/drag-and-drop.js.map +1 -1
  106. package/dist/rules/duration-format.d.ts.map +1 -1
  107. package/dist/rules/duration-format.js +3 -0
  108. package/dist/rules/duration-format.js.map +1 -1
  109. package/dist/rules/event-target.d.ts.map +1 -1
  110. package/dist/rules/event-target.js +1 -0
  111. package/dist/rules/event-target.js.map +1 -1
  112. package/dist/rules/fetch.d.ts.map +1 -1
  113. package/dist/rules/fetch.js +4 -0
  114. package/dist/rules/fetch.js.map +1 -1
  115. package/dist/rules/field-sizing.d.ts.map +1 -1
  116. package/dist/rules/field-sizing.js +4 -0
  117. package/dist/rules/field-sizing.js.map +1 -1
  118. package/dist/rules/file-download.d.ts +3 -0
  119. package/dist/rules/file-download.d.ts.map +1 -0
  120. package/dist/rules/file-download.js +40 -0
  121. package/dist/rules/file-download.js.map +1 -0
  122. package/dist/rules/file-drop.d.ts +3 -0
  123. package/dist/rules/file-drop.d.ts.map +1 -0
  124. package/dist/rules/file-drop.js +40 -0
  125. package/dist/rules/file-drop.js.map +1 -0
  126. package/dist/rules/focus-visible.d.ts.map +1 -1
  127. package/dist/rules/focus-visible.js +4 -0
  128. package/dist/rules/focus-visible.js.map +1 -1
  129. package/dist/rules/font-loading.d.ts +3 -0
  130. package/dist/rules/font-loading.d.ts.map +1 -0
  131. package/dist/rules/font-loading.js +33 -0
  132. package/dist/rules/font-loading.js.map +1 -0
  133. package/dist/rules/form-validation.d.ts +3 -0
  134. package/dist/rules/form-validation.d.ts.map +1 -0
  135. package/dist/rules/form-validation.js +40 -0
  136. package/dist/rules/form-validation.js.map +1 -0
  137. package/dist/rules/fullscreen.d.ts.map +1 -1
  138. package/dist/rules/fullscreen.js +3 -0
  139. package/dist/rules/fullscreen.js.map +1 -1
  140. package/dist/rules/height-animation.d.ts.map +1 -1
  141. package/dist/rules/height-animation.js +4 -0
  142. package/dist/rules/height-animation.js.map +1 -1
  143. package/dist/rules/index.d.ts.map +1 -1
  144. package/dist/rules/index.js +50 -0
  145. package/dist/rules/index.js.map +1 -1
  146. package/dist/rules/inert.d.ts.map +1 -1
  147. package/dist/rules/inert.js +6 -0
  148. package/dist/rules/inert.js.map +1 -1
  149. package/dist/rules/intersection-observer.d.ts.map +1 -1
  150. package/dist/rules/intersection-observer.js +1 -0
  151. package/dist/rules/intersection-observer.js.map +1 -1
  152. package/dist/rules/jquery.d.ts +3 -0
  153. package/dist/rules/jquery.d.ts.map +1 -0
  154. package/dist/rules/jquery.js +37 -0
  155. package/dist/rules/jquery.js.map +1 -0
  156. package/dist/rules/lazy-loading.d.ts.map +1 -1
  157. package/dist/rules/lazy-loading.js +4 -0
  158. package/dist/rules/lazy-loading.js.map +1 -1
  159. package/dist/rules/light-dark.d.ts +3 -0
  160. package/dist/rules/light-dark.d.ts.map +1 -0
  161. package/dist/rules/light-dark.js +37 -0
  162. package/dist/rules/light-dark.js.map +1 -0
  163. package/dist/rules/line-clamp.d.ts.map +1 -1
  164. package/dist/rules/line-clamp.js +4 -0
  165. package/dist/rules/line-clamp.js.map +1 -1
  166. package/dist/rules/list-format.d.ts +3 -0
  167. package/dist/rules/list-format.d.ts.map +1 -0
  168. package/dist/rules/list-format.js +40 -0
  169. package/dist/rules/list-format.js.map +1 -0
  170. package/dist/rules/masonry.d.ts.map +1 -1
  171. package/dist/rules/masonry.js +4 -0
  172. package/dist/rules/masonry.js.map +1 -1
  173. package/dist/rules/match-media.d.ts +3 -0
  174. package/dist/rules/match-media.d.ts.map +1 -0
  175. package/dist/rules/match-media.js +36 -0
  176. package/dist/rules/match-media.js.map +1 -0
  177. package/dist/rules/natural-sort.d.ts.map +1 -1
  178. package/dist/rules/natural-sort.js +4 -0
  179. package/dist/rules/natural-sort.js.map +1 -1
  180. package/dist/rules/number-format.d.ts.map +1 -1
  181. package/dist/rules/number-format.js +14 -1
  182. package/dist/rules/number-format.js.map +1 -1
  183. package/dist/rules/page-visibility.d.ts.map +1 -1
  184. package/dist/rules/page-visibility.js +3 -0
  185. package/dist/rules/page-visibility.js.map +1 -1
  186. package/dist/rules/passkeys.d.ts +3 -0
  187. package/dist/rules/passkeys.d.ts.map +1 -0
  188. package/dist/rules/passkeys.js +44 -0
  189. package/dist/rules/passkeys.js.map +1 -0
  190. package/dist/rules/plural-rules.d.ts +3 -0
  191. package/dist/rules/plural-rules.d.ts.map +1 -0
  192. package/dist/rules/plural-rules.js +33 -0
  193. package/dist/rules/plural-rules.js.map +1 -0
  194. package/dist/rules/pointer-events.d.ts +3 -0
  195. package/dist/rules/pointer-events.d.ts.map +1 -0
  196. package/dist/rules/pointer-events.js +43 -0
  197. package/dist/rules/pointer-events.js.map +1 -0
  198. package/dist/rules/popover.d.ts.map +1 -1
  199. package/dist/rules/popover.js +5 -0
  200. package/dist/rules/popover.js.map +1 -1
  201. package/dist/rules/progress-indicator.d.ts +3 -0
  202. package/dist/rules/progress-indicator.d.ts.map +1 -0
  203. package/dist/rules/progress-indicator.js +39 -0
  204. package/dist/rules/progress-indicator.js.map +1 -0
  205. package/dist/rules/random-uuid.d.ts.map +1 -1
  206. package/dist/rules/random-uuid.js +4 -0
  207. package/dist/rules/random-uuid.js.map +1 -1
  208. package/dist/rules/relative-time.d.ts.map +1 -1
  209. package/dist/rules/relative-time.js +4 -0
  210. package/dist/rules/relative-time.js.map +1 -1
  211. package/dist/rules/resizable-panels.d.ts.map +1 -1
  212. package/dist/rules/resizable-panels.js +3 -0
  213. package/dist/rules/resizable-panels.js.map +1 -1
  214. package/dist/rules/resize-observer.d.ts.map +1 -1
  215. package/dist/rules/resize-observer.js +4 -0
  216. package/dist/rules/resize-observer.js.map +1 -1
  217. package/dist/rules/screen-wake-lock.d.ts.map +1 -1
  218. package/dist/rules/screen-wake-lock.js +4 -0
  219. package/dist/rules/screen-wake-lock.js.map +1 -1
  220. package/dist/rules/scroll-animations.d.ts.map +1 -1
  221. package/dist/rules/scroll-animations.js +4 -0
  222. package/dist/rules/scroll-animations.js.map +1 -1
  223. package/dist/rules/scroll-into-view.d.ts +3 -0
  224. package/dist/rules/scroll-into-view.d.ts.map +1 -0
  225. package/dist/rules/scroll-into-view.js +38 -0
  226. package/dist/rules/scroll-into-view.js.map +1 -0
  227. package/dist/rules/scroll-lock.d.ts.map +1 -1
  228. package/dist/rules/scroll-lock.js +3 -0
  229. package/dist/rules/scroll-lock.js.map +1 -1
  230. package/dist/rules/scrollbars.d.ts.map +1 -1
  231. package/dist/rules/scrollbars.js +3 -0
  232. package/dist/rules/scrollbars.js.map +1 -1
  233. package/dist/rules/segmenter.d.ts +3 -0
  234. package/dist/rules/segmenter.d.ts.map +1 -0
  235. package/dist/rules/segmenter.js +45 -0
  236. package/dist/rules/segmenter.js.map +1 -0
  237. package/dist/rules/select.d.ts.map +1 -1
  238. package/dist/rules/select.js +4 -0
  239. package/dist/rules/select.js.map +1 -1
  240. package/dist/rules/server-sent-events.d.ts.map +1 -1
  241. package/dist/rules/server-sent-events.js +4 -0
  242. package/dist/rules/server-sent-events.js.map +1 -1
  243. package/dist/rules/signal-timeout.d.ts +3 -0
  244. package/dist/rules/signal-timeout.d.ts.map +1 -0
  245. package/dist/rules/signal-timeout.js +31 -0
  246. package/dist/rules/signal-timeout.js.map +1 -0
  247. package/dist/rules/smooth-scroll.d.ts.map +1 -1
  248. package/dist/rules/smooth-scroll.js +4 -0
  249. package/dist/rules/smooth-scroll.js.map +1 -1
  250. package/dist/rules/speculation-rules.d.ts +3 -0
  251. package/dist/rules/speculation-rules.d.ts.map +1 -0
  252. package/dist/rules/speculation-rules.js +35 -0
  253. package/dist/rules/speculation-rules.js.map +1 -0
  254. package/dist/rules/sticky.d.ts.map +1 -1
  255. package/dist/rules/sticky.js +4 -0
  256. package/dist/rules/sticky.js.map +1 -1
  257. package/dist/rules/structured-clone.d.ts.map +1 -1
  258. package/dist/rules/structured-clone.js +1 -0
  259. package/dist/rules/structured-clone.js.map +1 -1
  260. package/dist/rules/temporal.d.ts +3 -0
  261. package/dist/rules/temporal.d.ts.map +1 -0
  262. package/dist/rules/temporal.js +34 -0
  263. package/dist/rules/temporal.js.map +1 -0
  264. package/dist/rules/text-wrap-balance.d.ts.map +1 -1
  265. package/dist/rules/text-wrap-balance.js +3 -0
  266. package/dist/rules/text-wrap-balance.js.map +1 -1
  267. package/dist/rules/url-pattern.d.ts +3 -0
  268. package/dist/rules/url-pattern.d.ts.map +1 -0
  269. package/dist/rules/url-pattern.js +40 -0
  270. package/dist/rules/url-pattern.js.map +1 -0
  271. package/dist/rules/url-search-params.d.ts.map +1 -1
  272. package/dist/rules/url-search-params.js +1 -0
  273. package/dist/rules/url-search-params.js.map +1 -1
  274. package/dist/rules/web-animations.d.ts +3 -0
  275. package/dist/rules/web-animations.d.ts.map +1 -0
  276. package/dist/rules/web-animations.js +44 -0
  277. package/dist/rules/web-animations.js.map +1 -0
  278. package/dist/rules/web-crypto.d.ts.map +1 -1
  279. package/dist/rules/web-crypto.js +4 -0
  280. package/dist/rules/web-crypto.js.map +1 -1
  281. package/dist/rules/web-locks.d.ts +3 -0
  282. package/dist/rules/web-locks.d.ts.map +1 -0
  283. package/dist/rules/web-locks.js +39 -0
  284. package/dist/rules/web-locks.js.map +1 -0
  285. package/dist/rules/web-share.d.ts.map +1 -1
  286. package/dist/rules/web-share.js +3 -0
  287. package/dist/rules/web-share.js.map +1 -1
  288. package/dist/rules/with-resolvers.d.ts +3 -0
  289. package/dist/rules/with-resolvers.d.ts.map +1 -0
  290. package/dist/rules/with-resolvers.js +30 -0
  291. package/dist/rules/with-resolvers.js.map +1 -0
  292. package/dist/schema.d.ts +4 -0
  293. package/dist/schema.d.ts.map +1 -1
  294. package/dist/schema.js +34 -0
  295. package/dist/schema.js.map +1 -1
  296. package/dist/tier-diff.d.ts +55 -0
  297. package/dist/tier-diff.d.ts.map +1 -0
  298. package/dist/tier-diff.js +61 -0
  299. package/dist/tier-diff.js.map +1 -0
  300. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"array-grouping.js","sourceRoot":"","sources":["../../src/rules/array-grouping.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAS;IACjC,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,wBAAwB;IAC/B,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,gBAAgB,EAAE,eAAe,EAAE,aAAa,CAAC;IAC5D,UAAU,EAAE,CAAC,aAAa,CAAC;IAC3B,MAAM,EAAE,oCAAoC;IAC5C,KAAK,EAAE;QACL,SAAS,EACP,uYAAuY;QACzY,OAAO,EAAE;;;;mEAIsD;QAC/D,MAAM,EACJ,iGAAiG;KACpG;IACD,KAAK,EAAE;QACL,IAAI,EAAE,iEAAiE;QACvE,MAAM,EAAE;YACN,0JAA0J;YAC1J,oJAAoJ;YACpJ,4LAA4L;YAC5L,+IAA+I;YAC/I,4GAA4G;SAC7G;QACD,OAAO,EAAE,gEAAgE;KAC1E;CACF,CAAC"}
1
+ {"version":3,"file":"array-grouping.js","sourceRoot":"","sources":["../../src/rules/array-grouping.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAS;IACjC,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,wBAAwB;IAC/B,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,gBAAgB,EAAE,eAAe,EAAE,aAAa,CAAC;IAC5D,UAAU,EAAE,CAAC,aAAa,CAAC;IAC3B,MAAM,EAAE,oCAAoC;IAC5C,KAAK,EAAE;QACL,SAAS,EACP,uYAAuY;QACzY,OAAO,EAAE;;;;mEAIsD;QAC/D,MAAM,EACJ,iGAAiG;KACpG;IACD,KAAK,EAAE;QACL,IAAI,EAAE,iEAAiE;QACvE,MAAM,EAAE;YACN,0JAA0J;YAC1J,oJAAoJ;YACpJ,4LAA4L;YAC5L,+IAA+I;YAC/I,4GAA4G;SAC7G;QACD,OAAO,EAAE,gEAAgE;KAC1E;IACD,QAAQ,EAAE,yBAAyB;CACpC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"aspect-ratio.d.ts","sourceRoot":"","sources":["../../src/rules/aspect-ratio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,WAAW,EAAE,IAkCzB,CAAC"}
1
+ {"version":3,"file":"aspect-ratio.d.ts","sourceRoot":"","sources":["../../src/rules/aspect-ratio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,WAAW,EAAE,IAsCzB,CAAC"}
@@ -30,6 +30,10 @@ export const aspectRatio = {
30
30
  ],
31
31
  snippet: `.video { aspect-ratio: 16 / 9; width: 100%; }
32
32
  .thumb { aspect-ratio: 1; object-fit: cover; }`,
33
+ handRolled: [
34
+ "a padding-bottom percentage on a wrapper with the real content positioned absolutely inside it",
35
+ "reading offsetWidth and setting height from it to keep a box in proportion",
36
+ ],
33
37
  },
34
38
  };
35
39
  //# sourceMappingURL=aspect-ratio.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"aspect-ratio.js","sourceRoot":"","sources":["../../src/rules/aspect-ratio.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,qBAAqB;IAC5B,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,CAAC,oBAAoB,CAAC;IAChC,UAAU,EAAE,CAAC,cAAc,CAAC;IAC5B,MAAM,EAAE,cAAc;IACtB,KAAK,EAAE;QACL,SAAS,EACP,0SAA0S;QAC5S,OAAO,EAAE;;;;;;;;;;;EAWX;QACE,MAAM,EAAE,+DAA+D;KACxE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,oFAAoF;QAC1F,MAAM,EAAE;YACN,0FAA0F;YAC1F,8JAA8J;YAC9J,mEAAmE;SACpE;QACD,OAAO,EAAE;+CACkC;KAC5C;CACF,CAAC"}
1
+ {"version":3,"file":"aspect-ratio.js","sourceRoot":"","sources":["../../src/rules/aspect-ratio.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,qBAAqB;IAC5B,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,CAAC,oBAAoB,CAAC;IAChC,UAAU,EAAE,CAAC,cAAc,CAAC;IAC5B,MAAM,EAAE,cAAc;IACtB,KAAK,EAAE;QACL,SAAS,EACP,0SAA0S;QAC5S,OAAO,EAAE;;;;;;;;;;;EAWX;QACE,MAAM,EAAE,+DAA+D;KACxE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,oFAAoF;QAC1F,MAAM,EAAE;YACN,0FAA0F;YAC1F,8JAA8J;YAC9J,mEAAmE;SACpE;QACD,OAAO,EAAE;+CACkC;QAC3C,UAAU,EAAE;YACV,gGAAgG;YAChG,4EAA4E;SAC7E;KACF;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../src/rules/base64.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,MAAM,EAAE,IAwCpB,CAAC"}
1
+ {"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../src/rules/base64.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,MAAM,EAAE,IA2CpB,CAAC"}
@@ -36,6 +36,9 @@ const encoded = btoa(String.fromCharCode(...bytes));
36
36
  const decoded = new TextDecoder().decode(
37
37
  Uint8Array.from(atob(encoded), (c) => c.charCodeAt(0)),
38
38
  );`,
39
+ handRolled: [
40
+ "btoa wrapped in unescape and encodeURIComponent to survive characters outside Latin-1",
41
+ ],
39
42
  },
40
43
  };
41
44
  //# sourceMappingURL=base64.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/rules/base64.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAS;IAC1B,EAAE,EAAE,QAAQ;IACZ,KAAK,EAAE,iBAAiB;IACxB,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC;IAC1C,UAAU,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;IACnD,MAAM,EAAE,8CAA8C;IACtD,KAAK,EAAE;QACL,SAAS,EACP,6VAA6V;QAC/V,OAAO,EAAE;;;;;;;;;;;;yCAY4B;QACrC,MAAM,EAAE,0DAA0D;KACnE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,4CAA4C;QAClD,MAAM,EAAE;YACN,qNAAqN;YACrN,mJAAmJ;YACnJ,4IAA4I;YAC5I,+GAA+G;YAC/G,qGAAqG;SACtG;QACD,OAAO,EAAE;;;;GAIV;KACA;CACF,CAAC"}
1
+ {"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/rules/base64.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAS;IAC1B,EAAE,EAAE,QAAQ;IACZ,KAAK,EAAE,iBAAiB;IACxB,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC;IAC1C,UAAU,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;IACnD,MAAM,EAAE,8CAA8C;IACtD,KAAK,EAAE;QACL,SAAS,EACP,6VAA6V;QAC/V,OAAO,EAAE;;;;;;;;;;;;yCAY4B;QACrC,MAAM,EAAE,0DAA0D;KACnE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,4CAA4C;QAClD,MAAM,EAAE;YACN,qNAAqN;YACrN,mJAAmJ;YACnJ,4IAA4I;YAC5I,+GAA+G;YAC/G,qGAAqG;SACtG;QACD,OAAO,EAAE;;;;GAIV;QACC,UAAU,EAAE;YACV,uFAAuF;SACxF;KACF;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"broadcast-channel.d.ts","sourceRoot":"","sources":["../../src/rules/broadcast-channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,gBAAgB,EAAE,IAyB9B,CAAC"}
1
+ {"version":3,"file":"broadcast-channel.d.ts","sourceRoot":"","sources":["../../src/rules/broadcast-channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,gBAAgB,EAAE,IA4B9B,CAAC"}
@@ -21,6 +21,9 @@ channel.onmessage = (event) => console.log(event.data);`,
21
21
  ],
22
22
  snippet: `const channel = new BroadcastChannel("cart-updates");
23
23
  channel.postMessage({ itemCount: 3 });`,
24
+ handRolled: [
25
+ "writing to localStorage only so other tabs receive the storage event, then deleting the key",
26
+ ],
24
27
  },
25
28
  };
26
29
  //# sourceMappingURL=broadcast-channel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"broadcast-channel.js","sourceRoot":"","sources":["../../src/rules/broadcast-channel.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,EAAE,EAAE,mBAAmB;IACvB,KAAK,EAAE,qBAAqB;IAC5B,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,CAAC,mBAAmB,CAAC;IAC/B,UAAU,EAAE,CAAC,mBAAmB,CAAC;IACjC,MAAM,EAAE,kBAAkB;IAC1B,KAAK,EAAE;QACL,SAAS,EACP,oTAAoT;QACtT,OAAO,EAAE;;wDAE2C;QACpD,MAAM,EAAE,mEAAmE;KAC5E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,oEAAoE;QAC1E,MAAM,EAAE;YACN,wIAAwI;YACxI,0GAA0G;YAC1G,0HAA0H;SAC3H;QACD,OAAO,EAAE;uCAC0B;KACpC;CACF,CAAC"}
1
+ {"version":3,"file":"broadcast-channel.js","sourceRoot":"","sources":["../../src/rules/broadcast-channel.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,EAAE,EAAE,mBAAmB;IACvB,KAAK,EAAE,qBAAqB;IAC5B,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,CAAC,mBAAmB,CAAC;IAC/B,UAAU,EAAE,CAAC,mBAAmB,CAAC;IACjC,MAAM,EAAE,kBAAkB;IAC1B,KAAK,EAAE;QACL,SAAS,EACP,oTAAoT;QACtT,OAAO,EAAE;;wDAE2C;QACpD,MAAM,EAAE,mEAAmE;KAC5E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,oEAAoE;QAC1E,MAAM,EAAE;YACN,wIAAwI;YACxI,0GAA0G;YAC1G,0HAA0H;SAC3H;QACD,OAAO,EAAE;uCAC0B;QACnC,UAAU,EAAE;YACV,6FAA6F;SAC9F;KACF;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"carousel.d.ts","sourceRoot":"","sources":["../../src/rules/carousel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,QAAQ,EAAE,IAwFtB,CAAC"}
1
+ {"version":3,"file":"carousel.d.ts","sourceRoot":"","sources":["../../src/rules/carousel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,QAAQ,EAAE,IA6FtB,CAAC"}
@@ -78,6 +78,11 @@ export const carousel = {
78
78
  .carousel::scroll-button(inline-end) { content: "\\2192"; }
79
79
  .carousel > *::scroll-marker { content: ""; }
80
80
  .carousel > *::scroll-marker:target-current { opacity: 1; }`,
81
+ handRolled: [
82
+ "a scroll listener on a horizontal strip dividing scrollLeft by item width to work out the active index",
83
+ "prev and next buttons calling scrollBy, each with its own disabled state recomputed on every scroll",
84
+ "rendering dots from the item count and toggling an active class on whichever one is current",
85
+ ],
81
86
  },
82
87
  guides: [
83
88
  "carousel-snap-highlights",
@@ -1 +1 @@
1
- {"version":3,"file":"carousel.js","sourceRoot":"","sources":["../../src/rules/carousel.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,EAAE,EAAE,yBAAyB;IAC7B,KAAK,EAAE,WAAW;IAClB,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE;QACR,QAAQ;QACR,gBAAgB;QAChB,sBAAsB;QACtB,aAAa;QACb,gBAAgB;QAChB,aAAa;QACb,UAAU;QACV,eAAe;QACf,oBAAoB;QACpB,oBAAoB;KACrB;IACD,UAAU,EAAE,CAAC,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,CAAC;IAC/D,MAAM,EAAE,8DAA8D;IACtE,KAAK,EAAE;QACL,SAAS,EACP,2eAA2e;QAC7e,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCX;QACE,OAAO,EAAE,6CAA6C;QACtD,MAAM,EAAE,kEAAkE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,yEAAyE;QAC/E,MAAM,EAAE;YACN,2LAA2L;YAC3L,2GAA2G;YAC3G,2EAA2E;YAC3E,kGAAkG;YAClG,gIAAgI;SACjI;QACD,OAAO,EAAE;;;;;;;;4DAQ+C;KACzD;IACD,MAAM,EAAE;QACN,0BAA0B;QAC1B,wBAAwB;QACxB,wBAAwB;QACxB,+BAA+B;KAChC;CACF,CAAC"}
1
+ {"version":3,"file":"carousel.js","sourceRoot":"","sources":["../../src/rules/carousel.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,EAAE,EAAE,yBAAyB;IAC7B,KAAK,EAAE,WAAW;IAClB,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE;QACR,QAAQ;QACR,gBAAgB;QAChB,sBAAsB;QACtB,aAAa;QACb,gBAAgB;QAChB,aAAa;QACb,UAAU;QACV,eAAe;QACf,oBAAoB;QACpB,oBAAoB;KACrB;IACD,UAAU,EAAE,CAAC,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,CAAC;IAC/D,MAAM,EAAE,8DAA8D;IACtE,KAAK,EAAE;QACL,SAAS,EACP,2eAA2e;QAC7e,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCX;QACE,OAAO,EAAE,6CAA6C;QACtD,MAAM,EAAE,kEAAkE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,yEAAyE;QAC/E,MAAM,EAAE;YACN,2LAA2L;YAC3L,2GAA2G;YAC3G,2EAA2E;YAC3E,kGAAkG;YAClG,gIAAgI;SACjI;QACD,OAAO,EAAE;;;;;;;;4DAQ+C;QACxD,UAAU,EAAE;YACV,wGAAwG;YACxG,qGAAqG;YACrG,6FAA6F;SAC9F;KACF;IACD,MAAM,EAAE;QACN,0BAA0B;QAC1B,wBAAwB;QACxB,wBAAwB;QACxB,+BAA+B;KAChC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/rules/clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,SAAS,EAAE,IAmCvB,CAAC"}
1
+ {"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/rules/clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,SAAS,EAAE,IAsCvB,CAAC"}
@@ -30,6 +30,9 @@ export const clipboard = {
30
30
  "You're running without focus or without a secure origin (HTTPS). The API rejects in both cases, so you still need a fallback path for that error.",
31
31
  ],
32
32
  snippet: "await navigator.clipboard.writeText(text);",
33
+ handRolled: [
34
+ "an off-screen textarea or contenteditable element created only so text can be selected and execCommand'd",
35
+ ],
33
36
  },
34
37
  };
35
38
  //# sourceMappingURL=clipboard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../src/rules/clipboard.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAS;IAC7B,EAAE,EAAE,WAAW;IACf,KAAK,EAAE,gBAAgB;IACvB,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE;QACR,mBAAmB;QACnB,gBAAgB;QAChB,cAAc;QACd,yBAAyB;QACzB,gBAAgB;QAChB,gBAAgB;QAChB,eAAe;QACf,oBAAoB;KACrB;IACD,UAAU,EAAE,CAAC,iBAAiB,CAAC;IAC/B,MAAM,EAAE,iCAAiC;IACzC,KAAK,EAAE;QACL,SAAS,EACP,+QAA+Q;QACjR,OAAO,EAAE;;EAEX;QACE,MAAM,EACJ,sEAAsE;KACzE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,wEAAwE;QAC9E,MAAM,EAAE;YACN,gKAAgK;YAChK,mLAAmL;YACnL,8JAA8J;YAC9J,mJAAmJ;SACpJ;QACD,OAAO,EAAE,4CAA4C;KACtD;CACF,CAAC"}
1
+ {"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../src/rules/clipboard.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAS;IAC7B,EAAE,EAAE,WAAW;IACf,KAAK,EAAE,gBAAgB;IACvB,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE;QACR,mBAAmB;QACnB,gBAAgB;QAChB,cAAc;QACd,yBAAyB;QACzB,gBAAgB;QAChB,gBAAgB;QAChB,eAAe;QACf,oBAAoB;KACrB;IACD,UAAU,EAAE,CAAC,iBAAiB,CAAC;IAC/B,MAAM,EAAE,iCAAiC;IACzC,KAAK,EAAE;QACL,SAAS,EACP,+QAA+Q;QACjR,OAAO,EAAE;;EAEX;QACE,MAAM,EACJ,sEAAsE;KACzE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,wEAAwE;QAC9E,MAAM,EAAE;YACN,gKAAgK;YAChK,mLAAmL;YACnL,8JAA8J;YAC9J,mJAAmJ;SACpJ;QACD,OAAO,EAAE,4CAA4C;QACrD,UAAU,EAAE;YACV,0GAA0G;SAC3G;KACF;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"color-functions.d.ts","sourceRoot":"","sources":["../../src/rules/color-functions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,cAAc,EAAE,IAmD5B,CAAC"}
1
+ {"version":3,"file":"color-functions.d.ts","sourceRoot":"","sources":["../../src/rules/color-functions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,cAAc,EAAE,IAuD5B,CAAC"}
@@ -46,6 +46,10 @@ export const colorFunctions = {
46
46
  snippet: `:root { --brand: oklch(62% 0.19 256); }
47
47
  .btn:hover { background: color-mix(in oklch, var(--brand) 85%, black); }
48
48
  .ghost { background: oklch(from var(--brand) l c h / 0.15); }`,
49
+ handRolled: [
50
+ "a lighten or darken helper doing arithmetic on the six characters of a hex colour",
51
+ "a second hex value hardcoded next to every colour token, one for the base and one for its hover state",
52
+ ],
49
53
  },
50
54
  };
51
55
  //# sourceMappingURL=color-functions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"color-functions.js","sourceRoot":"","sources":["../../src/rules/color-functions.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,EAAE,EAAE,qBAAqB;IACzB,KAAK,EAAE,qBAAqB;IAC5B,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE;QACR,UAAU;QACV,SAAS;QACT,WAAW;QACX,YAAY;QACZ,OAAO;QACP,QAAQ;KACT;IACD,UAAU,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC;IAClC,MAAM,EAAE,iDAAiD;IACzD,KAAK,EAAE;QACL,SAAS,EACP,qjBAAqjB;QACvjB,OAAO,EAAE;;;;;;;;;;;;;;;;;EAiBX;QACE,MAAM,EACJ,oEAAoE;KACvE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,mEAAmE;QACzE,MAAM,EAAE;YACN,+KAA+K;YAC/K,6FAA6F;YAC7F,uGAAuG;YACvG,8EAA8E;YAC9E,gNAAgN;SACjN;QACD,OAAO,EAAE;;8DAEiD;KAC3D;CACF,CAAC"}
1
+ {"version":3,"file":"color-functions.js","sourceRoot":"","sources":["../../src/rules/color-functions.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,EAAE,EAAE,qBAAqB;IACzB,KAAK,EAAE,qBAAqB;IAC5B,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE;QACR,UAAU;QACV,SAAS;QACT,WAAW;QACX,YAAY;QACZ,OAAO;QACP,QAAQ;KACT;IACD,UAAU,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC;IAClC,MAAM,EAAE,iDAAiD;IACzD,KAAK,EAAE;QACL,SAAS,EACP,qjBAAqjB;QACvjB,OAAO,EAAE;;;;;;;;;;;;;;;;;EAiBX;QACE,MAAM,EACJ,oEAAoE;KACvE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,mEAAmE;QACzE,MAAM,EAAE;YACN,+KAA+K;YAC/K,6FAA6F;YAC7F,uGAAuG;YACvG,8EAA8E;YAC9E,gNAAgN;SACjN;QACD,OAAO,EAAE;;8DAEiD;QAC1D,UAAU,EAAE;YACV,mFAAmF;YACnF,uGAAuG;SACxG;KACF;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"container-queries.d.ts","sourceRoot":"","sources":["../../src/rules/container-queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,gBAAgB,EAAE,IAyD9B,CAAC"}
1
+ {"version":3,"file":"container-queries.d.ts","sourceRoot":"","sources":["../../src/rules/container-queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,gBAAgB,EAAE,IA6D9B,CAAC"}
@@ -8,6 +8,7 @@ export const containerQueries = {
8
8
  "react-sizeme",
9
9
  "react-container-query",
10
10
  "element-resize-detector",
11
+ "css-element-queries",
11
12
  "vue-resize",
12
13
  ],
13
14
  featureIds: ["container-queries"],
@@ -51,6 +52,9 @@ export const containerQueries = {
51
52
  @container card (width >= 400px) {
52
53
  .card { grid-template-columns: 8rem 1fr; }
53
54
  }`,
55
+ handRolled: [
56
+ "a ResizeObserver toggling size classes on an element so it can style itself by its own width",
57
+ ],
54
58
  },
55
59
  guides: ["size-aware-styling"],
56
60
  };
@@ -1 +1 @@
1
- {"version":3,"file":"container-queries.js","sourceRoot":"","sources":["../../src/rules/container-queries.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,EAAE,EAAE,mBAAmB;IACvB,KAAK,EAAE,sBAAsB;IAC7B,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE;QACR,uBAAuB;QACvB,mBAAmB;QACnB,cAAc;QACd,uBAAuB;QACvB,yBAAyB;QACzB,YAAY;KACb;IACD,UAAU,EAAE,CAAC,mBAAmB,CAAC;IACjC,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE;QACL,SAAS,EACP,6YAA6Y;QAC/Y,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;EAsBX;QACE,MAAM,EACJ,oFAAoF;KACvF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,oFAAoF;QAC1F,MAAM,EAAE;YACN,qIAAqI;YACrI,yKAAyK;YACzK,4HAA4H;YAC5H,mIAAmI;SACpI;QACD,OAAO,EAAE;;;EAGX;KACC;IACD,MAAM,EAAE,CAAC,oBAAoB,CAAC;CAC/B,CAAC"}
1
+ {"version":3,"file":"container-queries.js","sourceRoot":"","sources":["../../src/rules/container-queries.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,EAAE,EAAE,mBAAmB;IACvB,KAAK,EAAE,sBAAsB;IAC7B,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE;QACR,uBAAuB;QACvB,mBAAmB;QACnB,cAAc;QACd,uBAAuB;QACvB,yBAAyB;QACzB,qBAAqB;QACrB,YAAY;KACb;IACD,UAAU,EAAE,CAAC,mBAAmB,CAAC;IACjC,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE;QACL,SAAS,EACP,6YAA6Y;QAC/Y,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;EAsBX;QACE,MAAM,EACJ,oFAAoF;KACvF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,oFAAoF;QAC1F,MAAM,EAAE;YACN,qIAAqI;YACrI,yKAAyK;YACzK,4HAA4H;YAC5H,mIAAmI;SACpI;QACD,OAAO,EAAE;;;EAGX;QACE,UAAU,EAAE;YACV,8FAA8F;SAC/F;KACF;IACD,MAAM,EAAE,CAAC,oBAAoB,CAAC;CAC/B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from "../schema.ts";
2
+ export declare const cookieStore: Rule;
3
+ //# sourceMappingURL=cookie-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie-store.d.ts","sourceRoot":"","sources":["../../src/rules/cookie-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,WAAW,EAAE,IAqCzB,CAAC"}
@@ -0,0 +1,38 @@
1
+ export const cookieStore = {
2
+ id: "cookie-store",
3
+ title: "Reading and writing cookies",
4
+ category: "async-data",
5
+ replaces: ["js-cookie", "universal-cookie"],
6
+ featureIds: ["cookie-store"],
7
+ native: "cookieStore",
8
+ human: {
9
+ explainer: "document.cookie is a single string holding every cookie for the origin, so reading one means splitting and decoding, and writing one means formatting attributes by hand. That parsing is what js-cookie is. The Cookie Store API gives get and set as promises over real objects, plus a change event, and never touches the document string. Every engine has the page-facing half now, Firefox and Safari only recently. What Safari alone is missing is the service worker half, which is what keeps this short of Baseline.",
10
+ snippet: `await cookieStore.set({
11
+ name: "theme",
12
+ value: "dark",
13
+ // A timestamp in milliseconds, not a formatted date string.
14
+ expires: oneYearFromNow,
15
+ sameSite: "lax",
16
+ });
17
+
18
+ const theme = await cookieStore.get("theme");
19
+ theme?.value; // "dark"`,
20
+ mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/API/CookieStore",
21
+ },
22
+ agent: {
23
+ when: "reading or writing cookies from the browser",
24
+ unless: [
25
+ "Your support target reaches below Chrome {{chrome:api.CookieStore}}, Firefox {{firefox:api.CookieStore}} or Safari {{safari:api.CookieStore}}. Chromium has had it for years and the other two arrived recently, so a target of any age still needs the document.cookie fallback the library provides.",
26
+ "You subscribe to cookie changes from a service worker. CookieStoreManager is the half Safari does not have, and it is why this rule reads as limited availability while the page-facing calls work everywhere.",
27
+ "You read a cookie during render or anywhere synchronous. Every cookieStore call returns a promise, so a value that used to be available inline now arrives a tick later.",
28
+ "The same code runs on the server. universal-cookie exists to give one API across request headers and the browser, and cookieStore is browser-only.",
29
+ "You set cookies a script is not allowed to set, or read HttpOnly ones. Neither this nor the library can, but a project reaching for one often ends up doing cookie work on the server instead.",
30
+ ],
31
+ snippet: 'const cookie = await cookieStore.get("theme");',
32
+ handRolled: [
33
+ "a document.cookie split on semicolons with decodeURIComponent, wrapped in a getCookie helper",
34
+ "a template string assigned to document.cookie assembling path, expires and SameSite attributes by hand",
35
+ ],
36
+ },
37
+ };
38
+ //# sourceMappingURL=cookie-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie-store.js","sourceRoot":"","sources":["../../src/rules/cookie-store.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,6BAA6B;IACpC,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,WAAW,EAAE,kBAAkB,CAAC;IAC3C,UAAU,EAAE,CAAC,cAAc,CAAC;IAC5B,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE;QACL,SAAS,EACP,kgBAAkgB;QACpgB,OAAO,EAAE;;;;;;;;;wBASW;QACpB,MAAM,EAAE,8DAA8D;KACvE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,6CAA6C;QACnD,MAAM,EAAE;YACN,wSAAwS;YACxS,gNAAgN;YAChN,0KAA0K;YAC1K,oJAAoJ;YACpJ,gMAAgM;SACjM;QACD,OAAO,EAAE,gDAAgD;QACzD,UAAU,EAAE;YACV,8FAA8F;YAC9F,wGAAwG;SACzG;KACF;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from "../schema.ts";
2
+ export declare const cssHas: Rule;
3
+ //# sourceMappingURL=css-has.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-has.d.ts","sourceRoot":"","sources":["../../src/rules/css-has.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,MAAM,EAAE,IAkCpB,CAAC"}
@@ -0,0 +1,35 @@
1
+ export const cssHas = {
2
+ id: "css-has",
3
+ title: "Styling a parent from its contents",
4
+ category: "typography",
5
+ replaces: ["css-has-pseudo"],
6
+ featureIds: ["has"],
7
+ native: ":has()",
8
+ human: {
9
+ explainer: "css-has-pseudo rewrites :has() into attribute selectors and ships a JavaScript runtime to keep those attributes in sync as the DOM changes. Every engine has supported :has() since late 2023, so the rewrite now produces a slower version of what the browser already does natively, and the runtime is bytes on the page rather than only at build time.",
10
+ snippet: `/* A label that reacts to its own control. */
11
+ label:has(input:checked) {
12
+ font-weight: 600;
13
+ }
14
+
15
+ /* A card that changes when it contains an image. */
16
+ .card:has(> img) {
17
+ grid-template-columns: 8rem 1fr;
18
+ }`,
19
+ mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/CSS/:has",
20
+ },
21
+ agent: {
22
+ when: "an element is styled according to what it contains",
23
+ unless: [
24
+ "You support browsers below Chrome {{chrome:has}}, Firefox {{firefox:has}} or Safari {{safari:has}}. The attribute rewriting this plugin does is the fallback for exactly that case, and native :has() has none.",
25
+ "You nest :has() inside another :has(). The selector is not allowed to contain itself, so a query that needs two levels has to be restructured either way.",
26
+ "The plugin is pulled in by a preset rather than listed directly. postcss-preset-env enables it by stage, so removing the dependency without raising the preset's target puts it back.",
27
+ ],
28
+ snippet: "label:has(input:checked) { font-weight: 600; }",
29
+ handRolled: [
30
+ "a class toggled on a parent from JavaScript whenever a child's state changes, to stand in for a parent selector",
31
+ "a change or input listener whose only job is to add a modifier class to an ancestor",
32
+ ],
33
+ },
34
+ };
35
+ //# sourceMappingURL=css-has.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-has.js","sourceRoot":"","sources":["../../src/rules/css-has.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAS;IAC1B,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,oCAAoC;IAC3C,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,gBAAgB,CAAC;IAC5B,UAAU,EAAE,CAAC,KAAK,CAAC;IACnB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE;QACL,SAAS,EACP,6VAA6V;QAC/V,OAAO,EAAE;;;;;;;;EAQX;QACE,MAAM,EAAE,uDAAuD;KAChE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,oDAAoD;QAC1D,MAAM,EAAE;YACN,iNAAiN;YACjN,2JAA2J;YAC3J,uLAAuL;SACxL;QACD,OAAO,EAAE,gDAAgD;QACzD,UAAU,EAAE;YACV,iHAAiH;YACjH,qFAAqF;SACtF;KACF;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from "../schema.ts";
2
+ export declare const cssNesting: Rule;
3
+ //# sourceMappingURL=css-nesting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-nesting.d.ts","sourceRoot":"","sources":["../../src/rules/css-nesting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,UAAU,EAAE,IAkCxB,CAAC"}
@@ -0,0 +1,35 @@
1
+ export const cssNesting = {
2
+ id: "css-nesting",
3
+ title: "Nested CSS rules",
4
+ category: "typography",
5
+ replaces: ["postcss-nested", "postcss-nesting"],
6
+ featureIds: ["nesting"],
7
+ native: "native CSS nesting",
8
+ human: {
9
+ explainer: "These plugins exist to flatten nested rules into ones browsers understood. Browsers understand nesting directly now, and have done in all three engines since 2023, so the plugin is compiling syntax into the syntax it started from. Dropping it takes a build step out rather than bytes off the page, because a PostCSS plugin ships nothing to the browser.",
10
+ snippet: `.card {
11
+ padding: 1rem;
12
+
13
+ /* & is required when the nested selector starts with an
14
+ identifier, and harmless everywhere else. */
15
+ & h2 { margin-block: 0; }
16
+ &:hover { border-color: currentColor; }
17
+
18
+ @media (width >= 40rem) {
19
+ padding: 2rem;
20
+ }
21
+ }`,
22
+ mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_nesting",
23
+ },
24
+ agent: {
25
+ when: "CSS is authored with nested rules and a PostCSS plugin flattens them",
26
+ unless: [
27
+ "You build selector names by concatenation, such as &__item for BEM. Native nesting cannot join & to a string, and that is the one Sass habit it deliberately does not carry over.",
28
+ "You support browsers below Chrome {{chrome:nesting}}, Firefox {{firefox:nesting}} or Safari {{safari:nesting}}. Compiling nesting away is exactly how an older target is served.",
29
+ "Sass or Less is already in the pipeline. The nesting is resolved before PostCSS runs, so the plugin is not what is doing the work and removing it changes nothing.",
30
+ "This is not a bundle-size change. The plugin runs at build time and ships no bytes, so the gain is one less dependency and one less step, not a smaller page.",
31
+ ],
32
+ snippet: ".card {\n & h2 { margin-block: 0; }\n}",
33
+ },
34
+ };
35
+ //# sourceMappingURL=css-nesting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-nesting.js","sourceRoot":"","sources":["../../src/rules/css-nesting.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,kBAAkB;IACzB,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;IAC/C,UAAU,EAAE,CAAC,SAAS,CAAC;IACvB,MAAM,EAAE,oBAAoB;IAC5B,KAAK,EAAE;QACL,SAAS,EACP,kWAAkW;QACpW,OAAO,EAAE;;;;;;;;;;;EAWX;QACE,MAAM,EAAE,8DAA8D;KACvE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,sEAAsE;QAC5E,MAAM,EAAE;YACN,mLAAmL;YACnL,kLAAkL;YAClL,oKAAoK;YACpK,+JAA+J;SAChK;QACD,OAAO,EAAE,yCAAyC;KACnD;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from "../schema.ts";
2
+ export declare const dateFormat: Rule;
3
+ //# sourceMappingURL=date-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-format.d.ts","sourceRoot":"","sources":["../../src/rules/date-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,UAAU,EAAE,IAkCxB,CAAC"}
@@ -0,0 +1,33 @@
1
+ export const dateFormat = {
2
+ id: "date-format",
3
+ title: "Locale-aware date and time formatting",
4
+ category: "formatting",
5
+ replaces: ["moment", "dayjs", "date-fns", "luxon", "date-fns-tz"],
6
+ featureIds: ["intl"],
7
+ native: "Intl.DateTimeFormat",
8
+ human: {
9
+ explainer: "moment, luxon and date-fns each carry their own locale data and their own formatting grammar, which is where most of their weight goes. Intl.DateTimeFormat reads the locale data the operating system already ships, so a date renders the way that locale writes dates with nothing added to the bundle, time zones included. It formats only. Arithmetic, parsing and comparison are what these libraries still do, and Temporal is the native answer to those, which has not reached Baseline yet.",
10
+ snippet: `new Intl.DateTimeFormat("en-GB", {
11
+ dateStyle: "medium",
12
+ timeStyle: "short",
13
+ timeZone: "Europe/Berlin",
14
+ }).format(date); // "20 Sept 2026, 15:20"`,
15
+ mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat",
16
+ },
17
+ agent: {
18
+ when: "rendering a date or time for a person to read",
19
+ unless: [
20
+ "You do date arithmetic: adding days, diffing two dates, or finding the start of a week. Intl.DateTimeFormat only formats a date you already have, and Temporal is the native answer to the rest, which is not Baseline yet. A project using one of these libraries mostly for arithmetic is not a candidate at all.",
21
+ "You parse date strings that are not ISO 8601. Parsing is not what Intl does, and the Date constructor disagrees with itself across engines on anything else, which is one of the reasons these libraries exist.",
22
+ "You need an exact machine-readable pattern such as YYYY-MM-DD. Intl formats for a locale rather than to a template, so a fixed pattern means assembling the parts from formatToParts by hand.",
23
+ 'You want relative phrasing such as "3 hours ago". That is Intl.RelativeTimeFormat rather than this API, and the relative-time rule covers it.',
24
+ "The same code runs on a Node build without full ICU, where every locale other than English quietly falls back to English instead of failing.",
25
+ ],
26
+ snippet: 'new Intl.DateTimeFormat(locale, { dateStyle: "medium" }).format(date);',
27
+ handRolled: [
28
+ "an array of month names indexed by getMonth(), joined with getDate() and getFullYear() to build a display string",
29
+ "padStart on getHours() and getMinutes() to assemble a HH:MM clock, usually next to a hand-written AM and PM branch",
30
+ ],
31
+ },
32
+ };
33
+ //# sourceMappingURL=date-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-format.js","sourceRoot":"","sources":["../../src/rules/date-format.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,uCAAuC;IAC9C,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,CAAC;IACjE,UAAU,EAAE,CAAC,MAAM,CAAC;IACpB,MAAM,EAAE,qBAAqB;IAC7B,KAAK,EAAE;QACL,SAAS,EACP,weAAwe;QAC1e,OAAO,EAAE;;;;0CAI6B;QACtC,MAAM,EACJ,sGAAsG;KACzG;IACD,KAAK,EAAE;QACL,IAAI,EAAE,+CAA+C;QACrD,MAAM,EAAE;YACN,qTAAqT;YACrT,iNAAiN;YACjN,+LAA+L;YAC/L,+IAA+I;YAC/I,8IAA8I;SAC/I;QACD,OAAO,EACL,wEAAwE;QAC1E,UAAU,EAAE;YACV,kHAAkH;YAClH,oHAAoH;SACrH;KACF;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"date-time-input.d.ts","sourceRoot":"","sources":["../../src/rules/date-time-input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,aAAa,EAAE,IAmC3B,CAAC"}
1
+ {"version":3,"file":"date-time-input.d.ts","sourceRoot":"","sources":["../../src/rules/date-time-input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,aAAa,EAAE,IAuC3B,CAAC"}
@@ -30,6 +30,10 @@ export const dateTimeInput = {
30
30
  'You need type="week" or type="month". Their browser support has not caught up to type="date" and type="time".',
31
31
  ],
32
32
  snippet: `<input type="date" min="2024-01-01" required>`,
33
+ handRolled: [
34
+ "building a month grid from Date arithmetic, with the leading blanks worked out from getDay",
35
+ "a text input with a placeholder like dd/mm/yyyy and a hand-written parser checking what was typed",
36
+ ],
33
37
  },
34
38
  };
35
39
  //# sourceMappingURL=date-time-input.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"date-time-input.js","sourceRoot":"","sources":["../../src/rules/date-time-input.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAS;IACjC,EAAE,EAAE,iBAAiB;IACrB,KAAK,EAAE,uBAAuB;IAC9B,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE;QACR,kBAAkB;QAClB,WAAW;QACX,iBAAiB;QACjB,kBAAkB;QAClB,qBAAqB;QACrB,iBAAiB;KAClB;IACD,UAAU,EAAE,CAAC,iBAAiB,CAAC;IAC/B,MAAM,EAAE,6CAA6C;IACrD,KAAK,EAAE;QACL,SAAS,EACP,8YAA8Y;QAChZ,OAAO,EAAE;;;SAGJ;QACL,MAAM,EACJ,iFAAiF;KACpF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,oDAAoD;QAC1D,MAAM,EAAE;YACN,+LAA+L;YAC/L,4GAA4G;YAC5G,iIAAiI;YACjI,6HAA6H;YAC7H,+GAA+G;SAChH;QACD,OAAO,EAAE,+CAA+C;KACzD;CACF,CAAC"}
1
+ {"version":3,"file":"date-time-input.js","sourceRoot":"","sources":["../../src/rules/date-time-input.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAS;IACjC,EAAE,EAAE,iBAAiB;IACrB,KAAK,EAAE,uBAAuB;IAC9B,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE;QACR,kBAAkB;QAClB,WAAW;QACX,iBAAiB;QACjB,kBAAkB;QAClB,qBAAqB;QACrB,iBAAiB;KAClB;IACD,UAAU,EAAE,CAAC,iBAAiB,CAAC;IAC/B,MAAM,EAAE,6CAA6C;IACrD,KAAK,EAAE;QACL,SAAS,EACP,8YAA8Y;QAChZ,OAAO,EAAE;;;SAGJ;QACL,MAAM,EACJ,iFAAiF;KACpF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,oDAAoD;QAC1D,MAAM,EAAE;YACN,+LAA+L;YAC/L,4GAA4G;YAC5G,iIAAiI;YACjI,6HAA6H;YAC7H,+GAA+G;SAChH;QACD,OAAO,EAAE,+CAA+C;QACxD,UAAU,EAAE;YACV,4FAA4F;YAC5F,mGAAmG;SACpG;KACF;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from "../schema.ts";
2
+ export declare const diacritics: Rule;
3
+ //# sourceMappingURL=diacritics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diacritics.d.ts","sourceRoot":"","sources":["../../src/rules/diacritics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,UAAU,EAAE,IAkCxB,CAAC"}
@@ -0,0 +1,34 @@
1
+ export const diacritics = {
2
+ id: "diacritics",
3
+ title: "Stripping accents from text",
4
+ category: "formatting",
5
+ replaces: ["remove-accents", "diacritics"],
6
+ featureIds: ["string-normalize"],
7
+ native: 'String.prototype.normalize("NFD")',
8
+ human: {
9
+ explainer: "These packages ship a character map to turn é into e, usually so a search box matches regardless of accents. Unicode already defines that transformation: normalising to NFD splits an accented character into its base letter and a separate combining mark, and a regex on the Diacritic property deletes the marks. Two lines, no table to keep current.",
10
+ snippet: `function stripAccents(text) {
11
+ // NFD splits "é" into "e" plus a combining accent, which the
12
+ // Diacritic property then matches on its own.
13
+ return text.normalize("NFD").replace(/\\p{Diacritic}/gu, "");
14
+ }
15
+
16
+ stripAccents("Crème Brûlée"); // "Creme Brulee"`,
17
+ mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize",
18
+ },
19
+ agent: {
20
+ when: "removing accents from text so a comparison or a search ignores them",
21
+ unless: [
22
+ 'Letters whose mark is not a combining accent have to be handled too. NFD leaves them whole, so "Łódź" becomes "Łodz" with the Ł intact, and the same goes for ø, đ and ß. A language with those letters still needs a character map.',
23
+ 'You need locale-correct transliteration rather than stripping. German expects "Schön" to become "schoen", and this gives "Schon", which is a different word.',
24
+ "You romanise non-Latin text. Cyrillic, Greek, Arabic and CJK have no base Latin letter to fall back to, so nothing is removed and the string comes back unchanged.",
25
+ "You are building URL slugs end to end. Stripping accents is one step of that job, and the rest, lowercasing, separator handling and collision suffixes, is why a slug library exists.",
26
+ ],
27
+ snippet: 'text.normalize("NFD").replace(/\\p{Diacritic}/gu, "");',
28
+ handRolled: [
29
+ "a hand-maintained object or array mapping accented characters to their unaccented forms",
30
+ "a chain of replace calls, one per accented letter the project has run into so far",
31
+ ],
32
+ },
33
+ };
34
+ //# sourceMappingURL=diacritics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diacritics.js","sourceRoot":"","sources":["../../src/rules/diacritics.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,YAAY;IAChB,KAAK,EAAE,6BAA6B;IACpC,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,gBAAgB,EAAE,YAAY,CAAC;IAC1C,UAAU,EAAE,CAAC,kBAAkB,CAAC;IAChC,MAAM,EAAE,mCAAmC;IAC3C,KAAK,EAAE;QACL,SAAS,EACP,6VAA6V;QAC/V,OAAO,EAAE;;;;;;gDAMmC;QAC5C,MAAM,EACJ,mGAAmG;KACtG;IACD,KAAK,EAAE;QACL,IAAI,EAAE,qEAAqE;QAC3E,MAAM,EAAE;YACN,sOAAsO;YACtO,8JAA8J;YAC9J,oKAAoK;YACpK,uLAAuL;SACxL;QACD,OAAO,EAAE,wDAAwD;QACjE,UAAU,EAAE;YACV,yFAAyF;YACzF,mFAAmF;SACpF;KACF;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../src/rules/dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,MAAM,EAAE,IA+DpB,CAAC"}
1
+ {"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../src/rules/dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,MAAM,EAAE,IAmEpB,CAAC"}
@@ -52,6 +52,10 @@ export const dialog = {
52
52
  </dialog>
53
53
  <script>document.querySelector("#d").showModal();</script>
54
54
  <style>dialog::backdrop { background: rgb(0 0 0 / 0.5); }</style>`,
55
+ handRolled: [
56
+ "a div with role=dialog and aria-modal, placed with position fixed and a z-index over the page",
57
+ "a document keydown listener added when an overlay opens and removed when it closes, only to catch Escape",
58
+ ],
55
59
  },
56
60
  guides: [
57
61
  "light-dismiss-a-dialog",
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.js","sourceRoot":"","sources":["../../src/rules/dialog.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAS;IAC1B,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,eAAe;IACtB,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE;QACR,aAAa;QACb,wBAAwB;QACxB,kBAAkB;QAClB,eAAe;QACf,YAAY;QACZ,aAAa;QACb,cAAc;QACd,iBAAiB;QACjB,eAAe;QACf,iBAAiB;KAClB;IACD,UAAU,EAAE,CAAC,QAAQ,CAAC;IACtB,MAAM,EAAE,2BAA2B;IACnC,KAAK,EAAE;QACL,SAAS,EACP,6XAA6X;QAC/X,OAAO,EAAE;;;;;;;;;;;;;;;;;SAiBJ;QACL,MAAM,EACJ,8EAA8E;KACjF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,uDAAuD;QAC7D,MAAM,EAAE;YACN,8IAA8I;YAC9I,gIAAgI;YAChI,oGAAoG;YACpG,yKAAyK;YACzK,6IAA6I;SAC9I;QACD,OAAO,EAAE;;;;kEAIqD;KAC/D;IACD,MAAM,EAAE;QACN,wBAAwB;QACxB,oCAAoC;QACpC,kCAAkC;QAClC,2BAA2B;KAC5B;CACF,CAAC"}
1
+ {"version":3,"file":"dialog.js","sourceRoot":"","sources":["../../src/rules/dialog.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAS;IAC1B,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,eAAe;IACtB,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE;QACR,aAAa;QACb,wBAAwB;QACxB,kBAAkB;QAClB,eAAe;QACf,YAAY;QACZ,aAAa;QACb,cAAc;QACd,iBAAiB;QACjB,eAAe;QACf,iBAAiB;KAClB;IACD,UAAU,EAAE,CAAC,QAAQ,CAAC;IACtB,MAAM,EAAE,2BAA2B;IACnC,KAAK,EAAE;QACL,SAAS,EACP,6XAA6X;QAC/X,OAAO,EAAE;;;;;;;;;;;;;;;;;SAiBJ;QACL,MAAM,EACJ,8EAA8E;KACjF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,uDAAuD;QAC7D,MAAM,EAAE;YACN,8IAA8I;YAC9I,gIAAgI;YAChI,oGAAoG;YACpG,yKAAyK;YACzK,6IAA6I;SAC9I;QACD,OAAO,EAAE;;;;kEAIqD;QAC9D,UAAU,EAAE;YACV,+FAA+F;YAC/F,0GAA0G;SAC3G;KACF;IACD,MAAM,EAAE;QACN,wBAAwB;QACxB,oCAAoC;QACpC,kCAAkC;QAClC,2BAA2B;KAC5B;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"discrete-transitions.d.ts","sourceRoot":"","sources":["../../src/rules/discrete-transitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,mBAAmB,EAAE,IA+DjC,CAAC"}
1
+ {"version":3,"file":"discrete-transitions.d.ts","sourceRoot":"","sources":["../../src/rules/discrete-transitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,mBAAmB,EAAE,IAmEjC,CAAC"}
@@ -54,6 +54,10 @@ export const discreteTransitions = {
54
54
  }
55
55
  @starting-style { .el { opacity: 0; } }
56
56
  .el[hidden] { display: none; opacity: 0; }`,
57
+ handRolled: [
58
+ "a setTimeout matching the CSS duration, so an element stays mounted long enough to animate out",
59
+ "an isClosing or isLeaving flag held only to keep something rendered while its exit animation runs",
60
+ ],
57
61
  },
58
62
  guides: [
59
63
  "animate-element-entry-exit",
@@ -1 +1 @@
1
- {"version":3,"file":"discrete-transitions.js","sourceRoot":"","sources":["../../src/rules/discrete-transitions.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAS;IACvC,EAAE,EAAE,sBAAsB;IAC1B,KAAK,EAAE,4BAA4B;IACnC,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE;QACR,eAAe;QACf,QAAQ;QACR,wBAAwB;QACxB,cAAc;KACf;IACD,UAAU,EAAE,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;IACrD,MAAM,EAAE,0DAA0D;IAClE,KAAK,EAAE;QACL,SAAS,EACP,6hBAA6hB;QAC/hB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;EAsBX;QACE,MAAM,EAAE,kEAAkE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,mFAAmF;QACzF,MAAM,EAAE;YACN,gOAAgO;YAChO,0KAA0K;YAC1K,0DAA0D;YAC1D,qHAAqH;YACrH,qHAAqH;YACrH,gHAAgH;YAChH,oKAAoK;SACrK;QACD,OAAO,EAAE;;;;;2CAK8B;KACxC;IACD,MAAM,EAAE;QACN,4BAA4B;QAC5B,sBAAsB;QACtB,4BAA4B;KAC7B;CACF,CAAC"}
1
+ {"version":3,"file":"discrete-transitions.js","sourceRoot":"","sources":["../../src/rules/discrete-transitions.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAS;IACvC,EAAE,EAAE,sBAAsB;IAC1B,KAAK,EAAE,4BAA4B;IACnC,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE;QACR,eAAe;QACf,QAAQ;QACR,wBAAwB;QACxB,cAAc;KACf;IACD,UAAU,EAAE,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;IACrD,MAAM,EAAE,0DAA0D;IAClE,KAAK,EAAE;QACL,SAAS,EACP,6hBAA6hB;QAC/hB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;EAsBX;QACE,MAAM,EAAE,kEAAkE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,mFAAmF;QACzF,MAAM,EAAE;YACN,gOAAgO;YAChO,0KAA0K;YAC1K,0DAA0D;YAC1D,qHAAqH;YACrH,qHAAqH;YACrH,gHAAgH;YAChH,oKAAoK;SACrK;QACD,OAAO,EAAE;;;;;2CAK8B;QACvC,UAAU,EAAE;YACV,gGAAgG;YAChG,mGAAmG;SACpG;KACF;IACD,MAAM,EAAE;QACN,4BAA4B;QAC5B,sBAAsB;QACtB,4BAA4B;KAC7B;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from "../schema.ts";
2
+ export declare const displayNames: Rule;
3
+ //# sourceMappingURL=display-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-names.d.ts","sourceRoot":"","sources":["../../src/rules/display-names.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,YAAY,EAAE,IAqC1B,CAAC"}
@@ -0,0 +1,37 @@
1
+ export const displayNames = {
2
+ id: "intl-display-names",
3
+ title: "Country and language names",
4
+ category: "formatting",
5
+ replaces: ["i18n-iso-countries", "country-list", "iso-639-1"],
6
+ featureIds: ["intl-display-names"],
7
+ native: "Intl.DisplayNames",
8
+ human: {
9
+ explainer: 'A list of country names is a data file, and one per language you support. i18n-iso-countries makes you register each locale you want; country-list and iso-639-1 carry English only. Intl.DisplayNames reads the names the browser already ships with its locale data, so "DE" renders as "Germany" in English and "Deutschland" in German with nothing bundled and nothing registered. It covers regions, languages, scripts and currencies through the same constructor.',
10
+ snippet: `const regions = new Intl.DisplayNames(["en"], { type: "region" });
11
+ regions.of("DE"); // "Germany"
12
+ regions.of("JP"); // "Japan"
13
+
14
+ new Intl.DisplayNames(["de"], { type: "language" }).of("fr");
15
+ // "Französisch"
16
+
17
+ new Intl.DisplayNames(["en"], { type: "currency" }).of("EUR");
18
+ // "Euro"`,
19
+ mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames",
20
+ },
21
+ agent: {
22
+ when: "turning a country, language, script or currency code into its name in a given locale",
23
+ unless: [
24
+ "You need the reverse lookup, from a name back to a code. These libraries index both directions, where Intl.DisplayNames only goes code to name.",
25
+ "You need to render a list of every country, for a select menu. Intl.DisplayNames answers one code at a time and publishes no enumeration, so the list of codes still has to come from somewhere.",
26
+ "You need data beyond the name: alpha-3 codes, numeric codes, calling codes or capitals. i18n-iso-countries carries those, and Intl.DisplayNames takes ISO 3166-1 alpha-2 or UN M49 and returns a string.",
27
+ "You assert exact strings in tests, or need output identical across browsers. Names come from each engine's own CLDR snapshot, so they differ between engines and can change when a browser updates.",
28
+ "The same code runs on a Node build compiled with small-icu, where only English data is present and every other locale silently falls back.",
29
+ ],
30
+ snippet: `new Intl.DisplayNames(["en"], { type: "region" }).of("DE"); // "Germany"`,
31
+ handRolled: [
32
+ "an object literal mapping country or language codes to English names, pasted in and extended as gaps turn up",
33
+ "a switch over locale codes returning a display string per case",
34
+ ],
35
+ },
36
+ };
37
+ //# sourceMappingURL=display-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-names.js","sourceRoot":"","sources":["../../src/rules/display-names.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAS;IAChC,EAAE,EAAE,oBAAoB;IACxB,KAAK,EAAE,4BAA4B;IACnC,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,oBAAoB,EAAE,cAAc,EAAE,WAAW,CAAC;IAC7D,UAAU,EAAE,CAAC,oBAAoB,CAAC;IAClC,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE;QACL,SAAS,EACP,4cAA4c;QAC9c,OAAO,EAAE;;;;;;;;UAQH;QACN,MAAM,EACJ,oGAAoG;KACvG;IACD,KAAK,EAAE;QACL,IAAI,EAAE,sFAAsF;QAC5F,MAAM,EAAE;YACN,iJAAiJ;YACjJ,kMAAkM;YAClM,0MAA0M;YAC1M,qMAAqM;YACrM,4IAA4I;SAC7I;QACD,OAAO,EAAE,0EAA0E;QACnF,UAAU,EAAE;YACV,8GAA8G;YAC9G,gEAAgE;SACjE;KACF;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"drag-and-drop.d.ts","sourceRoot":"","sources":["../../src/rules/drag-and-drop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,WAAW,EAAE,IA+CzB,CAAC"}
1
+ {"version":3,"file":"drag-and-drop.d.ts","sourceRoot":"","sources":["../../src/rules/drag-and-drop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,WAAW,EAAE,IAmDzB,CAAC"}
@@ -42,6 +42,10 @@ el.addEventListener("dragstart", (e) => e.dataTransfer.setData("text/plain", id)
42
42
  // dragover must preventDefault or drop never fires.
43
43
  list.addEventListener("dragover", (e) => e.preventDefault());
44
44
  list.addEventListener("drop", (e) => { e.preventDefault(); /* reorder */ });`,
45
+ handRolled: [
46
+ "mousedown, mousemove and mouseup listeners tracking a pointer offset to move an element, with its original position held in state",
47
+ "an index swapped in an array when the pointer crosses a sibling, to reorder a list while a drag is in progress",
48
+ ],
45
49
  },
46
50
  };
47
51
  //# sourceMappingURL=drag-and-drop.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"drag-and-drop.js","sourceRoot":"","sources":["../../src/rules/drag-and-drop.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,EAAE,EAAE,eAAe;IACnB,KAAK,EAAE,+BAA+B;IACtC,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,CAAC,YAAY,EAAE,kBAAkB,CAAC;IAC5C,UAAU,EAAE,CAAC,aAAa,CAAC;IAC3B,MAAM,EAAE,+BAA+B;IACvC,KAAK,EAAE;QACL,SAAS,EACP,6YAA6Y;QAC/Y,OAAO,EAAE;;;;;;;;;;;;;;;;;;;UAmBH;QACN,MAAM,EACJ,yEAAyE;KAC5E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,iEAAiE;QACvE,MAAM,EAAE;YACN,0IAA0I;YAC1I,iMAAiM;YACjM,2KAA2K;YAC3K,2IAA2I;SAC5I;QACD,OAAO,EAAE;;;;6EAIgE;KAC1E;CACF,CAAC"}
1
+ {"version":3,"file":"drag-and-drop.js","sourceRoot":"","sources":["../../src/rules/drag-and-drop.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,EAAE,EAAE,eAAe;IACnB,KAAK,EAAE,+BAA+B;IACtC,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,CAAC,YAAY,EAAE,kBAAkB,CAAC;IAC5C,UAAU,EAAE,CAAC,aAAa,CAAC;IAC3B,MAAM,EAAE,+BAA+B;IACvC,KAAK,EAAE;QACL,SAAS,EACP,6YAA6Y;QAC/Y,OAAO,EAAE;;;;;;;;;;;;;;;;;;;UAmBH;QACN,MAAM,EACJ,yEAAyE;KAC5E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,iEAAiE;QACvE,MAAM,EAAE;YACN,0IAA0I;YAC1I,iMAAiM;YACjM,2KAA2K;YAC3K,2IAA2I;SAC5I;QACD,OAAO,EAAE;;;;6EAIgE;QACzE,UAAU,EAAE;YACV,mIAAmI;YACnI,gHAAgH;SACjH;KACF;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"duration-format.d.ts","sourceRoot":"","sources":["../../src/rules/duration-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,cAAc,EAAE,IAqC5B,CAAC"}
1
+ {"version":3,"file":"duration-format.d.ts","sourceRoot":"","sources":["../../src/rules/duration-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,cAAc,EAAE,IAwC5B,CAAC"}