lapikit 0.0.0-insiders.f0512a6 → 0.0.0-insiders.f325e60
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/bin/configuration.js +7 -3
- package/bin/presets.js +1 -0
- package/dist/actions/index.d.ts +0 -1
- package/dist/actions/index.js +0 -1
- package/dist/colors.css +0 -0
- package/dist/components/accordion/accordion.svelte +118 -0
- package/dist/components/alert/alert.svelte +122 -0
- package/dist/components/app/app.svelte +18 -0
- package/dist/components/appbar/appbar.css +4 -4
- package/dist/components/appbar/appbar.svelte +45 -0
- package/dist/components/aspect-ratio/aspect-ratio.svelte +23 -4
- package/dist/components/avatar/avatar.svelte +114 -0
- package/dist/components/button/button.css +14 -14
- package/dist/components/button/button.svelte +230 -0
- package/dist/components/card/card.css +4 -4
- package/dist/components/card/card.svelte +108 -0
- package/dist/components/chip/chip.css +9 -9
- package/dist/components/chip/chip.svelte +211 -0
- package/dist/components/dialog/dialog.svelte +144 -0
- package/dist/components/dropdown/dropdown.svelte +24 -0
- package/dist/components/icon/icon.css +5 -3
- package/dist/components/icon/icon.svelte +89 -0
- package/dist/components/list/list.css +8 -8
- package/dist/components/list/list.svelte +199 -0
- package/dist/components/list/modules/list-item.svelte +199 -0
- package/dist/components/modal/modal.svelte +135 -0
- package/dist/components/popover/popover.svelte +24 -0
- package/dist/components/separator/separator.svelte +48 -0
- package/dist/components/spacer/spacer.svelte +5 -0
- package/dist/components/textfield/textfield.css +8 -8
- package/dist/components/textfield/textfield.svelte +270 -0
- package/dist/components/toolbar/toolbar.css +9 -9
- package/dist/components/toolbar/toolbar.svelte +135 -0
- package/dist/components/tooltip/tooltip.svelte +127 -0
- package/dist/internal/config/presets.d.ts +125 -0
- package/dist/internal/config/presets.js +138 -0
- package/dist/internal/config/variables.d.ts +6 -0
- package/dist/internal/config/variables.js +6 -0
- package/dist/internal/core/formatter/component.d.ts +5 -0
- package/dist/internal/core/formatter/component.js +63 -0
- package/dist/internal/core/formatter/device.d.ts +5 -0
- package/dist/internal/core/formatter/device.js +65 -0
- package/dist/internal/core/formatter/index.d.ts +7 -0
- package/dist/internal/core/formatter/index.js +35 -0
- package/dist/internal/core/formatter/style.d.ts +4 -0
- package/dist/internal/core/formatter/style.js +15 -0
- package/dist/internal/core/formatter/theme.d.ts +5 -0
- package/dist/internal/core/formatter/theme.js +28 -0
- package/dist/internal/core/formatter/typography.d.ts +5 -0
- package/dist/internal/core/formatter/typography.js +12 -0
- package/dist/internal/helpers/parser.d.ts +10 -0
- package/dist/internal/helpers/parser.js +92 -0
- package/dist/internal/plugins/vite.d.ts +8 -0
- package/dist/internal/plugins/vite.js +31 -0
- package/dist/internal/ripple.js +3 -3
- package/dist/internal/types/configuration.d.ts +40 -0
- package/dist/internal/types/configuration.js +1 -0
- package/dist/internal/types/index.d.ts +1 -0
- package/dist/internal/types/index.js +1 -0
- package/dist/labs/index.d.ts +4 -0
- package/dist/labs/index.js +5 -0
- package/dist/labs/my-component-style-global.svelte +6 -0
- package/dist/labs/my-component-style-global.svelte.d.ts +18 -0
- package/dist/labs/my-component-style-import.svelte +15 -0
- package/dist/labs/my-component-style-import.svelte.d.ts +18 -0
- package/dist/labs/my-component-style-mixed.svelte +23 -0
- package/dist/labs/my-component-style-mixed.svelte.d.ts +18 -0
- package/dist/labs/my-component.svelte +16 -0
- package/dist/labs/my-component.svelte.d.ts +18 -0
- package/dist/labs/style-mixed.css +7 -0
- package/dist/labs/style.css +7 -0
- package/dist/labs.css +1 -0
- package/dist/plugin/css.d.ts +1 -0
- package/dist/plugin/css.js +73 -0
- package/dist/plugin/preset-v2.d.ts +108 -0
- package/dist/plugin/preset-v2.js +126 -0
- package/dist/plugin/vitejs.d.ts +1 -2
- package/dist/plugin/vitejs.js +31 -7
- package/dist/styles/animation.css +33 -0
- package/dist/styles/keyframes.css +30 -0
- package/dist/styles/reset.css +131 -0
- package/package.json +10 -2
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
export declare const preset: {
|
|
2
|
+
breakpoints: {
|
|
3
|
+
devices: {
|
|
4
|
+
desktop: number;
|
|
5
|
+
tablet: number;
|
|
6
|
+
mobile: number;
|
|
7
|
+
};
|
|
8
|
+
thresholds: {
|
|
9
|
+
base: number;
|
|
10
|
+
xs: number;
|
|
11
|
+
sm: number;
|
|
12
|
+
md: number;
|
|
13
|
+
lg: number;
|
|
14
|
+
xl: number;
|
|
15
|
+
'2xl': number;
|
|
16
|
+
'3xl': number;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
theme: {
|
|
20
|
+
defaultTheme: string;
|
|
21
|
+
themes: {
|
|
22
|
+
light: {
|
|
23
|
+
dark: boolean;
|
|
24
|
+
colors: {
|
|
25
|
+
blue: string;
|
|
26
|
+
green: string;
|
|
27
|
+
red: string;
|
|
28
|
+
yellow: string;
|
|
29
|
+
orange: string;
|
|
30
|
+
purple: string;
|
|
31
|
+
pink: string;
|
|
32
|
+
indigo: string;
|
|
33
|
+
cyan: string;
|
|
34
|
+
gray: string;
|
|
35
|
+
'gray-2': string;
|
|
36
|
+
'gray-3': string;
|
|
37
|
+
'gray-4': string;
|
|
38
|
+
'gray-5': string;
|
|
39
|
+
'gray-6': string;
|
|
40
|
+
background: string;
|
|
41
|
+
'secondary-background': string;
|
|
42
|
+
'tertiary-background': string;
|
|
43
|
+
label: string;
|
|
44
|
+
'secondary-label': string;
|
|
45
|
+
};
|
|
46
|
+
variables: {
|
|
47
|
+
info: string;
|
|
48
|
+
success: string;
|
|
49
|
+
error: string;
|
|
50
|
+
warning: string;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
dark: {
|
|
54
|
+
dark: boolean;
|
|
55
|
+
colors: {
|
|
56
|
+
blue: string;
|
|
57
|
+
green: string;
|
|
58
|
+
red: string;
|
|
59
|
+
yellow: string;
|
|
60
|
+
orange: string;
|
|
61
|
+
purple: string;
|
|
62
|
+
pink: string;
|
|
63
|
+
indigo: string;
|
|
64
|
+
cyan: string;
|
|
65
|
+
gray: string;
|
|
66
|
+
'gray-2': string;
|
|
67
|
+
'gray-3': string;
|
|
68
|
+
'gray-4': string;
|
|
69
|
+
'gray-5': string;
|
|
70
|
+
'gray-6': string;
|
|
71
|
+
background: string;
|
|
72
|
+
'secondary-background': string;
|
|
73
|
+
'tertiary-background': string;
|
|
74
|
+
label: string;
|
|
75
|
+
'secondary-label': string;
|
|
76
|
+
};
|
|
77
|
+
variables: {
|
|
78
|
+
info: string;
|
|
79
|
+
success: string;
|
|
80
|
+
error: string;
|
|
81
|
+
warning: string;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
typography: {
|
|
87
|
+
defaultTypography: string;
|
|
88
|
+
fonts: {
|
|
89
|
+
default: {
|
|
90
|
+
sans: string[];
|
|
91
|
+
mono: string[];
|
|
92
|
+
serif: string[];
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
styles: {
|
|
97
|
+
spacing: string;
|
|
98
|
+
shape: {
|
|
99
|
+
sm: string;
|
|
100
|
+
md: string;
|
|
101
|
+
lg: string;
|
|
102
|
+
xl: string;
|
|
103
|
+
'2xl': string;
|
|
104
|
+
'3xl': string;
|
|
105
|
+
full: string;
|
|
106
|
+
};
|
|
107
|
+
dialog: {
|
|
108
|
+
xs: string;
|
|
109
|
+
sm: string;
|
|
110
|
+
md: string;
|
|
111
|
+
lg: string;
|
|
112
|
+
xl: string;
|
|
113
|
+
};
|
|
114
|
+
modal: {
|
|
115
|
+
xs: string;
|
|
116
|
+
sm: string;
|
|
117
|
+
md: string;
|
|
118
|
+
lg: string;
|
|
119
|
+
xl: string;
|
|
120
|
+
};
|
|
121
|
+
animation: {
|
|
122
|
+
'ripple-duration': string;
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
};
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { variables } from './variables.js';
|
|
2
|
+
export const preset = {
|
|
3
|
+
breakpoints: {
|
|
4
|
+
devices: {
|
|
5
|
+
desktop: 1024, //64rem (lg)
|
|
6
|
+
tablet: 768, //48rem (md)
|
|
7
|
+
mobile: 375 //28rem (sm)
|
|
8
|
+
},
|
|
9
|
+
thresholds: {
|
|
10
|
+
base: 0, // 0px
|
|
11
|
+
xs: 448, //28rem
|
|
12
|
+
sm: 640, //40rem
|
|
13
|
+
md: 768, //48rem
|
|
14
|
+
lg: 1024, //64rem
|
|
15
|
+
xl: 1280, //80rem
|
|
16
|
+
'2xl': 1536, //96rem
|
|
17
|
+
'3xl': 1792 //112rem
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
theme: {
|
|
21
|
+
defaultTheme: 'light',
|
|
22
|
+
themes: {
|
|
23
|
+
light: {
|
|
24
|
+
dark: false,
|
|
25
|
+
colors: {
|
|
26
|
+
blue: '#007AFF',
|
|
27
|
+
green: '#34C759',
|
|
28
|
+
red: '#FF3B30',
|
|
29
|
+
yellow: '#FFCC00',
|
|
30
|
+
orange: '#FF9500',
|
|
31
|
+
purple: '#AF52DE',
|
|
32
|
+
pink: '#FF2D55',
|
|
33
|
+
indigo: '#5856D6',
|
|
34
|
+
cyan: '#5AC8FA',
|
|
35
|
+
gray: '#8E8E93',
|
|
36
|
+
'gray-2': '#AEAEB2',
|
|
37
|
+
'gray-3': '#C7C7CC',
|
|
38
|
+
'gray-4': '#D1D1D6',
|
|
39
|
+
'gray-5': '#E5E5EA',
|
|
40
|
+
'gray-6': '#F2F2F7',
|
|
41
|
+
background: '#FFFFFF',
|
|
42
|
+
'secondary-background': '#F2F2F7',
|
|
43
|
+
'tertiary-background': '#EFEFF4',
|
|
44
|
+
label: '#000000',
|
|
45
|
+
'secondary-label': 'rgba(60,60,67,0.6)'
|
|
46
|
+
},
|
|
47
|
+
variables: variables
|
|
48
|
+
},
|
|
49
|
+
dark: {
|
|
50
|
+
dark: true,
|
|
51
|
+
colors: {
|
|
52
|
+
blue: '#0A84FF',
|
|
53
|
+
green: '#30D158',
|
|
54
|
+
red: '#FF453A',
|
|
55
|
+
yellow: '#FFD60A',
|
|
56
|
+
orange: '#FF9F0A',
|
|
57
|
+
purple: '#BF5AF2',
|
|
58
|
+
pink: '#FF375F',
|
|
59
|
+
indigo: '#5E5CE6',
|
|
60
|
+
cyan: '#64D2FF',
|
|
61
|
+
gray: '#8E8E93',
|
|
62
|
+
'gray-2': '#636366',
|
|
63
|
+
'gray-3': '#48484A',
|
|
64
|
+
'gray-4': '#3A3A3C',
|
|
65
|
+
'gray-5': '#2C2C2E',
|
|
66
|
+
'gray-6': '#1C1C1E',
|
|
67
|
+
background: '#000000',
|
|
68
|
+
'secondary-background': '#1C1C1E',
|
|
69
|
+
'tertiary-background': '#2C2C2E',
|
|
70
|
+
label: '#FFFFFF',
|
|
71
|
+
'secondary-label': 'rgba(235,235,245,0.6)'
|
|
72
|
+
},
|
|
73
|
+
variables: variables
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
typography: {
|
|
78
|
+
defaultTypography: 'default',
|
|
79
|
+
fonts: {
|
|
80
|
+
default: {
|
|
81
|
+
sans: [
|
|
82
|
+
'system-ui',
|
|
83
|
+
'-apple-system',
|
|
84
|
+
'BlinkMacSystemFont',
|
|
85
|
+
'Segoe UI',
|
|
86
|
+
'Roboto',
|
|
87
|
+
'Helvetica Neue',
|
|
88
|
+
'Arial',
|
|
89
|
+
'sans-serif',
|
|
90
|
+
'Apple Color Emoji',
|
|
91
|
+
'Segoe UI Emoji',
|
|
92
|
+
'Segoe UI Symbol'
|
|
93
|
+
],
|
|
94
|
+
mono: [
|
|
95
|
+
'SFMono-Regular',
|
|
96
|
+
'ui-monospace',
|
|
97
|
+
'SF Mono',
|
|
98
|
+
'Menlo',
|
|
99
|
+
'Monaco',
|
|
100
|
+
'Consolas',
|
|
101
|
+
'Liberation Mono',
|
|
102
|
+
'Courier New',
|
|
103
|
+
'monospace'
|
|
104
|
+
],
|
|
105
|
+
serif: ['Merriweather', 'Georgia', 'Cambria', 'Times New Roman', 'Times', 'serif']
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
styles: {
|
|
110
|
+
spacing: '0.125rem', // 2px
|
|
111
|
+
shape: {
|
|
112
|
+
sm: '0.125rem', // 2px
|
|
113
|
+
md: '0.25rem', // 4px
|
|
114
|
+
lg: '0.5rem', // 8px
|
|
115
|
+
xl: '0.75rem', // 12px
|
|
116
|
+
'2xl': '1rem', // 16px
|
|
117
|
+
'3xl': '1.5rem', // 24px
|
|
118
|
+
full: '9999px' // 9999px
|
|
119
|
+
},
|
|
120
|
+
dialog: {
|
|
121
|
+
xs: '18.75rem', // 300px
|
|
122
|
+
sm: '25rem', // 400px
|
|
123
|
+
md: '37.5rem', // 600px
|
|
124
|
+
lg: '53.125rem', // 850px
|
|
125
|
+
xl: '75rem' // 1200px
|
|
126
|
+
},
|
|
127
|
+
modal: {
|
|
128
|
+
xs: '18.75rem', // 300px
|
|
129
|
+
sm: '25rem', // 400px
|
|
130
|
+
md: '37.5rem', // 600px
|
|
131
|
+
lg: '53.125rem', // 850px
|
|
132
|
+
xl: '75rem' // 1200px
|
|
133
|
+
},
|
|
134
|
+
animation: {
|
|
135
|
+
'ripple-duration': '0.4s'
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { fileURLToPath } from 'url';
|
|
2
|
+
import { dirname } from 'path';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { parserCSSBreakpoints } from '../../helpers/parser.js';
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = dirname(__filename);
|
|
8
|
+
export async function componentFormatter({ breakpoints }) {
|
|
9
|
+
// load svelte component files (includes on components folders)
|
|
10
|
+
function loadSvelteFiles(directory) {
|
|
11
|
+
fs.readdirSync(directory).forEach((File) => {
|
|
12
|
+
const absolutePath = path.join(directory, File);
|
|
13
|
+
if (fs.statSync(absolutePath).isDirectory())
|
|
14
|
+
return loadSvelteFiles(absolutePath);
|
|
15
|
+
else if (absolutePath.endsWith('.svelte') && !absolutePath.includes('/_')) {
|
|
16
|
+
console.log(absolutePath);
|
|
17
|
+
const fileContent = fs.readFileSync(absolutePath, 'utf8');
|
|
18
|
+
const styleRegex = /<style[^>]*>([\s\S]*?)<\/style>/gi;
|
|
19
|
+
const styleMatch = styleRegex.exec(fileContent);
|
|
20
|
+
if (styleMatch) {
|
|
21
|
+
const originalStyleContent = styleMatch[1];
|
|
22
|
+
const content = parserCSSBreakpoints(originalStyleContent);
|
|
23
|
+
let css = '';
|
|
24
|
+
for (const property in breakpoints) {
|
|
25
|
+
if (property !== 'base') {
|
|
26
|
+
const name = `.${/^\d/.test(property) ? `\\3${property}` : property}\\:`;
|
|
27
|
+
const value = typeof breakpoints[property] === 'number'
|
|
28
|
+
? `${breakpoints[property]}px`
|
|
29
|
+
: breakpoints[property];
|
|
30
|
+
if (content.base !== '' || content.minmax !== '' || content.min !== '') {
|
|
31
|
+
css += `@media screen and (min-width: ${value}) {\n`;
|
|
32
|
+
if (content.base !== '')
|
|
33
|
+
css += content.base.replaceAll('[breakpoint]', name);
|
|
34
|
+
if (content.minmax !== '')
|
|
35
|
+
css += content.minmax.replaceAll('[breakpoint]', name);
|
|
36
|
+
if (content.min !== '')
|
|
37
|
+
css += content.min.replaceAll('[breakpoint]', name);
|
|
38
|
+
css += `}\n`;
|
|
39
|
+
}
|
|
40
|
+
if (content.max !== '' || content.all !== '') {
|
|
41
|
+
css += `@media screen and (max-width: ${value}) {\n`;
|
|
42
|
+
if (content.max !== '')
|
|
43
|
+
css += content.max.replaceAll('[breakpoint]', name);
|
|
44
|
+
if (content.all !== '')
|
|
45
|
+
css += content.all.replaceAll('[breakpoint]', name);
|
|
46
|
+
css += `}\n`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
css += content.all.replaceAll('[breakpoint]', '.');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
let formattedCSS = css;
|
|
54
|
+
formattedCSS = formattedCSS.trim().replace(/\n{3,}/g, '\n\n');
|
|
55
|
+
console.log(formattedCSS);
|
|
56
|
+
const updatedFileContent = fileContent.replace(styleRegex, `<style>${formattedCSS}</style>`);
|
|
57
|
+
fs.writeFileSync(absolutePath, updatedFileContent, 'utf8');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
loadSvelteFiles(path.resolve(__dirname, '../../../components'));
|
|
63
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { parserValues } from '../../helpers/parser.js';
|
|
2
|
+
export async function devicesFormatter({ devices }) {
|
|
3
|
+
let css = ``;
|
|
4
|
+
const sortedDevices = Object.entries(devices).sort(([, a], [, b]) => {
|
|
5
|
+
const valueA = typeof a === 'string' ? parseInt(a) : a;
|
|
6
|
+
const valueB = typeof b === 'string' ? parseInt(b) : b;
|
|
7
|
+
return valueB - valueA;
|
|
8
|
+
});
|
|
9
|
+
sortedDevices.forEach(([deviceName, breakpoint], index) => {
|
|
10
|
+
const value = parserValues(breakpoint);
|
|
11
|
+
css += `.${deviceName} {\n`;
|
|
12
|
+
css += ` display: none;\n`;
|
|
13
|
+
css += `}\n\n`;
|
|
14
|
+
if (index === 0) {
|
|
15
|
+
css += `@media (min-width: ${value}) {\n`;
|
|
16
|
+
css += ` .${deviceName} {\n`;
|
|
17
|
+
css += ` display: block;\n`;
|
|
18
|
+
css += ` }\n`;
|
|
19
|
+
css += `}\n\n`;
|
|
20
|
+
}
|
|
21
|
+
else if (index === sortedDevices.length - 1) {
|
|
22
|
+
css += `@media (max-width: ${value}) {\n`;
|
|
23
|
+
css += ` .${deviceName} {\n`;
|
|
24
|
+
css += ` display: block;\n`;
|
|
25
|
+
css += ` }\n`;
|
|
26
|
+
css += `}\n\n`;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
const nextDevice = sortedDevices[index + 1];
|
|
30
|
+
const nextValue = parserValues(nextDevice[1]);
|
|
31
|
+
css += `@media (min-width: ${nextValue}) and (max-width: ${value}) {\n`;
|
|
32
|
+
css += ` .${deviceName} {\n`;
|
|
33
|
+
css += ` display: block;\n`;
|
|
34
|
+
css += ` }\n`;
|
|
35
|
+
css += `}\n\n`;
|
|
36
|
+
}
|
|
37
|
+
css += `.hide-${deviceName} {\n`;
|
|
38
|
+
css += ` display: block;\n`;
|
|
39
|
+
css += `}\n\n`;
|
|
40
|
+
if (index === 0) {
|
|
41
|
+
css += `@media (min-width: ${value}) {\n`;
|
|
42
|
+
css += ` .hide-${deviceName} {\n`;
|
|
43
|
+
css += ` display: none;\n`;
|
|
44
|
+
css += ` }\n`;
|
|
45
|
+
css += `}\n\n`;
|
|
46
|
+
}
|
|
47
|
+
else if (index === sortedDevices.length - 1) {
|
|
48
|
+
css += `@media (max-width: ${value}) {\n`;
|
|
49
|
+
css += ` .hide-${deviceName} {\n`;
|
|
50
|
+
css += ` display: none;\n`;
|
|
51
|
+
css += ` }\n`;
|
|
52
|
+
css += `}\n\n`;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
const nextDevice = sortedDevices[index + 1];
|
|
56
|
+
const nextValue = parserValues(nextDevice[1]);
|
|
57
|
+
css += `@media (min-width: ${nextValue}) and (max-width: ${value}) {\n`;
|
|
58
|
+
css += ` .hide-${deviceName} {\n`;
|
|
59
|
+
css += ` display: none;\n`;
|
|
60
|
+
css += ` }\n`;
|
|
61
|
+
css += `}\n\n`;
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
return css.trim();
|
|
65
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { preset } from '../../config/presets.js';
|
|
2
|
+
import { deepMerge } from '../../deepMerge.js';
|
|
3
|
+
import { componentFormatter } from './component.js';
|
|
4
|
+
import { devicesFormatter } from './device.js';
|
|
5
|
+
import { stylesFormatter } from './style.js';
|
|
6
|
+
import { themesFormatter } from './theme.js';
|
|
7
|
+
import { typographyFormatter } from './typography.js';
|
|
8
|
+
export async function css(config) {
|
|
9
|
+
// states
|
|
10
|
+
const defaultTheme = config?.theme?.defaultTheme || preset.theme.defaultTheme;
|
|
11
|
+
const defaultTypography = config?.typography?.defaultTypography || preset.typography.defaultTypography;
|
|
12
|
+
// formatter
|
|
13
|
+
const themes = await themesFormatter({
|
|
14
|
+
themes: deepMerge(preset.theme.themes, config?.theme?.themes || {}),
|
|
15
|
+
defaultTheme
|
|
16
|
+
});
|
|
17
|
+
const typography = await typographyFormatter({
|
|
18
|
+
typography: deepMerge(preset.typography.fonts, config?.typography?.fonts || {}),
|
|
19
|
+
defaultTypography
|
|
20
|
+
});
|
|
21
|
+
const styles = await stylesFormatter({ styles: deepMerge(preset.styles, config?.styles || {}) });
|
|
22
|
+
const devices = await devicesFormatter({
|
|
23
|
+
devices: deepMerge(preset.breakpoints.devices, config?.breakpoints?.devices || {})
|
|
24
|
+
});
|
|
25
|
+
// components
|
|
26
|
+
await componentFormatter({
|
|
27
|
+
breakpoints: deepMerge(preset.breakpoints.thresholds, config?.breakpoints?.thresholds || {})
|
|
28
|
+
});
|
|
29
|
+
return {
|
|
30
|
+
themes: themes,
|
|
31
|
+
typography: typography,
|
|
32
|
+
styles: styles,
|
|
33
|
+
devices: devices
|
|
34
|
+
};
|
|
35
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { parserValues } from '../../helpers/parser.js';
|
|
2
|
+
export async function stylesFormatter({ styles }) {
|
|
3
|
+
let css = `:root {\n`;
|
|
4
|
+
for (const [name, values] of Object.entries(styles)) {
|
|
5
|
+
if (values && typeof values === 'object') {
|
|
6
|
+
for (const [styleName, styleValue] of Object.entries(values || {})) {
|
|
7
|
+
css += ` --system-${name}-${styleName}: ${parserValues(styleValue)};\n`;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
css += ` --system-${name}: ${parserValues(values)};\n`;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return (css += '}\n');
|
|
15
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { preset } from '../../config/presets.js';
|
|
2
|
+
import { deepMerge } from '../../deepMerge.js';
|
|
3
|
+
import { parserValues } from '../../helpers/parser.js';
|
|
4
|
+
export async function themesFormatter({ themes, defaultTheme = 'light' }) {
|
|
5
|
+
let css = '';
|
|
6
|
+
for (const [name, values] of Object.entries(themes)) {
|
|
7
|
+
const ref = values?.dark ? preset.theme.themes.dark : preset.theme.themes.light;
|
|
8
|
+
let cssTheme = defaultTheme === name ? `:root,\n.l-theme-${name} {\n` : `.l-theme-${name} {\n`;
|
|
9
|
+
// colors
|
|
10
|
+
cssTheme += ` color-scheme: ${values?.dark ? 'dark' : 'light'};\n`;
|
|
11
|
+
for (const [varName, varValue] of Object.entries(deepMerge(ref.colors, values?.colors) || {})) {
|
|
12
|
+
cssTheme += ` --system-${varName}: ${varValue};\n`;
|
|
13
|
+
}
|
|
14
|
+
// variables
|
|
15
|
+
for (const [name, varValue] of Object.entries(deepMerge(ref.variables, values?.variables) || {})) {
|
|
16
|
+
if (varValue && typeof varValue === 'object') {
|
|
17
|
+
for (const [variableName, variableValue] of Object.entries(varValue || {})) {
|
|
18
|
+
cssTheme += ` --l-theme-${name}-${variableName}: ${parserValues(variableValue)};\n`;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
cssTheme += ` --l-theme-${name}: ${parserValues(varValue)};\n`;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
css += cssTheme + '}\n';
|
|
26
|
+
}
|
|
27
|
+
return css;
|
|
28
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { parserValues } from '../../helpers/parser.js';
|
|
2
|
+
export async function typographyFormatter({ typography, defaultTypography = 'default' }) {
|
|
3
|
+
let css = '';
|
|
4
|
+
for (const [name, values] of Object.entries(typography)) {
|
|
5
|
+
let cssTypo = defaultTypography === name ? `:root {\n` : `.${name} {\n`;
|
|
6
|
+
for (const [fontName, fontValue] of Object.entries(values || {})) {
|
|
7
|
+
cssTypo += ` --kit-font-${fontName}: ${parserValues(fontValue)};\n`;
|
|
8
|
+
}
|
|
9
|
+
css += cssTypo + '}\n';
|
|
10
|
+
}
|
|
11
|
+
return css;
|
|
12
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const parserValues: (value: string | number | Array<string | number>) => string;
|
|
2
|
+
export declare const parserCSSBreakpoints: (css: string) => {
|
|
3
|
+
all: string;
|
|
4
|
+
base: string;
|
|
5
|
+
min: string;
|
|
6
|
+
max: string;
|
|
7
|
+
minmax: string;
|
|
8
|
+
cleaned: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const parserConfigLapikit: (app: string, filePath: string) => Promise<{}>;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import { terminal } from '../terminal.js';
|
|
4
|
+
export const parserValues = (value) => {
|
|
5
|
+
if (typeof value === 'number')
|
|
6
|
+
return `${value}px`;
|
|
7
|
+
if (Array.isArray(value))
|
|
8
|
+
return value.join(', ');
|
|
9
|
+
return value;
|
|
10
|
+
};
|
|
11
|
+
export const parserCSSBreakpoints = (css) => {
|
|
12
|
+
const regex = /([^{]+)\{([^}]+)\}/g;
|
|
13
|
+
let match;
|
|
14
|
+
const matchesToRemove = [];
|
|
15
|
+
const extractedByType = {
|
|
16
|
+
all: [],
|
|
17
|
+
base: [],
|
|
18
|
+
min: [],
|
|
19
|
+
max: [],
|
|
20
|
+
minmax: []
|
|
21
|
+
};
|
|
22
|
+
while ((match = regex.exec(css)) !== null) {
|
|
23
|
+
const fullMatch = match[0];
|
|
24
|
+
const selectors = match[1].trim();
|
|
25
|
+
const body = match[2].trim();
|
|
26
|
+
const selectorsArray = selectors.split(',').map((sel) => sel.trim());
|
|
27
|
+
let matchedType = null;
|
|
28
|
+
if (selectorsArray.some((sel) => sel.includes('[breakpoint|min]'))) {
|
|
29
|
+
matchedType = 'min';
|
|
30
|
+
}
|
|
31
|
+
else if (selectorsArray.some((sel) => sel.includes('[breakpoint|max]'))) {
|
|
32
|
+
matchedType = 'max';
|
|
33
|
+
}
|
|
34
|
+
else if (selectorsArray.some((sel) => sel.includes('[breakpoint|all]'))) {
|
|
35
|
+
matchedType = 'minmax';
|
|
36
|
+
}
|
|
37
|
+
else if (selectorsArray.some((sel) => sel.includes('[breakpoint]'))) {
|
|
38
|
+
matchedType = 'base';
|
|
39
|
+
}
|
|
40
|
+
if (matchedType) {
|
|
41
|
+
const rule = `${selectors} {\n${body}\n}`;
|
|
42
|
+
extractedByType.all.push(rule);
|
|
43
|
+
extractedByType[matchedType].push(rule);
|
|
44
|
+
matchesToRemove.push(fullMatch);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
let cleaned = css;
|
|
48
|
+
for (const rule of matchesToRemove) {
|
|
49
|
+
cleaned = cleaned.replace(rule, '').replace(/\n{2,}/g, '\n\n');
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
all: extractedByType.all
|
|
53
|
+
? extractedByType.all
|
|
54
|
+
.join('\n\n')
|
|
55
|
+
.replaceAll('[breakpoint|min]', '[breakpoint]')
|
|
56
|
+
.replaceAll('[breakpoint|max]', '[breakpoint]')
|
|
57
|
+
.replaceAll('[breakpoint|all]', '[breakpoint]')
|
|
58
|
+
.trim()
|
|
59
|
+
: '',
|
|
60
|
+
base: extractedByType.base ? extractedByType.base.join('\n\n').trim() : '',
|
|
61
|
+
min: extractedByType.min
|
|
62
|
+
? extractedByType.min.join('\n\n').replaceAll('[breakpoint|min]', '[breakpoint]').trim()
|
|
63
|
+
: '',
|
|
64
|
+
max: extractedByType.max
|
|
65
|
+
? extractedByType.max.join('\n\n').replaceAll('[breakpoint|max]', '[breakpoint]').trim()
|
|
66
|
+
: '',
|
|
67
|
+
minmax: extractedByType.minmax
|
|
68
|
+
? extractedByType.minmax.join('\n\n').replaceAll('[breakpoint|all]', '[breakpoint]').trim()
|
|
69
|
+
: '',
|
|
70
|
+
cleaned: cleaned.trim()
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
export const parserConfigLapikit = async (app, filePath) => {
|
|
74
|
+
const pathConfig = path.resolve(app, filePath);
|
|
75
|
+
if (!fs.existsSync(pathConfig))
|
|
76
|
+
process.exit(1);
|
|
77
|
+
const code = fs.readFileSync(pathConfig, 'utf-8');
|
|
78
|
+
const match = code.match(/createLapikit\s*\(\s*({[\s\S]*?})\s*\)/);
|
|
79
|
+
let options = {};
|
|
80
|
+
if (match && match[1]) {
|
|
81
|
+
try {
|
|
82
|
+
options = new Function('return ' + match[1])();
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
terminal('error', `Error parsing lapikit config: ${e}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
terminal('error', 'lapikit configuration not found please refer to the documentation https://lapikit.dev/docs/getting-started');
|
|
90
|
+
}
|
|
91
|
+
return options;
|
|
92
|
+
};
|