Snippets: Chmod Calculator
:root { --primary: #6366f1; --primary-hover: #4f46e5; --bg: #f1f5f9; --card: #ffffff; --text: #1e293b; --text-muted: #64748b; --border: #e2e8f0; --radius: 12px; --shadow: 0 4px 24px rgba(0,0,0,0.08); --green: #22c55e; --green-bg: #f0fdf4; } * { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: "Segoe UI", system-ui, -apple-system, sans-serif; background: var(--bg); color: var(--text); min-height: 100vh; display: flex; justify-content: center; align-items: flex-start; padding: 24px 16px; }
CSS Before Head
<meta name="viewport" content="width=device-width, initial-scale=1.0">
HTML Head
.container { background: var(--card); border-radius: var(--radius); box-shadow: var(--shadow); padding: 32px; width: 100%; max-width: 560px; } h1 { font-size: 1.5rem; font-weight: 700; text-align: center; margin-bottom: 24px; color: var(--primary); } .numeric-input { display: flex; align-items: center; gap: 12px; margin-bottom: 20px; padding: 16px; background: #f8fafc; border: 1.5px solid var(--border); border-radius: 8px; } .numeric-input label { font-weight: 600; font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--text-muted); white-space: nowrap; } .numeric-input input { flex: 1; padding: 10px 14px; border: 1.5px solid var(--border); border-radius: 8px; font-size: 1.25rem; font-family: "JetBrains Mono", "Courier New", monospace; font-weight: 600; text-align: center; color: var(--text); letter-spacing: 0.3em; transition: border-color 0.2s; } .numeric-input input:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(99,102,241,0.15); } .permission-symbol { font-family: "JetBrains Mono", "Courier New", monospace; font-size: 1.1rem; font-weight: 600; color: var(--primary); letter-spacing: 0.15em; min-width: 90px; text-align: center; } .boxes { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; margin-bottom: 20px; } .box { background: #f8fafc; border: 1.5px solid var(--border); border-radius: 8px; padding: 16px; text-align: center; } .box h2 { font-size: 0.8rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); margin-bottom: 12px; } .box .digit { font-family: "JetBrains Mono", monospace; font-size: 1.5rem; font-weight: 700; color: var(--primary); margin-bottom: 10px; } .box ul { list-style: none; padding: 0; margin: 0; } .box ul li { display: flex; align-items: center; gap: 8px; padding: 4px 0; font-size: 0.85rem; cursor: pointer; } .box ul li input[type="checkbox"] { width: 16px; height: 16px; accent-color: var(--primary); cursor: pointer; } .box ul li span { color: var(--text); user-select: none; } .box ul li input[type="checkbox"]:checked + span { font-weight: 600; color: var(--primary); } .result-bar { display: flex; align-items: center; justify-content: space-between; padding: 14px 18px; background: var(--green-bg); border: 1.5px solid #bbf7d0; border-radius: 8px; } .result-bar .command { font-family: "JetBrains Mono", monospace; font-size: 0.95rem; font-weight: 500; color: #15803d; } .result-bar .command-label { font-size: 0.7rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: #16a34a; } .error-msg { color: #ef4444; font-size: 0.85rem; text-align: center; margin-top: 8px; min-height: 1.2em; }
CSS After Head
JS Before HTML Body
HTML Body Attrs
<div class="container"> <h1>Chmod Calculator</h1> <div class="numeric-input"> <label>Numeric</label> <input type="text" id="numericInput" value="755" maxlength="3" placeholder="755"> <div class="permission-symbol" id="symbolDisplay">rwxr-xr-x</div> </div> <div class="boxes"> <div class="box" id="owner"> <h2>Owner</h2> <div class="digit" id="ownerDigit">7</div> <ul> <li><input type="checkbox" name="owner_r" checked> <span>Read</span></li> <li><input type="checkbox" name="owner_w" checked> <span>Write</span></li> <li><input type="checkbox" name="owner_x" checked> <span>Execute</span></li> </ul> </div> <div class="box" id="group"> <h2>Group</h2> <div class="digit" id="groupDigit">5</div> <ul> <li><input type="checkbox" name="group_r" checked> <span>Read</span></li> <li><input type="checkbox" name="group_w"> <span>Write</span></li> <li><input type="checkbox" name="group_x" checked> <span>Execute</span></li> </ul> </div> <div class="box" id="other"> <h2>Other</h2> <div class="digit" id="otherDigit">5</div> <ul> <li><input type="checkbox" name="other_r" checked> <span>Read</span></li> <li><input type="checkbox" name="other_w"> <span>Write</span></li> <li><input type="checkbox" name="other_x" checked> <span>Execute</span></li> </ul> </div> </div> <div class="result-bar"> <div> <div class="command-label">Command</div> <div class="command" id="commandDisplay">chmod 755</div> </div> </div> <div class="error-msg" id="errorMsg"></div> </div>
HTML Body
HTML Foot
var checkboxes = document.querySelectorAll("input[type=checkbox]"); var numericInput = document.getElementById("numericInput"); var symbolDisplay = document.getElementById("symbolDisplay"); var commandDisplay = document.getElementById("commandDisplay"); var errorMsg = document.getElementById("errorMsg"); function getPermsFromCheckboxes() { var perms = { owner: [0,0,0], group: [0,0,0], other: [0,0,0] }; checkboxes.forEach(function(cb) { if (cb.checked) { var parts = cb.name.split("_"); var idx = {"r":0,"w":1,"x":2}[parts[1]]; perms[parts[0]][idx] = 1; } }); return perms; } function permsToNumeric(perms) { var s = ""; for (var k in perms) { s += parseInt(perms[k].join(""), 2); } return s; } function permsToSymbol(perms) { var s = ""; for (var k in perms) { s += perms[k][0] ? "r" : "-"; s += perms[k][1] ? "w" : "-"; s += perms[k][2] ? "x" : "-"; } return s; } function updateFromCheckboxes() { var perms = getPermsFromCheckboxes(); var num = permsToNumeric(perms); var sym = permsToSymbol(perms); numericInput.value = num; symbolDisplay.textContent = sym; commandDisplay.textContent = "chmod " + num; document.getElementById("ownerDigit").textContent = num[0]; document.getElementById("groupDigit").textContent = num[1]; document.getElementById("otherDigit").textContent = num[2]; errorMsg.textContent = ""; } function parsePermission(num) { var n = parseInt(num); if (isNaN(n) || n < 0 || n > 7) return null; var bin = n.toString(2); while (bin.length < 3) bin = "0" + bin; return [parseInt(bin[0]), parseInt(bin[1]), parseInt(bin[2])]; } function updateFromNumeric() { var val = numericInput.value.trim(); if (val.length === 0) { symbolDisplay.textContent = "---------"; commandDisplay.textContent = "chmod ---"; document.getElementById("ownerDigit").textContent = "-"; document.getElementById("groupDigit").textContent = "-"; document.getElementById("otherDigit").textContent = "-"; checkboxes.forEach(function(cb) { cb.checked = false; }); errorMsg.textContent = ""; return; } if (val.length !== 3) { errorMsg.textContent = "Must be exactly 3 digits (0-7 each)."; return; } for (var i = 0; i < 3; i++) { if (val[i] < "0" || val[i] > "7") { errorMsg.textContent = "Each digit must be between 0 and 7."; return; } } errorMsg.textContent = ""; var groups = ["owner", "group", "other"]; var perm = {}; for (var i = 0; i < 3; i++) { perm[groups[i]] = parsePermission(val[i]); } var sym = permsToSymbol(perm); symbolDisplay.textContent = sym; commandDisplay.textContent = "chmod " + val; checkboxes.forEach(function(cb) { cb.checked = false; }); for (var i = 0; i < 3; i++) { var g = groups[i]; var p = perm[g]; document.getElementById(g + "Digit").textContent = val[i]; if (p[0]) document.querySelector("input[name=" + g + "_r]").checked = true; if (p[1]) document.querySelector("input[name=" + g + "_w]").checked = true; if (p[2]) document.querySelector("input[name=" + g + "_x]").checked = true; } } checkboxes.forEach(function(cb) { cb.addEventListener("change", updateFromCheckboxes); }); numericInput.addEventListener("input", updateFromNumeric); numericInput.addEventListener("focus", function() { this.select(); }); updateFromNumeric();
JS After HTML Body
Full HTML Code