diff --git a/src/components/NavBar.vue b/src/components/NavBar.vue
index 7baf978..dc79450 100644
--- a/src/components/NavBar.vue
+++ b/src/components/NavBar.vue
@@ -1,9 +1,9 @@
+
+
+
+
+
+
diff --git a/src/components/renderers/SmartCube.vue b/src/components/renderers/SmartCube.vue
index 3bf2d8b..3ebb010 100644
--- a/src/components/renderers/SmartCube.vue
+++ b/src/components/renderers/SmartCube.vue
@@ -5,6 +5,7 @@ import { useSettings } from "../../composables/useSettings";
import { LAYER_ANIMATION_DURATION, MIDDLE_SLICES_ENABLED } from "../../config/settings";
import CubeMoveControls from "./CubeMoveControls.vue";
import MoveHistoryPanel from "./MoveHistoryPanel.vue";
+import FaceProjections from "./FaceProjections.vue";
import { DeepCube } from "../../utils/DeepCube.js";
import { showToast } from "../../utils/toastHelper.js";
import { identityMatrix, rotateXMatrix, rotateYMatrix, rotateZMatrix, multiplyMatrices, matToQuat, slerp, quatToMat } from "../../utils/matrix.js";
@@ -14,7 +15,7 @@ import { getFaceNormal as getFaceNormalRaw, getAllowedAxes as getAllowedAxesRaw,
import { tokenReducer } from "../../utils/tokenReducer.js";
const { cubies, deepCubeState, initCube, rotateLayer, rotateSlice, turn, FACES, solve, solveResult, solveError, isSolverReady } = useCube();
-const { isCubeTranslucent } = useSettings();
+const { isCubeTranslucent, showFaceProjections } = useSettings();
// Bind FACES and viewMatrix to imported helpers
const getFaceNormal = (face) => getFaceNormalRaw(face, FACES);
@@ -878,6 +879,14 @@ onUnmounted(() => {
>
+
+
{
/* Colors - apply to the pseudo-element */
.white::after {
- background: #e0e0e0;
+ background: var(--sticker-white);
}
.yellow::after {
- background: #ffd500;
+ background: var(--sticker-yellow);
}
.green::after {
- background: #009e60;
+ background: var(--sticker-green);
}
.blue::after {
- background: #0051ba;
+ background: var(--sticker-blue);
}
.orange::after {
- background: #ff5800;
+ background: var(--sticker-orange);
}
.red::after {
- background: #c41e3a;
+ background: var(--sticker-red);
}
/* Black internal faces - no sticker needed */
diff --git a/src/composables/useSettings.js b/src/composables/useSettings.js
index b2a6321..1171d17 100644
--- a/src/composables/useSettings.js
+++ b/src/composables/useSettings.js
@@ -8,7 +8,16 @@ try {
}
} catch (e) { }
+let initialShowFaceProjections = false;
+try {
+ const stored = localStorage.getItem("showFaceProjections");
+ if (stored !== null) {
+ initialShowFaceProjections = stored === "true";
+ }
+} catch (e) { }
+
const isCubeTranslucent = ref(initialCubeTranslucent);
+const showFaceProjections = ref(initialShowFaceProjections);
export function useSettings() {
const toggleCubeTranslucent = () => {
@@ -18,8 +27,17 @@ export function useSettings() {
} catch (e) { }
};
+ const toggleFaceProjections = () => {
+ showFaceProjections.value = !showFaceProjections.value;
+ try {
+ localStorage.setItem("showFaceProjections", String(showFaceProjections.value));
+ } catch (e) { }
+ };
+
return {
isCubeTranslucent,
toggleCubeTranslucent,
+ showFaceProjections,
+ toggleFaceProjections,
};
}
diff --git a/src/config/settings.js b/src/config/settings.js
index 6eddd02..736de1b 100644
--- a/src/config/settings.js
+++ b/src/config/settings.js
@@ -2,3 +2,7 @@
export const LAYER_ANIMATION_DURATION = 200;
export const MIDDLE_SLICES_ENABLED = false;
+
+// Distance of rear face projections from cube center (in cube-size units)
+// 1.0 = one cube width, 0.5 = half cube width
+export const REAR_FACE_DISTANCE = 1.0;
diff --git a/src/style.css b/src/style.css
index 9a0288d..a658d85 100644
--- a/src/style.css
+++ b/src/style.css
@@ -42,6 +42,14 @@
--button-active-shadow: 0 0 20px rgba(79, 172, 254, 0.4);
--cube-edge-color: #333333;
--title-gradient: linear-gradient(45deg, #00f2fe, #4facfe);
+
+ /* Cube sticker colors */
+ --sticker-white: #e0e0e0;
+ --sticker-yellow: #ffd500;
+ --sticker-green: #009e60;
+ --sticker-blue: #0051ba;
+ --sticker-orange: #ff5800;
+ --sticker-red: #c41e3a;
}
:root[data-theme="light"] {
@@ -81,6 +89,7 @@ a {
color: #646cff;
text-decoration: inherit;
}
+
a:hover {
color: #535bf2;
}
@@ -113,9 +122,11 @@ button {
cursor: pointer;
transition: border-color 0.25s;
}
+
button:hover {
border-color: #646cff;
}
+
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
@@ -191,9 +202,11 @@ button.btn-neon.icon-only {
color: #213547;
background-color: #ffffff;
}
+
a:hover {
color: #747bff;
}
+
button {
background-color: #f9f9f9;
}