@collagejs/core 0.1.2 → 0.2.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/README.md +47 -18
- package/dist/logos/collagejs-128.svg +9 -9
- package/dist/logos/collagejs-512.svg +16 -16
- package/dist/logos/collagejs-64.svg +8 -8
- package/dist/theme/base.css +38 -0
- package/dist/theme/colors.css +181 -0
- package/dist/theme/components.css +506 -0
- package/dist/theme/theme.css +66 -0
- package/dist/theme/theme.d.ts +4 -0
- package/dist/theme/utilities.css +189 -0
- package/dist/theme/variants.css +248 -0
- package/dist/types.d.ts +61 -7
- package/package.json +5 -1
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CollageJS Theme - Utility Classes
|
|
3
|
+
*
|
|
4
|
+
* This file provides utility classes for common styling patterns.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/* ===== COLORS ===== */
|
|
8
|
+
|
|
9
|
+
/* Text colors */
|
|
10
|
+
.cjs-text-primary { color: var(--cjs-primary); }
|
|
11
|
+
.cjs-text-secondary { color: var(--cjs-secondary); }
|
|
12
|
+
.cjs-text-accent { color: var(--cjs-accent); }
|
|
13
|
+
.cjs-text-warning { color: var(--cjs-warning); }
|
|
14
|
+
.cjs-text-success { color: var(--cjs-success); }
|
|
15
|
+
.cjs-text-error { color: var(--cjs-error); }
|
|
16
|
+
.cjs-text-muted { color: var(--cjs-text-muted); }
|
|
17
|
+
.cjs-text-white { color: var(--cjs-white); }
|
|
18
|
+
|
|
19
|
+
/* Contrasting text colors - solves the "what text color goes with X background?" problem */
|
|
20
|
+
.cjs-text-on-light { color: var(--cjs-text-on-light); } /* Dark text for light backgrounds */
|
|
21
|
+
.cjs-text-on-dark { color: var(--cjs-text-on-dark); } /* Light text for dark backgrounds */
|
|
22
|
+
.cjs-text-on-primary { color: var(--cjs-text-on-primary); } /* Contrasting text for primary BG */
|
|
23
|
+
.cjs-text-on-secondary { color: var(--cjs-text-on-secondary); } /* Contrasting text for secondary BG */
|
|
24
|
+
|
|
25
|
+
/* Background colors with opacity support */
|
|
26
|
+
.cjs-bg-primary { background: rgba(var(--cjs-primary-rgb), var(--cjs-bg-opacity)); }
|
|
27
|
+
.cjs-bg-secondary { background: rgba(var(--cjs-secondary-rgb), var(--cjs-bg-opacity)); }
|
|
28
|
+
.cjs-bg-accent { background: rgba(var(--cjs-accent-rgb), var(--cjs-bg-opacity)); }
|
|
29
|
+
.cjs-bg-warning { background: rgba(var(--cjs-warning-rgb), var(--cjs-bg-opacity)); }
|
|
30
|
+
.cjs-bg-success { background: rgba(var(--cjs-success-rgb), var(--cjs-bg-opacity)); }
|
|
31
|
+
.cjs-bg-error { background: rgba(var(--cjs-error-rgb), var(--cjs-bg-opacity)); }
|
|
32
|
+
.cjs-bg-surface { background: var(--cjs-surface); }
|
|
33
|
+
.cjs-bg-white { background: var(--cjs-white); }
|
|
34
|
+
|
|
35
|
+
/* Brand color backgrounds (theme-agnostic, always the same color) */
|
|
36
|
+
.cjs-bg-indigo {
|
|
37
|
+
--cjs-background: rgba(var(--cjs-brand-indigo-start-rgb), var(--cjs-bg-opacity)) !important;
|
|
38
|
+
&.cjs-glass {
|
|
39
|
+
--cjs-background: rgba(var(--cjs-brand-indigo-start-rgb), var(--cjs-glass-bg-opacity)) !important;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
.cjs-bg-cyan {
|
|
43
|
+
--cjs-background: rgba(var(--cjs-brand-cyan-start-rgb), var(--cjs-bg-opacity)) !important;
|
|
44
|
+
&.cjs-glass {
|
|
45
|
+
--cjs-background: rgba(var(--cjs-brand-cyan-start-rgb), var(--cjs-glass-bg-opacity)) !important;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
.cjs-bg-green {
|
|
49
|
+
--cjs-background: rgba(var(--cjs-brand-green-start-rgb), var(--cjs-bg-opacity)) !important;
|
|
50
|
+
&.cjs-glass {
|
|
51
|
+
--cjs-background: rgba(var(--cjs-brand-green-start-rgb), var(--cjs-glass-bg-opacity)) !important;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
.cjs-bg-orange {
|
|
55
|
+
--cjs-background: rgba(var(--cjs-brand-orange-start-rgb), var(--cjs-bg-opacity)) !important;
|
|
56
|
+
&.cjs-glass {
|
|
57
|
+
--cjs-background: rgba(var(--cjs-brand-orange-start-rgb), var(--cjs-glass-bg-opacity)) !important;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* Background + text combinations that are guaranteed to work together */
|
|
62
|
+
.cjs-contrast-light {
|
|
63
|
+
background: var(--cjs-contrast-light-bg);
|
|
64
|
+
color: var(--cjs-contrast-light-text);
|
|
65
|
+
}
|
|
66
|
+
.cjs-contrast-dark {
|
|
67
|
+
background: var(--cjs-contrast-dark-bg);
|
|
68
|
+
color: var(--cjs-contrast-dark-text);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* Gradient backgrounds */
|
|
72
|
+
.cjs-bg-primary-gradient {
|
|
73
|
+
background: var(--cjs-primary-gradient);
|
|
74
|
+
color: var(--cjs-text-on-primary);
|
|
75
|
+
}
|
|
76
|
+
.cjs-bg-secondary-gradient {
|
|
77
|
+
background: var(--cjs-secondary-gradient);
|
|
78
|
+
color: var(--cjs-text-on-secondary);
|
|
79
|
+
}
|
|
80
|
+
.cjs-bg-accent-gradient {
|
|
81
|
+
background: var(--cjs-accent-gradient);
|
|
82
|
+
color: var(--cjs-text-on-primary);
|
|
83
|
+
}
|
|
84
|
+
.cjs-bg-warning-gradient {
|
|
85
|
+
background: var(--cjs-warning-gradient);
|
|
86
|
+
color: var(--cjs-text-on-primary);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* Border colors */
|
|
90
|
+
.cjs-border-primary { border-color: var(--cjs-primary); }
|
|
91
|
+
.cjs-border-secondary { border-color: var(--cjs-secondary); }
|
|
92
|
+
.cjs-border-default { border-color: var(--cjs-border); }
|
|
93
|
+
|
|
94
|
+
/* ===== SPACING ===== */
|
|
95
|
+
.cjs-p-0 { padding: 0; }
|
|
96
|
+
.cjs-p-1 { padding: 0.25rem; }
|
|
97
|
+
.cjs-p-2 { padding: 0.5rem; }
|
|
98
|
+
.cjs-p-3 { padding: 0.75rem; }
|
|
99
|
+
.cjs-p-4 { padding: 1rem; }
|
|
100
|
+
.cjs-p-6 { padding: 1.5rem; }
|
|
101
|
+
.cjs-p-8 { padding: 2rem; }
|
|
102
|
+
|
|
103
|
+
.cjs-m-0 { margin: 0; }
|
|
104
|
+
.cjs-m-1 { margin: 0.25rem; }
|
|
105
|
+
.cjs-m-2 { margin: 0.5rem; }
|
|
106
|
+
.cjs-m-3 { margin: 0.75rem; }
|
|
107
|
+
.cjs-m-4 { margin: 1rem; }
|
|
108
|
+
.cjs-m-6 { margin: 1.5rem; }
|
|
109
|
+
.cjs-m-8 { margin: 2rem; }
|
|
110
|
+
|
|
111
|
+
/* ===== LAYOUT ===== */
|
|
112
|
+
.cjs-flex { display: flex; }
|
|
113
|
+
.cjs-grid { display: grid; }
|
|
114
|
+
.cjs-block { display: block; }
|
|
115
|
+
.cjs-inline { display: inline; }
|
|
116
|
+
.cjs-inline-block { display: inline-block; }
|
|
117
|
+
.cjs-hidden { display: none; }
|
|
118
|
+
|
|
119
|
+
.cjs-flex-row { flex-direction: row; }
|
|
120
|
+
.cjs-flex-col { flex-direction: column; }
|
|
121
|
+
|
|
122
|
+
.cjs-items-center { align-items: center; }
|
|
123
|
+
.cjs-items-start { align-items: flex-start; }
|
|
124
|
+
.cjs-items-end { align-items: flex-end; }
|
|
125
|
+
.cjs-items-baseline { align-items: baseline; }
|
|
126
|
+
|
|
127
|
+
.cjs-justify-center { justify-content: center; }
|
|
128
|
+
.cjs-justify-between { justify-content: space-between; }
|
|
129
|
+
.cjs-justify-around { justify-content: space-around; }
|
|
130
|
+
.cjs-justify-start { justify-content: flex-start; }
|
|
131
|
+
.cjs-justify-end { justify-content: flex-end; }
|
|
132
|
+
|
|
133
|
+
.cjs-gap-1 { gap: 0.25rem; }
|
|
134
|
+
.cjs-gap-2 { gap: 0.5rem; }
|
|
135
|
+
.cjs-gap-3 { gap: 0.75rem; }
|
|
136
|
+
.cjs-gap-4 { gap: 1rem; }
|
|
137
|
+
.cjs-gap-6 { gap: 1.5rem; }
|
|
138
|
+
|
|
139
|
+
.cjs-grow { flex-grow: 1; }
|
|
140
|
+
.cjs-shrink { flex-shrink: 1; }
|
|
141
|
+
.cjs-no-grow { flex-grow: 0; }
|
|
142
|
+
|
|
143
|
+
/* ===== BORDERS ===== */
|
|
144
|
+
.cjs-rounded { border-radius: var(--cjs-radius-sm); }
|
|
145
|
+
.cjs-rounded-md { border-radius: var(--cjs-radius); }
|
|
146
|
+
.cjs-rounded-lg { border-radius: var(--cjs-radius-lg); }
|
|
147
|
+
.cjs-rounded-xl { border-radius: var(--cjs-radius-xl); }
|
|
148
|
+
.cjs-rounded-pill { border-radius: var(--cjs-radius-pill); }
|
|
149
|
+
.cjs-rounded-circle { border-radius: var(--cjs-radius-circle); }
|
|
150
|
+
|
|
151
|
+
.cjs-border { border: 1px solid var(--cjs-border); }
|
|
152
|
+
.cjs-border-2 { border: 2px solid var(--cjs-border); }
|
|
153
|
+
.cjs-border-0 { border: none; }
|
|
154
|
+
|
|
155
|
+
/* ===== SHADOWS ===== */
|
|
156
|
+
.cjs-shadow-sm { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); }
|
|
157
|
+
.cjs-shadow { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1); }
|
|
158
|
+
.cjs-shadow-md { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1); }
|
|
159
|
+
.cjs-shadow-lg { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1); }
|
|
160
|
+
.cjs-shadow-none { box-shadow: none; }
|
|
161
|
+
|
|
162
|
+
/* ===== LOGO UTILITIES ===== */
|
|
163
|
+
.cjs-logo {
|
|
164
|
+
display: inline-block;
|
|
165
|
+
vertical-align: middle;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.cjs-logo-16 { width: 1rem; height: 1rem; }
|
|
169
|
+
.cjs-logo-48 { width: 3rem; height: 3rem; }
|
|
170
|
+
.cjs-logo-64 { width: 4rem; height: 4rem; }
|
|
171
|
+
.cjs-logo-128 { width: 8rem; height: 8rem; }
|
|
172
|
+
.cjs-logo-512 { width: 32rem; height: 32rem; }
|
|
173
|
+
|
|
174
|
+
/* ===== TYPOGRAPHY ===== */
|
|
175
|
+
.cjs-text-xs { font-size: 0.75rem; line-height: 1rem; }
|
|
176
|
+
.cjs-text-sm { font-size: 0.875rem; line-height: 1.25rem; }
|
|
177
|
+
.cjs-text-base { font-size: 1rem; line-height: 1.5rem; }
|
|
178
|
+
.cjs-text-lg { font-size: 1.125rem; line-height: 1.75rem; }
|
|
179
|
+
.cjs-text-xl { font-size: 1.25rem; line-height: 1.75rem; }
|
|
180
|
+
.cjs-text-2xl { font-size: 1.5rem; line-height: 2rem; }
|
|
181
|
+
.cjs-text-3xl { font-size: 1.875rem; line-height: 2.25rem; }
|
|
182
|
+
|
|
183
|
+
.cjs-font-light { font-weight: 300; }
|
|
184
|
+
.cjs-font-normal { font-weight: 400; }
|
|
185
|
+
.cjs-font-medium { font-weight: 500; }
|
|
186
|
+
.cjs-font-semibold { font-weight: 600; }
|
|
187
|
+
.cjs-font-bold { font-weight: 700; }
|
|
188
|
+
|
|
189
|
+
.cjs-font-mono { font-family: var(--cjs-font-mono, monospace); }
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CollageJS Theme - Color Variants
|
|
3
|
+
*
|
|
4
|
+
* This file provides different theme variants by overriding the main color variables.
|
|
5
|
+
* Apply these classes to any themed container to change the theme appearance.
|
|
6
|
+
*
|
|
7
|
+
* MICRO-FRONTEND READY: Works with any scoped container.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/* ===== ACCENT THEME (Orange Primary) ===== */
|
|
11
|
+
[data-collagejs-theme] .cjs-theme-accent,
|
|
12
|
+
.cjs-themed .cjs-theme-accent {
|
|
13
|
+
--cjs-primary: var(--cjs-brand-orange-start);
|
|
14
|
+
--cjs-primary-rgb: var(--cjs-brand-orange-start-rgb);
|
|
15
|
+
--cjs-primary-end: var(--cjs-brand-orange-end);
|
|
16
|
+
--cjs-primary-end-rgb: var(--cjs-brand-orange-end-rgb);
|
|
17
|
+
--cjs-primary-gradient: linear-gradient(135deg, var(--cjs-primary), var(--cjs-primary-end));
|
|
18
|
+
|
|
19
|
+
/* Regenerate primary variants for CSS variable reactivity */
|
|
20
|
+
--cjs-primary-50: color-mix(in srgb, var(--cjs-primary) 10%, white);
|
|
21
|
+
--cjs-primary-100: color-mix(in srgb, var(--cjs-primary) 20%, white);
|
|
22
|
+
--cjs-primary-200: color-mix(in srgb, var(--cjs-primary) 40%, white);
|
|
23
|
+
--cjs-primary-300: color-mix(in srgb, var(--cjs-primary) 60%, white);
|
|
24
|
+
--cjs-primary-400: color-mix(in srgb, var(--cjs-primary) 80%, white);
|
|
25
|
+
--cjs-primary-500: var(--cjs-primary);
|
|
26
|
+
--cjs-primary-600: color-mix(in srgb, var(--cjs-primary) 80%, black);
|
|
27
|
+
--cjs-primary-700: color-mix(in srgb, var(--cjs-primary) 60%, black);
|
|
28
|
+
--cjs-primary-800: color-mix(in srgb, var(--cjs-primary) 40%, black);
|
|
29
|
+
--cjs-primary-900: color-mix(in srgb, var(--cjs-primary) 20%, black);
|
|
30
|
+
|
|
31
|
+
--cjs-secondary: var(--cjs-brand-green-start);
|
|
32
|
+
--cjs-secondary-rgb: var(--cjs-brand-green-start-rgb);
|
|
33
|
+
--cjs-secondary-end: var(--cjs-brand-green-end);
|
|
34
|
+
--cjs-secondary-end-rgb: var(--cjs-brand-green-end-rgb);
|
|
35
|
+
--cjs-secondary-gradient: linear-gradient(135deg, var(--cjs-secondary), var(--cjs-secondary-end));
|
|
36
|
+
|
|
37
|
+
--cjs-warning: var(--cjs-brand-indigo-start);
|
|
38
|
+
--cjs-warning-rgb: var(--cjs-brand-indigo-start-rgb);
|
|
39
|
+
--cjs-warning-end: var(--cjs-brand-indigo-end);
|
|
40
|
+
--cjs-warning-end-rgb: var(--cjs-brand-indigo-end-rgb);
|
|
41
|
+
--cjs-warning-gradient: linear-gradient(135deg, var(--cjs-warning), var(--cjs-warning-end));
|
|
42
|
+
|
|
43
|
+
--cjs-accent: var(--cjs-brand-cyan-start);
|
|
44
|
+
--cjs-accent-rgb: var(--cjs-brand-cyan-start-rgb);
|
|
45
|
+
--cjs-accent-end: var(--cjs-brand-cyan-end);
|
|
46
|
+
--cjs-accent-end-rgb: var(--cjs-brand-cyan-end-rgb);
|
|
47
|
+
--cjs-accent-gradient: linear-gradient(135deg, var(--cjs-accent), var(--cjs-accent-end));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* ===== SKY THEME (Cyan Primary) ===== */
|
|
51
|
+
[data-collagejs-theme] .cjs-theme-sky,
|
|
52
|
+
.cjs-themed .cjs-theme-sky {
|
|
53
|
+
--cjs-primary: var(--cjs-brand-cyan-start);
|
|
54
|
+
--cjs-primary-rgb: var(--cjs-brand-cyan-start-rgb);
|
|
55
|
+
--cjs-primary-end: var(--cjs-brand-cyan-end);
|
|
56
|
+
--cjs-primary-end-rgb: var(--cjs-brand-cyan-end-rgb);
|
|
57
|
+
--cjs-primary-gradient: linear-gradient(135deg, var(--cjs-primary), var(--cjs-primary-end));
|
|
58
|
+
|
|
59
|
+
/* Regenerate primary variants for CSS variable reactivity */
|
|
60
|
+
--cjs-primary-50: color-mix(in srgb, var(--cjs-primary) 10%, white);
|
|
61
|
+
--cjs-primary-100: color-mix(in srgb, var(--cjs-primary) 20%, white);
|
|
62
|
+
--cjs-primary-200: color-mix(in srgb, var(--cjs-primary) 40%, white);
|
|
63
|
+
--cjs-primary-300: color-mix(in srgb, var(--cjs-primary) 60%, white);
|
|
64
|
+
--cjs-primary-400: color-mix(in srgb, var(--cjs-primary) 80%, white);
|
|
65
|
+
--cjs-primary-500: var(--cjs-primary);
|
|
66
|
+
--cjs-primary-600: color-mix(in srgb, var(--cjs-primary) 80%, black);
|
|
67
|
+
--cjs-primary-700: color-mix(in srgb, var(--cjs-primary) 60%, black);
|
|
68
|
+
--cjs-primary-800: color-mix(in srgb, var(--cjs-primary) 40%, black);
|
|
69
|
+
--cjs-primary-900: color-mix(in srgb, var(--cjs-primary) 20%, black);
|
|
70
|
+
|
|
71
|
+
--cjs-secondary: var(--cjs-brand-green-start);
|
|
72
|
+
--cjs-secondary-rgb: var(--cjs-brand-green-start-rgb);
|
|
73
|
+
--cjs-secondary-end: var(--cjs-brand-green-end);
|
|
74
|
+
--cjs-secondary-end-rgb: var(--cjs-brand-green-end-rgb);
|
|
75
|
+
--cjs-secondary-gradient: linear-gradient(135deg, var(--cjs-secondary), var(--cjs-secondary-end));
|
|
76
|
+
|
|
77
|
+
--cjs-warning: var(--cjs-brand-orange-start);
|
|
78
|
+
--cjs-warning-rgb: var(--cjs-brand-orange-start-rgb);
|
|
79
|
+
--cjs-warning-end: var(--cjs-brand-orange-end);
|
|
80
|
+
--cjs-warning-end-rgb: var(--cjs-brand-orange-end-rgb);
|
|
81
|
+
--cjs-warning-gradient: linear-gradient(135deg, var(--cjs-warning), var(--cjs-warning-end));
|
|
82
|
+
|
|
83
|
+
--cjs-accent: var(--cjs-brand-cyan-start);
|
|
84
|
+
--cjs-accent-rgb: var(--cjs-brand-cyan-start-rgb);
|
|
85
|
+
--cjs-accent-end: var(--cjs-brand-cyan-end);
|
|
86
|
+
--cjs-accent-end-rgb: var(--cjs-brand-cyan-end-rgb);
|
|
87
|
+
--cjs-accent-gradient: linear-gradient(135deg, var(--cjs-accent), var(--cjs-accent-end));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* ===== NATURE THEME (Green Primary) ===== */
|
|
91
|
+
[data-collagejs-theme] .cjs-theme-nature,
|
|
92
|
+
.cjs-themed .cjs-theme-nature {
|
|
93
|
+
--cjs-primary: var(--cjs-brand-green-start);
|
|
94
|
+
--cjs-primary-rgb: var(--cjs-brand-green-start-rgb);
|
|
95
|
+
--cjs-primary-end: var(--cjs-brand-green-end);
|
|
96
|
+
--cjs-primary-end-rgb: var(--cjs-brand-green-end-rgb);
|
|
97
|
+
--cjs-primary-gradient: linear-gradient(135deg, var(--cjs-primary), var(--cjs-primary-end));
|
|
98
|
+
|
|
99
|
+
/* Regenerate primary variants for CSS variable reactivity */
|
|
100
|
+
--cjs-primary-50: color-mix(in srgb, var(--cjs-primary) 10%, white);
|
|
101
|
+
--cjs-primary-100: color-mix(in srgb, var(--cjs-primary) 20%, white);
|
|
102
|
+
--cjs-primary-200: color-mix(in srgb, var(--cjs-primary) 40%, white);
|
|
103
|
+
--cjs-primary-300: color-mix(in srgb, var(--cjs-primary) 60%, white);
|
|
104
|
+
--cjs-primary-400: color-mix(in srgb, var(--cjs-primary) 80%, white);
|
|
105
|
+
--cjs-primary-500: var(--cjs-primary);
|
|
106
|
+
--cjs-primary-600: color-mix(in srgb, var(--cjs-primary) 80%, black);
|
|
107
|
+
--cjs-primary-700: color-mix(in srgb, var(--cjs-primary) 60%, black);
|
|
108
|
+
--cjs-primary-800: color-mix(in srgb, var(--cjs-primary) 40%, black);
|
|
109
|
+
--cjs-primary-900: color-mix(in srgb, var(--cjs-primary) 20%, black);
|
|
110
|
+
|
|
111
|
+
--cjs-secondary: var(--cjs-brand-cyan-start);
|
|
112
|
+
--cjs-secondary-rgb: var(--cjs-brand-cyan-start-rgb);
|
|
113
|
+
--cjs-secondary-end: var(--cjs-brand-cyan-end);
|
|
114
|
+
--cjs-secondary-end-rgb: var(--cjs-brand-cyan-end-rgb);
|
|
115
|
+
--cjs-secondary-gradient: linear-gradient(135deg, var(--cjs-secondary), var(--cjs-secondary-end));
|
|
116
|
+
|
|
117
|
+
--cjs-warning: var(--cjs-brand-indigo-start);
|
|
118
|
+
--cjs-warning-rgb: var(--cjs-brand-indigo-start-rgb);
|
|
119
|
+
--cjs-warning-end: var(--cjs-brand-indigo-end);
|
|
120
|
+
--cjs-warning-end-rgb: var(--cjs-brand-indigo-end-rgb);
|
|
121
|
+
--cjs-warning-gradient: linear-gradient(135deg, var(--cjs-warning), var(--cjs-warning-end));
|
|
122
|
+
|
|
123
|
+
--cjs-accent: var(--cjs-brand-orange-start);
|
|
124
|
+
--cjs-accent-rgb: var(--cjs-brand-orange-start-rgb);
|
|
125
|
+
--cjs-accent-end: var(--cjs-brand-orange-end);
|
|
126
|
+
--cjs-accent-end-rgb: var(--cjs-brand-orange-end-rgb);
|
|
127
|
+
--cjs-accent-gradient: linear-gradient(135deg, var(--cjs-accent), var(--cjs-accent-end));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* ===== ROYAL THEME (Purple Primary) ===== */
|
|
131
|
+
[data-collagejs-theme] .cjs-theme-royal,
|
|
132
|
+
.cjs-themed .cjs-theme-royal {
|
|
133
|
+
--cjs-primary: var(--cjs-brand-indigo-start);
|
|
134
|
+
--cjs-primary-rgb: var(--cjs-brand-indigo-start-rgb);
|
|
135
|
+
--cjs-primary-end: var(--cjs-brand-indigo-end);
|
|
136
|
+
--cjs-primary-end-rgb: var(--cjs-brand-indigo-end-rgb);
|
|
137
|
+
--cjs-primary-gradient: linear-gradient(135deg, var(--cjs-primary), var(--cjs-primary-end));
|
|
138
|
+
|
|
139
|
+
/* Regenerate primary variants for CSS variable reactivity */
|
|
140
|
+
--cjs-primary-50: color-mix(in srgb, var(--cjs-primary) 10%, white);
|
|
141
|
+
--cjs-primary-100: color-mix(in srgb, var(--cjs-primary) 20%, white);
|
|
142
|
+
--cjs-primary-200: color-mix(in srgb, var(--cjs-primary) 40%, white);
|
|
143
|
+
--cjs-primary-300: color-mix(in srgb, var(--cjs-primary) 60%, white);
|
|
144
|
+
--cjs-primary-400: color-mix(in srgb, var(--cjs-primary) 80%, white);
|
|
145
|
+
--cjs-primary-500: var(--cjs-primary);
|
|
146
|
+
--cjs-primary-600: color-mix(in srgb, var(--cjs-primary) 80%, black);
|
|
147
|
+
--cjs-primary-700: color-mix(in srgb, var(--cjs-primary) 60%, black);
|
|
148
|
+
--cjs-primary-800: color-mix(in srgb, var(--cjs-primary) 40%, black);
|
|
149
|
+
--cjs-primary-900: color-mix(in srgb, var(--cjs-primary) 20%, black);
|
|
150
|
+
|
|
151
|
+
--cjs-secondary: var(--cjs-brand-cyan-start);
|
|
152
|
+
--cjs-secondary-rgb: var(--cjs-brand-cyan-start-rgb);
|
|
153
|
+
--cjs-secondary-end: var(--cjs-brand-cyan-end);
|
|
154
|
+
--cjs-secondary-end-rgb: var(--cjs-brand-cyan-end-rgb);
|
|
155
|
+
--cjs-secondary-gradient: linear-gradient(135deg, var(--cjs-secondary), var(--cjs-secondary-end));
|
|
156
|
+
|
|
157
|
+
--cjs-accent: var(--cjs-brand-green-start);
|
|
158
|
+
--cjs-accent-rgb: var(--cjs-brand-green-start-rgb);
|
|
159
|
+
--cjs-accent-end: var(--cjs-brand-green-end);
|
|
160
|
+
--cjs-accent-end-rgb: var(--cjs-brand-green-end-rgb);
|
|
161
|
+
--cjs-accent-gradient: linear-gradient(135deg, var(--cjs-accent), var(--cjs-accent-end));
|
|
162
|
+
|
|
163
|
+
--cjs-warning: var(--cjs-brand-orange-start);
|
|
164
|
+
--cjs-warning-rgb: var(--cjs-brand-orange-start-rgb);
|
|
165
|
+
--cjs-warning-end: var(--cjs-brand-orange-end);
|
|
166
|
+
--cjs-warning-end-rgb: var(--cjs-brand-orange-end-rgb);
|
|
167
|
+
--cjs-warning-gradient: linear-gradient(135deg, var(--cjs-warning), var(--cjs-warning-end));
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* ===== DARK THEME ===== */
|
|
171
|
+
[data-collagejs-theme] .cjs-theme-dark,
|
|
172
|
+
.cjs-themed .cjs-theme-dark {
|
|
173
|
+
--cjs-background: rgba(var(--cjs-black-rgb), var(--cjs-bg-opacity));
|
|
174
|
+
--cjs-surface: var(--cjs-gray-800);
|
|
175
|
+
--cjs-border: rgba(var(--cjs-gray-200-rgb), var(--cjs-border-opacity));
|
|
176
|
+
--cjs-highlight: rgba(var(--cjs-white-rgb), 0.14);
|
|
177
|
+
--cjs-text: rgba(var(--cjs-foreground-on-dark-rgb), var(--cjs-text-opacity));
|
|
178
|
+
--cjs-text-secondary: var(--cjs-gray-300);
|
|
179
|
+
--cjs-text-muted: var(--cjs-gray-400);
|
|
180
|
+
|
|
181
|
+
/* Adjust primary variants for dark theme */
|
|
182
|
+
--cjs-primary-50: color-mix(in srgb, var(--cjs-primary) 10%, black);
|
|
183
|
+
--cjs-primary-100: color-mix(in srgb, var(--cjs-primary) 20%, black);
|
|
184
|
+
--cjs-primary-200: color-mix(in srgb, var(--cjs-primary) 40%, black);
|
|
185
|
+
--cjs-primary-300: color-mix(in srgb, var(--cjs-primary) 60%, black);
|
|
186
|
+
--cjs-primary-400: color-mix(in srgb, var(--cjs-primary) 80%, black);
|
|
187
|
+
--cjs-primary-600: color-mix(in srgb, var(--cjs-primary) 80%, white);
|
|
188
|
+
--cjs-primary-700: color-mix(in srgb, var(--cjs-primary) 60%, white);
|
|
189
|
+
--cjs-primary-800: color-mix(in srgb, var(--cjs-primary) 40%, white);
|
|
190
|
+
--cjs-primary-900: color-mix(in srgb, var(--cjs-primary) 20%, white);
|
|
191
|
+
--cjs-primary-gradient: linear-gradient(135deg, var(--cjs-primary), var(--cjs-primary-end));
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* ===== GLASS EFFECT VARIANTS ===== */
|
|
195
|
+
/* Applies backdrop blur and makes background translucent */
|
|
196
|
+
/* Background color automatically matches current theme (light/dark) */
|
|
197
|
+
|
|
198
|
+
[data-collagejs-theme] .cjs-glass,
|
|
199
|
+
.cjs-themed .cjs-glass {
|
|
200
|
+
/* Regenerate background with glass opacity for CSS variable reactivity */
|
|
201
|
+
--cjs-background: rgba(var(--cjs-white-rgb), var(--cjs-glass-bg-opacity));
|
|
202
|
+
backdrop-filter: blur(var(--cjs-glass-blur)) saturate(var(--cjs-glass-saturation));
|
|
203
|
+
-webkit-backdrop-filter: blur(var(--cjs-glass-blur)) saturate(var(--cjs-glass-saturation));
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/* Glass effect in dark theme - use dark background */
|
|
207
|
+
/* Handle both: dark theme with glass child AND both classes on same element */
|
|
208
|
+
[data-collagejs-theme] .cjs-theme-dark .cjs-glass,
|
|
209
|
+
.cjs-themed .cjs-theme-dark .cjs-glass,
|
|
210
|
+
[data-collagejs-theme].cjs-theme-dark .cjs-glass,
|
|
211
|
+
.cjs-themed.cjs-theme-dark .cjs-glass,
|
|
212
|
+
[data-collagejs-theme] .cjs-theme-dark.cjs-glass,
|
|
213
|
+
.cjs-themed .cjs-theme-dark.cjs-glass,
|
|
214
|
+
[data-collagejs-theme].cjs-theme-dark.cjs-glass,
|
|
215
|
+
.cjs-themed.cjs-theme-dark.cjs-glass {
|
|
216
|
+
--cjs-background: rgba(var(--cjs-black-rgb), var(--cjs-glass-bg-opacity));
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/* ===== ACCESSIBILITY PRESETS ===== */
|
|
220
|
+
/* Pre-defined glass intensity levels for different needs */
|
|
221
|
+
/* Apply these WITH .cjs-glass (e.g., class="cjs-glass cjs-glass-subtle") */
|
|
222
|
+
|
|
223
|
+
/* Subtle glass - for users sensitive to visual effects */
|
|
224
|
+
[data-collagejs-theme] .cjs-glass-subtle,
|
|
225
|
+
.cjs-themed .cjs-glass-subtle {
|
|
226
|
+
--cjs-glass-blur: 4px;
|
|
227
|
+
--cjs-glass-saturation: 120%;
|
|
228
|
+
--cjs-glass-bg-opacity: 0.05;
|
|
229
|
+
--cjs-glass-border-opacity: 0.1;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/* Strong glass - for users who want maximum effect */
|
|
233
|
+
[data-collagejs-theme] .cjs-glass-strong,
|
|
234
|
+
.cjs-themed .cjs-glass-strong {
|
|
235
|
+
--cjs-glass-blur: 20px;
|
|
236
|
+
--cjs-glass-saturation: 220%;
|
|
237
|
+
--cjs-glass-bg-opacity: 0.15;
|
|
238
|
+
--cjs-glass-border-opacity: 0.3;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/* No blur glass - transparency without blur for accessibility */
|
|
242
|
+
[data-collagejs-theme] .cjs-glass-no-blur,
|
|
243
|
+
.cjs-themed .cjs-glass-no-blur {
|
|
244
|
+
--cjs-glass-blur: 0px;
|
|
245
|
+
--cjs-glass-saturation: 100%;
|
|
246
|
+
--cjs-glass-bg-opacity: 0.2;
|
|
247
|
+
--cjs-glass-border-opacity: 0.4;
|
|
248
|
+
}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,25 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Properties passed to `mount()` functions of `CorePiece` objects. It extends the piece's supported objects with a
|
|
3
|
+
* property of type `symbol` that carries the piece parent's `mountPiece()` function.
|
|
4
|
+
*/
|
|
1
5
|
export type MountProps<TProps extends Record<string, any> = Record<string, any>> = TProps & {
|
|
2
6
|
[x: symbol]: MountPiece<TProps>;
|
|
3
7
|
};
|
|
8
|
+
/**
|
|
9
|
+
* Signature for unmount (cleanup) functions, including the ones returned by `CorePiece.mount()`.
|
|
10
|
+
*/
|
|
4
11
|
export type UnmountFn = () => Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Type that defines the signature of the functions accepted in `CorePiece.mount`.
|
|
14
|
+
* @param target The HTML target where the piece will be mounted as a child.
|
|
15
|
+
* @param props The piece's initial property values.
|
|
16
|
+
* @returns A promise to the cleanup function that unmounts the piece.
|
|
17
|
+
*/
|
|
5
18
|
export type MountFn<TProps extends Record<string, any> = Record<string, any>> = (target: HTMLElement, props?: MountProps<TProps>) => Promise<UnmountFn>;
|
|
19
|
+
/**
|
|
20
|
+
* Type that defines the signature of the functions accepted in `CorePiece.update`.
|
|
21
|
+
* @param props The new property values for the mounted piece.
|
|
22
|
+
* @returns A promise that resolves once the process of updating property values concludes.
|
|
23
|
+
*/
|
|
6
24
|
export type UpdateFn<TProps extends Record<string, any> = Record<string, any>> = (props: TProps) => Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Defines the accepted shapes for `CorePiece.mount`.
|
|
27
|
+
*/
|
|
7
28
|
export type Mount<TProps extends Record<string, any> = Record<string, any>> = MountFn<TProps> | MountFn<TProps>[] | Mount<TProps>[];
|
|
29
|
+
/**
|
|
30
|
+
* Defines the accepted shapes for `CorePiece.update`.
|
|
31
|
+
*/
|
|
8
32
|
export type Update<TProps extends Record<string, any> = Record<string, any>> = UpdateFn<TProps> | UpdateFn<TProps>[] | Update[];
|
|
33
|
+
/**
|
|
34
|
+
* Defines the contract that objects must follow in order to be mountable as *CollageJS* pieces (micro-frontends).
|
|
35
|
+
*/
|
|
9
36
|
export interface CorePiece<TProps extends Record<string, any> = Record<string, any>> {
|
|
37
|
+
/**
|
|
38
|
+
* Mounts the piece (micro-frontend) in the document. Every mount function should always return a cleanup function
|
|
39
|
+
* that, when called, unmounts the piece.
|
|
40
|
+
*/
|
|
10
41
|
mount: Mount<TProps>;
|
|
42
|
+
/**
|
|
43
|
+
* Updates the piece property values. This is optional. If not provided, the piece won't support property updates
|
|
44
|
+
* while mounted in the document, and all property values must have been passed during mounting.
|
|
45
|
+
*/
|
|
11
46
|
update?: Update<TProps>;
|
|
12
47
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
bootstrap: UnmountFn;
|
|
17
|
-
unload: UnmountFn;
|
|
18
|
-
factories: Factories;
|
|
19
|
-
};
|
|
48
|
+
/**
|
|
49
|
+
* Defines the shape of the object returned by the process of mounting a `CorePiece` object.
|
|
50
|
+
*/
|
|
20
51
|
export interface MountedPiece<TProps extends Record<string, any> = Record<string, any>> {
|
|
52
|
+
/**
|
|
53
|
+
* Function used to apply updated property values to the mounted `CorePiece` object.
|
|
54
|
+
*/
|
|
21
55
|
update: UpdateFn<TProps>;
|
|
56
|
+
/**
|
|
57
|
+
* Function used to unmount the `CorePiece` object.
|
|
58
|
+
*/
|
|
22
59
|
unmount: UnmountFn;
|
|
60
|
+
/**
|
|
61
|
+
* The version of the global `mountPiece` function that tracks mounted children so their unmounting is
|
|
62
|
+
* synchronized with this piece's unmount event.
|
|
63
|
+
*
|
|
64
|
+
* **IMPORTANT:** Always use this function instead of the global `mountPiece` function when mounting other
|
|
65
|
+
* `CorePiece` objects inside the mounted `CorePiece` object to prevent lifecycle issues.
|
|
66
|
+
*/
|
|
23
67
|
mountPiece: MountPiece<TProps>;
|
|
24
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Type definition for the `mountPiece` functions that mount *CollageJS* pieces in the HTML document.
|
|
71
|
+
*
|
|
72
|
+
* **NOTE:** There is a global `mountPiece` function, and then every mounted *CollageJS* piece that gets mounted
|
|
73
|
+
* generates a version of the global function that works identically, except that it tracks the `CollageJS` pieces
|
|
74
|
+
* mounted with it so these are unmounted automatically as soon as the parent is unmounted.
|
|
75
|
+
* @param piece `CorePiece` object to mount in the provided target, or a promise that resolves said object.
|
|
76
|
+
* @param target HTML element where to mount
|
|
77
|
+
* @param props Optional properties for the `CorePiece` object.
|
|
78
|
+
*/
|
|
25
79
|
export type MountPiece<TProps extends Record<string, any> = Record<string, any>> = (piece: CorePiece<TProps> | Promise<CorePiece<TProps>>, target: HTMLElement, props?: TProps) => Promise<MountedPiece<TProps>>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@collagejs/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Core functionality for CollageJS.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -56,6 +56,10 @@
|
|
|
56
56
|
"./logo/512": {
|
|
57
57
|
"types": "./dist/logos/logo.d.ts",
|
|
58
58
|
"default": "./dist/logos/collagejs-512.svg"
|
|
59
|
+
},
|
|
60
|
+
"./theme/*": {
|
|
61
|
+
"types": "./dist/theme/*.d.ts",
|
|
62
|
+
"default": "./dist/theme/*.css"
|
|
59
63
|
}
|
|
60
64
|
},
|
|
61
65
|
"files": [
|