@jomae/catalog 0.4.0 → 0.6.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.
- package/README.md +20 -2
- package/dist/baseline.d.ts +25 -0
- package/dist/baseline.d.ts.map +1 -1
- package/dist/baseline.js +25 -1
- package/dist/baseline.js.map +1 -1
- package/dist/categories.d.ts +20 -0
- package/dist/categories.d.ts.map +1 -0
- package/dist/categories.js +62 -0
- package/dist/categories.js.map +1 -0
- package/dist/detect.d.ts +2 -1
- package/dist/detect.d.ts.map +1 -1
- package/dist/detect.js +17 -2
- package/dist/detect.js.map +1 -1
- package/dist/generated/baseline-history.d.ts +21 -0
- package/dist/generated/baseline-history.d.ts.map +1 -0
- package/dist/generated/baseline-history.js +20 -0
- package/dist/generated/baseline-history.js.map +1 -0
- package/dist/generated/baseline.d.ts +10 -0
- package/dist/generated/baseline.d.ts.map +1 -1
- package/dist/generated/baseline.js +250 -67
- package/dist/generated/baseline.js.map +1 -1
- package/dist/generated/guides.d.ts +16 -0
- package/dist/generated/guides.d.ts.map +1 -0
- package/dist/generated/guides.js +153 -0
- package/dist/generated/guides.js.map +1 -0
- package/dist/generated/sizes.d.ts.map +1 -1
- package/dist/generated/sizes.js +280 -55
- package/dist/generated/sizes.js.map +1 -1
- package/dist/generated/support-claims.d.ts +15 -0
- package/dist/generated/support-claims.d.ts.map +1 -0
- package/dist/generated/support-claims.js +69 -0
- package/dist/generated/support-claims.js.map +1 -0
- package/dist/guides.d.ts +46 -0
- package/dist/guides.d.ts.map +1 -0
- package/dist/guides.js +55 -0
- package/dist/guides.js.map +1 -0
- package/dist/history.d.ts +11 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +14 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/rules/abort-controller.d.ts.map +1 -1
- package/dist/rules/abort-controller.js +2 -1
- package/dist/rules/abort-controller.js.map +1 -1
- package/dist/rules/accordion.d.ts.map +1 -1
- package/dist/rules/accordion.js +3 -0
- package/dist/rules/accordion.js.map +1 -1
- package/dist/rules/array-grouping.d.ts +3 -0
- package/dist/rules/array-grouping.d.ts.map +1 -0
- package/dist/rules/array-grouping.js +29 -0
- package/dist/rules/array-grouping.js.map +1 -0
- package/dist/rules/aspect-ratio.d.ts.map +1 -1
- package/dist/rules/aspect-ratio.js +1 -0
- package/dist/rules/aspect-ratio.js.map +1 -1
- package/dist/rules/base64.d.ts +3 -0
- package/dist/rules/base64.d.ts.map +1 -0
- package/dist/rules/base64.js +41 -0
- package/dist/rules/base64.js.map +1 -0
- package/dist/rules/broadcast-channel.d.ts.map +1 -1
- package/dist/rules/broadcast-channel.js +1 -0
- package/dist/rules/broadcast-channel.js.map +1 -1
- package/dist/rules/carousel.d.ts.map +1 -1
- package/dist/rules/carousel.js +7 -0
- package/dist/rules/carousel.js.map +1 -1
- package/dist/rules/clipboard.d.ts.map +1 -1
- package/dist/rules/clipboard.js +4 -1
- package/dist/rules/clipboard.js.map +1 -1
- package/dist/rules/color-functions.d.ts.map +1 -1
- package/dist/rules/color-functions.js +1 -0
- package/dist/rules/color-functions.js.map +1 -1
- package/dist/rules/compression-streams.d.ts.map +1 -1
- package/dist/rules/compression-streams.js +2 -1
- package/dist/rules/compression-streams.js.map +1 -1
- package/dist/rules/container-queries.d.ts.map +1 -1
- package/dist/rules/container-queries.js +2 -0
- package/dist/rules/container-queries.js.map +1 -1
- package/dist/rules/content-visibility.d.ts.map +1 -1
- package/dist/rules/content-visibility.js +3 -1
- package/dist/rules/content-visibility.js.map +1 -1
- package/dist/rules/custom-highlight.d.ts +3 -0
- package/dist/rules/custom-highlight.d.ts.map +1 -0
- package/dist/rules/custom-highlight.js +39 -0
- package/dist/rules/custom-highlight.js.map +1 -0
- package/dist/rules/date-time-input.d.ts.map +1 -1
- package/dist/rules/date-time-input.js +2 -0
- package/dist/rules/date-time-input.js.map +1 -1
- package/dist/rules/dialog.d.ts.map +1 -1
- package/dist/rules/dialog.js +8 -0
- package/dist/rules/dialog.js.map +1 -1
- package/dist/rules/discrete-transitions.d.ts.map +1 -1
- package/dist/rules/discrete-transitions.js +6 -0
- package/dist/rules/discrete-transitions.js.map +1 -1
- package/dist/rules/drag-and-drop.d.ts.map +1 -1
- package/dist/rules/drag-and-drop.js +26 -8
- package/dist/rules/drag-and-drop.js.map +1 -1
- package/dist/rules/duration-format.d.ts +3 -0
- package/dist/rules/duration-format.d.ts.map +1 -0
- package/dist/rules/duration-format.js +37 -0
- package/dist/rules/duration-format.js.map +1 -0
- package/dist/rules/event-target.d.ts +3 -0
- package/dist/rules/event-target.d.ts.map +1 -0
- package/dist/rules/event-target.js +51 -0
- package/dist/rules/event-target.js.map +1 -0
- package/dist/rules/fetch.d.ts +3 -0
- package/dist/rules/fetch.d.ts.map +1 -0
- package/dist/rules/fetch.js +46 -0
- package/dist/rules/fetch.js.map +1 -0
- package/dist/rules/field-sizing.d.ts.map +1 -1
- package/dist/rules/field-sizing.js +3 -1
- package/dist/rules/field-sizing.js.map +1 -1
- package/dist/rules/fluid-type.d.ts.map +1 -1
- package/dist/rules/fluid-type.js +3 -1
- package/dist/rules/fluid-type.js.map +1 -1
- package/dist/rules/focus-visible.d.ts.map +1 -1
- package/dist/rules/focus-visible.js +1 -0
- package/dist/rules/focus-visible.js.map +1 -1
- package/dist/rules/fullscreen.d.ts.map +1 -1
- package/dist/rules/fullscreen.js +2 -1
- package/dist/rules/fullscreen.js.map +1 -1
- package/dist/rules/height-animation.d.ts.map +1 -1
- package/dist/rules/height-animation.js +2 -0
- package/dist/rules/height-animation.js.map +1 -1
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +64 -3
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/inert.d.ts +3 -0
- package/dist/rules/inert.d.ts.map +1 -0
- package/dist/rules/inert.js +37 -0
- package/dist/rules/inert.js.map +1 -0
- package/dist/rules/intersection-observer.d.ts.map +1 -1
- package/dist/rules/intersection-observer.js +2 -0
- package/dist/rules/intersection-observer.js.map +1 -1
- package/dist/rules/lazy-loading.d.ts.map +1 -1
- package/dist/rules/lazy-loading.js +2 -0
- package/dist/rules/lazy-loading.js.map +1 -1
- package/dist/rules/line-clamp.d.ts.map +1 -1
- package/dist/rules/line-clamp.js +2 -1
- package/dist/rules/line-clamp.js.map +1 -1
- package/dist/rules/masonry.d.ts.map +1 -1
- package/dist/rules/masonry.js +1 -0
- package/dist/rules/masonry.js.map +1 -1
- package/dist/rules/natural-sort.d.ts +3 -0
- package/dist/rules/natural-sort.d.ts.map +1 -0
- package/dist/rules/natural-sort.js +41 -0
- package/dist/rules/natural-sort.js.map +1 -0
- package/dist/rules/number-format.d.ts.map +1 -1
- package/dist/rules/number-format.js +3 -1
- package/dist/rules/number-format.js.map +1 -1
- package/dist/rules/page-visibility.d.ts.map +1 -1
- package/dist/rules/page-visibility.js +5 -0
- package/dist/rules/page-visibility.js.map +1 -1
- package/dist/rules/popover.d.ts.map +1 -1
- package/dist/rules/popover.js +8 -1
- package/dist/rules/popover.js.map +1 -1
- package/dist/rules/random-uuid.d.ts +3 -0
- package/dist/rules/random-uuid.d.ts.map +1 -0
- package/dist/rules/random-uuid.js +31 -0
- package/dist/rules/random-uuid.js.map +1 -0
- package/dist/rules/relative-time.d.ts.map +1 -1
- package/dist/rules/relative-time.js +1 -0
- package/dist/rules/relative-time.js.map +1 -1
- package/dist/rules/resizable-panels.d.ts.map +1 -1
- package/dist/rules/resizable-panels.js +4 -7
- package/dist/rules/resizable-panels.js.map +1 -1
- package/dist/rules/resize-observer.d.ts.map +1 -1
- package/dist/rules/resize-observer.js +2 -1
- package/dist/rules/resize-observer.js.map +1 -1
- package/dist/rules/screen-wake-lock.d.ts.map +1 -1
- package/dist/rules/screen-wake-lock.js +3 -1
- package/dist/rules/screen-wake-lock.js.map +1 -1
- package/dist/rules/scroll-animations.d.ts.map +1 -1
- package/dist/rules/scroll-animations.js +9 -1
- package/dist/rules/scroll-animations.js.map +1 -1
- package/dist/rules/scroll-lock.d.ts.map +1 -1
- package/dist/rules/scroll-lock.js +8 -7
- package/dist/rules/scroll-lock.js.map +1 -1
- package/dist/rules/scrollbars.d.ts.map +1 -1
- package/dist/rules/scrollbars.js +5 -0
- package/dist/rules/scrollbars.js.map +1 -1
- package/dist/rules/select.d.ts.map +1 -1
- package/dist/rules/select.js +7 -0
- package/dist/rules/select.js.map +1 -1
- package/dist/rules/server-sent-events.d.ts +3 -0
- package/dist/rules/server-sent-events.d.ts.map +1 -0
- package/dist/rules/server-sent-events.js +38 -0
- package/dist/rules/server-sent-events.js.map +1 -0
- package/dist/rules/smooth-scroll.d.ts.map +1 -1
- package/dist/rules/smooth-scroll.js +2 -0
- package/dist/rules/smooth-scroll.js.map +1 -1
- package/dist/rules/speech-recognition.d.ts.map +1 -1
- package/dist/rules/speech-recognition.js +19 -10
- package/dist/rules/speech-recognition.js.map +1 -1
- package/dist/rules/speech-synthesis.d.ts.map +1 -1
- package/dist/rules/speech-synthesis.js +3 -0
- package/dist/rules/speech-synthesis.js.map +1 -1
- package/dist/rules/sticky.d.ts.map +1 -1
- package/dist/rules/sticky.js +2 -0
- package/dist/rules/sticky.js.map +1 -1
- package/dist/rules/structured-clone.d.ts.map +1 -1
- package/dist/rules/structured-clone.js +13 -2
- package/dist/rules/structured-clone.js.map +1 -1
- package/dist/rules/text-box-trim.d.ts.map +1 -1
- package/dist/rules/text-box-trim.js +3 -1
- package/dist/rules/text-box-trim.js.map +1 -1
- package/dist/rules/text-wrap-balance.d.ts.map +1 -1
- package/dist/rules/text-wrap-balance.js +2 -0
- package/dist/rules/text-wrap-balance.js.map +1 -1
- package/dist/rules/url-search-params.d.ts +3 -0
- package/dist/rules/url-search-params.d.ts.map +1 -0
- package/dist/rules/url-search-params.js +42 -0
- package/dist/rules/url-search-params.js.map +1 -0
- package/dist/rules/view-transitions.d.ts.map +1 -1
- package/dist/rules/view-transitions.js +9 -0
- package/dist/rules/view-transitions.js.map +1 -1
- package/dist/rules/web-bluetooth.d.ts.map +1 -1
- package/dist/rules/web-bluetooth.js +1 -0
- package/dist/rules/web-bluetooth.js.map +1 -1
- package/dist/rules/web-crypto.d.ts +3 -0
- package/dist/rules/web-crypto.d.ts.map +1 -0
- package/dist/rules/web-crypto.js +32 -0
- package/dist/rules/web-crypto.js.map +1 -0
- package/dist/rules/web-share.d.ts.map +1 -1
- package/dist/rules/web-share.js +1 -0
- package/dist/rules/web-share.js.map +1 -1
- package/dist/schema.d.ts +22 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +63 -4
- package/dist/schema.js.map +1 -1
- package/dist/support.d.ts +11 -0
- package/dist/support.d.ts.map +1 -0
- package/dist/support.js +31 -0
- package/dist/support.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const resizeObserver = {
|
|
2
2
|
id: "resize-observer",
|
|
3
3
|
title: "Element resize tracking",
|
|
4
|
+
category: "async-data",
|
|
4
5
|
replaces: ["resize-observer-polyfill", "@juggle/resize-observer"],
|
|
5
6
|
featureIds: ["resize-observer"],
|
|
6
7
|
native: "ResizeObserver",
|
|
@@ -19,7 +20,7 @@ observer.observe(document.querySelector("#panel"));`,
|
|
|
19
20
|
unless: [
|
|
20
21
|
"You need a framework hook's ergonomics, such as a ref and a reactive size value, rather than managing an observer instance yourself.",
|
|
21
22
|
"You're targeting an engine old enough that the polyfill's manual measurement fallback is still doing real work.",
|
|
22
|
-
"You need devicePixelContentBoxSize specifically.
|
|
23
|
+
"You need devicePixelContentBoxSize specifically. Chrome has it from {{chrome:api.ResizeObserverEntry.devicePixelContentBoxSize}} and Firefox from {{firefox:api.ResizeObserverEntry.devicePixelContentBoxSize}}, but Safari does not implement it at all.",
|
|
23
24
|
],
|
|
24
25
|
snippet: "new ResizeObserver((entries) => { ... }).observe(el);",
|
|
25
26
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resize-observer.js","sourceRoot":"","sources":["../../src/rules/resize-observer.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,EAAE,EAAE,iBAAiB;IACrB,KAAK,EAAE,yBAAyB;IAChC,QAAQ,EAAE,CAAC,0BAA0B,EAAE,yBAAyB,CAAC;IACjE,UAAU,EAAE,CAAC,iBAAiB,CAAC;IAC/B,MAAM,EAAE,gBAAgB;IACxB,KAAK,EAAE;QACL,SAAS,EACP,+RAA+R;QACjS,OAAO,EAAE;;;;;oDAKuC;QAChD,MAAM,EAAE,iEAAiE;KAC1E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,4EAA4E;QAClF,MAAM,EAAE;YACN,sIAAsI;YACtI,iHAAiH;YACjH,
|
|
1
|
+
{"version":3,"file":"resize-observer.js","sourceRoot":"","sources":["../../src/rules/resize-observer.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,EAAE,EAAE,iBAAiB;IACrB,KAAK,EAAE,yBAAyB;IAChC,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,0BAA0B,EAAE,yBAAyB,CAAC;IACjE,UAAU,EAAE,CAAC,iBAAiB,CAAC;IAC/B,MAAM,EAAE,gBAAgB;IACxB,KAAK,EAAE;QACL,SAAS,EACP,+RAA+R;QACjS,OAAO,EAAE;;;;;oDAKuC;QAChD,MAAM,EAAE,iEAAiE;KAC1E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,4EAA4E;QAClF,MAAM,EAAE;YACN,sIAAsI;YACtI,iHAAiH;YACjH,2PAA2P;SAC5P;QACD,OAAO,EAAE,uDAAuD;KACjE;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen-wake-lock.d.ts","sourceRoot":"","sources":["../../src/rules/screen-wake-lock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"screen-wake-lock.d.ts","sourceRoot":"","sources":["../../src/rules/screen-wake-lock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,cAAc,EAAE,IAyB5B,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const screenWakeLock = {
|
|
2
2
|
id: "screen-wake-lock",
|
|
3
3
|
title: "Keeping the screen awake",
|
|
4
|
+
category: "device-apis",
|
|
4
5
|
replaces: ["nosleep.js", "react-use-wake-lock"],
|
|
5
6
|
featureIds: ["screen-wake-lock"],
|
|
6
7
|
native: 'navigator.wakeLock.request("screen")',
|
|
@@ -14,7 +15,8 @@ await lock.release();`,
|
|
|
14
15
|
agent: {
|
|
15
16
|
when: "keeping the screen from sleeping while a page is active, such as during a recipe, presentation, or workout",
|
|
16
17
|
unless: [
|
|
17
|
-
"You support Safari
|
|
18
|
+
"You support Safari below {{safari:api.WakeLock}} on desktop or below {{safari_ios:api.WakeLock}} on iOS. The phone cases this rule is for, a recipe or a workout screen, are exactly the ones iOS was last to allow.",
|
|
19
|
+
"You need the lock to survive the tab losing focus. The platform releases it the moment the tab backgrounds, with no way to opt out, so a library that re-acquires on visibilitychange is doing real work.",
|
|
18
20
|
"You need this in a non-secure (non-HTTPS) context, where the API isn't available at all.",
|
|
19
21
|
],
|
|
20
22
|
snippet: `const lock = await navigator.wakeLock.request("screen");`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen-wake-lock.js","sourceRoot":"","sources":["../../src/rules/screen-wake-lock.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,0BAA0B;IACjC,QAAQ,EAAE,CAAC,YAAY,EAAE,qBAAqB,CAAC;IAC/C,UAAU,EAAE,CAAC,kBAAkB,CAAC;IAChC,MAAM,EAAE,sCAAsC;IAC9C,KAAK,EAAE;QACL,SAAS,EACP,0RAA0R;QAC5R,OAAO,EAAE;;sBAES;QAClB,MAAM,EACJ,uEAAuE;KAC1E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,4GAA4G;QAClH,MAAM,EAAE;YACN,
|
|
1
|
+
{"version":3,"file":"screen-wake-lock.js","sourceRoot":"","sources":["../../src/rules/screen-wake-lock.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,0BAA0B;IACjC,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,CAAC,YAAY,EAAE,qBAAqB,CAAC;IAC/C,UAAU,EAAE,CAAC,kBAAkB,CAAC;IAChC,MAAM,EAAE,sCAAsC;IAC9C,KAAK,EAAE;QACL,SAAS,EACP,0RAA0R;QAC5R,OAAO,EAAE;;sBAES;QAClB,MAAM,EACJ,uEAAuE;KAC1E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,4GAA4G;QAClH,MAAM,EAAE;YACN,sNAAsN;YACtN,2MAA2M;YAC3M,0FAA0F;SAC3F;QACD,OAAO,EAAE,0DAA0D;KACpE;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-animations.d.ts","sourceRoot":"","sources":["../../src/rules/scroll-animations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"scroll-animations.d.ts","sourceRoot":"","sources":["../../src/rules/scroll-animations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,gBAAgB,EAAE,IAmE9B,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const scrollAnimations = {
|
|
2
2
|
id: "scroll-driven-animations",
|
|
3
3
|
title: "Scroll-triggered animations",
|
|
4
|
+
category: "animation",
|
|
4
5
|
replaces: ["aos", "scrollreveal", "wowjs", "wow.js", "scrollmagic", "rellax"],
|
|
5
6
|
featureIds: ["scroll-driven-animations"],
|
|
6
7
|
native: "animation-timeline: view() and scroll()",
|
|
@@ -40,7 +41,7 @@ export const scrollAnimations = {
|
|
|
40
41
|
agent: {
|
|
41
42
|
when: "fading or moving elements in as they scroll into view, or driving a reading-progress bar",
|
|
42
43
|
unless: [
|
|
43
|
-
"You need
|
|
44
|
+
"You need Firefox support. Chrome {{chrome:scroll-driven-animations}} and Safari {{safari:scroll-driven-animations}} ship scroll-driven animations but Firefox does not, so wrap them in @supports and make sure the un-animated state is the visible one.",
|
|
44
45
|
"You need a callback in JavaScript when an element enters view, for analytics, lazy loading or infinite scroll. That is what IntersectionObserver is for and CSS does not replace it.",
|
|
45
46
|
"You need to animate something that is not a descendant of, or a sibling reachable from, the scrolling element. Timeline scope is limited.",
|
|
46
47
|
"The animation must run once and stay put. A view timeline is scrubbed, so it reverses when the user scrolls back up.",
|
|
@@ -55,5 +56,12 @@ export const scrollAnimations = {
|
|
|
55
56
|
}
|
|
56
57
|
}`,
|
|
57
58
|
},
|
|
59
|
+
guides: [
|
|
60
|
+
"parallax-scroll-effects",
|
|
61
|
+
"scrollytelling",
|
|
62
|
+
"scroll-entry-exit-effects",
|
|
63
|
+
"scroll-progress-indicator",
|
|
64
|
+
"shrinking-header-on-scroll",
|
|
65
|
+
],
|
|
58
66
|
};
|
|
59
67
|
//# sourceMappingURL=scroll-animations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-animations.js","sourceRoot":"","sources":["../../src/rules/scroll-animations.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,EAAE,EAAE,0BAA0B;IAC9B,KAAK,EAAE,6BAA6B;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC;IAC7E,UAAU,EAAE,CAAC,0BAA0B,CAAC;IACxC,MAAM,EAAE,yCAAyC;IACjD,KAAK,EAAE;QACL,SAAS,EACP,ugBAAugB;QACzgB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BX;QACE,MAAM,EACJ,qEAAqE;KACxE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,0FAA0F;QAChG,MAAM,EAAE;YACN,
|
|
1
|
+
{"version":3,"file":"scroll-animations.js","sourceRoot":"","sources":["../../src/rules/scroll-animations.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,EAAE,EAAE,0BAA0B;IAC9B,KAAK,EAAE,6BAA6B;IACpC,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC;IAC7E,UAAU,EAAE,CAAC,0BAA0B,CAAC;IACxC,MAAM,EAAE,yCAAyC;IACjD,KAAK,EAAE;QACL,SAAS,EACP,ugBAAugB;QACzgB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BX;QACE,MAAM,EACJ,qEAAqE;KACxE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,0FAA0F;QAChG,MAAM,EAAE;YACN,2PAA2P;YAC3P,sLAAsL;YACtL,2IAA2I;YAC3I,sHAAsH;YACtH,4IAA4I;SAC7I;QACD,OAAO,EAAE;;;;;;;EAOX;KACC;IACD,MAAM,EAAE;QACN,yBAAyB;QACzB,gBAAgB;QAChB,2BAA2B;QAC3B,2BAA2B;QAC3B,4BAA4B;KAC7B;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-lock.d.ts","sourceRoot":"","sources":["../../src/rules/scroll-lock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"scroll-lock.d.ts","sourceRoot":"","sources":["../../src/rules/scroll-lock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,UAAU,EAAE,IA0CxB,CAAC"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
export const scrollLock = {
|
|
2
2
|
id: "overscroll-behavior",
|
|
3
3
|
title: "Scroll chaining and body scroll lock",
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
"
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
category: "scrolling",
|
|
5
|
+
replaces: ["body-scroll-lock"],
|
|
6
|
+
featureIds: [],
|
|
7
|
+
manualBaseline: {
|
|
8
|
+
status: "widely",
|
|
9
|
+
verifiedOn: "2026-09-06",
|
|
10
|
+
note: "web-features rolls the logical longhands (overscroll-behavior-block and -inline) into the 'overscroll-behavior' ID, which reports Chrome {{chrome:overscroll-behavior}}, Firefox {{firefox:overscroll-behavior}} and no Safari at all. All this rule uses is overscroll-behavior: contain, which BCD puts at Chrome {{chrome:css.properties.overscroll-behavior.contain}}, Firefox {{firefox:css.properties.overscroll-behavior.contain}} and Safari {{safari:css.properties.overscroll-behavior.contain}}. Deriving from that ID would badge a technique every engine has had for years as limited availability.",
|
|
11
|
+
},
|
|
11
12
|
native: "overscroll-behavior: contain",
|
|
12
13
|
human: {
|
|
13
14
|
explainer: "Reaching the end of a scrollable modal and having the page behind it start scrolling is scroll chaining. overscroll-behavior: contain stops the scroll at that boundary, which is the behaviour body-scroll-lock reimplements by fixing the body and compensating for the scrollbar. contain also disables pull-to-refresh inside that element, which is usually what you want in a drawer. Note that a modal opened with showModal() already blocks background scrolling, so check whether you need this at all.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-lock.js","sourceRoot":"","sources":["../../src/rules/scroll-lock.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,qBAAqB;IACzB,KAAK,EAAE,sCAAsC;IAC7C,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"scroll-lock.js","sourceRoot":"","sources":["../../src/rules/scroll-lock.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,qBAAqB;IACzB,KAAK,EAAE,sCAAsC;IAC7C,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,CAAC,kBAAkB,CAAC;IAC9B,UAAU,EAAE,EAAE;IACd,cAAc,EAAE;QACd,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,YAAY;QACxB,IAAI,EAAE,mlBAAmlB;KAC1lB;IACD,MAAM,EAAE,8BAA8B;IACtC,KAAK,EAAE;QACL,SAAS,EACP,mfAAmf;QACrf,OAAO,EAAE;;;;;;;;;;EAUX;QACE,MAAM,EACJ,sEAAsE;KACzE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,4FAA4F;QAClG,MAAM,EAAE;YACN,0KAA0K;YAC1K,2MAA2M;YAC3M,0IAA0I;YAC1I,kFAAkF;SACnF;QACD,OAAO,EAAE;;;EAGX;KACC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrollbars.d.ts","sourceRoot":"","sources":["../../src/rules/scrollbars.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"scrollbars.d.ts","sourceRoot":"","sources":["../../src/rules/scrollbars.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,UAAU,EAAE,IAoDxB,CAAC"}
|
package/dist/rules/scrollbars.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const scrollbars = {
|
|
2
2
|
id: "styled-scrollbars",
|
|
3
3
|
title: "Styled scrollbars",
|
|
4
|
+
category: "scrolling",
|
|
4
5
|
replaces: [
|
|
5
6
|
"react-custom-scrollbars",
|
|
6
7
|
"react-custom-scrollbars-2",
|
|
@@ -44,5 +45,9 @@ html {
|
|
|
44
45
|
scrollbar-color: #666 transparent;
|
|
45
46
|
}`,
|
|
46
47
|
},
|
|
48
|
+
guides: [
|
|
49
|
+
"customize-scrollbar-color-and-thickness",
|
|
50
|
+
"adapt-scrollbar-to-contrast-preferences",
|
|
51
|
+
],
|
|
47
52
|
};
|
|
48
53
|
//# sourceMappingURL=scrollbars.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrollbars.js","sourceRoot":"","sources":["../../src/rules/scrollbars.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,mBAAmB;IACvB,KAAK,EAAE,mBAAmB;IAC1B,QAAQ,EAAE;QACR,yBAAyB;QACzB,2BAA2B;QAC3B,WAAW;QACX,iBAAiB;QACjB,mBAAmB;QACnB,yBAAyB;QACzB,mBAAmB;QACnB,uBAAuB;QACvB,uBAAuB;QACvB,uBAAuB;KACxB;IACD,UAAU,EAAE,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,CAAC;IACtE,MAAM,EAAE,uDAAuD;IAC/D,KAAK,EAAE;QACL,SAAS,EACP,wdAAwd;QAC1d,OAAO,EAAE;;;;;;;;;;EAUX;QACE,MAAM,EAAE,kEAAkE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,gGAAgG;QACtG,MAAM,EAAE;YACN,iMAAiM;YACjM,yGAAyG;YACzG,6HAA6H;YAC7H,iHAAiH;SAClH;QACD,OAAO,EAAE;;;;EAIX;KACC;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"scrollbars.js","sourceRoot":"","sources":["../../src/rules/scrollbars.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,mBAAmB;IACvB,KAAK,EAAE,mBAAmB;IAC1B,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE;QACR,yBAAyB;QACzB,2BAA2B;QAC3B,WAAW;QACX,iBAAiB;QACjB,mBAAmB;QACnB,yBAAyB;QACzB,mBAAmB;QACnB,uBAAuB;QACvB,uBAAuB;QACvB,uBAAuB;KACxB;IACD,UAAU,EAAE,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,CAAC;IACtE,MAAM,EAAE,uDAAuD;IAC/D,KAAK,EAAE;QACL,SAAS,EACP,wdAAwd;QAC1d,OAAO,EAAE;;;;;;;;;;EAUX;QACE,MAAM,EAAE,kEAAkE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,gGAAgG;QACtG,MAAM,EAAE;YACN,iMAAiM;YACjM,yGAAyG;YACzG,6HAA6H;YAC7H,iHAAiH;SAClH;QACD,OAAO,EAAE;;;;EAIX;KACC;IACD,MAAM,EAAE;QACN,yCAAyC;QACzC,yCAAyC;KAC1C;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/rules/select.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/rules/select.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,MAAM,EAAE,IAsEpB,CAAC"}
|
package/dist/rules/select.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const select = {
|
|
2
2
|
id: "customizable-select",
|
|
3
3
|
title: "Custom select menus",
|
|
4
|
+
category: "forms",
|
|
4
5
|
replaces: [
|
|
5
6
|
"react-select",
|
|
6
7
|
"choices.js",
|
|
@@ -60,5 +61,11 @@ export const select = {
|
|
|
60
61
|
select, select::picker(select) { appearance: base-select; }
|
|
61
62
|
</style>`,
|
|
62
63
|
},
|
|
64
|
+
guides: [
|
|
65
|
+
"animated-select-picker",
|
|
66
|
+
"branded-select-styling",
|
|
67
|
+
"custom-select-picker-layouts",
|
|
68
|
+
"select-menu-interaction",
|
|
69
|
+
],
|
|
63
70
|
};
|
|
64
71
|
//# sourceMappingURL=select.js.map
|
package/dist/rules/select.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/rules/select.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAS;IAC1B,EAAE,EAAE,qBAAqB;IACzB,KAAK,EAAE,qBAAqB;IAC5B,QAAQ,EAAE;QACR,cAAc;QACd,YAAY;QACZ,SAAS;QACT,YAAY;QACZ,YAAY;QACZ,iBAAiB;QACjB,sBAAsB;QACtB,eAAe;KAChB;IACD,UAAU,EAAE,CAAC,qBAAqB,CAAC;IACnC,MAAM,EAAE,qCAAqC;IAC7C,KAAK,EAAE;QACL,SAAS,EACP,+YAA+Y;QACjZ,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;SA0BJ;QACL,MAAM,EAAE,6DAA6D;KACtE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,4EAA4E;QAClF,MAAM,EAAE;YACN,0LAA0L;YAC1L,qFAAqF;YACrF,gLAAgL;YAChL,qEAAqE;SACtE;QACD,OAAO,EAAE;;;;;;SAMJ;KACN;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/rules/select.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAS;IAC1B,EAAE,EAAE,qBAAqB;IACzB,KAAK,EAAE,qBAAqB;IAC5B,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE;QACR,cAAc;QACd,YAAY;QACZ,SAAS;QACT,YAAY;QACZ,YAAY;QACZ,iBAAiB;QACjB,sBAAsB;QACtB,eAAe;KAChB;IACD,UAAU,EAAE,CAAC,qBAAqB,CAAC;IACnC,MAAM,EAAE,qCAAqC;IAC7C,KAAK,EAAE;QACL,SAAS,EACP,+YAA+Y;QACjZ,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;SA0BJ;QACL,MAAM,EAAE,6DAA6D;KACtE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,4EAA4E;QAClF,MAAM,EAAE;YACN,0LAA0L;YAC1L,qFAAqF;YACrF,gLAAgL;YAChL,qEAAqE;SACtE;QACD,OAAO,EAAE;;;;;;SAMJ;KACN;IACD,MAAM,EAAE;QACN,wBAAwB;QACxB,wBAAwB;QACxB,8BAA8B;QAC9B,yBAAyB;KAC1B;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-sent-events.d.ts","sourceRoot":"","sources":["../../src/rules/server-sent-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,gBAAgB,EAAE,IAqC9B,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export const serverSentEvents = {
|
|
2
|
+
id: "server-sent-events",
|
|
3
|
+
title: "Server-sent events",
|
|
4
|
+
category: "async-data",
|
|
5
|
+
replaces: ["eventsource", "event-source-polyfill"],
|
|
6
|
+
featureIds: ["server-sent-events"],
|
|
7
|
+
native: "EventSource",
|
|
8
|
+
human: {
|
|
9
|
+
explainer: "EventSource opens a one-way stream from the server and hands you each message as an event. The browser owns the reconnection: if the connection drops it backs off and reconnects on its own, and it replays the last event ID so the server can resume where it left off. Both packages are ports of this API, written for Node or for browsers that predate it.",
|
|
10
|
+
snippet: `const source = new EventSource("/api/updates", {
|
|
11
|
+
withCredentials: true,
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
source.addEventListener("price", (event) => {
|
|
15
|
+
update(JSON.parse(event.data));
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
source.addEventListener("error", () => {
|
|
19
|
+
// The browser is already retrying. Close only to stop for good.
|
|
20
|
+
if (source.readyState === EventSource.CLOSED) reportOffline();
|
|
21
|
+
});`,
|
|
22
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/API/EventSource",
|
|
23
|
+
},
|
|
24
|
+
agent: {
|
|
25
|
+
when: "subscribing to a one-way stream of updates from a server",
|
|
26
|
+
unless: [
|
|
27
|
+
"You send an Authorization header on the connection. EventSource cannot set request headers at all, which is the single most common reason projects install the polyfill instead.",
|
|
28
|
+
"The stream needs a POST body or a method other than GET, in which case fetch with a ReadableStream is the platform answer rather than EventSource.",
|
|
29
|
+
"You need control over the reconnection: your own backoff, a retry cap, or a hard failure after N attempts. The browser's loop is not configurable from script.",
|
|
30
|
+
"The code runs in Node rather than a browser. A global EventSource arrived there only recently, and this package is the established client for older runtimes.",
|
|
31
|
+
"You need to inspect response status or headers on connect, for example to tell a 401 apart from a network drop. EventSource surfaces one opaque error event.",
|
|
32
|
+
],
|
|
33
|
+
snippet: `const source = new EventSource("/api/updates");
|
|
34
|
+
source.addEventListener("price", (e) => update(JSON.parse(e.data)));
|
|
35
|
+
source.close();`,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=server-sent-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-sent-events.js","sourceRoot":"","sources":["../../src/rules/server-sent-events.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,EAAE,EAAE,oBAAoB;IACxB,KAAK,EAAE,oBAAoB;IAC3B,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,aAAa,EAAE,uBAAuB,CAAC;IAClD,UAAU,EAAE,CAAC,oBAAoB,CAAC;IAClC,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE;QACL,SAAS,EACP,mWAAmW;QACrW,OAAO,EAAE;;;;;;;;;;;IAWT;QACA,MAAM,EAAE,8DAA8D;KACvE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,0DAA0D;QAChE,MAAM,EAAE;YACN,kLAAkL;YAClL,oJAAoJ;YACpJ,gKAAgK;YAChK,+JAA+J;YAC/J,8JAA8J;SAC/J;QACD,OAAO,EAAE;;gBAEG;KACb;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smooth-scroll.d.ts","sourceRoot":"","sources":["../../src/rules/smooth-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"smooth-scroll.d.ts","sourceRoot":"","sources":["../../src/rules/smooth-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,YAAY,EAAE,IA4C1B,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const smoothScroll = {
|
|
2
2
|
id: "smooth-scroll",
|
|
3
3
|
title: "Smooth scrolling and scroll-to-anchor",
|
|
4
|
+
category: "scrolling",
|
|
4
5
|
replaces: [
|
|
5
6
|
"react-scroll",
|
|
6
7
|
"smoothscroll-polyfill",
|
|
@@ -39,5 +40,6 @@ export const smoothScroll = {
|
|
|
39
40
|
}
|
|
40
41
|
[id] { scroll-margin-top: 5rem; }`,
|
|
41
42
|
},
|
|
43
|
+
guides: ["scroll-target-on-load"],
|
|
42
44
|
};
|
|
43
45
|
//# sourceMappingURL=smooth-scroll.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smooth-scroll.js","sourceRoot":"","sources":["../../src/rules/smooth-scroll.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAS;IAChC,EAAE,EAAE,eAAe;IACnB,KAAK,EAAE,uCAAuC;IAC9C,QAAQ,EAAE;QACR,cAAc;QACd,uBAAuB;QACvB,0BAA0B;QAC1B,eAAe;QACf,SAAS;QACT,cAAc;KACf;IACD,UAAU,EAAE,CAAC,iBAAiB,CAAC;IAC/B,MAAM,EAAE,gDAAgD;IACxD,KAAK,EAAE;QACL,SAAS,EACP,mYAAmY;QACrY,OAAO,EAAE;;;;;;;;;;EAUX;QACE,MAAM,EAAE,kEAAkE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,6DAA6D;QACnE,MAAM,EAAE;YACN,mHAAmH;YACnH,6GAA6G;YAC7G,gFAAgF;YAChF,8KAA8K;SAC/K;QACD,OAAO,EAAE;;;kCAGqB;KAC/B;
|
|
1
|
+
{"version":3,"file":"smooth-scroll.js","sourceRoot":"","sources":["../../src/rules/smooth-scroll.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAS;IAChC,EAAE,EAAE,eAAe;IACnB,KAAK,EAAE,uCAAuC;IAC9C,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE;QACR,cAAc;QACd,uBAAuB;QACvB,0BAA0B;QAC1B,eAAe;QACf,SAAS;QACT,cAAc;KACf;IACD,UAAU,EAAE,CAAC,iBAAiB,CAAC;IAC/B,MAAM,EAAE,gDAAgD;IACxD,KAAK,EAAE;QACL,SAAS,EACP,mYAAmY;QACrY,OAAO,EAAE;;;;;;;;;;EAUX;QACE,MAAM,EAAE,kEAAkE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,6DAA6D;QACnE,MAAM,EAAE;YACN,mHAAmH;YACnH,6GAA6G;YAC7G,gFAAgF;YAChF,8KAA8K;SAC/K;QACD,OAAO,EAAE;;;kCAGqB;KAC/B;IACD,MAAM,EAAE,CAAC,uBAAuB,CAAC;CAClC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speech-recognition.d.ts","sourceRoot":"","sources":["../../src/rules/speech-recognition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"speech-recognition.d.ts","sourceRoot":"","sources":["../../src/rules/speech-recognition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,iBAAiB,EAAE,IAoC/B,CAAC"}
|
|
@@ -1,27 +1,36 @@
|
|
|
1
1
|
export const speechRecognition = {
|
|
2
2
|
id: "speech-recognition",
|
|
3
3
|
title: "Voice input",
|
|
4
|
+
category: "device-apis",
|
|
4
5
|
replaces: ["annyang", "react-speech-recognition"],
|
|
5
6
|
featureIds: ["speech-recognition"],
|
|
6
7
|
native: "SpeechRecognition",
|
|
7
8
|
human: {
|
|
8
|
-
explainer: "annyang and react-speech-recognition both wrap the same underlying API, adding phrase matching or restart-on-silence logic around it. The API itself lets a page listen for speech and
|
|
9
|
-
snippet:
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
explainer: "annyang and react-speech-recognition both wrap the same underlying API, adding phrase matching or restart-on-silence logic around it. The API itself lets a page listen for speech and hands back a transcript with confidence scores. The constructor is the one part worth copying carefully: the unprefixed name only arrived in Chrome {{chrome:speech-recognition}}, and Safari has exposed it as webkitSpeechRecognition for years, so read both off the window before calling it.",
|
|
10
|
+
snippet: `// Unprefixed is Chrome {{chrome:speech-recognition}} and up. Safari has only
|
|
11
|
+
// the prefixed name,
|
|
12
|
+
// and reading it off window avoids a ReferenceError everywhere else.
|
|
13
|
+
const SpeechRecognitionCtor =
|
|
14
|
+
window.SpeechRecognition ?? window.webkitSpeechRecognition;
|
|
15
|
+
|
|
16
|
+
if (SpeechRecognitionCtor) {
|
|
17
|
+
const recognition = new SpeechRecognitionCtor();
|
|
18
|
+
recognition.onresult = (event) => {
|
|
19
|
+
console.log(event.results[0][0].transcript);
|
|
20
|
+
};
|
|
21
|
+
recognition.start();
|
|
22
|
+
}`,
|
|
14
23
|
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognition",
|
|
15
24
|
},
|
|
16
25
|
agent: {
|
|
17
26
|
when: "capturing a speech-to-text transcript directly in the browser",
|
|
18
27
|
unless: [
|
|
19
|
-
"You
|
|
28
|
+
"You want one constructor name that works everywhere. The unprefixed SpeechRecognition is Chrome and Edge {{chrome:speech-recognition}} and up, Safari has only webkitSpeechRecognition, and Firefox ships neither, so the feature detection is yours to write.",
|
|
20
29
|
"You need continuous recognition that automatically restarts after the browser's built-in silence timeout. That restart logic is exactly what these libraries still add.",
|
|
21
|
-
"You need
|
|
30
|
+
"You need recognition to stay on the device. Chrome sends audio to Google's servers by default, and on-device transcription is a separate opt-in rather than the behaviour you get for free.",
|
|
22
31
|
],
|
|
23
|
-
snippet: `const
|
|
24
|
-
|
|
32
|
+
snippet: `const Ctor = window.SpeechRecognition ?? window.webkitSpeechRecognition;
|
|
33
|
+
if (Ctor) new Ctor().start();`,
|
|
25
34
|
},
|
|
26
35
|
};
|
|
27
36
|
//# sourceMappingURL=speech-recognition.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speech-recognition.js","sourceRoot":"","sources":["../../src/rules/speech-recognition.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAS;IACrC,EAAE,EAAE,oBAAoB;IACxB,KAAK,EAAE,aAAa;IACpB,QAAQ,EAAE,CAAC,SAAS,EAAE,0BAA0B,CAAC;IACjD,UAAU,EAAE,CAAC,oBAAoB,CAAC;IAClC,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE;QACL,SAAS,EACP,
|
|
1
|
+
{"version":3,"file":"speech-recognition.js","sourceRoot":"","sources":["../../src/rules/speech-recognition.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAS;IACrC,EAAE,EAAE,oBAAoB;IACxB,KAAK,EAAE,aAAa;IACpB,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,CAAC,SAAS,EAAE,0BAA0B,CAAC;IACjD,UAAU,EAAE,CAAC,oBAAoB,CAAC;IAClC,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE;QACL,SAAS,EACP,0dAA0d;QAC5d,OAAO,EAAE;;;;;;;;;;;;EAYX;QACE,MAAM,EACJ,oEAAoE;KACvE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,+DAA+D;QACrE,MAAM,EAAE;YACN,gQAAgQ;YAChQ,yKAAyK;YACzK,6LAA6L;SAC9L;QACD,OAAO,EAAE;8BACiB;KAC3B;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speech-synthesis.d.ts","sourceRoot":"","sources":["../../src/rules/speech-synthesis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"speech-synthesis.d.ts","sourceRoot":"","sources":["../../src/rules/speech-synthesis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,eAAe,EAAE,IAwB7B,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const speechSynthesis = {
|
|
2
2
|
id: "speech-synthesis",
|
|
3
3
|
title: "Text to speech",
|
|
4
|
+
category: "device-apis",
|
|
4
5
|
replaces: ["speak-tts", "react-text-to-speech"],
|
|
5
6
|
featureIds: ["speech-synthesis"],
|
|
6
7
|
native: "SpeechSynthesis and SpeechSynthesisUtterance",
|
|
@@ -13,6 +14,8 @@ speechSynthesis.speak(utterance);`,
|
|
|
13
14
|
agent: {
|
|
14
15
|
when: "reading text aloud with the browser's own text-to-speech engine",
|
|
15
16
|
unless: [
|
|
17
|
+
"You need the voice list on first paint. speechSynthesis.getVoices() returns an empty array until the voiceschanged event fires, so a voice picker has to wait for it, and that timing is most of what speak-tts wraps.",
|
|
18
|
+
"You speak long passages in Chrome, which cuts an utterance off after roughly fifteen seconds unless something keeps resuming it.",
|
|
16
19
|
"You need a specific voice bundled with your app rather than whatever the person's operating system happens to have installed. Voice availability and quality vary by device.",
|
|
17
20
|
"You need the callback-based API wrapped in a promise, or queueing logic across multiple utterances. The library still saves real code there.",
|
|
18
21
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speech-synthesis.js","sourceRoot":"","sources":["../../src/rules/speech-synthesis.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,gBAAgB;IACvB,QAAQ,EAAE,CAAC,WAAW,EAAE,sBAAsB,CAAC;IAC/C,UAAU,EAAE,CAAC,kBAAkB,CAAC;IAChC,MAAM,EAAE,8CAA8C;IACtD,KAAK,EAAE;QACL,SAAS,EACP,oOAAoO;QACtO,OAAO,EAAE;kCACqB;QAC9B,MAAM,EAAE,kEAAkE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,iEAAiE;QACvE,MAAM,EAAE;YACN,8KAA8K;YAC9K,8IAA8I;SAC/I;QACD,OAAO,EAAE,4DAA4D;KACtE;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"speech-synthesis.js","sourceRoot":"","sources":["../../src/rules/speech-synthesis.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,gBAAgB;IACvB,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,CAAC,WAAW,EAAE,sBAAsB,CAAC;IAC/C,UAAU,EAAE,CAAC,kBAAkB,CAAC;IAChC,MAAM,EAAE,8CAA8C;IACtD,KAAK,EAAE;QACL,SAAS,EACP,oOAAoO;QACtO,OAAO,EAAE;kCACqB;QAC9B,MAAM,EAAE,kEAAkE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,iEAAiE;QACvE,MAAM,EAAE;YACN,wNAAwN;YACxN,kIAAkI;YAClI,8KAA8K;YAC9K,8IAA8I;SAC/I;QACD,OAAO,EAAE,4DAA4D;KACtE;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sticky.d.ts","sourceRoot":"","sources":["../../src/rules/sticky.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"sticky.d.ts","sourceRoot":"","sources":["../../src/rules/sticky.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,MAAM,EAAE,IA2CpB,CAAC"}
|
package/dist/rules/sticky.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const sticky = {
|
|
2
2
|
id: "sticky-positioning",
|
|
3
3
|
title: "Sticky headers and sidebars",
|
|
4
|
+
category: "layout",
|
|
4
5
|
replaces: [
|
|
5
6
|
"sticky-js",
|
|
6
7
|
"stickyfill",
|
|
@@ -38,5 +39,6 @@ export const sticky = {
|
|
|
38
39
|
snippet: `.header { position: sticky; top: 0; z-index: 10; }
|
|
39
40
|
.sidebar { position: sticky; top: 5rem; align-self: start; }`,
|
|
40
41
|
},
|
|
42
|
+
guides: ["state-aware-sticky-headers", "scroll-position-aware-elements"],
|
|
41
43
|
};
|
|
42
44
|
//# sourceMappingURL=sticky.js.map
|
package/dist/rules/sticky.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sticky.js","sourceRoot":"","sources":["../../src/rules/sticky.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAS;IAC1B,EAAE,EAAE,oBAAoB;IACxB,KAAK,EAAE,6BAA6B;IACpC,QAAQ,EAAE;QACR,WAAW;QACX,YAAY;QACZ,cAAc;QACd,YAAY;QACZ,YAAY;QACZ,sBAAsB;QACtB,YAAY;KACb;IACD,UAAU,EAAE,CAAC,oBAAoB,CAAC;IAClC,MAAM,EAAE,kBAAkB;IAC1B,KAAK,EAAE;QACL,SAAS,EACP,iaAAia;QACna,OAAO,EAAE;;;;;;;;;;;EAWX;QACE,MAAM,EAAE,kEAAkE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,0EAA0E;QAChF,MAAM,EAAE;YACN,iLAAiL;YACjL,kLAAkL;YAClL,qFAAqF;SACtF;QACD,OAAO,EAAE;6DACgD;KAC1D;
|
|
1
|
+
{"version":3,"file":"sticky.js","sourceRoot":"","sources":["../../src/rules/sticky.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAS;IAC1B,EAAE,EAAE,oBAAoB;IACxB,KAAK,EAAE,6BAA6B;IACpC,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE;QACR,WAAW;QACX,YAAY;QACZ,cAAc;QACd,YAAY;QACZ,YAAY;QACZ,sBAAsB;QACtB,YAAY;KACb;IACD,UAAU,EAAE,CAAC,oBAAoB,CAAC;IAClC,MAAM,EAAE,kBAAkB;IAC1B,KAAK,EAAE;QACL,SAAS,EACP,iaAAia;QACna,OAAO,EAAE;;;;;;;;;;;EAWX;QACE,MAAM,EAAE,kEAAkE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,0EAA0E;QAChF,MAAM,EAAE;YACN,iLAAiL;YACjL,kLAAkL;YAClL,qFAAqF;SACtF;QACD,OAAO,EAAE;6DACgD;KAC1D;IACD,MAAM,EAAE,CAAC,4BAA4B,EAAE,gCAAgC,CAAC;CACzE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structured-clone.d.ts","sourceRoot":"","sources":["../../src/rules/structured-clone.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,mBAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"structured-clone.d.ts","sourceRoot":"","sources":["../../src/rules/structured-clone.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,mBAAmB,EAAE,IA+BjC,CAAC"}
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
export const structuredCloneRule = {
|
|
2
2
|
id: "structured-clone",
|
|
3
3
|
title: "Deep cloning",
|
|
4
|
-
|
|
4
|
+
category: "async-data",
|
|
5
|
+
replaces: [
|
|
6
|
+
"lodash.clonedeep",
|
|
7
|
+
"rfdc",
|
|
8
|
+
"clone",
|
|
9
|
+
"klona",
|
|
10
|
+
"clone-deep",
|
|
11
|
+
"fast-copy",
|
|
12
|
+
"just-clone",
|
|
13
|
+
],
|
|
5
14
|
featureIds: ["structured-clone"],
|
|
6
15
|
native: "structuredClone()",
|
|
7
16
|
human: {
|
|
@@ -12,8 +21,10 @@ export const structuredCloneRule = {
|
|
|
12
21
|
agent: {
|
|
13
22
|
when: "deep-copying plain data such as arrays, objects, Maps, Sets, and dates",
|
|
14
23
|
unless: [
|
|
15
|
-
"You need to clone functions
|
|
24
|
+
"You need to clone functions or DOM nodes. structuredClone throws a DataCloneError on both, where lodash's version drops what it cannot handle and carries on.",
|
|
25
|
+
"You clone class instances and need the prototype back. structuredClone does not throw here, which is the trap: it returns a plain object with the same fields and no methods, so the failure shows up later at the first method call.",
|
|
16
26
|
"You need to clone something containing a value structuredClone doesn't support, such as an Error's custom properties beyond message and name.",
|
|
27
|
+
"You clone large objects on a hot path and measured the difference. Being faster than structuredClone on plain data is the whole pitch of rfdc and fast-copy, and a benchmark on your own shapes is the only way to settle it.",
|
|
17
28
|
],
|
|
18
29
|
snippet: "const copy = structuredClone(original);",
|
|
19
30
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structured-clone.js","sourceRoot":"","sources":["../../src/rules/structured-clone.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAS;IACvC,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,cAAc;IACrB,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"structured-clone.js","sourceRoot":"","sources":["../../src/rules/structured-clone.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAS;IACvC,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,cAAc;IACrB,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE;QACR,kBAAkB;QAClB,MAAM;QACN,OAAO;QACP,OAAO;QACP,YAAY;QACZ,WAAW;QACX,YAAY;KACb;IACD,UAAU,EAAE,CAAC,kBAAkB,CAAC;IAChC,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE;QACL,SAAS,EACP,4SAA4S;QAC9S,OAAO,EAAE,yCAAyC;QAClD,MAAM,EAAE,kEAAkE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,wEAAwE;QAC9E,MAAM,EAAE;YACN,+JAA+J;YAC/J,uOAAuO;YACvO,+IAA+I;YAC/I,+NAA+N;SAChO;QACD,OAAO,EAAE,yCAAyC;KACnD;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-box-trim.d.ts","sourceRoot":"","sources":["../../src/rules/text-box-trim.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"text-box-trim.d.ts","sourceRoot":"","sources":["../../src/rules/text-box-trim.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,WAAW,EAAE,IAkCzB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const textBoxTrim = {
|
|
2
2
|
id: "text-box-trim",
|
|
3
3
|
title: "Trimming font leading",
|
|
4
|
+
category: "typography",
|
|
4
5
|
replaces: ["capsize", "@capsizecss/core", "@capsizecss/metrics"],
|
|
5
6
|
featureIds: ["text-box"],
|
|
6
7
|
native: "text-box-trim and text-box-edge",
|
|
@@ -23,11 +24,12 @@ export const textBoxTrim = {
|
|
|
23
24
|
agent: {
|
|
24
25
|
when: "removing a font's built-in leading so text sits flush in its box",
|
|
25
26
|
unless: [
|
|
26
|
-
"
|
|
27
|
+
"Your support target reaches below Chrome {{chrome:css.properties.text-box}}, Safari {{safari:css.properties.text-box}} or Firefox {{firefox:css.properties.text-box}}. Firefox was last to ship it, so on an older target the fallback is the untrimmed spacing you started with and your vertical rhythm shifts between browsers.",
|
|
27
28
|
"You need the computed metrics as numbers at build time, for example to generate spacing tokens or to lay out text in a canvas or a PDF. Capsize gives you values; CSS only affects rendering.",
|
|
28
29
|
"You need to support a font whose metrics are wrong or missing, which Capsize lets you override by hand.",
|
|
29
30
|
],
|
|
30
31
|
snippet: "h1 { text-box: trim-both cap alphabetic; }",
|
|
31
32
|
},
|
|
33
|
+
guides: ["precise-text-alignment"],
|
|
32
34
|
};
|
|
33
35
|
//# sourceMappingURL=text-box-trim.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-box-trim.js","sourceRoot":"","sources":["../../src/rules/text-box-trim.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,EAAE,EAAE,eAAe;IACnB,KAAK,EAAE,uBAAuB;IAC9B,QAAQ,EAAE,CAAC,SAAS,EAAE,kBAAkB,EAAE,qBAAqB,CAAC;IAChE,UAAU,EAAE,CAAC,UAAU,CAAC;IACxB,MAAM,EAAE,iCAAiC;IACzC,KAAK,EAAE;QACL,SAAS,EACP,+bAA+b;QACjc,OAAO,EAAE;;;;;;;;;;;EAWX;QACE,MAAM,EAAE,gEAAgE;KACzE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,kEAAkE;QACxE,MAAM,EAAE;YACN,
|
|
1
|
+
{"version":3,"file":"text-box-trim.js","sourceRoot":"","sources":["../../src/rules/text-box-trim.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,EAAE,EAAE,eAAe;IACnB,KAAK,EAAE,uBAAuB;IAC9B,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,SAAS,EAAE,kBAAkB,EAAE,qBAAqB,CAAC;IAChE,UAAU,EAAE,CAAC,UAAU,CAAC;IACxB,MAAM,EAAE,iCAAiC;IACzC,KAAK,EAAE;QACL,SAAS,EACP,+bAA+b;QACjc,OAAO,EAAE;;;;;;;;;;;EAWX;QACE,MAAM,EAAE,gEAAgE;KACzE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,kEAAkE;QACxE,MAAM,EAAE;YACN,oUAAoU;YACpU,+LAA+L;YAC/L,yGAAyG;SAC1G;QACD,OAAO,EAAE,4CAA4C;KACtD;IACD,MAAM,EAAE,CAAC,wBAAwB,CAAC;CACnC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-wrap-balance.d.ts","sourceRoot":"","sources":["../../src/rules/text-wrap-balance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"text-wrap-balance.d.ts","sourceRoot":"","sources":["../../src/rules/text-wrap-balance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,eAAe,EAAE,IAoC7B,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const textWrapBalance = {
|
|
2
2
|
id: "text-wrap-balance",
|
|
3
3
|
title: "Balanced headings",
|
|
4
|
+
category: "typography",
|
|
4
5
|
replaces: ["react-wrap-balancer", "balance-text"],
|
|
5
6
|
featureIds: ["text-wrap-balance"],
|
|
6
7
|
native: "text-wrap: balance",
|
|
@@ -31,5 +32,6 @@ p {
|
|
|
31
32
|
snippet: `h1, h2, h3 { text-wrap: balance; }
|
|
32
33
|
p { text-wrap: pretty; }`,
|
|
33
34
|
},
|
|
35
|
+
guides: ["improve-text-layout-and-legibility"],
|
|
34
36
|
};
|
|
35
37
|
//# sourceMappingURL=text-wrap-balance.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-wrap-balance.js","sourceRoot":"","sources":["../../src/rules/text-wrap-balance.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,EAAE,EAAE,mBAAmB;IACvB,KAAK,EAAE,mBAAmB;IAC1B,QAAQ,EAAE,CAAC,qBAAqB,EAAE,cAAc,CAAC;IACjD,UAAU,EAAE,CAAC,mBAAmB,CAAC;IACjC,MAAM,EAAE,oBAAoB;IAC5B,KAAK,EAAE;QACL,SAAS,EACP,qbAAqb;QACvb,OAAO,EAAE;;;;;;;;;;;EAWX;QACE,MAAM,EAAE,4DAA4D;KACrE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,gFAAgF;QACtF,MAAM,EAAE;YACN,4JAA4J;YAC5J,mKAAmK;YACnK,gIAAgI;YAChI,gJAAgJ;SACjJ;QACD,OAAO,EAAE;yBACY;KACtB;
|
|
1
|
+
{"version":3,"file":"text-wrap-balance.js","sourceRoot":"","sources":["../../src/rules/text-wrap-balance.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,EAAE,EAAE,mBAAmB;IACvB,KAAK,EAAE,mBAAmB;IAC1B,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,qBAAqB,EAAE,cAAc,CAAC;IACjD,UAAU,EAAE,CAAC,mBAAmB,CAAC;IACjC,MAAM,EAAE,oBAAoB;IAC5B,KAAK,EAAE;QACL,SAAS,EACP,qbAAqb;QACvb,OAAO,EAAE;;;;;;;;;;;EAWX;QACE,MAAM,EAAE,4DAA4D;KACrE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,gFAAgF;QACtF,MAAM,EAAE;YACN,4JAA4J;YAC5J,mKAAmK;YACnK,gIAAgI;YAChI,gJAAgJ;SACjJ;QACD,OAAO,EAAE;yBACY;KACtB;IACD,MAAM,EAAE,CAAC,oCAAoC,CAAC;CAC/C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-search-params.d.ts","sourceRoot":"","sources":["../../src/rules/url-search-params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,eAAe,EAAE,IAyC7B,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export const urlSearchParams = {
|
|
2
|
+
id: "url-search-params",
|
|
3
|
+
title: "Query string parsing",
|
|
4
|
+
category: "async-data",
|
|
5
|
+
replaces: ["query-string", "qs", "querystringify", "url-parse"],
|
|
6
|
+
featureIds: [],
|
|
7
|
+
manualBaseline: {
|
|
8
|
+
status: "widely",
|
|
9
|
+
verifiedOn: "2026-09-06",
|
|
10
|
+
note: "web-features folds URLSearchParams into the 'url' feature, which reports Chrome {{chrome:url}} and Safari {{safari:url}} because the URL constructor landed first. URLSearchParams itself is Chrome {{chrome:api.URLSearchParams}}, Firefox {{firefox:api.URLSearchParams}} and Safari {{safari:api.URLSearchParams}}. Deriving from 'url' would understate the floor by three Safari majors. Widely available on its own dates since 2017.",
|
|
11
|
+
},
|
|
12
|
+
native: "URLSearchParams and the URL constructor",
|
|
13
|
+
human: {
|
|
14
|
+
explainer: "URLSearchParams reads and writes query strings, handles percent-encoding in both directions, and gives you get, getAll, set, append and delete. new URL() does the same job for a whole address, so the hostname, the pathname and the search params come apart without a regular expression. Both have been in every browser since 2017 and in Node for as long, and both are what these libraries call underneath once you strip the option handling.",
|
|
15
|
+
snippet: `const url = new URL("/search?tag=css&tag=html&page=2", location.origin);
|
|
16
|
+
|
|
17
|
+
url.searchParams.getAll("tag"); // ["css", "html"]
|
|
18
|
+
url.searchParams.get("page"); // "2", a string
|
|
19
|
+
url.searchParams.set("page", "3");
|
|
20
|
+
|
|
21
|
+
// Build one from scratch.
|
|
22
|
+
new URLSearchParams({ q: "scroll snap", page: "1" }).toString();
|
|
23
|
+
// "q=scroll+snap&page=1"`,
|
|
24
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams",
|
|
25
|
+
},
|
|
26
|
+
agent: {
|
|
27
|
+
when: "reading or building a query string, or pulling a URL apart",
|
|
28
|
+
unless: [
|
|
29
|
+
"You parse nested objects or arrays from bracket syntax such as filter[status][]=open. That is the reason qs exists, and URLSearchParams has no equivalent.",
|
|
30
|
+
"You round-trip typed data through the query string. Every value comes back as a string, so numbers, booleans and null need converting at each read site.",
|
|
31
|
+
"You depend on the library's options: a custom array format, a configurable delimiter, sorted output, or comma-separated values parsed into arrays.",
|
|
32
|
+
"You parse untrusted input on a server and rely on qs's depth and parameterLimit guards against prototype pollution. URLSearchParams applies no limits of its own.",
|
|
33
|
+
"You need Node's legacy querystring semantics, where a repeated key gives an array rather than needing getAll().",
|
|
34
|
+
"Your support target reaches below Chrome {{chrome:api.URLSearchParams}}, Firefox {{firefox:api.URLSearchParams}} or Safari {{safari:api.URLSearchParams}}. The URL constructor arrived earlier than URLSearchParams, so a browser having one is not proof it has the other.",
|
|
35
|
+
],
|
|
36
|
+
snippet: `const params = new URLSearchParams(location.search);
|
|
37
|
+
params.get("page");
|
|
38
|
+
params.getAll("tag");
|
|
39
|
+
new URLSearchParams({ q: "css" }).toString();`,
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=url-search-params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-search-params.js","sourceRoot":"","sources":["../../src/rules/url-search-params.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,EAAE,EAAE,mBAAmB;IACvB,KAAK,EAAE,sBAAsB;IAC7B,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,cAAc,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,CAAC;IAC/D,UAAU,EAAE,EAAE;IACd,cAAc,EAAE;QACd,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,YAAY;QACxB,IAAI,EAAE,6aAA6a;KACpb;IACD,MAAM,EAAE,yCAAyC;IACjD,KAAK,EAAE;QACL,SAAS,EACP,ybAAyb;QAC3b,OAAO,EAAE;;;;;;;;0BAQa;QACtB,MAAM,EAAE,kEAAkE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,4DAA4D;QAClE,MAAM,EAAE;YACN,4JAA4J;YAC5J,0JAA0J;YAC1J,oJAAoJ;YACpJ,mKAAmK;YACnK,iHAAiH;YACjH,6QAA6Q;SAC9Q;QACD,OAAO,EAAE;;;8CAGiC;KAC3C;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-transitions.d.ts","sourceRoot":"","sources":["../../src/rules/view-transitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"view-transitions.d.ts","sourceRoot":"","sources":["../../src/rules/view-transitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,eAAe,EAAE,IA+D7B,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const viewTransitions = {
|
|
2
2
|
id: "view-transitions",
|
|
3
3
|
title: "Page and state transitions",
|
|
4
|
+
category: "animation",
|
|
4
5
|
replaces: [
|
|
5
6
|
"next-view-transitions",
|
|
6
7
|
"react-page-transition",
|
|
@@ -50,5 +51,13 @@ document.startViewTransition(() => {
|
|
|
50
51
|
::view-transition-group(*) { animation: none; }
|
|
51
52
|
}`,
|
|
52
53
|
},
|
|
54
|
+
guides: [
|
|
55
|
+
"same-document-transitions",
|
|
56
|
+
"cross-document-transitions",
|
|
57
|
+
"faster-spa-view-transitions",
|
|
58
|
+
"consistent-cross-document-transitions",
|
|
59
|
+
"directional-navigation-transitions",
|
|
60
|
+
"group-element-transitions",
|
|
61
|
+
],
|
|
53
62
|
};
|
|
54
63
|
//# sourceMappingURL=view-transitions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-transitions.js","sourceRoot":"","sources":["../../src/rules/view-transitions.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,4BAA4B;IACnC,QAAQ,EAAE;QACR,uBAAuB;QACvB,uBAAuB;QACvB,UAAU;QACV,MAAM;KACP;IACD,UAAU,EAAE,CAAC,kBAAkB,CAAC;IAChC,MAAM,EAAE,0BAA0B;IAClC,KAAK,EAAE;QACL,SAAS,EACP,gcAAgc;QAClc,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;EAoBX;QACE,MAAM,EACJ,uEAAuE;KAC1E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,+FAA+F;QACrG,MAAM,EAAE;YACN,+LAA+L;YAC/L,4JAA4J;YAC5J,6HAA6H;YAC7H,oGAAoG;YACpG,2FAA2F;SAC5F;QACD,OAAO,EAAE;;;;;EAKX;KACC;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"view-transitions.js","sourceRoot":"","sources":["../../src/rules/view-transitions.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,4BAA4B;IACnC,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE;QACR,uBAAuB;QACvB,uBAAuB;QACvB,UAAU;QACV,MAAM;KACP;IACD,UAAU,EAAE,CAAC,kBAAkB,CAAC;IAChC,MAAM,EAAE,0BAA0B;IAClC,KAAK,EAAE;QACL,SAAS,EACP,gcAAgc;QAClc,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;EAoBX;QACE,MAAM,EACJ,uEAAuE;KAC1E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,+FAA+F;QACrG,MAAM,EAAE;YACN,+LAA+L;YAC/L,4JAA4J;YAC5J,6HAA6H;YAC7H,oGAAoG;YACpG,2FAA2F;SAC5F;QACD,OAAO,EAAE;;;;;EAKX;KACC;IACD,MAAM,EAAE;QACN,2BAA2B;QAC3B,4BAA4B;QAC5B,6BAA6B;QAC7B,uCAAuC;QACvC,oCAAoC;QACpC,2BAA2B;KAC5B;CACF,CAAC"}
|