@paraxe/design 1.0.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/src/env.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ declare module "*.css" {
4
+ const css: string
5
+ export default css
6
+ }
7
+
package/src/index.ts ADDED
@@ -0,0 +1,354 @@
1
+ /**
2
+ * @loba/design — public entry point.
3
+ *
4
+ * The canonical token contract for the Loba ecosystem.
5
+ * `@loba/ui` components consume these tokens directly (no aliases).
6
+ *
7
+ * This module exports:
8
+ * - The canonical token names (typed, frozen v1.0)
9
+ * - CSS entry points (tokens / themes / presets)
10
+ *
11
+ * Runtime consumers typically import the CSS files directly, e.g.:
12
+ * import "@loba/design/tokens.css"
13
+ * import "@loba/design/themes/default.css"
14
+ * import "@loba/design/presets/default.css"
15
+ */
16
+
17
+ // ---- Canonical token names (frozen v1.0) -------------------------------
18
+
19
+ /** Structural token names from tokens.css (Layer 1). */
20
+ export const TOKEN_NAMES = {
21
+ // Spacing scale
22
+ space0: "--space-0",
23
+ spacePx: "--space-px",
24
+ space1: "--space-1",
25
+ space2: "--space-2",
26
+ space3: "--space-3",
27
+ space4: "--space-4",
28
+ space5: "--space-5",
29
+ space6: "--space-6",
30
+ space7: "--space-7",
31
+ space8: "--space-8",
32
+ space9: "--space-9",
33
+ space10: "--space-10",
34
+ space11: "--space-11",
35
+ space12: "--space-12",
36
+ space14: "--space-14",
37
+ space16: "--space-16",
38
+ space20: "--space-20",
39
+ space24: "--space-24",
40
+ space28: "--space-28",
41
+ space32: "--space-32",
42
+ space36: "--space-36",
43
+ space40: "--space-40",
44
+ space44: "--space-44",
45
+ space48: "--space-48",
46
+ space52: "--space-52",
47
+ space56: "--space-56",
48
+ space60: "--space-60",
49
+ space64: "--space-64",
50
+ space72: "--space-72",
51
+ space80: "--space-80",
52
+ space96: "--space-96",
53
+
54
+ // Spacing roles
55
+ sectionSpacing: "--section-spacing",
56
+ containerPadding: "--container-padding",
57
+ containerPaddingLg: "--container-padding-lg",
58
+ cardPadding: "--card-padding",
59
+ cardPaddingSm: "--card-padding-sm",
60
+ cardPaddingLg: "--card-padding-lg",
61
+ stackGap: "--stack-gap",
62
+ stackGapSm: "--stack-gap-sm",
63
+ stackGapLg: "--stack-gap-lg",
64
+ inlineGap: "--inline-gap",
65
+ inlineGapSm: "--inline-gap-sm",
66
+ inlineGapLg: "--inline-gap-lg",
67
+ gridGap: "--grid-gap",
68
+ gridGapSm: "--grid-gap-sm",
69
+ gridGapLg: "--grid-gap-lg",
70
+
71
+ // Layout
72
+ containerMaxWidth: "--container-max-width",
73
+ containerNarrow: "--container-narrow",
74
+ containerGutter: "--container-gutter",
75
+ containerGutterLg: "--container-gutter-lg",
76
+ contentWidthNarrow: "--content-width-narrow",
77
+
78
+ // Z-index
79
+ zBase: "--z-base",
80
+ zFloor: "--z-floor",
81
+ zSticky: "--z-sticky",
82
+ zNavbar: "--z-navbar",
83
+ zDropdown: "--z-dropdown",
84
+ zOverlay: "--z-overlay",
85
+ zModal: "--z-modal",
86
+ zPopover: "--z-popover",
87
+ zTooltip: "--z-tooltip",
88
+
89
+ // Typography
90
+ fontFamilyDisplay: "--font-family-display",
91
+ fontFamilyBody: "--font-family-body",
92
+ fontFamilyMono: "--font-family-mono",
93
+ fontWeightLight: "--font-weight-light",
94
+ fontWeightRegular: "--font-weight-regular",
95
+ fontWeightMedium: "--font-weight-medium",
96
+ fontWeightSemibold: "--font-weight-semibold",
97
+ fontWeightBold: "--font-weight-bold",
98
+ fontWeightExtrabold: "--font-weight-extrabold",
99
+ fontSizeXs: "--font-size-xs",
100
+ fontSizeSm: "--font-size-sm",
101
+ fontSizeBase: "--font-size-base",
102
+ fontSizeLg: "--font-size-lg",
103
+ fontSizeXl: "--font-size-xl",
104
+ fontSize2xl: "--font-size-2xl",
105
+ fontSize3xl: "--font-size-3xl",
106
+ fontSize4xl: "--font-size-4xl",
107
+ fontSize5xl: "--font-size-5xl",
108
+ fontSize6xl: "--font-size-6xl",
109
+ fontSize7xl: "--font-size-7xl",
110
+ fontSize8xl: "--font-size-8xl",
111
+ fontSize9xl: "--font-size-9xl",
112
+ lineHeightTight: "--line-height-tight",
113
+ lineHeightSnug: "--line-height-snug",
114
+ lineHeightNormal: "--line-height-normal",
115
+ lineHeightRelaxed: "--line-height-relaxed",
116
+ lineHeightLoose: "--line-height-loose",
117
+ letterSpacingTight: "--letter-spacing-tight",
118
+ letterSpacingNormal: "--letter-spacing-normal",
119
+ letterSpacingWide: "--letter-spacing-wide",
120
+ letterSpacingWider: "--letter-spacing-wider",
121
+ letterSpacingWidest: "--letter-spacing-widest",
122
+
123
+ // Typography — semantic layer
124
+ typographyH1Size: "--typography-h1-size",
125
+ typographyH2Size: "--typography-h2-size",
126
+ typographyH3Size: "--typography-h3-size",
127
+ typographyH4Size: "--typography-h4-size",
128
+ typographyLeadSize: "--typography-lead-size",
129
+ typographyBodySize: "--typography-body-size",
130
+ typographyCaptionSize: "--typography-caption-size",
131
+ typographyOverlineSize: "--typography-overline-size",
132
+ typographyHeadingWeight: "--typography-heading-weight",
133
+ typographyBodyWeight: "--typography-body-weight",
134
+ typographyHeadingLineheight: "--typography-heading-lineheight",
135
+ typographyBodyLineheight: "--typography-body-lineheight",
136
+ typographyHeadingLetterspacing: "--typography-heading-letterspacing",
137
+ typographyBodyLetterspacing: "--typography-body-letterspacing",
138
+
139
+ // Radius
140
+ radiusNone: "--radius-none",
141
+ radiusSm: "--radius-sm",
142
+ radiusBase: "--radius-base",
143
+ radiusMd: "--radius-md",
144
+ radiusLg: "--radius-lg",
145
+ radiusXl: "--radius-xl",
146
+ radius2xl: "--radius-2xl",
147
+ radius3xl: "--radius-3xl",
148
+ radiusFull: "--radius-full",
149
+
150
+ // Shadows (structural)
151
+ shadowSm: "--shadow-sm",
152
+ shadowBase: "--shadow-base",
153
+ shadowMd: "--shadow-md",
154
+ shadowLg: "--shadow-lg",
155
+ shadowXl: "--shadow-xl",
156
+ shadow2xl: "--shadow-2xl",
157
+ shadowInner: "--shadow-inner",
158
+
159
+ // Motion durations
160
+ motionDurationFast: "--motion-duration-fast",
161
+ motionDurationNormal: "--motion-duration-normal",
162
+ motionDurationSlow: "--motion-duration-slow",
163
+ motionDurationSlower: "--motion-duration-slower",
164
+ motionDurationSlowest: "--motion-duration-slowest",
165
+
166
+ // Motion easings
167
+ motionEaseIn: "--motion-ease-in",
168
+ motionEaseOut: "--motion-ease-out",
169
+ motionEaseInOut: "--motion-ease-in-out",
170
+ motionEaseSpring: "--motion-ease-spring",
171
+ motionEaseSmooth: "--motion-ease-smooth",
172
+
173
+ // Motion combinators
174
+ motionFast: "--motion-fast",
175
+ motionNormal: "--motion-normal",
176
+ motionSlow: "--motion-slow",
177
+ motionSlower: "--motion-slower",
178
+ easeStandard: "--ease-standard",
179
+ easeSmooth: "--ease-smooth",
180
+ easeSpring: "--ease-spring",
181
+ transitionFast: "--transition-fast",
182
+ transitionNormal: "--transition-normal",
183
+ transitionSlow: "--transition-slow",
184
+
185
+ // Component structure
186
+ buttonRadius: "--button-radius",
187
+ buttonPaddingX: "--button-padding-x",
188
+ buttonPaddingY: "--button-padding-y",
189
+ buttonGap: "--button-gap",
190
+ cardRadius: "--card-radius",
191
+ badgeRadius: "--badge-radius",
192
+ navHeight: "--nav-height",
193
+ navBlur: "--nav-blur",
194
+ glassBlur: "--glass-blur",
195
+ glassSaturate: "--glass-saturate",
196
+ focusRingWidth: "--focus-ring-width",
197
+ focusRingOffset: "--focus-ring-offset",
198
+ } as const
199
+
200
+ /** Color token names from themes/*.css (Layer 2). */
201
+ export const COLOR_TOKEN_NAMES = {
202
+ brandPrimary: "--brand-primary",
203
+ brandPrimaryHover: "--brand-primary-hover",
204
+ brandPrimaryActive: "--brand-primary-active",
205
+ brandPrimaryLight: "--brand-primary-light",
206
+ brandPrimaryMuted: "--brand-primary-muted",
207
+ brandGlow: "--brand-glow",
208
+ textOnBrand: "--text-on-brand",
209
+ colorSuccess: "--color-success",
210
+ colorWarning: "--color-warning",
211
+ colorDanger: "--color-danger",
212
+ colorInfo: "--color-info",
213
+ backgroundPrimary: "--background-primary",
214
+ backgroundSecondary: "--background-secondary",
215
+ surfaceBase: "--surface-base",
216
+ surfaceRaised: "--surface-raised",
217
+ surfaceCard: "--surface-card",
218
+ surfaceHover: "--surface-hover",
219
+ surfaceElevated1: "--surface-elevated-1",
220
+ surfaceElevated2: "--surface-elevated-2",
221
+ surfaceElevated3: "--surface-elevated-3",
222
+ surfaceGlass: "--surface-glass",
223
+ surfaceGlassStrong: "--surface-glass-strong",
224
+ textPrimary: "--text-primary",
225
+ textSecondary: "--text-secondary",
226
+ textMuted: "--text-muted",
227
+ textInverse: "--text-inverse",
228
+ textAccent: "--text-accent",
229
+ textLink: "--text-link",
230
+ textLinkHover: "--text-link-hover",
231
+ borderDefault: "--border-default",
232
+ borderStrong: "--border-strong",
233
+ borderSubtle: "--border-subtle",
234
+ borderFocus: "--border-focus",
235
+ glassBackground: "--glass-background",
236
+ glassBorder: "--glass-border",
237
+ cardHighlight: "--card-highlight",
238
+ cardHighlightInset: "--card-highlight-inset",
239
+ overlayScrim: "--overlay-scrim",
240
+ overlayScrimStrong: "--overlay-scrim-strong",
241
+ focusRingColor: "--focus-ring-color",
242
+ selectionBackground: "--selection-background",
243
+ selectionText: "--selection-text",
244
+
245
+ // Buttons
246
+ buttonPrimaryBg: "--button-primary-bg",
247
+ buttonPrimaryText: "--button-primary-text",
248
+ buttonPrimaryBorder: "--button-primary-border",
249
+ buttonPrimaryHoverBg: "--button-primary-hover-bg",
250
+ buttonPrimaryHoverBorder: "--button-primary-hover-border",
251
+ buttonPrimaryActiveBg: "--button-primary-active-bg",
252
+ buttonPrimaryDisabledBg: "--button-primary-disabled-bg",
253
+ buttonPrimaryDisabledText: "--button-primary-disabled-text",
254
+ buttonSecondaryBg: "--button-secondary-bg",
255
+ buttonSecondaryText: "--button-secondary-text",
256
+ buttonSecondaryBorder: "--button-secondary-border",
257
+ buttonSecondaryHoverBg: "--button-secondary-hover-bg",
258
+ buttonSecondaryHoverBorder: "--button-secondary-hover-border",
259
+ buttonSecondaryActiveBg: "--button-secondary-active-bg",
260
+ buttonSecondaryDisabledBg: "--button-secondary-disabled-bg",
261
+ buttonSecondaryDisabledText: "--button-secondary-disabled-text",
262
+ buttonSecondaryDisabledBorder: "--button-secondary-disabled-border",
263
+ buttonGhostBg: "--button-ghost-bg",
264
+ buttonGhostText: "--button-ghost-text",
265
+ buttonGhostBorder: "--button-ghost-border",
266
+ buttonGhostHoverBg: "--button-ghost-hover-bg",
267
+ buttonGhostHoverBorder: "--button-ghost-hover-border",
268
+ buttonGhostActiveBg: "--button-ghost-active-bg",
269
+ buttonGhostDisabledText: "--button-ghost-disabled-text",
270
+ buttonOutlineBg: "--button-outline-bg",
271
+ buttonOutlineText: "--button-outline-text",
272
+ buttonOutlineBorder: "--button-outline-border",
273
+ buttonOutlineHoverBg: "--button-outline-hover-bg",
274
+ buttonOutlineHoverBorder: "--button-outline-hover-border",
275
+ buttonOutlineActiveBg: "--button-outline-active-bg",
276
+ buttonOutlineDisabledText: "--button-outline-disabled-text",
277
+ buttonOutlineDisabledBorder: "--button-outline-disabled-border",
278
+ buttonDangerBg: "--button-danger-bg",
279
+ buttonDangerText: "--button-danger-text",
280
+ buttonDangerBorder: "--button-danger-border",
281
+ buttonDangerHoverBg: "--button-danger-hover-bg",
282
+ buttonDangerHoverBorder: "--button-danger-hover-border",
283
+ buttonDangerActiveBg: "--button-danger-active-bg",
284
+ buttonDangerDisabledBg: "--button-danger-disabled-bg",
285
+ buttonDangerDisabledText: "--button-danger-disabled-text",
286
+
287
+ // Cards
288
+ cardBackground: "--card-background",
289
+ cardBackgroundHover: "--card-background-hover",
290
+ cardBorder: "--card-border",
291
+ cardBorderHover: "--card-border-hover",
292
+ cardShadow: "--card-shadow",
293
+ cardShadowHover: "--card-shadow-hover",
294
+
295
+ // Nav
296
+ navBackground: "--nav-background",
297
+ navBorder: "--nav-border",
298
+ navLink: "--nav-link",
299
+ navLinkHover: "--nav-link-hover",
300
+ navLinkActive: "--nav-link-active",
301
+ navLinkActiveBorder: "--nav-link-active-border",
302
+ navFocusRing: "--nav-focus-ring",
303
+
304
+ // Forms
305
+ formBackground: "--form-background",
306
+ formBorder: "--form-border",
307
+ formBorderHover: "--form-border-hover",
308
+ formBorderFocus: "--form-border-focus",
309
+ formText: "--form-text",
310
+ formTextMuted: "--form-text-muted",
311
+ formPlaceholder: "--form-placeholder",
312
+ formBgDisabled: "--form-bg-disabled",
313
+ formBorderDisabled: "--form-border-disabled",
314
+ formTextDisabled: "--form-text-disabled",
315
+
316
+ // Badges
317
+ badgeBackground: "--badge-background",
318
+ badgeBorder: "--badge-border",
319
+ badgeText: "--badge-text",
320
+
321
+ // Footer
322
+ footerBackground: "--footer-background",
323
+ footerBorder: "--footer-border",
324
+ footerText: "--footer-text",
325
+ footerLink: "--footer-link",
326
+ footerLinkHover: "--footer-link-hover",
327
+
328
+ // Shadow elevation
329
+ shadowElevationLow: "--shadow-elevation-low",
330
+ shadowElevationMedium: "--shadow-elevation-medium",
331
+ shadowElevationHigh: "--shadow-elevation-high",
332
+ shadowElevationModal: "--shadow-elevation-modal",
333
+ } as const
334
+
335
+ export type TokenName = (typeof TOKEN_NAMES)[keyof typeof TOKEN_NAMES]
336
+ export type ColorTokenName = (typeof COLOR_TOKEN_NAMES)[keyof typeof COLOR_TOKEN_NAMES]
337
+
338
+ /** All canonical token names (combination of Layer 1 + Layer 2). */
339
+ export const ALL_TOKEN_NAMES = {
340
+ ...TOKEN_NAMES,
341
+ ...COLOR_TOKEN_NAMES,
342
+ } as const
343
+
344
+ /** Helper to create a `var()` reference for a canonical token. */
345
+ export function token(name: TokenName | ColorTokenName): string {
346
+ return `var(${name})`
347
+ }
348
+
349
+ /** Import the CSS entry points so bundlers pick them up automatically. */
350
+ import "./tokens.css"
351
+ import "./themes/default.css"
352
+ import "./presets/default.css"
353
+ import "./components.css"
354
+
@@ -0,0 +1,32 @@
1
+ /* ==========================================================================
2
+ @loba/design — presets/corporate.css
3
+ LAYER 3 — PERSONALITY: Professional, clear, corporate
4
+ Manrope display + Inter body
5
+ ========================================================================== */
6
+
7
+ @import url("https://fonts.googleapis.com/css2?family=Manrope:wght@300;400;500;600;700;800&family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@300;400;500;600;700;800&display=swap");
8
+
9
+ :root {
10
+ --font-family-display: "Manrope", ui-sans-serif, system-ui, sans-serif;
11
+ --font-family-body: "Inter", ui-sans-serif, system-ui, sans-serif;
12
+ --font-family-mono: "JetBrains Mono", "Fira Code", monospace;
13
+ --font-weight-light: 300;
14
+ --font-weight-regular: 400;
15
+ --font-weight-medium: 500;
16
+ --font-weight-semibold: 600;
17
+ --font-weight-bold: 700;
18
+ --font-weight-extrabold: 800;
19
+ --font-size-base: 1rem;
20
+ --space-4: 1rem;
21
+ --radius-md: 0.25rem;
22
+ --motion-duration-normal: 200ms;
23
+ --motion-ease-out: cubic-bezier(0, 0, 0.2, 1);
24
+ --motion-ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
25
+ --shadow-elevation-low: 0 1px 3px rgba(0, 0, 0, 0.12);
26
+ --glass-blur: 12px;
27
+ --button-radius: var(--radius-base);
28
+ --button-padding-x: 1.25rem;
29
+ --button-padding-y: 0.5rem;
30
+ --card-radius: var(--radius-md);
31
+ --nav-height: 4rem;
32
+ }
@@ -0,0 +1,32 @@
1
+ /* ==========================================================================
2
+ @loba/design — presets/creative.css
3
+ LAYER 3 — PERSONALITY: Bold, playful, expressive
4
+ Bricolage Grotesque display + Instrument Sans body
5
+ ========================================================================== */
6
+
7
+ @import url("https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,300;12..96,400;12..96,500;12..96,600;12..96,700;12..96,800&family=Instrument+Sans:wdth,wght@75..100,400;75..100,500;75..100,600;75..100,700&family=JetBrains+Mono:wght@300;400;500;600;700;800&display=swap");
8
+
9
+ :root {
10
+ --font-family-display: "Bricolage Grotesque", ui-sans-serif, system-ui, sans-serif;
11
+ --font-family-body: "Instrument Sans", ui-sans-serif, system-ui, sans-serif;
12
+ --font-family-mono: "JetBrains Mono", "Fira Code", monospace;
13
+ --font-weight-light: 300;
14
+ --font-weight-regular: 400;
15
+ --font-weight-medium: 500;
16
+ --font-weight-semibold: 600;
17
+ --font-weight-bold: 700;
18
+ --font-weight-extrabold: 800;
19
+ --font-size-base: 1rem;
20
+ --space-4: 1rem;
21
+ --radius-md: 0.5rem;
22
+ --motion-duration-normal: 300ms;
23
+ --motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
24
+ --motion-ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
25
+ --shadow-elevation-low: 0 2px 8px rgba(0, 0, 0, 0.15);
26
+ --glass-blur: 16px;
27
+ --button-radius: var(--radius-lg);
28
+ --button-padding-x: 1.5rem;
29
+ --button-padding-y: 0.75rem;
30
+ --card-radius: var(--radius-xl);
31
+ --nav-height: 4.5rem;
32
+ }
@@ -0,0 +1,58 @@
1
+ /* ==========================================================================
2
+ @loba/design — presets/default.css
3
+ LAYER 3 — PERSONALITY (FROZEN v1.0)
4
+
5
+ Balanced, neutral baseline — Plus Jakarta Sans for display and body.
6
+ Only personality overrides (~15 vars). Structural defaults come from
7
+ tokens.css; colors come from themes/*.css.
8
+
9
+ ✅ font families, weight/density/radius/motion/shadow anchors,
10
+ component personality
11
+ ❌ the entire spacing scale, all font sizes, all radii, colors
12
+ ========================================================================== */
13
+
14
+ /* ---- Font imports (personality-specific) ---- */
15
+ @import url("https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@200;300;400;500;600;700;800&family=JetBrains+Mono:wght@300;400;500;600;700;800&display=swap");
16
+
17
+ :root {
18
+ /* ---- Font Families ---- */
19
+ --font-family-display: "Plus Jakarta Sans", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans";
20
+ --font-family-body: "Plus Jakarta Sans", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans";
21
+ --font-family-mono: "JetBrains Mono", "Fira Code", monospace;
22
+
23
+ /* ---- Typography Personality ---- */
24
+ --font-weight-light: 300;
25
+ --font-weight-regular: 400;
26
+ --font-weight-medium: 500;
27
+ --font-weight-semibold: 600;
28
+ --font-weight-bold: 700;
29
+ --font-weight-extrabold: 800;
30
+ --font-size-base: 1rem;
31
+
32
+ /* ---- Spacing Density Anchor ---- */
33
+ --space-4: 1rem;
34
+
35
+ /* ---- Radius Anchor ---- */
36
+ --radius-md: 0.5rem;
37
+
38
+ /* ---- Motion Speed Anchor ---- */
39
+ --motion-duration-normal: 300ms;
40
+
41
+ /* ---- Motion Personality ---- */
42
+ --motion-ease-out: cubic-bezier(0, 0, 0.2, 1);
43
+ --motion-ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
44
+
45
+ /* ---- Shadow Softness Anchor ---- */
46
+ --shadow-elevation-low: 0 2px 8px rgba(0, 0, 0, 0.15);
47
+
48
+ /* ---- Glass Intensity ---- */
49
+ --glass-blur: 16px;
50
+
51
+ /* ---- Component Personality ---- */
52
+ --button-radius: var(--radius-full);
53
+ --button-padding-x: 1.5rem;
54
+ --button-padding-y: 0.75rem;
55
+ --card-radius: var(--radius-lg);
56
+ --nav-height: 4.5rem;
57
+ }
58
+
@@ -0,0 +1,32 @@
1
+ /* ==========================================================================
2
+ @loba/design — presets/editorial.css
3
+ LAYER 3 — PERSONALITY: Content-first, editorial
4
+ Fraunces display + Libre Franklin body
5
+ ========================================================================== */
6
+
7
+ @import url("https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600;9..144,700;9..144,800;9..144,900&family=Libre+Franklin:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@300;400;500;600;700;800&display=swap");
8
+
9
+ :root {
10
+ --font-family-display: "Fraunces", ui-serif, Georgia, serif;
11
+ --font-family-body: "Libre Franklin", ui-sans-serif, system-ui, sans-serif;
12
+ --font-family-mono: "JetBrains Mono", "Fira Code", monospace;
13
+ --font-weight-light: 300;
14
+ --font-weight-regular: 400;
15
+ --font-weight-medium: 500;
16
+ --font-weight-semibold: 600;
17
+ --font-weight-bold: 700;
18
+ --font-weight-extrabold: 800;
19
+ --font-size-base: 1rem;
20
+ --space-4: 1rem;
21
+ --radius-md: 0.25rem;
22
+ --motion-duration-normal: 300ms;
23
+ --motion-ease-out: cubic-bezier(0, 0, 0.2, 1);
24
+ --motion-ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
25
+ --shadow-elevation-low: 0 2px 8px rgba(0, 0, 0, 0.15);
26
+ --glass-blur: 16px;
27
+ --button-radius: var(--radius-sm);
28
+ --button-padding-x: 1.25rem;
29
+ --button-padding-y: 0.625rem;
30
+ --card-radius: var(--radius-base);
31
+ --nav-height: 4rem;
32
+ }
@@ -0,0 +1,32 @@
1
+ /* ==========================================================================
2
+ @loba/design — presets/fashion.css
3
+ LAYER 3 — PERSONALITY: Elegant, high-fashion editorial
4
+ Josefin Sans display + Cormorant Garamond body
5
+ ========================================================================== */
6
+
7
+ @import url("https://fonts.googleapis.com/css2?family=Josefin+Sans:wght@100;200;300;400;500;600;700&family=Cormorant+Garamond:wght@300;400;500;600;700&family=JetBrains+Mono:wght@300;400;500;600;700;800&display=swap");
8
+
9
+ :root {
10
+ --font-family-display: "Josefin Sans", ui-sans-serif, system-ui, sans-serif;
11
+ --font-family-body: "Cormorant Garamond", ui-serif, Georgia, serif;
12
+ --font-family-mono: "JetBrains Mono", "Fira Code", monospace;
13
+ --font-weight-light: 200;
14
+ --font-weight-regular: 400;
15
+ --font-weight-medium: 500;
16
+ --font-weight-semibold: 600;
17
+ --font-weight-bold: 700;
18
+ --font-weight-extrabold: 800;
19
+ --font-size-base: 1rem;
20
+ --space-4: 1rem;
21
+ --radius-md: 0.25rem;
22
+ --motion-duration-normal: 400ms;
23
+ --motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
24
+ --motion-ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
25
+ --shadow-elevation-low: 0 2px 8px rgba(0, 0, 0, 0.15);
26
+ --glass-blur: 20px;
27
+ --button-radius: var(--radius-sm);
28
+ --button-padding-x: 1.5rem;
29
+ --button-padding-y: 0.75rem;
30
+ --card-radius: var(--radius-base);
31
+ --nav-height: 4.5rem;
32
+ }
@@ -0,0 +1,32 @@
1
+ /* ==========================================================================
2
+ @loba/design — presets/friendly.css
3
+ LAYER 3 — PERSONALITY: Warm, approachable
4
+ Quicksand display + Plus Jakarta Sans body
5
+ ========================================================================== */
6
+
7
+ @import url("https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;600;700&family=Plus+Jakarta+Sans:wght@200;300;400;500;600;700;800&family=JetBrains+Mono:wght@300;400;500;600;700;800&display=swap");
8
+
9
+ :root {
10
+ --font-family-display: "Quicksand", ui-sans-serif, system-ui, sans-serif;
11
+ --font-family-body: "Plus Jakarta Sans", ui-sans-serif, system-ui, sans-serif;
12
+ --font-family-mono: "JetBrains Mono", "Fira Code", monospace;
13
+ --font-weight-light: 300;
14
+ --font-weight-regular: 400;
15
+ --font-weight-medium: 500;
16
+ --font-weight-semibold: 600;
17
+ --font-weight-bold: 700;
18
+ --font-weight-extrabold: 800;
19
+ --font-size-base: 1rem;
20
+ --space-4: 1rem;
21
+ --radius-md: 0.75rem;
22
+ --motion-duration-normal: 350ms;
23
+ --motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
24
+ --motion-ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
25
+ --shadow-elevation-low: 0 2px 8px rgba(0, 0, 0, 0.15);
26
+ --glass-blur: 16px;
27
+ --button-radius: var(--radius-full);
28
+ --button-padding-x: 1.5rem;
29
+ --button-padding-y: 0.75rem;
30
+ --card-radius: var(--radius-xl);
31
+ --nav-height: 4.5rem;
32
+ }
@@ -0,0 +1,32 @@
1
+ /* ==========================================================================
2
+ @loba/design — presets/future.css
3
+ LAYER 3 — PERSONALITY: Sleek, geometric, forward-thinking
4
+ Saira display + Rubik body
5
+ ========================================================================== */
6
+
7
+ @import url("https://fonts.googleapis.com/css2?family=Saira:wght@300;400;500;600;700;800;900&family=Rubik:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@300;400;500;600;700;800&display=swap");
8
+
9
+ :root {
10
+ --font-family-display: "Saira", ui-sans-serif, system-ui, sans-serif;
11
+ --font-family-body: "Rubik", ui-sans-serif, system-ui, sans-serif;
12
+ --font-family-mono: "JetBrains Mono", "Fira Code", monospace;
13
+ --font-weight-light: 300;
14
+ --font-weight-regular: 400;
15
+ --font-weight-medium: 500;
16
+ --font-weight-semibold: 600;
17
+ --font-weight-bold: 700;
18
+ --font-weight-extrabold: 800;
19
+ --font-size-base: 1rem;
20
+ --space-4: 1rem;
21
+ --radius-md: 0.5rem;
22
+ --motion-duration-normal: 250ms;
23
+ --motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
24
+ --motion-ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
25
+ --shadow-elevation-low: 0 2px 8px rgba(0, 0, 0, 0.15);
26
+ --glass-blur: 16px;
27
+ --button-radius: var(--radius-md);
28
+ --button-padding-x: 1.5rem;
29
+ --button-padding-y: 0.75rem;
30
+ --card-radius: var(--radius-lg);
31
+ --nav-height: 4.5rem;
32
+ }
@@ -0,0 +1,32 @@
1
+ /* ==========================================================================
2
+ @loba/design — presets/industrial.css
3
+ LAYER 3 — PERSONALITY: Bold, condensed, industrial strength
4
+ Oswald display + Ubuntu body
5
+ ========================================================================== */
6
+
7
+ @import url("https://fonts.googleapis.com/css2?family=Oswald:wght@300;400;500;600;700&family=Ubuntu:wght@300;400;500;700&family=JetBrains+Mono:wght@300;400;500;600;700;800&display=swap");
8
+
9
+ :root {
10
+ --font-family-display: "Oswald", ui-sans-serif, system-ui, sans-serif;
11
+ --font-family-body: "Ubuntu", ui-sans-serif, system-ui, sans-serif;
12
+ --font-family-mono: "JetBrains Mono", "Fira Code", monospace;
13
+ --font-weight-light: 300;
14
+ --font-weight-regular: 400;
15
+ --font-weight-medium: 500;
16
+ --font-weight-semibold: 600;
17
+ --font-weight-bold: 700;
18
+ --font-weight-extrabold: 800;
19
+ --font-size-base: 1rem;
20
+ --space-4: 1rem;
21
+ --radius-md: 0.25rem;
22
+ --motion-duration-normal: 200ms;
23
+ --motion-ease-out: cubic-bezier(0, 0, 0.2, 1);
24
+ --motion-ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
25
+ --shadow-elevation-low: 0 2px 8px rgba(0, 0, 0, 0.15);
26
+ --glass-blur: 12px;
27
+ --button-radius: var(--radius-base);
28
+ --button-padding-x: 1.5rem;
29
+ --button-padding-y: 0.625rem;
30
+ --card-radius: var(--radius-md);
31
+ --nav-height: 4.5rem;
32
+ }