@fylib/theme 0.1.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.
package/dist/engine.js ADDED
@@ -0,0 +1,291 @@
1
+ import { logger } from '@fylib/logger';
2
+ import { defaultTheme } from './default-theme';
3
+ import { fineyPuffy1Theme } from './finey-puffy-1-theme';
4
+ import { fineyWorkbench1Theme } from './finey-workbench-1-theme';
5
+ import { fineyWorkbench2Theme } from './finey-workbench-2-theme';
6
+ import { fineyWorkbench3Theme } from './finey-workbench-3-theme';
7
+ import { christmasTheme } from './christmas-theme';
8
+ import { windows7Theme } from './win7-theme';
9
+ import { windowsXpTheme } from './xp-theme';
10
+ import { fineyNexus1Theme } from './finey-nexus-1-theme';
11
+ import { fineyHub1Theme } from './finey-hub-1-theme';
12
+ export class ThemeEngine {
13
+ constructor() {
14
+ this.themes = new Map();
15
+ this.plugins = [];
16
+ this.currentTheme = null;
17
+ this.currentMode = 'light';
18
+ this.registerTheme(defaultTheme);
19
+ this.registerTheme(fineyPuffy1Theme);
20
+ this.registerTheme(fineyWorkbench1Theme);
21
+ this.registerTheme(fineyWorkbench2Theme);
22
+ this.registerTheme(fineyWorkbench3Theme);
23
+ this.registerTheme(christmasTheme);
24
+ this.registerTheme(windows7Theme);
25
+ this.registerTheme(windowsXpTheme);
26
+ this.registerTheme(fineyNexus1Theme);
27
+ this.registerTheme(fineyHub1Theme);
28
+ }
29
+ registerTheme(theme) {
30
+ if (this.themes.has(theme.name))
31
+ return;
32
+ this.themes.set(theme.name, theme);
33
+ logger.debug('Theme', `Theme registered: ${theme.name}`);
34
+ }
35
+ registerPlugin(plugin) {
36
+ if (this.plugins.some(p => p.name === plugin.name))
37
+ return;
38
+ this.plugins.push(plugin);
39
+ logger.debug('Theme', `Plugin registered: ${plugin.name}`);
40
+ }
41
+ setTheme(name) {
42
+ if (this.currentTheme === name)
43
+ return;
44
+ if (!this.themes.has(name)) {
45
+ logger.error('Theme', `Theme ${name} not found`);
46
+ throw new Error(`Theme ${name} not found`);
47
+ }
48
+ this.currentTheme = name;
49
+ logger.info('Theme', `Theme changed to: ${name}`);
50
+ }
51
+ setMode(mode) {
52
+ if (this.currentMode === mode)
53
+ return;
54
+ this.currentMode = mode;
55
+ logger.info('Theme', `Theme mode changed to: ${mode}`);
56
+ }
57
+ getMode() {
58
+ return this.currentMode;
59
+ }
60
+ getBackgroundEffect() {
61
+ if (!this.currentTheme)
62
+ return undefined;
63
+ const theme = this.themes.get(this.currentTheme);
64
+ return theme?.backgroundEffect;
65
+ }
66
+ getWallpaper() {
67
+ if (!this.currentTheme)
68
+ return undefined;
69
+ const theme = this.themes.get(this.currentTheme);
70
+ return theme?.wallpaper;
71
+ }
72
+ getComponentAnimation(componentSelector, event) {
73
+ if (!this.currentTheme) {
74
+ return undefined;
75
+ }
76
+ const theme = this.themes.get(this.currentTheme);
77
+ if (!theme || !theme.componentAnimations) {
78
+ return undefined;
79
+ }
80
+ const componentMap = theme.componentAnimations[componentSelector];
81
+ if (!componentMap) {
82
+ return undefined;
83
+ }
84
+ return componentMap[event];
85
+ }
86
+ getTokens() {
87
+ if (!this.currentTheme) {
88
+ throw new Error('No theme set');
89
+ }
90
+ const theme = this.themes.get(this.currentTheme);
91
+ // Start with defaultTheme tokens to ensure all variables are accounted for
92
+ let tokens = this.deepMerge({}, defaultTheme.tokens);
93
+ // Layer the current theme's tokens
94
+ tokens = this.deepMerge(tokens, theme.tokens);
95
+ // Apply dark mode overrides if needed
96
+ if (this.currentMode === 'dark' && theme.darkTokens) {
97
+ tokens = this.deepMerge(tokens, theme.darkTokens);
98
+ }
99
+ // Apply global variables and scrollbar styles
100
+ if (typeof document !== 'undefined') {
101
+ this.applyGlobalTokens(tokens);
102
+ if (tokens.scrollbar) {
103
+ this.applyScrollbarStyles(tokens.scrollbar);
104
+ }
105
+ }
106
+ // Apply plugins
107
+ for (const plugin of this.plugins) {
108
+ tokens = plugin.apply(tokens);
109
+ }
110
+ return tokens;
111
+ }
112
+ applyGlobalTokens(tokens) {
113
+ const root = document.documentElement;
114
+ this.injectTokensAsVars(root, tokens);
115
+ }
116
+ injectTokensAsVars(element, tokens, prefix = '--fy-') {
117
+ Object.keys(tokens).forEach(key => {
118
+ const value = tokens[key];
119
+ if (value == null)
120
+ return;
121
+ if (typeof value === 'object' && !Array.isArray(value)) {
122
+ this.injectTokensAsVars(element, value, `${prefix}${key}-`);
123
+ }
124
+ else {
125
+ element.style.setProperty(`${prefix}${key}`, String(value));
126
+ }
127
+ });
128
+ }
129
+ deepMerge(target, source) {
130
+ const output = { ...target };
131
+ if (this.isObject(target) && this.isObject(source)) {
132
+ Object.keys(source).forEach(key => {
133
+ if (this.isObject(source[key])) {
134
+ if (!(key in target)) {
135
+ Object.assign(output, { [key]: source[key] });
136
+ }
137
+ else {
138
+ output[key] = this.deepMerge(target[key], source[key]);
139
+ }
140
+ }
141
+ else {
142
+ Object.assign(output, { [key]: source[key] });
143
+ }
144
+ });
145
+ }
146
+ return output;
147
+ }
148
+ isObject(item) {
149
+ return (item && typeof item === 'object' && !Array.isArray(item));
150
+ }
151
+ applyScrollbarStyles(s) {
152
+ const id = 'fy-scrollbar-styles';
153
+ let style = document.getElementById(id);
154
+ if (!style) {
155
+ style = document.createElement('style');
156
+ style.id = id;
157
+ document.head.appendChild(style);
158
+ }
159
+ const width = s.width || '10px';
160
+ // Build Track Background
161
+ const trackBase = s.trackBackground || 'transparent';
162
+ const trackFull = s.trackImage
163
+ ? `url(${s.trackImage}) repeat, ${trackBase}`
164
+ : trackBase;
165
+ // Build Thumb Background
166
+ const thumbBase = s.thumbBackground || '#888';
167
+ const thumbFull = s.thumbGripImage
168
+ ? `url(${s.thumbGripImage}) center no-repeat, ${thumbBase}`
169
+ : thumbBase;
170
+ const thumbHoverBase = s.thumbHoverBackground || '#555';
171
+ const thumbHoverFull = s.thumbHoverBackground || '#555';
172
+ // Horizontal Thumb (using a rotated gradient if it's a linear-gradient)
173
+ let hThumbFull = thumbFull;
174
+ let hThumbHoverFull = thumbHoverFull;
175
+ const hGrip = s.thumbGripImageHorizontal || s.thumbGripImage;
176
+ if (thumbBase.includes('to right')) {
177
+ const hBase = thumbBase.replace('to right', 'to bottom');
178
+ const hHoverBase = thumbHoverBase.replace('to right', 'to bottom');
179
+ hThumbFull = hGrip ? `url(${hGrip}) center no-repeat, ${hBase}` : hBase;
180
+ hThumbHoverFull = hGrip ? `url(${hGrip}) center no-repeat, ${hHoverBase}` : hHoverBase;
181
+ }
182
+ else if (hGrip) {
183
+ hThumbFull = `url(${hGrip}) center no-repeat, ${thumbBase}`;
184
+ hThumbHoverFull = `url(${hGrip}) center no-repeat, ${thumbHoverFull}`;
185
+ }
186
+ const radius = s.thumbBorderRadius || '10px';
187
+ const bWidth = s.thumbBorderWidth || '0px';
188
+ const bColor = s.thumbBorderColor || 'transparent';
189
+ const shadow = s.thumbBoxShadow || 'none';
190
+ // Extract solid color fallback from thumbBase if it's a gradient
191
+ const thumbFallback = thumbBase.includes('gradient') ? '#2b56a3' : thumbBase;
192
+ const hThumbFallback = hThumbFull.includes('gradient') ? '#2b56a3' : thumbFallback;
193
+ let styleContent = `
194
+ ::-webkit-scrollbar {
195
+ width: ${width} !important;
196
+ height: ${width} !important;
197
+ display: block !important;
198
+ }
199
+ ::-webkit-scrollbar-track {
200
+ background: ${trackFull} !important;
201
+ }
202
+ ::-webkit-scrollbar-thumb {
203
+ background: ${thumbFull} !important;
204
+ background-color: ${thumbFallback} !important;
205
+ border-radius: ${radius} !important;
206
+ border: ${bWidth} solid ${bColor} !important;
207
+ box-shadow: ${shadow} !important;
208
+ min-height: 20px !important;
209
+ }
210
+ ::-webkit-scrollbar-thumb:vertical {
211
+ background: ${thumbFull} !important;
212
+ background-color: ${thumbFallback} !important;
213
+ }
214
+ ::-webkit-scrollbar-thumb:horizontal {
215
+ background: ${hThumbFull} !important;
216
+ background-color: ${hThumbFallback} !important;
217
+ }
218
+ ::-webkit-scrollbar-thumb:hover {
219
+ background: ${thumbHoverFull} !important;
220
+ }
221
+ ::-webkit-scrollbar-thumb:vertical:hover {
222
+ background: ${thumbHoverFull} !important;
223
+ }
224
+ ::-webkit-scrollbar-thumb:horizontal:hover {
225
+ background: ${hThumbHoverFull} !important;
226
+ }
227
+ `;
228
+ if (s.buttonsVisible) {
229
+ const bBg = s.buttonBackground || thumbBase;
230
+ const bHoverBg = s.buttonHoverBackground || bBg;
231
+ const bActiveBg = s.buttonActiveBackground || bHoverBg;
232
+ const bRad = s.buttonBorderRadius || radius;
233
+ const upImg = s.buttonUpImage ? `url(${s.buttonUpImage})` : `url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='18 15 12 9 6 15'%3E%3C/polyline%3E%3C/svg%3E")`;
234
+ const upHoverImg = s.buttonUpHoverImage ? `url(${s.buttonUpHoverImage})` : upImg;
235
+ const upActiveImg = s.buttonUpActiveImage ? `url(${s.buttonUpActiveImage})` : upHoverImg;
236
+ const downImg = s.buttonDownImage ? `url(${s.buttonDownImage})` : `url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='4' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E")`;
237
+ const downHoverImg = s.buttonDownHoverImage ? `url(${s.buttonDownHoverImage})` : downImg;
238
+ const downActiveImg = s.buttonDownActiveImage ? `url(${s.buttonDownActiveImage})` : downHoverImg;
239
+ styleContent += `
240
+ ::-webkit-scrollbar-button:single-button {
241
+ background: ${bBg} !important;
242
+ display: block !important;
243
+ border-radius: ${bRad} !important;
244
+ border: ${bWidth} solid ${bColor} !important;
245
+ background-position: center !important;
246
+ background-repeat: no-repeat !important;
247
+ box-shadow: ${shadow} !important;
248
+ }
249
+ ::-webkit-scrollbar-button:single-button:hover {
250
+ background: ${bHoverBg} !important;
251
+ }
252
+ ::-webkit-scrollbar-button:single-button:active {
253
+ background: ${bActiveBg} !important;
254
+ }
255
+ ::-webkit-scrollbar-button:single-button:vertical:decrement {
256
+ background-image: ${upImg} !important;
257
+ }
258
+ ::-webkit-scrollbar-button:single-button:vertical:decrement:hover {
259
+ background-image: ${upHoverImg} !important;
260
+ }
261
+ ::-webkit-scrollbar-button:single-button:vertical:decrement:active {
262
+ background-image: ${upActiveImg} !important;
263
+ }
264
+ ::-webkit-scrollbar-button:single-button:vertical:increment {
265
+ background-image: ${downImg} !important;
266
+ }
267
+ ::-webkit-scrollbar-button:single-button:vertical:increment:hover {
268
+ background-image: ${downHoverImg} !important;
269
+ }
270
+ ::-webkit-scrollbar-button:single-button:vertical:increment:active {
271
+ background-image: ${downActiveImg} !important;
272
+ }
273
+ `;
274
+ }
275
+ style.innerHTML = styleContent;
276
+ }
277
+ }
278
+ export const themeEngine = new ThemeEngine();
279
+ export class ConfigOverridePlugin {
280
+ constructor() {
281
+ this.name = 'ConfigOverride';
282
+ }
283
+ apply(tokens) {
284
+ const config = globalThis.configManager?.getConfig();
285
+ const overrides = config?.theme?.tokenOverrides;
286
+ if (!overrides) {
287
+ return tokens;
288
+ }
289
+ return themeEngine.deepMerge(tokens, overrides);
290
+ }
291
+ }
@@ -0,0 +1,2 @@
1
+ import { ThemeDefinition } from '@fylib/core';
2
+ export declare const fineyHub1Theme: ThemeDefinition;
@@ -0,0 +1,352 @@
1
+ export const fineyHub1Theme = {
2
+ name: 'finey-hub-1',
3
+ backgroundEffect: {
4
+ name: 'dots',
5
+ intensity: 30,
6
+ speed: 0.5,
7
+ loop: true
8
+ },
9
+ wallpaper: {
10
+ name: 'dots',
11
+ type: 'pattern',
12
+ opacity: 0.05
13
+ },
14
+ tokens: {
15
+ colors: {
16
+ primary: '#0969da', // GitHub Blue
17
+ secondary: '#656d76',
18
+ success: '#1a7f37',
19
+ danger: '#d1242f',
20
+ warning: '#9a6700',
21
+ info: '#0969da',
22
+ white: '#ffffff',
23
+ black: '#1f2328',
24
+ background: '#ffffff',
25
+ text: '#1f2328',
26
+ 'primary-rgb': '9,105,218',
27
+ surface: '#f6f8fa',
28
+ border: '#d0d7de'
29
+ },
30
+ spacing: {
31
+ xs: '4px',
32
+ sm: '8px',
33
+ md: '16px',
34
+ lg: '24px',
35
+ xl: '32px',
36
+ },
37
+ borderRadius: {
38
+ sm: '6px',
39
+ md: '6px',
40
+ lg: '12px',
41
+ full: '9999px',
42
+ },
43
+ typography: {
44
+ fontFamily: {
45
+ base: '-apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"',
46
+ heading: '-apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"',
47
+ mono: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace'
48
+ },
49
+ fontSize: {
50
+ sm: '12px',
51
+ md: '14px',
52
+ lg: '16px',
53
+ },
54
+ fontWeight: {
55
+ normal: '400',
56
+ bold: '600',
57
+ }
58
+ },
59
+ layout: {
60
+ app: {
61
+ gap: '0'
62
+ },
63
+ header: {
64
+ height: '64px',
65
+ padding: '0 24px',
66
+ shadow: '0 1px 0 rgba(31,35,40,0.04)',
67
+ toggle: {
68
+ background: 'transparent',
69
+ textColor: '#1f2328',
70
+ borderColor: '#d0d7de',
71
+ borderRadius: '6px',
72
+ icon: 'list' // 8-bit feel
73
+ }
74
+ },
75
+ sidebar: {
76
+ width: '260px',
77
+ padding: '16px 0',
78
+ toggle: {
79
+ background: '#f6f8fa',
80
+ textColor: '#1f2328',
81
+ borderColor: '#d0d7de',
82
+ borderRadius: '6px',
83
+ icon: 'list',
84
+ mode: 'floating',
85
+ tonguePosition: 'bottom'
86
+ }
87
+ },
88
+ content: {
89
+ padding: '24px'
90
+ }
91
+ },
92
+ effects: {
93
+ button: {
94
+ background: '#f6f8fa',
95
+ borderColor: '#d0d7de',
96
+ shadow: '0 1px 0 rgba(31,35,40,0.04)',
97
+ textColor: '#1f2328'
98
+ },
99
+ window: {
100
+ background: '#ffffff',
101
+ shadow: '0 8px 24px rgba(149,157,165,0.2)',
102
+ borderColor: '#d0d7de'
103
+ },
104
+ modal: {
105
+ background: '#ffffff',
106
+ borderColor: '#d0d7de',
107
+ shadow: '0 8px 24px rgba(140,149,159,0.2)',
108
+ overlayColor: 'rgba(31,35,40,0.5)',
109
+ borderWidth: '1px',
110
+ borderRadius: '12px',
111
+ dividerColor: '#d0d7de'
112
+ },
113
+ input: {
114
+ background: '#ffffff',
115
+ borderColor: '#d0d7de',
116
+ shadow: 'inset 0 1px 0 rgba(31,35,40,0.02)',
117
+ placeholderColor: '#6e7781',
118
+ borderWidth: '1px',
119
+ borderRadius: '6px',
120
+ icons: {
121
+ mode: 'inside',
122
+ name: 'magnifying-glass',
123
+ position: 'left',
124
+ outsideGap: '8px',
125
+ color: '#656d76'
126
+ }
127
+ },
128
+ card: {
129
+ background: '#ffffff',
130
+ borderColor: '#d0d7de',
131
+ shadow: 'none',
132
+ dividerColor: '#d0d7de'
133
+ },
134
+ select: {
135
+ background: '#ffffff',
136
+ borderColor: '#d0d7de',
137
+ shadow: '0 1px 0 rgba(31,35,40,0.04)',
138
+ borderWidth: '1px',
139
+ borderRadius: '6px'
140
+ },
141
+ table: {
142
+ background: '#ffffff',
143
+ borderColor: '#d0d7de',
144
+ headerBackground: '#f6f8fa',
145
+ rowHoverBackground: '#f6f8fa',
146
+ stripedBackground: '#f6f8fa',
147
+ textColor: '#1f2328',
148
+ headerTextColor: '#656d76'
149
+ },
150
+ accordion: {
151
+ background: '#ffffff',
152
+ borderColor: '#d0d7de',
153
+ shadow: 'none',
154
+ dividerColor: '#d0d7de',
155
+ borderRadius: '6px',
156
+ headerBackground: 'transparent'
157
+ },
158
+ badge: {
159
+ background: '#eff1f3',
160
+ textColor: '#1f2328',
161
+ borderRadius: '999px',
162
+ animation: 'none'
163
+ },
164
+ toast: {
165
+ background: '#ffffff',
166
+ borderColor: '#d0d7de',
167
+ textColor: '#1f2328',
168
+ shadow: '0 8px 24px rgba(140,149,159,0.2)',
169
+ borderRadius: '6px'
170
+ },
171
+ notificationMenu: {
172
+ button: {
173
+ background: 'transparent',
174
+ textColor: '#1f2328',
175
+ icon: 'bell',
176
+ badgeBackground: '#cf222e',
177
+ badgeTextColor: '#ffffff'
178
+ },
179
+ dropdown: {
180
+ background: '#ffffff',
181
+ borderColor: '#d0d7de',
182
+ shadow: '0 8px 24px rgba(140,149,159,0.2)',
183
+ width: '320px',
184
+ maxHeight: '400px',
185
+ borderRadius: '6px'
186
+ },
187
+ item: {
188
+ background: 'transparent',
189
+ hoverBackground: '#f6f8fa',
190
+ textColor: '#1f2328',
191
+ descriptionColor: '#656d76',
192
+ dividerColor: '#d0d7de',
193
+ unreadIndicator: '#0969da'
194
+ },
195
+ config: {
196
+ showAll: false,
197
+ limit: 5,
198
+ allowClear: true,
199
+ accordionMode: true,
200
+ showViewAll: true,
201
+ viewAllPosition: 'footer-right'
202
+ }
203
+ }
204
+ }
205
+ },
206
+ darkTokens: {
207
+ colors: {
208
+ primary: '#2f81f7',
209
+ secondary: '#7d8590',
210
+ success: '#238636',
211
+ danger: '#f85149',
212
+ warning: '#d29922',
213
+ info: '#2f81f7',
214
+ white: '#f0f6fc',
215
+ black: '#010409',
216
+ background: '#0d1117',
217
+ text: '#e6edf3',
218
+ 'primary-rgb': '47,129,247',
219
+ surface: '#161b22',
220
+ border: '#30363d'
221
+ },
222
+ layout: {
223
+ header: {
224
+ shadow: '0 1px 0 rgba(1,4,9,0.85)',
225
+ toggle: {
226
+ textColor: '#e6edf3',
227
+ borderColor: '#30363d'
228
+ }
229
+ },
230
+ sidebar: {
231
+ toggle: {
232
+ background: '#161b22',
233
+ textColor: '#e6edf3',
234
+ borderColor: '#30363d'
235
+ }
236
+ }
237
+ },
238
+ effects: {
239
+ button: {
240
+ background: '#21262d',
241
+ borderColor: '#30363d',
242
+ shadow: '0 1px 0 rgba(1,4,9,0.04)',
243
+ textColor: '#c9d1d9'
244
+ },
245
+ window: {
246
+ background: '#0d1117',
247
+ shadow: '0 8px 24px rgba(1,4,9,0.5)',
248
+ borderColor: '#30363d'
249
+ },
250
+ modal: {
251
+ background: '#161b22',
252
+ borderColor: '#30363d',
253
+ shadow: '0 8px 24px rgba(1,4,9,0.5)',
254
+ overlayColor: 'rgba(1,4,9,0.8)',
255
+ dividerColor: '#30363d'
256
+ },
257
+ input: {
258
+ background: '#0d1117',
259
+ borderColor: '#30363d',
260
+ shadow: 'none',
261
+ placeholderColor: '#484f58',
262
+ icons: {
263
+ color: '#7d8590'
264
+ }
265
+ },
266
+ select: {
267
+ background: '#161b22',
268
+ borderColor: '#30363d',
269
+ shadow: '0 8px 24px rgba(1,4,9,0.5)',
270
+ borderWidth: '1px',
271
+ borderRadius: '6px'
272
+ },
273
+ table: {
274
+ background: '#0d1117',
275
+ borderColor: '#30363d',
276
+ headerBackground: '#161b22',
277
+ rowHoverBackground: '#161b22',
278
+ stripedBackground: '#161b22',
279
+ textColor: '#e6edf3',
280
+ headerTextColor: '#7d8590'
281
+ },
282
+ card: {
283
+ background: '#0d1117',
284
+ borderColor: '#30363d',
285
+ dividerColor: '#30363d'
286
+ },
287
+ accordion: {
288
+ background: '#0d1117',
289
+ borderColor: '#30363d',
290
+ shadow: 'none',
291
+ dividerColor: '#30363d',
292
+ borderRadius: '6px',
293
+ headerBackground: 'transparent'
294
+ },
295
+ badge: {
296
+ background: '#21262d',
297
+ textColor: '#c9d1d9'
298
+ },
299
+ toast: {
300
+ background: '#161b22',
301
+ borderColor: '#30363d',
302
+ textColor: '#e6edf3',
303
+ shadow: '0 8px 24px rgba(1,4,9,0.5)',
304
+ borderRadius: '6px'
305
+ },
306
+ notificationMenu: {
307
+ button: {
308
+ background: 'transparent',
309
+ textColor: '#e6edf3',
310
+ icon: 'bell',
311
+ badgeBackground: '#f85149',
312
+ badgeTextColor: '#f0f6fc'
313
+ },
314
+ dropdown: {
315
+ background: '#161b22',
316
+ borderColor: '#30363d',
317
+ shadow: '0 8px 24px rgba(1,4,9,0.5)',
318
+ width: '320px',
319
+ maxHeight: '400px',
320
+ borderRadius: '6px'
321
+ },
322
+ item: {
323
+ background: 'transparent',
324
+ hoverBackground: '#161b22',
325
+ textColor: '#e6edf3',
326
+ descriptionColor: '#7d8590',
327
+ dividerColor: '#30363d',
328
+ unreadIndicator: '#2f81f7'
329
+ },
330
+ config: {
331
+ showAll: false,
332
+ limit: 5,
333
+ allowClear: true,
334
+ accordionMode: true,
335
+ showViewAll: true,
336
+ viewAllPosition: 'footer-right'
337
+ }
338
+ }
339
+ }
340
+ },
341
+ componentAnimations: {
342
+ 'fy-button': {
343
+ hover: 'button-hover-lift'
344
+ },
345
+ 'fy-card': {
346
+ enter: 'card-fade-in'
347
+ },
348
+ 'fy-layout': {
349
+ enter: 'layout-fade-in'
350
+ }
351
+ }
352
+ };
@@ -0,0 +1,2 @@
1
+ import { ThemeDefinition } from '@fylib/core';
2
+ export declare const fineyNexus1Theme: ThemeDefinition;