Skip to content

Commit 521d222

Browse files
committed
v0.0.3 released - Customizable cursor color
Introduced a new setting allowing users to customize the cursor color using a color picker in SettingsModal.
1 parent 75eb8e3 commit 521d222

File tree

13 files changed

+287
-83
lines changed

13 files changed

+287
-83
lines changed

package-lock.json

Lines changed: 107 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "textcode",
33
"private": true,
4-
"version": "0.0.2",
4+
"version": "0.0.3",
55
"type": "module",
66
"homepage": "https://maek0s.github.io/TextCode",
77
"scripts": {
@@ -18,6 +18,7 @@
1818
"gh-pages": "^6.3.0",
1919
"prismjs": "^1.30.0",
2020
"react": "^19.1.0",
21+
"react-color": "^2.19.3",
2122
"react-confetti": "^6.4.0",
2223
"react-dom": "^19.1.0",
2324
"react-icons": "^5.5.0"

src/App.css

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -379,29 +379,28 @@ footer {
379379

380380
.cursor {
381381
position: relative;
382-
color: #007acc;
383382
font-weight: bold;
384383
}
385384

386385
.cursor::after {
387386
content: "";
388387
position: absolute;
389388
left: 0;
390-
bottom: 0;
389+
bottom: -2px;
391390
width: 2px;
392-
height: 1em;
393-
background-color: #007acc;
391+
height: 0.90em;
392+
background-color: var(--cursor-color, #007acc);
394393
animation: blink 1s steps(2, start) infinite;
395394
}
396395

396+
.cursor.cursorCode::after {
397+
bottom: 0px;
398+
height: 1.1em;
399+
}
400+
397401
@keyframes blink {
398-
0%,
399-
100% {
400-
opacity: 1;
401-
}
402-
50% {
403-
opacity: 0;
404-
}
402+
0%, 50% { opacity: 1; }
403+
51%, 100% { opacity: 0; }
405404
}
406405

407406
/* Cambios situacionales */

src/App.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import UpdatesModal from './components/UpdatesModal.jsx';
2121

2222
function App() {
2323
// Header
24-
const [ isSettingsOpen, setIsSettingsOpen ] = useState(false);
24+
const [ isSettingsOpen, setIsSettingsOpen ] = useState(false)
2525

2626
// Settings
2727
const [ settings, setSettings ] = useState(() => {
@@ -35,7 +35,7 @@ function App() {
3535
})
3636

3737
// Footer
38-
const [ isUpdatesOpen, setIsUpdatesOpen ] = useState(false);
38+
const [ isUpdatesOpen, setIsUpdatesOpen ] = useState(false)
3939

4040
const handleSave = (newSettings) => {
4141
setSettings(newSettings)

src/components/SettingsModal.jsx

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
1+
import { ChromePicker } from "react-color";
2+
import { useState } from "react";
3+
14
import '../styles/SettingsModal.css'
25

3-
export default function SettingsModal({ isOpen, onClose, settings, onSave }) {
6+
export default function SettingsModal({ isOpen, onClose, settings, onSave }) {
7+
const [showColorPicker, setShowColorPicker] = useState(false);
8+
49
if (!isOpen) return null
510

611
const toggleSetting = (key) => {
712
const newSettings = { ...settings, [key]: !settings[key] }
813
onSave(newSettings)
914
}
1015

16+
const handleColorChange = (newColor) => {
17+
const updatedSettings = { ...settings, cursorColor: newColor.hex }
18+
onSave(updatedSettings)
19+
}
20+
21+
console.log(settings.cursorColor)
22+
1123
return (
1224
<div className="modal-overlay" onClick={onClose}>
1325
<div className="modal-content" onClick={(e) => e.stopPropagation()}>
@@ -33,6 +45,45 @@ export default function SettingsModal({ isOpen, onClose, settings, onSave }) {
3345
</div>
3446
</label>
3547

48+
<label className="setting-row">
49+
<span>Mostrar cursor</span>
50+
<div
51+
className={`toggle-switch ${settings.cursor ? "on" : "off"}`}
52+
onClick={() => toggleSetting("cursor")}
53+
>
54+
<div className="toggle-thumb" />
55+
</div>
56+
</label>
57+
58+
{
59+
settings.cursor &&
60+
(
61+
<div className="setting-row">
62+
<span>Color cursor</span>
63+
<span className="reset"
64+
onClick={() => handleColorChange({ hex: "#007acc" })}>Reset</span>
65+
<div
66+
className="color-square"
67+
style={{ backgroundColor: settings.cursorColor || "#000000" }}
68+
onClick={() => setShowColorPicker(!showColorPicker)}
69+
/>
70+
71+
{showColorPicker && (
72+
<div className="popover">
73+
<div className="cover" onClick={() => setShowColorPicker(false)} />
74+
75+
<ChromePicker
76+
className="custom-chrome-picker"
77+
color={settings.cursorColor || "#007acc"}
78+
onChange={handleColorChange}
79+
disableAlpha={true}
80+
/>
81+
</div>
82+
)}
83+
</div>
84+
)
85+
}
86+
3687
<h2>Sonido 🎶</h2>
3788

3889
<label className="setting-row">

src/components/UpdatesModal.jsx

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,6 @@ export default function UpdatesModal({ isOpen, onClose }) {
99
<h2>📢 Próximas actualizaciones</h2>
1010

1111
<div className="updates-list">
12-
<div className="update-block">
13-
<h3>v0.0.3</h3>
14-
<ul>
15-
<li>Lista de controles</li>
16-
<li>Mejoras en los cursores y configuración</li>
17-
<li>Más settings</li>
18-
</ul>
19-
</div>
20-
2112
<div className="update-block">
2213
<h3>v0.0.4</h3>
2314
<ul>

src/logic/Game.jsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ import TimeMode from './modes/TimeMode.jsx';
1616
import OneWord from './modes/OneWord.jsx';
1717

1818
function Game({ settings }) {
19-
const { phraseRandom, resetPhrase } = useRandomPhrase();
20-
const [ phrase, setPhrase ] = useState("");
19+
const { phraseRandom, resetPhrase } = useRandomPhrase()
20+
const [ phrase, setPhrase ] = useState("")
2121
const [ inputCode, setInputCode ] = useState("")
22-
const [ numberLetter, setNumberLetter ] = useState(0);
23-
const [ gamemode, setGamemode ] = useState("text");
24-
const [ progLanguage, setProgLanguage ] = useState("java");
25-
const { fragmentRandom, resetFragment } = useFragmentCode(progLanguage);
26-
const [ timer, setTimer ] = useState(0);
22+
const [ numberLetter, setNumberLetter ] = useState(0)
23+
const [ gamemode, setGamemode ] = useState("text")
24+
const [ progLanguage, setProgLanguage ] = useState("java")
25+
const { fragmentRandom, resetFragment } = useFragmentCode(progLanguage)
26+
const [ timer, setTimer ] = useState(0)
2727

2828
const resetGame = () => {
2929
resetPhrase()

0 commit comments

Comments
 (0)