aboutsummaryrefslogtreecommitdiffstats
path: root/packages/theme
diff options
context:
space:
mode:
Diffstat (limited to 'packages/theme')
-rw-r--r--packages/theme/.gitignore2
-rw-r--r--packages/theme/README.md11
-rw-r--r--packages/theme/package-lock.json52
-rw-r--r--packages/theme/package.json29
-rw-r--r--packages/theme/src/index.ts18
-rw-r--r--packages/theme/src/themes/dark/index.ts62
-rw-r--r--packages/theme/src/themes/default/index.ts139
-rw-r--r--packages/theme/src/themes/legacy/index.ts38
-rw-r--r--packages/theme/test/index.test.js17
-rw-r--r--packages/theme/tsconfig.json7
-rw-r--r--packages/theme/tslint.json3
11 files changed, 378 insertions, 0 deletions
diff --git a/packages/theme/.gitignore b/packages/theme/.gitignore
new file mode 100644
index 000000000..d01826a6b
--- /dev/null
+++ b/packages/theme/.gitignore
@@ -0,0 +1,2 @@
1node_modules/
2lib
diff --git a/packages/theme/README.md b/packages/theme/README.md
new file mode 100644
index 000000000..6f9cc406b
--- /dev/null
+++ b/packages/theme/README.md
@@ -0,0 +1,11 @@
1# `theme`
2
3> TODO: description
4
5## Usage
6
7```
8const theme = require('theme');
9
10// TODO: DEMONSTRATE API
11```
diff --git a/packages/theme/package-lock.json b/packages/theme/package-lock.json
new file mode 100644
index 000000000..f74af2f24
--- /dev/null
+++ b/packages/theme/package-lock.json
@@ -0,0 +1,52 @@
1{
2 "name": "@meetfranz/theme",
3 "version": "1.0.4",
4 "lockfileVersion": 1,
5 "requires": true,
6 "dependencies": {
7 "color": {
8 "version": "3.1.0",
9 "resolved": "https://registry.npmjs.org/color/-/color-3.1.0.tgz",
10 "integrity": "sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg==",
11 "requires": {
12 "color-convert": "^1.9.1",
13 "color-string": "^1.5.2"
14 }
15 },
16 "color-convert": {
17 "version": "1.9.3",
18 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
19 "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
20 "requires": {
21 "color-name": "1.1.3"
22 }
23 },
24 "color-name": {
25 "version": "1.1.3",
26 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
27 "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
28 },
29 "color-string": {
30 "version": "1.5.3",
31 "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
32 "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
33 "requires": {
34 "color-name": "^1.0.0",
35 "simple-swizzle": "^0.2.2"
36 }
37 },
38 "is-arrayish": {
39 "version": "0.3.2",
40 "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
41 "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
42 },
43 "simple-swizzle": {
44 "version": "0.2.2",
45 "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
46 "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
47 "requires": {
48 "is-arrayish": "^0.3.1"
49 }
50 }
51 }
52}
diff --git a/packages/theme/package.json b/packages/theme/package.json
new file mode 100644
index 000000000..f5dfc0236
--- /dev/null
+++ b/packages/theme/package.json
@@ -0,0 +1,29 @@
1{
2 "name": "@meetfranz/theme",
3 "version": "1.0.7",
4 "description": "Theme configuration for Franz",
5 "author": "Stefan Malzner <stefan@adlk.io>",
6 "homepage": "https://github.com/meetfranz/franz",
7 "license": "Apache-2.0",
8 "main": "lib/index.js",
9 "publishConfig": {
10 "access": "public"
11 },
12 "repository": {
13 "type": "git",
14 "url": "git+https://github.com/meetfranz/franz.git"
15 },
16 "scripts": {
17 "dev": "tsc -w",
18 "prepare": "tsc",
19 "preprepare": "npm run test",
20 "test": "npx mocha"
21 },
22 "bugs": {
23 "url": "https://github.com/meetfranz/franz/issues"
24 },
25 "dependencies": {
26 "color": "^3.1.0"
27 },
28 "gitHead": "14b151cad6a5a849bb476aaa3fc53bf1eead7f4b"
29}
diff --git a/packages/theme/src/index.ts b/packages/theme/src/index.ts
new file mode 100644
index 000000000..524a9edf1
--- /dev/null
+++ b/packages/theme/src/index.ts
@@ -0,0 +1,18 @@
1import * as darkThemeConfig from './themes/dark';
2import * as defaultThemeConfig from './themes/default';
3import * as legacyStyles from './themes/legacy';
4
5export enum ThemeType {
6 default = 'default',
7 dark = 'dark',
8}
9
10export function theme(themeId: ThemeType) {
11 if (themeId === ThemeType.dark) {
12 return Object.assign({}, defaultThemeConfig, darkThemeConfig, { legacyStyles });
13 }
14
15 return Object.assign({}, defaultThemeConfig, { legacyStyles });
16}
17
18export type Theme = typeof defaultThemeConfig;
diff --git a/packages/theme/src/themes/dark/index.ts b/packages/theme/src/themes/dark/index.ts
new file mode 100644
index 000000000..9b6bf055c
--- /dev/null
+++ b/packages/theme/src/themes/dark/index.ts
@@ -0,0 +1,62 @@
1import color from 'color';
2
3import * as defaultStyles from '../default';
4import * as legacyStyles from '../legacy';
5
6export const colorBackground = legacyStyles.darkThemeGrayDarkest;
7export const colorContentBackground = legacyStyles.darkThemeGrayDarkest;
8export const colorBackgroundSubscriptionContainer = legacyStyles.themeBrandInfo;
9
10export const colorHeadline = legacyStyles.darkThemeTextColor;
11export const colorText = legacyStyles.darkThemeTextColor;
12
13// Loader
14export const colorFullscreenLoaderSpinner = '#FFF';
15export const colorWebviewLoaderBackground = color(legacyStyles.darkThemeGrayDarkest).alpha(0.5).rgb().string();
16
17// Input
18export const labelColor = legacyStyles.darkThemeTextColor;
19export const inputColor = legacyStyles.darkThemeGrayLightest;
20export const inputBackground = legacyStyles.themeGrayDark;
21export const inputBorder = `1px solid ${legacyStyles.darkThemeGrayLight}`;
22export const inputPrefixColor = color(legacyStyles.darkThemeGrayLighter).lighten(0.3).hex();
23export const inputPrefixBackground = legacyStyles.darkThemeGray;
24export const inputDisabledOpacity = 0.5;
25export const inputScorePasswordBackground = legacyStyles.darkThemeGrayDark;
26export const inputModifierColor = color(legacyStyles.darkThemeGrayLighter).lighten(0.3).hex();
27export const inputPlaceholderColor = color(legacyStyles.darkThemeGrayLighter).darken(0.1).hex();
28
29// Toggle
30export const toggleBackground = legacyStyles.darkThemeGray;
31export const toggleButton = legacyStyles.darkThemeGrayLighter;
32
33// Button
34export const buttonPrimaryTextColor = legacyStyles.darkThemeTextColor;
35
36export const buttonSecondaryBackground = legacyStyles.darkThemeGrayLighter;
37export const buttonSecondaryTextColor = legacyStyles.darkThemeTextColor;
38
39export const buttonDangerTextColor = legacyStyles.darkThemeTextColor;
40
41export const buttonWarningTextColor = legacyStyles.darkThemeTextColor;
42
43export const buttonLoaderColor = {
44 primary: '#FFF',
45 secondary: buttonSecondaryTextColor,
46 success: '#FFF',
47 warning: '#FFF',
48 danger: '#FFF',
49 inverted: defaultStyles.brandPrimary,
50};
51
52// Select
53export const selectBackground = inputBackground;
54export const selectBorder = inputBorder;
55export const selectColor = inputColor;
56export const selectToggleColor = inputPrefixColor;
57export const selectPopupBackground = legacyStyles.darkThemeGrayLight;
58export const selectOptionColor = '#FFF';
59export const selectOptionBorder = `1px solid ${color(legacyStyles.darkThemeGrayLight).darken(0.2).hex()}`;
60export const selectOptionItemHover = color(legacyStyles.darkThemeGrayLight).darken(0.2).hex();
61export const selectOptionItemHoverColor = selectColor;
62export const selectSearchColor = inputBackground;
diff --git a/packages/theme/src/themes/default/index.ts b/packages/theme/src/themes/default/index.ts
new file mode 100644
index 000000000..d36558ff0
--- /dev/null
+++ b/packages/theme/src/themes/default/index.ts
@@ -0,0 +1,139 @@
1import color from 'color';
2
3import * as legacyStyles from '../legacy';
4
5export interface IStyleTypes {
6 [index: string]: {
7 accent: string;
8 contrast: string;
9 border?: string;
10 };
11}
12
13export const brandPrimary = '#3498db';
14export const brandSuccess = '#5cb85c';
15export const brandInfo = '#5bc0de';
16export const brandWarning = '#FF9F00';
17export const brandDanger = '#d9534f';
18
19export const uiFontSize = 14;
20
21export const borderRadius = legacyStyles.themeBorderRadius;
22export const borderRadiusSmall = legacyStyles.themeBorderRadiusSmall;
23
24export const colorBackground = legacyStyles.themeGrayLighter;
25export const colorContentBackground = '#FFFFFF';
26export const colorHeadline = legacyStyles.themeGrayDark;
27
28export const colorText = legacyStyles.themeTextColor;
29
30// Subscription Container Component
31export const colorSubscriptionContainerBackground = 'none';
32export const colorSubscriptionContainerBorder = `1px solid ${brandPrimary}`;
33export const colorSubscriptionContainerTitle = brandPrimary;
34export const colorSubscriptionContainerActionButtonBackground = brandPrimary;
35export const colorSubscriptionContainerActionButtonColor = '#FFF';
36
37// Loader
38export const colorAppLoaderSpinner = '#FFF';
39export const colorFullscreenLoaderSpinner = legacyStyles.themeGrayDark;
40export const colorWebviewLoaderBackground = color(legacyStyles.themeGrayLighter).alpha(0.8).rgb().string();
41
42// Input
43export const labelColor = legacyStyles.themeGrayLight;
44export const inputColor = legacyStyles.themeGray;
45export const inputHeight = '35px';
46export const inputBackground = legacyStyles.themeGrayLightest;
47export const inputBorder = `1px solid ${legacyStyles.themeGrayLighter}`;
48export const inputModifierColor = legacyStyles.themeGrayLight;
49export const inputPlaceholderColor = color(legacyStyles.themeGrayLight).lighten(0.3).hex();
50export const inputPrefixColor = legacyStyles.themeGrayLight;
51export const inputPrefixBackground = legacyStyles.themeGrayLighter;
52export const inputDisabledOpacity = 0.5;
53export const inputScorePasswordBackground = legacyStyles.themeGrayLighter;
54
55// Toggle
56export const toggleBackground = legacyStyles.themeGrayLighter;
57export const toggleButton = legacyStyles.themeGrayLight;
58export const toggleButtonActive = brandPrimary;
59export const toggleWidth = 40;
60export const toggleHeight = 14;
61
62// Style Types
63export const styleTypes: IStyleTypes = {
64 primary: {
65 accent: brandPrimary,
66 contrast: '#FFF',
67 },
68 secondary: {
69 accent: legacyStyles.themeGrayLighter,
70 contrast: legacyStyles.themeGray,
71 },
72 success: {
73 accent: brandSuccess,
74 contrast: '#FFF',
75 },
76 warning: {
77 accent: brandWarning,
78 contrast: '#FFF',
79 },
80 danger: {
81 accent: brandDanger,
82 contrast: '#FFF',
83 },
84 inverted: {
85 accent: 'none',
86 contrast: brandPrimary,
87 border: `1px solid ${brandPrimary}`,
88 },
89};
90
91// Button
92export const buttonPrimaryBackground = brandPrimary;
93export const buttonPrimaryTextColor = '#FFF';
94
95export const buttonSecondaryBackground = legacyStyles.themeGrayLighter;
96export const buttonSecondaryTextColor = legacyStyles.themeGray;
97
98export const buttonSuccessBackground = brandSuccess;
99export const buttonSuccessTextColor = '#FFF';
100
101export const buttonDangerBackground = brandDanger;
102export const buttonDangerTextColor = '#FFF';
103
104export const buttonWarningBackground = brandWarning;
105export const buttonWarningTextColor = '#FFF';
106
107export const buttonInvertedBackground = 'none';
108export const buttonInvertedTextColor = brandPrimary;
109export const buttonInvertedBorder = `1px solid ${brandPrimary}`;
110
111export const buttonLoaderColor = {
112 primary: '#FFF',
113 secondary: buttonSecondaryTextColor,
114 success: '#FFF',
115 warning: '#FFF',
116 danger: '#FFF',
117 inverted: brandPrimary,
118};
119
120// Select
121export const selectBackground = inputBackground;
122export const selectBorder = inputBorder;
123export const selectHeight = inputHeight;
124export const selectColor = inputColor;
125export const selectToggleColor = inputPrefixColor;
126export const selectPopupBackground = '#FFF';
127export const selectOptionColor = inputColor;
128export const selectOptionBorder = `1px solid ${legacyStyles.themeGrayLightest}`;
129export const selectOptionItemHover = legacyStyles.themeGrayLighter;
130export const selectOptionItemHoverColor = selectColor;
131export const selectOptionItemActive = brandPrimary;
132export const selectOptionItemActiveColor = '#FFF';
133export const selectSearchBackground = legacyStyles.themeGrayLighter;
134export const selectSearchColor = inputColor;
135export const selectDisabledOpacity = inputDisabledOpacity;
136
137// Badge
138export const badgeFontSize = uiFontSize - 2;
139export const badgeBorderRadius = 50;
diff --git a/packages/theme/src/themes/legacy/index.ts b/packages/theme/src/themes/legacy/index.ts
new file mode 100644
index 000000000..2114b92c1
--- /dev/null
+++ b/packages/theme/src/themes/legacy/index.ts
@@ -0,0 +1,38 @@
1/* legacy config, injected into sass */
2export const themeBrandPrimary = '#3498db';
3export const themeBrandSuccess = '#5cb85c';
4export const themeBrandInfo = '#5bc0de';
5export const themeBrandWarning = '#FF9F00';
6export const themeBrandDanger = '#d9534f';
7
8export const themeGrayDark = '#373a3c';
9export const themeGray = '#55595c';
10export const themeGrayLight = '#818a91';
11export const themeGrayLighter = '#eceeef';
12export const themeGrayLightest = '#f7f7f9';
13
14export const themeBorderRadius = '6px';
15export const themeBorderRadiusSmall = '3px';
16
17export const themeSidebarWidth = '68px';
18
19export const themeTextColor = themeGrayDark;
20
21export const themeTransitionTime = '.5s';
22
23export const themeInsetShadow = 'inset 0 2px 5px rgba(0, 0, 0, .03)';
24
25export const darkThemeBlack = '#1A1A1A';
26
27export const darkThemeGrayDarkest = '#1E1E1E';
28export const darkThemeGrayDarker = '#2D2F31';
29export const darkThemeGrayDark = '#383A3B';
30
31export const darkThemeGray = '#47494B';
32
33export const darkThemeGrayLight = '#515355';
34export const darkThemeGrayLighter = '#8a8b8b';
35export const darkThemeGrayLightest = '#FFFFFF';
36
37export const darkThemeGraySmoke = '#CED0D1';
38export const darkThemeTextColor = '#FFFFFF';
diff --git a/packages/theme/test/index.test.js b/packages/theme/test/index.test.js
new file mode 100644
index 000000000..3906433c1
--- /dev/null
+++ b/packages/theme/test/index.test.js
@@ -0,0 +1,17 @@
1const expect = require('expect.js');
2
3const { colorBackground: colorBackgroundDefault } = require('../lib/themes/default');
4const { colorBackground: colorBackgroundDark } = require('../lib/themes/dark');
5const { default: theme } = require('../lib');
6
7describe('Load theme', () => {
8 it('Should load default theme', () => {
9 const { colorBackground } = theme('default');
10 expect(colorBackground).to.be(colorBackgroundDefault);
11 });
12
13 it('Should load dark theme', () => {
14 const { colorBackground } = theme('dark');
15 expect(colorBackground).to.be(colorBackgroundDark);
16 });
17});
diff --git a/packages/theme/tsconfig.json b/packages/theme/tsconfig.json
new file mode 100644
index 000000000..d80ee9ee7
--- /dev/null
+++ b/packages/theme/tsconfig.json
@@ -0,0 +1,7 @@
1{
2 "extends": "../../tsconfig.settings.json",
3 "compilerOptions": {
4 "outDir": "lib",
5 "rootDir": "src"
6 },
7}
diff --git a/packages/theme/tslint.json b/packages/theme/tslint.json
new file mode 100644
index 000000000..0946f2096
--- /dev/null
+++ b/packages/theme/tslint.json
@@ -0,0 +1,3 @@
1{
2 "extends": "../../tslint.json"
3}