@nickyzj2023/utils 1.0.45 → 1.0.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/.github/workflows/docs.yml +39 -0
  2. package/dist/index.js +1 -1
  3. package/dist/network.d.ts +12 -1
  4. package/dist/string.d.ts +32 -5
  5. package/docs/assets/highlight.css +99 -92
  6. package/docs/assets/navigation.js +1 -1
  7. package/docs/assets/search.js +1 -1
  8. package/docs/functions/camelToSnake.html +178 -178
  9. package/docs/functions/capitalize.html +178 -178
  10. package/docs/functions/compactStr.html +182 -182
  11. package/docs/functions/debounce.html +187 -187
  12. package/docs/functions/decapitalize.html +178 -178
  13. package/docs/functions/fetcher.html +189 -188
  14. package/docs/functions/getRealURL.html +175 -175
  15. package/docs/functions/imageUrlToBase64.html +187 -184
  16. package/docs/functions/isFalsy.html +178 -178
  17. package/docs/functions/isNil.html +178 -178
  18. package/docs/functions/isObject.html +178 -178
  19. package/docs/functions/isPrimitive.html +178 -178
  20. package/docs/functions/isTruthy.html +178 -178
  21. package/docs/functions/loopUntil.html +180 -180
  22. package/docs/functions/mapKeys.html +180 -180
  23. package/docs/functions/mapValues.html +182 -182
  24. package/docs/functions/mergeObjects.html +184 -184
  25. package/docs/functions/randomInt.html +178 -178
  26. package/docs/functions/sleep.html +179 -179
  27. package/docs/functions/snakeToCamel.html +178 -178
  28. package/docs/functions/throttle.html +187 -187
  29. package/docs/functions/timeLog.html +178 -178
  30. package/docs/functions/to.html +180 -180
  31. package/docs/functions/withCache.html +185 -185
  32. package/docs/modules.html +174 -174
  33. package/docs/types/CamelToSnake.html +174 -174
  34. package/docs/types/Capitalize.html +174 -174
  35. package/docs/types/Decapitalize.html +174 -174
  36. package/docs/types/DeepMapKeys.html +174 -174
  37. package/docs/types/DeepMapValues.html +174 -174
  38. package/docs/types/Falsy.html +174 -174
  39. package/docs/types/ImageCompressionOptions.html +184 -0
  40. package/docs/types/Primitive.html +174 -174
  41. package/docs/types/RequestInit.html +174 -174
  42. package/docs/types/SetTtl.html +174 -174
  43. package/docs/types/SnakeToCamel.html +174 -174
  44. package/package.json +11 -14
  45. package/src/network.ts +158 -144
  46. package/src/string.ts +110 -27
  47. package/dist/tsdoc-metadata.json +0 -11
@@ -0,0 +1,39 @@
1
+ name: Generate Docs
2
+
3
+ on:
4
+ push:
5
+ branches: [main, master]
6
+ pull_request:
7
+ branches: [main, master]
8
+
9
+ jobs:
10
+ docs:
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - name: Checkout code
15
+ uses: actions/checkout@v4
16
+
17
+ - name: Setup Bun
18
+ uses: oven-sh/setup-bun@v2
19
+ with:
20
+ bun-version: latest
21
+
22
+ - name: Install dependencies
23
+ run: bun install
24
+
25
+ - name: Generate docs
26
+ run: bun run docs
27
+
28
+ - name: Commit and push docs
29
+ if: github.event_name == 'push'
30
+ run: |
31
+ git config --local user.email "github-actions[bot]@users.noreply.github.com"
32
+ git config --local user.name "github-actions[bot]"
33
+ git add docs/
34
+ if git diff --staged --quiet; then
35
+ echo "No changes to commit"
36
+ else
37
+ git commit -m "docs: auto-generate documentation"
38
+ git push
39
+ fi
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- var S=(...I)=>{console.log(`${new Date().toLocaleTimeString()}`,...I)};var K=async(I,$)=>{let{maxRetries:M=5,shouldStop:W=()=>!0}=$??{};for(let z=0;z<M;z++){let H=await I(z);if(W(H))return H}throw Error(`\u8D85\u8FC7\u4E86\u6700\u5927\u5FAA\u73AF\u6B21\u6570\uFF08${M}\uFF09\u4E14\u672A\u6EE1\u8DB3\u505C\u6B62\u6267\u884C\u6761\u4EF6`)};var L=(I,$=-1)=>{let M=new Map,W=(...z)=>{let H=JSON.stringify(z),D=Date.now(),J=M.get(H);if(J&&D<J.expiresAt)return J.value;let G=$===-1?1/0:D+$*1000,X={setTtl:(Z)=>{G=D+Z*1000}},_=I.apply(X,z);if(_ instanceof Promise){let Z=_.then((C)=>{return M.set(H,{value:C,expiresAt:G}),C});return M.set(H,{value:Z,expiresAt:G}),Z}return M.set(H,{value:_,expiresAt:G}),_};return W.clear=()=>M.clear(),W.updateTtl=(z)=>{$=z;let H=Date.now(),D=H+z*1000;for(let[J,G]of M.entries())if(G.expiresAt>H)G.expiresAt=D,M.set(J,G)},W};var Q=(I)=>{return I?.constructor===Object},Y=(I)=>{return I===null||I===void 0||typeof I!=="object"&&typeof I!=="function"},U=(I)=>{return!I},V=(I)=>{return!!I},T=(I)=>{return I===null||I===void 0};var P=(I,$)=>{let M={...I};for(let W of Object.keys($)){let z=M[W],H=$[W];if(Y(z)&&Y(H)){M[W]=H;continue}if(Array.isArray(z)&&Array.isArray(H)){M[W]=z.concat(H);continue}if(Q(z)&&Q(H)){M[W]=P(z,H);continue}M[W]=H}return M},B=(I,$)=>{if(Array.isArray(I))return I.map((M)=>B(M,$));if(Q(I))return Object.keys(I).reduce((W,z)=>{let H=$(z),D=I[z];return W[H]=B(D,$),W},{});return I},F=(I,$,M)=>{let{filter:W}=M??{};if(Array.isArray(I)){let z=I.map((H,D)=>{if(Q(H))return F(H,$,M);return $(H,D)});if(W)return z.filter((H,D)=>W(H,D));return z}if(Q(I))return Object.keys(I).reduce((H,D)=>{let J=I[D],G;if(Q(J)||Array.isArray(J))G=F(J,$,M);else G=$(J,D);if(!W||W(G,D))H[D]=G;return H},{});return I};var q=(I="",$={})=>{let M=async(W,z={})=>{let H=new URL(I?`${I}${W}`:W),{params:D,parser:J,...G}=P($,z);if(Q(D))Object.entries(D).forEach(([Z,C])=>{if(T(C))return;H.searchParams.append(Z,C.toString())});if(Q(G.body))G.body=JSON.stringify(G.body),G.headers={...G.headers,"Content-Type":"application/json"};let X=await fetch(H,G);if(!X.ok){if(X.headers.get("Content-Type")?.startsWith("application/json"))throw await X.json();throw Error(X.statusText)}return await(J?.(X)??X.json())};return{get:(W,z)=>M(W,{...z,method:"GET"}),post:(W,z,H)=>M(W,{...H,method:"POST",body:z}),put:(W,z,H)=>M(W,{...H,method:"PUT",body:z}),delete:(W,z)=>M(W,{...z,method:"DELETE"})}},x=async(I)=>{try{return[null,await I]}catch($){return[$,void 0]}},w=async(I)=>{let[$,M]=await x(fetch(I,{method:"HEAD",redirect:"manual"}));if($)return I;return M.headers.get("location")||I};var d=(I,$)=>{return Math.floor(Math.random()*($-I+1))+I};import E from"sharp";var b=(I)=>{return I.replace(/_([a-zA-Z])/g,($,M)=>M.toUpperCase())},y=(I)=>{return I.replace(/([A-Z])/g,($,M)=>`_${M.toLowerCase()}`)},p=(I)=>{return I.charAt(0).toUpperCase()+I.slice(1)},n=(I)=>{return I.charAt(0).toLowerCase()+I.slice(1)},u=async(I,{quality:$=0.92}={})=>{if(!I.startsWith("http"))throw Error("\u56FE\u7247\u5730\u5740\u5FC5\u987B\u4EE5http\u6216https\u5F00\u5934");let M="",W=await q().get(I,{parser:async(D)=>{return M=D.headers.get("Content-Type")||"image/jpeg",D.arrayBuffer()}}),z=Buffer.from(W),H;if(M==="image/png")H=await E(z).png({compressionLevel:Math.round($*9)}).toBuffer();else if(M==="image/gif")H=await E(z).gif().toBuffer();else H=await E(z).jpeg({quality:$}).toBuffer();return`data:${M};base64,${H.toString("base64")}`},o=(I="",$)=>{if(!I)return"";let{maxLength:M=1/0,disableNewLineReplace:W=!1,disableWhitespaceCollapse:z=!1,omission:H="..."}=$??{},D=I;if(!W)D=D.replace(/\r?\n/g,"\\n");else D=D.replace(/\r?\n/g," ");if(!z)D=D.replace(/\s+/g," ");if(D=D.trim(),M>0&&D.length>M)return D.slice(0,M)+H;return D};var i=async(I=150)=>{return new Promise(($)=>{setTimeout($,I)})},r=(I,$=300)=>{let M=null;return(...W)=>{if(M)clearTimeout(M);M=setTimeout(()=>{I(...W)},$)}},l=(I,$=300)=>{let M=null;return function(...W){if(!M)M=setTimeout(()=>{M=null,I.apply(this,W)},$)}};export{L as withCache,x as to,S as timeLog,l as throttle,b as snakeToCamel,i as sleep,d as randomInt,P as mergeObjects,F as mapValues,B as mapKeys,K as loopUntil,V as isTruthy,Y as isPrimitive,Q as isObject,T as isNil,U as isFalsy,u as imageUrlToBase64,w as getRealURL,q as fetcher,n as decapitalize,r as debounce,o as compactStr,p as capitalize,y as camelToSnake};
2
+ var A=(...I)=>{console.log(`${new Date().toLocaleTimeString()}`,...I)};var B=async(I,$)=>{let{maxRetries:M=5,shouldStop:W=()=>!0}=$??{};for(let z=0;z<M;z++){let H=await I(z);if(W(H))return H}throw Error(`\u8D85\u8FC7\u4E86\u6700\u5927\u5FAA\u73AF\u6B21\u6570\uFF08${M}\uFF09\u4E14\u672A\u6EE1\u8DB3\u505C\u6B62\u6267\u884C\u6761\u4EF6`)};var O=(I,$=-1)=>{let M=new Map,W=(...z)=>{let H=JSON.stringify(z),D=Date.now(),J=M.get(H);if(J&&D<J.expiresAt)return J.value;let G=$===-1?1/0:D+$*1000,Q={setTtl:(X)=>{G=D+X*1000}},_=I.apply(Q,z);if(_ instanceof Promise){let X=_.then((C)=>{return M.set(H,{value:C,expiresAt:G}),C});return M.set(H,{value:X,expiresAt:G}),X}return M.set(H,{value:_,expiresAt:G}),_};return W.clear=()=>M.clear(),W.updateTtl=(z)=>{$=z;let H=Date.now(),D=H+z*1000;for(let[J,G]of M.entries())if(G.expiresAt>H)G.expiresAt=D,M.set(J,G)},W};var Z=(I)=>{return I?.constructor===Object},P=(I)=>{return I===null||I===void 0||typeof I!=="object"&&typeof I!=="function"},V=(I)=>{return!I},N=(I)=>{return!!I},q=(I)=>{return I===null||I===void 0};var E=(I,$)=>{let M={...I};for(let W of Object.keys($)){let z=M[W],H=$[W];if(P(z)&&P(H)){M[W]=H;continue}if(Array.isArray(z)&&Array.isArray(H)){M[W]=z.concat(H);continue}if(Z(z)&&Z(H)){M[W]=E(z,H);continue}M[W]=H}return M},F=(I,$)=>{if(Array.isArray(I))return I.map((M)=>F(M,$));if(Z(I))return Object.keys(I).reduce((W,z)=>{let H=$(z),D=I[z];return W[H]=F(D,$),W},{});return I},T=(I,$,M)=>{let{filter:W}=M??{};if(Array.isArray(I)){let z=I.map((H,D)=>{if(Z(H))return T(H,$,M);return $(H,D)});if(W)return z.filter((H,D)=>W(H,D));return z}if(Z(I))return Object.keys(I).reduce((H,D)=>{let J=I[D],G;if(Z(J)||Array.isArray(J))G=T(J,$,M);else G=$(J,D);if(!W||W(G,D))H[D]=G;return H},{});return I};var d=(I="",$={})=>{let M=async(W,z={})=>{let H=new URL(I?`${I}${W}`:W),{params:D,parser:J,...G}=E($,z);if(Z(D))Object.entries(D).forEach(([X,C])=>{if(q(C))return;H.searchParams.append(X,C.toString())});if(Z(G.body))G.body=JSON.stringify(G.body),G.headers={...G.headers,"Content-Type":"application/json"};let Q=await fetch(H,G);if(!Q.ok){if(Q.headers.get("Content-Type")?.startsWith("application/json"))throw await Q.json();throw Error(Q.statusText)}return await(J?.(Q)??Q.json())};return{get:(W,z)=>M(W,{...z,method:"GET"}),post:(W,z,H)=>M(W,{...H,method:"POST",body:z}),put:(W,z,H)=>M(W,{...H,method:"PUT",body:z}),delete:(W,z)=>M(W,{...z,method:"DELETE"})}},K=async(I)=>{try{return[null,await I]}catch($){return[$,void 0]}},j=async(I)=>{let[$,M]=await K(fetch(I,{method:"HEAD",redirect:"manual"}));if($)return I;return M.headers.get("location")||I};var v=(I,$)=>{return Math.floor(Math.random()*($-I+1))+I};var b=(I)=>{return I.replace(/_([a-zA-Z])/g,($,M)=>M.toUpperCase())},y=(I)=>{return I.replace(/([A-Z])/g,($,M)=>`_${M.toLowerCase()}`)},p=(I)=>{return I.charAt(0).toUpperCase()+I.slice(1)},n=(I)=>{return I.charAt(0).toLowerCase()+I.slice(1)},Y=(I)=>{let $=new Uint8Array(I),M="";for(let W=0;W<$.byteLength;W++)M+=String.fromCharCode($[W]);return btoa(M)},u=async(I,$={})=>{let{quality:M=0.92,compressor:W}=$;if(!I.startsWith("http"))throw Error("\u56FE\u7247\u5730\u5740\u5FC5\u987B\u4EE5http\u6216https\u5F00\u5934");let z=await fetch(I);if(!z.ok)throw Error(`\u83B7\u53D6\u56FE\u7247\u5931\u8D25: ${z.statusText}`);let H=z.headers.get("Content-Type")||"image/jpeg",D=await z.arrayBuffer();if(H!=="image/jpeg"&&H!=="image/png"){let G=Y(D);return`data:${H};base64,${G}`}if(W)return await W(D,H,M);if(typeof OffscreenCanvas<"u"){let G=null;try{let Q=new Blob([D],{type:H});G=await createImageBitmap(Q);let _=new OffscreenCanvas(G.width,G.height),X=_.getContext("2d");if(!X)throw Error("\u65E0\u6CD5\u83B7\u53D6 canvas context");X.drawImage(G,0,0),G.close(),G=null;let x=await(await _.convertToBlob({type:H,quality:M})).arrayBuffer(),S=Y(x);return`data:${H};base64,${S}`}catch{G?.close();let Q=Y(D);return`data:${H};base64,${Q}`}}let J=Y(D);return`data:${H};base64,${J}`},o=(I="",$)=>{if(!I)return"";let{maxLength:M=1/0,disableNewLineReplace:W=!1,disableWhitespaceCollapse:z=!1,omission:H="..."}=$??{},D=I;if(!W)D=D.replace(/\r?\n/g,"\\n");else D=D.replace(/\r?\n/g," ");if(!z)D=D.replace(/\s+/g," ");if(D=D.trim(),M>0&&D.length>M)return D.slice(0,M)+H;return D};var i=async(I=150)=>{return new Promise(($)=>{setTimeout($,I)})},r=(I,$=300)=>{let M=null;return(...W)=>{if(M)clearTimeout(M);M=setTimeout(()=>{I(...W)},$)}},a=(I,$=300)=>{let M=null;return function(...W){if(!M)M=setTimeout(()=>{M=null,I.apply(this,W)},$)}};export{O as withCache,K as to,A as timeLog,a as throttle,b as snakeToCamel,i as sleep,v as randomInt,E as mergeObjects,T as mapValues,F as mapKeys,B as loopUntil,N as isTruthy,P as isPrimitive,Z as isObject,q as isNil,V as isFalsy,u as imageUrlToBase64,j as getRealURL,d as fetcher,n as decapitalize,r as debounce,o as compactStr,p as capitalize,y as camelToSnake};
package/dist/network.d.ts CHANGED
@@ -1,4 +1,8 @@
1
- export type RequestInit = BunFetchRequestInit & {
1
+ type BunFetchOptions = {
2
+ /** 代理服务器配置(仅 Bun 支持) */
3
+ proxy?: string;
4
+ };
5
+ export type RequestInit = globalThis.RequestInit & BunFetchOptions & {
2
6
  params?: Record<string, any>;
3
7
  parser?: (response: Response) => Promise<any>;
4
8
  };
@@ -14,6 +18,7 @@ export type RequestInit = BunFetchRequestInit & {
14
18
  * - 在 body 里传递对象,自动 JSON.stringify
15
19
  * - 可选择使用 to() 转换请求结果为 [Error, Response]
16
20
  * - 可选择使用 withCache() 缓存请求结果
21
+ * - 支持 proxy 选项(仅在 Bun 环境有效)
17
22
  *
18
23
  * @example
19
24
  *
@@ -24,6 +29,11 @@ export type RequestInit = BunFetchRequestInit & {
24
29
  * const api = fetcher("https://nickyzj.run:3030", { headers: { Authorization: "Bearer token" } });
25
30
  * const res = await api.get<Blog>("/blogs/hello-world", { headers: {...}, params: { page: 1 } }); // 与实例相同的 headers 会覆盖上去,params 会转成 ?page=1 跟到 url 后面
26
31
  *
32
+ * // 用法3:使用代理(仅 Bun 环境)
33
+ * const api = fetcher("https://api.example.com", {
34
+ * proxy: "http://127.0.0.1:7890"
35
+ * });
36
+ *
27
37
  * // 安全处理请求结果
28
38
  * const [error, data] = await to(api.get<Blog>("/blogs/hello-world"));
29
39
  * if (error) {
@@ -55,3 +65,4 @@ export declare const fetcher: (baseURL?: string, baseOptions?: RequestInit) => {
55
65
  export declare const to: <T, E = Error>(promise: Promise<T>) => Promise<[null, T] | [E, undefined]>;
56
66
  /** 从 url 响应头获取真实链接 */
57
67
  export declare const getRealURL: (originURL: string) => Promise<string>;
68
+ export {};
package/dist/string.d.ts CHANGED
@@ -30,22 +30,49 @@ export type Decapitalize<S extends string> = S extends `${infer P1}${infer Rest}
30
30
  * decapitalize("Hello") // "hello"
31
31
  */
32
32
  export declare const decapitalize: <S extends string>(s: S) => Decapitalize<S>;
33
+ /**
34
+ * 图片压缩选项
35
+ */
36
+ export type ImageCompressionOptions = {
37
+ /** 压缩比率,默认 0.92 */
38
+ quality?: number;
39
+ /**
40
+ * 自定义压缩函数,用于非浏览器环境(Node.js/Bun)
41
+ * 如果提供,将使用此函数替代默认的 canvas 压缩
42
+ * @param arrayBuffer 图片的 ArrayBuffer 数据
43
+ * @param mime 图片的 MIME 类型
44
+ * @param quality 压缩质量
45
+ * @returns 压缩后的 base64 字符串
46
+ */
47
+ compressor?: (arrayBuffer: ArrayBuffer, mime: string, quality: number) => Promise<string> | string;
48
+ };
33
49
  /**
34
50
  * 图片地址转 base64 数据
35
51
  *
36
52
  * @param imageUrl 图片地址
37
53
  * @param options 可选配置
38
54
  * @param options.quality 压缩比率,默认 0.92
55
+ * @param options.compressor 自定义压缩函数,用于 Node.js/Bun 环境
39
56
  *
40
57
  * @example
41
- * imageUrlToBase64("https://example.com/image.gif"); // "data:image/gif;base64,..."
58
+ * // 基本用法(浏览器自动使用 Canvas 压缩)
59
+ * imageUrlToBase64("https://example.com/image.jpg");
42
60
  *
43
61
  * @example
44
- * imageUrlToBase64("https://example.com/image.jpg", { quality: 0.8 }); // 压缩至 80% 质量
62
+ * // Node.js/Bun 使用 sharp 压缩
63
+ * import sharp from "sharp";
64
+ *
65
+ * imageUrlToBase64("https://example.com/image.jpg", {
66
+ * quality: 0.8,
67
+ * compressor: async (buffer, mime, quality) => {
68
+ * const compressed = await sharp(Buffer.from(buffer))
69
+ * .jpeg({ quality: Math.round(quality * 100) })
70
+ * .toBuffer();
71
+ * return `data:${mime};base64,${compressed.toString("base64")}`;
72
+ * }
73
+ * });
45
74
  */
46
- export declare const imageUrlToBase64: (imageUrl: string, { quality }?: {
47
- quality?: number;
48
- }) => Promise<string>;
75
+ export declare const imageUrlToBase64: (imageUrl: string, options?: ImageCompressionOptions) => Promise<string>;
49
76
  /**
50
77
  * 将字符串压缩为单行精简格式
51
78
  *
@@ -1,92 +1,99 @@
1
- :root {
2
- --light-hl-0: #008000;
3
- --dark-hl-0: #6A9955;
4
- --light-hl-1: #795E26;
5
- --dark-hl-1: #DCDCAA;
6
- --light-hl-2: #000000;
7
- --dark-hl-2: #D4D4D4;
8
- --light-hl-3: #A31515;
9
- --dark-hl-3: #CE9178;
10
- --light-hl-4: #AF00DB;
11
- --dark-hl-4: #C586C0;
12
- --light-hl-5: #001080;
13
- --dark-hl-5: #9CDCFE;
14
- --light-hl-6: #0000FF;
15
- --dark-hl-6: #569CD6;
16
- --light-hl-7: #0070C1;
17
- --dark-hl-7: #4FC1FF;
18
- --light-hl-8: #267F99;
19
- --dark-hl-8: #4EC9B0;
20
- --light-hl-9: #098658;
21
- --dark-hl-9: #B5CEA8;
22
- --light-code-background: #FFFFFF;
23
- --dark-code-background: #1E1E1E;
24
- }
25
-
26
- @media (prefers-color-scheme: light) { :root {
27
- --hl-0: var(--light-hl-0);
28
- --hl-1: var(--light-hl-1);
29
- --hl-2: var(--light-hl-2);
30
- --hl-3: var(--light-hl-3);
31
- --hl-4: var(--light-hl-4);
32
- --hl-5: var(--light-hl-5);
33
- --hl-6: var(--light-hl-6);
34
- --hl-7: var(--light-hl-7);
35
- --hl-8: var(--light-hl-8);
36
- --hl-9: var(--light-hl-9);
37
- --code-background: var(--light-code-background);
38
- } }
39
-
40
- @media (prefers-color-scheme: dark) { :root {
41
- --hl-0: var(--dark-hl-0);
42
- --hl-1: var(--dark-hl-1);
43
- --hl-2: var(--dark-hl-2);
44
- --hl-3: var(--dark-hl-3);
45
- --hl-4: var(--dark-hl-4);
46
- --hl-5: var(--dark-hl-5);
47
- --hl-6: var(--dark-hl-6);
48
- --hl-7: var(--dark-hl-7);
49
- --hl-8: var(--dark-hl-8);
50
- --hl-9: var(--dark-hl-9);
51
- --code-background: var(--dark-code-background);
52
- } }
53
-
54
- :root[data-theme='light'] {
55
- --hl-0: var(--light-hl-0);
56
- --hl-1: var(--light-hl-1);
57
- --hl-2: var(--light-hl-2);
58
- --hl-3: var(--light-hl-3);
59
- --hl-4: var(--light-hl-4);
60
- --hl-5: var(--light-hl-5);
61
- --hl-6: var(--light-hl-6);
62
- --hl-7: var(--light-hl-7);
63
- --hl-8: var(--light-hl-8);
64
- --hl-9: var(--light-hl-9);
65
- --code-background: var(--light-code-background);
66
- }
67
-
68
- :root[data-theme='dark'] {
69
- --hl-0: var(--dark-hl-0);
70
- --hl-1: var(--dark-hl-1);
71
- --hl-2: var(--dark-hl-2);
72
- --hl-3: var(--dark-hl-3);
73
- --hl-4: var(--dark-hl-4);
74
- --hl-5: var(--dark-hl-5);
75
- --hl-6: var(--dark-hl-6);
76
- --hl-7: var(--dark-hl-7);
77
- --hl-8: var(--dark-hl-8);
78
- --hl-9: var(--dark-hl-9);
79
- --code-background: var(--dark-code-background);
80
- }
81
-
82
- .hl-0 { color: var(--hl-0); }
83
- .hl-1 { color: var(--hl-1); }
84
- .hl-2 { color: var(--hl-2); }
85
- .hl-3 { color: var(--hl-3); }
86
- .hl-4 { color: var(--hl-4); }
87
- .hl-5 { color: var(--hl-5); }
88
- .hl-6 { color: var(--hl-6); }
89
- .hl-7 { color: var(--hl-7); }
90
- .hl-8 { color: var(--hl-8); }
91
- .hl-9 { color: var(--hl-9); }
92
- pre, code { background: var(--code-background); }
1
+ :root {
2
+ --light-hl-0: #008000;
3
+ --dark-hl-0: #6A9955;
4
+ --light-hl-1: #795E26;
5
+ --dark-hl-1: #DCDCAA;
6
+ --light-hl-2: #000000;
7
+ --dark-hl-2: #D4D4D4;
8
+ --light-hl-3: #A31515;
9
+ --dark-hl-3: #CE9178;
10
+ --light-hl-4: #AF00DB;
11
+ --dark-hl-4: #C586C0;
12
+ --light-hl-5: #001080;
13
+ --dark-hl-5: #9CDCFE;
14
+ --light-hl-6: #0000FF;
15
+ --dark-hl-6: #569CD6;
16
+ --light-hl-7: #0070C1;
17
+ --dark-hl-7: #4FC1FF;
18
+ --light-hl-8: #267F99;
19
+ --dark-hl-8: #4EC9B0;
20
+ --light-hl-9: #098658;
21
+ --dark-hl-9: #B5CEA8;
22
+ --light-hl-10: #000000FF;
23
+ --dark-hl-10: #D4D4D4;
24
+ --light-code-background: #FFFFFF;
25
+ --dark-code-background: #1E1E1E;
26
+ }
27
+
28
+ @media (prefers-color-scheme: light) { :root {
29
+ --hl-0: var(--light-hl-0);
30
+ --hl-1: var(--light-hl-1);
31
+ --hl-2: var(--light-hl-2);
32
+ --hl-3: var(--light-hl-3);
33
+ --hl-4: var(--light-hl-4);
34
+ --hl-5: var(--light-hl-5);
35
+ --hl-6: var(--light-hl-6);
36
+ --hl-7: var(--light-hl-7);
37
+ --hl-8: var(--light-hl-8);
38
+ --hl-9: var(--light-hl-9);
39
+ --hl-10: var(--light-hl-10);
40
+ --code-background: var(--light-code-background);
41
+ } }
42
+
43
+ @media (prefers-color-scheme: dark) { :root {
44
+ --hl-0: var(--dark-hl-0);
45
+ --hl-1: var(--dark-hl-1);
46
+ --hl-2: var(--dark-hl-2);
47
+ --hl-3: var(--dark-hl-3);
48
+ --hl-4: var(--dark-hl-4);
49
+ --hl-5: var(--dark-hl-5);
50
+ --hl-6: var(--dark-hl-6);
51
+ --hl-7: var(--dark-hl-7);
52
+ --hl-8: var(--dark-hl-8);
53
+ --hl-9: var(--dark-hl-9);
54
+ --hl-10: var(--dark-hl-10);
55
+ --code-background: var(--dark-code-background);
56
+ } }
57
+
58
+ :root[data-theme='light'] {
59
+ --hl-0: var(--light-hl-0);
60
+ --hl-1: var(--light-hl-1);
61
+ --hl-2: var(--light-hl-2);
62
+ --hl-3: var(--light-hl-3);
63
+ --hl-4: var(--light-hl-4);
64
+ --hl-5: var(--light-hl-5);
65
+ --hl-6: var(--light-hl-6);
66
+ --hl-7: var(--light-hl-7);
67
+ --hl-8: var(--light-hl-8);
68
+ --hl-9: var(--light-hl-9);
69
+ --hl-10: var(--light-hl-10);
70
+ --code-background: var(--light-code-background);
71
+ }
72
+
73
+ :root[data-theme='dark'] {
74
+ --hl-0: var(--dark-hl-0);
75
+ --hl-1: var(--dark-hl-1);
76
+ --hl-2: var(--dark-hl-2);
77
+ --hl-3: var(--dark-hl-3);
78
+ --hl-4: var(--dark-hl-4);
79
+ --hl-5: var(--dark-hl-5);
80
+ --hl-6: var(--dark-hl-6);
81
+ --hl-7: var(--dark-hl-7);
82
+ --hl-8: var(--dark-hl-8);
83
+ --hl-9: var(--dark-hl-9);
84
+ --hl-10: var(--dark-hl-10);
85
+ --code-background: var(--dark-code-background);
86
+ }
87
+
88
+ .hl-0 { color: var(--hl-0); }
89
+ .hl-1 { color: var(--hl-1); }
90
+ .hl-2 { color: var(--hl-2); }
91
+ .hl-3 { color: var(--hl-3); }
92
+ .hl-4 { color: var(--hl-4); }
93
+ .hl-5 { color: var(--hl-5); }
94
+ .hl-6 { color: var(--hl-6); }
95
+ .hl-7 { color: var(--hl-7); }
96
+ .hl-8 { color: var(--hl-8); }
97
+ .hl-9 { color: var(--hl-9); }
98
+ .hl-10 { color: var(--hl-10); }
99
+ pre, code { background: var(--code-background); }
@@ -1 +1 @@
1
- window.navigationData = "eJyNlF1P2zAUQP/Lfa4IQwU0P64ICa3A1KZ7QTwY99IY/JHFN9vKxH9HarDUWNfOXnNyjmLn2g//gPAvgYCFtGhqv3byFWEGraQGBNC+xVAds5OGrIEZvGq3BXF2+vXyy/nZ+yx2YCFbTdLot7RSRfI21YArVLlKdcymOleI7a1sv+M+pJmIcB/+s/JTmh5znQFOla6lCfu0cHg4Zf7otNWkf6fbUUUwtRewwl89BrpxmtJGRE7TVGWNVJNJA8PTKfcwPrU/DFNaOGZTHcVO6nPvFGnvQqVy0you5qNMOmLjCD9k44S3rVS0po5NRNrlEiBgi0++d4r9hsiKenkZ29xpGWeekVSD7Co+UU4GATukFUqzWS05P9LVMpcAAdrKHW46U/tvMuDFnAul75RyITlpsRKqT1SU77Th1TttiuL90wsq4t2BFfX0kCeFzFFPInXXU5NZ+sByOggw3rcbR/z6IyztgU1v26iHynK3bSqnl+xI5y7ZcQC7HQ4bzTciV1TKdNJtvb1x7J+MsPQrg0FsOfkASiJ7RUY/VCF3TY4z1HSeyLBzFFlJ1xaXfsfaAyrJnvV8TgEBfzQ1C6ka9nsjTD94/v74Abx58Vc="
1
+ window.navigationData = "eJyNlF1v2jAUQP+Ln9HaoX5oPJZqEiqDCkJfpj245pZ49Vfjm21s2n+fICU4zo2915yco9jx9dc/DOEXsgmbcg2qsGvDX4GNmONYsgnDvQN/EbIPJWrFRuxVmi2bjC8/3X68Hv8dBR0nkSv5m6icSK5xD2KwErJ8B9wX7h5g7/uZFv1n5YmrGoY6DcyVPnPl93Hh+DBnzjTfwdRqV4H30pqlQ2lN72sGXsvVHyupJcofvc1uQa6wgrcaPM6MxLgRoFxlDVigigPN06x7OJyFPR7VXiFguY4g5+ClNuK4lRdicBZurjqZ/gEOI/QR7iasdlzgGisy0dJEYgvPtjaC/IYTS+rpZWwHZ7GTeQEUJZCreEcJeQe4Aq42qznln2kiIQ9TsalUYe+4h5srKhS/k8r5aI6DiiemOZIXUtHqQqqkuHz+DgJpt2FJnRjysDAw6lGkqGosB5besISurHUbg/T6W5gI6PguP+uaustjOb7COzp1hXcDUO2g2Wi6EfBEpuJma/XMkH+yhYmAVwCOko8gJZJXZOAPXpOdDJaVRVTkOTqxlC41zO2OtBuUki3p2YTyU2I55aIkv7eFvcC3f/16Em8="
@@ -1 +1 @@
1
- window.searchData = "eJydmN1u4zYQhd9lroXYpGwn5mVTFAiaboskuzdCUCgyk7DRjyvS2WYFv3tBUQNQg3FD9yrBGZ/PEn1GFGeAvvtuQRUDvJl2B0out5diLTNoy0aDguuy0fVDd9+WbxoyOPQ1KHAfe20Xceni1TU1ZFDVpbXaggI4ZqeY1+XeuLI2PygRCz/O4/2sq1PEuHQmU+9/K/e/6g9LkVj5sP+H+K2sD/oEM9TOov5S1vaD0EbtLMofvWmMM+90+VA/b+3u9N8Hbd1NaxzhYaU17izivXYPriawIJ7H8Vl96MbkUhqWGv3fzM0KcVBxzfF8aCtnutYuqtQGmSFpkmfApCzHuK7Zl5W7dz2Hw2Kfitvpp+7QVty1YSkVteOaNsade7MKnrWrXjV3p1MlFfSi3Z0u6693t5TV2gUW725TcaYpX/TXvn7ofiqt3qwotLUL+pFUtLHzBwAS7WKqpIKM/WJqFvPFpPYDGPv701+6ciwnlFJRxtJn0pyW9mSaAR/6g3vllyqUUlF11+2/to5dL6ylrhk0ZJNBlF00n20yFET3lhnqs72FwHT/osMvxvKwXLlUJPRlu+uam5ZLB9ZS4wG21npPQa1djHoqxHK7AbLswp67I/i95LXvnKu5zGIpFeVMo2+7F44UKqkg13GMLtX+3bjX67J65e4Ja+xNPWZg2p3+B9QA77q3pmtBgbzIL7aQwbPR9c6/eYbvyfxW1egxHbuuOoz/Pk4f+6Yr1/X+w+HTiyVkxTKTm4t8Kx4fswLNY2EUkIHKZBSQFYIzCmpEZTJKyArJGSU1ojIZc8iKPMvFxWq7nRlzakRlMq4gK1accUWNqEzGNWTFmjOuqRGVybiBrNhwxg01ojIZLyErLjnjJTWiMhmvICuuOOMVNaIyGbeQFVvu59hSIyoYgFPRCRUSARKeU+kJFeKd50f4VIgld6+CRiiWgtknQwjWTGMUS8G8OhVdQZMUS8HrAyIk+8U0TbEUzD4kgs2+oImKpWD2QRFs/gVNVSwFsw+LYHtA0GTFUjD7wAi2DwRNVyyFx4RPjGB7QdJ8xVIwj/li+0HSgMVSMI8B27JmGrBYCmYfGcmmU9KAxVIwjwFj0ylpwmIpmH1mJJswSRMWS8HsMyPZhEmasFgKZp8ZySZM0oTFUjD7zEg2YZImLJaC+dTTK1SIdx6w3EdGsunMacBiKZh9ZCSbzpwGLJaCedwC2XTmNGCxFMxjwNh05jRgKD2OLxDvund6dxNeJIoinLldZ8OZe4A/p3eMJb6wDLAENRwzEOPfI75ZuKDil4y18TrwnDnDCcQNICacSMOFQ7X1J27EgRJ4eZ4nk0B4oJ5h4svKEzH8DeJQRA0gpxtcJQL1vin3b+OhBXmgcuQNkHphI+d9OrMgCRS+eqoB0q7oORyBkQBqjYQB1mkEnBwgA5TABfJLnUZ50a7XZe1fkmMQrowHbZJA4zTg0Neue5oGBogDJXB5PO4yDWfpCimBS+QpV4mU1sxvbIOMAcQ2kdFNAwLEgBKXiBlAprWssXs8/s9IV0gaQKZ1q7FumgogBpTYImYAmdar/tR/CBMB5PjhI3IGkGk9QfvKU7DlPSWtH9iuknHDp+V5POV3OARAFCiJifaotESzvxfmRw2QRgljAtPO8iOxIfzVpDVEH8bQZhxQIwkUBlENkMax2jk3+80xgWqAtK6aBhlIACWxM/3tJDL8Xui6KswxEAUKc6wG2AarTGtTHFXMrgt/Lf+AT2tTP6eo/QQDKaAkrrGnpLWoH18gAJTEFfaAtOb0Q4oqDDCQA0ri4njOZ815PPp3kb3Z69q0GlTxeDz+C1kStC8=";
1
+ window.searchData = "eJydmdtu4zYQQP+FfRUSc+j7Y1MUCLrdLZLsvghGochMzEa3lehs0yD/vqAkW0NxnI7zlECjOaKoM6Q0fhV1+aMR6/hVPJliK9YwWS3kDCJRJLkWa3GV5Dq7K2+L5EmLSOzrTKyFfal0c4lDFzubZyISaZY0jW7EWoi36DSzMjbJzH8h8RA4i/ebTk8RcehMpq7+TKo/9EsTII+RjxC/Jdlen2B2sbOovydZ8zKitcfOolznyaO+KvOq1k1jyuJLZU1ZjEd54qx3ryQnMD1eJu1zy/oM8i9eFrpIJKqk1oV9Z/wnxvF9n2TGjqft3UEMKR8dwXjO/6pNbqx5Hit7PH7WE7zR3/e6sdeFsSMeipxFvNX2zmYjWHfwPI5bH+7KdrUY01DoXeYcOUQtSA/7Im3n+zLlLkoeMlg9MJC1fsx9y5PU3tqawh2DXNxW35f7IqXGdgjxUe/e6pa7WCLkg7bpTlN32ke4oEdtb3SSfb35RLCGIBdnXD1+rbO78tek0fMpAR2fwkY3/qKLiM3/L70e6LPJSMxnw64H03y5/0enluR0IT4qXJMwjbcyecC7em939FR1IS4qK8vqa2HJ+TrGuLB8tLEPqJyxsfug0X7uoRj7OYbp+lF3T4zkoTAXWSfFtsyvC8qOY4wLazKtKwLUHmdDqN0AsT6wI9hdXVqbUc4eQmyUyfWn8pEidRE2qKQYJTf9h7G7qyTdUfd0jFGwTSRMsdX/ivWreNa1exMRawEX6mIlIvFgdLZ1b/vddSK3VeW6tWNbpvv2301/2jed2rJ2J3dnX05EFE8iWFyAVJtNFB+S20B74MAYjrSJUkSxpBJlkCi9RBBRDFQiBIngJSoRxSpScKFAeokqSFRe4lRE8ZRKnAaJUy9xJqJ4RiXOgsSZlzgXUTynEudB4txLXIgoXlCJiyBx4SUuRRQvqcRlkLj0ElciildU4ipIXPkCOB/khEqVoTxyZE+rjySTCYF8g6TzQpIOyVAi6Vsk1SnjZeiR9EWS05PShypJ3yXpDJGkvzLUSfo+SWeJJB2WoVLSd0ouTlWcDK2SvlbSySLJGpChWdJXSzphJFkHMrRL+npBqxdZCxDqBb5e0OpF1gOEesFogWr1ImsCiDXK1wucMUBWBYR+ge8XOGWArAoIBQNfMHDKAJDJoWDgCwZOGSDthFAw8AWDVjDSTggNA98wcM4AaRiEhoFvGDhngDQMQsPAN0w5Z4A0TIWGKd8w5ZwB0jAVGqZ8w9TpBUyFhqnRNtgaRuqpiJ3QN0w5ZxSppwoNU75hyjmjSD1VaJjyDVPOGUXqqULD+kPti8+zrq3eXncvQHHc9Qps2XS9glfxd/9uNDm8aL2KiVi/vkVCKvf3bXgjao8eX4pcrB0H+nwecHLAyR435eG6ZkDjOgUIpxBvxgYdWmQDaDFwFizM0GpAo5mi0cyZGHqeYCBBP0/ccekqT6qn9ptt4KF54j2+nvPcf7INJHSPvCf30HUABsJsIPAe2bFxgqYaQeSSRXnUttZJ5r4RMGiOQCsWqG2GpEP/sjx0gAcqgvI8aJn7OrPlfd+DQUNEcsKEh2uCWZdLRJFMSmH8yVohBjAZZd9zQXKjRQV4OpqmGvotiITWE+DpaBrbN1oQBpcbz0nXSNl3TRbEQWUGvAdP1CqgEgNe1ZOVCqhGgFcjbeOkPPRVEAoJDbwqIZ8X8odHOf6WMDCQx7yb6ro3pvAdREWleEVVd78OmPZ3A1QUyGbJIzXaWutXFt4YedXZ95jQLaGZUUyG2+5tmXYtJjQcVBCy34AUr+CHFhMaGXruilfwromUufYS2sPQRCtesbveEgKgSVa8MncdpLTrLiEOmh3FKPNNJCpT6cwUWqzjzdvbT3XIt20=";