@almadar/shell-web 0.0.0-stage → 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/bundling.d.mts +18 -0
- package/bundling.mjs +28 -0
- package/dist/ArbitraryClassCompiler-Mzabq-UB.d.ts +100 -0
- package/dist/AvlGlyph-JKJOAH23.js +6 -0
- package/dist/AvlStateMachine-PI4YGREK.js +8 -0
- package/dist/AvlTransitionDetail-ZH7V24UG.js +12 -0
- package/dist/AvlTransitionExplainer-ZSRT7L6Y.js +13 -0
- package/dist/BehaviorValueFrame-6RUJXT4A.js +29 -0
- package/dist/BehaviorValueFrame-SSEMEBTG.css +1756 -0
- package/dist/BehaviorView-RFEE5J6E.js +10 -0
- package/dist/Canvas3DHost-_Y-5uLM_.d.ts +552 -0
- package/dist/EventBusProvider-CVwjkV_2.d.ts +284 -0
- package/dist/FileTree-BCFnBEuQ.d.ts +254 -0
- package/dist/FlowCanvas-3JRMNJLV.css +1756 -0
- package/dist/FlowCanvas-STDC4OWK.js +27 -0
- package/dist/GameAudioProvider-Cm9BnvmP.d.ts +93 -0
- package/dist/KaTeX_AMS-Regular-CYEKBG2K.woff +0 -0
- package/dist/KaTeX_AMS-Regular-JKX5W2C4.ttf +0 -0
- package/dist/KaTeX_AMS-Regular-U6PRYMIZ.woff2 +0 -0
- package/dist/KaTeX_Caligraphic-Bold-5QL5CMTE.woff2 +0 -0
- package/dist/KaTeX_Caligraphic-Bold-WZ3QSGD3.woff +0 -0
- package/dist/KaTeX_Caligraphic-Bold-ZTS3R3HK.ttf +0 -0
- package/dist/KaTeX_Caligraphic-Regular-3LKEU76G.woff +0 -0
- package/dist/KaTeX_Caligraphic-Regular-A7XRTZ5Q.ttf +0 -0
- package/dist/KaTeX_Caligraphic-Regular-KX5MEWCF.woff2 +0 -0
- package/dist/KaTeX_Fraktur-Bold-2QVFK6NQ.woff2 +0 -0
- package/dist/KaTeX_Fraktur-Bold-T4SWXBMT.woff +0 -0
- package/dist/KaTeX_Fraktur-Bold-WGHVTYOR.ttf +0 -0
- package/dist/KaTeX_Fraktur-Regular-2PEIFJSJ.woff2 +0 -0
- package/dist/KaTeX_Fraktur-Regular-5U4OPH2X.ttf +0 -0
- package/dist/KaTeX_Fraktur-Regular-PQMHCIK6.woff +0 -0
- package/dist/KaTeX_Main-Bold-2GA4IZIN.woff +0 -0
- package/dist/KaTeX_Main-Bold-W5FBVCZM.ttf +0 -0
- package/dist/KaTeX_Main-Bold-YP5VVQRP.woff2 +0 -0
- package/dist/KaTeX_Main-BoldItalic-4P4C7HJH.woff +0 -0
- package/dist/KaTeX_Main-BoldItalic-N4V3DX7S.woff2 +0 -0
- package/dist/KaTeX_Main-BoldItalic-ODMLBJJQ.ttf +0 -0
- package/dist/KaTeX_Main-Italic-I43T2HSR.ttf +0 -0
- package/dist/KaTeX_Main-Italic-RELBIK7M.woff2 +0 -0
- package/dist/KaTeX_Main-Italic-SASNQFN2.woff +0 -0
- package/dist/KaTeX_Main-Regular-ARRPAO67.woff2 +0 -0
- package/dist/KaTeX_Main-Regular-P5I74A2A.woff +0 -0
- package/dist/KaTeX_Main-Regular-W74P5G27.ttf +0 -0
- package/dist/KaTeX_Math-BoldItalic-6EBV3DK5.woff +0 -0
- package/dist/KaTeX_Math-BoldItalic-K4WTGH3J.woff2 +0 -0
- package/dist/KaTeX_Math-BoldItalic-VB447A4D.ttf +0 -0
- package/dist/KaTeX_Math-Italic-6KGCHLFN.woff2 +0 -0
- package/dist/KaTeX_Math-Italic-KKK3USB2.woff +0 -0
- package/dist/KaTeX_Math-Italic-SON4MRCA.ttf +0 -0
- package/dist/KaTeX_SansSerif-Bold-RRNVJFFW.woff2 +0 -0
- package/dist/KaTeX_SansSerif-Bold-STQ6RXC7.ttf +0 -0
- package/dist/KaTeX_SansSerif-Bold-X5M5EMOD.woff +0 -0
- package/dist/KaTeX_SansSerif-Italic-HMPFTM52.woff2 +0 -0
- package/dist/KaTeX_SansSerif-Italic-PSN4QKYX.woff +0 -0
- package/dist/KaTeX_SansSerif-Italic-WTBAZBGY.ttf +0 -0
- package/dist/KaTeX_SansSerif-Regular-2TL3USAE.ttf +0 -0
- package/dist/KaTeX_SansSerif-Regular-OQCII6EP.woff +0 -0
- package/dist/KaTeX_SansSerif-Regular-XIQ62X4E.woff2 +0 -0
- package/dist/KaTeX_Script-Regular-72OLXYNA.ttf +0 -0
- package/dist/KaTeX_Script-Regular-A5IFOEBS.woff +0 -0
- package/dist/KaTeX_Script-Regular-APUWIHLP.woff2 +0 -0
- package/dist/KaTeX_Size1-Regular-4HRHTS65.woff +0 -0
- package/dist/KaTeX_Size1-Regular-5LRUTBFT.woff2 +0 -0
- package/dist/KaTeX_Size1-Regular-7K6AASVL.ttf +0 -0
- package/dist/KaTeX_Size2-Regular-222HN3GT.ttf +0 -0
- package/dist/KaTeX_Size2-Regular-K5ZHAIS6.woff +0 -0
- package/dist/KaTeX_Size2-Regular-LELKET5D.woff2 +0 -0
- package/dist/KaTeX_Size3-Regular-TLFPAHDE.woff +0 -0
- package/dist/KaTeX_Size3-Regular-UFCO6WCA.ttf +0 -0
- package/dist/KaTeX_Size3-Regular-WQRQ47UD.woff2 +0 -0
- package/dist/KaTeX_Size4-Regular-7PGNVPQK.ttf +0 -0
- package/dist/KaTeX_Size4-Regular-CDMV7U5C.woff2 +0 -0
- package/dist/KaTeX_Size4-Regular-PKMWZHNC.woff +0 -0
- package/dist/KaTeX_Typewriter-Regular-3F5K6SQ6.ttf +0 -0
- package/dist/KaTeX_Typewriter-Regular-MJMFSK64.woff +0 -0
- package/dist/KaTeX_Typewriter-Regular-VBYJ4NRC.woff2 +0 -0
- package/dist/KernelEngineContext-BOCQoFwk.d.ts +43 -0
- package/dist/LayersPanel-BBQ54IVG.js +7 -0
- package/dist/ModuleCard-3TT2X7IW.js +7 -0
- package/dist/OrbInspector-K6T6O7GI.js +27 -0
- package/dist/OrbInspector-MHLJ6OEE.css +1756 -0
- package/dist/Select-mDZIwNqN.d.ts +199 -0
- package/dist/ServerBridge-Cm1On51b.d.ts +233 -0
- package/dist/ThemeContext-DJmO59xd.d.ts +147 -0
- package/dist/TraitValueFrame-2PJGLLVI.js +28 -0
- package/dist/TraitValueFrame-4G3KOUBR.css +1756 -0
- package/dist/UISlotContext-Dl_ewwCI.d.ts +79 -0
- package/dist/UISlotRenderer-JKFSX24W.js +27 -0
- package/dist/UISlotRenderer-KVFO6J7R.css +1756 -0
- package/dist/UserContext-DqWeZkUZ.d.ts +100 -0
- package/dist/auth/browser/index.d.ts +2 -0
- package/dist/auth/browser/index.js +1 -0
- package/dist/auth/react/index.d.ts +49 -0
- package/dist/auth/react/index.js +119 -0
- package/dist/avl/index.css +1756 -0
- package/dist/avl/index.d.ts +2238 -0
- package/dist/avl/index.js +2693 -0
- package/dist/avl-3d-context-BIRKWpaL.d.ts +204 -0
- package/dist/avl-schema-parser-CtJxJ9KU.d.ts +132 -0
- package/dist/avl-zoom-state-CKMVuBFg.d.ts +17 -0
- package/dist/chunk-2PY54Z44.js +227 -0
- package/dist/chunk-2QOH2HWM.js +95 -0
- package/dist/chunk-3BBUBJFF.js +339 -0
- package/dist/chunk-42FY4RYA.js +191 -0
- package/dist/chunk-5QTYQTPS.js +15 -0
- package/dist/chunk-6P3MWXYE.js +440 -0
- package/dist/chunk-73SRAB4P.js +1053 -0
- package/dist/chunk-A2LR6VQQ.js +349 -0
- package/dist/chunk-AILY3XPS.js +562 -0
- package/dist/chunk-B4BU77LT.js +432 -0
- package/dist/chunk-DFNZUYX4.js +378 -0
- package/dist/chunk-DJ433ET5.js +1327 -0
- package/dist/chunk-DLZF4PVE.js +24 -0
- package/dist/chunk-DYEKAA4L.js +787 -0
- package/dist/chunk-DZ42OJQC.js +176 -0
- package/dist/chunk-EOWMARUB.js +16 -0
- package/dist/chunk-EQAMU2ZC.js +14 -0
- package/dist/chunk-FAJDTHWC.js +98 -0
- package/dist/chunk-FIW6WN23.js +508 -0
- package/dist/chunk-FP3WIKTC.js +303 -0
- package/dist/chunk-G7DCAZ22.js +19 -0
- package/dist/chunk-GAR5TQ5B.js +199 -0
- package/dist/chunk-GKIFONTE.js +131 -0
- package/dist/chunk-GYTPOFVC.js +47155 -0
- package/dist/chunk-KVQS4GXU.js +328 -0
- package/dist/chunk-L2DEKY4J.js +97 -0
- package/dist/chunk-L677XGY3.js +701 -0
- package/dist/chunk-MBQAMMSE.js +11877 -0
- package/dist/chunk-P4LNHAFI.js +1051 -0
- package/dist/chunk-P4ZFUQFF.js +93 -0
- package/dist/chunk-PC7K4SK7.js +1384 -0
- package/dist/chunk-R5O5AUPI.js +573 -0
- package/dist/chunk-SGM3FASH.js +672 -0
- package/dist/chunk-SJGJJKBY.js +502 -0
- package/dist/chunk-TESBIVUA.js +11 -0
- package/dist/chunk-TZZBINQY.js +82 -0
- package/dist/chunk-U6QRZASX.js +280 -0
- package/dist/chunk-VFF5OO47.js +319 -0
- package/dist/chunk-YDNJLLG6.js +516 -0
- package/dist/chunk-YHMRX6YA.js +455 -0
- package/dist/chunk-ZO6MXAS3.js +69 -0
- package/dist/components/index.css +1756 -0
- package/dist/components/index.d.ts +11093 -0
- package/dist/components/index.js +1110 -0
- package/dist/context/index.d.ts +9 -0
- package/dist/context/index.js +7 -0
- package/dist/core.d.ts +2523 -0
- package/dist/core.js +2 -0
- package/dist/design-classes/index.cjs +429 -0
- package/dist/design-classes/index.d.cts +165 -0
- package/dist/design-classes/index.d.ts +165 -0
- package/dist/design-classes/index.js +397 -0
- package/dist/emojiItems-QGSNAABW.js +20 -0
- package/dist/fx-CmQjnHmT.d.ts +371 -0
- package/dist/hooks/index.d.ts +936 -0
- package/dist/hooks/index.js +7 -0
- package/dist/index.d.ts +486 -0
- package/dist/index.js +38 -0
- package/dist/katexPlugin-FA7NX4PE.css +1161 -0
- package/dist/katexPlugin-NCDKOOQY.js +2 -0
- package/dist/kernel-client-ZH4PSMCN.js +367 -0
- package/dist/kernel-wire-B4S8pnP3.d.ts +65 -0
- package/dist/lib/index.d.ts +602 -0
- package/dist/lib/index.js +1288 -0
- package/dist/paintDispatch-ChW5mVuK.d.ts +698 -0
- package/dist/parseLessonSegments-GpCeMrb2.d.ts +334 -0
- package/dist/perf-CKiBKbkw.d.ts +22 -0
- package/dist/perf-Dr28-AgT.d.ts +57 -0
- package/dist/prism-AIWGN2X5.js +134 -0
- package/dist/providers/index.css +1756 -0
- package/dist/providers/index.d.ts +340 -0
- package/dist/providers/index.js +30 -0
- package/dist/renderer/index.d.ts +467 -0
- package/dist/renderer/index.js +3 -0
- package/dist/runtime/index.css +1756 -0
- package/dist/runtime/index.d.ts +440 -0
- package/dist/runtime/index.js +31 -0
- package/dist/slot-host-CPzrxLo9.d.ts +48 -0
- package/dist/ssr/index.cjs +7631 -0
- package/dist/ssr/index.d.cts +487 -0
- package/dist/ssr/index.d.ts +487 -0
- package/dist/ssr/index.js +7599 -0
- package/dist/storage/browser/index.d.ts +1 -0
- package/dist/storage/browser/index.js +1 -0
- package/dist/test-support.d.ts +35 -0
- package/dist/test-support.js +114 -0
- package/dist/themeTokens-CRd8AEDF.d.ts +125 -0
- package/dist/three/index.css +503 -0
- package/dist/three/index.d.ts +1185 -0
- package/dist/three/index.js +3896 -0
- package/dist/useKeyboardRouter-Dsq553Ur.d.ts +42 -0
- package/dist/useUISlots-CiobNFGb.d.ts +211 -0
- package/dist/verification-C5pTeMJv.d.ts +66 -0
- package/dist/verificationRegistry-CabxhfTv.d.ts +122 -0
- package/dist/wrapCallbackForEvent-B9QLbhxX.d.ts +19 -0
- package/index.css +199 -0
- package/package.json +269 -3
- package/src/core/locales/ar.json +1263 -0
- package/src/core/locales/en.json +1263 -0
- package/src/core/locales/index.ts +54 -0
- package/src/core/locales/sl.json +1263 -0
- package/src/core/tokens/native-tokens.json +369 -0
- package/tailwind-compile.cjs +29 -0
- package/tailwind-preset.cjs +991 -0
- package/themes/_base.css +451 -0
- package/themes/_contract.md +307 -0
- package/themes/_fonts-kenney.css +11 -0
- package/themes/_fonts.css +12 -0
- package/themes/_foundation.css +105 -0
- package/themes/_head.css +22 -0
- package/themes/_presets.css +67 -0
- package/themes/almadar-heritage.css +455 -0
- package/themes/almadar-website.css +269 -0
- package/themes/almadar.css +269 -0
- package/themes/aqua.css +455 -0
- package/themes/arabesque.css +459 -0
- package/themes/art-deco.css +457 -0
- package/themes/art-nouveau.css +459 -0
- package/themes/atelier.css +463 -0
- package/themes/bauhaus.css +461 -0
- package/themes/bloomberg-dense.css +463 -0
- package/themes/blueprint.css +457 -0
- package/themes/clay.css +449 -0
- package/themes/comic.css +453 -0
- package/themes/constructivist.css +457 -0
- package/themes/corporate.css +449 -0
- package/themes/cyberpunk.css +453 -0
- package/themes/frutiger-aero.css +458 -0
- package/themes/game-adventure.css +201 -0
- package/themes/game-rpg.css +203 -0
- package/themes/game-sci-fi.css +201 -0
- package/themes/game-ui-pack.css +200 -0
- package/themes/gazette.css +449 -0
- package/themes/glass.css +457 -0
- package/themes/gothic.css +453 -0
- package/themes/index.css +21 -0
- package/themes/ink-wash.css +459 -0
- package/themes/kawaii.css +459 -0
- package/themes/kflow.css +310 -0
- package/themes/kiosk.css +449 -0
- package/themes/linear-clean.css +463 -0
- package/themes/luxury.css +451 -0
- package/themes/mac-classic.css +455 -0
- package/themes/material.css +463 -0
- package/themes/memphis.css +453 -0
- package/themes/mid-century.css +455 -0
- package/themes/minimalist.css +449 -0
- package/themes/mudcloth.css +459 -0
- package/themes/nata.css +310 -0
- package/themes/neon.css +453 -0
- package/themes/neumorphic.css +451 -0
- package/themes/newsprint.css +455 -0
- package/themes/notion-editorial.css +463 -0
- package/themes/orb.css +465 -0
- package/themes/pixel.css +449 -0
- package/themes/prism.css +309 -0
- package/themes/rawi.css +310 -0
- package/themes/retro.css +452 -0
- package/themes/risograph.css +463 -0
- package/themes/scandi.css +469 -0
- package/themes/sketch.css +455 -0
- package/themes/solarpunk.css +469 -0
- package/themes/steampunk.css +451 -0
- package/themes/swiss.css +455 -0
- package/themes/terminal.css +466 -0
- package/themes/trait-wars.css +487 -0
- package/themes/ukiyo-e.css +459 -0
- package/themes/vaporwave.css +455 -0
- package/themes/victorian.css +453 -0
- package/themes/wabi-sabi.css +459 -0
- package/themes/win95.css +455 -0
- package/themes/wireframe.css +439 -0
- package/themes/zine.css +455 -0
- package/README.md +0 -3
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
# Theme CSS Variable Contract
|
|
2
|
+
|
|
3
|
+
> Reference: `docs/Almadar_Std_Variations.md` §2 (Skin layer).
|
|
4
|
+
> Type counterpart: `@almadar/core` exports `ThemeTokens` with typed sub-interfaces — `DensityTokens`, `TypeScaleTokens`, `MotionTokens`, `IconographyTokens`, `ElevationTokens`, `GeometryTokens`.
|
|
5
|
+
> This file is **not loaded at runtime**. It is the authoritative reference both for theme authors and for the `_defaults.css` fallback layer in `themes/index.css`.
|
|
6
|
+
|
|
7
|
+
CSS custom properties are the runtime source of truth — every `@almadar/ui` component reads from these variables via Tailwind utility classes (mapped in `tailwind-preset.cjs`). A theme that omits a variable inherits a deterministic fallback from the `:root` block declared in `themes/index.css`; the fallbacks are calibrated to preserve the visual baseline of the 18 pre-Layer-1 themes.
|
|
8
|
+
|
|
9
|
+
A "truly unique" theme overrides variables across **all** axes below — not just `--color-*`. Two themes that diverge only on color will feel like the same product in two paint jobs.
|
|
10
|
+
|
|
11
|
+
## Existing variables (preserved unchanged)
|
|
12
|
+
|
|
13
|
+
These were defined by every pre-Layer-1 theme and continue to be the canonical paint surface. Backfill agents MUST NOT change existing values; they only append the new axis variables below.
|
|
14
|
+
|
|
15
|
+
### Color
|
|
16
|
+
`--color-primary`, `--color-primary-hover`, `--color-primary-foreground`,
|
|
17
|
+
`--color-secondary`, `--color-secondary-hover`, `--color-secondary-foreground`,
|
|
18
|
+
`--color-accent`, `--color-accent-foreground`,
|
|
19
|
+
`--color-muted`, `--color-muted-foreground`,
|
|
20
|
+
`--color-background`, `--color-foreground`,
|
|
21
|
+
`--color-card`, `--color-card-foreground`,
|
|
22
|
+
`--color-surface`, `--color-border`, `--color-input`, `--color-ring`,
|
|
23
|
+
`--color-error`, `--color-error-foreground`,
|
|
24
|
+
`--color-success`, `--color-success-foreground`,
|
|
25
|
+
`--color-warning`, `--color-warning-foreground`,
|
|
26
|
+
`--color-info`, `--color-info-foreground`.
|
|
27
|
+
|
|
28
|
+
Optional table-specific (defined by some themes, fall back to neutrals when absent): `--color-table-header`, `--color-table-border`, `--color-table-row-hover`, `--color-surface-hover`, `--color-border-hover`, `--color-placeholder`.
|
|
29
|
+
|
|
30
|
+
### Radius (existing — Geometry axis below adds intent overlay)
|
|
31
|
+
`--radius-none`, `--radius-sm`, `--radius-md`, `--radius-lg`, `--radius-xl`, `--radius-full`.
|
|
32
|
+
|
|
33
|
+
### Border width (existing — Geometry axis adds intent overlay)
|
|
34
|
+
`--border-width`, `--border-width-thin`, `--border-width-thick`.
|
|
35
|
+
|
|
36
|
+
### Shadow (existing — Elevation axis adds intent overlay)
|
|
37
|
+
`--shadow-none`, `--shadow-sm`, `--shadow-main`, `--shadow-lg`, `--shadow-inner`, `--shadow-hover`, `--shadow-active`.
|
|
38
|
+
|
|
39
|
+
### Typography (existing — TypeScale axis adds family triplet + scale)
|
|
40
|
+
`--font-family`, `--font-weight-normal`, `--font-weight-medium`, `--font-weight-bold`, `--line-height`, `--letter-spacing`.
|
|
41
|
+
|
|
42
|
+
### Icon (existing — Iconography axis adds family selector)
|
|
43
|
+
`--icon-stroke-width`, `--icon-color`.
|
|
44
|
+
|
|
45
|
+
### Transitions (existing — Motion axis adds named palette)
|
|
46
|
+
`--transition-fast`, `--transition-normal`, `--transition-slow`, `--transition-timing`.
|
|
47
|
+
|
|
48
|
+
### Interaction (existing)
|
|
49
|
+
`--hover-scale`, `--hover-translate-y`, `--hover-translate-x`,
|
|
50
|
+
`--active-scale`, `--active-translate-y`,
|
|
51
|
+
`--focus-ring-width`, `--focus-ring-offset`, `--focus-ring-color`.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## New variables (added in Layer 1)
|
|
56
|
+
|
|
57
|
+
Every theme — backfilled or new — defines the variables below. The defaults column shows what the `_defaults.css` `:root` block declares; backfill agents copy these into each existing theme block so post-migration visual output stays identical. New-theme authors override per their personality brief.
|
|
58
|
+
|
|
59
|
+
### Density axis — `--space-*` scale + per-element heights/paddings
|
|
60
|
+
|
|
61
|
+
Spacing scale (12 steps; current Tailwind defaults shown to preserve `p-3 / p-4 / p-6` parity):
|
|
62
|
+
|
|
63
|
+
| Variable | Default | Tailwind equivalent |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| `--space-0` | `0px` | `0` |
|
|
66
|
+
| `--space-1` | `4px` | `1` |
|
|
67
|
+
| `--space-2` | `8px` | `2` |
|
|
68
|
+
| `--space-3` | `12px` | `3` |
|
|
69
|
+
| `--space-4` | `16px` | `4` |
|
|
70
|
+
| `--space-5` | `20px` | `5` |
|
|
71
|
+
| `--space-6` | `24px` | `6` |
|
|
72
|
+
| `--space-7` | `28px` | `7` |
|
|
73
|
+
| `--space-8` | `32px` | `8` |
|
|
74
|
+
| `--space-9` | `36px` | `9` |
|
|
75
|
+
| `--space-10` | `40px` | `10` |
|
|
76
|
+
| `--space-11` | `44px` | `11` |
|
|
77
|
+
| `--space-12` | `48px` | `12` |
|
|
78
|
+
|
|
79
|
+
Per-element heights:
|
|
80
|
+
|
|
81
|
+
| Variable | Default | Used by |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| `--button-height-sm` | `28px` | Button size="sm" |
|
|
84
|
+
| `--button-height-md` | `36px` | Button size="md" |
|
|
85
|
+
| `--button-height-lg` | `44px` | Button size="lg" |
|
|
86
|
+
| `--input-height-sm` | `28px` | Input size="sm" |
|
|
87
|
+
| `--input-height-md` | `36px` | Input size="md" |
|
|
88
|
+
| `--input-height-lg` | `44px` | Input size="lg" |
|
|
89
|
+
| `--row-height-compact` | `32px` | Table dense rows |
|
|
90
|
+
| `--row-height-normal` | `40px` | Table default rows |
|
|
91
|
+
| `--row-height-spacious` | `48px` | Table comfortable rows |
|
|
92
|
+
|
|
93
|
+
Per-element padding:
|
|
94
|
+
|
|
95
|
+
| Variable | Default | Used by |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| `--card-padding-sm` | `12px` | Card padding="sm" (matches `p-3`) |
|
|
98
|
+
| `--card-padding-md` | `16px` | Card padding="md" (matches `p-4`) |
|
|
99
|
+
| `--card-padding-lg` | `24px` | Card padding="lg" (matches `p-6`) |
|
|
100
|
+
| `--dialog-padding` | `24px` | Dialog body |
|
|
101
|
+
| `--section-gap` | `32px` | Section-to-section vertical rhythm |
|
|
102
|
+
|
|
103
|
+
### Type axis — family triplet + scale + intent mapping
|
|
104
|
+
|
|
105
|
+
Family slots (the existing `--font-family` aliases to `--font-family-body` for backward compat):
|
|
106
|
+
|
|
107
|
+
| Variable | Default |
|
|
108
|
+
|---|---|
|
|
109
|
+
| `--font-family-display` | `var(--font-family)` |
|
|
110
|
+
| `--font-family-body` | `var(--font-family)` |
|
|
111
|
+
| `--font-family-mono` | `ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace` |
|
|
112
|
+
|
|
113
|
+
Size scale + paired line-heights (defaults match Tailwind's default `text-*` scale so existing `text-sm` resolves to identical px):
|
|
114
|
+
|
|
115
|
+
| Size key | `--text-*` default | `--leading-*` default |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| `xs` | `12px` | `16px` |
|
|
118
|
+
| `sm` | `14px` | `20px` |
|
|
119
|
+
| `base` | `16px` | `24px` |
|
|
120
|
+
| `lg` | `18px` | `28px` |
|
|
121
|
+
| `xl` | `20px` | `28px` |
|
|
122
|
+
| `2xl` | `24px` | `32px` |
|
|
123
|
+
| `3xl` | `30px` | `36px` |
|
|
124
|
+
| `4xl` | `36px` | `40px` |
|
|
125
|
+
| `display-1` | `48px` | `52px` |
|
|
126
|
+
| `display-2` | `60px` | `64px` |
|
|
127
|
+
|
|
128
|
+
Intent mapping — three vars per intent (`size`, `weight`, `leading`). Defaults are calibrated against current component usage (Card title `text-lg` → `heading-major`; subtitle `text-sm` muted → `caption`):
|
|
129
|
+
|
|
130
|
+
| Intent | `--intent-*-size` | `--intent-*-weight` | `--intent-*-leading` |
|
|
131
|
+
|---|---|---|---|
|
|
132
|
+
| `heading-major` | `var(--text-2xl)` | `var(--font-weight-bold)` | `var(--leading-2xl)` |
|
|
133
|
+
| `heading-minor` | `var(--text-lg)` | `var(--font-weight-bold)` | `var(--leading-lg)` |
|
|
134
|
+
| `body-emphasis` | `var(--text-base)` | `var(--font-weight-medium)` | `var(--leading-base)` |
|
|
135
|
+
| `body-default` | `var(--text-sm)` | `var(--font-weight-normal)` | `var(--leading-sm)` |
|
|
136
|
+
| `body-quiet` | `var(--text-sm)` | `var(--font-weight-normal)` | `var(--leading-sm)` |
|
|
137
|
+
| `caption` | `var(--text-xs)` | `var(--font-weight-normal)` | `var(--leading-xs)` |
|
|
138
|
+
| `numeric` | `var(--text-sm)` | `var(--font-weight-medium)` | `var(--leading-sm)` |
|
|
139
|
+
|
|
140
|
+
### Motion axis — duration palette + easing palette
|
|
141
|
+
|
|
142
|
+
Duration palette (existing `--transition-fast/normal/slow` alias to `--duration-fast/normal/slow`):
|
|
143
|
+
|
|
144
|
+
| Variable | Default |
|
|
145
|
+
|---|---|
|
|
146
|
+
| `--duration-instant` | `0ms` |
|
|
147
|
+
| `--duration-fast` | `var(--transition-fast)` |
|
|
148
|
+
| `--duration-normal` | `var(--transition-normal)` |
|
|
149
|
+
| `--duration-slow` | `var(--transition-slow)` |
|
|
150
|
+
| `--duration-dramatic` | `600ms` |
|
|
151
|
+
|
|
152
|
+
Easing palette (existing `--transition-timing` aliases to `--easing-standard`):
|
|
153
|
+
|
|
154
|
+
| Variable | Default |
|
|
155
|
+
|---|---|
|
|
156
|
+
| `--easing-linear` | `linear` |
|
|
157
|
+
| `--easing-standard` | `var(--transition-timing)` |
|
|
158
|
+
| `--easing-emphasized` | `cubic-bezier(0.2, 0, 0, 1)` |
|
|
159
|
+
| `--easing-spring` | `cubic-bezier(0.34, 1.56, 0.64, 1)` |
|
|
160
|
+
|
|
161
|
+
**Master toggle:** `--motion-enable` (`on` \| `off`, default `on`). Set `off` to collapse every
|
|
162
|
+
motion to instant — the programmatic opt-out (independent of `prefers-reduced-motion`, which the
|
|
163
|
+
base layer also honours globally).
|
|
164
|
+
|
|
165
|
+
### Motion axis — keyframe endpoints (surface shapes)
|
|
166
|
+
|
|
167
|
+
Every animated surface has enter + exit endpoints so `<Presence>` (the one enter/leave primitive)
|
|
168
|
+
can animate both directions. Override these in a theme block to restyle the *shape*; duration &
|
|
169
|
+
easing still come from the palettes above.
|
|
170
|
+
|
|
171
|
+
| Surface | Endpoints (enter/exit) | Default shape |
|
|
172
|
+
|---|---|---|
|
|
173
|
+
| overlay | `--motion-overlay-enter-from-opacity`, `--motion-overlay-exit-to-opacity` | fade |
|
|
174
|
+
| modal | `--motion-modal-{enter,exit}-{from,to}-{opacity,transform}` | scale .96 + translateY(8px) + fade |
|
|
175
|
+
| slide-up | `--motion-slide-up-from-{opacity,transform}` | translateY(16px) + fade |
|
|
176
|
+
| drawer | `--motion-drawer-{enter,exit}-{from,to}-{opacity,transform}` + `--motion-drawer-sign` (1 / -1) | horizontal slide by side |
|
|
177
|
+
| popover | `--motion-popover-{enter,exit}-{from,to}-{opacity,transform}` | scale .95 + fade |
|
|
178
|
+
| toast | `--motion-toast-{enter,exit}-{from,to}-{opacity,transform}` | translateY(16px) + fade |
|
|
179
|
+
| fade | `--motion-fade-{enter,exit}-{from,to}-opacity` | opacity only |
|
|
180
|
+
| page | `--motion-page-{enter,exit}-{from,to}-{opacity,transform}` | translateY(±8px) + fade |
|
|
181
|
+
|
|
182
|
+
These back the preset utilities `animate-<surface>-in` / `animate-<surface>-out`. A reduced-motion
|
|
183
|
+
user (`@media (prefers-reduced-motion: reduce)`, declared once in `_base.css`) gets every surface
|
|
184
|
+
instantly regardless of theme.
|
|
185
|
+
|
|
186
|
+
### Iconography axis
|
|
187
|
+
|
|
188
|
+
| Variable | Default | Notes |
|
|
189
|
+
|---|---|---|
|
|
190
|
+
| `--icon-family` | `lucide` | String identifier consumed by the icon resolver. Values: `lucide` \| `phosphor-outline` \| `phosphor-fill` \| `phosphor-duotone` \| `tabler` \| `fa-solid`. |
|
|
191
|
+
| `--icon-default-size` | `16px` | Default icon px size when component doesn't override. |
|
|
192
|
+
|
|
193
|
+
`--icon-stroke-width` and `--icon-color` continue from the existing surface.
|
|
194
|
+
|
|
195
|
+
### Elevation axis — per-layer mapping
|
|
196
|
+
|
|
197
|
+
| Variable | Default |
|
|
198
|
+
|---|---|
|
|
199
|
+
| `--elevation-card` | `var(--shadow-sm)` |
|
|
200
|
+
| `--elevation-popover` | `var(--shadow-main)` |
|
|
201
|
+
| `--elevation-dialog` | `var(--shadow-lg)` |
|
|
202
|
+
| `--elevation-toast` | `var(--shadow-main)` |
|
|
203
|
+
|
|
204
|
+
### Geometry axis — radius rhythm + border-width rhythm with intent
|
|
205
|
+
|
|
206
|
+
| Variable | Default |
|
|
207
|
+
|---|---|
|
|
208
|
+
| `--radius-container` | `var(--radius-md)` |
|
|
209
|
+
| `--radius-interactive` | `var(--radius-md)` |
|
|
210
|
+
| `--radius-pill` | `var(--radius-full)` |
|
|
211
|
+
| `--border-hairline` | `1px` |
|
|
212
|
+
| `--border-standard` | `var(--border-width)` |
|
|
213
|
+
| `--border-heavy` | `var(--border-width-thick)` |
|
|
214
|
+
|
|
215
|
+
### Range axes — heading voice, corner/border style, interactive elevation, surface, fonts
|
|
216
|
+
|
|
217
|
+
These separate artistic styles (Art Deco vs Win95 vs wabi-sabi) along dimensions color cannot. Every consumer carries its own fallback, so a theme that omits them renders exactly as before.
|
|
218
|
+
|
|
219
|
+
| Typed field (`@almadar/core`) | CSS variable | Consumed by | Fallback |
|
|
220
|
+
|---|---|---|---|
|
|
221
|
+
| `typeScale.displayFamily` | `--font-family-display` | every h1–h6, `Typography` heading variants (`.heading-voice`) | `--font-family` |
|
|
222
|
+
| `typeScale.headingWeight` | `--heading-weight` | `.heading-voice`, `[data-theme] h1–h6` | `--font-weight-bold` |
|
|
223
|
+
| `typeScale.headingTransform` | `--heading-transform` | same | `none` |
|
|
224
|
+
| `typeScale.headingTracking` | `--heading-tracking` | same | `--letter-spacing` |
|
|
225
|
+
| `typeScale.headingStyle` | `--heading-style` | same | `normal` |
|
|
226
|
+
| `typeScale.headingShadow` | `--heading-shadow` | same (text-shadow: glow, emboss, misregistration) | `none` |
|
|
227
|
+
| `typeScale.fontImport` | — (not a var) | preset: generated `_fonts.css` `@import`; inline: `OrbitalThemeProvider` `<link>`; compiled: `@import` atop the theme CSS | — |
|
|
228
|
+
| `geometry.cornerShape` | `--corner-shape` | every element inside `[data-theme]` (CSS `corner-shape`; Chromium 139+, other engines render plain round corners) | `round` |
|
|
229
|
+
| `geometry.cornerShapePill` | `--corner-shape-pill` | `.rounded-full` / `.rounded-pill` | `round` |
|
|
230
|
+
| `geometry.cornerShapeInteractive` | `--corner-shape-interactive` | `Button`, `Input`, `Select`, `Textarea` (`.interactive-border`) | `--corner-shape` |
|
|
231
|
+
| `geometry.borderStyle` | `--border-style` | every bordered element (scoped reset) | `solid` |
|
|
232
|
+
| `geometry.borderStyleInteractive` | `--border-style-interactive` | `Button` (`.interactive-border`) | `--border-style` |
|
|
233
|
+
| `elevation.interactiveElevation` | `--elevation-interactive` | `Button` resting (`shadow-elevation-interactive`) | `--shadow-sm` |
|
|
234
|
+
| `elevation.pressedElevation` | `--elevation-pressed` | `Button` `:active` (`shadow-elevation-pressed`) | `--shadow-sm` |
|
|
235
|
+
| `surface.backdrop` | `--surface-backdrop` | `.surface-material` (cards, overlays): `backdrop-filter` | `none` |
|
|
236
|
+
| `surface.cardImage` | `--surface-card-image` | `.surface-material`: `background-image` over the card color | `none` |
|
|
237
|
+
| `surface.pageImage` | `--surface-page-image` | `.surface-page` (app shells, themed orbital roots) | `none` |
|
|
238
|
+
| `surface.pageImageSize` | `--surface-page-image-size` | `.surface-page` | `auto` |
|
|
239
|
+
| `surface.contentBg` | `--surface-content-bg` | `.surface-content`: the background behind every content block (table, calendar, list, chart …) and the default `Card` | `--color-card` |
|
|
240
|
+
| `surface.contentBorderWidth` | `--surface-content-border-width` | `.surface-content` | `--border-width` |
|
|
241
|
+
| `surface.contentBorderColor` | `--surface-content-border-color` | `.surface-content` | `--color-border` |
|
|
242
|
+
| `surface.contentRadius` | `--surface-content-radius` | `.surface-content` | `--radius-container` |
|
|
243
|
+
| `surface.contentShadow` | `--surface-content-shadow` | `.surface-content` | `--elevation-card` |
|
|
244
|
+
| `surface.edgeMask` | `--surface-edge-mask` | `.band-edge` (Box `edgeTop`/`edgeBottom: curve`) | `none` (straight edge) |
|
|
245
|
+
| `surface.edgeHeight` | `--surface-edge-height` | `.band-edge` (curve only) | `clamp(24px, 6vw, 96px)` |
|
|
246
|
+
| `surface.textureMask` | `--surface-texture-mask` | `.band-texture` (Box `texture`) | built-in dot tile |
|
|
247
|
+
| `surface.textureSize` | `--surface-texture-size` | `.band-texture` | `24px 24px` |
|
|
248
|
+
| `surface.accentImage` | `--surface-accent-image` | `.band-gradient` (Box `bg: gradient`) | faint primary-tinted linear gradient |
|
|
249
|
+
| `surface.scrim` | `--surface-scrim` | `.band-scrim` (std-hero `surface: image`) | dark bottom-up gradient |
|
|
250
|
+
|
|
251
|
+
| `motion.shapes.modalEnter` / `modalExit` | `--motion-modal-enter-from-transform` / `--motion-modal-exit-to-transform` | `Modal` (every modal slot: runtime, contained preview, compiled) | `scale(.96) translateY(8px)` / `scale(.92) translateY(16px)` |
|
|
252
|
+
| `motion.shapes.popoverEnter` / `popoverExit` | `--motion-popover-enter-from-transform` / `--motion-popover-exit-to-transform` | `Popover`, menus | `scale(.95)` |
|
|
253
|
+
| `motion.shapes.toastEnter` / `toastExit` | `--motion-toast-enter-from-transform` / `--motion-toast-exit-to-transform` | `Toast` | `translateY(16px)` |
|
|
254
|
+
| `motion.shapes.pageEnter` | `--motion-page-enter-from-transform` | `PageTransition` (pages animate in only) | `translateY(8px)` |
|
|
255
|
+
|
|
256
|
+
**Where motion plays.** Modal/drawer slots stay mounted through their exit animation (a cleared slot keeps its last content until `onExited`). Page content animates in on navigation through `PageTransition`: `UISlotRenderer`'s `pageKey` (OrbPreview) and the compiled `App.tsx` host wrap the routed content, and a layout's content region (`DashboardLayout`'s `<main>`) claims the transition so its chrome stays still. `--motion-enable: off` and `prefers-reduced-motion` disable all of it.
|
|
257
|
+
|
|
258
|
+
`.lolo` inline themes author these under `tokens { typeScale { … } geometry { … } elevation { … } surface { … } motion { … } }` (flat camelCase keys, parse-checked; `motion` takes the shape keys). A frosted-glass theme needs a translucent `card` color (`rgba`) for `backdrop` to show. `double` / `groove` / `ridge` borders need a border width of 3px or more to read.
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
### Drawing axes — `diagram`, `scene`, diagram colors, `--surface-diagram`
|
|
263
|
+
|
|
264
|
+
How every drawing surface (learning canvases, charts, graph canvases, game boards, AVL, 3D
|
|
265
|
+
scenes) draws its marks. Components never hardcode a drawing color, weight or face; they resolve
|
|
266
|
+
these through `useCanvasTheme` (`hooks/useCanvasTheme.ts`). Defaults in `_base.css` derive every
|
|
267
|
+
var from the theme's own tokens, so a preset that sets nothing still draws in its own palette,
|
|
268
|
+
border weight, faces and corners. A preset sets them to give its drawings a hand of their own
|
|
269
|
+
(sketch wobble, neon glow, blueprint dashes, Bauhaus square caps).
|
|
270
|
+
|
|
271
|
+
| Var | Source key | Meaning |
|
|
272
|
+
|---|---|---|
|
|
273
|
+
| `--surface-diagram` | `surface.diagram` | Ground a drawing sits on (default `--color-card`) |
|
|
274
|
+
| `--color-series-1…8` | `colors.series-N` | Categorical data palette with no status meaning (default: primary turned around the hue wheel) |
|
|
275
|
+
| `--color-diagram-ink` / `-label` / `-guide` / `-axis` / `-grid` / `-highlight` / `-fill` | `colors.diagram-*` | Mark roles: default stroke, label text, construction lines, axes, grid, the one emphasized mark, default fill |
|
|
276
|
+
| `--diagram-stroke-thin` / `-normal` / `-bold` | `diagram.strokeThin/Normal/Bold` | Stroke weights for guides / marks / emphasis (default from the border rhythm) |
|
|
277
|
+
| `--diagram-line-cap` / `-line-join` | `diagram.lineCap/lineJoin` | `butt\|round\|square` / `miter\|round\|bevel` |
|
|
278
|
+
| `--diagram-dash` / `-dot` | `diagram.dash/dot` | Dash patterns (space-separated lengths) of dashed / dotted marks |
|
|
279
|
+
| `--diagram-fill-style` / `-fill-opacity` | `diagram.fillStyle/fillOpacity` | `solid\|tint\|outline\|hatch`; tint strength |
|
|
280
|
+
| `--diagram-roughness` | `diagram.roughness` | Hand-drawn wobble in px (`0` = exact) |
|
|
281
|
+
| `--diagram-glow` | `diagram.glow` | Glow blur in px around strokes (`0` = none) |
|
|
282
|
+
| `--diagram-shadow` | `diagram.shadow` | Shadow recipe on filled marks |
|
|
283
|
+
| `--diagram-marker` | `diagram.marker` | Arrowhead: `triangle\|open\|line\|dot` |
|
|
284
|
+
| `--diagram-label-font` / `-size` / `-weight` / `-case` | `diagram.label*` | Label face (`body\|display\|mono`), type-scale step, weight, `none\|uppercase` |
|
|
285
|
+
| `--diagram-corner` | `diagram.corner` | Corner radius of rects and bars |
|
|
286
|
+
| `--material-roughness` / `-metalness` / `-flat` / `-outline` | `scene.material*` | 3D material response; `flat` `1` = flat shading; `outline` = toon outline px |
|
|
287
|
+
| `--light-ambient` / `-key` / `-key-color` | `scene.light*` | 3D lighting |
|
|
288
|
+
| `--scene-fog` | `scene.fog` | Depth haze 0–1 |
|
|
289
|
+
|
|
290
|
+
Motion has no drawing-specific vars: animated surfaces use `--duration-*` / `--easing-*` and stop
|
|
291
|
+
when `--motion-enable: off` or `prefers-reduced-motion` is set.
|
|
292
|
+
|
|
293
|
+
## Authoring rules
|
|
294
|
+
|
|
295
|
+
1. **Backfill agents** (B1, B2, B3): copy the defaults above verbatim into each existing theme's light and dark blocks. Do not change any pre-existing variable. The migration must produce pixel-identical output to today for every pre-Layer-1 theme.
|
|
296
|
+
2. **New-theme agents** (B4–B8): define every variable above. Pick values that express the personality brief — compact density, editorial type, sharp geometry, dramatic motion, filled iconography, etc. Defaults are NOT a fallback for new themes; new themes are the proof that the axis surface works.
|
|
297
|
+
3. **No raw pixel literals in components**. All dimensional values flow through these tokens or through Tailwind utilities backed by them in `tailwind-preset.cjs`. Components that hardcode `text-[10px]` or `min-w-[44px]` are migration targets.
|
|
298
|
+
4. **Icon family swap is runtime-resolved**. `--icon-family` is read by the icon resolver in `@almadar/ui`; setting the variable in a theme does not require component edits.
|
|
299
|
+
5. **Wireframe and trait-wars exceptions**. Wireframe's `--easing-standard` is `linear` not the default cubic-bezier; trait-wars's iconography may remain `lucide` even if its visual personality diverges. Document any per-theme override at the top of the theme file.
|
|
300
|
+
6. **Contrast is gated.** Every theme's canonical foreground/fill pairs must pass WCAG AA 4.5:1 — enforced by `scripts/theme-contrast-audit.mjs` (`pnpm verify:themes`), which runs in CI and before every npm publish and exits non-zero on any violation. A new or edited theme that fails the audit blocks the publish. The script also accepts `--dir <themes-dir>` (`scripts/` is published) so another package can audit its own theme dir with the same rules.
|
|
301
|
+
7. **No hardcoded palette colors in components.** Components must consume these tokens only (no `text-white`, `bg-gray-800`, `border-indigo-300`, `text-[#hex]`). Enforced by the `almadar/no-hardcoded-colors` ESLint rule (`@almadar/eslint-plugin`, enabled in this package's `eslint.config.cjs`). The single sanctioned exception is media-overlay chrome (white text / dark scrims painted over images or video), which requires an inline `eslint-disable-next-line almadar/no-hardcoded-colors` comment stating the reason.
|
|
302
|
+
|
|
303
|
+
**Drawing roles stay apart.** In every theme mode the roles a canvas draws meaning with — `diagram-ink`,
|
|
304
|
+
`diagram-highlight`, `muted-foreground`, `success`, `warning`, `error`, `series-1`…`series-8` — are at least
|
|
305
|
+
ΔE 10 (CIEDE2000) from each other (`@almadar/core` `__tests__/theme-tone-colors.test.ts`; `INDISTINCT_DELTA_E`).
|
|
306
|
+
A monochrome theme keeps its UI monochrome and gives its drawings a small on-identity palette. In an `outline`
|
|
307
|
+
fill-style theme a mark's meaningful fill becomes its (bold) outline, so the outline look never erases a state.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kenney game fonts — @font-face declarations for the game display faces named
|
|
3
|
+
* by the game themes (--font-family / --font-family-display) and by GameShell's
|
|
4
|
+
* fontFamily knob. Loaded once here, at the theme layer, so every consumer of a
|
|
5
|
+
* game theme gets the faces (previously they were injected privately by GameShell).
|
|
6
|
+
*/
|
|
7
|
+
@font-face { font-family: 'Kenney Future'; src: url('https://almadar-kflow-assets.web.app/shared/_shared/kenney-fonts/fonts/Kenney%20Future.ttf') format('truetype'); font-display: swap; }
|
|
8
|
+
@font-face { font-family: 'Kenney Future Narrow'; src: url('https://almadar-kflow-assets.web.app/shared/_shared/kenney-fonts/fonts/Kenney%20Future%20Narrow.ttf') format('truetype'); font-display: swap; }
|
|
9
|
+
@font-face { font-family: 'Kenney Pixel'; src: url('https://almadar-kflow-assets.web.app/shared/_shared/kenney-fonts/fonts/Kenney%20Pixel.ttf') format('truetype'); font-display: swap; }
|
|
10
|
+
@font-face { font-family: 'Kenney Blocks'; src: url('https://almadar-kflow-assets.web.app/shared/_shared/kenney-fonts/fonts/Kenney%20Blocks.ttf') format('truetype'); font-display: swap; }
|
|
11
|
+
@font-face { font-family: 'Kenney Mini'; src: url('https://almadar-kflow-assets.web.app/shared/_shared/kenney-fonts/fonts/Kenney%20Mini.ttf') format('truetype'); font-display: swap; }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GENERATED — do not edit by hand.
|
|
3
|
+
* Source: packages/almadar-core/themes/*.json
|
|
4
|
+
* Regenerate: node tools/almadar-pattern-sync/dist/index.js themes (or `almadar-sync themes`)
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
@import url("https://fonts.googleapis.com/css2?family=Amiri:wght@400;700&family=Anton&family=Archivo:wght@400;500;700;800&family=Archivo+Black&family=Baloo+2:wght@500;600;700;800&family=Bangers&family=Bricolage+Grotesque:wght@500;600;700&family=Bungee&family=Cairo:wght@300;400;500;600;700&family=Cinzel:wght@400;600;700;900&family=Cinzel+Decorative:wght@400;700&family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;0,700;1,500;1,700&family=Crimson+Pro:wght@500;600;700&family=DM+Sans:wght@400;500;700&family=DM+Serif+Display&family=DotGothic16&family=EB+Garamond:wght@400;500;600;700&family=Exo+2:wght@300;400;500;600;700&family=Fraunces:ital,wght@0,400;0,500;0,600;0,700;1,400;1,600;1,700&family=Fredoka:wght@400;500;600;700&family=Geist:wght@400;500;600;700&family=Geist+Mono:wght@400;500;600&family=Hanken+Grotesk:wght@300;400;500;600&family=IBM+Plex+Mono:wght@400;500;600&display=swap");
|
|
8
|
+
@import url("https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Sans+Arabic:wght@400;500;600;700&family=IBM+Plex+Sans+Condensed:wght@400;500;600;700&family=IM+Fell+English&family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@400;500;700;800&family=JetBrains+Mono:wght@400;500;600;700&family=Josefin+Sans:wght@400;500;700&family=Jost:wght@300;400;500;700;800&family=Kalam:wght@300;400;700&family=Karla:wght@400;500;700&family=Libre+Baskerville:wght@400;700&family=Lilita+One&family=Limelight&family=Lora:wght@400;500;600;700&family=M+PLUS+Rounded+1c:wght@400;500;700;800&family=Ma+Shan+Zheng&family=Manrope:wght@400;500;600;700;800&family=MedievalSharp&family=Newsreader:wght@400;500;600;700&family=Noto+Naskh+Arabic:wght@400;500;700&family=Noto+Sans:wght@400;500;700;800&family=Noto+Sans+Arabic:wght@400;500;600;700&family=Noto+Sans+Mono:wght@400;500&display=swap");
|
|
9
|
+
@import url("https://fonts.googleapis.com/css2?family=Noto+Serif+JP:wght@400;500;700&family=Noto+Serif+SC:wght@400;500;700&family=Nunito:wght@400;500;600;700;800&family=Nunito+Sans:wght@400;600;700&family=Old+Standard+TT&family=Orbitron:wght@500;700;900&family=Oswald:wght@500;700&family=Outfit:wght@300;400;500;600&family=Patrick+Hand&family=Pixelify+Sans:wght@400;500;700&family=Playfair+Display:ital,wght@0,400;0,500;0,700;0,900;1,500;1,700&family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&family=Poiret+One&family=Poppins:wght@500;600;700&family=Press+Start+2P&family=Quicksand:wght@500;600;700&family=Rajdhani:wght@400;500;600;700&family=Reem+Kufi:wght@400;500;600;700&family=Roboto:wght@400;500;700&family=Roboto+Condensed:wght@400;500;700&family=Roboto+Flex:wght@400;500;600;700&family=Roboto+Mono:wght@400;500&family=Rubik:wght@400;500;700&family=Rubik+Mono+One&display=swap");
|
|
10
|
+
@import url("https://fonts.googleapis.com/css2?family=Russo+One&family=Schibsted+Grotesk:wght@400;500;600;700&family=Share+Tech+Mono&family=Shippori+Mincho:wght@400;500&family=Shrikhand&family=Silkscreen:wght@400;700&family=Sora:wght@400;600;700&family=Source+Sans+3:wght@400;500;600;700&family=Space+Mono:wght@400;700&family=Special+Elite&family=Tilt+Neon&family=UnifrakturCook:wght@700&family=VT323&family=Work+Sans:wght@400;500;600;700&family=Zen+Antique&family=Zen+Kaku+Gothic+New:wght@300;400;500;700&display=swap");
|
|
11
|
+
@import url("https://fonts.googleapis.com/css2?family=Source+Serif+4:wght@400;600;700&display=swap");
|
|
12
|
+
@import url("https://fonts.googleapis.com/css2?family=Source+Serif+4:opsz,wght@8..60,500;8..60,600;8..60,700&display=swap");
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* _foundation.css — the base rules that CONSUME theme tokens: element reset,
|
|
3
|
+
* border style + corner shape, currentColor anchor, heading voice. Imported by
|
|
4
|
+
* `index.css` (all presets) and by compiled apps (orbital-shell-typescript's
|
|
5
|
+
* generated index.css), which load only the presets they reference.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Minimal element reset for @almadar/ui components.
|
|
10
|
+
*
|
|
11
|
+
* Host apps that skip @tailwind base (e.g. Docusaurus, apps/builder) keep
|
|
12
|
+
* browser-default borders/backgrounds on raw HTML elements. This scoped
|
|
13
|
+
* reset normalizes them inside themed containers and the portal root.
|
|
14
|
+
*/
|
|
15
|
+
:where([data-theme]) button,
|
|
16
|
+
:where(#ui-slot-portal-root) button {
|
|
17
|
+
border: 0;
|
|
18
|
+
background: transparent;
|
|
19
|
+
padding: 0;
|
|
20
|
+
font: inherit;
|
|
21
|
+
color: inherit;
|
|
22
|
+
cursor: pointer;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
:where([data-theme]) *,
|
|
26
|
+
:where([data-theme]) *::before,
|
|
27
|
+
:where([data-theme]) *::after,
|
|
28
|
+
:where(#ui-slot-portal-root) *,
|
|
29
|
+
:where(#ui-slot-portal-root) *::before,
|
|
30
|
+
:where(#ui-slot-portal-root) *::after {
|
|
31
|
+
box-sizing: border-box;
|
|
32
|
+
border-width: 0;
|
|
33
|
+
border-style: var(--border-style, solid);
|
|
34
|
+
border-color: var(--color-border, #e5e7eb);
|
|
35
|
+
corner-shape: var(--corner-shape, round);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* Pills and circles (avatars, badges, toggles) take their own corner shape so a
|
|
39
|
+
* bevel/notch theme can keep them round. */
|
|
40
|
+
:where([data-theme]) .rounded-full,
|
|
41
|
+
:where([data-theme]) .rounded-pill,
|
|
42
|
+
:where(#ui-slot-portal-root) .rounded-full,
|
|
43
|
+
:where(#ui-slot-portal-root) .rounded-pill {
|
|
44
|
+
corner-shape: var(--corner-shape-pill, round);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* currentColor anchor. A nested [data-theme] container re-scopes every
|
|
49
|
+
* var-based color utility, but the raw `color` property inherits straight
|
|
50
|
+
* through from the outer theme — `text-current` icons painted the outer
|
|
51
|
+
* theme's foreground on the inner theme's surface (white-on-white when a
|
|
52
|
+
* behavior pins a light theme inside a dark shell). Re-anchor `color` to
|
|
53
|
+
* the innermost theme's foreground so currentColor always matches. The body
|
|
54
|
+
* font is anchored the same way, so text that sets no family of its own reads
|
|
55
|
+
* the innermost theme's `--font-family` instead of the host page's.
|
|
56
|
+
*/
|
|
57
|
+
[data-theme] {
|
|
58
|
+
color: var(--color-foreground, inherit);
|
|
59
|
+
font-family: var(--font-family, inherit);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* A card surface re-scopes the page foreground to its own, so a theme can pair
|
|
63
|
+
* light cards with a dark page (Win95 silver on teal, parchment panels): every
|
|
64
|
+
* `text-foreground` inside the card resolves to `--color-card-foreground`. */
|
|
65
|
+
:where([data-theme]) .bg-card,
|
|
66
|
+
:where(#ui-slot-portal-root) .bg-card {
|
|
67
|
+
--color-foreground: var(--color-card-foreground);
|
|
68
|
+
color: var(--color-card-foreground);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Heading voice. Host apps (Docusaurus, builder) often set their own heading
|
|
73
|
+
* font-family; headings inside themed containers use the theme's display
|
|
74
|
+
* family and heading-voice tokens instead (same as the `.heading-voice` utility).
|
|
75
|
+
*/
|
|
76
|
+
[data-theme] h1,
|
|
77
|
+
[data-theme] h2,
|
|
78
|
+
[data-theme] h3,
|
|
79
|
+
[data-theme] h4,
|
|
80
|
+
[data-theme] h5,
|
|
81
|
+
[data-theme] h6,
|
|
82
|
+
#ui-slot-portal-root h1,
|
|
83
|
+
#ui-slot-portal-root h2,
|
|
84
|
+
#ui-slot-portal-root h3,
|
|
85
|
+
#ui-slot-portal-root h4,
|
|
86
|
+
#ui-slot-portal-root h5,
|
|
87
|
+
#ui-slot-portal-root h6 {
|
|
88
|
+
font-family: var(--font-family-display, var(--font-family, inherit));
|
|
89
|
+
font-weight: var(--heading-weight, var(--font-weight-bold, 700));
|
|
90
|
+
text-transform: var(--heading-transform, none);
|
|
91
|
+
letter-spacing: var(--heading-tracking, var(--letter-spacing, normal));
|
|
92
|
+
font-style: var(--heading-style, normal);
|
|
93
|
+
text-shadow: var(--heading-shadow, none);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* Presentation motion: a subtree whose changes are there to be watched (a live demo,
|
|
97
|
+
* `Box animateChanges`) plays them over the theme's dramatic duration with its standard
|
|
98
|
+
* ease-in-out instead of the snappy emphasized timing. Lives here because every app
|
|
99
|
+
* (runtime and compiled) loads the foundation; doubled attribute so it wins over a
|
|
100
|
+
* `[data-theme]` block on the same element. */
|
|
101
|
+
[data-motion="presentation"][data-motion] {
|
|
102
|
+
--duration-normal: var(--duration-dramatic, 600ms);
|
|
103
|
+
--duration-slow: var(--duration-dramatic, 600ms);
|
|
104
|
+
--easing-emphasized: var(--easing-standard, cubic-bezier(0.4, 0, 0.2, 1));
|
|
105
|
+
}
|
package/themes/_head.css
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shared theme layer every theme stylesheet starts with: the shared web fonts and the base.
|
|
3
|
+
* A compiled client imports it, then only the presets its program declares, then `_foundation.css`;
|
|
4
|
+
* `index.css` imports it, then every preset.
|
|
5
|
+
*
|
|
6
|
+
* IMPORTANT: @import must precede all other statements (Vite requirement).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* Layer 1 skin axes — font families consumed by prism / gazette / terminal / atelier / kiosk,
|
|
10
|
+
* plus VT323 for retro's pixel display type.
|
|
11
|
+
* Combined into a single Google Fonts request for fewer round-trips. font-display: swap
|
|
12
|
+
* means body text renders immediately with the fallback chain while the web fonts load. */
|
|
13
|
+
@import url("https://fonts.googleapis.com/css2?family=Fraunces:wght@400;500;700;900&family=Fredoka:wght@400;500;600;700&family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;700&family=Manrope:wght@400;500;600;700;800&family=VT323&display=swap");
|
|
14
|
+
|
|
15
|
+
/* Kenney game font faces — consumed by the game themes and GameShell's fontFamily knob. */
|
|
16
|
+
@import "./_fonts-kenney.css";
|
|
17
|
+
|
|
18
|
+
/* Shared base layer — atelier's typography + density at :root, inherited
|
|
19
|
+
* by every theme that doesn't override. MUST come before per-theme
|
|
20
|
+
* imports so [data-theme="..."] selectors win the cascade on the few
|
|
21
|
+
* personality themes that intentionally opt out. */
|
|
22
|
+
@import "./_base.css";
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GENERATED — do not edit by hand.
|
|
3
|
+
* Source: packages/almadar-core/themes/*.json
|
|
4
|
+
* Regenerate: node tools/almadar-pattern-sync/dist/index.js themes (or `almadar-sync themes`)
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
@import "./almadar.css";
|
|
8
|
+
@import "./almadar-heritage.css";
|
|
9
|
+
@import "./almadar-website.css";
|
|
10
|
+
@import "./aqua.css";
|
|
11
|
+
@import "./arabesque.css";
|
|
12
|
+
@import "./art-deco.css";
|
|
13
|
+
@import "./art-nouveau.css";
|
|
14
|
+
@import "./atelier.css";
|
|
15
|
+
@import "./bauhaus.css";
|
|
16
|
+
@import "./bloomberg-dense.css";
|
|
17
|
+
@import "./blueprint.css";
|
|
18
|
+
@import "./clay.css";
|
|
19
|
+
@import "./comic.css";
|
|
20
|
+
@import "./constructivist.css";
|
|
21
|
+
@import "./corporate.css";
|
|
22
|
+
@import "./cyberpunk.css";
|
|
23
|
+
@import "./frutiger-aero.css";
|
|
24
|
+
@import "./game-adventure.css";
|
|
25
|
+
@import "./game-rpg.css";
|
|
26
|
+
@import "./game-sci-fi.css";
|
|
27
|
+
@import "./game-ui-pack.css";
|
|
28
|
+
@import "./gazette.css";
|
|
29
|
+
@import "./glass.css";
|
|
30
|
+
@import "./gothic.css";
|
|
31
|
+
@import "./ink-wash.css";
|
|
32
|
+
@import "./kawaii.css";
|
|
33
|
+
@import "./kflow.css";
|
|
34
|
+
@import "./kiosk.css";
|
|
35
|
+
@import "./linear-clean.css";
|
|
36
|
+
@import "./luxury.css";
|
|
37
|
+
@import "./mac-classic.css";
|
|
38
|
+
@import "./material.css";
|
|
39
|
+
@import "./memphis.css";
|
|
40
|
+
@import "./mid-century.css";
|
|
41
|
+
@import "./minimalist.css";
|
|
42
|
+
@import "./mudcloth.css";
|
|
43
|
+
@import "./nata.css";
|
|
44
|
+
@import "./neon.css";
|
|
45
|
+
@import "./neumorphic.css";
|
|
46
|
+
@import "./newsprint.css";
|
|
47
|
+
@import "./notion-editorial.css";
|
|
48
|
+
@import "./orb.css";
|
|
49
|
+
@import "./pixel.css";
|
|
50
|
+
@import "./prism.css";
|
|
51
|
+
@import "./rawi.css";
|
|
52
|
+
@import "./retro.css";
|
|
53
|
+
@import "./risograph.css";
|
|
54
|
+
@import "./scandi.css";
|
|
55
|
+
@import "./sketch.css";
|
|
56
|
+
@import "./solarpunk.css";
|
|
57
|
+
@import "./steampunk.css";
|
|
58
|
+
@import "./swiss.css";
|
|
59
|
+
@import "./terminal.css";
|
|
60
|
+
@import "./trait-wars.css";
|
|
61
|
+
@import "./ukiyo-e.css";
|
|
62
|
+
@import "./vaporwave.css";
|
|
63
|
+
@import "./victorian.css";
|
|
64
|
+
@import "./wabi-sabi.css";
|
|
65
|
+
@import "./win95.css";
|
|
66
|
+
@import "./wireframe.css";
|
|
67
|
+
@import "./zine.css";
|