@jomae/catalog 0.7.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/baseline.d.ts +41 -2
- package/dist/baseline.d.ts.map +1 -1
- package/dist/baseline.js +52 -10
- package/dist/baseline.js.map +1 -1
- package/dist/detect.d.ts +26 -0
- package/dist/detect.d.ts.map +1 -1
- package/dist/detect.js +27 -1
- package/dist/detect.js.map +1 -1
- package/dist/generated/baseline-history.d.ts.map +1 -1
- package/dist/generated/baseline-history.js +17 -5
- package/dist/generated/baseline-history.js.map +1 -1
- package/dist/generated/baseline.d.ts.map +1 -1
- package/dist/generated/baseline.js +411 -35
- package/dist/generated/baseline.js.map +1 -1
- package/dist/generated/guides.d.ts.map +1 -1
- package/dist/generated/guides.js +26 -3
- package/dist/generated/guides.js.map +1 -1
- package/dist/generated/lint-rules.d.ts +26 -0
- package/dist/generated/lint-rules.d.ts.map +1 -0
- package/dist/generated/lint-rules.js +361 -0
- package/dist/generated/lint-rules.js.map +1 -0
- package/dist/generated/sizes.d.ts.map +1 -1
- package/dist/generated/sizes.js +408 -38
- package/dist/generated/sizes.js.map +1 -1
- package/dist/generated/support-claims.d.ts.map +1 -1
- package/dist/generated/support-claims.js +34 -3
- package/dist/generated/support-claims.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/lint.d.ts +53 -0
- package/dist/lint.d.ts.map +1 -0
- package/dist/lint.js +41 -0
- package/dist/lint.js.map +1 -0
- package/dist/markdown.d.ts +7 -0
- package/dist/markdown.d.ts.map +1 -1
- package/dist/markdown.js +81 -2
- package/dist/markdown.js.map +1 -1
- package/dist/rules/abort-controller.d.ts.map +1 -1
- package/dist/rules/abort-controller.js +3 -0
- 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.map +1 -1
- package/dist/rules/array-grouping.js +1 -0
- package/dist/rules/array-grouping.js.map +1 -1
- package/dist/rules/aspect-ratio.d.ts.map +1 -1
- package/dist/rules/aspect-ratio.js +4 -0
- package/dist/rules/aspect-ratio.js.map +1 -1
- package/dist/rules/base64.d.ts.map +1 -1
- package/dist/rules/base64.js +3 -0
- package/dist/rules/base64.js.map +1 -1
- package/dist/rules/broadcast-channel.d.ts.map +1 -1
- package/dist/rules/broadcast-channel.js +3 -0
- package/dist/rules/broadcast-channel.js.map +1 -1
- package/dist/rules/carousel.d.ts.map +1 -1
- package/dist/rules/carousel.js +5 -0
- package/dist/rules/carousel.js.map +1 -1
- package/dist/rules/clipboard.d.ts.map +1 -1
- package/dist/rules/clipboard.js +3 -0
- package/dist/rules/clipboard.js.map +1 -1
- package/dist/rules/color-functions.d.ts.map +1 -1
- package/dist/rules/color-functions.js +4 -0
- package/dist/rules/color-functions.js.map +1 -1
- package/dist/rules/container-queries.d.ts.map +1 -1
- package/dist/rules/container-queries.js +4 -0
- package/dist/rules/container-queries.js.map +1 -1
- package/dist/rules/cookie-store.d.ts +3 -0
- package/dist/rules/cookie-store.d.ts.map +1 -0
- package/dist/rules/cookie-store.js +38 -0
- package/dist/rules/cookie-store.js.map +1 -0
- package/dist/rules/css-has.d.ts +3 -0
- package/dist/rules/css-has.d.ts.map +1 -0
- package/dist/rules/css-has.js +35 -0
- package/dist/rules/css-has.js.map +1 -0
- package/dist/rules/css-nesting.d.ts +3 -0
- package/dist/rules/css-nesting.d.ts.map +1 -0
- package/dist/rules/css-nesting.js +35 -0
- package/dist/rules/css-nesting.js.map +1 -0
- package/dist/rules/date-format.d.ts +3 -0
- package/dist/rules/date-format.d.ts.map +1 -0
- package/dist/rules/date-format.js +33 -0
- package/dist/rules/date-format.js.map +1 -0
- package/dist/rules/date-time-input.d.ts.map +1 -1
- package/dist/rules/date-time-input.js +4 -0
- package/dist/rules/date-time-input.js.map +1 -1
- package/dist/rules/diacritics.d.ts +3 -0
- package/dist/rules/diacritics.d.ts.map +1 -0
- package/dist/rules/diacritics.js +34 -0
- package/dist/rules/diacritics.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 +4 -0
- package/dist/rules/discrete-transitions.js.map +1 -1
- package/dist/rules/display-names.d.ts +3 -0
- package/dist/rules/display-names.d.ts.map +1 -0
- package/dist/rules/display-names.js +37 -0
- package/dist/rules/display-names.js.map +1 -0
- package/dist/rules/drag-and-drop.d.ts.map +1 -1
- package/dist/rules/drag-and-drop.js +4 -0
- package/dist/rules/drag-and-drop.js.map +1 -1
- package/dist/rules/duration-format.d.ts.map +1 -1
- package/dist/rules/duration-format.js +3 -0
- package/dist/rules/duration-format.js.map +1 -1
- package/dist/rules/event-target.d.ts.map +1 -1
- package/dist/rules/event-target.js +1 -0
- package/dist/rules/event-target.js.map +1 -1
- package/dist/rules/fetch.d.ts.map +1 -1
- package/dist/rules/fetch.js +4 -0
- package/dist/rules/fetch.js.map +1 -1
- package/dist/rules/field-sizing.d.ts.map +1 -1
- package/dist/rules/field-sizing.js +4 -0
- package/dist/rules/field-sizing.js.map +1 -1
- package/dist/rules/file-download.d.ts +3 -0
- package/dist/rules/file-download.d.ts.map +1 -0
- package/dist/rules/file-download.js +40 -0
- package/dist/rules/file-download.js.map +1 -0
- package/dist/rules/file-drop.d.ts +3 -0
- package/dist/rules/file-drop.d.ts.map +1 -0
- package/dist/rules/file-drop.js +40 -0
- package/dist/rules/file-drop.js.map +1 -0
- package/dist/rules/focus-visible.d.ts.map +1 -1
- package/dist/rules/focus-visible.js +4 -0
- package/dist/rules/focus-visible.js.map +1 -1
- package/dist/rules/font-loading.d.ts +3 -0
- package/dist/rules/font-loading.d.ts.map +1 -0
- package/dist/rules/font-loading.js +33 -0
- package/dist/rules/font-loading.js.map +1 -0
- package/dist/rules/form-validation.d.ts +3 -0
- package/dist/rules/form-validation.d.ts.map +1 -0
- package/dist/rules/form-validation.js +40 -0
- package/dist/rules/form-validation.js.map +1 -0
- package/dist/rules/fullscreen.d.ts.map +1 -1
- package/dist/rules/fullscreen.js +3 -0
- package/dist/rules/fullscreen.js.map +1 -1
- package/dist/rules/height-animation.d.ts.map +1 -1
- package/dist/rules/height-animation.js +4 -0
- package/dist/rules/height-animation.js.map +1 -1
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +50 -0
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/inert.d.ts.map +1 -1
- package/dist/rules/inert.js +6 -0
- package/dist/rules/inert.js.map +1 -1
- package/dist/rules/intersection-observer.d.ts.map +1 -1
- package/dist/rules/intersection-observer.js +1 -0
- package/dist/rules/intersection-observer.js.map +1 -1
- package/dist/rules/jquery.d.ts +3 -0
- package/dist/rules/jquery.d.ts.map +1 -0
- package/dist/rules/jquery.js +37 -0
- package/dist/rules/jquery.js.map +1 -0
- package/dist/rules/lazy-loading.d.ts.map +1 -1
- package/dist/rules/lazy-loading.js +4 -0
- package/dist/rules/lazy-loading.js.map +1 -1
- package/dist/rules/light-dark.d.ts +3 -0
- package/dist/rules/light-dark.d.ts.map +1 -0
- package/dist/rules/light-dark.js +37 -0
- package/dist/rules/light-dark.js.map +1 -0
- package/dist/rules/line-clamp.d.ts.map +1 -1
- package/dist/rules/line-clamp.js +4 -0
- package/dist/rules/line-clamp.js.map +1 -1
- package/dist/rules/list-format.d.ts +3 -0
- package/dist/rules/list-format.d.ts.map +1 -0
- package/dist/rules/list-format.js +40 -0
- package/dist/rules/list-format.js.map +1 -0
- package/dist/rules/masonry.d.ts.map +1 -1
- package/dist/rules/masonry.js +4 -0
- package/dist/rules/masonry.js.map +1 -1
- package/dist/rules/match-media.d.ts +3 -0
- package/dist/rules/match-media.d.ts.map +1 -0
- package/dist/rules/match-media.js +36 -0
- package/dist/rules/match-media.js.map +1 -0
- package/dist/rules/natural-sort.d.ts.map +1 -1
- package/dist/rules/natural-sort.js +4 -0
- package/dist/rules/natural-sort.js.map +1 -1
- package/dist/rules/number-format.d.ts.map +1 -1
- package/dist/rules/number-format.js +14 -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 +3 -0
- package/dist/rules/page-visibility.js.map +1 -1
- package/dist/rules/passkeys.d.ts +3 -0
- package/dist/rules/passkeys.d.ts.map +1 -0
- package/dist/rules/passkeys.js +44 -0
- package/dist/rules/passkeys.js.map +1 -0
- package/dist/rules/plural-rules.d.ts +3 -0
- package/dist/rules/plural-rules.d.ts.map +1 -0
- package/dist/rules/plural-rules.js +33 -0
- package/dist/rules/plural-rules.js.map +1 -0
- package/dist/rules/pointer-events.d.ts +3 -0
- package/dist/rules/pointer-events.d.ts.map +1 -0
- package/dist/rules/pointer-events.js +43 -0
- package/dist/rules/pointer-events.js.map +1 -0
- package/dist/rules/popover.d.ts.map +1 -1
- package/dist/rules/popover.js +5 -0
- package/dist/rules/popover.js.map +1 -1
- package/dist/rules/progress-indicator.d.ts +3 -0
- package/dist/rules/progress-indicator.d.ts.map +1 -0
- package/dist/rules/progress-indicator.js +39 -0
- package/dist/rules/progress-indicator.js.map +1 -0
- package/dist/rules/random-uuid.d.ts.map +1 -1
- package/dist/rules/random-uuid.js +4 -0
- package/dist/rules/random-uuid.js.map +1 -1
- package/dist/rules/relative-time.d.ts.map +1 -1
- package/dist/rules/relative-time.js +4 -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 +3 -0
- 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 +4 -0
- 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 +4 -0
- 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 +4 -0
- package/dist/rules/scroll-animations.js.map +1 -1
- package/dist/rules/scroll-into-view.d.ts +3 -0
- package/dist/rules/scroll-into-view.d.ts.map +1 -0
- package/dist/rules/scroll-into-view.js +38 -0
- package/dist/rules/scroll-into-view.js.map +1 -0
- package/dist/rules/scroll-lock.d.ts.map +1 -1
- package/dist/rules/scroll-lock.js +3 -0
- package/dist/rules/scroll-lock.js.map +1 -1
- package/dist/rules/scrollbars.d.ts.map +1 -1
- package/dist/rules/scrollbars.js +3 -0
- package/dist/rules/scrollbars.js.map +1 -1
- package/dist/rules/segmenter.d.ts +3 -0
- package/dist/rules/segmenter.d.ts.map +1 -0
- package/dist/rules/segmenter.js +45 -0
- package/dist/rules/segmenter.js.map +1 -0
- package/dist/rules/select.d.ts.map +1 -1
- package/dist/rules/select.js +4 -0
- package/dist/rules/select.js.map +1 -1
- package/dist/rules/server-sent-events.d.ts.map +1 -1
- package/dist/rules/server-sent-events.js +4 -0
- package/dist/rules/server-sent-events.js.map +1 -1
- package/dist/rules/signal-timeout.d.ts +3 -0
- package/dist/rules/signal-timeout.d.ts.map +1 -0
- package/dist/rules/signal-timeout.js +31 -0
- package/dist/rules/signal-timeout.js.map +1 -0
- package/dist/rules/smooth-scroll.d.ts.map +1 -1
- package/dist/rules/smooth-scroll.js +4 -0
- package/dist/rules/smooth-scroll.js.map +1 -1
- package/dist/rules/speculation-rules.d.ts +3 -0
- package/dist/rules/speculation-rules.d.ts.map +1 -0
- package/dist/rules/speculation-rules.js +35 -0
- package/dist/rules/speculation-rules.js.map +1 -0
- package/dist/rules/sticky.d.ts.map +1 -1
- package/dist/rules/sticky.js +4 -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 +1 -0
- package/dist/rules/structured-clone.js.map +1 -1
- package/dist/rules/temporal.d.ts +3 -0
- package/dist/rules/temporal.d.ts.map +1 -0
- package/dist/rules/temporal.js +34 -0
- package/dist/rules/temporal.js.map +1 -0
- package/dist/rules/text-wrap-balance.d.ts.map +1 -1
- package/dist/rules/text-wrap-balance.js +3 -0
- package/dist/rules/text-wrap-balance.js.map +1 -1
- package/dist/rules/url-pattern.d.ts +3 -0
- package/dist/rules/url-pattern.d.ts.map +1 -0
- package/dist/rules/url-pattern.js +40 -0
- package/dist/rules/url-pattern.js.map +1 -0
- package/dist/rules/url-search-params.d.ts.map +1 -1
- package/dist/rules/url-search-params.js +1 -0
- package/dist/rules/url-search-params.js.map +1 -1
- package/dist/rules/web-animations.d.ts +3 -0
- package/dist/rules/web-animations.d.ts.map +1 -0
- package/dist/rules/web-animations.js +44 -0
- package/dist/rules/web-animations.js.map +1 -0
- package/dist/rules/web-crypto.d.ts.map +1 -1
- package/dist/rules/web-crypto.js +4 -0
- package/dist/rules/web-crypto.js.map +1 -1
- package/dist/rules/web-locks.d.ts +3 -0
- package/dist/rules/web-locks.d.ts.map +1 -0
- package/dist/rules/web-locks.js +39 -0
- package/dist/rules/web-locks.js.map +1 -0
- package/dist/rules/web-share.d.ts.map +1 -1
- package/dist/rules/web-share.js +3 -0
- package/dist/rules/web-share.js.map +1 -1
- package/dist/rules/with-resolvers.d.ts +3 -0
- package/dist/rules/with-resolvers.d.ts.map +1 -0
- package/dist/rules/with-resolvers.js +30 -0
- package/dist/rules/with-resolvers.js.map +1 -0
- package/dist/schema.d.ts +4 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +34 -0
- package/dist/schema.js.map +1 -1
- package/dist/tier-diff.d.ts +55 -0
- package/dist/tier-diff.d.ts.map +1 -0
- package/dist/tier-diff.js +61 -0
- package/dist/tier-diff.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export const progressIndicator = {
|
|
2
|
+
id: "progress-indicator",
|
|
3
|
+
title: "Spinners and progress bars",
|
|
4
|
+
category: "forms",
|
|
5
|
+
replaces: ["react-spinners", "spinkit", "react-loader-spinner", "ldrs"],
|
|
6
|
+
featureIds: ["progress"],
|
|
7
|
+
native: "<progress>",
|
|
8
|
+
human: {
|
|
9
|
+
explainer: "A progress element with a value draws a determinate bar, and the same element with the value removed draws the indeterminate one, which is the browser's own spinner. It carries the right role and reports its value to assistive technology without any aria being written by hand, which is the part the div-and-keyframes version usually gets wrong. Styling it is CSS on the element and its two pseudo-elements.",
|
|
10
|
+
snippet: `<!-- Determinate. -->
|
|
11
|
+
<progress value="0.7">70%</progress>
|
|
12
|
+
|
|
13
|
+
<!-- Indeterminate: no value attribute at all. -->
|
|
14
|
+
<progress></progress>
|
|
15
|
+
|
|
16
|
+
<style>
|
|
17
|
+
progress { inline-size: 12rem; block-size: 0.5rem; }
|
|
18
|
+
/* The track and the filled part, in WebKit and Blink. */
|
|
19
|
+
progress::-webkit-progress-bar { background: #eee; }
|
|
20
|
+
progress::-webkit-progress-value { background: currentColor; }
|
|
21
|
+
</style>`,
|
|
22
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/progress",
|
|
23
|
+
},
|
|
24
|
+
agent: {
|
|
25
|
+
when: "showing that work is happening, or how far along it is",
|
|
26
|
+
unless: [
|
|
27
|
+
"You need a circular ring. The element draws a bar, and the pseudo-elements that style it are not a shape you can bend into an arc, so a ring is still SVG or a conic-gradient on your own markup.",
|
|
28
|
+
"The design is a branded multi-part animation, such as bouncing dots or a pulsing logo. Those are several moving elements and a progress element is one.",
|
|
29
|
+
"You need a page-level loading bar tied to route changes, which is what nprogress is: the visual is trivial and the router integration and its timing are the library.",
|
|
30
|
+
"Your styling has to match across engines exactly. The pseudo-elements differ between Blink, WebKit and Gecko, and accent-color only recolours the default rendering rather than restyling it.",
|
|
31
|
+
],
|
|
32
|
+
snippet: "<progress></progress> <!-- indeterminate -->",
|
|
33
|
+
handRolled: [
|
|
34
|
+
"a div with a CSS keyframe rotation and a border-radius, standing in for a spinner, usually with no role or aria-label",
|
|
35
|
+
"a wrapper div whose inline width is set to a percentage string to draw a filled bar",
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=progress-indicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-indicator.js","sourceRoot":"","sources":["../../src/rules/progress-indicator.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAS;IACrC,EAAE,EAAE,oBAAoB;IACxB,KAAK,EAAE,4BAA4B;IACnC,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,CAAC;IACvE,UAAU,EAAE,CAAC,UAAU,CAAC;IACxB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE;QACL,SAAS,EACP,yZAAyZ;QAC3Z,OAAO,EAAE;;;;;;;;;;;SAWJ;QACL,MAAM,EACJ,oEAAoE;KACvE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,wDAAwD;QAC9D,MAAM,EAAE;YACN,mMAAmM;YACnM,yJAAyJ;YACzJ,uKAAuK;YACvK,+LAA+L;SAChM;QACD,OAAO,EAAE,8CAA8C;QACvD,UAAU,EAAE;YACV,uHAAuH;YACvH,qFAAqF;SACtF;KACF;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"random-uuid.d.ts","sourceRoot":"","sources":["../../src/rules/random-uuid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"random-uuid.d.ts","sourceRoot":"","sources":["../../src/rules/random-uuid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,UAAU,EAAE,IAmCxB,CAAC"}
|
|
@@ -26,6 +26,10 @@ export const randomUuid = {
|
|
|
26
26
|
"You need identifiers shorter or differently shaped than a 36-character UUID, which is what nanoid and short-uuid are for.",
|
|
27
27
|
],
|
|
28
28
|
snippet: "const id = crypto.randomUUID();",
|
|
29
|
+
handRolled: [
|
|
30
|
+
"a v4 id built from Math.random() and a template string of x and y placeholders",
|
|
31
|
+
"Date.now() joined to Math.random().toString(36) to make something unique enough",
|
|
32
|
+
],
|
|
29
33
|
},
|
|
30
34
|
};
|
|
31
35
|
//# sourceMappingURL=random-uuid.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"random-uuid.js","sourceRoot":"","sources":["../../src/rules/random-uuid.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,kBAAkB;IACzB,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC;IAC3D,UAAU,EAAE,EAAE;IACd,cAAc,EAAE;QACd,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,YAAY;QACxB,IAAI,EAAE,+gBAA+gB;KACthB;IACD,MAAM,EAAE,qBAAqB;IAC7B,KAAK,EAAE;QACL,SAAS,EACP,2ZAA2Z;QAC7Z,OAAO,EAAE;0CAC6B;QACtC,MAAM,EACJ,oEAAoE;KACvE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,6BAA6B;QACnC,MAAM,EAAE;YACN,oKAAoK;YACpK,wJAAwJ;YACxJ,qJAAqJ;YACrJ,wRAAwR;YACxR,2HAA2H;SAC5H;QACD,OAAO,EAAE,iCAAiC;
|
|
1
|
+
{"version":3,"file":"random-uuid.js","sourceRoot":"","sources":["../../src/rules/random-uuid.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,kBAAkB;IACzB,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC;IAC3D,UAAU,EAAE,EAAE;IACd,cAAc,EAAE;QACd,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,YAAY;QACxB,IAAI,EAAE,+gBAA+gB;KACthB;IACD,MAAM,EAAE,qBAAqB;IAC7B,KAAK,EAAE;QACL,SAAS,EACP,2ZAA2Z;QAC7Z,OAAO,EAAE;0CAC6B;QACtC,MAAM,EACJ,oEAAoE;KACvE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,6BAA6B;QACnC,MAAM,EAAE;YACN,oKAAoK;YACpK,wJAAwJ;YACxJ,qJAAqJ;YACrJ,wRAAwR;YACxR,2HAA2H;SAC5H;QACD,OAAO,EAAE,iCAAiC;QAC1C,UAAU,EAAE;YACV,gFAAgF;YAChF,iFAAiF;SAClF;KACF;CACF,CAAC"}
|
|
@@ -1 +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,
|
|
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,IA6B1B,CAAC"}
|
|
@@ -19,6 +19,10 @@ rtf.format(-5, "minute"); // "5 minutes ago"`,
|
|
|
19
19
|
"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.",
|
|
20
20
|
],
|
|
21
21
|
snippet: 'new Intl.RelativeTimeFormat("en", { numeric: "auto" }).format(-5, "minute");',
|
|
22
|
+
handRolled: [
|
|
23
|
+
"a chain of millisecond thresholds turning a date difference into minutes, hours or days ago",
|
|
24
|
+
"a table of singular and plural unit names written out to build phrases like 3 days ago",
|
|
25
|
+
],
|
|
22
26
|
},
|
|
23
27
|
};
|
|
24
28
|
//# sourceMappingURL=relative-time.js.map
|
|
@@ -1 +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,YAAY;IACtB,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;
|
|
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,YAAY;IACtB,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;QAChF,UAAU,EAAE;YACV,6FAA6F;YAC7F,wFAAwF;SACzF;KACF;CACF,CAAC"}
|
|
@@ -1 +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,
|
|
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"}
|
|
@@ -26,6 +26,9 @@ export const resizablePanels = {
|
|
|
26
26
|
"You need a minimum of two resizable regions sharing the freed-up or reclaimed space, the way a split-pane library redistributes width between panels.",
|
|
27
27
|
],
|
|
28
28
|
snippet: ".sidebar { resize: horizontal; overflow: auto; min-width: 12rem; max-width: 32rem; }",
|
|
29
|
+
handRolled: [
|
|
30
|
+
"a mousedown on one panel's edge with mousemove handlers writing a width onto that same panel",
|
|
31
|
+
],
|
|
29
32
|
},
|
|
30
33
|
};
|
|
31
34
|
//# sourceMappingURL=resizable-panels.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resizable-panels.js","sourceRoot":"","sources":["../../src/rules/resizable-panels.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,kBAAkB;IACzB,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,CAAC,cAAc,CAAC;IAC1B,UAAU,EAAE,CAAC,QAAQ,CAAC;IACtB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE;QACL,SAAS,EACP,ubAAub;QACzb,OAAO,EAAE;;;;;EAKX;QACE,MAAM,EAAE,yDAAyD;KAClE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,6EAA6E;QACnF,MAAM,EAAE;YACN,6IAA6I;YAC7I,wUAAwU;YACxU,+JAA+J;YAC/J,6JAA6J;YAC7J,mJAAmJ;YACnJ,uJAAuJ;SACxJ;QACD,OAAO,EACL,sFAAsF;
|
|
1
|
+
{"version":3,"file":"resizable-panels.js","sourceRoot":"","sources":["../../src/rules/resizable-panels.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,kBAAkB;IACzB,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,CAAC,cAAc,CAAC;IAC1B,UAAU,EAAE,CAAC,QAAQ,CAAC;IACtB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE;QACL,SAAS,EACP,ubAAub;QACzb,OAAO,EAAE;;;;;EAKX;QACE,MAAM,EAAE,yDAAyD;KAClE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,6EAA6E;QACnF,MAAM,EAAE;YACN,6IAA6I;YAC7I,wUAAwU;YACxU,+JAA+J;YAC/J,6JAA6J;YAC7J,mJAAmJ;YACnJ,uJAAuJ;SACxJ;QACD,OAAO,EACL,sFAAsF;QACxF,UAAU,EAAE;YACV,8FAA8F;SAC/F;KACF;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resize-observer.d.ts","sourceRoot":"","sources":["../../src/rules/resize-observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"resize-observer.d.ts","sourceRoot":"","sources":["../../src/rules/resize-observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,cAAc,EAAE,IA+B5B,CAAC"}
|
|
@@ -23,6 +23,10 @@ observer.observe(document.querySelector("#panel"));`,
|
|
|
23
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.",
|
|
24
24
|
],
|
|
25
25
|
snippet: "new ResizeObserver((entries) => { ... }).observe(el);",
|
|
26
|
+
handRolled: [
|
|
27
|
+
"polling an element's dimensions on an interval to notice when they change",
|
|
28
|
+
],
|
|
26
29
|
},
|
|
30
|
+
lintRule: "unicorn/prefer-observer-apis",
|
|
27
31
|
};
|
|
28
32
|
//# sourceMappingURL=resize-observer.js.map
|
|
@@ -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,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;
|
|
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;QAChE,UAAU,EAAE;YACV,2EAA2E;SAC5E;KACF;IACD,QAAQ,EAAE,8BAA8B;CACzC,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,IA6B5B,CAAC"}
|
|
@@ -20,6 +20,10 @@ await lock.release();`,
|
|
|
20
20
|
"You need this in a non-secure (non-HTTPS) context, where the API isn't available at all.",
|
|
21
21
|
],
|
|
22
22
|
snippet: `const lock = await navigator.wakeLock.request("screen");`,
|
|
23
|
+
handRolled: [
|
|
24
|
+
"a muted looping video kept playing off-screen so the display does not sleep",
|
|
25
|
+
"a no-op setInterval added in the hope the page keeps counting as active",
|
|
26
|
+
],
|
|
23
27
|
},
|
|
24
28
|
};
|
|
25
29
|
//# sourceMappingURL=screen-wake-lock.js.map
|
|
@@ -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,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;
|
|
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;QACnE,UAAU,EAAE;YACV,6EAA6E;YAC7E,yEAAyE;SAC1E;KACF;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,IAuE9B,CAAC"}
|
|
@@ -55,6 +55,10 @@ export const scrollAnimations = {
|
|
|
55
55
|
animation-range: entry 0% cover 40%;
|
|
56
56
|
}
|
|
57
57
|
}`,
|
|
58
|
+
handRolled: [
|
|
59
|
+
"a scroll listener setting a progress bar's width from scrollY over scrollHeight",
|
|
60
|
+
"mapping scroll position to a transform or an opacity on every scroll event",
|
|
61
|
+
],
|
|
58
62
|
},
|
|
59
63
|
guides: [
|
|
60
64
|
"parallax-scroll-effects",
|
|
@@ -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,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;
|
|
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;QACE,UAAU,EAAE;YACV,iFAAiF;YACjF,4EAA4E;SAC7E;KACF;IACD,MAAM,EAAE;QACN,yBAAyB;QACzB,gBAAgB;QAChB,2BAA2B;QAC3B,2BAA2B;QAC3B,4BAA4B;KAC7B;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll-into-view.d.ts","sourceRoot":"","sources":["../../src/rules/scroll-into-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,cAAc,EAAE,IAsC5B,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export const scrollIntoView = {
|
|
2
|
+
id: "scroll-into-view",
|
|
3
|
+
title: "Scrolling an element into view",
|
|
4
|
+
category: "scrolling",
|
|
5
|
+
replaces: [
|
|
6
|
+
"scroll-into-view-if-needed",
|
|
7
|
+
"compute-scroll-into-view",
|
|
8
|
+
"smooth-scroll-into-view-if-needed",
|
|
9
|
+
],
|
|
10
|
+
featureIds: ["scroll-into-view"],
|
|
11
|
+
native: 'scrollIntoView({ block: "nearest" })',
|
|
12
|
+
human: {
|
|
13
|
+
explainer: 'These packages exist for one behaviour: scroll only if the element is not already visible, and scroll as little as possible when it is not. That is what block: "nearest" does, in every engine. The default is block: "start", which always scrolls and is why the native method got a reputation for being too blunt, so the option is the whole difference.',
|
|
14
|
+
snippet: `// Scrolls only as far as it has to, and not at all if the
|
|
15
|
+
// option is already visible. Ideal for keyboard navigation.
|
|
16
|
+
option.scrollIntoView({
|
|
17
|
+
block: "nearest",
|
|
18
|
+
inline: "nearest",
|
|
19
|
+
behavior: "smooth",
|
|
20
|
+
});`,
|
|
21
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView",
|
|
22
|
+
},
|
|
23
|
+
agent: {
|
|
24
|
+
when: "bringing an element into view, typically a highlighted option or a focused row",
|
|
25
|
+
unless: [
|
|
26
|
+
"You need the scroll offset computed without applying it. That is what compute-scroll-into-view is for on its own, and a virtualised list that batches its own scrolling genuinely needs the number rather than the movement.",
|
|
27
|
+
'You need a specific duration or easing. behavior: "smooth" exposes neither, and the browser picks both.',
|
|
28
|
+
"You must scroll several containers to a coordinated position. The native method walks its own ancestors on its own terms, so a scroll that has to stay in step across panes needs the offsets.",
|
|
29
|
+
"Your support target reaches below Chrome {{chrome:api.Element.scrollIntoView.options_parameter}}, Firefox {{firefox:api.Element.scrollIntoView.options_parameter}} or Safari {{safari:api.Element.scrollIntoView.options_parameter}}. The method is far older than that, so scrollIntoView() existing is not proof the options object is read.",
|
|
30
|
+
],
|
|
31
|
+
snippet: 'el.scrollIntoView({ block: "nearest" });',
|
|
32
|
+
handRolled: [
|
|
33
|
+
"getBoundingClientRect on an element and its scroll container, compared to decide whether to set scrollTop",
|
|
34
|
+
"a scrollTop assignment computed from offsetTop minus the container's height, to centre a highlighted item",
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=scroll-into-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll-into-view.js","sourceRoot":"","sources":["../../src/rules/scroll-into-view.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,gCAAgC;IACvC,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE;QACR,4BAA4B;QAC5B,0BAA0B;QAC1B,mCAAmC;KACpC;IACD,UAAU,EAAE,CAAC,kBAAkB,CAAC;IAChC,MAAM,EAAE,sCAAsC;IAC9C,KAAK,EAAE;QACL,SAAS,EACP,gWAAgW;QAClW,OAAO,EAAE;;;;;;IAMT;QACA,MAAM,EACJ,yEAAyE;KAC5E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,gFAAgF;QACtF,MAAM,EAAE;YACN,8NAA8N;YAC9N,yGAAyG;YACzG,gMAAgM;YAChM,gVAAgV;SACjV;QACD,OAAO,EAAE,0CAA0C;QACnD,UAAU,EAAE;YACV,2GAA2G;YAC3G,2GAA2G;SAC5G;KACF;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,IA6CxB,CAAC"}
|
|
@@ -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,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;
|
|
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;QACE,UAAU,EAAE;YACV,iGAAiG;SAClG;KACF;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,IAuDxB,CAAC"}
|
package/dist/rules/scrollbars.js
CHANGED
|
@@ -44,6 +44,9 @@ html {
|
|
|
44
44
|
scrollbar-width: thin;
|
|
45
45
|
scrollbar-color: #666 transparent;
|
|
46
46
|
}`,
|
|
47
|
+
handRolled: [
|
|
48
|
+
"measuring the scrollbar width from innerWidth minus documentElement.clientWidth and padding the body by it",
|
|
49
|
+
],
|
|
47
50
|
},
|
|
48
51
|
guides: [
|
|
49
52
|
"customize-scrollbar-color-and-thickness",
|
|
@@ -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,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;
|
|
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;QACE,UAAU,EAAE;YACV,4GAA4G;SAC7G;KACF;IACD,MAAM,EAAE;QACN,yCAAyC;QACzC,yCAAyC;KAC1C;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segmenter.d.ts","sourceRoot":"","sources":["../../src/rules/segmenter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,SAAS,EAAE,IA6CvB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export const segmenter = {
|
|
2
|
+
id: "intl-segmenter",
|
|
3
|
+
title: "Splitting text by character or word",
|
|
4
|
+
category: "formatting",
|
|
5
|
+
replaces: [
|
|
6
|
+
"graphemer",
|
|
7
|
+
"grapheme-splitter",
|
|
8
|
+
"string-length",
|
|
9
|
+
"lodash.words",
|
|
10
|
+
"split-graphemes",
|
|
11
|
+
],
|
|
12
|
+
featureIds: ["intl-segmenter"],
|
|
13
|
+
native: "Intl.Segmenter",
|
|
14
|
+
human: {
|
|
15
|
+
explainer: 'A string\'s length counts UTF-16 code units, so a thumbs-up with a skin tone reads as four and slicing at an arbitrary index can cut a character in half. These libraries fix that by shipping their own copy of the Unicode grapheme cluster rules, which is most of their weight. Intl.Segmenter reads the copy the browser already holds and segments by grapheme, word or sentence, so "how many characters" and "what are the words" both get a locale-aware answer.',
|
|
16
|
+
snippet: `const graphemes = new Intl.Segmenter("en", { granularity: "grapheme" });
|
|
17
|
+
|
|
18
|
+
"👍🏽ok".length; // 6
|
|
19
|
+
[...graphemes.segment("👍🏽ok")].length; // 3
|
|
20
|
+
|
|
21
|
+
const words = new Intl.Segmenter("en", { granularity: "word" });
|
|
22
|
+
[...words.segment("Hello, world")]
|
|
23
|
+
.filter((part) => part.isWordLike)
|
|
24
|
+
.map((part) => part.segment);
|
|
25
|
+
// ["Hello", "world"]`,
|
|
26
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter",
|
|
27
|
+
},
|
|
28
|
+
agent: {
|
|
29
|
+
when: "counting, splitting or truncating text by user-perceived character, word or sentence",
|
|
30
|
+
unless: [
|
|
31
|
+
"You use lodash.words to split identifiers, as in fooBarBaz or snake_case. That is a camel case convention rather than a Unicode word boundary, and Intl.Segmenter will not split it.",
|
|
32
|
+
"You only need code points rather than grapheme clusters. Array.from(str) and the spread form already split by code point, with no Segmenter and no library.",
|
|
33
|
+
"You need segmentation that cannot move. Each engine ships its own Unicode version, so a recent emoji can segment differently between browsers and can change when one updates.",
|
|
34
|
+
"The same code runs on a Node build compiled with small-icu, where the locale data Segmenter depends on is largely absent.",
|
|
35
|
+
"You measure the width of terminal output. string-length also strips ANSI escape codes before counting, and Intl.Segmenter counts them as segments, so a colourised CLI silently gets its column widths wrong.",
|
|
36
|
+
],
|
|
37
|
+
snippet: `const seg = new Intl.Segmenter("en", { granularity: "grapheme" });
|
|
38
|
+
const count = [...seg.segment(text)].length;`,
|
|
39
|
+
handRolled: [
|
|
40
|
+
'str.length or split("") used to count characters, which counts an emoji or a combining accent as several',
|
|
41
|
+
"a regex over surrogate pairs to split a string into what the author is calling characters",
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=segmenter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segmenter.js","sourceRoot":"","sources":["../../src/rules/segmenter.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAS;IAC7B,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,qCAAqC;IAC5C,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE;QACR,WAAW;QACX,mBAAmB;QACnB,eAAe;QACf,cAAc;QACd,iBAAiB;KAClB;IACD,UAAU,EAAE,CAAC,gBAAgB,CAAC;IAC9B,MAAM,EAAE,gBAAgB;IACxB,KAAK,EAAE;QACL,SAAS,EACP,2cAA2c;QAC7c,OAAO,EAAE;;;;;;;;;sBASS;QAClB,MAAM,EACJ,iGAAiG;KACpG;IACD,KAAK,EAAE;QACL,IAAI,EAAE,sFAAsF;QAC5F,MAAM,EAAE;YACN,sLAAsL;YACtL,6JAA6J;YAC7J,gLAAgL;YAChL,2HAA2H;YAC3H,+MAA+M;SAChN;QACD,OAAO,EAAE;6CACgC;QACzC,UAAU,EAAE;YACV,0GAA0G;YAC1G,2FAA2F;SAC5F;KACF;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,IA0EpB,CAAC"}
|
package/dist/rules/select.js
CHANGED
|
@@ -60,11 +60,15 @@ export const select = {
|
|
|
60
60
|
<style>
|
|
61
61
|
select, select::picker(select) { appearance: base-select; }
|
|
62
62
|
</style>`,
|
|
63
|
+
handRolled: [
|
|
64
|
+
"a div with role=listbox and children with role=option, wired to arrow keys and Enter by hand",
|
|
65
|
+
],
|
|
63
66
|
},
|
|
64
67
|
guides: [
|
|
65
68
|
"animated-select-picker",
|
|
66
69
|
"branded-select-styling",
|
|
67
70
|
"custom-select-picker-layouts",
|
|
71
|
+
"rich-media-picker",
|
|
68
72
|
"select-menu-interaction",
|
|
69
73
|
],
|
|
70
74
|
};
|
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,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;
|
|
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;QACL,UAAU,EAAE;YACV,8FAA8F;SAC/F;KACF;IACD,MAAM,EAAE;QACN,wBAAwB;QACxB,wBAAwB;QACxB,8BAA8B;QAC9B,mBAAmB;QACnB,yBAAyB;KAC1B;CACF,CAAC"}
|
|
@@ -1 +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,
|
|
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,IAyC9B,CAAC"}
|
|
@@ -33,6 +33,10 @@ source.addEventListener("error", () => {
|
|
|
33
33
|
snippet: `const source = new EventSource("/api/updates");
|
|
34
34
|
source.addEventListener("price", (e) => update(JSON.parse(e.data)));
|
|
35
35
|
source.close();`,
|
|
36
|
+
handRolled: [
|
|
37
|
+
"a setInterval or a self-rescheduling setTimeout re-fetching an endpoint to notice changes, with the delay tuned by hand",
|
|
38
|
+
"a long poll: a fetch the server holds open, re-issued from its own then handler",
|
|
39
|
+
],
|
|
36
40
|
},
|
|
37
41
|
};
|
|
38
42
|
//# sourceMappingURL=server-sent-events.js.map
|
|
@@ -1 +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;
|
|
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;QACZ,UAAU,EAAE;YACV,yHAAyH;YACzH,iFAAiF;SAClF;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-timeout.d.ts","sourceRoot":"","sources":["../../src/rules/signal-timeout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,aAAa,EAAE,IA+B3B,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const signalTimeout = {
|
|
2
|
+
id: "abortsignal-timeout",
|
|
3
|
+
title: "Timing out async work",
|
|
4
|
+
category: "async-data",
|
|
5
|
+
replaces: ["p-timeout", "promise-timeout"],
|
|
6
|
+
featureIds: ["abortsignal-timeout"],
|
|
7
|
+
native: "AbortSignal.timeout()",
|
|
8
|
+
human: {
|
|
9
|
+
explainer: "These packages race your promise against a timer and reject when the timer wins. The work carries on in the background, because a promise has no cancel, so a timed-out request still holds its connection and still lands its response. AbortSignal.timeout() returns a signal that aborts itself after the given time, and anything that takes a signal stops for real. AbortSignal.any() combines it with a controller when a timeout and a manual cancel both have to work.",
|
|
10
|
+
snippet: `const response = await fetch(url, { signal: AbortSignal.timeout(5000) });
|
|
11
|
+
|
|
12
|
+
// A timeout the user can also cancel.
|
|
13
|
+
const controller = new AbortController();
|
|
14
|
+
const response2 = await fetch(url, {
|
|
15
|
+
signal: AbortSignal.any([controller.signal, AbortSignal.timeout(5000)]),
|
|
16
|
+
});`,
|
|
17
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/timeout_static",
|
|
18
|
+
},
|
|
19
|
+
agent: {
|
|
20
|
+
when: "giving a cancellable operation such as fetch a deadline",
|
|
21
|
+
unless: [
|
|
22
|
+
"What you are timing out takes no AbortSignal. A plain promise from a library with no signal option cannot be aborted, so racing it is still the only option and that race is what p-timeout is.",
|
|
23
|
+
"You need a specific error, or a fallback value instead of a rejection. AbortSignal.timeout() rejects with a TimeoutError DOMException and offers no hook, where p-timeout takes your own error or resolves with a default.",
|
|
24
|
+
"The combined signal has to say why it aborted. AbortSignal.any() adopts the reason of whichever signal fired, so telling a timeout from a user cancel means reading signal.reason rather than catching a distinct type.",
|
|
25
|
+
"You support browsers below Chrome {{chrome:abortsignal-timeout}}, Firefox {{firefox:abortsignal-timeout}} or Safari {{safari:abortsignal-timeout}}. AbortSignal.any() landed separately, so check it too if the snippet uses both.",
|
|
26
|
+
],
|
|
27
|
+
snippet: "await fetch(url, { signal: AbortSignal.timeout(5000) });",
|
|
28
|
+
},
|
|
29
|
+
lintRule: "unicorn/prefer-abort-signal-timeout",
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=signal-timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-timeout.js","sourceRoot":"","sources":["../../src/rules/signal-timeout.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAS;IACjC,EAAE,EAAE,qBAAqB;IACzB,KAAK,EAAE,uBAAuB;IAC9B,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC;IAC1C,UAAU,EAAE,CAAC,qBAAqB,CAAC;IACnC,MAAM,EAAE,uBAAuB;IAC/B,KAAK,EAAE;QACL,SAAS,EACP,idAAid;QACnd,OAAO,EAAE;;;;;;IAMT;QACA,MAAM,EACJ,6EAA6E;KAChF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,yDAAyD;QAC/D,MAAM,EAAE;YACN,iMAAiM;YACjM,4NAA4N;YAC5N,yNAAyN;YACzN,oOAAoO;SACrO;QACD,OAAO,EAAE,0DAA0D;KACpE;IACD,QAAQ,EAAE,qCAAqC;CAChD,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,IAgD1B,CAAC"}
|
|
@@ -39,6 +39,10 @@ export const smoothScroll = {
|
|
|
39
39
|
:root { scroll-behavior: smooth; }
|
|
40
40
|
}
|
|
41
41
|
[id] { scroll-margin-top: 5rem; }`,
|
|
42
|
+
handRolled: [
|
|
43
|
+
"a requestAnimationFrame loop easing scrollTop from where it is toward a target",
|
|
44
|
+
"an easing function like easeInOutQuad written next to a scroll routine",
|
|
45
|
+
],
|
|
42
46
|
},
|
|
43
47
|
guides: ["scroll-target-on-load"],
|
|
44
48
|
};
|
|
@@ -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,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;
|
|
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;QAC9B,UAAU,EAAE;YACV,gFAAgF;YAChF,wEAAwE;SACzE;KACF;IACD,MAAM,EAAE,CAAC,uBAAuB,CAAC;CAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speculation-rules.d.ts","sourceRoot":"","sources":["../../src/rules/speculation-rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,gBAAgB,EAAE,IAoC9B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export const speculationRules = {
|
|
2
|
+
id: "speculation-rules",
|
|
3
|
+
title: "Prefetching the next page",
|
|
4
|
+
category: "async-data",
|
|
5
|
+
replaces: ["quicklink", "instant.page"],
|
|
6
|
+
featureIds: ["speculation-rules"],
|
|
7
|
+
native: "speculation rules",
|
|
8
|
+
human: {
|
|
9
|
+
explainer: "These scripts watch for links entering the viewport or being hovered, then inject a prefetch tag. Speculation rules say the same thing declaratively in a script tag the browser reads: which links to speculate on, and how eagerly. The browser handles the heuristics, and prerender goes further than any library can, rendering the next page so the click is instant. Chromium only for now.",
|
|
10
|
+
snippet: `<script type="speculationrules">
|
|
11
|
+
{
|
|
12
|
+
"prerender": [{
|
|
13
|
+
"where": { "href_matches": "/articles/*" },
|
|
14
|
+
"eagerness": "moderate"
|
|
15
|
+
}]
|
|
16
|
+
}
|
|
17
|
+
</script>`,
|
|
18
|
+
mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/API/Speculation_Rules_API",
|
|
19
|
+
},
|
|
20
|
+
agent: {
|
|
21
|
+
when: "prefetching or prerendering the page a visitor is likely to open next",
|
|
22
|
+
unless: [
|
|
23
|
+
"You ship to Firefox or Safari. Only Chromium has this, from Chrome {{chrome:speculation-rules}}, so the library is still what serves everyone else and this is an enhancement rather than a swap.",
|
|
24
|
+
"Prerendering would run analytics or side effects for a page nobody visited. A prerendered document runs its scripts, so anything counting a view has to check document.prerendering and wait, which is work the library never made you do.",
|
|
25
|
+
"The next URL is decided in JavaScript rather than present as a link, such as a router that builds the target from state. Rules match on the document's own hrefs.",
|
|
26
|
+
"Your pages are personalised or expensive to render, where speculating wrongly costs the server more than the click saves the visitor.",
|
|
27
|
+
],
|
|
28
|
+
snippet: '<script type="speculationrules">{"prefetch":[{"where":{"href_matches":"/*"}}]}</script>',
|
|
29
|
+
handRolled: [
|
|
30
|
+
"an IntersectionObserver over anchors that injects a <link rel=prefetch> when one scrolls into view",
|
|
31
|
+
"a mouseover or touchstart listener on links that starts fetching the target before the click lands",
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=speculation-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speculation-rules.js","sourceRoot":"","sources":["../../src/rules/speculation-rules.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,EAAE,EAAE,mBAAmB;IACvB,KAAK,EAAE,2BAA2B;IAClC,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC;IACvC,UAAU,EAAE,CAAC,mBAAmB,CAAC;IACjC,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE;QACL,SAAS,EACP,oYAAoY;QACtY,OAAO,EAAE;;;;;;;UAOH;QACN,MAAM,EACJ,wEAAwE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,uEAAuE;QAC7E,MAAM,EAAE;YACN,mMAAmM;YACnM,4OAA4O;YAC5O,mKAAmK;YACnK,uIAAuI;SACxI;QACD,OAAO,EACL,yFAAyF;QAC3F,UAAU,EAAE;YACV,oGAAoG;YACpG,oGAAoG;SACrG;KACF;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,IA+CpB,CAAC"}
|
package/dist/rules/sticky.js
CHANGED
|
@@ -38,6 +38,10 @@ export const sticky = {
|
|
|
38
38
|
],
|
|
39
39
|
snippet: `.header { position: sticky; top: 0; z-index: 10; }
|
|
40
40
|
.sidebar { position: sticky; top: 5rem; align-self: start; }`,
|
|
41
|
+
handRolled: [
|
|
42
|
+
"a scroll listener toggling a fixed class once an element passes an offset",
|
|
43
|
+
"storing an element's original offsetTop so a placeholder can hold the gap when it goes fixed",
|
|
44
|
+
],
|
|
41
45
|
},
|
|
42
46
|
guides: ["state-aware-sticky-headers", "scroll-position-aware-elements"],
|
|
43
47
|
};
|
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,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;
|
|
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;QACzD,UAAU,EAAE;YACV,2EAA2E;YAC3E,8FAA8F;SAC/F;KACF;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,IAgCjC,CAAC"}
|
|
@@ -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,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;
|
|
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;IACD,QAAQ,EAAE,iCAAiC;CAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal.d.ts","sourceRoot":"","sources":["../../src/rules/temporal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,QAAQ,EAAE,IAmCtB,CAAC"}
|