@almadar/ui 6.51.2 → 6.52.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.
Files changed (121) hide show
  1. package/dist/{Canvas3DHost-CLC_jXh_.d.ts → Canvas3DHost-CWO0tswb.d.ts} +1 -1
  2. package/dist/{FileTree-RKQqRhIM.d.ts → FileTree-DUi7e7Z8.d.ts} +5 -5
  3. package/dist/{GameAudioProvider-BgWLggIy.d.ts → GameAudioProvider-_hPzjqp-.d.ts} +1 -1
  4. package/dist/{NavStackContext-B-XLULCO.d.ts → NavStackContext-04NLdXsY.d.ts} +8 -0
  5. package/dist/Typography-7FRZOS2H.js +5 -0
  6. package/dist/{UISlotContext-DNM8iXna.d.ts → UISlotContext-CS487Uoc.d.ts} +1 -1
  7. package/dist/{UISlotRenderer-7UYHFW4S.js → UISlotRenderer-CR7SCAMR.js} +8 -8
  8. package/dist/avl/index.cjs +3401 -1590
  9. package/dist/avl/index.d.ts +4 -4
  10. package/dist/avl/index.js +26 -23
  11. package/dist/{chunk-6CFYRP4S.js → chunk-2QB2PXOO.js} +1 -3
  12. package/dist/{chunk-R4V7IZQP.js → chunk-5GCI6C7J.js} +2 -2
  13. package/dist/{chunk-BUEIZY54.js → chunk-BHZG4PDZ.js} +420 -422
  14. package/dist/{chunk-MWPX2O4M.js → chunk-CLSLVFSP.js} +3 -16
  15. package/dist/{chunk-GIPZSCND.js → chunk-EERAGPBW.js} +3078 -1832
  16. package/dist/{chunk-OLZ3EEML.js → chunk-G4GMXYMY.js} +109 -15
  17. package/dist/{chunk-HQDKHLFG.js → chunk-IN3BVW2Z.js} +15 -1
  18. package/dist/{chunk-FGHRVJCI.js → chunk-MSBMVG3B.js} +12 -2
  19. package/dist/{chunk-YKHNK5JH.js → chunk-NCNP2RKZ.js} +11 -4
  20. package/dist/{chunk-T7IH5ABO.js → chunk-QWDKMVLX.js} +69 -17
  21. package/dist/{chunk-NTO555KF.js → chunk-TWHYH25Q.js} +136 -15
  22. package/dist/{chunk-GHXWGQTX.js → chunk-V5AGW2JN.js} +1 -1
  23. package/dist/{chunk-L55SAFKL.js → chunk-WB2A6V3I.js} +31 -1
  24. package/dist/{chunk-JXUYEO7U.js → chunk-XUSSAWKL.js} +7 -1
  25. package/dist/{cn-CO-0rolG.d.ts → cn-ClXGlIOY.d.ts} +2 -2
  26. package/dist/components/index.cjs +4933 -3165
  27. package/dist/components/index.d.ts +499 -416
  28. package/dist/components/index.js +11 -11
  29. package/dist/context/index.cjs +12 -4
  30. package/dist/context/index.d.ts +3 -3
  31. package/dist/context/index.js +2 -2
  32. package/dist/hooks/index.cjs +73 -6
  33. package/dist/hooks/index.d.ts +32 -7
  34. package/dist/hooks/index.js +6 -6
  35. package/dist/lib/drawable/three/index.cjs +33 -2
  36. package/dist/lib/drawable/three/index.d.ts +5 -5
  37. package/dist/lib/drawable/three/index.js +7 -7
  38. package/dist/lib/index.cjs +69 -2
  39. package/dist/lib/index.d.ts +29 -6
  40. package/dist/lib/index.js +5 -5
  41. package/dist/locales/index.cjs +93 -3
  42. package/dist/locales/index.js +63 -3
  43. package/dist/{paintDispatch-CMgOyVjS.d.ts → paintDispatch-DHo3WhaU.d.ts} +4 -4
  44. package/dist/providers/index.cjs +3392 -1607
  45. package/dist/providers/index.d.ts +6 -6
  46. package/dist/providers/index.js +55 -16
  47. package/dist/runtime/index.cjs +3417 -1611
  48. package/dist/runtime/index.d.ts +2 -2
  49. package/dist/runtime/index.js +10 -10
  50. package/dist/ssr/index.cjs +306 -141
  51. package/dist/ssr/index.d.cts +32 -44
  52. package/dist/ssr/index.d.ts +32 -44
  53. package/dist/ssr/index.js +249 -84
  54. package/dist/{themeTokens-CN9WCXQc.d.ts → themeTokens-Ccu7EmGY.d.ts} +4 -2
  55. package/dist/{useUISlots-CwUWM1ra.d.ts → useUISlots-1dk2TR4j.d.ts} +1 -9
  56. package/dist/{verificationRegistry-DBHfOR9y.d.ts → verificationRegistry-BYD3cVhS.d.ts} +1 -1
  57. package/locales/ar.json +31 -1
  58. package/locales/en.json +31 -1
  59. package/locales/sl.json +31 -1
  60. package/package.json +12 -9
  61. package/tailwind-preset.cjs +24 -1
  62. package/themes/_base.css +86 -0
  63. package/themes/_contract.md +1 -0
  64. package/themes/almadar-website.css +2 -0
  65. package/themes/almadar.css +2 -0
  66. package/themes/aqua.css +5 -3
  67. package/themes/arabesque.css +9 -7
  68. package/themes/art-deco.css +5 -3
  69. package/themes/art-nouveau.css +4 -0
  70. package/themes/atelier.css +10 -8
  71. package/themes/bauhaus.css +2 -0
  72. package/themes/bloomberg-dense.css +13 -11
  73. package/themes/blueprint.css +2 -0
  74. package/themes/clay.css +2 -0
  75. package/themes/comic.css +12 -10
  76. package/themes/constructivist.css +2 -0
  77. package/themes/corporate.css +4 -2
  78. package/themes/cyberpunk.css +2 -0
  79. package/themes/frutiger-aero.css +2 -0
  80. package/themes/game-adventure.css +1 -0
  81. package/themes/game-rpg.css +1 -0
  82. package/themes/game-sci-fi.css +1 -0
  83. package/themes/game-ui-pack.css +1 -0
  84. package/themes/gazette.css +10 -8
  85. package/themes/glass.css +17 -15
  86. package/themes/gothic.css +2 -0
  87. package/themes/ink-wash.css +2 -0
  88. package/themes/kawaii.css +2 -0
  89. package/themes/kiosk.css +17 -15
  90. package/themes/linear-clean.css +12 -10
  91. package/themes/luxury.css +2 -0
  92. package/themes/mac-classic.css +2 -0
  93. package/themes/material.css +2 -0
  94. package/themes/memphis.css +2 -0
  95. package/themes/mid-century.css +2 -0
  96. package/themes/minimalist.css +2 -0
  97. package/themes/mudcloth.css +2 -0
  98. package/themes/neon.css +2 -0
  99. package/themes/neumorphic.css +2 -0
  100. package/themes/newsprint.css +2 -0
  101. package/themes/notion-editorial.css +12 -10
  102. package/themes/pixel.css +2 -0
  103. package/themes/prism.css +20 -18
  104. package/themes/retro.css +2 -0
  105. package/themes/risograph.css +2 -0
  106. package/themes/scandi.css +2 -0
  107. package/themes/sketch.css +2 -0
  108. package/themes/solarpunk.css +2 -0
  109. package/themes/steampunk.css +2 -0
  110. package/themes/swiss.css +2 -0
  111. package/themes/terminal.css +8 -6
  112. package/themes/trait-wars.css +2 -0
  113. package/themes/ukiyo-e.css +2 -0
  114. package/themes/vaporwave.css +2 -0
  115. package/themes/victorian.css +2 -0
  116. package/themes/wabi-sabi.css +2 -0
  117. package/themes/win95.css +2 -0
  118. package/themes/wireframe.css +2 -0
  119. package/themes/zine.css +2 -0
  120. package/dist/Typography-2Z3JKWHN.js +0 -5
  121. package/dist/{avl-3d-context-MAt_NuU9.d.ts → avl-3d-context-DLteNEwu.d.ts} +3 -3
@@ -1,4 +1,4 @@
1
- import { ThemeRef, ThemeDefinition, ThemeTokens, ThemeVariant, DensityTokens, ElevationTokens, GeometryTokens, IconographyTokens, MotionDurationKey, MotionEasingKey, MotionIntentMap, MotionShapeTokens, SurfaceTokens, TypeScaleTokens, TypeIntentMap, TypeSizeKey } from '@almadar/core';
1
+ import { ThemeRef, ThemeDefinition, ThemeTokens, ThemeVariant, DensityTokens, ElevationTokens, GeometryTokens, IconographyTokens, MotionDurationKey, MotionEasingKey, MotionIntentMap, MotionShapeTokens, SurfaceTokens, TypeScaleTokens, TypeIntentMap, TypeSizeKey, EnterAnimation } from '@almadar/core';
2
2
 
3
3
  /**
4
4
  * themeTokens — runtime mirror of the orbital compiler's theme codegen.
@@ -106,6 +106,8 @@ declare const LEGACY_PREFIXES: {
106
106
  * back to the base tokens.
107
107
  */
108
108
  declare function themeTokensToCssVars(tokens: ThemeTokens, mode?: ThemeMode, darkVariant?: ThemeVariant): Record<string, string>;
109
+ /** The keyframe name an entry keyword plays (`none` stays `none`). */
110
+ declare function enterKeyframe(enter: EnterAnimation): string;
109
111
  /**
110
112
  * `ThemeRef` is `ThemeDefinition | string`. When it's a string, it's an
111
113
  * unresolved import reference (e.g. `"Ocean.theme"`) that should have been
@@ -115,4 +117,4 @@ declare function themeTokensToCssVars(tokens: ThemeTokens, mode?: ThemeMode, dar
115
117
  */
116
118
  declare function resolveThemeForRuntime(theme: ThemeRef | undefined): ThemeDefinition | undefined;
117
119
 
118
- export { DENSITY_ELEMENT_VARS as D, ELEVATION_VARS as E, type FlatVarEntry as F, GEOMETRY_VARS as G, ICONOGRAPHY_VARS as I, LEGACY_PREFIXES as L, MOTION_DURATION_KEYS as M, SURFACE_VARS as S, type ThemeMode as T, DENSITY_SPACING_VARS as a, MOTION_EASING_KEYS as b, MOTION_INTENT_VARS as c, MOTION_SHAPE_VARS as d, type StringValueKey as e, TYPE_FAMILY_VARS as f, TYPE_HEADING_VARS as g, TYPE_INTENT_VARS as h, TYPE_SIZE_KEYS as i, resolveThemeForRuntime as r, themeTokensToCssVars as t };
120
+ export { DENSITY_ELEMENT_VARS as D, ELEVATION_VARS as E, type FlatVarEntry as F, GEOMETRY_VARS as G, ICONOGRAPHY_VARS as I, LEGACY_PREFIXES as L, MOTION_DURATION_KEYS as M, SURFACE_VARS as S, type ThemeMode as T, DENSITY_SPACING_VARS as a, MOTION_EASING_KEYS as b, MOTION_INTENT_VARS as c, MOTION_SHAPE_VARS as d, type StringValueKey as e, TYPE_FAMILY_VARS as f, TYPE_HEADING_VARS as g, TYPE_INTENT_VARS as h, TYPE_SIZE_KEYS as i, enterKeyframe as j, resolveThemeForRuntime as r, themeTokensToCssVars as t };
@@ -33,10 +33,6 @@ import { UISlot, RenderItemLambda, EventPayloadValue } from '@almadar/core';
33
33
  * @packageDocumentation
34
34
  */
35
35
 
36
- /**
37
- * Animation types for slot transitions
38
- */
39
- type SlotAnimation = 'fade' | 'slide' | 'scale' | 'none';
40
36
  /**
41
37
  * Render-prop callback after fn-form-lambda conversion or
42
38
  * `wrapCallbackForEvent` wrapping. Pattern components consume these as
@@ -85,8 +81,6 @@ interface SlotContent {
85
81
  props: SlotProps | string;
86
82
  /** Priority for conflict resolution (higher wins) */
87
83
  priority: number;
88
- /** Animation for showing/hiding */
89
- animation?: SlotAnimation;
90
84
  /** Auto-dismiss timestamp (for toasts) */
91
85
  autoDismissAt?: number;
92
86
  /** Callback when dismissed */
@@ -116,8 +110,6 @@ interface SlotRenderConfig {
116
110
  props?: SlotProps | string;
117
111
  /** Priority (default: 0) */
118
112
  priority?: number;
119
- /** Animation type */
120
- animation?: SlotAnimation;
121
113
  /** Auto-dismiss after ms (for toasts) */
122
114
  autoDismissMs?: number;
123
115
  /** Callback on dismiss */
@@ -215,4 +207,4 @@ declare const DEFAULT_SLOTS: Partial<Record<UISlot, SlotContent | null>>;
215
207
  */
216
208
  declare function useUISlotManager(): UISlotManager;
217
209
 
218
- export { DEFAULT_SLOTS as D, type SlotAnimation as S, type UISlotManager as U, type SlotChangeCallback as a, type SlotContent as b, type SlotRenderConfig as c, type SlotPropValue as d, useUISlotManager as u };
210
+ export { DEFAULT_SLOTS as D, type SlotChangeCallback as S, type UISlotManager as U, type SlotContent as a, type SlotRenderConfig as b, type SlotPropValue as c, useUISlotManager as u };
@@ -1,4 +1,4 @@
1
- import { D as DrawableNode } from './paintDispatch-CMgOyVjS.js';
1
+ import { D as DrawableNode } from './paintDispatch-DHo3WhaU.js';
2
2
  import { OrbitalVerificationAPI, TraitStateSnapshot, EventPayload, BusEvent, VerificationCheck, BridgeHealth, VerificationSnapshot, VerificationSummary, TransitionTrace, OrbitalEventRequest, OrbitalEventResponse, ServerResponseTrace, EffectTrace, CheckStatus, ServerEffectResult, AssetLoadStatus } from '@almadar/core';
3
3
  import { EventTransport } from '@almadar/runtime';
4
4
 
package/locales/ar.json CHANGED
@@ -1150,5 +1150,35 @@
1150
1150
  "flowCanvas.presetSize": "{{label}} ({{width}}بكسل)",
1151
1151
  "avl.breadcrumb.transitionNumber": "الانتقال #{{n}}",
1152
1152
  "orbInspector.pattern": "النمط",
1153
- "orbInspector.slotLabel": "الفتحة: {{slot}}"
1153
+ "orbInspector.slotLabel": "الفتحة: {{slot}}",
1154
+ "detailPanel.section.activity": "النشاط",
1155
+ "detailPanel.section.lineItems": "البنود",
1156
+ "detailPanel.tab.overview": "نظرة عامة",
1157
+ "detailPanel.thread.empty": "لا توجد رسائل بعد",
1158
+ "detailPanel.openImage": "فتح الصورة",
1159
+ "detailPanel.showImage": "عرض الصورة {{index}}",
1160
+ "aria.clearSelection": "مسح التحديد",
1161
+ "aria.searchOptions": "البحث في الخيارات",
1162
+ "aria.zoomIn": "تكبير",
1163
+ "aria.zoomOut": "تصغير",
1164
+ "aria.previousPage": "الصفحة السابقة",
1165
+ "aria.nextPage": "الصفحة التالية",
1166
+ "aria.downloadDocument": "تنزيل المستند",
1167
+ "aria.printDocument": "طباعة المستند",
1168
+ "aria.wrapLines": "التفاف الأسطر",
1169
+ "aria.copyCode": "نسخ الشيفرة",
1170
+ "aria.clearInput": "مسح الإدخال",
1171
+ "aria.skipToContent": "انتقل إلى المحتوى",
1172
+ "aria.mainNavigation": "التنقل الرئيسي",
1173
+ "aria.carouselSlides": "الشرائح",
1174
+ "aria.minimap": "الخريطة المصغرة",
1175
+ "aria.canvasScene": "مشهد اللعبة",
1176
+ "aria.learningCanvas": "رسم تفاعلي",
1177
+ "aria.scene3d": "مشهد ثلاثي الأبعاد",
1178
+ "aria.graphCanvas": "رسم بياني",
1179
+ "aria.positionedCanvas": "مخطط الموقع",
1180
+ "aria.walkTraitDone": "مكتمل",
1181
+ "aria.walkTraitPending": "قيد الانتظار",
1182
+ "aria.walkGraph": "مخطط الحالات لـ {{trait}}: من {{from}} إلى {{to}}",
1183
+ "aria.loading": "جارٍ التحميل"
1154
1184
  }
package/locales/en.json CHANGED
@@ -1150,5 +1150,35 @@
1150
1150
  "flowCanvas.presetSize": "{{label}} ({{width}}px)",
1151
1151
  "avl.breadcrumb.transitionNumber": "Transition #{{n}}",
1152
1152
  "orbInspector.pattern": "Pattern",
1153
- "orbInspector.slotLabel": "slot: {{slot}}"
1153
+ "orbInspector.slotLabel": "slot: {{slot}}",
1154
+ "detailPanel.section.activity": "Activity",
1155
+ "detailPanel.section.lineItems": "Line items",
1156
+ "detailPanel.tab.overview": "Overview",
1157
+ "detailPanel.thread.empty": "No messages yet",
1158
+ "detailPanel.openImage": "Open image",
1159
+ "detailPanel.showImage": "Show image {{index}}",
1160
+ "aria.clearSelection": "Clear selection",
1161
+ "aria.searchOptions": "Search options",
1162
+ "aria.zoomIn": "Zoom in",
1163
+ "aria.zoomOut": "Zoom out",
1164
+ "aria.previousPage": "Previous page",
1165
+ "aria.nextPage": "Next page",
1166
+ "aria.downloadDocument": "Download document",
1167
+ "aria.printDocument": "Print document",
1168
+ "aria.wrapLines": "Wrap lines",
1169
+ "aria.copyCode": "Copy code",
1170
+ "aria.clearInput": "Clear input",
1171
+ "aria.skipToContent": "Skip to content",
1172
+ "aria.mainNavigation": "Main navigation",
1173
+ "aria.carouselSlides": "Slides",
1174
+ "aria.minimap": "Minimap",
1175
+ "aria.canvasScene": "Game scene",
1176
+ "aria.learningCanvas": "Interactive diagram",
1177
+ "aria.scene3d": "3D scene",
1178
+ "aria.graphCanvas": "Graph",
1179
+ "aria.positionedCanvas": "Floor plan",
1180
+ "aria.walkTraitDone": "completed",
1181
+ "aria.walkTraitPending": "pending",
1182
+ "aria.walkGraph": "State graph for {{trait}}: {{from}} to {{to}}",
1183
+ "aria.loading": "Loading"
1154
1184
  }
package/locales/sl.json CHANGED
@@ -1150,5 +1150,35 @@
1150
1150
  "flowCanvas.presetSize": "{{label}} ({{width}} px)",
1151
1151
  "avl.breadcrumb.transitionNumber": "Prehod #{{n}}",
1152
1152
  "orbInspector.pattern": "Vzorec",
1153
- "orbInspector.slotLabel": "reža: {{slot}}"
1153
+ "orbInspector.slotLabel": "reža: {{slot}}",
1154
+ "detailPanel.section.activity": "Dejavnost",
1155
+ "detailPanel.section.lineItems": "Postavke",
1156
+ "detailPanel.tab.overview": "Pregled",
1157
+ "detailPanel.thread.empty": "Še ni sporočil",
1158
+ "detailPanel.openImage": "Odpri sliko",
1159
+ "detailPanel.showImage": "Prikaži sliko {{index}}",
1160
+ "aria.clearSelection": "Počisti izbor",
1161
+ "aria.searchOptions": "Išči možnosti",
1162
+ "aria.zoomIn": "Povečaj",
1163
+ "aria.zoomOut": "Pomanjšaj",
1164
+ "aria.previousPage": "Prejšnja stran",
1165
+ "aria.nextPage": "Naslednja stran",
1166
+ "aria.downloadDocument": "Prenesi dokument",
1167
+ "aria.printDocument": "Natisni dokument",
1168
+ "aria.wrapLines": "Prelomi vrstice",
1169
+ "aria.copyCode": "Kopiraj kodo",
1170
+ "aria.clearInput": "Počisti vnos",
1171
+ "aria.skipToContent": "Preskoči na vsebino",
1172
+ "aria.mainNavigation": "Glavna navigacija",
1173
+ "aria.carouselSlides": "Diapozitivi",
1174
+ "aria.minimap": "Pomanjšani zemljevid",
1175
+ "aria.canvasScene": "Prizor igre",
1176
+ "aria.learningCanvas": "Interaktivni diagram",
1177
+ "aria.scene3d": "3D prizor",
1178
+ "aria.graphCanvas": "Graf",
1179
+ "aria.positionedCanvas": "Tloris",
1180
+ "aria.walkTraitDone": "končano",
1181
+ "aria.walkTraitPending": "čaka",
1182
+ "aria.walkGraph": "Graf stanj za {{trait}}: od {{from}} do {{to}}",
1183
+ "aria.loading": "Nalaganje"
1154
1184
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "6.51.2",
3
+ "version": "6.52.0",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -126,17 +126,18 @@
126
126
  "access": "public"
127
127
  },
128
128
  "dependencies": {
129
- "@almadar/core": "^10.113.0",
129
+ "@almadar/core": "^10.114.0",
130
130
  "@almadar/evaluator": "^2.53.0",
131
131
  "@almadar/logger": "^1.15.0",
132
- "@almadar/runtime": "^6.99.0",
133
- "@almadar/std": "^16.237.0",
132
+ "@almadar/runtime": "^6.100.0",
133
+ "@almadar/std": "^16.238.0",
134
134
  "@almadar/syntax": "^1.19.0",
135
135
  "@dnd-kit/core": "^6.3.1",
136
136
  "@dnd-kit/sortable": "^10.0.0",
137
137
  "@dnd-kit/utilities": "^3.2.2",
138
138
  "@phosphor-icons/react": "^2.1.10",
139
139
  "@tabler/icons-react": "^3.44.0",
140
+ "@tailwindcss/typography": "^0.5.20",
140
141
  "@xyflow/react": "12.10.1",
141
142
  "clsx": "^2.1.0",
142
143
  "d3-force": "^3.0.0",
@@ -162,12 +163,12 @@
162
163
  "@react-three/fiber": "^9.0.0",
163
164
  "@react-three/postprocessing": "^3.0.0",
164
165
  "@tanstack/react-query": "^5.0.0",
166
+ "postcss": "^8.4.35",
165
167
  "react": ">=18.0.0",
166
168
  "react-dom": ">=18.0.0",
167
169
  "react-router-dom": "^7.0.0",
168
- "three": "^0.160.0",
169
- "postcss": "^8.4.35",
170
- "tailwindcss": "^3.4.0"
170
+ "tailwindcss": "^3.4.0",
171
+ "three": "^0.160.0"
171
172
  },
172
173
  "peerDependenciesMeta": {
173
174
  "@react-three/drei": {
@@ -190,7 +191,7 @@
190
191
  }
191
192
  },
192
193
  "devDependencies": {
193
- "@almadar-io/behaviors": "^0.16.184",
194
+ "@almadar-io/behaviors": "^0.16.185",
194
195
  "@almadar/eslint-plugin": "^2.21.0",
195
196
  "@react-three/drei": "^10.7.7",
196
197
  "@react-three/fiber": "^9.6.0",
@@ -212,6 +213,7 @@
212
213
  "@vitejs/plugin-react": "^4.2.0",
213
214
  "@vitest/ui": "^3.2.6",
214
215
  "autoprefixer": "^10.4.0",
216
+ "axe-core": "4.13.0",
215
217
  "babel-plugin-react-compiler": "19.0.0-beta-af1b7da-20250417",
216
218
  "eslint": "10.0.0",
217
219
  "eslint-plugin-react-compiler": "19.1.0-rc.2",
@@ -231,7 +233,8 @@
231
233
  "turbo": "^2.8.17",
232
234
  "typescript": "npm:@typescript/typescript6@^6.0.2",
233
235
  "vite": "^5.2.0",
234
- "vitest": "^3.2.6"
236
+ "vitest": "^3.2.6",
237
+ "vitest-axe": "^0.1.0"
235
238
  },
236
239
  "repository": {
237
240
  "type": "git",
@@ -46,6 +46,10 @@ module.exports = {
46
46
  'grid-cols-1', 'grid-cols-2', 'grid-cols-3', 'grid-cols-4',
47
47
  'sm:grid-cols-2', 'md:grid-cols-2', 'md:grid-cols-3', 'lg:grid-cols-3', 'lg:grid-cols-4',
48
48
  'text-center', 'text-left', 'text-right',
49
+ // Split composes its column widths as `${breakpoint}${ratio}` at runtime
50
+ ...['sm:', 'md:', 'lg:', 'xl:'].flatMap((bp) => [
51
+ 'w-1/2', 'w-1/3', 'w-2/3', 'w-1/4', 'w-3/4', 'w-1/5', 'w-4/5', 'w-2/5', 'w-3/5', 'flex-row-reverse',
52
+ ].map((cls) => `${bp}${cls}`)),
49
53
  // Non-theme CSS variable classes (no semantic equivalent in theme config)
50
54
  'active:scale-[var(--active-scale)]',
51
55
  'border-b-[length:var(--border-width)]',
@@ -440,6 +444,12 @@ module.exports = {
440
444
  'pt-[env(safe-area-inset-top)]',
441
445
  'rounded-[calc(var(--radius-xl)*1.5)]',
442
446
  'text-primary-foreground/80',
447
+
448
+ // Auto-added by audit-tailwind-safelist.ts (2026-10-01)
449
+ 'max-w-[18rem]',
450
+
451
+ // Auto-added by audit-tailwind-safelist.ts (2026-10-01)
452
+ 'lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]',
443
453
  ],
444
454
  theme: {
445
455
  fontFamily: {
@@ -452,6 +462,15 @@ module.exports = {
452
462
  body: ['var(--font-family-body, var(--font-family))', 'ui-sans-serif', 'system-ui', 'sans-serif'],
453
463
  },
454
464
  extend: {
465
+ // MarkdownContent draws its own inline-code chip; drop the plugin's literal backticks
466
+ typography: {
467
+ DEFAULT: {
468
+ css: {
469
+ 'code::before': { content: 'none' },
470
+ 'code::after': { content: 'none' },
471
+ },
472
+ },
473
+ },
455
474
  colors: {
456
475
  primary: {
457
476
  DEFAULT: withOpacity('--color-primary'),
@@ -809,6 +828,8 @@ module.exports = {
809
828
  },
810
829
  },
811
830
  plugins: [
831
+ // MarkdownContent styles itself with `prose`, themed via its --tw-prose-* vars
832
+ require('@tailwindcss/typography'),
812
833
  // Chrome-skin utilities: sprite-driven panel/button chrome, opt-in per theme.
813
834
  // No-op (`none`) unless the active theme defines the backing --game-* vars —
814
835
  // zero visual change for every theme that doesn't set them.
@@ -841,9 +862,11 @@ module.exports = {
841
862
  'background-size': 'var(--surface-page-image-size, auto)',
842
863
  'background-attachment': 'fixed',
843
864
  },
844
- // Interactive-control border style (outset bevel for Win95-style chrome).
865
+ // Interactive-control geometry: border style (outset bevel for Win95-style
866
+ // chrome) and corner shape (round controls inside a scoop/notch frame).
845
867
  '.interactive-border': {
846
868
  'border-style': 'var(--border-style-interactive, var(--border-style, solid))',
869
+ 'corner-shape': 'var(--corner-shape-interactive, var(--corner-shape, round))',
847
870
  },
848
871
  '.chrome-button': {
849
872
  'background-image': 'var(--game-button-bg-image, none)',
package/themes/_base.css CHANGED
@@ -215,6 +215,23 @@
215
215
  --motion-page-exit-to-opacity: 0;
216
216
  --motion-page-exit-to-transform: translateY(-8px);
217
217
 
218
+ /* ----------------------------------------------------------------
219
+ * Element entry — how a rendered element animates in when it mounts.
220
+ * --motion-enter-default is the keyframe every slot's content plays when
221
+ * it changes (`none` = off); a render-ui node's own `enter` overrides it.
222
+ * The shape tokens restyle what each named entry looks like; timing is
223
+ * the `enter` intent (--duration-normal / --easing-emphasized).
224
+ * ---------------------------------------------------------------- */
225
+ --motion-enter-default: almadar-enter-fade;
226
+ /* A busy control shows its spinner only once its action outlasts this
227
+ * (under it the action reads as instant — no flash on fast actions). */
228
+ --motion-busy-delay: 300ms;
229
+ --motion-enter-stagger: 40ms;
230
+ --motion-enter-rise-from-transform: translateY(12px);
231
+ --motion-enter-scale-from-transform: scale(0.96);
232
+ --motion-enter-slide-sign: 1;
233
+ --motion-enter-slide-from-transform: translateX(calc(16px * var(--motion-enter-slide-sign)));
234
+
218
235
  /* ----------------------------------------------------------------
219
236
  * Skeleton shimmer — the loading-placeholder sweep. Two color stops
220
237
  * (base + highlight) drive the gradient; --duration-shimmer the loop.
@@ -225,6 +242,75 @@
225
242
  --duration-shimmer: 1.5s;
226
243
  }
227
244
 
245
+ [dir="rtl"] {
246
+ --motion-enter-slide-sign: -1;
247
+ }
248
+
249
+ @keyframes almadar-enter-fade {
250
+ from { opacity: 0; }
251
+ }
252
+ @keyframes almadar-enter-rise {
253
+ from { opacity: 0; transform: var(--motion-enter-rise-from-transform); }
254
+ }
255
+ @keyframes almadar-enter-scale {
256
+ from { opacity: 0; transform: var(--motion-enter-scale-from-transform); }
257
+ }
258
+ @keyframes almadar-enter-slide {
259
+ from { opacity: 0; transform: var(--motion-enter-slide-from-transform); }
260
+ }
261
+
262
+ /* Busy control: the label gives way to the spinner only after --motion-busy-delay. */
263
+ @keyframes almadar-busy-hide {
264
+ to { visibility: hidden; }
265
+ }
266
+ @keyframes almadar-busy-show {
267
+ from { opacity: 0; }
268
+ to { opacity: 1; }
269
+ }
270
+ .almadar-busy-content {
271
+ animation: almadar-busy-hide 0s linear var(--motion-busy-delay, 300ms) forwards;
272
+ }
273
+ .almadar-busy-indicator {
274
+ opacity: 0;
275
+ animation: almadar-busy-show var(--duration-fast, 150ms) var(--easing-standard, ease) var(--motion-busy-delay, 300ms) forwards;
276
+ }
277
+
278
+ /* A row whose own action is in flight: dims after --motion-busy-delay, never re-clickable. */
279
+ @keyframes almadar-row-pending {
280
+ to { opacity: 0.55; }
281
+ }
282
+ [data-row-pending="true"] {
283
+ pointer-events: none;
284
+ animation: almadar-row-pending var(--duration-fast, 150ms) var(--easing-standard, ease) var(--motion-busy-delay, 300ms) forwards;
285
+ }
286
+
287
+ /* Slot content: plays the theme's default entry (restarted when the content changes). */
288
+ .almadar-enter-slot {
289
+ animation-name: var(--motion-enter-default, none);
290
+ }
291
+ .almadar-enter-slot,
292
+ .almadar-enter-fade,
293
+ .almadar-enter-rise,
294
+ .almadar-enter-scale,
295
+ .almadar-enter-slide {
296
+ animation-duration: var(--duration-normal, 250ms);
297
+ animation-timing-function: var(--easing-emphasized, cubic-bezier(0.2, 0, 0, 1));
298
+ animation-fill-mode: both;
299
+ animation-delay: calc(var(--enter-index, 0) * var(--motion-enter-stagger, 40ms));
300
+ }
301
+ .almadar-enter-fade { animation-name: almadar-enter-fade; }
302
+ .almadar-enter-rise { animation-name: almadar-enter-rise; }
303
+ .almadar-enter-scale { animation-name: almadar-enter-scale; }
304
+ .almadar-enter-slide { animation-name: almadar-enter-slide; }
305
+ .almadar-enter-delay-1 { --enter-index: 1; }
306
+ .almadar-enter-delay-2 { --enter-index: 2; }
307
+ .almadar-enter-delay-3 { --enter-index: 3; }
308
+ .almadar-enter-delay-4 { --enter-index: 4; }
309
+ .almadar-enter-delay-5 { --enter-index: 5; }
310
+ .almadar-enter-delay-6 { --enter-index: 6; }
311
+ .almadar-enter-delay-7 { --enter-index: 7; }
312
+ .almadar-enter-delay-8 { --enter-index: 8; }
313
+
228
314
  /* The shimmer gradient background. Pair with the `animate-shimmer` utility
229
315
  * (defined in tailwind-preset) which sweeps background-position. */
230
316
  .almadar-shimmer {
@@ -227,6 +227,7 @@ These separate artistic styles (Art Deco vs Win95 vs wabi-sabi) along dimensions
227
227
  | `typeScale.fontImport` | — (not a var) | preset: generated `_fonts.css` `@import`; inline: `OrbitalThemeProvider` `<link>`; compiled: `@import` atop the theme CSS | — |
228
228
  | `geometry.cornerShape` | `--corner-shape` | every element inside `[data-theme]` (CSS `corner-shape`; Chromium 139+, other engines render plain round corners) | `round` |
229
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` |
230
231
  | `geometry.borderStyle` | `--border-style` | every bordered element (scoped reset) | `solid` |
231
232
  | `geometry.borderStyleInteractive` | `--border-style-interactive` | `Button` (`.interactive-border`) | `--border-style` |
232
233
  | `elevation.interactiveElevation` | `--elevation-interactive` | `Button` resting (`shadow-elevation-interactive`) | `--shadow-sm` |
@@ -31,6 +31,7 @@
31
31
  --color-warning-foreground: #000000;
32
32
  --color-info: #1d4ed8;
33
33
  --color-info-foreground: #ffffff;
34
+ --color-scrim: rgba(0, 0, 0, 0.6);
34
35
  --radius-none: 0px;
35
36
  --radius-sm: 4px;
36
37
  --radius-md: 8px;
@@ -118,6 +119,7 @@
118
119
  --color-warning-foreground: #000000;
119
120
  --color-info: #38bdf8;
120
121
  --color-info-foreground: #000000;
122
+ --color-scrim: rgba(0, 0, 0, 0.7);
121
123
  --radius-none: 0px;
122
124
  --radius-sm: 4px;
123
125
  --radius-md: 8px;
@@ -31,6 +31,7 @@
31
31
  --color-warning-foreground: #000000;
32
32
  --color-info: #0369a1;
33
33
  --color-info-foreground: #ffffff;
34
+ --color-scrim: rgba(0, 0, 0, 0.6);
34
35
  --radius-none: 0px;
35
36
  --radius-sm: 6px;
36
37
  --radius-md: 10px;
@@ -116,6 +117,7 @@
116
117
  --color-warning-foreground: #000000;
117
118
  --color-info: #38bdf8;
118
119
  --color-info-foreground: #000000;
120
+ --color-scrim: rgba(0, 0, 0, 0.7);
119
121
  --radius-none: 0px;
120
122
  --radius-sm: 6px;
121
123
  --radius-md: 10px;
package/themes/aqua.css CHANGED
@@ -11,7 +11,7 @@
11
11
  --color-secondary: #dde5f0;
12
12
  --color-secondary-hover: #cbd6e6;
13
13
  --color-secondary-foreground: #1c2a3a;
14
- --color-accent: #0b6b8a;
14
+ --color-accent: #56657a;
15
15
  --color-accent-foreground: #ffffff;
16
16
  --color-muted: #e4e9f1;
17
17
  --color-muted-foreground: #4a5a70;
@@ -37,6 +37,7 @@
37
37
  --color-warning-foreground: #2a1c00;
38
38
  --color-info: #1f6fe0;
39
39
  --color-info-foreground: #ffffff;
40
+ --color-scrim: rgba(0, 0, 0, 0.6);
40
41
  --radius-none: 0px;
41
42
  --radius-sm: 6px;
42
43
  --radius-md: 9px;
@@ -194,8 +195,8 @@
194
195
  --color-secondary: #343c49;
195
196
  --color-secondary-hover: #414b5b;
196
197
  --color-secondary-foreground: #e8eef8;
197
- --color-accent: #5fd0ee;
198
- --color-accent-foreground: #00222c;
198
+ --color-accent: #9aa7b8;
199
+ --color-accent-foreground: #10161f;
199
200
  --color-muted: #2a313c;
200
201
  --color-muted-foreground: #b4c0d2;
201
202
  --color-background: #1a1f27;
@@ -220,6 +221,7 @@
220
221
  --color-warning-foreground: #2a1c00;
221
222
  --color-info: #4a9bff;
222
223
  --color-info-foreground: #001a3a;
224
+ --color-scrim: rgba(0, 0, 0, 0.7);
223
225
  --radius-none: 0px;
224
226
  --radius-sm: 6px;
225
227
  --radius-md: 9px;
@@ -8,9 +8,9 @@
8
8
  --color-primary: #1f3f8f;
9
9
  --color-primary-hover: #183275;
10
10
  --color-primary-foreground: #fff8e7;
11
- --color-secondary: #2bb3a6;
12
- --color-secondary-hover: #2fbfb1;
13
- --color-secondary-foreground: #06302c;
11
+ --color-secondary: #247a74;
12
+ --color-secondary-hover: #1d6964;
13
+ --color-secondary-foreground: #fff8e7;
14
14
  --color-accent: #7d5a0c;
15
15
  --color-accent-foreground: #fff8e7;
16
16
  --color-muted: #ebe0c6;
@@ -37,6 +37,7 @@
37
37
  --color-warning-foreground: #1a1200;
38
38
  --color-info: #1f5fbf;
39
39
  --color-info-foreground: #ffffff;
40
+ --color-scrim: rgba(0, 0, 0, 0.6);
40
41
  --radius-none: 0px;
41
42
  --radius-sm: 4px;
42
43
  --radius-md: 8px;
@@ -193,8 +194,8 @@
193
194
  --color-primary: #e0b64a;
194
195
  --color-primary-hover: #efc866;
195
196
  --color-primary-foreground: #1a1200;
196
- --color-secondary: #3cc9bb;
197
- --color-secondary-hover: #56d8cb;
197
+ --color-secondary: #4fb3a9;
198
+ --color-secondary-hover: #66c1b8;
198
199
  --color-secondary-foreground: #04201d;
199
200
  --color-accent: #8fb0ff;
200
201
  --color-accent-foreground: #0a1530;
@@ -207,7 +208,7 @@
207
208
  --color-surface: #122040;
208
209
  --color-border: #c9a13a;
209
210
  --color-input: #c9a13a;
210
- --color-ring: #3cc9bb;
211
+ --color-ring: #4fb3a9;
211
212
  --color-table-header: #122040;
212
213
  --color-table-border: #c9a13a;
213
214
  --color-table-row-hover: #1a2c55;
@@ -222,6 +223,7 @@
222
223
  --color-warning-foreground: #1a1200;
223
224
  --color-info: #8ab4ff;
224
225
  --color-info-foreground: #071b3d;
226
+ --color-scrim: rgba(0, 0, 0, 0.7);
225
227
  --radius-none: 0px;
226
228
  --radius-sm: 4px;
227
229
  --radius-md: 8px;
@@ -249,7 +251,7 @@
249
251
  --active-translate-y: 0px;
250
252
  --focus-ring-width: 2px;
251
253
  --focus-ring-offset: 2px;
252
- --focus-ring-color: #3cc9bb;
254
+ --focus-ring-color: #4fb3a9;
253
255
  --shadow-main: 0 4px 14px rgba(0,0,0,0.45);
254
256
  --shadow-sm: 0 1px 3px rgba(0,0,0,0.4);
255
257
  --shadow-lg: 0 12px 32px rgba(0,0,0,0.55);
@@ -5,7 +5,7 @@
5
5
  */
6
6
 
7
7
  [data-theme="art-deco-light"] {
8
- --color-primary: #7a5a00;
8
+ --color-primary: #7d6024;
9
9
  --color-primary-foreground: #fff6d8;
10
10
  --color-secondary: #0f5a45;
11
11
  --color-secondary-hover: #0b4937;
@@ -36,7 +36,8 @@
36
36
  --color-warning-foreground: #1a1200;
37
37
  --color-info: #1f4a8a;
38
38
  --color-info-foreground: #ffffff;
39
- --color-primary-hover: #634900;
39
+ --color-primary-hover: #664e1c;
40
+ --color-scrim: rgba(0, 0, 0, 0.6);
40
41
  --radius-none: 0px;
41
42
  --radius-sm: 4px;
42
43
  --radius-md: 8px;
@@ -52,7 +53,7 @@
52
53
  --font-weight-bold: 700;
53
54
  --letter-spacing: 0.02em;
54
55
  --line-height: 1.55;
55
- --icon-color: #7a5a00;
56
+ --icon-color: #7d6024;
56
57
  --transition-fast: 240ms;
57
58
  --transition-normal: 420ms;
58
59
  --transition-slow: 700ms;
@@ -221,6 +222,7 @@
221
222
  --color-warning-foreground: #1a1200;
222
223
  --color-info: #79a8f2;
223
224
  --color-info-foreground: #051226;
225
+ --color-scrim: rgba(0, 0, 0, 0.7);
224
226
  --radius-none: 0px;
225
227
  --radius-sm: 4px;
226
228
  --radius-md: 8px;
@@ -37,6 +37,7 @@
37
37
  --color-warning-foreground: #2a1c00;
38
38
  --color-info: #3a6a80;
39
39
  --color-info-foreground: #ffffff;
40
+ --color-scrim: rgba(0, 0, 0, 0.6);
40
41
  --radius-none: 0px;
41
42
  --radius-sm: 8px;
42
43
  --radius-md: 16px;
@@ -181,6 +182,7 @@
181
182
  --border-heavy: var(--border-width-thick);
182
183
  --corner-shape: scoop;
183
184
  --corner-shape-pill: round;
185
+ --corner-shape-interactive: round;
184
186
  --border-style: solid;
185
187
  --border-style-interactive: solid;
186
188
  --surface-card-image: linear-gradient(160deg, rgba(255,250,235,0.7), rgba(233,200,192,0.12));
@@ -221,6 +223,7 @@
221
223
  --color-warning-foreground: #241800;
222
224
  --color-info: #86c2dc;
223
225
  --color-info-foreground: #05202c;
226
+ --color-scrim: rgba(0, 0, 0, 0.7);
224
227
  --radius-none: 0px;
225
228
  --radius-sm: 8px;
226
229
  --radius-md: 16px;
@@ -365,6 +368,7 @@
365
368
  --border-heavy: var(--border-width-thick);
366
369
  --corner-shape: scoop;
367
370
  --corner-shape-pill: round;
371
+ --corner-shape-interactive: round;
368
372
  --border-style: solid;
369
373
  --border-style-interactive: solid;
370
374
  --surface-card-image: linear-gradient(160deg, rgba(185,196,106,0.07), rgba(227,160,168,0.04));