elbe-ui 0.2.26 → 0.2.34

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 (102) hide show
  1. package/dist/bit/bit.js +83 -0
  2. package/dist/bit/ctrl_bit.js +89 -0
  3. package/dist/elbe.css +621 -0
  4. package/dist/elbe.css.map +1 -0
  5. package/dist/index.d.ts +1549 -17
  6. package/dist/index.js +64 -18577
  7. package/dist/service/s_api.js +89 -0
  8. package/dist/ui/components/badge.d.ts +5 -5
  9. package/dist/ui/components/badge.js +53 -0
  10. package/dist/ui/components/base/box.d.ts +2564 -0
  11. package/dist/ui/components/base/box.js +30 -0
  12. package/dist/ui/components/base/card.d.ts +14 -0
  13. package/dist/ui/components/base/card.js +11 -0
  14. package/dist/ui/components/base/padded.js +28 -0
  15. package/dist/ui/components/button/button.d.ts +21 -0
  16. package/dist/ui/components/button/button.js +27 -0
  17. package/dist/ui/components/button/choose_button.d.ts +14 -0
  18. package/dist/ui/components/button/choose_button.js +11 -0
  19. package/dist/ui/components/button/icon_button.d.ts +17 -0
  20. package/dist/ui/components/button/icon_button.js +31 -0
  21. package/dist/ui/components/button/toggle_button.d.ts +10 -0
  22. package/dist/ui/components/button/toggle_button.js +11 -0
  23. package/dist/ui/components/dialog.js +14 -0
  24. package/dist/ui/components/error_view.js +26 -0
  25. package/dist/ui/components/input/checkbox.d.ts +1 -1
  26. package/dist/ui/components/input/checkbox.js +12 -0
  27. package/dist/ui/components/input/input_field.d.ts +1 -1
  28. package/dist/ui/components/input/input_field.js +31 -0
  29. package/dist/ui/components/input/range.d.ts +1 -1
  30. package/dist/ui/components/input/range.js +14 -0
  31. package/dist/ui/components/input/select.d.ts +1 -1
  32. package/dist/ui/components/input/select.js +8 -0
  33. package/dist/ui/components/input/text_area.d.ts +1 -1
  34. package/dist/ui/components/input/text_area.js +13 -0
  35. package/dist/ui/components/{flex.d.ts → layout/flex.d.ts} +1 -1
  36. package/dist/ui/components/layout/flex.js +23 -0
  37. package/dist/ui/components/{scaffold.d.ts → layout/scaffold.d.ts} +7 -3
  38. package/dist/ui/components/layout/scaffold.js +44 -0
  39. package/dist/ui/components/layout/scroll.d.ts +18 -0
  40. package/dist/ui/components/layout/scroll.js +20 -0
  41. package/dist/ui/components/layout/spaced.js +7 -0
  42. package/dist/ui/components/spinner.d.ts +10 -2
  43. package/dist/ui/components/spinner.js +48 -0
  44. package/dist/ui/components/text.d.ts +5 -5
  45. package/dist/ui/components/text.js +42 -0
  46. package/dist/ui/theme/color_theme.d.ts +2 -0
  47. package/dist/ui/theme/color_theme.js +63 -0
  48. package/dist/ui/theme/colors.d.ts +142 -0
  49. package/dist/ui/theme/colors.js +317 -0
  50. package/dist/ui/theme/geometry_theme.d.ts +16 -0
  51. package/dist/ui/theme/geometry_theme.js +38 -0
  52. package/dist/ui/theme/theme.d.ts +28 -0
  53. package/dist/ui/theme/theme.js +49 -0
  54. package/dist/ui/theme/type_theme.d.ts +38 -0
  55. package/dist/ui/theme/type_theme.js +98 -0
  56. package/dist/ui/util/confirm_dialog.js +46 -0
  57. package/dist/ui/util/error_view.js +8 -0
  58. package/dist/ui/util/toast.js +17 -0
  59. package/dist/ui/util/util.d.ts +2 -0
  60. package/dist/ui/util/util.js +39 -0
  61. package/package.json +14 -15
  62. package/dist/ui/color_theme.d.ts +0 -5
  63. package/dist/ui/components/box.d.ts +0 -1027
  64. package/dist/ui/components/button.d.ts +0 -23
  65. package/dist/ui/components/card.d.ts +0 -14
  66. package/dist/ui/components/icon_button.d.ts +0 -19
  67. package/dist/ui/components/toggle_button.d.ts +0 -12
  68. package/elbe.scss +0 -100
  69. package/src/bit/bit.tsx +0 -128
  70. package/src/bit/ctrl_bit.tsx +0 -112
  71. package/src/index.tsx +0 -29
  72. package/src/service/s_api.ts +0 -102
  73. package/src/ui/color_theme.ts +0 -24
  74. package/src/ui/components/badge.tsx +0 -78
  75. package/src/ui/components/box.tsx +0 -49
  76. package/src/ui/components/button.tsx +0 -61
  77. package/src/ui/components/card.tsx +0 -45
  78. package/src/ui/components/dialog.tsx +0 -51
  79. package/src/ui/components/error_view.tsx +0 -72
  80. package/src/ui/components/flex.tsx +0 -64
  81. package/src/ui/components/icon_button.tsx +0 -56
  82. package/src/ui/components/input/checkbox.tsx +0 -32
  83. package/src/ui/components/input/input_field.tsx +0 -57
  84. package/src/ui/components/input/range.tsx +0 -37
  85. package/src/ui/components/input/select.tsx +0 -29
  86. package/src/ui/components/input/text_area.tsx +0 -45
  87. package/src/ui/components/padded.tsx +0 -62
  88. package/src/ui/components/scaffold.tsx +0 -79
  89. package/src/ui/components/spinner.tsx +0 -11
  90. package/src/ui/components/text.tsx +0 -78
  91. package/src/ui/components/toggle_button.tsx +0 -52
  92. package/src/ui/components/util.tsx +0 -3
  93. package/src/ui/util/confirm_dialog.ts +0 -53
  94. package/src/ui/util/error_view.tsx +0 -16
  95. package/src/ui/util/toast.ts +0 -14
  96. package/src/ui/util/util.ts +0 -36
  97. package/style/color_style.scss +0 -149
  98. package/style/components.scss +0 -476
  99. package/style/root.scss +0 -50
  100. package/style/type_style.scss +0 -22
  101. /package/dist/ui/components/{padded.d.ts → base/padded.d.ts} +0 -0
  102. /package/dist/ui/components/{util.d.ts → layout/spaced.d.ts} +0 -0
@@ -1,7 +1,7 @@
1
1
  import React from "preact/compat";
2
- import type { ElbeTypeStyles } from "../color_theme";
2
+ import type { ElbeTypeVariants } from "../theme/type_theme";
3
3
  import type { ElbeChildren } from "../util/util";
4
- import { type ElbeProps } from "./box";
4
+ import { type ElbeProps } from "./base/box";
5
5
  export type TextProps = {
6
6
  align?: "start" | "center" | "end";
7
7
  bold?: boolean;
@@ -14,7 +14,7 @@ export type TextProps = {
14
14
  v?: string;
15
15
  } & ElbeProps;
16
16
  export declare class Text extends React.Component<TextProps & {
17
- typeStyle?: ElbeTypeStyles;
17
+ variant?: ElbeTypeVariants;
18
18
  }> {
19
19
  static h1: (p: TextProps) => React.JSX.Element;
20
20
  static h2: (p: TextProps) => React.JSX.Element;
@@ -26,8 +26,8 @@ export declare class Text extends React.Component<TextProps & {
26
26
  static m: (p: TextProps) => React.JSX.Element;
27
27
  static l: (p: TextProps) => React.JSX.Element;
28
28
  static code: (p: TextProps) => React.JSX.Element;
29
- constructor({ typeStyle, ...props }: TextProps & {
30
- typeStyle?: ElbeTypeStyles;
29
+ constructor({ variant, ...props }: TextProps & {
30
+ variant?: ElbeTypeVariants;
31
31
  });
32
32
  render(): React.JSX.Element;
33
33
  }
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Text = void 0;
7
+ const jsx_runtime_1 = require("preact/jsx-runtime");
8
+ const compat_1 = __importDefault(require("preact/compat"));
9
+ const box_1 = require("./base/box");
10
+ class Text extends compat_1.default.Component {
11
+ static h1 = (p) => (0, jsx_runtime_1.jsx)(Text, { ...p, variant: "h1" });
12
+ static h2 = (p) => (0, jsx_runtime_1.jsx)(Text, { ...p, variant: "h2" });
13
+ static h3 = (p) => (0, jsx_runtime_1.jsx)(Text, { ...p, variant: "h3" });
14
+ static h4 = (p) => (0, jsx_runtime_1.jsx)(Text, { ...p, variant: "h4" });
15
+ static h5 = (p) => (0, jsx_runtime_1.jsx)(Text, { ...p, variant: "h5" });
16
+ static h6 = (p) => (0, jsx_runtime_1.jsx)(Text, { ...p, variant: "h6" });
17
+ static s = (p) => (0, jsx_runtime_1.jsx)(Text, { ...p, variant: "body-s" });
18
+ static m = (p) => (0, jsx_runtime_1.jsx)(Text, { ...p, variant: "body-m" });
19
+ static l = (p) => (0, jsx_runtime_1.jsx)(Text, { ...p, variant: "body-l" });
20
+ static code = (p) => (0, jsx_runtime_1.jsx)(Text, { ...p, variant: "code" });
21
+ constructor({ variant = "body-m", ...props }) {
22
+ super({ ...props, variant });
23
+ }
24
+ render() {
25
+ const { align, bold, italic, underline, striked, color, size, children, variant, v, ...elbe } = this.props;
26
+ return ((0, jsx_runtime_1.jsxs)("span", { ...(0, box_1.applyProps)(elbe, [
27
+ "text",
28
+ align,
29
+ bold && "b",
30
+ italic && "i",
31
+ underline && "underline",
32
+ striked && "striked",
33
+ color,
34
+ variant,
35
+ ], {
36
+ fontSize: size ? `${size}rem` : "",
37
+ color: color || "",
38
+ scrollMarginTop: "2rem",
39
+ }), children: [v, children] }));
40
+ }
41
+ }
42
+ exports.Text = Text;
@@ -0,0 +1,2 @@
1
+ import { type ColorThemeSeed } from "./colors";
2
+ export declare function colorThemePreset(merge?: Partial<ColorThemeSeed>): ColorThemeSeed;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.colorThemePreset = colorThemePreset;
4
+ const colors_1 = require("./colors");
5
+ function colorThemePreset(merge) {
6
+ const styleSel = (_, b, s) => {
7
+ const bL = b.luminance;
8
+ if (bL === 1)
9
+ return s;
10
+ return s.inter(colors_1.LayerColor.fromBack(bL > 0.5 ? colors_1.colors.black : colors_1.colors.white), 0.1);
11
+ };
12
+ const seed = merge ?? {};
13
+ return {
14
+ base: seed.base ?? colors_1.LayerColor.fromBack(colors_1.colors.white),
15
+ accent: seed.accent ?? colors_1.LayerColor.fromBack(colors_1.colors.blueAccent),
16
+ info: seed.info ?? colors_1.LayerColor.fromBack(colors_1.colors.blue),
17
+ success: seed.success ?? colors_1.LayerColor.fromBack(colors_1.colors.green),
18
+ warning: seed.warning ?? colors_1.LayerColor.fromBack(colors_1.colors.yellow),
19
+ error: seed.error ?? colors_1.LayerColor.fromBack(colors_1.colors.red),
20
+ mode: {
21
+ light: seed.mode?.light ?? ((_, b) => b),
22
+ dark: seed.mode?.dark ?? ((_, b) => b.mirrorBrightness()),
23
+ },
24
+ scheme: {
25
+ primary: seed.scheme?.primary ?? ((_, b) => b),
26
+ secondary: seed.scheme?.secondary ??
27
+ ((c, b) => new colors_1.LayerColor(b.back.inter(c.accent.back, 0.1).desaturated(0.5), b.front, b.border)),
28
+ inverse: seed.scheme?.inverse ?? ((_, b) => b.mirrorBrightness()),
29
+ },
30
+ style: {
31
+ accent: styleSel,
32
+ info: styleSel,
33
+ success: styleSel,
34
+ warning: styleSel,
35
+ error: styleSel,
36
+ },
37
+ variant: {
38
+ major: seed.variant?.major ??
39
+ ((_, b, s) => colors_1.LayerColor.fromBack(s.back, { border: s.back })),
40
+ minor: seed.variant?.minor ??
41
+ ((_, b, s) => {
42
+ const back = b.back;
43
+ const backIn = back.mirrorBrightness();
44
+ const major = s.back;
45
+ const minor = s.back.inter(back, 0.8);
46
+ const minorFront = minor.hasWCAGContrast(major) ? major : null;
47
+ return new colors_1.LayerColor(s.back.withAlpha(0.25), minorFront ?? major.inter(backIn, 0.6), minorFront ?? major.inter(backIn, 0.3));
48
+ }),
49
+ flat: seed.variant?.flat ??
50
+ ((_, b, s) => {
51
+ //return new LayerColor(b.back, s?.back ?? b.front, b.front);
52
+ //calculate front brightness
53
+ const front = !s
54
+ ? b.front
55
+ : b.back.hasWCAGContrast(s?.back)
56
+ ? s?.back
57
+ : s?.back.inter(b.front, 0.6);
58
+ return new colors_1.LayerColor(b.back, //.withAlpha(0),
59
+ front, null, !s ? b.front.withAlpha(0.3) : b.front);
60
+ }),
61
+ },
62
+ };
63
+ }
@@ -0,0 +1,142 @@
1
+ export type ElbeColorModes = "light" | "dark";
2
+ export type ElbeColorSchemes = "primary" | "secondary" | "inverse";
3
+ export type ElbeColorKinds = "plain" | "accent" | "info" | "success" | "warning" | "error";
4
+ export type ElbeColorManners = "major" | "minor" | "flat" | "plain";
5
+ export declare const cModes: ElbeColorModes[];
6
+ export declare const cSchemes: ElbeColorSchemes[];
7
+ export declare const cKinds: ElbeColorKinds[];
8
+ export declare const cManners: ElbeColorManners[];
9
+ export declare const cStates: string[];
10
+ export declare const cLayers: string[];
11
+ export type SeedSelector = (seed: ColorThemeSeed, base: LayerColor) => LayerColor;
12
+ export type SeedFlatSelector = (seed: ColorThemeSeed, base: LayerColor, style?: LayerColor) => LayerColor;
13
+ export type SeedStyleSelector = (seed: ColorThemeSeed, base: LayerColor, style: LayerColor) => LayerColor;
14
+ export type ColorSeedColors = {
15
+ base: LayerColor;
16
+ accent: LayerColor;
17
+ info: LayerColor;
18
+ success: LayerColor;
19
+ warning: LayerColor;
20
+ error: LayerColor;
21
+ };
22
+ export type ColorThemeSeed = ColorSeedColors & {
23
+ mode: {
24
+ light: SeedSelector;
25
+ dark: SeedSelector;
26
+ };
27
+ scheme: {
28
+ primary: SeedSelector;
29
+ secondary: SeedSelector;
30
+ inverse: SeedSelector;
31
+ };
32
+ style: {
33
+ accent: SeedStyleSelector;
34
+ info: SeedStyleSelector;
35
+ success: SeedStyleSelector;
36
+ warning: SeedStyleSelector;
37
+ error: SeedStyleSelector;
38
+ };
39
+ variant: {
40
+ major: SeedStyleSelector;
41
+ minor: SeedStyleSelector;
42
+ flat: SeedFlatSelector;
43
+ };
44
+ };
45
+ declare class RGBAColor {
46
+ r: number;
47
+ g: number;
48
+ b: number;
49
+ a: number;
50
+ constructor(r: number, g: number, b: number, a: number);
51
+ asCss(): string;
52
+ get isDark(): boolean;
53
+ get luminance(): number;
54
+ get hex(): string;
55
+ static _fromHex(hex: string | null): RGBAColor;
56
+ desaturated(f?: number): RGBAColor;
57
+ withAlpha(a: number): RGBAColor;
58
+ inter(other: RGBAColor, factor: number): RGBAColor;
59
+ mirrorBrightness(factor?: number): RGBAColor;
60
+ get values(): [number, number, number, number];
61
+ hasWCAGContrast(color: RGBAColor): boolean;
62
+ contrastRatio(color: RGBAColor): number;
63
+ }
64
+ export declare const colors: {
65
+ transparent: RGBAColor;
66
+ white: RGBAColor;
67
+ black: RGBAColor;
68
+ blueAccent: RGBAColor;
69
+ blue: RGBAColor;
70
+ green: RGBAColor;
71
+ yellow: RGBAColor;
72
+ red: RGBAColor;
73
+ };
74
+ export declare class LayerColor extends RGBAColor {
75
+ back: RGBAColor;
76
+ border?: (RGBAColor | null) | undefined;
77
+ borderContext?: (RGBAColor | null) | undefined;
78
+ front: RGBAColor;
79
+ constructor(back: RGBAColor, front: RGBAColor | null, border?: (RGBAColor | null) | undefined, borderContext?: (RGBAColor | null) | undefined);
80
+ asCss(): string;
81
+ inter(other: LayerColor, factor: number): LayerColor;
82
+ mirrorBrightness(factor?: number): LayerColor;
83
+ desaturated(): LayerColor;
84
+ static fromHex(back: string, front?: string | null, border?: string | null): LayerColor;
85
+ static fromBack(back: RGBAColor, c?: {
86
+ front?: RGBAColor;
87
+ border?: RGBAColor;
88
+ }): LayerColor;
89
+ contextCss(): string;
90
+ }
91
+ export declare class StateColor extends LayerColor {
92
+ neutral: LayerColor;
93
+ hover: LayerColor;
94
+ active: LayerColor;
95
+ disabled: LayerColor;
96
+ constructor(neutral: LayerColor, hover: LayerColor, active: LayerColor, disabled: LayerColor);
97
+ asCss(): string;
98
+ static generate(_: ColorThemeSeed, context: LayerColor, style: LayerColor, fromFront?: boolean): StateColor;
99
+ }
100
+ export declare class MannerColor extends StateColor {
101
+ major: StateColor | null;
102
+ minor: StateColor | null;
103
+ flat: StateColor;
104
+ constructor(major: StateColor | null, minor: StateColor | null, flat: StateColor);
105
+ asCss(fallback?: MannerColor): string;
106
+ raisedCss(): string;
107
+ static generate(s: ColorThemeSeed, c: LayerColor, style?: LayerColor): MannerColor;
108
+ }
109
+ export declare class KindColor extends MannerColor {
110
+ plain: MannerColor;
111
+ accent: MannerColor;
112
+ info: MannerColor;
113
+ success: MannerColor;
114
+ warning: MannerColor;
115
+ error: MannerColor;
116
+ constructor(plain: MannerColor, accent: MannerColor, info: MannerColor, success: MannerColor, warning: MannerColor, error: MannerColor);
117
+ asCss(): string;
118
+ static generate(s: ColorThemeSeed, c: LayerColor): KindColor;
119
+ }
120
+ export declare class SchemeColor extends KindColor {
121
+ primary: KindColor;
122
+ secondary: KindColor;
123
+ inverse: KindColor;
124
+ constructor(primary: KindColor, secondary: KindColor, inverse: KindColor);
125
+ asCss(): string;
126
+ static generate(seed: ColorThemeSeed, c: LayerColor): SchemeColor;
127
+ }
128
+ export declare class ModeColor extends SchemeColor {
129
+ light: SchemeColor;
130
+ dark: SchemeColor;
131
+ constructor(light: SchemeColor, dark: SchemeColor);
132
+ asCss(): string;
133
+ static generate(seed: ColorThemeSeed): ModeColor;
134
+ }
135
+ export declare class ColorTheme {
136
+ colors: ColorSeedColors;
137
+ color: ModeColor;
138
+ constructor(colors: ColorSeedColors, color: ModeColor);
139
+ asCss(): string;
140
+ static generate(seed?: Partial<ColorThemeSeed>): ColorTheme;
141
+ }
142
+ export {};
@@ -0,0 +1,317 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ColorTheme = exports.ModeColor = exports.SchemeColor = exports.KindColor = exports.MannerColor = exports.StateColor = exports.LayerColor = exports.colors = exports.cLayers = exports.cStates = exports.cManners = exports.cKinds = exports.cSchemes = exports.cModes = void 0;
4
+ const colors_convert_1 = require("colors-convert");
5
+ const util_1 = require("../util/util");
6
+ const color_theme_1 = require("./color_theme");
7
+ exports.cModes = ["light", "dark"];
8
+ exports.cSchemes = ["primary", "secondary", "inverse"];
9
+ exports.cKinds = [
10
+ "plain",
11
+ "accent",
12
+ "info",
13
+ "success",
14
+ "warning",
15
+ "error",
16
+ ];
17
+ exports.cManners = ["major", "minor", "flat", "plain"];
18
+ exports.cStates = ["neutral", "hover", "active", "disabled"];
19
+ exports.cLayers = ["back", "front", "border"];
20
+ class RGBAColor {
21
+ r;
22
+ g;
23
+ b;
24
+ a;
25
+ constructor(r, g, b, a) {
26
+ this.r = r;
27
+ this.g = g;
28
+ this.b = b;
29
+ this.a = a;
30
+ }
31
+ asCss() {
32
+ return `rgba(${this.r}, ${this.g}, ${this.b}, ${this.a})`;
33
+ }
34
+ get isDark() {
35
+ return this.luminance < 0.5;
36
+ }
37
+ get luminance() {
38
+ const [r, g, b] = [this.r, this.g, this.b].map((v) => {
39
+ v /= 255;
40
+ return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
41
+ });
42
+ return r * 0.2126 + g * 0.7152 + b * 0.0722;
43
+ }
44
+ get hex() {
45
+ const c = [this.r, this.g, this.b].map((v) => Math.round(v).toString(16).padStart(2, "0"));
46
+ const a = Math.round(this.a * 255)
47
+ .toString(16)
48
+ .padStart(2, "0");
49
+ return `#${c.join("")}${a}`;
50
+ }
51
+ static _fromHex(hex) {
52
+ if (!hex)
53
+ return new RGBAColor(0, 0, 0, 0);
54
+ const c = hex.replace("#", "").padEnd(6, "0").padEnd(8, "f").toLowerCase();
55
+ console.log(c);
56
+ return new RGBAColor(parseInt(c.substring(0, 2), 16), parseInt(c.substring(2, 4), 16), parseInt(c.substring(4, 6), 16), parseInt(c.substring(6, 8), 16) / 255);
57
+ }
58
+ desaturated(f = 1) {
59
+ const avg = (this.r + this.g + this.b) / 3;
60
+ return new RGBAColor(this.r + (avg - this.r) * f, this.g + (avg - this.g) * f, this.b + (avg - this.b) * f, this.a);
61
+ }
62
+ withAlpha(a) {
63
+ return new RGBAColor(this.r, this.g, this.b, a);
64
+ }
65
+ inter(other, factor) {
66
+ return new RGBAColor(this.r + (other.r - this.r) * factor, this.g + (other.g - this.g) * factor, this.b + (other.b - this.b) * factor, this.a + (other.a - this.a) * factor);
67
+ }
68
+ mirrorBrightness(factor = 1) {
69
+ const hsl = (0, colors_convert_1.rgbToHsl)({ r: this.r, g: this.g, b: this.b });
70
+ const newL = (50 - hsl.l) * (factor * 2 - 1) + 50;
71
+ const rgb = (0, colors_convert_1.hslToRgb)({
72
+ ...hsl,
73
+ l: (0, util_1.clamp)(newL, 0, 100),
74
+ s: (0, util_1.clamp)(hsl.s, 0, 100),
75
+ //s: -Math.abs(2 * newL - 100) + 100,
76
+ });
77
+ return new RGBAColor(rgb.r, rgb.g, rgb.b, this.a);
78
+ }
79
+ get values() {
80
+ return [this.r, this.g, this.b, this.a];
81
+ }
82
+ hasWCAGContrast(color) {
83
+ return this.contrastRatio(color) >= 3;
84
+ }
85
+ contrastRatio(color) {
86
+ const l1 = this.luminance;
87
+ const l2 = color.luminance;
88
+ return (Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05);
89
+ }
90
+ }
91
+ exports.colors = {
92
+ transparent: new RGBAColor(0, 0, 0, 0),
93
+ white: new RGBAColor(255, 255, 255, 1),
94
+ black: new RGBAColor(0, 0, 0, 1),
95
+ blueAccent: new RGBAColor(60, 119, 246, 1),
96
+ blue: new RGBAColor(32, 89, 153, 1),
97
+ green: new RGBAColor(35, 144, 78, 1),
98
+ yellow: new RGBAColor(240, 221, 21, 1),
99
+ red: new RGBAColor(243, 67, 67, 1),
100
+ };
101
+ class LayerColor extends RGBAColor {
102
+ back;
103
+ border;
104
+ borderContext;
105
+ front;
106
+ constructor(back, front, border, borderContext) {
107
+ super(back.r, back.g, back.b, back.a);
108
+ this.back = back;
109
+ this.border = border;
110
+ this.borderContext = borderContext;
111
+ this.front = front ?? (back.isDark ? exports.colors.white : exports.colors.black);
112
+ }
113
+ asCss() {
114
+ return (`background-color: ${this.back.asCss()};\n` +
115
+ `color: ${this.front.asCss()};\n` +
116
+ `border-color: ${this.border?.asCss() ?? "transparent"};\n` +
117
+ //`border-color: ${this.border?.asCss() ?? "transparent"};\n` +
118
+ this.contextCss());
119
+ }
120
+ inter(other, factor) {
121
+ return new LayerColor(this.back.inter(other.back, factor), this.front.inter(other.front, factor), this.border?.inter(other.border ?? exports.colors.transparent, factor), this.borderContext?.inter(other.borderContext ?? exports.colors.transparent, factor));
122
+ }
123
+ mirrorBrightness(factor) {
124
+ return new LayerColor(this.back.mirrorBrightness(factor), this.front.mirrorBrightness(factor), this.border?.mirrorBrightness(factor), this.borderContext?.mirrorBrightness(factor));
125
+ }
126
+ desaturated() {
127
+ return new LayerColor(this.back.desaturated(), this.front.desaturated(), this.border?.desaturated(), this.borderContext?.desaturated());
128
+ }
129
+ static fromHex(back, front, border) {
130
+ if (front === undefined && border === undefined) {
131
+ return LayerColor.fromBack(RGBAColor._fromHex(back));
132
+ }
133
+ return new LayerColor(RGBAColor._fromHex(back), RGBAColor._fromHex(front ?? null), RGBAColor._fromHex(border ?? null));
134
+ }
135
+ static fromBack(back, c) {
136
+ const front = back.isDark ? exports.colors.white : exports.colors.black;
137
+ return new LayerColor(back, c?.front ?? front, c?.border ?? front);
138
+ }
139
+ contextCss() {
140
+ return (`--c-context-back: ${this.back.asCss()};\n` +
141
+ `--c-context-front: ${this.front.asCss()};` +
142
+ `--c-context-border: ${(this.borderContext ?? this.border)?.asCss() ?? "transparent"};`);
143
+ }
144
+ }
145
+ exports.LayerColor = LayerColor;
146
+ class StateColor extends LayerColor {
147
+ neutral;
148
+ hover;
149
+ active;
150
+ disabled;
151
+ constructor(neutral, hover, active, disabled) {
152
+ super(neutral.back, neutral.front, neutral.border);
153
+ this.neutral = neutral;
154
+ this.hover = hover;
155
+ this.active = active;
156
+ this.disabled = disabled;
157
+ }
158
+ asCss() {
159
+ const els = [
160
+ ".action",
161
+ ":is(button)",
162
+ ":is(a)",
163
+ ":is(input)",
164
+ ":is(select)",
165
+ ];
166
+ const disS = "&.disabled, & :disabled, &:disabled";
167
+ const hoverS = els.map((e) => `&${e}:hover:not(${disS})`).join(", ");
168
+ const activeS = els.map((e) => `&${e}:active:not(${disS})`).join(", ");
169
+ return (`${this.neutral.asCss()} \n` +
170
+ `${hoverS} { ${this.hover.asCss()} }\n` +
171
+ `${activeS} { ${this.active.asCss()} }\n` +
172
+ `${disS} { ${this.disabled.asCss()} }`);
173
+ }
174
+ static generate(_, context, style, fromFront) {
175
+ function _make(factor) {
176
+ const front = style.front;
177
+ return new LayerColor((fromFront
178
+ ? context.back.inter(front, factor)
179
+ : style.back.inter(context.back.mirrorBrightness(), factor)).withAlpha(Math.max(style.back.a, 0.2)), front, style.border, style.borderContext);
180
+ }
181
+ return new StateColor(style, _make(0.075), _make(0.25), style.desaturated());
182
+ }
183
+ }
184
+ exports.StateColor = StateColor;
185
+ class MannerColor extends StateColor {
186
+ major;
187
+ minor;
188
+ flat;
189
+ constructor(major, minor, flat) {
190
+ const m = major ?? flat;
191
+ super(m.neutral, m.hover, m.active, m.disabled);
192
+ this.major = major;
193
+ this.minor = minor;
194
+ this.flat = flat;
195
+ }
196
+ asCss(fallback) {
197
+ const maj = this.major ?? fallback?.major;
198
+ const min = this.minor ?? fallback?.minor;
199
+ return (`${this.flat.asCss()}\n` +
200
+ (maj ? `&.major { ${maj.asCss()} } \n` : "") +
201
+ (min ? `&.minor { ${min.asCss()} } \n` : "") +
202
+ `&.flat { ${this.flat.asCss()} }\n`);
203
+ }
204
+ raisedCss() {
205
+ const maj = this.major;
206
+ const min = this.minor;
207
+ return ((maj ? ` .major { ${maj.asCss()} } \n` : "") +
208
+ (min ? ` .minor { ${min.asCss()} } \n` : ""));
209
+ }
210
+ static generate(s, c, style) {
211
+ return new MannerColor(style ? StateColor.generate(s, c, s.variant.major(s, c, style)) : null, style ? StateColor.generate(s, c, s.variant.minor(s, c, style)) : null, StateColor.generate(s, c, s.variant.flat(s, c, style), true));
212
+ /*
213
+ if (!style) {
214
+ return new MannerColor(null, null, StateColor.generate(s, c, c, true));
215
+ }
216
+ return new MannerColor(
217
+ StateColor.generate(s, c, s.variant.major(s, c, style)),
218
+ StateColor.generate(s, c, s.variant.minor(s, c, style)),
219
+ StateColor.generate(s, c, s.variant.flat(s, c, style), true)
220
+ );
221
+ */
222
+ }
223
+ }
224
+ exports.MannerColor = MannerColor;
225
+ class KindColor extends MannerColor {
226
+ plain;
227
+ accent;
228
+ info;
229
+ success;
230
+ warning;
231
+ error;
232
+ constructor(plain, accent, info, success, warning, error) {
233
+ super(plain.major, plain.minor, plain.flat);
234
+ this.plain = plain;
235
+ this.accent = accent;
236
+ this.info = info;
237
+ this.success = success;
238
+ this.warning = warning;
239
+ this.error = error;
240
+ }
241
+ asCss() {
242
+ return (`${this.plain.asCss()}\n` +
243
+ `${this.accent.raisedCss()}\n` +
244
+ `.plain {${this.plain.asCss()}}\n` +
245
+ `.accent { ${this.accent.asCss()} }\n` +
246
+ `.info { ${this.info.asCss()} }\n` +
247
+ `.success { ${this.success.asCss()} }\n` +
248
+ `.warning { ${this.warning.asCss()} }\n` +
249
+ `.error { ${this.error.asCss()} }`);
250
+ }
251
+ static generate(s, c) {
252
+ return new KindColor(MannerColor.generate(s, c), MannerColor.generate(s, c, s.style.accent(s, c, s.accent)), MannerColor.generate(s, c, s.style.info(s, c, s.info)), MannerColor.generate(s, c, s.style.success(s, c, s.success)), MannerColor.generate(s, c, s.style.warning(s, c, s.warning)), MannerColor.generate(s, c, s.style.error(s, c, s.error)));
253
+ }
254
+ }
255
+ exports.KindColor = KindColor;
256
+ class SchemeColor extends KindColor {
257
+ primary;
258
+ secondary;
259
+ inverse;
260
+ constructor(primary, secondary, inverse) {
261
+ super(primary.plain, primary.accent, primary.info, primary.success, primary.warning, primary.error);
262
+ this.primary = primary;
263
+ this.secondary = secondary;
264
+ this.inverse = inverse;
265
+ }
266
+ asCss() {
267
+ return (`${this.primary.asCss()}\n` +
268
+ `.primary { ${this.primary.asCss()}} \n` +
269
+ `.secondary { ${this.secondary.asCss()} }\n` +
270
+ `.inverse { ${this.inverse.asCss()} }`);
271
+ }
272
+ static generate(seed, c) {
273
+ const m = seed.scheme;
274
+ return new SchemeColor(KindColor.generate(seed, m.primary(seed, c)), KindColor.generate(seed, m.secondary(seed, c)), KindColor.generate(seed, m.inverse(seed, c)));
275
+ }
276
+ }
277
+ exports.SchemeColor = SchemeColor;
278
+ class ModeColor extends SchemeColor {
279
+ light;
280
+ dark;
281
+ constructor(light, dark) {
282
+ super(light.primary, light.secondary, light.inverse);
283
+ this.light = light;
284
+ this.dark = dark;
285
+ }
286
+ asCss() {
287
+ return (`.elbe { ${this.light.asCss()}}` + `.elbe.dark { ${this.dark.asCss()}}`);
288
+ }
289
+ static generate(seed) {
290
+ return new ModeColor(SchemeColor.generate(seed, seed.base), SchemeColor.generate(seed, seed.mode.dark(seed, seed.base)));
291
+ }
292
+ }
293
+ exports.ModeColor = ModeColor;
294
+ class ColorTheme {
295
+ colors;
296
+ color;
297
+ constructor(colors, color) {
298
+ this.colors = colors;
299
+ this.color = color;
300
+ }
301
+ asCss() {
302
+ return (":root {" +
303
+ `--c-accent: ${this.colors.accent.back.asCss()};` +
304
+ `--c-info: ${this.colors.info.back.asCss()};` +
305
+ `--c-success: ${this.colors.success.back.asCss()};` +
306
+ `--c-warning: ${this.colors.warning.back.asCss()};` +
307
+ `--c-error: ${this.colors.error.back.asCss()};` +
308
+ "}\n" +
309
+ this.color.asCss());
310
+ }
311
+ static generate(seed) {
312
+ const s = (0, color_theme_1.colorThemePreset)(seed);
313
+ return new ColorTheme(s, ModeColor.generate(s));
314
+ }
315
+ }
316
+ exports.ColorTheme = ColorTheme;
317
+ //Bun.write("./example.css", ColorTheme.generate().asCss());
@@ -0,0 +1,16 @@
1
+ export interface GeometryThemeSeed {
2
+ size: number;
3
+ radius: number;
4
+ padding: number;
5
+ borderWidth: number;
6
+ }
7
+ export declare class GeometryTheme {
8
+ readonly size: number;
9
+ readonly radius: number;
10
+ readonly padding: number;
11
+ readonly borderWidth: number;
12
+ constructor(size: number, radius: number, padding: number, borderWidth: number);
13
+ asCss(): string;
14
+ static generate(seed?: Partial<GeometryTheme>): GeometryTheme;
15
+ }
16
+ export declare function geometryThemePreset(merge?: Partial<GeometryThemeSeed>): GeometryThemeSeed;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GeometryTheme = void 0;
4
+ exports.geometryThemePreset = geometryThemePreset;
5
+ class GeometryTheme {
6
+ size;
7
+ radius;
8
+ padding;
9
+ borderWidth;
10
+ constructor(size, radius, padding, borderWidth) {
11
+ this.size = size;
12
+ this.radius = radius;
13
+ this.padding = padding;
14
+ this.borderWidth = borderWidth;
15
+ }
16
+ asCss() {
17
+ return (`:root{` +
18
+ `--g-size: ${this.size}px;` +
19
+ `--g-radius: ${this.radius}rem;` +
20
+ `--g-padding: ${this.padding}rem;` +
21
+ `--g-border-width: ${this.borderWidth}rem;` +
22
+ "}");
23
+ }
24
+ static generate(seed) {
25
+ const s = geometryThemePreset(seed);
26
+ return new GeometryTheme(s.size, s.radius, s.padding, s.borderWidth);
27
+ }
28
+ }
29
+ exports.GeometryTheme = GeometryTheme;
30
+ function geometryThemePreset(merge) {
31
+ const seed = merge ?? {};
32
+ return {
33
+ size: seed.size ?? 16,
34
+ radius: seed.radius ?? 0.75,
35
+ padding: seed.padding ?? 1,
36
+ borderWidth: seed.borderWidth ?? 0.125,
37
+ };
38
+ }
@@ -0,0 +1,28 @@
1
+ import { ColorTheme, type ColorThemeSeed } from "./colors";
2
+ import { GeometryTheme, type GeometryThemeSeed } from "./geometry_theme";
3
+ import { TypeTheme, type TypeThemeSeed } from "./type_theme";
4
+ export * from "./color_theme";
5
+ export * from "./colors";
6
+ export * from "./geometry_theme";
7
+ export * from "./type_theme";
8
+ export interface ElbeThemeSeed {
9
+ color?: Partial<ColorThemeSeed>;
10
+ type?: Partial<TypeThemeSeed>;
11
+ geometry?: Partial<GeometryThemeSeed>;
12
+ }
13
+ export declare class ElbeThemeData {
14
+ readonly color: ColorTheme;
15
+ readonly type: TypeTheme;
16
+ readonly geometry: GeometryTheme;
17
+ constructor(color: ColorTheme, type: TypeTheme, geometry: GeometryTheme);
18
+ asCss(): string;
19
+ static fromSeed(seed: ElbeThemeSeed): ElbeThemeData;
20
+ }
21
+ export declare function ElbeTheme(p: {
22
+ children: any;
23
+ dark?: boolean;
24
+ } & ({
25
+ seed: ElbeThemeSeed;
26
+ } | {
27
+ theme: ElbeThemeData;
28
+ })): import("preact").JSX.Element;