@cryptlex/web-components 6.6.6-alpha74 → 6.6.6-alpha76

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.
@@ -1,2 +1,2 @@
1
- import m from"zod";import{Duration as c}from"./duration.js";const d=2147483647,i=Math.floor(d/86400),f=-2147483648,y=Math.ceil(f/86400);function _(e,t){return m.number().min(e,{error:n=>{if(n.code==="too_small")return`The number must be at least ${a(e)}.`}}).max(t,{error:n=>{if(n.code==="too_big")return`The number must be at most ${a(t)}.`}})}const o=86400;function b(e){const t=e*o,n=i*o;return m.number().min(t,{error:`The number must be at least ${a(e)} days.`}).max(n,{error:`The number must be at most ${a(i)} days.`})}function g(e){return`${Math.floor(e/o)} days`}function a(e,t){return Intl.NumberFormat(navigator.language,t).format(e)}function D(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:e<1024*1024*1024?`${(e/(1024*1024)).toFixed(2)} MB`:`${(e/(1024*1024*1024)).toFixed(2)} GB`}function N(e=10){const t=365*e,n=s=>{try{const r=c.parse(s);return{years:r.years??0,months:r.months??0,days:(r.days??0)+(r.weeks??0)*7,hours:r.hours??0,minutes:r.minutes??0,seconds:r.seconds??0}}catch{return{years:0,months:0,days:0,hours:0,minutes:0,seconds:0}}};return m.string().refine(s=>{const r=n(s);return Object.values(r).some(u=>u>0)},{message:"At least one value (years, months, days, hours, minutes, or seconds) must be non-zero"}).refine(s=>{const r=n(s),u=(r.hours*3600+r.minutes*60+r.seconds)/o;return r.years*365+r.months*30+r.days+u<=t},{message:`Subscription interval cannot exceed ${e} years`})}export{d as MAX_INT32,i as MAX_INT32_DAYS,f as MIN_INT32,y as MIN_INT32_DAYS,g as formatDays,D as formatFilesize,a as formatNumber,b as getDaysValidator,N as getISO8601DurationValidator,_ as getNumberValidator};
1
+ function o(r){return`${Math.floor(r/86400)} days`}function t(r,n){return Intl.NumberFormat(navigator.language,n).format(r)}function e(r){return r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:r<1024*1024*1024?`${(r/(1024*1024)).toFixed(2)} MB`:`${(r/(1024*1024*1024)).toFixed(2)} GB`}export{o as formatDays,e as formatFilesize,t as formatNumber};
2
2
  //# sourceMappingURL=numbers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"numbers.js","sources":["../../lib/utilities/numbers.ts"],"sourcesContent":["import z from 'zod';\nimport { Duration } from './duration';\n\nexport const MAX_INT32 = 2147483647;\nexport const MAX_INT32_DAYS = Math.floor(MAX_INT32 / 86400);\nexport const MIN_INT32 = -2147483648;\nexport const MIN_INT32_DAYS = Math.ceil(MIN_INT32 / 86400);\n\nexport function getNumberValidator(min: number, max: number) {\n return z\n .number()\n .min(min, {\n error: issue => {\n if (issue.code === 'too_small') return `The number must be at least ${formatNumber(min)}.`;\n },\n })\n .max(max, {\n error: issue => {\n if (issue.code === 'too_big') return `The number must be at most ${formatNumber(max)}.`;\n },\n });\n}\n\nconst SECONDS_PER_DAY = 86400;\n\nexport function getDaysValidator(min: number) {\n const minSeconds = min * SECONDS_PER_DAY;\n const maxSeconds = MAX_INT32_DAYS * SECONDS_PER_DAY;\n\n return z\n .number()\n .min(minSeconds, {\n error: `The number must be at least ${formatNumber(min)} days.`,\n })\n .max(maxSeconds, {\n error: `The number must be at most ${formatNumber(MAX_INT32_DAYS)} days.`,\n });\n}\n\nexport function formatDays(seconds: number): string {\n return `${Math.floor(seconds / SECONDS_PER_DAY)} days`;\n}\nexport function formatNumber(num: number | bigint, options?: Intl.NumberFormatOptions) {\n return Intl.NumberFormat(navigator.language, options).format(num);\n}\n\n/**\n * @returns A formatted string for the number of bytes\n */\nexport function formatFilesize(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n } else if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n } else if (bytes < 1024 * 1024 * 1024) {\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n } else {\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n }\n}\n\n/**\n * Validates an ISO8601 duration string\n * @param maxYears Maximum allowed years (default: 10)\n * @returns A Zod validator that checks:\n * - Duration format is valid (matches ISO8601 pattern)\n * - Duration is not empty\n * - At least one value (years, months, days, hours, minutes, or seconds) is non-zero\n * - Total duration does not exceed maxYears\n */\nexport function getISO8601DurationValidator(maxYears: number = 10) {\n const MAX_DURATION_DAYS = 365 * maxYears;\n\n const getParts = (value: string) => {\n try {\n const parsed = Duration.parse(value);\n return {\n years: parsed.years ?? 0,\n months: parsed.months ?? 0,\n days: (parsed.days ?? 0) + (parsed.weeks ?? 0) * 7,\n hours: parsed.hours ?? 0,\n minutes: parsed.minutes ?? 0,\n seconds: parsed.seconds ?? 0,\n };\n } catch {\n return { years: 0, months: 0, days: 0, hours: 0, minutes: 0, seconds: 0 };\n }\n };\n\n return z\n .string()\n .refine(\n value => {\n const parts = getParts(value);\n return Object.values(parts).some(v => v > 0);\n },\n {\n message: 'At least one value (years, months, days, hours, minutes, or seconds) must be non-zero',\n }\n )\n .refine(\n value => {\n const parts = getParts(value);\n const timeInDays = (parts.hours * 3600 + parts.minutes * 60 + parts.seconds) / SECONDS_PER_DAY;\n return parts.years * 365 + parts.months * 30 + parts.days + timeInDays <= MAX_DURATION_DAYS;\n },\n {\n message: `Subscription interval cannot exceed ${maxYears} years`,\n }\n );\n}\n"],"names":["MAX_INT32","MAX_INT32_DAYS","MIN_INT32","MIN_INT32_DAYS","getNumberValidator","min","max","z","issue","formatNumber","SECONDS_PER_DAY","getDaysValidator","minSeconds","maxSeconds","formatDays","seconds","num","options","formatFilesize","bytes","getISO8601DurationValidator","maxYears","MAX_DURATION_DAYS","getParts","value","parsed","Duration","parts","v","timeInDays"],"mappings":"4DAGO,MAAMA,EAAY,WACZC,EAAiB,KAAK,MAAMD,EAAY,KAAK,EAC7CE,EAAY,YACZC,EAAiB,KAAK,KAAKD,EAAY,KAAK,EAElD,SAASE,EAAmBC,EAAaC,EAAa,CACzD,OAAOC,EACF,SACA,IAAIF,EAAK,CACN,MAAOG,GAAS,CACZ,GAAIA,EAAM,OAAS,kBAAoB,+BAA+BC,EAAaJ,CAAG,CAAC,GAC3F,CAAA,CACH,EACA,IAAIC,EAAK,CACN,MAAOE,GAAS,CACZ,GAAIA,EAAM,OAAS,gBAAkB,8BAA8BC,EAAaH,CAAG,CAAC,GACxF,CAAA,CACH,CACT,CAEA,MAAMI,EAAkB,MAEjB,SAASC,EAAiBN,EAAa,CAC1C,MAAMO,EAAaP,EAAMK,EACnBG,EAAaZ,EAAiBS,EAEpC,OAAOH,EACF,SACA,IAAIK,EAAY,CACb,MAAO,+BAA+BH,EAAaJ,CAAG,CAAC,QAAA,CAC1D,EACA,IAAIQ,EAAY,CACb,MAAO,8BAA8BJ,EAAaR,CAAc,CAAC,QAAA,CACpE,CACT,CAEO,SAASa,EAAWC,EAAyB,CAChD,MAAO,GAAG,KAAK,MAAMA,EAAUL,CAAe,CAAC,OACnD,CACO,SAASD,EAAaO,EAAsBC,EAAoC,CACnF,OAAO,KAAK,aAAa,UAAU,SAAUA,CAAO,EAAE,OAAOD,CAAG,CACpE,CAKO,SAASE,EAAeC,EAAuB,CAClD,OAAIA,EAAQ,KACD,GAAGA,CAAK,KACRA,EAAQ,KAAO,KACf,IAAIA,EAAQ,MAAM,QAAQ,CAAC,CAAC,MAC5BA,EAAQ,KAAO,KAAO,KACtB,IAAIA,GAAS,KAAO,OAAO,QAAQ,CAAC,CAAC,MAErC,IAAIA,GAAS,KAAO,KAAO,OAAO,QAAQ,CAAC,CAAC,KAE3D,CAWO,SAASC,EAA4BC,EAAmB,GAAI,CAC/D,MAAMC,EAAoB,IAAMD,EAE1BE,EAAYC,GAAkB,CAChC,GAAI,CACA,MAAMC,EAASC,EAAS,MAAMF,CAAK,EACnC,MAAO,CACH,MAAOC,EAAO,OAAS,EACvB,OAAQA,EAAO,QAAU,EACzB,MAAOA,EAAO,MAAQ,IAAMA,EAAO,OAAS,GAAK,EACjD,MAAOA,EAAO,OAAS,EACvB,QAASA,EAAO,SAAW,EAC3B,QAASA,EAAO,SAAW,CAAA,CAEnC,MAAQ,CACJ,MAAO,CAAE,MAAO,EAAG,OAAQ,EAAG,KAAM,EAAG,MAAO,EAAG,QAAS,EAAG,QAAS,CAAA,CAC1E,CACJ,EAEA,OAAOlB,EACF,SACA,OACGiB,GAAS,CACL,MAAMG,EAAQJ,EAASC,CAAK,EAC5B,OAAO,OAAO,OAAOG,CAAK,EAAE,KAAKC,GAAKA,EAAI,CAAC,CAC/C,EACA,CACI,QAAS,uFAAA,CACb,EAEH,OACGJ,GAAS,CACL,MAAMG,EAAQJ,EAASC,CAAK,EACtBK,GAAcF,EAAM,MAAQ,KAAOA,EAAM,QAAU,GAAKA,EAAM,SAAWjB,EAC/E,OAAOiB,EAAM,MAAQ,IAAMA,EAAM,OAAS,GAAKA,EAAM,KAAOE,GAAcP,CAC9E,EACA,CACI,QAAS,uCAAuCD,CAAQ,QAAA,CAC5D,CAEZ"}
1
+ {"version":3,"file":"numbers.js","sources":["../../lib/utilities/numbers.ts"],"sourcesContent":["const SECONDS_PER_DAY = 86400;\n\nexport function formatDays(seconds: number): string {\n return `${Math.floor(seconds / SECONDS_PER_DAY)} days`;\n}\n\nexport function formatNumber(num: number | bigint, options?: Intl.NumberFormatOptions) {\n return Intl.NumberFormat(navigator.language, options).format(num);\n}\n\n/**\n * @returns A formatted string for the number of bytes\n */\nexport function formatFilesize(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n } else if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n } else if (bytes < 1024 * 1024 * 1024) {\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n } else {\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n }\n}\n"],"names":["formatDays","seconds","formatNumber","num","options","formatFilesize","bytes"],"mappings":"AAEO,SAASA,EAAWC,EAAyB,CAChD,MAAO,GAAG,KAAK,MAAMA,EAAU,KAAe,CAAC,OACnD,CAEO,SAASC,EAAaC,EAAsBC,EAAoC,CACnF,OAAO,KAAK,aAAa,UAAU,SAAUA,CAAO,EAAE,OAAOD,CAAG,CACpE,CAKO,SAASE,EAAeC,EAAuB,CAClD,OAAIA,EAAQ,KACD,GAAGA,CAAK,KACRA,EAAQ,KAAO,KACf,IAAIA,EAAQ,MAAM,QAAQ,CAAC,CAAC,MAC5BA,EAAQ,KAAO,KAAO,KACtB,IAAIA,GAAS,KAAO,OAAO,QAAQ,CAAC,CAAC,MAErC,IAAIA,GAAS,KAAO,KAAO,OAAO,QAAQ,CAAC,CAAC,KAE3D"}
@@ -1,5 +1,20 @@
1
1
  import { FieldApi as FieldApiType } from '@tanstack/react-form';
2
+ import { z } from 'zod';
2
3
  type FieldApi = FieldApiType<any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any>;
4
+ export declare const MAX_INT32 = 2147483647;
5
+ export declare const SECONDS_PER_DAY = 86400;
6
+ export declare const MAX_INT32_DAYS: number;
7
+ export declare const MIN_INT32 = -2147483648;
8
+ export declare const MIN_INT32_DAYS: number;
9
+ export declare const MAX_SHORT_TEXT = 256;
10
+ export declare const MAX_NOTES = 4096;
11
+ export declare const MIN_PASSWORD = 8;
12
+ export declare const MIN_LICENSE_KEY = 16;
13
+ export declare const MIN_FINGERPRINT = 64;
14
+ export declare const MAX_FINGERPRINT = 1024;
15
+ export declare const MAX_OFFLINE_REQUEST = 16384;
16
+ export declare const MIN_SERVER_SYNC = 180;
17
+ export declare const TWO_FACTOR_LENGTH = 6;
3
18
  /**
4
19
  * Validates that the value of an array item is unique.
5
20
  * @param arrayFieldName - The field name of the array.
@@ -7,10 +22,55 @@ type FieldApi = FieldApiType<any, any, any, any, any, any, any, any, any, any, a
7
22
  * @param key - The property name of the item.
8
23
  * @returns A validator function.
9
24
  */
10
- export declare function getUniqueArrayItemValidator(arrayFieldName: string, currentIndex: number, key: string): ({ value, fieldApi }: {
25
+ export declare function V_ARRAY_UNIQUE_KEY(arrayFieldName: string, currentIndex: number, key: string): ({ value, fieldApi }: {
11
26
  value: any;
12
27
  fieldApi: FieldApi;
13
28
  }) => {
14
29
  message: string;
15
30
  } | undefined;
31
+ /**
32
+ * Creates a number validator with min/max constraints.
33
+ * @param min - Minimum allowed value.
34
+ * @param max - Maximum allowed value.
35
+ */
36
+ export declare function V_NUMBER_RANGE(min: number, max: number): z.ZodNumber;
37
+ /**
38
+ * Creates a validator for day values (stored as seconds).
39
+ * @param min - Minimum allowed days.
40
+ */
41
+ export declare function V_DAYS(min: number): z.ZodNumber;
42
+ /**
43
+ * Creates a validator for ISO8601 duration strings.
44
+ * @param maxYears - Maximum allowed years (default: 10).
45
+ */
46
+ export declare function V_ISO8601_DURATION(maxYears?: number): z.ZodString;
47
+ /** Required name/short text field (1-256 chars) */
48
+ export declare const V_STRING_REQUIRED: z.ZodString;
49
+ /** Optional name field for update forms (1-256 chars when provided) */
50
+ export declare const V_STRING_OPTIONAL_REQUIRED: z.ZodOptional<z.ZodNullable<z.ZodString>>;
51
+ /** Optional short text field (0-256 chars) */
52
+ export declare const V_STRING_OPTIONAL: z.ZodOptional<z.ZodNullable<z.ZodString>>;
53
+ /** Optional notes/long text field (0-4096 chars) */
54
+ export declare const V_NOTES_OPTIONAL: z.ZodOptional<z.ZodNullable<z.ZodString>>;
55
+ /** Email address validation */
56
+ export declare const V_EMAIL: z.ZodEmail;
57
+ /** URL validation */
58
+ export declare const V_URL: z.ZodURL;
59
+ /** Password field (8-256 chars) */
60
+ export declare const V_PASSWORD: z.ZodString;
61
+ export declare const V_BOOLEAN_REQUIRED: z.ZodBoolean;
62
+ export declare const V_INT32_WITH_UNLIMITED: z.ZodNumber;
63
+ export declare const V_NON_NEGATIVE_INT32: z.ZodNumber;
64
+ export declare const V_POSITIVE_INT32: z.ZodNumber;
65
+ export declare const V_NUMBER: z.ZodNumber;
66
+ export declare const V_SERVER_SYNC_INTERVAL: z.ZodNumber;
67
+ export declare const V_REQUIRED_STRING_ARRAY: z.ZodArray<z.ZodString>;
68
+ export declare const V_OPTIONAL_STRING_ARRAY: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>;
69
+ export declare const V_OPTIONAL_LICENSE_KEY: z.ZodOptional<z.ZodNullable<z.ZodString>>;
70
+ /** Fingerprint field (64-1024 chars) */
71
+ export declare const V_FINGERPRINT: z.ZodString;
72
+ /** Offline request (1-16384 chars) */
73
+ export declare const V_OFFLINE_REQUEST: z.ZodString;
74
+ /** 2FA code (exactly 6 chars) */
75
+ export declare const V_TWO_FACTOR_CODE: z.ZodOptional<z.ZodNullable<z.ZodString>>;
16
76
  export {};
@@ -1,2 +1,2 @@
1
- import{z as m}from"zod";function I(a,o,f){return({value:t,fieldApi:l})=>{const r=l.form.state.values[a],c=s=>{if(!Array.isArray(r))return!0;const g=s.toLowerCase();let i=null;for(let e=0;e<r.length;e++){const u=r[e]?.[f];if(typeof u=="string"&&u.toLowerCase()===g){if(i===null)i=e;else if(e===o)return!1}}return!0},n=m.string().min(1).refine(s=>c(s),{message:`'${t}' already exists. Enter a unique value.`}).safeParse(t);return n.success?void 0:{message:n.error.issues[0]?.message}}}export{I as getUniqueArrayItemValidator};
1
+ import{z as s}from"zod";import{Duration as y}from"./duration.js";import{ER_REQUIRED as m,ER_MAX_CHARS as _,ER_ENTER_EMAIL as P,ER_ENTER_URL as Y,ER_PASSWORD_MIN as d,ER_MIN_CHARS as T,ER_NUMBER_MIN as h,ER_NUMBER_MAX as X,ER_ALREADY_EXISTS as b,ER_DAYS_MIN as C,ER_DAYS_MAX as x,ER_DURATION_NONZERO as G,ER_DURATION_MAX as F}from"./errors.js";import{formatNumber as i}from"./numbers.js";const I=2147483647,N=86400,M=Math.floor(I/N),Q=-2147483648,z=Math.ceil(Q/N),e=256,V=4096,W=8,f=16,D=64,U=1024,g=16384,B=180,a=6;function Z(n,o,R){return({value:t,fieldApi:r})=>{const E=r.form.state.values[n],L=A=>{if(!Array.isArray(E))return!0;const p=A.toLowerCase();let S=null;for(let c=0;c<E.length;c++){const O=E[c]?.[R];if(typeof O=="string"&&O.toLowerCase()===p){if(S===null)S=c;else if(c===o)return!1}}return!0},l=s.string().min(1,{error:m}).refine(A=>L(A),{message:b(t)}).safeParse(t);return l.success?void 0:{message:l.error.issues[0]?.message}}}function u(n,o){return s.number().min(n,{error:h(i(n))}).max(o,{error:X(i(o))})}function J(n){const o=n*N,R=M*N;return s.number().min(o,{error:C(i(n))}).max(R,{error:x(i(M))})}function $(n=10){const o=365*n,R=t=>{try{const r=y.parse(t);return{years:r.years??0,months:r.months??0,days:(r.days??0)+(r.weeks??0)*7,hours:r.hours??0,minutes:r.minutes??0,seconds:r.seconds??0}}catch{return{years:0,months:0,days:0,hours:0,minutes:0,seconds:0}}};return s.string().refine(t=>{const r=R(t);return Object.values(r).some(E=>E>0)},{message:G}).refine(t=>{const r=R(t),E=(r.hours*3600+r.minutes*60+r.seconds)/N;return r.years*365+r.months*30+r.days+E<=o},{message:F(n)})}const H=s.string().min(1,{error:m}).max(e,{error:_(e)}),rr=H.nullable().optional(),sr=s.string().max(e,{error:_(e)}).nullable().optional(),nr=s.string().max(V,{error:_(V)}).nullable().optional(),or=s.email({error:P}),tr=s.url({error:Y}),er=s.string().min(W,{error:d}).max(e,{error:_(e)}),_r=s.boolean(),Er=u(-1,I),Rr=u(0,I),cr=u(1,I),Nr=s.number(),Ir=u(B,I),v=s.array(s.string()),ar=v.nullable().optional(),ir=s.string().min(f,{error:T(f)}).max(e,{error:_(e)}).nullable().optional(),ur=s.string().min(D,{error:T(D)}).max(U,{error:_(U)}),Ar=s.string().min(1,{error:m}).max(g,{error:_(g)}),mr=s.string().min(a,{error:T(a)}).max(a,{error:_(a)}).nullable().optional();export{U as MAX_FINGERPRINT,I as MAX_INT32,M as MAX_INT32_DAYS,V as MAX_NOTES,g as MAX_OFFLINE_REQUEST,e as MAX_SHORT_TEXT,D as MIN_FINGERPRINT,Q as MIN_INT32,z as MIN_INT32_DAYS,f as MIN_LICENSE_KEY,W as MIN_PASSWORD,B as MIN_SERVER_SYNC,N as SECONDS_PER_DAY,a as TWO_FACTOR_LENGTH,Z as V_ARRAY_UNIQUE_KEY,_r as V_BOOLEAN_REQUIRED,J as V_DAYS,or as V_EMAIL,ur as V_FINGERPRINT,Er as V_INT32_WITH_UNLIMITED,$ as V_ISO8601_DURATION,Rr as V_NON_NEGATIVE_INT32,nr as V_NOTES_OPTIONAL,Nr as V_NUMBER,u as V_NUMBER_RANGE,Ar as V_OFFLINE_REQUEST,ir as V_OPTIONAL_LICENSE_KEY,ar as V_OPTIONAL_STRING_ARRAY,er as V_PASSWORD,cr as V_POSITIVE_INT32,v as V_REQUIRED_STRING_ARRAY,Ir as V_SERVER_SYNC_INTERVAL,sr as V_STRING_OPTIONAL,rr as V_STRING_OPTIONAL_REQUIRED,H as V_STRING_REQUIRED,mr as V_TWO_FACTOR_CODE,tr as V_URL};
2
2
  //# sourceMappingURL=validators.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators.js","sources":["../../lib/utilities/validators.ts"],"sourcesContent":["import type { FieldApi as FieldApiType } from '@tanstack/react-form';\nimport { z } from 'zod';\ntype FieldApi = FieldApiType<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>;\n\n/**\n * Validates that the value of an array item is unique.\n * @param arrayFieldName - The field name of the array.\n * @param currentIndex - The current index of the array item.\n * @param key - The property name of the item.\n * @returns A validator function.\n */\nexport function getUniqueArrayItemValidator(arrayFieldName: string, currentIndex: number, key: string) {\n return ({ value, fieldApi }: { value: any; fieldApi: FieldApi }): { message: string } | undefined => {\n const arrayValue = fieldApi.form.state.values[arrayFieldName];\n const checkUniqueness = (stringValue: string): boolean => {\n if (!Array.isArray(arrayValue)) return true;\n\n const target = stringValue.toLowerCase();\n let firstIndex: number | null = null;\n\n for (let i = 0; i < arrayValue.length; i++) {\n const v = arrayValue[i]?.[key];\n if (typeof v !== 'string') continue;\n\n if (v.toLowerCase() === target) {\n if (firstIndex === null) {\n firstIndex = i; // first match\n } else if (i === currentIndex) {\n // this is the second+ occurrence → invalid\n return false;\n }\n }\n }\n\n // Valid if it's the first match or no match\n return true;\n };\n\n const result = z\n .string()\n .min(1)\n .refine(value => checkUniqueness(value), {\n message: `'${value}' already exists. Enter a unique value.`,\n })\n .safeParse(value);\n\n if (result.success) {\n return undefined;\n }\n\n const firstIssue = result.error.issues[0];\n return {\n message: firstIssue?.message,\n };\n };\n}\n"],"names":["getUniqueArrayItemValidator","arrayFieldName","currentIndex","key","value","fieldApi","arrayValue","checkUniqueness","stringValue","target","firstIndex","i","v","result","z"],"mappings":"wBAmCO,SAASA,EAA4BC,EAAwBC,EAAsBC,EAAa,CACnG,MAAO,CAAC,CAAE,MAAAC,EAAO,SAAAC,KAAoF,CACjG,MAAMC,EAAaD,EAAS,KAAK,MAAM,OAAOJ,CAAc,EACtDM,EAAmBC,GAAiC,CACtD,GAAI,CAAC,MAAM,QAAQF,CAAU,EAAG,MAAO,GAEvC,MAAMG,EAASD,EAAY,YAAA,EAC3B,IAAIE,EAA4B,KAEhC,QAASC,EAAI,EAAGA,EAAIL,EAAW,OAAQK,IAAK,CACxC,MAAMC,EAAIN,EAAWK,CAAC,IAAIR,CAAG,EAC7B,GAAI,OAAOS,GAAM,UAEbA,EAAE,YAAA,IAAkBH,GACpB,GAAIC,IAAe,KACfA,EAAaC,UACNA,IAAMT,EAEb,MAAO,GAGnB,CAGA,MAAO,EACX,EAEMW,EAASC,EACV,OAAA,EACA,IAAI,CAAC,EACL,OAAOV,GAASG,EAAgBH,CAAK,EAAG,CACrC,QAAS,IAAIA,CAAK,yCAAA,CACrB,EACA,UAAUA,CAAK,EAEpB,OAAIS,EAAO,QACP,OAIG,CACH,QAFeA,EAAO,MAAM,OAAO,CAAC,GAEf,OAAA,CAE7B,CACJ"}
1
+ {"version":3,"file":"validators.js","sources":["../../lib/utilities/validators.ts"],"sourcesContent":["import type { FieldApi as FieldApiType } from '@tanstack/react-form';\nimport { z } from 'zod';\nimport { Duration } from './duration';\nimport {\n ER_ALREADY_EXISTS,\n ER_DAYS_MAX,\n ER_DAYS_MIN,\n ER_DURATION_MAX,\n ER_DURATION_NONZERO,\n ER_ENTER_EMAIL,\n ER_ENTER_URL,\n ER_MAX_CHARS,\n ER_MIN_CHARS,\n ER_NUMBER_MAX,\n ER_NUMBER_MIN,\n ER_PASSWORD_MIN,\n ER_REQUIRED,\n} from './errors';\nimport { formatNumber } from './numbers';\n\ntype FieldApi = FieldApiType<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>;\n\nexport const MAX_INT32 = 2147483647;\nexport const SECONDS_PER_DAY = 86400;\nexport const MAX_INT32_DAYS = Math.floor(MAX_INT32 / SECONDS_PER_DAY);\nexport const MIN_INT32 = -2147483648;\nexport const MIN_INT32_DAYS = Math.ceil(MIN_INT32 / SECONDS_PER_DAY);\nexport const MAX_SHORT_TEXT = 256;\nexport const MAX_NOTES = 4096;\nexport const MIN_PASSWORD = 8;\nexport const MIN_LICENSE_KEY = 16;\nexport const MIN_FINGERPRINT = 64;\nexport const MAX_FINGERPRINT = 1024;\nexport const MAX_OFFLINE_REQUEST = 16384;\nexport const MIN_SERVER_SYNC = 180;\nexport const TWO_FACTOR_LENGTH = 6;\n\n/**\n * Validates that the value of an array item is unique.\n * @param arrayFieldName - The field name of the array.\n * @param currentIndex - The current index of the array item.\n * @param key - The property name of the item.\n * @returns A validator function.\n */\nexport function V_ARRAY_UNIQUE_KEY(arrayFieldName: string, currentIndex: number, key: string) {\n return ({ value, fieldApi }: { value: any; fieldApi: FieldApi }): { message: string } | undefined => {\n const arrayValue = fieldApi.form.state.values[arrayFieldName];\n const checkUniqueness = (stringValue: string): boolean => {\n if (!Array.isArray(arrayValue)) return true;\n\n const target = stringValue.toLowerCase();\n let firstIndex: number | null = null;\n\n for (let i = 0; i < arrayValue.length; i++) {\n const v = arrayValue[i]?.[key];\n if (typeof v !== 'string') continue;\n\n if (v.toLowerCase() === target) {\n if (firstIndex === null) {\n firstIndex = i; // first match\n } else if (i === currentIndex) {\n // this is the second+ occurrence → invalid\n return false;\n }\n }\n }\n\n // Valid if it's the first match or no match\n return true;\n };\n\n const result = z\n .string()\n .min(1, { error: ER_REQUIRED })\n .refine(value => checkUniqueness(value), {\n message: ER_ALREADY_EXISTS(value),\n })\n .safeParse(value);\n\n if (result.success) {\n return undefined;\n }\n\n const firstIssue = result.error.issues[0];\n return {\n message: firstIssue?.message,\n };\n };\n}\n\n/**\n * Creates a number validator with min/max constraints.\n * @param min - Minimum allowed value.\n * @param max - Maximum allowed value.\n */\nexport function V_NUMBER_RANGE(min: number, max: number) {\n return z\n .number()\n .min(min, { error: ER_NUMBER_MIN(formatNumber(min)) })\n .max(max, { error: ER_NUMBER_MAX(formatNumber(max)) });\n}\n\n/**\n * Creates a validator for day values (stored as seconds).\n * @param min - Minimum allowed days.\n */\nexport function V_DAYS(min: number) {\n const minSeconds = min * SECONDS_PER_DAY;\n const maxSeconds = MAX_INT32_DAYS * SECONDS_PER_DAY;\n\n return z\n .number()\n .min(minSeconds, { error: ER_DAYS_MIN(formatNumber(min)) })\n .max(maxSeconds, { error: ER_DAYS_MAX(formatNumber(MAX_INT32_DAYS)) });\n}\n\n/**\n * Creates a validator for ISO8601 duration strings.\n * @param maxYears - Maximum allowed years (default: 10).\n */\nexport function V_ISO8601_DURATION(maxYears: number = 10) {\n const MAX_DURATION_DAYS = 365 * maxYears;\n\n const getParts = (value: string) => {\n try {\n const parsed = Duration.parse(value);\n return {\n years: parsed.years ?? 0,\n months: parsed.months ?? 0,\n days: (parsed.days ?? 0) + (parsed.weeks ?? 0) * 7,\n hours: parsed.hours ?? 0,\n minutes: parsed.minutes ?? 0,\n seconds: parsed.seconds ?? 0,\n };\n } catch {\n return { years: 0, months: 0, days: 0, hours: 0, minutes: 0, seconds: 0 };\n }\n };\n\n return z\n .string()\n .refine(\n value => {\n const parts = getParts(value);\n return Object.values(parts).some(v => v > 0);\n },\n { message: ER_DURATION_NONZERO }\n )\n .refine(\n value => {\n const parts = getParts(value);\n const timeInDays = (parts.hours * 3600 + parts.minutes * 60 + parts.seconds) / SECONDS_PER_DAY;\n return parts.years * 365 + parts.months * 30 + parts.days + timeInDays <= MAX_DURATION_DAYS;\n },\n { message: ER_DURATION_MAX(maxYears) }\n );\n}\n\n/** Required name/short text field (1-256 chars) */\nexport const V_STRING_REQUIRED = z\n .string()\n .min(1, { error: ER_REQUIRED })\n .max(MAX_SHORT_TEXT, { error: ER_MAX_CHARS(MAX_SHORT_TEXT) });\n/** Optional name field for update forms (1-256 chars when provided) */\nexport const V_STRING_OPTIONAL_REQUIRED = V_STRING_REQUIRED.nullable().optional();\n/** Optional short text field (0-256 chars) */\nexport const V_STRING_OPTIONAL = z\n .string()\n .max(MAX_SHORT_TEXT, { error: ER_MAX_CHARS(MAX_SHORT_TEXT) })\n .nullable()\n .optional();\n/** Optional notes/long text field (0-4096 chars) */\nexport const V_NOTES_OPTIONAL = z\n .string()\n .max(MAX_NOTES, { error: ER_MAX_CHARS(MAX_NOTES) })\n .nullable()\n .optional();\n/** Email address validation */\nexport const V_EMAIL = z.email({ error: ER_ENTER_EMAIL });\n/** URL validation */\nexport const V_URL = z.url({ error: ER_ENTER_URL });\n/** Password field (8-256 chars) */\nexport const V_PASSWORD = z\n .string()\n .min(MIN_PASSWORD, { error: ER_PASSWORD_MIN })\n .max(MAX_SHORT_TEXT, { error: ER_MAX_CHARS(MAX_SHORT_TEXT) });\nexport const V_BOOLEAN_REQUIRED = z.boolean();\nexport const V_INT32_WITH_UNLIMITED = V_NUMBER_RANGE(-1, MAX_INT32);\nexport const V_NON_NEGATIVE_INT32 = V_NUMBER_RANGE(0, MAX_INT32);\nexport const V_POSITIVE_INT32 = V_NUMBER_RANGE(1, MAX_INT32);\nexport const V_NUMBER = z.number();\nexport const V_SERVER_SYNC_INTERVAL = V_NUMBER_RANGE(MIN_SERVER_SYNC, MAX_INT32);\nexport const V_REQUIRED_STRING_ARRAY = z.array(z.string());\nexport const V_OPTIONAL_STRING_ARRAY = V_REQUIRED_STRING_ARRAY.nullable().optional();\n\nexport const V_OPTIONAL_LICENSE_KEY = z\n .string()\n .min(MIN_LICENSE_KEY, { error: ER_MIN_CHARS(MIN_LICENSE_KEY) })\n .max(MAX_SHORT_TEXT, { error: ER_MAX_CHARS(MAX_SHORT_TEXT) })\n .nullable()\n .optional();\n\n/** Fingerprint field (64-1024 chars) */\nexport const V_FINGERPRINT = z\n .string()\n .min(MIN_FINGERPRINT, { error: ER_MIN_CHARS(MIN_FINGERPRINT) })\n .max(MAX_FINGERPRINT, { error: ER_MAX_CHARS(MAX_FINGERPRINT) });\n\n/** Offline request (1-16384 chars) */\nexport const V_OFFLINE_REQUEST = z\n .string()\n .min(1, { error: ER_REQUIRED })\n .max(MAX_OFFLINE_REQUEST, { error: ER_MAX_CHARS(MAX_OFFLINE_REQUEST) });\n\n/** 2FA code (exactly 6 chars) */\nexport const V_TWO_FACTOR_CODE = z\n .string()\n .min(TWO_FACTOR_LENGTH, { error: ER_MIN_CHARS(TWO_FACTOR_LENGTH) })\n .max(TWO_FACTOR_LENGTH, { error: ER_MAX_CHARS(TWO_FACTOR_LENGTH) })\n .nullable()\n .optional();\n"],"names":["MAX_INT32","SECONDS_PER_DAY","MAX_INT32_DAYS","MIN_INT32","MIN_INT32_DAYS","MAX_SHORT_TEXT","MAX_NOTES","MIN_PASSWORD","MIN_LICENSE_KEY","MIN_FINGERPRINT","MAX_FINGERPRINT","MAX_OFFLINE_REQUEST","MIN_SERVER_SYNC","TWO_FACTOR_LENGTH","V_ARRAY_UNIQUE_KEY","arrayFieldName","currentIndex","key","value","fieldApi","arrayValue","checkUniqueness","stringValue","target","firstIndex","i","v","result","z","ER_REQUIRED","ER_ALREADY_EXISTS","V_NUMBER_RANGE","min","max","ER_NUMBER_MIN","formatNumber","ER_NUMBER_MAX","V_DAYS","minSeconds","maxSeconds","ER_DAYS_MIN","ER_DAYS_MAX","V_ISO8601_DURATION","maxYears","MAX_DURATION_DAYS","getParts","parsed","Duration","parts","ER_DURATION_NONZERO","timeInDays","ER_DURATION_MAX","V_STRING_REQUIRED","ER_MAX_CHARS","V_STRING_OPTIONAL_REQUIRED","V_STRING_OPTIONAL","V_NOTES_OPTIONAL","V_EMAIL","ER_ENTER_EMAIL","V_URL","ER_ENTER_URL","V_PASSWORD","ER_PASSWORD_MIN","V_BOOLEAN_REQUIRED","V_INT32_WITH_UNLIMITED","V_NON_NEGATIVE_INT32","V_POSITIVE_INT32","V_NUMBER","V_SERVER_SYNC_INTERVAL","V_REQUIRED_STRING_ARRAY","V_OPTIONAL_STRING_ARRAY","V_OPTIONAL_LICENSE_KEY","ER_MIN_CHARS","V_FINGERPRINT","V_OFFLINE_REQUEST","V_TWO_FACTOR_CODE"],"mappings":"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"}
package/lib/index.css CHANGED
@@ -3,9 +3,6 @@
3
3
  @import './tokens.css';
4
4
  /** https://tailwindcss.com/docs/theme#theme-variable-namespaces */
5
5
  @theme static {
6
- /* Radius */
7
- --radius-*: initial;
8
-
9
6
  /* Text Sizes */
10
7
  /* Reset all default text sizes */
11
8
  --text-*: initial;
@@ -144,23 +141,23 @@
144
141
 
145
142
  /* A base set of classes for elements that can be clicked */
146
143
  @utility btn {
147
- @apply inline-flex body-sm gap-1 disabled:pointer-events-none text-ellipsis overflow-hidden items-center justify-center font-medium transition-colors cursor-pointer ring-offset-background [&_svg:not([class*='size-'])]:size-icon shrink-0 [&_svg]:shrink-0 [&_svg]:opacity-70 leading-tight outline-none no-underline whitespace-nowrap select-none disabled-muted focus-ring;
144
+ @apply inline-flex body-sm gap-1 px-2 disabled:pointer-events-none text-ellipsis overflow-hidden items-center justify-center font-medium transition-colors cursor-pointer ring-offset-background [&_svg:not([class*='size-'])]:size-icon shrink-0 [&_svg]:shrink-0 [&_svg]:opacity-70 leading-tight outline-none no-underline whitespace-nowrap select-none disabled-muted focus-ring hover:opacity-80 focus:opacity-80;
148
145
  }
149
146
 
150
147
  @utility btn-link {
151
148
  @apply btn-ghost underline underline-offset-2;
152
149
  }
153
150
  @utility btn-primary {
154
- @apply border border-primary text-primary bg-primary/10 hover:bg-primary/20 focus:bg-primary/20;
151
+ @apply border border-primary text-primary-foreground bg-primary;
155
152
  }
156
153
  @utility btn-destructive {
157
- @apply border border-destructive text-destructive bg-destructive/10 hover:bg-destructive/20 focus:bg-destructive/20;
158
- }
159
- @utility btn-neutral {
160
- @apply border border-input text-accent bg-accent/10 hover:bg-accent/20 focus:bg-accent/20;
154
+ @apply border border-destructive text-destructive-foreground bg-destructive;
161
155
  }
162
156
  @utility btn-secondary {
163
- @apply border border-secondary text-secondary bg-secondary/10 hover:bg-secondary/20 focus:bg-secondary/20;
157
+ @apply border border-secondary text-secondary-foreground bg-secondary;
158
+ }
159
+ @utility btn-neutral {
160
+ @apply border border-input text-accent bg-accent/10;
164
161
  }
165
162
  @utility btn-ghost {
166
163
  @apply bg-transparent focus:bg-accent/20 hover:bg-accent/20;
@@ -170,7 +167,7 @@
170
167
  }
171
168
  /* Dimensions for a standard input */
172
169
  @utility input-dim {
173
- @apply h-input px-2 py-2 body-sm leading-tight;
170
+ @apply h-input px-3 py-2 body-sm rounded-md leading-tight;
174
171
  }
175
172
 
176
173
  @utility form-field {
package/lib/tokens.css CHANGED
@@ -3,17 +3,54 @@
3
3
  Instead, compile the SCSS file again to create modifications.
4
4
  */
5
5
  :root {
6
+ --lc-range-start: 0.12;
7
+ --lc-range-end: 0.92;
8
+ --c-range-start: 0.01;
9
+ --c-range-end: 0.25;
6
10
  --primary-hue: 240;
7
- --xprimary-1: oklch(0.99 0.01 var(--primary-hue));
8
- --xprimary-2: oklch(0.97 0.03 var(--primary-hue));
9
- --xprimary-3: oklch(0.9 0.04 var(--primary-hue));
10
- --xprimary-4: oklch(0.72 0.13 var(--primary-hue));
11
- --xprimary-5: oklch(0.67 0.13 var(--primary-hue));
12
- --xprimary-6: oklch(0.5 0.13 var(--primary-hue));
13
- --xprimary-7: oklch(0.35 0.13 var(--primary-hue));
14
- --xprimary-8: oklch(0.25 0.13 var(--primary-hue));
15
- --xprimary-9: oklch(0.2 0.09 var(--primary-hue));
16
- --xprimary-10: oklch(0.1 0.03 var(--primary-hue));
11
+ --primary-c-start: var(--c-range-start);
12
+ --primary-c-end: var(--c-range-end);
13
+ --xprimary-1: oklch(
14
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (1 / 10))
15
+ calc(var(--primary-c-start) + (var(--primary-c-end) - var(--primary-c-start)) * (1 / 10)) var(--primary-hue)
16
+ );
17
+ --xprimary-2: oklch(
18
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (2 / 10))
19
+ calc(var(--primary-c-start) + (var(--primary-c-end) - var(--primary-c-start)) * (2 / 10)) var(--primary-hue)
20
+ );
21
+ --xprimary-3: oklch(
22
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (3 / 10))
23
+ calc(var(--primary-c-start) + (var(--primary-c-end) - var(--primary-c-start)) * (3 / 10)) var(--primary-hue)
24
+ );
25
+ --xprimary-4: oklch(
26
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (4 / 10))
27
+ calc(var(--primary-c-start) + (var(--primary-c-end) - var(--primary-c-start)) * (4 / 10)) var(--primary-hue)
28
+ );
29
+ --xprimary-5: oklch(
30
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (5 / 10))
31
+ calc(var(--primary-c-start) + (var(--primary-c-end) - var(--primary-c-start)) * (5 / 10)) var(--primary-hue)
32
+ );
33
+ --xprimary-6: oklch(
34
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (6 / 10))
35
+ calc(var(--primary-c-start) + (var(--primary-c-end) - var(--primary-c-start)) * (6 / 10)) var(--primary-hue)
36
+ );
37
+ --xprimary-7: oklch(
38
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (7 / 10))
39
+ calc(var(--primary-c-start) + (var(--primary-c-end) - var(--primary-c-start)) * (7 / 10)) var(--primary-hue)
40
+ );
41
+ --xprimary-8: oklch(
42
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (8 / 10))
43
+ calc(var(--primary-c-start) + (var(--primary-c-end) - var(--primary-c-start)) * (8 / 10)) var(--primary-hue)
44
+ );
45
+ --xprimary-9: oklch(
46
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (9 / 10))
47
+ calc(var(--primary-c-start) + (var(--primary-c-end) - var(--primary-c-start)) * (9 / 10)) var(--primary-hue)
48
+ );
49
+ --xprimary-10: oklch(
50
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (10 / 10))
51
+ calc(var(--primary-c-start) + (var(--primary-c-end) - var(--primary-c-start)) * (10 / 10))
52
+ var(--primary-hue)
53
+ );
17
54
  --primary-1: var(--xprimary-1);
18
55
  --primary-2: var(--xprimary-2);
19
56
  --primary-3: var(--xprimary-3);
@@ -25,16 +62,58 @@
25
62
  --primary-9: var(--xprimary-9);
26
63
  --primary-10: var(--xprimary-10);
27
64
  --secondary-hue: calc(var(--primary-hue) + 30);
28
- --xsecondary-1: oklch(0.99 0.01 var(--secondary-hue));
29
- --xsecondary-2: oklch(0.97 0.03 var(--secondary-hue));
30
- --xsecondary-3: oklch(0.9 0.04 var(--secondary-hue));
31
- --xsecondary-4: oklch(0.72 0.13 var(--secondary-hue));
32
- --xsecondary-5: oklch(0.67 0.13 var(--secondary-hue));
33
- --xsecondary-6: oklch(0.5 0.13 var(--secondary-hue));
34
- --xsecondary-7: oklch(0.35 0.13 var(--secondary-hue));
35
- --xsecondary-8: oklch(0.25 0.13 var(--secondary-hue));
36
- --xsecondary-9: oklch(0.2 0.09 var(--secondary-hue));
37
- --xsecondary-10: oklch(0.1 0.03 var(--secondary-hue));
65
+ --secondary-c-start: var(--c-range-start);
66
+ --secondary-c-end: var(--c-range-end);
67
+ --xsecondary-1: oklch(
68
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (1 / 10))
69
+ calc(var(--secondary-c-start) + (var(--secondary-c-end) - var(--secondary-c-start)) * (1 / 10))
70
+ var(--secondary-hue)
71
+ );
72
+ --xsecondary-2: oklch(
73
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (2 / 10))
74
+ calc(var(--secondary-c-start) + (var(--secondary-c-end) - var(--secondary-c-start)) * (2 / 10))
75
+ var(--secondary-hue)
76
+ );
77
+ --xsecondary-3: oklch(
78
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (3 / 10))
79
+ calc(var(--secondary-c-start) + (var(--secondary-c-end) - var(--secondary-c-start)) * (3 / 10))
80
+ var(--secondary-hue)
81
+ );
82
+ --xsecondary-4: oklch(
83
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (4 / 10))
84
+ calc(var(--secondary-c-start) + (var(--secondary-c-end) - var(--secondary-c-start)) * (4 / 10))
85
+ var(--secondary-hue)
86
+ );
87
+ --xsecondary-5: oklch(
88
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (5 / 10))
89
+ calc(var(--secondary-c-start) + (var(--secondary-c-end) - var(--secondary-c-start)) * (5 / 10))
90
+ var(--secondary-hue)
91
+ );
92
+ --xsecondary-6: oklch(
93
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (6 / 10))
94
+ calc(var(--secondary-c-start) + (var(--secondary-c-end) - var(--secondary-c-start)) * (6 / 10))
95
+ var(--secondary-hue)
96
+ );
97
+ --xsecondary-7: oklch(
98
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (7 / 10))
99
+ calc(var(--secondary-c-start) + (var(--secondary-c-end) - var(--secondary-c-start)) * (7 / 10))
100
+ var(--secondary-hue)
101
+ );
102
+ --xsecondary-8: oklch(
103
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (8 / 10))
104
+ calc(var(--secondary-c-start) + (var(--secondary-c-end) - var(--secondary-c-start)) * (8 / 10))
105
+ var(--secondary-hue)
106
+ );
107
+ --xsecondary-9: oklch(
108
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (9 / 10))
109
+ calc(var(--secondary-c-start) + (var(--secondary-c-end) - var(--secondary-c-start)) * (9 / 10))
110
+ var(--secondary-hue)
111
+ );
112
+ --xsecondary-10: oklch(
113
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (10 / 10))
114
+ calc(var(--secondary-c-start) + (var(--secondary-c-end) - var(--secondary-c-start)) * (10 / 10))
115
+ var(--secondary-hue)
116
+ );
38
117
  --secondary-1: var(--xsecondary-1);
39
118
  --secondary-2: var(--xsecondary-2);
40
119
  --secondary-3: var(--xsecondary-3);
@@ -46,16 +125,58 @@
46
125
  --secondary-9: var(--xsecondary-9);
47
126
  --secondary-10: var(--xsecondary-10);
48
127
  --destructive-hue: 10;
49
- --xdestructive-1: oklch(0.99 0.01 var(--destructive-hue));
50
- --xdestructive-2: oklch(0.97 0.03 var(--destructive-hue));
51
- --xdestructive-3: oklch(0.9 0.04 var(--destructive-hue));
52
- --xdestructive-4: oklch(0.72 0.13 var(--destructive-hue));
53
- --xdestructive-5: oklch(0.67 0.13 var(--destructive-hue));
54
- --xdestructive-6: oklch(0.5 0.13 var(--destructive-hue));
55
- --xdestructive-7: oklch(0.35 0.13 var(--destructive-hue));
56
- --xdestructive-8: oklch(0.25 0.13 var(--destructive-hue));
57
- --xdestructive-9: oklch(0.2 0.09 var(--destructive-hue));
58
- --xdestructive-10: oklch(0.1 0.03 var(--destructive-hue));
128
+ --destructive-c-start: var(--c-range-start);
129
+ --destructive-c-end: var(--c-range-end);
130
+ --xdestructive-1: oklch(
131
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (1 / 10))
132
+ calc(var(--destructive-c-start) + (var(--destructive-c-end) - var(--destructive-c-start)) * (1 / 10))
133
+ var(--destructive-hue)
134
+ );
135
+ --xdestructive-2: oklch(
136
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (2 / 10))
137
+ calc(var(--destructive-c-start) + (var(--destructive-c-end) - var(--destructive-c-start)) * (2 / 10))
138
+ var(--destructive-hue)
139
+ );
140
+ --xdestructive-3: oklch(
141
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (3 / 10))
142
+ calc(var(--destructive-c-start) + (var(--destructive-c-end) - var(--destructive-c-start)) * (3 / 10))
143
+ var(--destructive-hue)
144
+ );
145
+ --xdestructive-4: oklch(
146
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (4 / 10))
147
+ calc(var(--destructive-c-start) + (var(--destructive-c-end) - var(--destructive-c-start)) * (4 / 10))
148
+ var(--destructive-hue)
149
+ );
150
+ --xdestructive-5: oklch(
151
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (5 / 10))
152
+ calc(var(--destructive-c-start) + (var(--destructive-c-end) - var(--destructive-c-start)) * (5 / 10))
153
+ var(--destructive-hue)
154
+ );
155
+ --xdestructive-6: oklch(
156
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (6 / 10))
157
+ calc(var(--destructive-c-start) + (var(--destructive-c-end) - var(--destructive-c-start)) * (6 / 10))
158
+ var(--destructive-hue)
159
+ );
160
+ --xdestructive-7: oklch(
161
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (7 / 10))
162
+ calc(var(--destructive-c-start) + (var(--destructive-c-end) - var(--destructive-c-start)) * (7 / 10))
163
+ var(--destructive-hue)
164
+ );
165
+ --xdestructive-8: oklch(
166
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (8 / 10))
167
+ calc(var(--destructive-c-start) + (var(--destructive-c-end) - var(--destructive-c-start)) * (8 / 10))
168
+ var(--destructive-hue)
169
+ );
170
+ --xdestructive-9: oklch(
171
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (9 / 10))
172
+ calc(var(--destructive-c-start) + (var(--destructive-c-end) - var(--destructive-c-start)) * (9 / 10))
173
+ var(--destructive-hue)
174
+ );
175
+ --xdestructive-10: oklch(
176
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (10 / 10))
177
+ calc(var(--destructive-c-start) + (var(--destructive-c-end) - var(--destructive-c-start)) * (10 / 10))
178
+ var(--destructive-hue)
179
+ );
59
180
  --destructive-1: var(--xdestructive-1);
60
181
  --destructive-2: var(--xdestructive-2);
61
182
  --destructive-3: var(--xdestructive-3);
@@ -67,16 +188,49 @@
67
188
  --destructive-9: var(--xdestructive-9);
68
189
  --destructive-10: var(--xdestructive-10);
69
190
  --success-hue: 150;
70
- --xsuccess-1: oklch(0.99 0.01 var(--success-hue));
71
- --xsuccess-2: oklch(0.97 0.03 var(--success-hue));
72
- --xsuccess-3: oklch(0.9 0.04 var(--success-hue));
73
- --xsuccess-4: oklch(0.72 0.13 var(--success-hue));
74
- --xsuccess-5: oklch(0.67 0.13 var(--success-hue));
75
- --xsuccess-6: oklch(0.5 0.13 var(--success-hue));
76
- --xsuccess-7: oklch(0.35 0.13 var(--success-hue));
77
- --xsuccess-8: oklch(0.25 0.13 var(--success-hue));
78
- --xsuccess-9: oklch(0.2 0.09 var(--success-hue));
79
- --xsuccess-10: oklch(0.1 0.03 var(--success-hue));
191
+ --success-c-start: var(--c-range-start);
192
+ --success-c-end: var(--c-range-end);
193
+ --xsuccess-1: oklch(
194
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (1 / 10))
195
+ calc(var(--success-c-start) + (var(--success-c-end) - var(--success-c-start)) * (1 / 10)) var(--success-hue)
196
+ );
197
+ --xsuccess-2: oklch(
198
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (2 / 10))
199
+ calc(var(--success-c-start) + (var(--success-c-end) - var(--success-c-start)) * (2 / 10)) var(--success-hue)
200
+ );
201
+ --xsuccess-3: oklch(
202
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (3 / 10))
203
+ calc(var(--success-c-start) + (var(--success-c-end) - var(--success-c-start)) * (3 / 10)) var(--success-hue)
204
+ );
205
+ --xsuccess-4: oklch(
206
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (4 / 10))
207
+ calc(var(--success-c-start) + (var(--success-c-end) - var(--success-c-start)) * (4 / 10)) var(--success-hue)
208
+ );
209
+ --xsuccess-5: oklch(
210
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (5 / 10))
211
+ calc(var(--success-c-start) + (var(--success-c-end) - var(--success-c-start)) * (5 / 10)) var(--success-hue)
212
+ );
213
+ --xsuccess-6: oklch(
214
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (6 / 10))
215
+ calc(var(--success-c-start) + (var(--success-c-end) - var(--success-c-start)) * (6 / 10)) var(--success-hue)
216
+ );
217
+ --xsuccess-7: oklch(
218
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (7 / 10))
219
+ calc(var(--success-c-start) + (var(--success-c-end) - var(--success-c-start)) * (7 / 10)) var(--success-hue)
220
+ );
221
+ --xsuccess-8: oklch(
222
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (8 / 10))
223
+ calc(var(--success-c-start) + (var(--success-c-end) - var(--success-c-start)) * (8 / 10)) var(--success-hue)
224
+ );
225
+ --xsuccess-9: oklch(
226
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (9 / 10))
227
+ calc(var(--success-c-start) + (var(--success-c-end) - var(--success-c-start)) * (9 / 10)) var(--success-hue)
228
+ );
229
+ --xsuccess-10: oklch(
230
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (10 / 10))
231
+ calc(var(--success-c-start) + (var(--success-c-end) - var(--success-c-start)) * (10 / 10))
232
+ var(--success-hue)
233
+ );
80
234
  --success-1: var(--xsuccess-1);
81
235
  --success-2: var(--xsuccess-2);
82
236
  --success-3: var(--xsuccess-3);
@@ -88,17 +242,49 @@
88
242
  --success-9: var(--xsuccess-9);
89
243
  --success-10: var(--xsuccess-10);
90
244
  --neutral-hue: var(--primary-hue);
91
- --neutral-s: 0.0005;
92
- --xneutral-1: oklch(0.99 var(--neutral-s) var(--neutral-hue));
93
- --xneutral-2: oklch(0.97 var(--neutral-s) var(--neutral-hue));
94
- --xneutral-3: oklch(0.93 var(--neutral-s) var(--neutral-hue));
95
- --xneutral-4: oklch(0.85 var(--neutral-s) var(--neutral-hue));
96
- --xneutral-5: oklch(0.7 var(--neutral-s) var(--neutral-hue));
97
- --xneutral-6: oklch(0.55 var(--neutral-s) var(--neutral-hue));
98
- --xneutral-7: oklch(0.4 var(--neutral-s) var(--neutral-hue));
99
- --xneutral-8: oklch(0.3 var(--neutral-s) var(--neutral-hue));
100
- --xneutral-9: oklch(0.2 var(--neutral-s) var(--neutral-hue));
101
- --xneutral-10: oklch(0.12 var(--neutral-s) var(--neutral-hue));
245
+ --neutral-c-start: var(--c-range-start);
246
+ --neutral-c-end: var(--c-range-end);
247
+ --xneutral-1: oklch(
248
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (1 / 10))
249
+ calc(var(--neutral-c-start) + (var(--neutral-c-end) - var(--neutral-c-start)) * (1 / 10)) var(--neutral-hue)
250
+ );
251
+ --xneutral-2: oklch(
252
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (2 / 10))
253
+ calc(var(--neutral-c-start) + (var(--neutral-c-end) - var(--neutral-c-start)) * (2 / 10)) var(--neutral-hue)
254
+ );
255
+ --xneutral-3: oklch(
256
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (3 / 10))
257
+ calc(var(--neutral-c-start) + (var(--neutral-c-end) - var(--neutral-c-start)) * (3 / 10)) var(--neutral-hue)
258
+ );
259
+ --xneutral-4: oklch(
260
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (4 / 10))
261
+ calc(var(--neutral-c-start) + (var(--neutral-c-end) - var(--neutral-c-start)) * (4 / 10)) var(--neutral-hue)
262
+ );
263
+ --xneutral-5: oklch(
264
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (5 / 10))
265
+ calc(var(--neutral-c-start) + (var(--neutral-c-end) - var(--neutral-c-start)) * (5 / 10)) var(--neutral-hue)
266
+ );
267
+ --xneutral-6: oklch(
268
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (6 / 10))
269
+ calc(var(--neutral-c-start) + (var(--neutral-c-end) - var(--neutral-c-start)) * (6 / 10)) var(--neutral-hue)
270
+ );
271
+ --xneutral-7: oklch(
272
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (7 / 10))
273
+ calc(var(--neutral-c-start) + (var(--neutral-c-end) - var(--neutral-c-start)) * (7 / 10)) var(--neutral-hue)
274
+ );
275
+ --xneutral-8: oklch(
276
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (8 / 10))
277
+ calc(var(--neutral-c-start) + (var(--neutral-c-end) - var(--neutral-c-start)) * (8 / 10)) var(--neutral-hue)
278
+ );
279
+ --xneutral-9: oklch(
280
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (9 / 10))
281
+ calc(var(--neutral-c-start) + (var(--neutral-c-end) - var(--neutral-c-start)) * (9 / 10)) var(--neutral-hue)
282
+ );
283
+ --xneutral-10: oklch(
284
+ calc(var(--lc-range-start) + (var(--lc-range-end) - var(--lc-range-start)) * (10 / 10))
285
+ calc(var(--neutral-c-start) + (var(--neutral-c-end) - var(--neutral-c-start)) * (10 / 10))
286
+ var(--neutral-hue)
287
+ );
102
288
  --neutral-1: var(--xneutral-1);
103
289
  --neutral-2: var(--xneutral-2);
104
290
  --neutral-3: var(--xneutral-3);
@@ -109,6 +295,8 @@
109
295
  --neutral-8: var(--xneutral-8);
110
296
  --neutral-9: var(--xneutral-9);
111
297
  --neutral-10: var(--xneutral-10);
298
+ --neutral-c-start: 0;
299
+ --neutral-c-end: 0.005;
112
300
  }
113
301
  @media (prefers-color-scheme: dark) {
114
302
  :root {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cryptlex/web-components",
3
- "version": "6.6.6-alpha74",
3
+ "version": "6.6.6-alpha76",
4
4
  "description": "React component library for Cryptlex web applications",
5
5
  "author": "Cryptlex",
6
6
  "type": "module",