@hanzogui/create-theme 2.0.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.
Files changed (104) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/applyMask.cjs +58 -0
  3. package/dist/cjs/applyMask.native.js +67 -0
  4. package/dist/cjs/applyMask.native.js.map +1 -0
  5. package/dist/cjs/combineMasks.cjs +40 -0
  6. package/dist/cjs/combineMasks.native.js +61 -0
  7. package/dist/cjs/combineMasks.native.js.map +1 -0
  8. package/dist/cjs/createTheme.cjs +82 -0
  9. package/dist/cjs/createTheme.native.js +91 -0
  10. package/dist/cjs/createTheme.native.js.map +1 -0
  11. package/dist/cjs/createThemeTypes.cjs +16 -0
  12. package/dist/cjs/createThemeTypes.native.js +19 -0
  13. package/dist/cjs/createThemeTypes.native.js.map +1 -0
  14. package/dist/cjs/helpers.cjs +34 -0
  15. package/dist/cjs/helpers.native.js +39 -0
  16. package/dist/cjs/helpers.native.js.map +1 -0
  17. package/dist/cjs/index.cjs +23 -0
  18. package/dist/cjs/index.native.js +26 -0
  19. package/dist/cjs/index.native.js.map +1 -0
  20. package/dist/cjs/isMinusZero.cjs +28 -0
  21. package/dist/cjs/isMinusZero.native.js +31 -0
  22. package/dist/cjs/isMinusZero.native.js.map +1 -0
  23. package/dist/cjs/masks.cjs +122 -0
  24. package/dist/cjs/masks.native.js +172 -0
  25. package/dist/cjs/masks.native.js.map +1 -0
  26. package/dist/cjs/tests.cjs +22 -0
  27. package/dist/cjs/tests.native.js +25 -0
  28. package/dist/cjs/tests.native.js.map +1 -0
  29. package/dist/cjs/themeInfo.cjs +35 -0
  30. package/dist/cjs/themeInfo.native.js +40 -0
  31. package/dist/cjs/themeInfo.native.js.map +1 -0
  32. package/dist/esm/applyMask.mjs +34 -0
  33. package/dist/esm/applyMask.mjs.map +1 -0
  34. package/dist/esm/applyMask.native.js +40 -0
  35. package/dist/esm/applyMask.native.js.map +1 -0
  36. package/dist/esm/combineMasks.mjs +17 -0
  37. package/dist/esm/combineMasks.mjs.map +1 -0
  38. package/dist/esm/combineMasks.native.js +35 -0
  39. package/dist/esm/combineMasks.native.js.map +1 -0
  40. package/dist/esm/createTheme.mjs +57 -0
  41. package/dist/esm/createTheme.mjs.map +1 -0
  42. package/dist/esm/createTheme.native.js +63 -0
  43. package/dist/esm/createTheme.native.js.map +1 -0
  44. package/dist/esm/createThemeTypes.mjs +2 -0
  45. package/dist/esm/createThemeTypes.mjs.map +1 -0
  46. package/dist/esm/createThemeTypes.native.js +2 -0
  47. package/dist/esm/createThemeTypes.native.js.map +1 -0
  48. package/dist/esm/helpers.mjs +9 -0
  49. package/dist/esm/helpers.mjs.map +1 -0
  50. package/dist/esm/helpers.native.js +11 -0
  51. package/dist/esm/helpers.native.js.map +1 -0
  52. package/dist/esm/index.js +7 -0
  53. package/dist/esm/index.js.map +1 -0
  54. package/dist/esm/index.mjs +7 -0
  55. package/dist/esm/index.mjs.map +1 -0
  56. package/dist/esm/index.native.js +7 -0
  57. package/dist/esm/index.native.js.map +1 -0
  58. package/dist/esm/isMinusZero.mjs +5 -0
  59. package/dist/esm/isMinusZero.mjs.map +1 -0
  60. package/dist/esm/isMinusZero.native.js +5 -0
  61. package/dist/esm/isMinusZero.native.js.map +1 -0
  62. package/dist/esm/masks.mjs +92 -0
  63. package/dist/esm/masks.mjs.map +1 -0
  64. package/dist/esm/masks.native.js +139 -0
  65. package/dist/esm/masks.native.js.map +1 -0
  66. package/dist/esm/tests.mjs +23 -0
  67. package/dist/esm/tests.mjs.map +1 -0
  68. package/dist/esm/tests.native.js +23 -0
  69. package/dist/esm/tests.native.js.map +1 -0
  70. package/dist/esm/themeInfo.mjs +11 -0
  71. package/dist/esm/themeInfo.mjs.map +1 -0
  72. package/dist/esm/themeInfo.native.js +13 -0
  73. package/dist/esm/themeInfo.native.js.map +1 -0
  74. package/package.json +42 -0
  75. package/src/applyMask.tsx +69 -0
  76. package/src/combineMasks.tsx +29 -0
  77. package/src/createTheme.tsx +127 -0
  78. package/src/createThemeTypes.tsx +85 -0
  79. package/src/helpers.tsx +44 -0
  80. package/src/index.tsx +6 -0
  81. package/src/isMinusZero.tsx +3 -0
  82. package/src/masks.tsx +137 -0
  83. package/src/tests.tsx +28 -0
  84. package/src/themeInfo.tsx +36 -0
  85. package/types/applyMask.d.ts +8 -0
  86. package/types/applyMask.d.ts.map +11 -0
  87. package/types/combineMasks.d.ts +4 -0
  88. package/types/combineMasks.d.ts.map +11 -0
  89. package/types/createTheme.d.ts +28 -0
  90. package/types/createTheme.d.ts.map +11 -0
  91. package/types/createThemeTypes.d.ts +67 -0
  92. package/types/createThemeTypes.d.ts.map +11 -0
  93. package/types/helpers.d.ts +18 -0
  94. package/types/helpers.d.ts.map +11 -0
  95. package/types/index.d.ts +8 -0
  96. package/types/index.d.ts.map +11 -0
  97. package/types/isMinusZero.d.ts +3 -0
  98. package/types/isMinusZero.d.ts.map +11 -0
  99. package/types/masks.d.ts +15 -0
  100. package/types/masks.d.ts.map +11 -0
  101. package/types/tests.d.ts +3 -0
  102. package/types/tests.d.ts.map +11 -0
  103. package/types/themeInfo.d.ts +13 -0
  104. package/types/themeInfo.d.ts.map +11 -0
@@ -0,0 +1,67 @@
1
+ import type { Variable } from "@hanzogui/web";
2
+ export type CreateThemePalette = (string | Variable)[];
3
+ export type ThemeMask = Record<string, string | number>;
4
+ export type MaskOptions = {
5
+ palette?: CreateThemePalette;
6
+ override?: Partial<ThemeMask>;
7
+ overrideStrategy?: "shift" | "swap";
8
+ overrideSwap?: Partial<ThemeMask>;
9
+ overrideShift?: Partial<ThemeMask>;
10
+ skip?: Partial<ThemeMask>;
11
+ strength?: number;
12
+ max?: number;
13
+ min?: number;
14
+ parentName?: string;
15
+ };
16
+ export type GenericTheme = {
17
+ [key: string]: string | Variable;
18
+ };
19
+ export type MaskFunction = <A extends ThemeMask>(template: A, options: MaskOptions) => A;
20
+ export type CreateMask = {
21
+ name: string;
22
+ mask: MaskFunction;
23
+ };
24
+ export type CreateThemeOptions = {
25
+ nonInheritedValues?: GenericTheme;
26
+ };
27
+ export type Palette = string[];
28
+ export type Template = {
29
+ [key: string]: number | string;
30
+ };
31
+ export type ThemeUsingMask<Masks = string> = MaskOptions & {
32
+ mask: Masks;
33
+ avoidNestingWithin?: string[];
34
+ childOptions?: MaskOptions & {
35
+ mask?: Masks;
36
+ };
37
+ };
38
+ export type ThemeUsingTemplate = CreateThemeOptions & {
39
+ palette?: string;
40
+ template: string;
41
+ };
42
+ type ThemePreDefined = {
43
+ theme: {
44
+ [key: string]: string;
45
+ };
46
+ };
47
+ export type Theme<Masks = string> = ThemePreDefined | ThemeUsingTemplate | ThemeUsingMask<Masks>;
48
+ export type ThemeWithParent<Masks = string> = Theme<Masks> & {
49
+ parent: string;
50
+ };
51
+ export type PaletteDefinitions = {
52
+ [key: string]: Palette;
53
+ };
54
+ export type ThemeDefinition<Masks extends string = string> = Theme<Masks> | ThemeWithParent<Masks>[];
55
+ type UnionableString = string & {};
56
+ export type ThemeDefinitions<Masks extends string = string> = {
57
+ [key: string]: ThemeDefinition<Masks | UnionableString>;
58
+ };
59
+ export type TemplateDefinitions = {
60
+ [key: string]: Template;
61
+ };
62
+ export type MaskDefinitions = {
63
+ [key: string]: CreateMask | CreateMask["mask"];
64
+ };
65
+ export {};
66
+
67
+ //# sourceMappingURL=createThemeTypes.d.ts.map
@@ -0,0 +1,11 @@
1
+ {
2
+ "mappings": "AAAA,cAAc,gBAAgB;AAE9B,YAAY,+BAA+B;AAE3C,YAAY,YAAY;AAExB,YAAY,cAAc;CACxB,UAAU;CACV,WAAW,QAAQ;CACnB,mBAAmB,UAAU;CAC7B,eAAe,QAAQ;CACvB,gBAAgB,QAAQ;CACxB,OAAO,QAAQ;CACf;CACA;CACA;CACA;;AAGF,YAAY,eAAe;yBAA0B;;AAErD,YAAY,gBAAgB,UAAU,WAAW,UAAU,GAAG,SAAS,gBAAgB;AAEvF,YAAY,aAAa;CACvB;CACA,MAAM;;AAGR,YAAY,qBAAqB;CAC/B,qBAAqB;;AAGvB,YAAY;AAEZ,YAAY,WAAW;;;AAIvB,YAAY,eAAe,kBAAkB,cAAc;CACzD,MAAM;CACN;CACA,eAAe,cAAc;EAC3B,OAAO;;;AAIX,YAAY,qBAAqB,qBAAqB;CACpD;CACA;;KAGG,kBAAkB;CACrB,OAAO;;;;AAGT,YAAY,MAAM,kBACd,kBACA,qBACA,eAAe;AAEnB,YAAY,gBAAgB,kBAAkB,MAAM,SAAS;CAC3D;;AAGF,YAAY,qBAAqB;gBAChB;;AAGjB,YAAY,gBAAgB,iCACxB,MAAM,SACN,gBAAgB;KAEf,2BAA2B;AAEhC,YAAY,iBAAiB,iCAAiC;gBAC7C,gBAAgB,QAAQ;;AAGzC,YAAY,sBAAsB;gBACjB;;AAGjB,YAAY,kBAAkB;gBACb,aAAa,WAAW",
3
+ "names": [],
4
+ "sources": [
5
+ "src/createThemeTypes.tsx"
6
+ ],
7
+ "version": 3,
8
+ "sourcesContent": [
9
+ "import type { Variable } from '@hanzogui/web'\n\nexport type CreateThemePalette = (string | Variable)[]\n\nexport type ThemeMask = Record<string, string | number>\n\nexport type MaskOptions = {\n palette?: CreateThemePalette\n override?: Partial<ThemeMask>\n overrideStrategy?: 'shift' | 'swap'\n overrideSwap?: Partial<ThemeMask>\n overrideShift?: Partial<ThemeMask>\n skip?: Partial<ThemeMask>\n strength?: number\n max?: number\n min?: number\n parentName?: string\n}\n\nexport type GenericTheme = { [key: string]: string | Variable }\n\nexport type MaskFunction = <A extends ThemeMask>(template: A, options: MaskOptions) => A\n\nexport type CreateMask = {\n name: string\n mask: MaskFunction\n}\n\nexport type CreateThemeOptions = {\n nonInheritedValues?: GenericTheme\n}\n\nexport type Palette = string[]\n\nexport type Template = {\n [key: string]: number | string\n}\n\nexport type ThemeUsingMask<Masks = string> = MaskOptions & {\n mask: Masks\n avoidNestingWithin?: string[]\n childOptions?: MaskOptions & {\n mask?: Masks\n }\n}\n\nexport type ThemeUsingTemplate = CreateThemeOptions & {\n palette?: string\n template: string\n}\n\ntype ThemePreDefined = {\n theme: { [key: string]: string }\n}\n\nexport type Theme<Masks = string> =\n | ThemePreDefined\n | ThemeUsingTemplate\n | ThemeUsingMask<Masks>\n\nexport type ThemeWithParent<Masks = string> = Theme<Masks> & {\n parent: string\n}\n\nexport type PaletteDefinitions = {\n [key: string]: Palette\n}\n\nexport type ThemeDefinition<Masks extends string = string> =\n | Theme<Masks>\n | ThemeWithParent<Masks>[]\n\ntype UnionableString = string & {}\n\nexport type ThemeDefinitions<Masks extends string = string> = {\n [key: string]: ThemeDefinition<Masks | UnionableString>\n}\n\nexport type TemplateDefinitions = {\n [key: string]: Template\n}\n\nexport type MaskDefinitions = {\n [key: string]: CreateMask | CreateMask['mask']\n}\n"
10
+ ]
11
+ }
@@ -0,0 +1,18 @@
1
+ type ObjectType = Record<PropertyKey, unknown>;
2
+ type PickByValue<
3
+ OBJ_T,
4
+ VALUE_T
5
+ > = Pick<OBJ_T, { [K in keyof OBJ_T] : OBJ_T[K] extends VALUE_T ? K : never }[keyof OBJ_T]>;
6
+ type ObjectEntries<OBJ_T> = { [K in keyof OBJ_T] : [keyof PickByValue<OBJ_T, OBJ_T[K]>, OBJ_T[K]] }[keyof OBJ_T][];
7
+ export declare const objectKeys: <O extends object>(obj: O) => Array<keyof O>;
8
+ export declare function objectEntries<OBJ_T extends ObjectType>(obj: OBJ_T): ObjectEntries<OBJ_T>;
9
+ type EntriesType = [PropertyKey, unknown][] | ReadonlyArray<readonly [PropertyKey, unknown]>;
10
+ type DeepWritable<OBJ_T> = { -readonly [P in keyof OBJ_T] : DeepWritable<OBJ_T[P]> };
11
+ type UnionToIntersection<UNION_T> = (UNION_T extends any ? (k: UNION_T) => void : never) extends (k: infer I) => void ? I : never;
12
+ type UnionObjectFromArrayOfPairs<ARR_T extends EntriesType> = DeepWritable<ARR_T> extends (infer R)[] ? R extends [infer key, infer val] ? { [prop in key & PropertyKey] : val } : never : never;
13
+ type MergeIntersectingObjects<ObjT> = { [key in keyof ObjT] : ObjT[key] };
14
+ type EntriesToObject<ARR_T extends EntriesType> = MergeIntersectingObjects<UnionToIntersection<UnionObjectFromArrayOfPairs<ARR_T>>>;
15
+ export declare function objectFromEntries<ARR_T extends EntriesType>(arr: ARR_T): EntriesToObject<ARR_T>;
16
+ export {};
17
+
18
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1,11 @@
1
+ {
2
+ "mappings": "KAAK,aAAa,OAAO;KAEpB;CAAY;CAAO;IACtB,KAAK,UAAU,WAAW,SAAQ,MAAM,WAAW,UAAU,kBAAkB;KAE5E,cAAc,YACd,WAAW,gBAAe,YAAY,OAAO,MAAM,KAAK,MAAM,YAAY;AAE/E,OAAO,cAAM,aAAc,kBAAkB,KAAK,MAA0B,YAAY;AAExF,OAAO,iBAAS,cAAc,cAAc,YAC1C,KAAK,QACJ,cAAc;KAIZ,eACA,0BACD,wBAAwB;KAGvB,aAAa,sBAAsB,WAAW,SAAQ,aAAa,MAAM;KACzE,oBAAoB,YACtB,uBAAuB,GAAG,mCAAmC,SAAS,aACnE;KAID,4BAA4B,cAAc,eAC7C,aAAa,sBAAsB,OAC/B,iBAAiB,WAAW,UACvB,QAAQ,MAAM,eAAc;KAGlC,yBAAyB,WAAW,aAAa,QAAO,KAAK;KAC7D,gBAAgB,cAAc,eAAe,yBAChD,oBAAoB,4BAA4B;AAGlD,OAAO,iBAAS,kBAAkB,cAAc,aAC9C,KAAK,QACJ,gBAAgB",
3
+ "names": [],
4
+ "sources": [
5
+ "src/helpers.tsx"
6
+ ],
7
+ "version": 3,
8
+ "sourcesContent": [
9
+ "type ObjectType = Record<PropertyKey, unknown>\n\ntype PickByValue<OBJ_T, VALUE_T> = // From https://stackoverflow.com/a/55153000\n Pick<OBJ_T, { [K in keyof OBJ_T]: OBJ_T[K] extends VALUE_T ? K : never }[keyof OBJ_T]>\n\ntype ObjectEntries<OBJ_T> = // From https://stackoverflow.com/a/60142095\n { [K in keyof OBJ_T]: [keyof PickByValue<OBJ_T, OBJ_T[K]>, OBJ_T[K]] }[keyof OBJ_T][]\n\nexport const objectKeys = <O extends object>(obj: O) => Object.keys(obj) as Array<keyof O>\n\nexport function objectEntries<OBJ_T extends ObjectType>(\n obj: OBJ_T\n): ObjectEntries<OBJ_T> {\n return Object.entries(obj) as ObjectEntries<OBJ_T>\n}\n\ntype EntriesType =\n | [PropertyKey, unknown][]\n | ReadonlyArray<readonly [PropertyKey, unknown]>\n\n// Existing Utils\ntype DeepWritable<OBJ_T> = { -readonly [P in keyof OBJ_T]: DeepWritable<OBJ_T[P]> }\ntype UnionToIntersection<UNION_T> = // From https://stackoverflow.com/a/50375286\n (UNION_T extends any ? (k: UNION_T) => void : never) extends (k: infer I) => void\n ? I\n : never\n\n// New Utils\ntype UnionObjectFromArrayOfPairs<ARR_T extends EntriesType> =\n DeepWritable<ARR_T> extends (infer R)[]\n ? R extends [infer key, infer val]\n ? { [prop in key & PropertyKey]: val }\n : never\n : never\ntype MergeIntersectingObjects<ObjT> = { [key in keyof ObjT]: ObjT[key] }\ntype EntriesToObject<ARR_T extends EntriesType> = MergeIntersectingObjects<\n UnionToIntersection<UnionObjectFromArrayOfPairs<ARR_T>>\n>\n\nexport function objectFromEntries<ARR_T extends EntriesType>(\n arr: ARR_T\n): EntriesToObject<ARR_T> {\n return Object.fromEntries(arr) as EntriesToObject<ARR_T>\n}\n"
10
+ ]
11
+ }
@@ -0,0 +1,8 @@
1
+ export * from "./createTheme";
2
+ export * from "./masks";
3
+ export * from "./combineMasks";
4
+ export * from "./applyMask";
5
+ export * from "./createThemeTypes";
6
+ export * from "./helpers";
7
+
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,11 @@
1
+ {
2
+ "mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc",
3
+ "names": [],
4
+ "sources": [
5
+ "src/index.tsx"
6
+ ],
7
+ "version": 3,
8
+ "sourcesContent": [
9
+ "export * from './createTheme'\nexport * from './masks'\nexport * from './combineMasks'\nexport * from './applyMask'\nexport * from './createThemeTypes'\nexport * from './helpers'\n"
10
+ ]
11
+ }
@@ -0,0 +1,3 @@
1
+ export declare function isMinusZero(value: number): boolean;
2
+
3
+ //# sourceMappingURL=isMinusZero.d.ts.map
@@ -0,0 +1,11 @@
1
+ {
2
+ "mappings": "AAAA,OAAO,iBAAS,YAAY",
3
+ "names": [],
4
+ "sources": [
5
+ "src/isMinusZero.tsx"
6
+ ],
7
+ "version": 3,
8
+ "sourcesContent": [
9
+ "export function isMinusZero(value: number): boolean {\n return 1 / value === Number.NEGATIVE_INFINITY\n}\n"
10
+ ]
11
+ }
@@ -0,0 +1,15 @@
1
+ import type { CreateMask, MaskFunction, MaskOptions } from "./createThemeTypes";
2
+ export declare const createMask: <C extends CreateMask | MaskFunction>(createMask: C) => CreateMask;
3
+ export declare const skipMask: CreateMask;
4
+ export declare const createIdentityMask: () => CreateMask;
5
+ export declare const createInverseMask: () => CreateMask;
6
+ type ShiftMaskOptions = {
7
+ inverse?: boolean;
8
+ };
9
+ export declare const createShiftMask: ({ inverse }?: ShiftMaskOptions, defaultOptions?: MaskOptions) => CreateMask;
10
+ export declare const createWeakenMask: (defaultOptions?: MaskOptions) => CreateMask;
11
+ export declare const createSoftenMask: (defaultOptions?: MaskOptions) => CreateMask;
12
+ export declare const createStrengthenMask: (defaultOptions?: MaskOptions) => CreateMask;
13
+ export {};
14
+
15
+ //# sourceMappingURL=masks.d.ts.map
@@ -0,0 +1,11 @@
1
+ {
2
+ "mappings": "AAAA,cAAc,YAAY,cAAc,mBAAmB;AAI3D,OAAO,cAAM,aAAc,UAAU,aAAa,cAChD,YAAY,MACX;AAKH,OAAO,cAAM,UAAU;AA8CvB,OAAO,cAAM,0BAAyB;AAKtC,OAAO,cAAM,yBAAwB;KAahC,mBAAmB;CAAE;;AAE1B,OAAO,cAAM,kBACX,EAAE,YAAW,kBACb,iBAAiB,gBAChB;AA6CH,OAAO,cAAM,mBAAoB,iBAAiB,gBAAc;AAKhE,OAAO,cAAM,mBAAmB,iBAAiB,gBAAgB;AAGjE,OAAO,cAAM,uBAAwB,iBAAiB,gBAAc",
3
+ "names": [],
4
+ "sources": [
5
+ "src/masks.tsx"
6
+ ],
7
+ "version": 3,
8
+ "sourcesContent": [
9
+ "import type { CreateMask, MaskFunction, MaskOptions } from './createThemeTypes'\nimport { objectEntries, objectFromEntries } from './helpers'\nimport { isMinusZero } from './isMinusZero'\n\nexport const createMask = <C extends CreateMask | MaskFunction>(\n createMask: C\n): CreateMask =>\n typeof createMask === 'function'\n ? { name: createMask.name || 'unnamed', mask: createMask }\n : createMask\n\nexport const skipMask: CreateMask = {\n name: 'skip-mask',\n mask: (template, opts) => {\n const { skip } = opts\n const result = Object.fromEntries(\n Object.entries(template)\n .filter(([k]) => !skip || !(k in skip))\n .map(([k, v]) => [k, applyOverrides(k, v, opts)])\n ) as typeof template\n\n return result\n },\n}\n\nfunction applyOverrides(key: string, value: number | string, opts: MaskOptions) {\n let override: string | number | undefined\n let strategy = opts.overrideStrategy\n\n const overrideSwap = opts.overrideSwap?.[key]\n if (typeof overrideSwap !== 'undefined') {\n override = overrideSwap\n strategy = 'swap'\n } else {\n const overrideShift = opts.overrideShift?.[key]\n if (typeof overrideShift !== 'undefined') {\n override = overrideShift\n strategy = 'shift'\n } else {\n const overrideDefault = opts.override?.[key]\n if (typeof overrideDefault !== 'undefined') {\n override = overrideDefault\n strategy = opts.overrideStrategy\n }\n }\n }\n\n if (typeof override === 'undefined') return value\n if (typeof override === 'string') return value\n\n if (strategy === 'swap') {\n return override\n }\n\n return value\n}\n\nexport const createIdentityMask = (): CreateMask => ({\n name: 'identity-mask',\n mask: (template, opts) => skipMask.mask(template, opts),\n})\n\nexport const createInverseMask = (): CreateMask => {\n const mask: CreateMask = {\n name: 'inverse-mask',\n mask: (template, opts) => {\n const inversed = objectFromEntries(\n objectEntries(template).map(([k, v]) => [k, -v])\n ) as any\n return skipMask.mask(inversed, opts)\n },\n }\n return mask\n}\n\ntype ShiftMaskOptions = { inverse?: boolean }\n\nexport const createShiftMask = (\n { inverse }: ShiftMaskOptions = {},\n defaultOptions?: MaskOptions\n): CreateMask => {\n const mask: CreateMask = {\n name: 'shift-mask',\n mask: (template, opts) => {\n const {\n override,\n overrideStrategy = 'shift',\n max: maxIn,\n palette,\n min = 0,\n strength = 1,\n } = { ...defaultOptions, ...opts }\n const values = Object.entries(template)\n const max =\n maxIn ?? (palette ? Object.values(palette).length - 1 : Number.POSITIVE_INFINITY)\n const out = {}\n for (const [key, value] of values) {\n if (typeof value === 'string') continue\n if (typeof override?.[key] === 'number') {\n const overrideVal = override[key] as number\n out[key] = overrideStrategy === 'shift' ? value + overrideVal : overrideVal\n continue\n }\n if (typeof override?.[key] === 'string') {\n out[key] = override[key]\n continue\n }\n const isPositive = value === 0 ? !isMinusZero(value) : value >= 0\n const direction = isPositive ? 1 : -1\n const invert = inverse ? -1 : 1\n const next = value + strength * direction * invert\n const clamped = isPositive\n ? Math.max(min, Math.min(max, next))\n : Math.min(-min, Math.max(-max, next))\n\n out[key] = clamped\n }\n\n const skipped = skipMask.mask(out, opts) as typeof template\n return skipped\n },\n }\n return mask\n}\n\nexport const createWeakenMask = (defaultOptions?: MaskOptions): CreateMask => ({\n name: 'soften-mask',\n mask: createShiftMask({}, defaultOptions).mask,\n})\n\nexport const createSoftenMask: (defaultOptions?: MaskOptions) => CreateMask =\n createWeakenMask\n\nexport const createStrengthenMask = (defaultOptions?: MaskOptions): CreateMask => ({\n name: 'strengthen-mask',\n mask: createShiftMask({ inverse: true }, defaultOptions).mask,\n})\n"
10
+ ]
11
+ }
@@ -0,0 +1,3 @@
1
+ export {};
2
+
3
+ //# sourceMappingURL=tests.d.ts.map
@@ -0,0 +1,11 @@
1
+ {
2
+ "mappings": "",
3
+ "names": [],
4
+ "sources": [
5
+ "src/tests.tsx"
6
+ ],
7
+ "version": 3,
8
+ "sourcesContent": [
9
+ "import { applyMask } from './applyMask'\nimport { createTheme } from './createTheme'\nimport { createStrengthenMask, createWeakenMask } from './masks'\n\n// --- tests ---\nif (process.env.NODE_ENV === 'development') {\n const palette = ['0', '1', '2', '3', '-3', '-2', '-1', '-0']\n const template = { bg: 1, fg: -1 }\n\n const stongerMask = createStrengthenMask()\n const weakerMask = createWeakenMask()\n\n const theme = createTheme(palette, template)\n if (theme.bg !== '1') throw `❌`\n if (theme.fg !== '-1') throw `❌`\n\n const str = applyMask(theme, stongerMask)\n if (str.bg !== '0') throw `❌`\n if (str.fg !== '-0') throw `❌`\n\n const weak = applyMask(theme, weakerMask)\n if (weak.bg !== '2') throw `❌`\n if (weak.fg !== '-2') throw `❌`\n\n const weak2 = applyMask(theme, weakerMask, { strength: 2 })\n if (weak2.bg !== '3') throw `❌`\n if (weak2.fg !== '-3') throw `❌`\n}\n"
10
+ ]
11
+ }
@@ -0,0 +1,13 @@
1
+ import type { CreateThemeOptions, CreateThemePalette, GenericTheme, ThemeMask } from "./createThemeTypes";
2
+ export type ThemeInfo = {
3
+ palette: CreateThemePalette;
4
+ definition: ThemeMask;
5
+ options?: CreateThemeOptions;
6
+ cache: Map<any, any>;
7
+ };
8
+ export declare const getThemeInfo: (theme: GenericTheme | ThemeMask, name?: string) => ThemeInfo | undefined;
9
+ export declare const setThemeInfo: (theme: GenericTheme | ThemeMask, info: Pick<ThemeInfo, "palette" | "definition" | "options"> & {
10
+ name?: string;
11
+ }) => void;
12
+
13
+ //# sourceMappingURL=themeInfo.d.ts.map
@@ -0,0 +1,11 @@
1
+ {
2
+ "mappings": "AAAA,cACE,oBACA,oBACA,cACA,iBACK;AAEP,YAAY,YAAY;CACtB,SAAS;CACT,YAAY;CACZ,UAAU;CACV,OAAO;;AAKT,OAAO,cAAM,eACX,OAAO,eAAe,WACtB,kBACC;AAIH,OAAO,cAAM,eACX,OAAO,eAAe,WACtB,MAAM,KAAK,WAAW,YAAY,eAAe,aAAa;CAC5D",
3
+ "names": [],
4
+ "sources": [
5
+ "src/themeInfo.tsx"
6
+ ],
7
+ "version": 3,
8
+ "sourcesContent": [
9
+ "import type {\n CreateThemeOptions,\n CreateThemePalette,\n GenericTheme,\n ThemeMask,\n} from './createThemeTypes'\n\nexport type ThemeInfo = {\n palette: CreateThemePalette\n definition: ThemeMask\n options?: CreateThemeOptions\n cache: Map<any, any>\n}\n\nconst THEME_INFO = new Map<string, ThemeInfo>()\n\nexport const getThemeInfo = (\n theme: GenericTheme | ThemeMask,\n name?: string\n): ThemeInfo | undefined => {\n return THEME_INFO.get(name || JSON.stringify(theme))\n}\n\nexport const setThemeInfo = (\n theme: GenericTheme | ThemeMask,\n info: Pick<ThemeInfo, 'palette' | 'definition' | 'options'> & {\n name?: string\n }\n): void => {\n const next = {\n ...info,\n cache: new Map(),\n }\n THEME_INFO.set(info.name || JSON.stringify(theme), next)\n THEME_INFO.set(JSON.stringify(info.definition), next)\n}\n"
10
+ ]
11
+ }