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; }