@jomae/catalog 0.2.0 → 0.4.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 +2 -2
- package/dist/baseline.d.ts +11 -0
- package/dist/baseline.d.ts.map +1 -1
- package/dist/baseline.js +50 -1
- package/dist/baseline.js.map +1 -1
- package/dist/format.js +1 -1
- package/dist/format.js.map +1 -1
- package/dist/generated/baseline.d.ts +6 -0
- package/dist/generated/baseline.d.ts.map +1 -1
- package/dist/generated/baseline.js +512 -35
- package/dist/generated/baseline.js.map +1 -1
- package/dist/generated/sizes.d.ts.map +1 -1
- package/dist/generated/sizes.js +464 -9
- package/dist/generated/sizes.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/rules/abort-controller.d.ts +3 -0
- package/dist/rules/abort-controller.d.ts.map +1 -0
- package/dist/rules/abort-controller.js +25 -0
- package/dist/rules/abort-controller.js.map +1 -0
- package/dist/rules/accordion.d.ts.map +1 -1
- package/dist/rules/accordion.js +1 -0
- package/dist/rules/accordion.js.map +1 -1
- 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/broadcast-channel.d.ts +3 -0
- package/dist/rules/broadcast-channel.d.ts.map +1 -0
- package/dist/rules/broadcast-channel.js +25 -0
- package/dist/rules/broadcast-channel.js.map +1 -0
- package/dist/rules/carousel.d.ts.map +1 -1
- package/dist/rules/carousel.js +4 -0
- package/dist/rules/carousel.js.map +1 -1
- package/dist/rules/clipboard.d.ts +3 -0
- package/dist/rules/clipboard.d.ts.map +1 -0
- package/dist/rules/clipboard.js +32 -0
- package/dist/rules/clipboard.js.map +1 -0
- package/dist/rules/color-functions.d.ts.map +1 -1
- package/dist/rules/color-functions.js +9 -1
- package/dist/rules/color-functions.js.map +1 -1
- package/dist/rules/compression-streams.d.ts +3 -0
- package/dist/rules/compression-streams.d.ts.map +1 -0
- package/dist/rules/compression-streams.js +25 -0
- package/dist/rules/compression-streams.js.map +1 -0
- 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 +3 -0
- package/dist/rules/content-visibility.d.ts.map +1 -0
- package/dist/rules/content-visibility.js +33 -0
- package/dist/rules/content-visibility.js.map +1 -0
- package/dist/rules/date-time-input.d.ts +3 -0
- package/dist/rules/date-time-input.d.ts.map +1 -0
- package/dist/rules/date-time-input.js +33 -0
- package/dist/rules/date-time-input.js.map +1 -0
- package/dist/rules/dialog.d.ts.map +1 -1
- package/dist/rules/dialog.js +4 -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 +1 -0
- package/dist/rules/discrete-transitions.js.map +1 -1
- package/dist/rules/drag-and-drop.d.ts +3 -0
- package/dist/rules/drag-and-drop.d.ts.map +1 -0
- package/dist/rules/drag-and-drop.js +29 -0
- package/dist/rules/drag-and-drop.js.map +1 -0
- package/dist/rules/field-sizing.d.ts.map +1 -1
- package/dist/rules/field-sizing.js +8 -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 +1 -0
- package/dist/rules/fluid-type.js.map +1 -1
- package/dist/rules/focus-visible.d.ts +3 -0
- package/dist/rules/focus-visible.d.ts.map +1 -0
- package/dist/rules/focus-visible.js +26 -0
- package/dist/rules/focus-visible.js.map +1 -0
- package/dist/rules/fullscreen.d.ts +3 -0
- package/dist/rules/fullscreen.d.ts.map +1 -0
- package/dist/rules/fullscreen.js +28 -0
- package/dist/rules/fullscreen.js.map +1 -0
- package/dist/rules/height-animation.d.ts.map +1 -1
- package/dist/rules/height-animation.js +1 -0
- package/dist/rules/height-animation.js.map +1 -1
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +44 -0
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/intersection-observer.d.ts +3 -0
- package/dist/rules/intersection-observer.d.ts.map +1 -0
- package/dist/rules/intersection-observer.js +34 -0
- package/dist/rules/intersection-observer.js.map +1 -0
- package/dist/rules/lazy-loading.d.ts.map +1 -1
- package/dist/rules/lazy-loading.js +3 -0
- package/dist/rules/lazy-loading.js.map +1 -1
- package/dist/rules/line-clamp.d.ts +3 -0
- package/dist/rules/line-clamp.d.ts.map +1 -0
- package/dist/rules/line-clamp.js +38 -0
- package/dist/rules/line-clamp.js.map +1 -0
- package/dist/rules/masonry.d.ts.map +1 -1
- package/dist/rules/masonry.js +3 -0
- package/dist/rules/masonry.js.map +1 -1
- package/dist/rules/number-format.d.ts +3 -0
- package/dist/rules/number-format.d.ts.map +1 -0
- package/dist/rules/number-format.js +25 -0
- package/dist/rules/number-format.js.map +1 -0
- package/dist/rules/page-visibility.d.ts +3 -0
- package/dist/rules/page-visibility.d.ts.map +1 -0
- package/dist/rules/page-visibility.js +24 -0
- package/dist/rules/page-visibility.js.map +1 -0
- package/dist/rules/popover.d.ts.map +1 -1
- package/dist/rules/popover.js +3 -0
- package/dist/rules/popover.js.map +1 -1
- package/dist/rules/relative-time.d.ts +3 -0
- package/dist/rules/relative-time.d.ts.map +1 -0
- package/dist/rules/relative-time.js +23 -0
- package/dist/rules/relative-time.js.map +1 -0
- package/dist/rules/resizable-panels.d.ts +3 -0
- package/dist/rules/resizable-panels.d.ts.map +1 -0
- package/dist/rules/resizable-panels.js +34 -0
- package/dist/rules/resizable-panels.js.map +1 -0
- package/dist/rules/resize-observer.d.ts +3 -0
- package/dist/rules/resize-observer.d.ts.map +1 -0
- package/dist/rules/resize-observer.js +27 -0
- package/dist/rules/resize-observer.js.map +1 -0
- package/dist/rules/screen-wake-lock.d.ts +3 -0
- package/dist/rules/screen-wake-lock.d.ts.map +1 -0
- package/dist/rules/screen-wake-lock.js +23 -0
- package/dist/rules/screen-wake-lock.js.map +1 -0
- package/dist/rules/scroll-animations.d.ts.map +1 -1
- package/dist/rules/scroll-animations.js +1 -0
- 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 +1 -0
- package/dist/rules/scroll-lock.js.map +1 -1
- package/dist/rules/scrollbars.d.ts.map +1 -1
- package/dist/rules/scrollbars.js +4 -0
- package/dist/rules/scrollbars.js.map +1 -1
- package/dist/rules/select.d.ts.map +1 -1
- package/dist/rules/select.js +11 -1
- package/dist/rules/select.js.map +1 -1
- 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 +3 -0
- package/dist/rules/speech-recognition.d.ts.map +1 -0
- package/dist/rules/speech-recognition.js +27 -0
- package/dist/rules/speech-recognition.js.map +1 -0
- package/dist/rules/speech-synthesis.d.ts +3 -0
- package/dist/rules/speech-synthesis.d.ts.map +1 -0
- package/dist/rules/speech-synthesis.js +22 -0
- package/dist/rules/speech-synthesis.js.map +1 -0
- package/dist/rules/sticky.d.ts.map +1 -1
- package/dist/rules/sticky.js +3 -0
- package/dist/rules/sticky.js.map +1 -1
- package/dist/rules/structured-clone.d.ts +3 -0
- package/dist/rules/structured-clone.d.ts.map +1 -0
- package/dist/rules/structured-clone.js +21 -0
- package/dist/rules/structured-clone.js.map +1 -0
- package/dist/rules/text-box-trim.d.ts.map +1 -1
- package/dist/rules/text-box-trim.js +1 -0
- 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 +1 -0
- package/dist/rules/text-wrap-balance.js.map +1 -1
- package/dist/rules/view-transitions.d.ts.map +1 -1
- package/dist/rules/view-transitions.js +1 -0
- package/dist/rules/view-transitions.js.map +1 -1
- package/dist/rules/web-bluetooth.d.ts +3 -0
- package/dist/rules/web-bluetooth.d.ts.map +1 -0
- package/dist/rules/web-bluetooth.js +25 -0
- package/dist/rules/web-bluetooth.js.map +1 -0
- package/dist/rules/web-share.d.ts +3 -0
- package/dist/rules/web-share.d.ts.map +1 -0
- package/dist/rules/web-share.js +27 -0
- package/dist/rules/web-share.js.map +1 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +3 -1
- package/dist/schema.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
export const fieldSizing = {
|
|
2
2
|
id: "field-sizing",
|
|
3
3
|
title: "Auto-growing textareas",
|
|
4
|
-
replaces: [
|
|
4
|
+
replaces: [
|
|
5
|
+
"react-textarea-autosize",
|
|
6
|
+
"autosize",
|
|
7
|
+
"react-autosize-textarea",
|
|
8
|
+
"vue-textarea-autosize",
|
|
9
|
+
"ngx-autosize",
|
|
10
|
+
],
|
|
5
11
|
featureIds: ["field-sizing"],
|
|
6
12
|
native: "field-sizing: content",
|
|
7
13
|
human: {
|
|
@@ -19,6 +25,7 @@ input[type="text"] {
|
|
|
19
25
|
field-sizing: content;
|
|
20
26
|
min-width: 8ch;
|
|
21
27
|
}`,
|
|
28
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/CSS/field-sizing",
|
|
22
29
|
},
|
|
23
30
|
agent: {
|
|
24
31
|
when: "a textarea or input should grow to fit what the user has typed",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-sizing.js","sourceRoot":"","sources":["../../src/rules/field-sizing.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,wBAAwB;IAC/B,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"field-sizing.js","sourceRoot":"","sources":["../../src/rules/field-sizing.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,wBAAwB;IAC/B,QAAQ,EAAE;QACR,yBAAyB;QACzB,UAAU;QACV,yBAAyB;QACzB,uBAAuB;QACvB,cAAc;KACf;IACD,UAAU,EAAE,CAAC,cAAc,CAAC;IAC5B,MAAM,EAAE,uBAAuB;IAC/B,KAAK,EAAE;QACL,SAAS,EACP,oYAAoY;QACtY,OAAO,EAAE;;;;;;;;;;;;EAYX;QACE,MAAM,EAAE,+DAA+D;KACxE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,gEAAgE;QACtE,MAAM,EAAE;YACN,mNAAmN;YACnN,yFAAyF;YACzF,mFAAmF;SACpF;QACD,OAAO,EAAE;;;;EAIX;KACC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluid-type.d.ts","sourceRoot":"","sources":["../../src/rules/fluid-type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"fluid-type.d.ts","sourceRoot":"","sources":["../../src/rules/fluid-type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,SAAS,EAAE,IA8BvB,CAAC"}
|
package/dist/rules/fluid-type.js
CHANGED
|
@@ -15,6 +15,7 @@ export const fluidType = {
|
|
|
15
15
|
.card h2 {
|
|
16
16
|
font-size: clamp(1.25rem, 0.9rem + 2cqi, 2rem);
|
|
17
17
|
}`,
|
|
18
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/CSS/clamp",
|
|
18
19
|
},
|
|
19
20
|
agent: {
|
|
20
21
|
when: "a heading or display type should scale between a minimum and maximum size with the viewport",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluid-type.js","sourceRoot":"","sources":["../../src/rules/fluid-type.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAS;IAC7B,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,mBAAmB;IAC1B,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,CAAC;IAC7D,UAAU,EAAE,CAAC,eAAe,CAAC;IAC7B,MAAM,EAAE,+CAA+C;IACvD,KAAK,EAAE;QACL,SAAS,EACP,uaAAua;QACza,OAAO,EAAE;;;;;;;;EAQX;
|
|
1
|
+
{"version":3,"file":"fluid-type.js","sourceRoot":"","sources":["../../src/rules/fluid-type.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAS;IAC7B,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,mBAAmB;IAC1B,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,CAAC;IAC7D,UAAU,EAAE,CAAC,eAAe,CAAC;IAC7B,MAAM,EAAE,+CAA+C;IACvD,KAAK,EAAE;QACL,SAAS,EACP,uaAAua;QACza,OAAO,EAAE;;;;;;;;EAQX;QACE,MAAM,EAAE,wDAAwD;KACjE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,6FAA6F;QACnG,MAAM,EAAE;YACN,oMAAoM;YACpM,gGAAgG;YAChG,kDAAkD;SACnD;QACD,OAAO,EAAE;6DACgD;KAC1D;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-visible.d.ts","sourceRoot":"","sources":["../../src/rules/focus-visible.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,YAAY,EAAE,IAyB1B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export const focusVisible = {
|
|
2
|
+
id: "focus-visible",
|
|
3
|
+
title: "Keyboard-only focus styling",
|
|
4
|
+
replaces: ["focus-visible"],
|
|
5
|
+
featureIds: ["focus-visible"],
|
|
6
|
+
native: ":focus-visible",
|
|
7
|
+
human: {
|
|
8
|
+
explainer: "The focus-visible polyfill watches whether the last interaction was a keyboard press or a pointer click, then toggles a class so a mouse click doesn't leave a focus ring behind. The CSS pseudo-class :focus-visible does that same judgment call natively: the browser decides whether focus came from something that benefits from a visible ring, no JavaScript class-toggling required.",
|
|
9
|
+
snippet: `button:focus {
|
|
10
|
+
outline: none;
|
|
11
|
+
}
|
|
12
|
+
button:focus-visible {
|
|
13
|
+
outline: 2px solid var(--accent);
|
|
14
|
+
}`,
|
|
15
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible",
|
|
16
|
+
},
|
|
17
|
+
agent: {
|
|
18
|
+
when: "showing a focus ring only for keyboard or other non-pointer focus, not for a mouse click",
|
|
19
|
+
unless: [
|
|
20
|
+
"You need to support Internet Explorer or a browser old enough to predate :focus-visible, which the polyfill's JS-based heuristic still covers.",
|
|
21
|
+
"You need the exact same heuristic across every browser version, including ones that shipped :focus-visible before the spec's behavior settled. Small heuristic differences existed early on.",
|
|
22
|
+
],
|
|
23
|
+
snippet: "button:focus-visible { outline: 2px solid var(--accent); }",
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=focus-visible.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-visible.js","sourceRoot":"","sources":["../../src/rules/focus-visible.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAS;IAChC,EAAE,EAAE,eAAe;IACnB,KAAK,EAAE,6BAA6B;IACpC,QAAQ,EAAE,CAAC,eAAe,CAAC;IAC3B,UAAU,EAAE,CAAC,eAAe,CAAC;IAC7B,MAAM,EAAE,gBAAgB;IACxB,KAAK,EAAE;QACL,SAAS,EACP,8XAA8X;QAChY,OAAO,EAAE;;;;;EAKX;QACE,MAAM,EAAE,iEAAiE;KAC1E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,0FAA0F;QAChG,MAAM,EAAE;YACN,gJAAgJ;YAChJ,8LAA8L;SAC/L;QACD,OAAO,EAAE,4DAA4D;KACtE;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fullscreen.d.ts","sourceRoot":"","sources":["../../src/rules/fullscreen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,UAAU,EAAE,IA6BxB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const fullscreen = {
|
|
2
|
+
id: "fullscreen",
|
|
3
|
+
title: "Fullscreen toggling",
|
|
4
|
+
replaces: ["screenfull", "react-full-screen", "vue-fullscreen"],
|
|
5
|
+
featureIds: ["fullscreen"],
|
|
6
|
+
native: "Element.requestFullscreen()",
|
|
7
|
+
human: {
|
|
8
|
+
explainer: "screenfull's whole job is normalizing the vendor-prefixed versions of this API across engines. Now that every major browser ships the unprefixed requestFullscreen()/exitFullscreen() pair, that normalization layer is no longer needed for current versions.",
|
|
9
|
+
snippet: `async function toggleFullscreen(el) {
|
|
10
|
+
if (document.fullscreenElement) {
|
|
11
|
+
await document.exitFullscreen();
|
|
12
|
+
} else {
|
|
13
|
+
await el.requestFullscreen();
|
|
14
|
+
}
|
|
15
|
+
}`,
|
|
16
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullscreen",
|
|
17
|
+
},
|
|
18
|
+
agent: {
|
|
19
|
+
when: "toggling an element, such as a video player or image viewer, into and out of fullscreen",
|
|
20
|
+
unless: [
|
|
21
|
+
"You support Safari before version 16.4, where the unprefixed API only recently landed.",
|
|
22
|
+
"You're targeting iOS Safari specifically. It still doesn't support fullscreen on arbitrary elements, only on the built-in video player.",
|
|
23
|
+
"You need the older vendor-prefixed fallback chain screenfull still maintains for browsers this old.",
|
|
24
|
+
],
|
|
25
|
+
snippet: "document.fullscreenElement ? document.exitFullscreen() : el.requestFullscreen();",
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=fullscreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fullscreen.js","sourceRoot":"","sources":["../../src/rules/fullscreen.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,YAAY;IAChB,KAAK,EAAE,qBAAqB;IAC5B,QAAQ,EAAE,CAAC,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,CAAC;IAC/D,UAAU,EAAE,CAAC,YAAY,CAAC;IAC1B,MAAM,EAAE,6BAA6B;IACrC,KAAK,EAAE;QACL,SAAS,EACP,gQAAgQ;QAClQ,OAAO,EAAE;;;;;;EAMX;QACE,MAAM,EACJ,4EAA4E;KAC/E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,yFAAyF;QAC/F,MAAM,EAAE;YACN,wFAAwF;YACxF,yIAAyI;YACzI,qGAAqG;SACtG;QACD,OAAO,EACL,kFAAkF;KACrF;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"height-animation.d.ts","sourceRoot":"","sources":["../../src/rules/height-animation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"height-animation.d.ts","sourceRoot":"","sources":["../../src/rules/height-animation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,eAAe,EAAE,IA8C7B,CAAC"}
|
|
@@ -29,6 +29,7 @@ export const heightAnimation = {
|
|
|
29
29
|
.panel-alt[data-open] {
|
|
30
30
|
height: calc-size(auto, size);
|
|
31
31
|
}`,
|
|
32
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/CSS/calc-size",
|
|
32
33
|
},
|
|
33
34
|
agent: {
|
|
34
35
|
when: "animating a collapsible panel open and closed to its natural height",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"height-animation.js","sourceRoot":"","sources":["../../src/rules/height-animation.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,EAAE,EAAE,uBAAuB;IAC3B,KAAK,EAAE,0BAA0B;IACjC,QAAQ,EAAE,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,uBAAuB,CAAC;IAC7E,UAAU,EAAE,CAAC,kBAAkB,EAAE,WAAW,CAAC;IAC7C,MAAM,EAAE,kDAAkD;IAC1D,KAAK,EAAE;QACL,SAAS,EACP,ybAAyb;QAC3b,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;EAsBX;
|
|
1
|
+
{"version":3,"file":"height-animation.js","sourceRoot":"","sources":["../../src/rules/height-animation.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,EAAE,EAAE,uBAAuB;IAC3B,KAAK,EAAE,0BAA0B;IACjC,QAAQ,EAAE,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,uBAAuB,CAAC;IAC7E,UAAU,EAAE,CAAC,kBAAkB,EAAE,WAAW,CAAC;IAC7C,MAAM,EAAE,kDAAkD;IAC1D,KAAK,EAAE;QACL,SAAS,EACP,ybAAyb;QAC3b,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;EAsBX;QACE,MAAM,EAAE,4DAA4D;KACrE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,qEAAqE;QAC3E,MAAM,EAAE;YACN,4NAA4N;YAC5N,6IAA6I;YAC7I,gGAAgG;YAChG,8GAA8G;SAC/G;QACD,OAAO,EAAE;;oCAEuB;KACjC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AA8CzC;;;GAGG;AACH,eAAO,MAAM,KAAK,EAAE,SAAS,IAAI,EA6ChC,CAAC;AAEF,yBAAyB;AACzB,eAAO,MAAM,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAE/C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAEpD,CAAC"}
|
package/dist/rules/index.js
CHANGED
|
@@ -1,52 +1,96 @@
|
|
|
1
|
+
import { abortController } from "./abort-controller.js";
|
|
1
2
|
import { accordion } from "./accordion.js";
|
|
2
3
|
import { aspectRatio } from "./aspect-ratio.js";
|
|
4
|
+
import { broadcastChannel } from "./broadcast-channel.js";
|
|
3
5
|
import { carousel } from "./carousel.js";
|
|
6
|
+
import { clipboard } from "./clipboard.js";
|
|
4
7
|
import { colorFunctions } from "./color-functions.js";
|
|
8
|
+
import { compressionStreams } from "./compression-streams.js";
|
|
5
9
|
import { containerQueries } from "./container-queries.js";
|
|
10
|
+
import { contentVisibility } from "./content-visibility.js";
|
|
11
|
+
import { dateTimeInput } from "./date-time-input.js";
|
|
6
12
|
import { dialog } from "./dialog.js";
|
|
7
13
|
import { discreteTransitions } from "./discrete-transitions.js";
|
|
14
|
+
import { dragAndDrop } from "./drag-and-drop.js";
|
|
8
15
|
import { fieldSizing } from "./field-sizing.js";
|
|
9
16
|
import { fluidType } from "./fluid-type.js";
|
|
17
|
+
import { focusVisible } from "./focus-visible.js";
|
|
18
|
+
import { fullscreen } from "./fullscreen.js";
|
|
10
19
|
import { heightAnimation } from "./height-animation.js";
|
|
20
|
+
import { intersectionObserver } from "./intersection-observer.js";
|
|
11
21
|
import { lazyLoading } from "./lazy-loading.js";
|
|
22
|
+
import { lineClamp } from "./line-clamp.js";
|
|
12
23
|
import { masonry } from "./masonry.js";
|
|
24
|
+
import { numberFormat } from "./number-format.js";
|
|
25
|
+
import { pageVisibility } from "./page-visibility.js";
|
|
13
26
|
import { popover } from "./popover.js";
|
|
27
|
+
import { relativeTime } from "./relative-time.js";
|
|
28
|
+
import { resizablePanels } from "./resizable-panels.js";
|
|
29
|
+
import { resizeObserver } from "./resize-observer.js";
|
|
30
|
+
import { screenWakeLock } from "./screen-wake-lock.js";
|
|
14
31
|
import { scrollAnimations } from "./scroll-animations.js";
|
|
15
32
|
import { scrollLock } from "./scroll-lock.js";
|
|
16
33
|
import { scrollbars } from "./scrollbars.js";
|
|
17
34
|
import { select } from "./select.js";
|
|
18
35
|
import { smoothScroll } from "./smooth-scroll.js";
|
|
36
|
+
import { speechRecognition } from "./speech-recognition.js";
|
|
37
|
+
import { speechSynthesis } from "./speech-synthesis.js";
|
|
19
38
|
import { sticky } from "./sticky.js";
|
|
39
|
+
import { structuredCloneRule } from "./structured-clone.js";
|
|
20
40
|
import { textBoxTrim } from "./text-box-trim.js";
|
|
21
41
|
import { textWrapBalance } from "./text-wrap-balance.js";
|
|
22
42
|
import { viewTransitions } from "./view-transitions.js";
|
|
43
|
+
import { webBluetooth } from "./web-bluetooth.js";
|
|
44
|
+
import { webShare } from "./web-share.js";
|
|
23
45
|
/**
|
|
24
46
|
* Every rule in the catalog. Order is not significant: surfaces sort by
|
|
25
47
|
* replaceable weight or support tier, not by position here.
|
|
26
48
|
*/
|
|
27
49
|
export const rules = [
|
|
50
|
+
abortController,
|
|
28
51
|
accordion,
|
|
29
52
|
aspectRatio,
|
|
53
|
+
broadcastChannel,
|
|
30
54
|
carousel,
|
|
55
|
+
clipboard,
|
|
31
56
|
colorFunctions,
|
|
57
|
+
compressionStreams,
|
|
32
58
|
containerQueries,
|
|
59
|
+
contentVisibility,
|
|
60
|
+
dateTimeInput,
|
|
33
61
|
dialog,
|
|
34
62
|
discreteTransitions,
|
|
63
|
+
dragAndDrop,
|
|
35
64
|
fieldSizing,
|
|
36
65
|
fluidType,
|
|
66
|
+
focusVisible,
|
|
67
|
+
fullscreen,
|
|
37
68
|
heightAnimation,
|
|
69
|
+
intersectionObserver,
|
|
38
70
|
lazyLoading,
|
|
71
|
+
lineClamp,
|
|
39
72
|
masonry,
|
|
73
|
+
numberFormat,
|
|
74
|
+
pageVisibility,
|
|
40
75
|
popover,
|
|
76
|
+
relativeTime,
|
|
77
|
+
resizablePanels,
|
|
78
|
+
resizeObserver,
|
|
79
|
+
screenWakeLock,
|
|
41
80
|
scrollAnimations,
|
|
42
81
|
scrollLock,
|
|
43
82
|
scrollbars,
|
|
44
83
|
select,
|
|
45
84
|
smoothScroll,
|
|
85
|
+
speechRecognition,
|
|
86
|
+
speechSynthesis,
|
|
46
87
|
sticky,
|
|
88
|
+
structuredCloneRule,
|
|
47
89
|
textBoxTrim,
|
|
48
90
|
textWrapBalance,
|
|
49
91
|
viewTransitions,
|
|
92
|
+
webBluetooth,
|
|
93
|
+
webShare,
|
|
50
94
|
];
|
|
51
95
|
/** Lookup by rule id. */
|
|
52
96
|
export const rulesById = new Map(rules.map((rule) => [rule.id, rule]));
|
package/dist/rules/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intersection-observer.d.ts","sourceRoot":"","sources":["../../src/rules/intersection-observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,oBAAoB,EAAE,IAmClC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export const intersectionObserver = {
|
|
2
|
+
id: "intersection-observer",
|
|
3
|
+
title: "Visibility tracking",
|
|
4
|
+
replaces: [
|
|
5
|
+
"react-intersection-observer",
|
|
6
|
+
"react-visibility-sensor",
|
|
7
|
+
"react-in-viewport",
|
|
8
|
+
"svelte-intersection-observer",
|
|
9
|
+
],
|
|
10
|
+
featureIds: ["intersection-observer"],
|
|
11
|
+
native: "IntersectionObserver",
|
|
12
|
+
human: {
|
|
13
|
+
explainer: "These libraries all wrap the same browser API. IntersectionObserver watches an element and calls you back when it crosses a viewport threshold, without a scroll listener recalculating positions on every frame. Calling it directly removes a dependency for something the browser already does off the main thread.",
|
|
14
|
+
snippet: `const observer = new IntersectionObserver(
|
|
15
|
+
(entries) => {
|
|
16
|
+
for (const entry of entries) {
|
|
17
|
+
if (entry.isIntersecting) console.log("visible:", entry.target);
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
{ threshold: 0.5 },
|
|
21
|
+
);
|
|
22
|
+
observer.observe(document.querySelector("#target"));`,
|
|
23
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API",
|
|
24
|
+
},
|
|
25
|
+
agent: {
|
|
26
|
+
when: "running code when an element scrolls into or out of view, such as triggering analytics, infinite scroll, or an entrance animation",
|
|
27
|
+
unless: [
|
|
28
|
+
"You want a framework hook's ergonomics, such as a boolean and a ref, rather than managing an observer instance yourself. The library is doing less work than it looks like at that point, but it's still less code at each call site.",
|
|
29
|
+
"You need to track intersection against a scrolling ancestor other than the viewport in a browser old enough to have inconsistent support for the root option.",
|
|
30
|
+
],
|
|
31
|
+
snippet: "new IntersectionObserver((entries) => { ... }, { threshold: 0.5 });",
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=intersection-observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intersection-observer.js","sourceRoot":"","sources":["../../src/rules/intersection-observer.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAS;IACxC,EAAE,EAAE,uBAAuB;IAC3B,KAAK,EAAE,qBAAqB;IAC5B,QAAQ,EAAE;QACR,6BAA6B;QAC7B,yBAAyB;QACzB,mBAAmB;QACnB,8BAA8B;KAC/B;IACD,UAAU,EAAE,CAAC,uBAAuB,CAAC;IACrC,MAAM,EAAE,sBAAsB;IAC9B,KAAK,EAAE;QACL,SAAS,EACP,wTAAwT;QAC1T,OAAO,EAAE;;;;;;;;qDAQwC;QACjD,MAAM,EACJ,4EAA4E;KAC/E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,mIAAmI;QACzI,MAAM,EAAE;YACN,uOAAuO;YACvO,+JAA+J;SAChK;QACD,OAAO,EACL,qEAAqE;KACxE;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy-loading.d.ts","sourceRoot":"","sources":["../../src/rules/lazy-loading.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"lazy-loading.d.ts","sourceRoot":"","sources":["../../src/rules/lazy-loading.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,WAAW,EAAE,IAmCzB,CAAC"}
|
|
@@ -8,6 +8,8 @@ export const lazyLoading = {
|
|
|
8
8
|
"react-lazyload",
|
|
9
9
|
"react-lazy-load-image-component",
|
|
10
10
|
"yall-js",
|
|
11
|
+
"vue-lazyload",
|
|
12
|
+
"v-lazy-image",
|
|
11
13
|
],
|
|
12
14
|
featureIds: ["loading-lazy"],
|
|
13
15
|
native: 'loading="lazy"',
|
|
@@ -15,6 +17,7 @@ export const lazyLoading = {
|
|
|
15
17
|
explainer: "These libraries watch the viewport with an IntersectionObserver and swap a placeholder for the real src once an image or iframe scrolls close enough. The loading attribute does the same deferral without the observer, the placeholder markup, or the script that has to run before it can start. The browser decides how far ahead to fetch, so there is no distance threshold to tune.",
|
|
16
18
|
snippet: `<img src="/hero.jpg" alt="" loading="lazy" width="1200" height="630" />
|
|
17
19
|
<iframe src="https://example.com/embed" loading="lazy"></iframe>`,
|
|
20
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#loading",
|
|
18
21
|
},
|
|
19
22
|
agent: {
|
|
20
23
|
when: "deferring offscreen images or iframes so they load as the user scrolls to them",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy-loading.js","sourceRoot":"","sources":["../../src/rules/lazy-loading.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,gCAAgC;IACvC,QAAQ,EAAE;QACR,OAAO;QACP,WAAW;QACX,kBAAkB;QAClB,gBAAgB;QAChB,iCAAiC;QACjC,SAAS;
|
|
1
|
+
{"version":3,"file":"lazy-loading.js","sourceRoot":"","sources":["../../src/rules/lazy-loading.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,gCAAgC;IACvC,QAAQ,EAAE;QACR,OAAO;QACP,WAAW;QACX,kBAAkB;QAClB,gBAAgB;QAChB,iCAAiC;QACjC,SAAS;QACT,cAAc;QACd,cAAc;KACf;IACD,UAAU,EAAE,CAAC,cAAc,CAAC;IAC5B,MAAM,EAAE,gBAAgB;IACxB,KAAK,EAAE;QACL,SAAS,EACP,4XAA4X;QAC9X,OAAO,EAAE;iEACoD;QAC7D,MAAM,EACJ,uEAAuE;KAC1E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,gFAAgF;QACtF,MAAM,EAAE;YACN,gJAAgJ;YAChJ,6GAA6G;YAC7G,0IAA0I;YAC1I,4HAA4H;YAC5H,4GAA4G;SAC7G;QACD,OAAO,EAAE;8CACiC;KAC3C;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-clamp.d.ts","sourceRoot":"","sources":["../../src/rules/line-clamp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,SAAS,EAAE,IAuCvB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export const lineClamp = {
|
|
2
|
+
id: "line-clamp",
|
|
3
|
+
title: "Multi-line text truncation",
|
|
4
|
+
replaces: [
|
|
5
|
+
"react-clamp-lines",
|
|
6
|
+
"react-line-clamp",
|
|
7
|
+
"clamp-js",
|
|
8
|
+
"line-clamp",
|
|
9
|
+
"vue-clamp",
|
|
10
|
+
],
|
|
11
|
+
featureIds: [],
|
|
12
|
+
manualBaseline: {
|
|
13
|
+
status: "widely",
|
|
14
|
+
verifiedOn: "2026-09-03",
|
|
15
|
+
note: "web-features tracks the unprefixed line-clamp property under the ID 'line-clamp', which has near-zero real-world support. The -webkit- prefixed form this rule actually recommends has been supported in every major engine for years (Firefox since 68, Safari and Chrome far longer), so the automated resolution would misreport a decades-safe technique as limited availability.",
|
|
16
|
+
},
|
|
17
|
+
native: "-webkit-line-clamp",
|
|
18
|
+
human: {
|
|
19
|
+
explainer: "Truncating text after a fixed number of lines, with an ellipsis, used to mean measuring rendered line height in JavaScript and cutting the string by hand. The line-clamp property does it in CSS, no measuring and no re-running on resize or font load. Only the vendor-prefixed form is safe to use today; the unprefixed property is still landing.",
|
|
20
|
+
snippet: `.excerpt {
|
|
21
|
+
display: -webkit-box;
|
|
22
|
+
-webkit-box-orient: vertical;
|
|
23
|
+
-webkit-line-clamp: 3;
|
|
24
|
+
overflow: hidden;
|
|
25
|
+
}`,
|
|
26
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-line-clamp",
|
|
27
|
+
},
|
|
28
|
+
agent: {
|
|
29
|
+
when: "truncating a block of text to a fixed number of lines with an ellipsis",
|
|
30
|
+
unless: [
|
|
31
|
+
"You need to combine this with a display value other than -webkit-box on the same element, since the prefixed property requires it.",
|
|
32
|
+
"You need to know the exact character or word where the text was cut, for something like a 'read more' link that continues from that point.",
|
|
33
|
+
"You're relying on a build tool to add this prefix for you and it doesn't; -webkit-line-clamp still needs to be written by hand, autoprefixer tools do not treat it as one they add automatically in every configuration.",
|
|
34
|
+
],
|
|
35
|
+
snippet: ".excerpt { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden; }",
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=line-clamp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-clamp.js","sourceRoot":"","sources":["../../src/rules/line-clamp.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAS;IAC7B,EAAE,EAAE,YAAY;IAChB,KAAK,EAAE,4BAA4B;IACnC,QAAQ,EAAE;QACR,mBAAmB;QACnB,kBAAkB;QAClB,UAAU;QACV,YAAY;QACZ,WAAW;KACZ;IACD,UAAU,EAAE,EAAE;IACd,cAAc,EAAE;QACd,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,YAAY;QACxB,IAAI,EAAE,uXAAuX;KAC9X;IACD,MAAM,EAAE,oBAAoB;IAC5B,KAAK,EAAE;QACL,SAAS,EACP,yVAAyV;QAC3V,OAAO,EAAE;;;;;EAKX;QACE,MAAM,EACJ,qEAAqE;KACxE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,wEAAwE;QAC9E,MAAM,EAAE;YACN,oIAAoI;YACpI,4IAA4I;YAC5I,0NAA0N;SAC3N;QACD,OAAO,EACL,2GAA2G;KAC9G;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masonry.d.ts","sourceRoot":"","sources":["../../src/rules/masonry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"masonry.d.ts","sourceRoot":"","sources":["../../src/rules/masonry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,OAAO,EAAE,IA2DrB,CAAC"}
|
package/dist/rules/masonry.js
CHANGED
|
@@ -7,6 +7,8 @@ export const masonry = {
|
|
|
7
7
|
"react-masonry-component",
|
|
8
8
|
"muuri",
|
|
9
9
|
"react-photo-gallery",
|
|
10
|
+
"vue-masonry",
|
|
11
|
+
"vue-masonry-css",
|
|
10
12
|
],
|
|
11
13
|
featureIds: ["masonry"],
|
|
12
14
|
native: "CSS masonry item placement",
|
|
@@ -33,6 +35,7 @@ export const masonry = {
|
|
|
33
35
|
margin-bottom: 1rem;
|
|
34
36
|
}
|
|
35
37
|
}`,
|
|
38
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout/Masonry_layout",
|
|
36
39
|
},
|
|
37
40
|
agent: {
|
|
38
41
|
when: "laying out a gallery of items with varying heights into columns with no vertical gaps",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masonry.js","sourceRoot":"","sources":["../../src/rules/masonry.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,iBAAiB;IACxB,QAAQ,EAAE;QACR,mBAAmB;QACnB,gBAAgB;QAChB,yBAAyB;QACzB,OAAO;QACP,qBAAqB;
|
|
1
|
+
{"version":3,"file":"masonry.js","sourceRoot":"","sources":["../../src/rules/masonry.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,iBAAiB;IACxB,QAAQ,EAAE;QACR,mBAAmB;QACnB,gBAAgB;QAChB,yBAAyB;QACzB,OAAO;QACP,qBAAqB;QACrB,aAAa;QACb,iBAAiB;KAClB;IACD,UAAU,EAAE,CAAC,SAAS,CAAC;IACvB,MAAM,EAAE,4BAA4B;IACpC,KAAK,EAAE;QACL,SAAS,EACP,wiBAAwiB;QAC1iB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;EAoBX;QACE,MAAM,EACJ,iFAAiF;KACpF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,uFAAuF;QAC7F,MAAM,EAAE;YACN,8LAA8L;YAC9L,6EAA6E;YAC7E,iEAAiE;YACjE,yHAAyH;SAC1H;QACD,OAAO,EAAE;;;;;;;;EAQX;KACC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number-format.d.ts","sourceRoot":"","sources":["../../src/rules/number-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,YAAY,EAAE,IA0B1B,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export const numberFormat = {
|
|
2
|
+
id: "number-format",
|
|
3
|
+
title: "Locale-aware number and currency formatting",
|
|
4
|
+
replaces: ["numeral", "accounting", "currency.js", "format-number"],
|
|
5
|
+
featureIds: ["intl"],
|
|
6
|
+
native: "Intl.NumberFormat",
|
|
7
|
+
human: {
|
|
8
|
+
explainer: "These libraries hardcode their own thousands separators, currency symbols, and rounding rules, and most ship a single locale by default. Intl.NumberFormat is the same formatting logic the operating system already has: pass a locale and a style, currency, percent, or unit, and it places the symbol, separator, and decimal grouping the way that locale actually expects, with no formatting rules to maintain.",
|
|
9
|
+
snippet: `new Intl.NumberFormat("en-US", {
|
|
10
|
+
style: "currency",
|
|
11
|
+
currency: "USD",
|
|
12
|
+
}).format(1234.5); // "$1,234.50"`,
|
|
13
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat",
|
|
14
|
+
},
|
|
15
|
+
agent: {
|
|
16
|
+
when: "formatting a number as currency, a percentage, a unit, or a locale-correct thousands-grouped number for display",
|
|
17
|
+
unless: [
|
|
18
|
+
"You need safe decimal arithmetic, such as adding money values without floating-point rounding errors. currency.js and accounting.js do that math for you; Intl.NumberFormat only formats a number you already computed correctly.",
|
|
19
|
+
"You need to parse a formatted string back into a number. Intl.NumberFormat is format-only; these libraries often provide the reverse direction too.",
|
|
20
|
+
"You need a custom format pattern, such as a specific abbreviation style, that the options Intl.NumberFormat exposes cannot express.",
|
|
21
|
+
],
|
|
22
|
+
snippet: 'new Intl.NumberFormat("en-US", { style: "currency", currency: "USD" }).format(value);',
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=number-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number-format.js","sourceRoot":"","sources":["../../src/rules/number-format.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAS;IAChC,EAAE,EAAE,eAAe;IACnB,KAAK,EAAE,6CAA6C;IACpD,QAAQ,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC;IACnE,UAAU,EAAE,CAAC,MAAM,CAAC;IACpB,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE;QACL,SAAS,EACP,wZAAwZ;QAC1Z,OAAO,EAAE;;;kCAGqB;QAC9B,MAAM,EACJ,oGAAoG;KACvG;IACD,KAAK,EAAE;QACL,IAAI,EAAE,iHAAiH;QACvH,MAAM,EAAE;YACN,mOAAmO;YACnO,qJAAqJ;YACrJ,qIAAqI;SACtI;QACD,OAAO,EACL,uFAAuF;KAC1F;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-visibility.d.ts","sourceRoot":"","sources":["../../src/rules/page-visibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,cAAc,EAAE,IAwB5B,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const pageVisibility = {
|
|
2
|
+
id: "page-visibility",
|
|
3
|
+
title: "Tab visibility",
|
|
4
|
+
replaces: ["react-page-visibility", "visibilityjs"],
|
|
5
|
+
featureIds: ["page-visibility"],
|
|
6
|
+
native: "document.visibilityState and the visibilitychange event",
|
|
7
|
+
human: {
|
|
8
|
+
explainer: "These libraries wrap document.visibilityState with framework-friendly plumbing around a value the browser already exposes. Reading it directly tells you whether the tab is the one the person is currently looking at, useful for pausing polling, video, or animation when it isn't.",
|
|
9
|
+
snippet: `document.addEventListener("visibilitychange", () => {
|
|
10
|
+
if (document.visibilityState === "hidden") pausePolling();
|
|
11
|
+
else resumePolling();
|
|
12
|
+
});`,
|
|
13
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/API/Document/visibilitychange_event",
|
|
14
|
+
},
|
|
15
|
+
agent: {
|
|
16
|
+
when: "pausing or resuming work, such as polling or video playback, based on whether the tab is visible",
|
|
17
|
+
unless: [
|
|
18
|
+
"You need a framework hook's re-render-on-change ergonomics rather than an event listener you manage yourself.",
|
|
19
|
+
"You need to distinguish a window occluded by another window from a genuinely backgrounded tab. visibilityState only reports the latter.",
|
|
20
|
+
],
|
|
21
|
+
snippet: `document.addEventListener("visibilitychange", () => { ... });`,
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=page-visibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-visibility.js","sourceRoot":"","sources":["../../src/rules/page-visibility.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,EAAE,EAAE,iBAAiB;IACrB,KAAK,EAAE,gBAAgB;IACvB,QAAQ,EAAE,CAAC,uBAAuB,EAAE,cAAc,CAAC;IACnD,UAAU,EAAE,CAAC,iBAAiB,CAAC;IAC/B,MAAM,EAAE,yDAAyD;IACjE,KAAK,EAAE;QACL,SAAS,EACP,wRAAwR;QAC1R,OAAO,EAAE;;;IAGT;QACA,MAAM,EACJ,kFAAkF;KACrF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,kGAAkG;QACxG,MAAM,EAAE;YACN,+GAA+G;YAC/G,yIAAyI;SAC1I;QACD,OAAO,EAAE,+DAA+D;KACzE;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../src/rules/popover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../src/rules/popover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,OAAO,EAAE,IAgErB,CAAC"}
|
package/dist/rules/popover.js
CHANGED
|
@@ -11,6 +11,8 @@ export const popover = {
|
|
|
11
11
|
"@tippyjs/react",
|
|
12
12
|
"react-popper",
|
|
13
13
|
"react-tooltip",
|
|
14
|
+
"floating-vue",
|
|
15
|
+
"v-tooltip",
|
|
14
16
|
],
|
|
15
17
|
featureIds: ["popover", "anchor-positioning"],
|
|
16
18
|
native: "The Popover API with CSS anchor positioning",
|
|
@@ -36,6 +38,7 @@ export const popover = {
|
|
|
36
38
|
}
|
|
37
39
|
</style>`,
|
|
38
40
|
demoUrl: "https://www.jomaendle.com/blog/html-popover",
|
|
41
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/API/Popover_API",
|
|
39
42
|
},
|
|
40
43
|
agent: {
|
|
41
44
|
when: "building a tooltip, dropdown menu or popover anchored to a trigger",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover.js","sourceRoot":"","sources":["../../src/rules/popover.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,4BAA4B;IAChC,KAAK,EAAE,kCAAkC;IACzC,QAAQ,EAAE;QACR,oBAAoB;QACpB,wBAAwB;QACxB,kBAAkB;QAClB,gBAAgB;QAChB,WAAW;QACX,UAAU;QACV,gBAAgB;QAChB,cAAc;QACd,eAAe;
|
|
1
|
+
{"version":3,"file":"popover.js","sourceRoot":"","sources":["../../src/rules/popover.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,4BAA4B;IAChC,KAAK,EAAE,kCAAkC;IACzC,QAAQ,EAAE;QACR,oBAAoB;QACpB,wBAAwB;QACxB,kBAAkB;QAClB,gBAAgB;QAChB,WAAW;QACX,UAAU;QACV,gBAAgB;QAChB,cAAc;QACd,eAAe;QACf,cAAc;QACd,WAAW;KACZ;IACD,UAAU,EAAE,CAAC,SAAS,EAAE,oBAAoB,CAAC;IAC7C,MAAM,EAAE,6CAA6C;IACrD,KAAK,EAAE;QACL,SAAS,EACP,ugBAAugB;QACzgB,OAAO,EAAE;;;;;;;;;;;;;;;;;;SAkBJ;QACL,OAAO,EAAE,6CAA6C;QACtD,MAAM,EAAE,8DAA8D;KACvE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,oEAAoE;QAC1E,MAAM,EAAE;YACN,4KAA4K;YAC5K,iIAAiI;YACjI,0DAA0D;YAC1D,iHAAiH;YACjH,uEAAuE;SACxE;QACD,OAAO,EAAE;;;;;;;;;;SAUJ;KACN;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relative-time.d.ts","sourceRoot":"","sources":["../../src/rules/relative-time.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,YAAY,EAAE,IAwB1B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export const relativeTime = {
|
|
2
|
+
id: "relative-time",
|
|
3
|
+
title: "Relative time formatting",
|
|
4
|
+
replaces: ["javascript-time-ago", "timeago.js", "react-timeago"],
|
|
5
|
+
featureIds: ["intl-relative-time-format"],
|
|
6
|
+
native: "Intl.RelativeTimeFormat",
|
|
7
|
+
human: {
|
|
8
|
+
explainer: 'These libraries hardcode the phrasing for every locale they support: "5 minutes ago", "in 2 days", and all the plural and grammar rules behind them. Intl.RelativeTimeFormat is that same locale data, shipped inside the browser and kept current by the platform instead of a dependency you update by hand.',
|
|
9
|
+
snippet: `const rtf = new Intl.RelativeTimeFormat("en", { numeric: "auto" });
|
|
10
|
+
rtf.format(-5, "minute"); // "5 minutes ago"`,
|
|
11
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat",
|
|
12
|
+
},
|
|
13
|
+
agent: {
|
|
14
|
+
when: 'formatting a timestamp as relative text, such as "5 minutes ago" or "in 2 days"',
|
|
15
|
+
unless: [
|
|
16
|
+
'You need the value to keep ticking on its own, updating from "5 seconds ago" to "6 seconds ago" without a re-render you trigger yourself. Intl.RelativeTimeFormat only formats a value you pass it once; the scheduling these libraries add is still real code.',
|
|
17
|
+
'You need to pick the unit automatically from a raw millisecond difference. Intl.RelativeTimeFormat takes a number and a unit you already chose, such as "day" or "hour", not a duration it breaks down for you.',
|
|
18
|
+
"You need a locale Intl's relative-time data doesn't cover well on your target browsers, or offline locale data bundled ahead of time.",
|
|
19
|
+
],
|
|
20
|
+
snippet: 'new Intl.RelativeTimeFormat("en", { numeric: "auto" }).format(-5, "minute");',
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=relative-time.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relative-time.js","sourceRoot":"","sources":["../../src/rules/relative-time.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAS;IAChC,EAAE,EAAE,eAAe;IACnB,KAAK,EAAE,0BAA0B;IACjC,QAAQ,EAAE,CAAC,qBAAqB,EAAE,YAAY,EAAE,eAAe,CAAC;IAChE,UAAU,EAAE,CAAC,2BAA2B,CAAC;IACzC,MAAM,EAAE,yBAAyB;IACjC,KAAK,EAAE;QACL,SAAS,EACP,gTAAgT;QAClT,OAAO,EAAE;6CACgC;QACzC,MAAM,EACJ,0GAA0G;KAC7G;IACD,KAAK,EAAE;QACL,IAAI,EAAE,iFAAiF;QACvF,MAAM,EAAE;YACN,iQAAiQ;YACjQ,iNAAiN;YACjN,uIAAuI;SACxI;QACD,OAAO,EACL,8EAA8E;KACjF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resizable-panels.d.ts","sourceRoot":"","sources":["../../src/rules/resizable-panels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,eAAe,EAAE,IAkC7B,CAAC"}
|