Files
P4RS3LT0NGV3/css/style.css
T

5622 lines
127 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* SignWriting font (Google Fonts) — ISWA 2010 glyphs (U+1D800U+1DAFF) */
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SignWriting&display=swap');
.danger-modal-backdrop { display: none; }
.danger-modal-backdrop.danger-active { display: none; }
.danger-modal { display: none; }
@keyframes danger-pop { to { transform: scale(1); } }
.danger-actions { display:flex; gap:var(--spacing-sm); justify-content:flex-end; padding: var(--spacing-sm) var(--spacing-md); border-top:1px solid var(--danger-color); }
.danger-cancel { background: var(--button-bg); border:1px solid var(--input-border); padding:var(--spacing-sm) var(--spacing-sm); border-radius:6px; cursor:pointer; }
.danger-proceed { background:var(--danger-color); border:1px solid var(--danger-border); color:var(--danger-text); padding:var(--spacing-sm) var(--spacing-sm); border-radius:6px; cursor:pointer; box-shadow: 0 0 12px rgba(var(--danger-text-rgb),.35) inset, 0 0 16px rgba(var(--danger-text-rgb),.2); }
/* Modern dark theme styling */
:root {
--main-bg-color: #1a1a1a;
--secondary-bg: #242424;
--text-color: #e0e0e0;
--text-muted: #a0a0a0;
--accent-color: #64b5f6;
--accent-color-rgb: 100, 181, 246;
--accent-hover: #90caf9;
--success-color: #81c784;
--button-bg: #2d2d2d;
--button-hover-bg: #404040;
--button-active-bg: #64b5f6;
--input-bg: #2d2d2d;
--input-border: #404040;
--section-divider: #404040;
--focus-shadow: 0 0 0 2px rgba(100, 181, 246, 0.4);
--panel-shadow-soft: 0 2px 8px rgba(0, 0, 0, 0.1);
--sidebar-edge-shadow: -5px 0 15px rgba(0, 0, 0, 0.3);
--sidebar-width: 420px;
/* Transform category colors */
/* Transform category colors — one distinct hue per category */
--case-color: #7986cb; /* Periwinkle — case transforms */
--case-color-rgb: 121, 134, 203;
--cipher-color: #00897b; /* Teal — classical ciphers */
--cipher-color-rgb: 0, 137, 123;
--concealment-color: #7cb342; /* Olive — steganography / hidden text */
--concealment-color-rgb: 124, 179, 66;
--encoding-color: #7e57c2; /* Purple — byte & data encodings */
--encoding-color-rgb: 126, 87, 194;
--format-color: #fb8c00; /* Orange — text formatting */
--format-color-rgb: 251, 140, 0;
--signwriting-color: #8d6e63; /* Brown — SignWriting notation */
--signwriting-color-rgb: 141, 110, 99;
--special-color: #43a047; /* Green — misc / randomizer-adjacent */
--special-color-rgb: 67, 160, 71;
--symbol-color: #d4af37; /* Gold — scripts & symbol alphabets */
--symbol-color-rgb: 212, 175, 55;
--technical-color: #00acc1; /* Cyan — Morse, NATO, phone codes */
--technical-color-rgb: 0, 172, 193;
--unicode-color: #42a5f5; /* Blue — Unicode letter styles */
--unicode-color-rgb: 66, 165, 245;
--visual-color: #ef5350; /* Coral — visual / spoken effects */
--visual-color-rgb: 239, 83, 80;
--randomizer-color: #ec407a; /* Pink — random mix */
--randomizer-color-rgb: 236, 64, 122;
--custom-spelling-color: #ff7043; /* Deep orange — user spelling alphabets */
--custom-spelling-color-rgb: 255, 112, 67;
--translate-color: #b388ff; /* Violet — AI translation (inline tool) */
--translate-color-rgb: 179, 136, 255;
/* Active state gradient end colors */
--case-active-end: #9fa8da;
--cipher-active-end: #26a69a;
--concealment-active-end: #aed581;
--encoding-active-end: #9575cd;
--format-active-end: #ffb74d;
--signwriting-active-end: #a1887f;
--special-active-end: #66bb6a;
--symbol-active-end: #e6c84c;
--technical-active-end: #26c6da;
--unicode-active-end: #64b5f6;
--visual-active-end: #e57373;
--randomizer-active-end: #f06292;
--custom-spelling-active-end: #ff8a65;
--translate-active-end: #d1b3ff;
/* Spacing scale */
--spacing-xs: 4px;
--spacing-sm: 8px;
--spacing-md: 16px;
--spacing-lg: 24px;
--spacing-xl: 32px;
/* Danger/error colors */
--danger-color: #1b5e20;
--danger-border: #2e7d32;
--danger-text: #69f0ae;
--danger-text-rgb: 105, 240, 174;
/* Logo glitch color */
--glitch-color: #00ff00;
--glitch-color-rgb: 0, 255, 0;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background-color: var(--main-bg-color);
color: var(--text-color);
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
line-height: 1.6;
padding: 20px;
min-height: 100vh;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-feature-settings: "liga" 1, "calt" 1; /* Enable ligatures */
}
/* ========================================
STANDARD UI COMPONENT TEMPLATES
Reusable components for consistent design
across the entire application.
======================================== */
/* Section Header with Icon and Description
Usage:
<div class="section-header-card">
<div class="section-header-card-title">
<i class="fas fa-icon"></i>
<h3>Title Here</h3>
</div>
<p class="section-header-card-description">
Description text that explains what this section does.
</p>
</div>
*/
.section-header-card {
display: flex;
align-items: flex-start;
gap: 16px;
padding: 12px 16px;
background: var(--secondary-bg);
border: 1px solid var(--input-border);
border-radius: 8px;
margin-bottom: 16px;
}
.section-header-card-title {
display: flex;
align-items: center;
gap: 10px;
min-width: fit-content;
flex-shrink: 0;
}
.section-header-card-title i {
font-size: 1.3rem;
color: var(--accent-color);
}
.section-header-card-title h3,
.section-header-card-title h4 {
margin: 0;
color: var(--accent-color);
font-size: 1.1rem;
white-space: nowrap;
}
.section-header-card-description {
margin: 0;
color: var(--text-muted);
font-size: 0.9rem;
line-height: 1.5;
padding-top: 2px;
}
/* Responsive stacking for section header cards */
/* Icon + Title Inline (simpler variant)
Usage:
<div class="title-with-icon">
<i class="fas fa-icon"></i>
<h3>Title</h3>
<small>optional subtitle</small>
</div>
*/
.title-with-icon {
display: flex;
align-items: center;
gap: 10px;
flex-wrap: wrap;
margin-bottom: 12px;
}
.title-with-icon i {
color: var(--accent-color);
font-size: 1.2rem;
}
.title-with-icon h3,
.title-with-icon h4 {
margin: 0;
color: var(--accent-color);
}
.title-with-icon small {
font-size: 0.75em;
font-weight: normal;
color: var(--text-muted);
background-color: rgba(100, 181, 246, 0.1);
padding: 2px 8px;
border-radius: 4px;
}
/* Info Box - For disclaimers, tips, warnings
Usage:
<div class="info-box">
<i class="fas fa-info-circle"></i>
<span>Your message here</span>
</div>
Add class modifiers: .info-box-warning, .info-box-success, .info-box-danger
*/
.info-box {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 10px 12px;
border: 1px solid var(--input-border);
background: rgba(100, 181, 246, 0.1);
border-left: 3px solid var(--accent-color);
border-radius: 6px;
margin: 12px 0;
font-size: 0.9rem;
line-height: 1.4;
}
.info-box i {
color: var(--accent-color);
margin-top: 2px;
flex-shrink: 0;
}
.info-box-warning {
background: rgba(255, 183, 77, 0.1);
border-left-color: var(--format-color);
}
.info-box-warning i {
color: var(--format-color);
}
.info-box-success {
background: rgba(102, 187, 106, 0.1);
border-left-color: var(--special-color);
}
.info-box-success i {
color: var(--special-color);
}
.info-box-danger {
background: rgba(239, 83, 80, 0.1);
border-left-color: var(--visual-color);
}
.info-box-danger i {
color: var(--visual-color);
}
/* Card Container - Standard content card
Usage:
<div class="card">
<div class="card-header">
<h4>Card Title</h4>
<button>Action</button>
</div>
<div class="card-body">
Content goes here
</div>
<div class="card-footer">
Footer content (optional)
</div>
</div>
*/
.card {
background: var(--main-bg-color);
border: 1px solid var(--input-border);
border-radius: 8px;
overflow: hidden;
margin-bottom: 16px;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 16px;
border-bottom: 1px solid var(--input-border);
background: var(--secondary-bg);
}
.card-header h3,
.card-header h4 {
margin: 0;
color: var(--accent-color);
font-size: 1rem;
}
.card-body {
padding: 16px;
}
.card-footer {
padding: 12px 16px;
border-top: 1px solid var(--input-border);
background: var(--secondary-bg);
}
/* Button Group - Standard action buttons
Usage:
<div class="button-group">
<button class="btn">Primary Action</button>
<button class="btn btn-secondary">Secondary</button>
</div>
*/
.button-group {
display: flex;
gap: 10px;
align-items: center;
flex-wrap: wrap;
}
.button-group .btn {
flex: 0 1 auto;
}
/* Spacing utilities (tool templates) */
.u-mb-8 { margin-bottom: 8px; }
.u-mb-16 { margin-bottom: 16px; }
.u-mt-16 { margin-top: 16px; }
/* Textarea + absolutely positioned .copy-button */
.textarea-copy-wrap {
position: relative;
}
/* Tokenizer token grid */
.token-tiles.tokenizer-tiles {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.token-chip.token-chip--tokenizer {
background: var(--button-bg);
border: 1px solid var(--input-border);
padding: 6px 8px;
border-radius: 6px;
font-family: 'Fira Code', monospace;
}
.token-chip__idx {
opacity: 0.75;
margin-right: 6px;
}
.token-chip__id {
opacity: 0.6;
margin-left: 6px;
}
/* Fuzzer case list */
.fuzzer-list {
display: flex;
flex-direction: column;
gap: 8px;
}
.fuzzer-case-row {
display: flex;
align-items: center;
gap: 8px;
}
.fuzzer-case-index {
opacity: 0.7;
min-width: 32px;
}
.fuzzer-case-textarea {
flex: 1;
min-height: 46px;
}
/* Transform picker dropdown (Splitter, Decoder, etc.) */
select.transform-select {
width: auto;
max-width: min(100%, 320px);
min-width: min(200px, 100%);
}
/* Decoder: method select beside label (override full-width select defaults) */
select.decoder-method-select {
margin-left: 15px;
padding: 5px 10px;
border-radius: 6px;
}
/* Tokenade text payload block label */
.tokenade-field-label {
display: block;
width: 100%;
margin-bottom: 15px;
}
.tokenade-field-label input[type="text"] {
width: 100%;
}
/* Button variants */
.btn-secondary {
background: transparent;
border: 1px solid var(--input-border);
}
.btn-secondary:hover {
background: var(--button-bg);
}
.btn-primary {
background: var(--accent-color);
color: var(--main-bg-color);
border-color: var(--accent-color);
}
.btn-primary:hover {
background: var(--accent-hover);
border-color: var(--accent-hover);
}
/* ========================================
STANDARD FORM INPUT STYLES
These base styles apply to ALL form inputs
across the entire application. Only add
specific overrides when truly needed.
Benefits:
- Consistent styling everywhere
- Easy to maintain and test
- No need to chase down individual inputs
- Responsive by default
======================================== */
/* Standard text input, number input, and select styles */
input[type="text"],
input[type="number"],
input[type="email"],
input[type="password"],
select {
width: 100%;
max-width: 100%;
min-width: 0; /* Allow shrinking below content width */
padding: 8px 10px;
background: var(--input-bg);
color: var(--text-color);
border: 1px solid var(--input-border);
border-radius: 4px;
font-family: inherit;
font-size: 0.9rem;
line-height: 1.4;
transition: all 0.2s ease;
box-sizing: border-box;
}
/* Select-specific styles for better overflow handling */
select {
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
appearance: none; /* Remove default arrow to control width better */
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23e0e0e0' d='M6 9L1 4h10z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 8px center;
padding-right: 28px; /* Space for custom arrow */
}
/* Option elements inherit text color */
select option {
background: var(--input-bg);
color: var(--text-color);
padding: 4px 8px;
}
/* Safety net: Ensure ALL form controls respect container width */
input, select, textarea, button {
max-width: 100%;
box-sizing: border-box;
}
/* Focus states for all inputs */
input[type="text"]:focus,
input[type="number"]:focus,
input[type="email"]:focus,
input[type="password"]:focus,
select:focus {
outline: none;
border-color: var(--accent-color);
box-shadow: 0 0 0 2px rgba(100, 181, 246, 0.2);
}
/* Disabled state */
input[type="text"]:disabled,
input[type="number"]:disabled,
input[type="email"]:disabled,
input[type="password"]:disabled,
select:disabled {
opacity: 0.6;
cursor: not-allowed;
}
/* Standard textarea styles */
textarea {
width: 100%;
max-width: 100%;
padding: 12px;
background-color: var(--input-bg);
color: var(--text-color);
border: 1px solid var(--input-border);
border-radius: 4px;
font-family: 'Fira Code', 'Courier New', monospace;
resize: vertical;
min-height: 100px;
line-height: 1.4;
font-size: 14px;
transition: all 0.2s ease;
box-sizing: border-box;
}
textarea::placeholder {
color: rgba(224, 224, 224, 0.5);
}
textarea:focus {
outline: none;
border-color: var(--accent-color);
box-shadow: var(--focus-shadow);
}
/* Standard button styles */
button,
.btn {
padding: 8px 16px;
background: var(--button-bg);
color: var(--text-color);
border: 1px solid var(--input-border);
border-radius: 4px;
font-family: inherit;
font-size: 0.9rem;
cursor: pointer;
transition: all 0.2s ease;
box-sizing: border-box;
white-space: nowrap;
}
button:hover,
.btn:hover {
background: var(--button-hover-bg);
border-color: var(--accent-color);
}
button:active,
.btn:active {
transform: translateY(1px);
}
button:focus-visible,
.btn:focus-visible {
outline: none;
border-color: var(--accent-color);
box-shadow: var(--focus-shadow);
}
button:disabled,
.btn:disabled {
opacity: 0.6;
cursor: not-allowed;
}
/* Standard label styles */
label {
display: flex;
flex-direction: column;
gap: 6px;
width: 100%;
color: var(--text-color);
font-size: 0.9rem;
font-weight: 500;
box-sizing: border-box;
word-wrap: break-word;
}
label small {
color: var(--text-muted);
font-size: 0.8rem;
font-weight: normal;
margin-top: -2px;
}
.container {
max-width: 900px;
width: 100%;
margin: 0 auto;
padding: 24px;
background-color: var(--secondary-bg);
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
box-sizing: border-box;
}
header {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
margin-bottom: 30px;
padding: 10px;
}
.logo {
text-align: left;
}
.logo h1 {
font-family: 'Courier New', monospace;
font-weight: bold;
letter-spacing: 2px;
text-transform: uppercase;
color: var(--glitch-color);
text-shadow: 0 0 5px var(--glitch-color), 0 0 10px rgba(var(--glitch-color-rgb), 0.8);
background: linear-gradient(90deg, transparent 0%, rgba(var(--glitch-color-rgb), 0.2) 50%, transparent 100%);
padding: var(--spacing-sm);
border: 1px solid rgba(var(--glitch-color-rgb), 0.3);
position: relative;
overflow: hidden;
animation: glitch 3s infinite;
}
/* Glitch animation */
@keyframes glitch {
0% {
text-shadow: 0 0 5px #00ff00, 0 0 10px rgba(0, 255, 0, 0.8);
transform: translateX(0);
}
5% {
text-shadow: -2px 0 #ff00ff, 2px 0 #00ffff;
transform: translateX(2px);
}
10% {
text-shadow: 2px 0 #ff00ff, -2px 0 #00ffff;
transform: translateX(-2px);
}
15% {
text-shadow: 0 0 5px #00ff00, 0 0 10px rgba(0, 255, 0, 0.8);
transform: translateX(0);
}
85% {
text-shadow: 0 0 5px #00ff00, 0 0 10px rgba(0, 255, 0, 0.8);
transform: translateX(0);
}
90% {
text-shadow: 1px 0 #ff00ff, -1px 0 #00ffff;
transform: translateX(1px);
}
95% {
text-shadow: -1px 0 #ff00ff, 1px 0 #00ffff;
transform: translateX(-1px);
}
100% {
text-shadow: 0 0 5px #00ff00, 0 0 10px rgba(0, 255, 0, 0.8);
transform: translateX(0);
}
}
/* Adding scanline effect */
.logo h1::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(
transparent 0%,
transparent 50%,
rgba(0, 255, 0, 0.2) 50%,
rgba(0, 255, 0, 0.2) 100%
);
background-size: 100% 4px;
z-index: 1;
pointer-events: none;
opacity: 0.3;
}
.theme-toggle {
margin-left: 20px;
}
.theme-button {
background: transparent;
border: none;
color: var(--text-color);
font-size: 1.2rem;
padding: 8px;
cursor: pointer;
border-radius: 50%;
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s ease;
}
.theme-button:hover {
background: var(--button-bg);
transform: rotate(15deg);
}
h1, h2, h3, h4, h5 {
font-family: 'Courier New', monospace;
color: var(--text-color);
margin-bottom: 15px;
}
/* Tabs styling */
.tabs {
margin-top: 16px;
}
.tab-buttons {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-bottom: 24px;
}
.tab-buttons button {
background-color: var(--button-bg);
color: var(--text-color);
border: 1px solid var(--input-border);
border-radius: 4px;
padding: 8px 16px;
cursor: pointer;
font-size: 14px;
display: flex;
align-items: center;
gap: 8px;
transition: all 0.2s ease;
}
.tab-buttons button i {
font-size: 14px;
}
.tab-buttons button.active {
background-color: var(--accent-color);
color: var(--main-bg-color);
border-color: var(--accent-color);
font-weight: 500;
}
.tab-buttons button:hover:not(.active) {
background-color: var(--button-hover-bg);
border-color: var(--accent-color);
color: var(--accent-color);
}
/* Mobile-only: compact tool picker (tab bar hidden ≤768px) */
.tab-tool-select {
display: none;
margin-bottom: 16px;
}
.tab-tool-select label {
display: block;
font-size: 0.72rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--text-muted);
margin-bottom: 6px;
}
.mobile-tool-dropdown {
width: 100%;
min-height: 44px;
padding: 10px 12px;
font-size: 0.95rem;
border-radius: 6px;
border: 1px solid var(--input-border);
background: var(--input-bg);
color: var(--text-color);
cursor: pointer;
-webkit-appearance: none;
appearance: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23999' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 12px center;
padding-right: 36px;
}
body.dark-theme .mobile-tool-dropdown {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23b0b0b0' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
}
.transform-button.active {
background-color: var(--accent-color);
color: var(--main-bg-color);
border-color: var(--accent-color);
}
.transform-button:hover:not(.active) {
background-color: var(--button-hover-bg);
border-color: var(--accent-color);
color: var(--accent-color);
}
.tab-content {
padding: 20px 0;
}
/* Input and output sections */
.input-section,
.output-section,
.decode-section {
background: var(--main-bg-color);
border-radius: 4px;
padding: 16px;
margin-bottom: 16px;
}
.input-container,
.output-container {
position: relative;
}
.fuzzer-list .fuzzer-case-row { position: relative; }
.fuzzer-list .fuzzer-case-row .copy-button { position: static; }
.section-header {
margin-bottom: 15px;
}
.section-title {
display: flex;
align-items: center;
gap: 12px;
flex-wrap: wrap;
margin-bottom: 8px;
}
.section-title h3 {
display: flex;
align-items: center;
gap: 8px;
color: var(--accent-color);
margin: 0;
}
.section-title small {
font-size: 0.85em;
font-weight: normal;
color: var(--text-muted);
background-color: rgba(100, 181, 246, 0.1);
padding: 4px 10px;
border-radius: 4px;
}
.section-header h3 {
display: flex;
align-items: center;
gap: 8px;
color: var(--accent-color);
}
.section-header h3 small {
font-size: 0.7em;
font-weight: normal;
color: var(--text-muted);
background-color: rgba(100, 181, 246, 0.1);
padding: 2px 8px;
border-radius: 12px;
}
.section-header p {
margin: 0;
color: var(--text-muted);
font-size: 0.9em;
}
.decoded-message {
margin-top: 8px;
padding: 12px;
background: var(--button-bg);
border-radius: 4px;
font-family: 'Fira Code', monospace;
position: relative;
}
.decode-method {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 10px;
color: var(--text-muted);
font-size: 0.9em;
}
.decode-method strong {
color: var(--accent-color);
}
.decode-priority {
font-size: 0.8em;
background-color: rgba(var(--accent-color-rgb), 0.1);
padding: 2px 8px;
border-radius: 12px;
color: var(--accent-color);
}
.decode-result {
margin-bottom: 12px;
word-break: break-all;
white-space: pre-wrap;
line-height: 1.5;
}
.decode-actions {
display: flex;
gap: 10px;
margin-top: 10px;
}
.use-as-input-button {
background-color: rgba(var(--accent-color-rgb), 0.1);
color: var(--accent-color);
border: none;
border-radius: 4px;
padding: 5px 10px;
font-size: 0.8em;
cursor: pointer;
display: flex;
align-items: center;
gap: 5px;
transition: all 0.2s ease;
}
.use-as-input-button:hover {
background-color: rgba(var(--accent-color-rgb), 0.2);
}
/* Special styling for encoded message textarea - only overrides */
.output-section textarea {
background-color: var(--secondary-bg);
color: var(--accent-color);
border: 1px solid rgba(100, 181, 246, 0.3);
letter-spacing: 0.5px;
line-height: 1.5;
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2);
padding: 14px;
font-weight: 500;
}
/* Emoji Library Styling */
.emoji-library {
margin: 12px 0;
background-color: var(--main-bg-color);
border-radius: 6px;
padding: 12px;
border: 1px solid var(--input-border);
box-shadow: none;
}
.emoji-library-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
border-bottom: 1px solid var(--input-border);
padding: 10px 12px;
background: var(--secondary-bg);
border-radius: 6px 6px 0 0;
box-shadow: none;
position: relative;
overflow: hidden;
}
.emoji-library-header:before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 3px;
background: linear-gradient(to right, var(--special-color), var(--encoding-color), var(--cipher-color), var(--visual-color));
}
.emoji-library-title {
font-size: 1.1rem;
font-weight: 600;
display: flex;
flex-direction: column;
gap: 4px;
}
.emoji-library-title h3 {
margin: 0;
color: var(--accent-color);
display: flex;
align-items: center;
gap: 8px;
}
.emoji-library-title h3 i {
color: var(--special-color);
}
.emoji-library-title i {
margin-right: 8px;
color: var(--accent-color);
}
.emoji-library-subtitle {
font-size: 0.8rem;
font-weight: normal;
color: var(--text-color);
margin-top: 6px;
display: flex;
align-items: center;
gap: 6px;
padding: 4px 8px;
background-color: rgba(0, 0, 0, 0.1);
border-radius: 4px;
max-width: fit-content;
}
.emoji-library-subtitle i {
color: var(--encoding-color);
}
.emoji-search {
position: relative;
width: 220px;
}
/* Emoji search input - only unique override for icon padding */
.emoji-search input {
padding-left: 32px; /* Space for search icon */
}
.emoji-search i {
position: absolute;
left: 10px;
top: 50%;
transform: translateY(-50%);
color: var(--text-color);
opacity: 0.5;
}
.emoji-library {
display: block !important;
margin-top: 24px;
margin-bottom: 24px;
border-radius: 10px;
background-color: var(--secondary-bg);
padding: 0;
box-shadow: none;
position: relative;
overflow: hidden;
}
.emoji-library:before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 4px;
background: linear-gradient(to right, var(--unicode-color), var(--special-color), var(--encoding-color));
z-index: 1;
}
.emoji-grid-wrapper {
display: flex;
flex-direction: column;
align-items: center;
border-radius: 0;
background-color: transparent;
padding: 0;
margin: 0;
border: none;
}
.emoji-grid-note {
background: linear-gradient(to right, rgba(102, 187, 106, 0.05), rgba(126, 87, 194, 0.05));
padding: 10px 15px;
border-radius: 6px;
margin-bottom: 12px;
font-size: 0.9rem;
color: var(--text-color);
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
border-left: 2px solid var(--special-color);
box-shadow: none !important;
max-width: 500px;
width: 100%;
border-bottom: none !important;
border-top: none !important;
border-right: none !important;
margin-left: auto;
margin-right: auto;
text-align: center;
}
.emoji-header {
padding: 15px 20px;
margin-bottom: 15px;
text-align: center;
border-bottom: 1px solid var(--input-border);
background: linear-gradient(to right, rgba(66, 165, 245, 0.02), rgba(126, 87, 194, 0.02));
}
.emoji-header h3 {
font-size: 1.3rem;
margin: 0 0 8px 0;
color: var(--text-color);
font-weight: 600;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
}
.emoji-header h3 i {
color: var(--special-color);
font-size: 1.2rem;
}
.emoji-subtitle {
font-size: 0.85rem;
color: var(--text-color);
opacity: 0.85;
margin: 0;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
}
.emoji-grid-note i, .emoji-subtitle i {
color: var(--special-color);
font-size: 0.9rem;
opacity: 0.9;
}
.emoji-count {
font-size: 0.75rem;
color: var(--text-color);
text-align: center;
padding: 4px 8px;
margin-top: 8px;
border-radius: 12px;
background: linear-gradient(to right, rgba(66, 165, 245, 0.05), rgba(126, 87, 194, 0.05));
display: inline-block;
margin-left: auto;
margin-right: auto;
font-weight: 500;
box-shadow: none;
border: 1px solid rgba(66, 165, 245, 0.15);
opacity: 0.9;
}
/* Emoji grid with increased specificity to avoid !important */
.emoji-library .emoji-grid,
#emoji-grid-container .emoji-grid,
.emoji-grid-container .emoji-grid,
.emoji-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(42px, 1fr));
grid-auto-rows: 42px;
gap: var(--spacing-xs);
padding: var(--spacing-sm);
border-radius: 6px;
border: 1px solid var(--input-border);
background-color: var(--secondary-bg);
box-shadow: none;
transition: all 0.2s ease;
margin-bottom: 10px;
width: 100%;
max-height: none;
overflow: visible;
max-width: 100%;
font-family: 'Segoe UI Emoji', 'Segoe UI Symbol', 'Apple Color Emoji',
'Noto Color Emoji', 'Android Emoji', 'EmojiOne Color',
'Twemoji Mozilla', sans-serif;
/* Improve emoji rendering */
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
}
.emoji-category-tabs {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-bottom: 10px;
width: 100%;
justify-content: center;
}
.emoji-category-tab {
padding: 6px 12px;
background: var(--button-bg);
border: 1px solid var(--input-border);
border-radius: 6px;
cursor: pointer;
font-size: 0.9rem;
transition: all 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
min-width: max-content; /* Fit content but allow wrapping */
white-space: nowrap;
flex-shrink: 1; /* Allow shrinking if needed */
}
.emoji-category-tab.active,
.emoji-category-tab:hover {
background: var(--accent-color);
color: white;
}
/* Emoji grid container with increased specificity */
.emoji-library #emoji-grid-container,
.emoji-library .emoji-grid-container,
#emoji-grid-container,
.emoji-grid-container {
width: 100%;
display: flex;
flex-direction: column;
align-items: stretch;
background-color: transparent;
padding: 0;
margin: 0;
border: none;
box-shadow: none;
overflow: visible;
min-height: 0;
max-width: 100%;
border-bottom: none;
border-top: none;
}
.emoji-button {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
font-size: 1.5rem;
background-color: var(--button-bg);
border: 1px solid var(--input-border);
border-radius: 4px;
cursor: pointer;
transition: all 0.2s ease;
padding: 0;
position: relative;
overflow: hidden;
line-height: 1;
}
.emoji-button:before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 3px;
background: linear-gradient(to right, var(--special-color), var(--encoding-color));
opacity: 0;
transition: opacity 0.2s ease;
}
.emoji-button:hover {
background-color: var(--button-hover-bg);
border-color: var(--accent-color);
transform: translateY(-1px);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
}
.emoji-button:hover:before {
opacity: 1;
}
.emoji-button:active {
transform: translateY(0);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
background: var(--button-bg);
border-color: var(--accent-color);
transform: scale(0.98);
}
/* Emoji Library Footer */
.emoji-library-footer {
display: flex;
justify-content: flex-start;
align-items: center;
margin-top: 12px;
padding-top: 12px;
border-top: 1px solid var(--input-border);
}
.selected-emoji-info {
display: flex;
align-items: center;
gap: 8px;
}
.selected-emoji {
font-size: 1.5rem;
padding: 4px 8px;
background-color: var(--secondary-bg);
border-radius: 6px;
border: 1px solid var(--input-border);
}
.selected-emoji-label {
font-size: 0.85rem;
color: var(--text-muted);
font-style: italic;
}
.emoji-button.selected {
background-color: var(--accent-color);
color: var(--main-bg-color);
border-color: var(--accent-color);
}
.emoji-category-tabs {
display: flex;
gap: 8px;
margin-bottom: 12px;
overflow-x: auto;
padding-bottom: 4px;
}
.emoji-category-tab {
padding: 6px 12px;
background-color: var(--button-bg);
border: 1px solid var(--input-border);
border-radius: 4px;
color: var(--text-color);
font-size: 0.8rem;
cursor: pointer;
white-space: nowrap;
}
.emoji-category-tab.active {
background-color: var(--accent-color);
color: var(--main-bg-color);
border-color: var(--accent-color);
}
/* Button focus and active states handled in standard styles above */
/* Invisible Text Button */
.invisible-button {
width: 100%;
margin-top: 12px;
padding: 12px;
background-color: var(--secondary-bg);
border: 2px dashed var(--accent-color);
transition: all 0.3s ease;
display: flex;
justify-content: center;
position: relative;
}
.invisible-button .carrier-content {
display: flex;
align-items: center;
justify-content: center;
font-size: 1.1rem;
}
.invisible-button .carrier-emoji {
font-size: 1.5rem;
margin-right: 12px;
}
.invisible-button:hover {
background-color: rgba(var(--accent-color-rgb), 0.1);
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
.invisible-button.active {
background-color: var(--accent-color);
color: var(--main-bg-color);
border-style: solid;
}
/* Base button styles defined in standard form styles above */
/* Emoji grid */
/* Transform layout */
.transform-layout {
display: flex;
flex-direction: column;
gap: 24px;
margin-top: 16px;
position: relative;
}
.transform-section {
background: var(--main-bg-color);
border-radius: 8px;
padding: 16px;
border: 1px solid var(--input-border);
}
/* Transform category legend styling */
.transform-category-legend {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-bottom: 16px;
padding-bottom: 12px;
border-bottom: 1px solid var(--input-border);
}
.transform-category-legend > div {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.legend-title {
font-size: 0.9rem;
font-weight: 500;
color: var(--text-color);
margin-right: 8px;
opacity: 0.7;
}
.legend-item {
font-size: 0.8rem;
padding: 4px 8px;
border-radius: 4px;
border-left-width: 4px;
border-left-style: solid;
background-color: var(--button-bg);
transition: all 0.2s ease;
cursor: pointer;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
text-transform: capitalize;
}
.legend-item:hover {
transform: translateY(-1px);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
background-color: var(--button-hover-bg);
}
.legend-item.active-category {
background-color: var(--accent-color);
color: var(--main-bg-color);
transform: translateY(-1px);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
}
.legend-item.transform-category-case {
border-left-color: var(--case-color);
}
.legend-item.transform-category-cipher {
border-left-color: var(--cipher-color);
}
.legend-item.transform-category-concealment {
border-left-color: var(--concealment-color);
}
.legend-item.transform-category-encoding {
border-left-color: var(--encoding-color);
}
.legend-item.transform-category-format {
border-left-color: var(--format-color);
}
.legend-item.transform-category-signwriting {
border-left-color: var(--signwriting-color);
}
.legend-item.transform-category-special {
border-left-color: var(--special-color);
}
.legend-item.transform-category-symbol {
border-left-color: var(--symbol-color);
}
.legend-item.transform-category-technical {
border-left-color: var(--technical-color);
}
.legend-item.transform-category-unicode {
border-left-color: var(--unicode-color);
}
.legend-item.transform-category-visual {
border-left-color: var(--visual-color);
}
.legend-item.transform-category-randomizer {
border-left-color: var(--randomizer-color);
}
.legend-item.transform-category-custom_spelling {
border-left-color: var(--custom-spelling-color);
}
.transform-section:focus-within {
border-color: var(--accent-color);
box-shadow: var(--focus-shadow);
}
.input-section,
.transform-section,
.output-section {
background: var(--main-bg-color);
border-radius: 6px;
padding: 16px;
}
.transform-section h4 {
margin-bottom: 16px;
display: flex;
align-items: center;
gap: 8px;
color: var(--accent-color);
}
.transform-categories {
display: flex;
flex-direction: column;
gap: 24px;
}
.transform-category-section {
background: var(--secondary-bg);
border-radius: 8px;
padding: 16px;
box-shadow: var(--panel-shadow-soft);
transition: all 0.3s ease;
position: relative;
border-left: none;
}
.highlight-section {
background-color: rgba(var(--accent-color-rgb), 0.1);
box-shadow: 0 0 12px rgba(var(--accent-color-rgb), 0.3);
animation: pulse 1s ease-in-out;
}
@keyframes pulse {
0% { background-color: rgba(var(--accent-color-rgb), 0.1); }
50% { background-color: rgba(var(--accent-color-rgb), 0.2); }
100% { background-color: rgba(var(--accent-color-rgb), 0.1); }
}
.category-title {
margin-bottom: 12px;
padding-bottom: 8px;
border-bottom: 1px solid var(--input-border);
font-size: 1.1rem;
font-weight: 500;
padding-left: 8px;
text-transform: capitalize;
border-left: 4px solid;
display: flex;
align-items: center;
gap: 8px;
}
.category-order-controls {
display: flex;
gap: 4px;
margin-left: auto;
opacity: 0.6;
transition: opacity 0.2s ease;
}
.category-title:hover .category-order-controls {
opacity: 1;
}
.category-move-btn {
background: var(--button-bg);
border: 1px solid var(--input-border);
border-radius: 4px;
padding: 4px 6px;
cursor: pointer;
color: var(--text-color);
font-size: 0.75rem;
transition: all 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
min-width: 24px;
height: 24px;
}
.category-move-btn:hover {
background: var(--button-hover-bg);
border-color: var(--accent-color);
color: var(--accent-color);
transform: scale(1.1);
}
.category-move-btn:active {
transform: scale(0.95);
}
.last-used-section {
border: 2px dashed var(--accent-color);
background: rgba(var(--accent-color-rgb), 0.05);
}
.last-used-section .category-title {
color: var(--accent-color);
border-left-color: var(--accent-color);
}
.last-used-section .transform-buttons .transform-button-group,
#category-randomizer .transform-buttons .transform-button-group,
.favorites-section .transform-buttons .transform-button-group {
width: 100%;
}
.legend-item {
position: relative;
}
.category-title.transform-category-case {
border-left-color: var(--case-color);
}
.category-title.transform-category-cipher {
border-left-color: var(--cipher-color);
}
.category-title.transform-category-concealment {
border-left-color: var(--concealment-color);
}
.category-title.transform-category-encoding {
border-left-color: var(--encoding-color);
}
.category-title.transform-category-format {
border-left-color: var(--format-color);
}
.category-title.transform-category-signwriting {
border-left-color: var(--signwriting-color);
}
.category-title.transform-category-special {
border-left-color: var(--special-color);
}
.category-title.transform-category-symbol {
border-left-color: var(--symbol-color);
}
.category-title.transform-category-technical {
border-left-color: var(--technical-color);
}
.category-title.transform-category-unicode {
border-left-color: var(--unicode-color);
}
.category-title.transform-category-visual {
border-left-color: var(--visual-color);
}
.category-title.transform-category-randomizer {
border-left-color: var(--randomizer-color);
}
.category-title.transform-category-custom_spelling {
border-left-color: var(--custom-spelling-color);
}
.category-title.transform-category-translate {
border-left-color: var(--translate-color);
text-transform: none;
margin-bottom: 10px;
padding-bottom: 6px;
}
.translate-inline-section {
padding: 14px 16px;
}
.translate-inline-section .translate-powered-by {
font-size: 0.65rem;
font-weight: 400;
opacity: 0.8;
margin-left: 6px;
color: var(--accent-color);
}
.translate-inline-section .pc-error {
margin-bottom: 8px;
}
.pc-error {
color: #f07178;
font-size: 0.85rem;
padding: 8px 10px;
background: rgba(240, 113, 120, 0.08);
border: 1px solid rgba(240, 113, 120, 0.35);
border-radius: 4px;
}
.translate-loading {
font-size: 0.85rem;
margin-bottom: 8px;
opacity: 0.9;
}
.translate-model-picker {
margin-bottom: 10px;
}
.translate-model-select {
width: 100%;
padding: 6px 10px;
font-size: 0.8rem;
border-radius: 4px;
border: 1px solid var(--input-border);
background: var(--input-bg);
color: var(--text-color);
box-sizing: border-box;
}
.translate-subsection {
margin-bottom: 10px;
}
.translate-subsection:last-child {
margin-bottom: 0;
}
.translate-subsection-label {
display: flex;
align-items: center;
gap: 6px;
font-size: 0.72rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--text-color);
opacity: 0.88;
margin-bottom: 6px;
}
button.translate-custom-label-btn {
width: 100%;
margin: 0 0 6px 0;
padding: 6px 8px;
font: inherit;
font-size: 0.72rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
text-align: left;
color: var(--text-color);
opacity: 0.88;
background: transparent;
border: 1px solid transparent;
border-radius: 6px;
cursor: pointer;
display: flex;
align-items: center;
gap: 6px;
box-sizing: border-box;
transition: background 0.15s ease, border-color 0.15s ease;
}
button.translate-custom-label-btn:hover {
opacity: 1;
background: rgba(var(--translate-color-rgb), 0.08);
border-color: var(--input-border);
}
button.translate-custom-label-btn:focus {
outline: none;
box-shadow: 0 0 0 2px rgba(var(--translate-color-rgb), 0.35);
}
.translate-custom-toggle-end {
margin-left: auto;
padding: 2px 8px;
font-size: 0.75rem;
border-radius: 4px;
border: 1px solid var(--input-border);
background: var(--button-bg);
color: var(--text-color);
display: inline-flex;
align-items: center;
justify-content: center;
}
button.translate-custom-label-btn:hover .translate-custom-toggle-end {
background: var(--button-hover-bg);
border-color: var(--translate-color);
color: var(--translate-color);
}
.translate-lang-grid {
display: flex;
flex-wrap: wrap;
gap: 8px;
width: 100%;
box-sizing: border-box;
}
.translate-lang-btn {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 4px;
padding: 8px 6px 20px;
min-height: 58px;
border-radius: 4px;
font-size: 0.75rem;
font-weight: 500;
border: 1px solid var(--input-border);
color: var(--text-color);
cursor: pointer;
transition: all 0.2s ease;
box-sizing: border-box;
background: linear-gradient(to right, rgba(var(--translate-color-rgb), 0.06), var(--button-bg));
}
.translate-lang-btn:hover:not(:disabled) {
background: linear-gradient(to right, rgba(var(--translate-color-rgb), 0.14), var(--button-hover-bg));
box-shadow: 0 2px 8px rgba(var(--translate-color-rgb), 0.18);
}
.translate-lang-btn:disabled {
opacity: 0.55;
cursor: wait;
}
.translate-lang-exotic {
background: linear-gradient(to right, rgba(var(--translate-color-rgb), 0.09), var(--button-bg));
}
.translate-lang-custom {
position: relative;
padding-right: 20px;
}
.translate-lang-favorite.favorite-icon {
right: 6px;
bottom: 5px;
font-size: 0.72rem;
}
.translate-custom-flag {
color: var(--translate-color);
font-size: 1.1rem;
}
.translate-flag {
font-size: 1.05rem;
line-height: 1;
}
.translate-name {
line-height: 1.2;
text-align: center;
}
.translate-remove {
position: absolute;
top: 2px;
right: 4px;
font-size: 1rem;
line-height: 1;
opacity: 0.55;
cursor: pointer;
padding: 0 2px;
}
.translate-remove:hover {
opacity: 1;
color: #f07178;
}
.translate-add-form {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-bottom: 8px;
align-items: center;
}
.translate-add-form input {
flex: 1;
min-width: 160px;
padding: 6px 10px;
font-size: 0.8rem;
border-radius: 4px;
border: 1px solid var(--input-border);
background: var(--input-bg);
color: var(--text-color);
}
.translate-add-btn {
padding: 6px 12px;
font-size: 0.8rem;
border-radius: 4px;
border: 1px solid var(--input-border);
background: var(--button-bg);
color: var(--text-color);
cursor: pointer;
}
.translate-add-btn:hover:not(:disabled) {
background: var(--button-hover-bg);
border-color: var(--translate-color);
}
.translate-empty-custom {
margin-top: 2px;
opacity: 0.72;
font-size: 0.8rem;
}
.transform-buttons {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-bottom: 16px;
width: 100%; /* Ensure flex doesn't overflow container */
box-sizing: border-box;
}
#category-randomizer .transform-buttons {
display: flex;
}
#category-randomizer .transform-buttons .transform-button {
width: 100%;
}
#category-randomizer .transform-buttons .transform-button .transform-preview {
max-width: 300px;
}
/* Carrier styling */
.carrier-content {
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
margin-bottom: 6px;
}
.carrier-emoji {
font-size: 1.5rem;
line-height: 1;
display: block;
margin-bottom: 2px;
}
.carrier-name {
font-size: 0.85rem;
font-weight: 500;
}
/* Preview styling */
.transform-preview {
margin-top: auto;
width: 100%;
font-size: 0.65rem;
padding: 3px 4px;
background-color: rgba(0, 0, 0, 0.12);
border-radius: 3px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
line-height: 1.15;
max-width: 100%;
display: block;
border: 1px solid rgba(0, 0, 0, 0.06);
opacity: 0.85;
}
.preview-label {
color: var(--accent-color);
opacity: 0.8;
font-weight: 500;
display: block;
margin-bottom: 2px;
}
.preview-ellipsis {
color: var(--accent-color);
font-weight: bold;
}
/* Encoded preview styling */
.encoded-preview {
display: block;
padding: 6px 8px;
background-color: rgba(0, 0, 0, 0.25);
border-radius: 4px;
font-family: 'Fira Code', monospace;
word-break: break-all;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
letter-spacing: 0.5px;
margin-top: 4px;
color: var(--accent-color);
border: 1px solid rgba(0, 0, 0, 0.1);
font-size: 0.85rem;
}
.transform-button kbd {
position: absolute;
top: 4px;
right: 4px;
background: rgba(255, 255, 255, 0.1);
border-radius: 3px;
}
/* Slide-out sidebars — one width on desktop; full width on small screens (see 768px media) */
.app-sidebar {
position: fixed;
top: 0;
right: 0;
width: var(--sidebar-width);
max-width: min(100%, 90vw);
height: 100vh;
background-color: var(--secondary-bg);
border-left: 1px solid var(--input-border);
box-shadow: var(--sidebar-edge-shadow);
display: flex;
flex-direction: column;
padding: 0;
overflow: hidden;
transform: translateX(100%);
transition: transform 0.3s ease-in-out;
z-index: 100;
}
.app-sidebar.active {
transform: translateX(0);
}
/* Advanced settings above other slide-outs when stacked */
.unicode-options-panel {
z-index: 200;
}
/* Sidebar header + actions (copy history, glitch, end sequences, advanced settings) */
.app-sidebar-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px;
border-bottom: 1px solid var(--input-border);
background-color: var(--button-bg);
}
.app-sidebar-header h3 {
font-size: 1.2rem;
margin: 0;
color: var(--accent-color);
}
.end-sequence-header h3 {
color: #e85d4c;
}
.unicode-panel-header {
position: relative;
z-index: 300;
pointer-events: auto;
touch-action: manipulation;
}
.unicode-panel-header h3 {
font-size: 1.2rem;
}
.app-sidebar-header .header-actions {
display: flex;
gap: 10px;
align-items: center;
}
.app-sidebar-header .clear-history-button,
.app-sidebar-header .close-button {
background: none;
border: none;
color: var(--text-color);
cursor: pointer;
font-size: 1.2rem;
padding: 5px;
transition: color 0.2s;
}
.app-sidebar-header .clear-history-button:hover,
.app-sidebar-header .close-button:hover {
color: var(--accent-color);
}
.app-sidebar-header .clear-history-button:hover {
color: #ff6b6b;
}
.end-sequence-header .close-button:hover {
color: #e85d4c;
}
/* Scrollable body */
.app-sidebar-body {
flex: 1;
overflow-y: auto;
padding: 15px;
}
.glitch-token-content,
.end-sequence-content {
display: flex;
flex-direction: column;
}
.glitch-token-filters {
margin-bottom: 15px;
padding-bottom: 15px;
border-bottom: 1px solid var(--input-border);
}
.filter-group {
margin-bottom: 12px;
}
.filter-group:last-child {
margin-bottom: 0;
}
.filter-group label {
display: block;
margin-bottom: 6px;
font-size: 0.9rem;
color: var(--text-color);
font-weight: 500;
}
.filter-group select,
.filter-group input {
width: 100%;
padding: 8px;
background-color: var(--input-bg);
border: 1px solid var(--input-border);
border-radius: 4px;
color: var(--text-color);
font-size: 0.9rem;
}
.filter-group select:focus,
.filter-group input:focus {
outline: none;
border-color: var(--accent-color);
}
.glitch-token-list {
flex: 1;
overflow-y: auto;
}
.no-tokens {
padding: 20px;
text-align: center;
color: var(--text-color);
opacity: 0.7;
}
.token-cards {
display: flex;
flex-direction: column;
gap: 12px;
}
.token-card {
background-color: var(--input-bg);
border: 1px solid var(--input-border);
border-radius: 4px;
padding: 12px;
transition: all 0.2s ease;
}
.token-card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
/* End sequences sidebar */
.end-sequence-lede {
font-size: 0.9rem;
color: var(--text-color);
opacity: 0.9;
margin: 0 0 16px;
line-height: 1.45;
}
.endsequence-category {
margin-bottom: 20px;
}
.endsequence-category h4 {
font-size: 0.95rem;
margin: 0 0 10px;
color: #e85d4c;
border-bottom: 1px solid var(--input-border);
padding-bottom: 6px;
}
.endsequence-items {
display: flex;
flex-direction: column;
gap: 8px;
}
button.endsequence-item {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 10px;
width: 100%;
margin: 0;
padding: 8px 10px;
text-align: left;
font: inherit;
color: inherit;
cursor: pointer;
background: var(--input-bg);
border: 1px solid var(--input-border);
border-radius: 4px;
transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
}
button.endsequence-item:hover {
background: var(--button-bg);
border-color: rgba(232, 93, 76, 0.45);
}
button.endsequence-item:focus {
outline: none;
}
button.endsequence-item:focus-visible {
outline: 2px solid #e85d4c;
outline-offset: 2px;
}
.endsequence-label {
flex: 1;
word-break: break-word;
white-space: pre-wrap;
font-size: 0.85rem;
pointer-events: none;
}
.endsequence-copy-affordance {
flex-shrink: 0;
display: flex;
align-items: center;
padding: 2px 0 0 4px;
opacity: 0.55;
color: #e85d4c;
pointer-events: none;
}
button.endsequence-item:hover .endsequence-copy-affordance {
opacity: 0.95;
}
/* Anti-Classifier tool */
.anticlassifier-section .ac-lede {
font-size: 0.9rem;
color: var(--text-muted);
margin: 8px 0 0;
padding-left: 14px;
line-height: 1.45;
}
.ac-response {
white-space: pre-wrap;
word-break: break-word;
font-family: inherit;
font-size: 0.9rem;
margin: 0;
padding: 12px;
background: var(--input-bg);
border: 1px solid var(--input-border);
border-radius: 4px;
max-height: 60vh;
overflow-y: auto;
}
.ac-output-wrap {
margin-top: 16px;
}
.token-card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
.token-text {
font-family: 'Fira Code', monospace;
font-size: 1rem;
color: var(--text-color);
word-break: break-all;
flex: 1;
margin-right: 10px;
}
.copy-token-button {
background: var(--button-bg);
border: 1px solid var(--input-border);
border-radius: 4px;
color: var(--text-color);
cursor: pointer;
padding: 6px 10px;
font-size: 0.9rem;
transition: all 0.2s;
flex-shrink: 0;
}
.copy-token-button:hover {
background-color: var(--accent-color);
color: var(--button-bg);
border-color: var(--accent-color);
}
.token-card-body {
display: flex;
flex-direction: column;
gap: 6px;
}
.token-badge {
display: inline-block;
padding: 4px 8px;
border-radius: 4px;
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
width: fit-content;
}
.badge-unspeakable {
background-color: rgba(255, 107, 107, 0.2);
color: #ff6b6b;
border: 1px solid #ff6b6b;
}
.badge-polysemantic {
background-color: rgba(255, 193, 7, 0.2);
color: #ffc107;
border: 1px solid #ffc107;
}
.badge-glitched_spelling {
background-color: rgba(156, 39, 176, 0.2);
color: #9c27b0;
border: 1px solid #9c27b0;
}
.badge-context_corruptor {
background-color: rgba(244, 67, 54, 0.2);
color: #f44336;
border: 1px solid #f44336;
}
.badge-loop_inducer {
background-color: rgba(255, 0, 0, 0.3);
color: #ff0000;
border: 1px solid #ff0000;
font-weight: 700;
}
.badge-identity_disruptor {
background-color: rgba(255, 152, 0, 0.2);
color: #ff9800;
border: 1px solid #ff9800;
}
.badge-fragment {
background-color: rgba(158, 158, 158, 0.2);
color: #9e9e9e;
border: 1px solid #9e9e9e;
}
.badge-unreachable {
background-color: rgba(96, 125, 139, 0.2);
color: #607d8b;
border: 1px solid #607d8b;
}
.token-id,
.token-origin,
.token-output,
.token-note {
font-size: 0.85rem;
color: var(--text-muted);
line-height: 1.4;
}
.token-id {
font-family: 'Fira Code', monospace;
}
.token-output {
font-style: italic;
}
.token-note {
margin-top: 4px;
padding-top: 6px;
border-top: 1px solid var(--input-border);
font-size: 0.8rem;
}
.no-history {
padding: 20px;
text-align: center;
color: var(--text-color);
opacity: 0.7;
}
.history-items {
display: flex;
flex-direction: column;
gap: 15px;
}
.history-item {
background-color: var(--input-bg);
border: 1px solid var(--input-border);
border-left: 3px solid var(--accent-color);
border-radius: 4px;
padding: 10px;
transition: all 0.2s ease;
}
.history-item:hover {
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
.history-item-header {
display: flex;
justify-content: space-between;
margin-bottom: 8px;
font-size: 0.85rem;
}
.history-source {
font-weight: bold;
color: var(--accent-color);
}
.history-time {
color: var(--text-color);
opacity: 0.7;
}
.history-content {
background-color: var(--main-bg-color);
padding: 10px;
border-radius: 4px;
white-space: pre-wrap;
word-break: break-word;
max-height: 150px;
overflow-y: auto;
font-family: monospace;
font-size: 0.9rem;
color: var(--text-color);
}
.history-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
margin-top: 8px;
}
.copy-again-button,
.remove-history-button {
background-color: var(--button-bg);
color: var(--text-color);
border: 1px solid var(--input-border);
border-radius: 4px;
padding: 5px 10px;
font-size: 0.85rem;
cursor: pointer;
transition: all 0.2s ease;
}
.copy-again-button:hover {
background-color: var(--button-hover-bg);
color: var(--accent-color);
}
.remove-history-button:hover {
background-color: #ff6b6b;
border-color: #ff6b6b;
color: white;
}
.history-button {
background: none;
color: var(--text-color);
border: none;
border-radius: 50%;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
margin-right: 8px;
transition: all 0.2s ease;
}
.history-button:hover {
background-color: var(--button-hover-bg);
color: var(--accent-color);
}
.transform-name {
font-weight: 500;
color: var(--text-color);
}
.transform-preview {
font-size: 0.75rem;
font-family: 'Fira Code', monospace;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
width: 100%;
max-width: 180px;
padding: 3px 6px;
border-radius: 3px;
background-color: rgba(0, 0, 0, 0.2);
margin-top: 4px;
transition: all 0.2s ease;
}
.transform-category-case .transform-preview {
color: rgba(var(--case-color-rgb), 0.9);
}
.transform-category-cipher .transform-preview {
color: rgba(var(--cipher-color-rgb), 0.9);
}
.transform-category-concealment .transform-preview {
color: rgba(var(--concealment-color-rgb), 0.9);
}
.transform-category-encoding .transform-preview {
color: rgba(var(--encoding-color-rgb), 0.9);
}
.transform-category-format .transform-preview {
color: rgba(var(--format-color-rgb), 0.9);
}
.transform-category-signwriting .transform-preview {
color: rgba(var(--signwriting-color-rgb), 0.9);
font-family: 'Noto Sans SignWriting', 'Fira Code', monospace;
line-height: 2;
letter-spacing: 0.05em;
}
.transform-category-special .transform-preview {
color: rgba(var(--special-color-rgb), 0.9);
}
.transform-category-symbol .transform-preview {
color: rgba(var(--symbol-color-rgb), 0.9);
}
.transform-category-technical .transform-preview {
color: rgba(var(--technical-color-rgb), 0.9);
}
.transform-category-unicode .transform-preview {
color: rgba(var(--unicode-color-rgb), 0.9);
}
.transform-category-visual .transform-preview {
color: rgba(var(--visual-color-rgb), 0.9);
}
.transform-category-randomizer .transform-preview {
color: rgba(var(--randomizer-color-rgb), 0.95);
text-shadow: 0 0 8px rgba(var(--randomizer-color-rgb), 0.35);
}
.transform-category-custom_spelling .transform-preview {
color: rgba(var(--custom-spelling-color-rgb), 0.9);
}
.transform-category-translate .transform-preview {
color: rgba(var(--translate-color-rgb), 0.9);
}
.output-container.signwriting-output textarea {
font-family: 'Noto Sans SignWriting', 'Fira Code', 'Courier New', monospace;
line-height: 2;
letter-spacing: 0.1em;
}
.transform-button:hover .transform-preview {
background-color: rgba(0, 0, 0, 0.18);
opacity: 1;
}
.transform-button.active .transform-preview {
background-color: rgba(0, 0, 0, 0.3);
color: rgba(255, 255, 255, 0.9);
}
.transform-button {
padding: 8px;
height: auto;
border-radius: 4px;
font-size: 0.8rem;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
width: 100%;
font-weight: 500;
text-align: center;
border: 1px solid var(--input-border);
background: var(--button-bg);
color: var(--text-color);
transition: all 0.2s ease;
overflow: visible;
min-height: 70px;
}
[class*="transform-category-"] {
background: linear-gradient(to right, transparent, var(--button-bg));
transition: all 0.2s ease;
}
.transform-category-case {
background: linear-gradient(to right, rgba(var(--case-color-rgb), 0.05), var(--button-bg));
}
.transform-category-case:hover {
background: linear-gradient(to right, rgba(var(--case-color-rgb), 0.15), var(--button-hover-bg));
box-shadow: 0 3px 10px rgba(var(--case-color-rgb), 0.2);
}
.transform-category-cipher {
background: linear-gradient(to right, rgba(var(--cipher-color-rgb), 0.05), var(--button-bg));
}
.transform-category-cipher:hover {
background: linear-gradient(to right, rgba(var(--cipher-color-rgb), 0.15), var(--button-hover-bg));
box-shadow: 0 3px 10px rgba(var(--cipher-color-rgb), 0.2);
}
.transform-category-concealment {
background: linear-gradient(to right, rgba(var(--concealment-color-rgb), 0.05), var(--button-bg));
}
.transform-category-concealment:hover {
background: linear-gradient(to right, rgba(var(--concealment-color-rgb), 0.15), var(--button-hover-bg));
box-shadow: 0 3px 10px rgba(var(--concealment-color-rgb), 0.2);
}
.transform-category-encoding {
background: linear-gradient(to right, rgba(var(--encoding-color-rgb), 0.05), var(--button-bg));
}
.transform-category-encoding:hover {
background: linear-gradient(to right, rgba(var(--encoding-color-rgb), 0.15), var(--button-hover-bg));
box-shadow: 0 3px 10px rgba(var(--encoding-color-rgb), 0.2);
}
.transform-category-format {
background: linear-gradient(to right, rgba(var(--format-color-rgb), 0.05), var(--button-bg));
}
.transform-category-format:hover {
background: linear-gradient(to right, rgba(var(--format-color-rgb), 0.15), var(--button-hover-bg));
box-shadow: 0 3px 10px rgba(var(--format-color-rgb), 0.2);
}
.transform-category-signwriting {
background: linear-gradient(to right, rgba(var(--signwriting-color-rgb), 0.05), var(--button-bg));
}
.transform-category-signwriting:hover {
background: linear-gradient(to right, rgba(var(--signwriting-color-rgb), 0.15), var(--button-hover-bg));
box-shadow: 0 3px 10px rgba(var(--signwriting-color-rgb), 0.2);
}
.transform-category-special {
background: linear-gradient(to right, rgba(var(--special-color-rgb), 0.05), var(--button-bg));
}
.transform-category-special:hover {
background: linear-gradient(to right, rgba(var(--special-color-rgb), 0.15), var(--button-hover-bg));
box-shadow: 0 3px 10px rgba(var(--special-color-rgb), 0.2);
}
.transform-category-symbol {
background: linear-gradient(to right, rgba(var(--symbol-color-rgb), 0.05), var(--button-bg));
}
.transform-category-symbol:hover {
background: linear-gradient(to right, rgba(var(--symbol-color-rgb), 0.15), var(--button-hover-bg));
box-shadow: 0 3px 10px rgba(var(--symbol-color-rgb), 0.2);
}
.transform-category-technical {
background: linear-gradient(to right, rgba(var(--technical-color-rgb), 0.05), var(--button-bg));
}
.transform-category-technical:hover {
background: linear-gradient(to right, rgba(var(--technical-color-rgb), 0.15), var(--button-hover-bg));
box-shadow: 0 3px 10px rgba(var(--technical-color-rgb), 0.2);
}
.transform-category-unicode {
background: linear-gradient(to right, rgba(var(--unicode-color-rgb), 0.05), var(--button-bg));
}
.transform-category-unicode:hover {
background: linear-gradient(to right, rgba(var(--unicode-color-rgb), 0.15), var(--button-hover-bg));
box-shadow: 0 3px 10px rgba(var(--unicode-color-rgb), 0.2);
}
.transform-category-visual {
background: linear-gradient(to right, rgba(var(--visual-color-rgb), 0.05), var(--button-bg));
}
.transform-category-visual:hover {
background: linear-gradient(to right, rgba(var(--visual-color-rgb), 0.15), var(--button-hover-bg));
box-shadow: 0 3px 10px rgba(var(--visual-color-rgb), 0.2);
}
.transform-category-randomizer {
background: linear-gradient(to right, rgba(var(--randomizer-color-rgb), 0.05), var(--button-bg));
}
.transform-category-randomizer:hover {
background: linear-gradient(to right, rgba(var(--randomizer-color-rgb), 0.15), var(--button-hover-bg));
box-shadow: 0 3px 10px rgba(var(--randomizer-color-rgb), 0.2);
}
.transform-category-custom_spelling {
background: linear-gradient(to right, rgba(var(--custom-spelling-color-rgb), 0.05), var(--button-bg));
}
.transform-category-custom_spelling:hover {
background: linear-gradient(to right, rgba(var(--custom-spelling-color-rgb), 0.15), var(--button-hover-bg));
box-shadow: 0 3px 10px rgba(var(--custom-spelling-color-rgb), 0.2);
}
.transform-category-translate {
background: linear-gradient(to right, rgba(var(--translate-color-rgb), 0.05), var(--button-bg));
}
.transform-category-translate:hover {
background: linear-gradient(to right, rgba(var(--translate-color-rgb), 0.15), var(--button-hover-bg));
box-shadow: 0 3px 10px rgba(var(--translate-color-rgb), 0.2);
}
.transform-button:before {
content: '';
position: absolute;
top: -2px;
left: -2px;
right: -2px;
bottom: -2px;
border: 2px solid transparent;
border-radius: 6px;
transition: all 0.2s ease;
pointer-events: none;
}
.transform-button:hover {
background: var(--button-hover-bg);
border-color: var(--accent-color);
transform: translateY(-1px);
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
}
.transform-button:hover:before {
border-color: var(--accent-color);
opacity: 0.4;
}
.transform-button.active {
background: var(--button-active-bg);
color: var(--main-bg-color);
border-color: var(--button-active-bg);
box-shadow: 0 2px 8px rgba(100, 181, 246, 0.25);
transform: translateY(-1px);
}
.transform-button.active:before {
border-color: var(--accent-color);
opacity: 1;
}
/* Category-specific active states */
.transform-category-case.active {
background: linear-gradient(to right, var(--case-color), var(--case-active-end));
box-shadow: 0 3px 12px rgba(var(--case-color-rgb), 0.4);
}
.transform-category-cipher.active {
background: linear-gradient(to right, var(--cipher-color), var(--cipher-active-end));
box-shadow: 0 3px 12px rgba(var(--cipher-color-rgb), 0.4);
}
.transform-category-concealment.active {
background: linear-gradient(to right, var(--concealment-color), var(--concealment-active-end));
box-shadow: 0 3px 12px rgba(var(--concealment-color-rgb), 0.4);
}
.transform-category-encoding.active {
background: linear-gradient(to right, var(--encoding-color), var(--encoding-active-end));
box-shadow: 0 3px 12px rgba(var(--encoding-color-rgb), 0.4);
}
.transform-category-format.active {
background: linear-gradient(to right, var(--format-color), var(--format-active-end));
box-shadow: 0 3px 12px rgba(var(--format-color-rgb), 0.4);
}
.transform-category-signwriting.active {
background: linear-gradient(to right, var(--signwriting-color), var(--signwriting-active-end));
box-shadow: 0 3px 12px rgba(var(--signwriting-color-rgb), 0.4);
}
.transform-category-special.active {
background: linear-gradient(to right, var(--special-color), var(--special-active-end));
box-shadow: 0 3px 12px rgba(var(--special-color-rgb), 0.4);
}
.transform-category-symbol.active {
background: linear-gradient(to right, var(--symbol-color), var(--symbol-active-end));
box-shadow: 0 3px 12px rgba(var(--symbol-color-rgb), 0.4);
}
.transform-category-technical.active {
background: linear-gradient(to right, var(--technical-color), var(--technical-active-end));
box-shadow: 0 3px 12px rgba(var(--technical-color-rgb), 0.4);
}
.transform-category-translate.active {
background: linear-gradient(to right, var(--translate-color), var(--translate-active-end));
box-shadow: 0 3px 12px rgba(var(--translate-color-rgb), 0.4);
}
.transform-category-unicode.active {
background: linear-gradient(to right, var(--unicode-color), var(--unicode-active-end));
box-shadow: 0 3px 12px rgba(var(--unicode-color-rgb), 0.4);
}
.transform-category-visual.active {
background: linear-gradient(to right, var(--visual-color), var(--visual-active-end));
box-shadow: 0 3px 12px rgba(var(--visual-color-rgb), 0.4);
}
.transform-category-randomizer.active {
background: linear-gradient(to right, var(--randomizer-color), var(--randomizer-active-end));
box-shadow: 0 3px 12px rgba(var(--randomizer-color-rgb), 0.4);
}
.transform-category-custom_spelling.active {
background: linear-gradient(to right, var(--custom-spelling-color), var(--custom-spelling-active-end));
box-shadow: 0 3px 12px rgba(var(--custom-spelling-color-rgb), 0.4);
}
/* Add a subtle indicator for clickable buttons */
.transform-button:after {
content: '';
position: absolute;
bottom: 4px;
left: 50%;
transform: translateX(-50%);
width: 20px;
height: 2px;
background: var(--accent-color);
opacity: 0;
transition: all 0.2s ease;
}
.transform-button.active:after {
opacity: 0.8;
width: 30px;
}
/* Favorite icon styling */
.favorite-icon {
position: absolute;
right: 8px;
bottom: 8px;
font-size: 0.8rem;
opacity: 0.5;
transition: all 0.2s ease;
cursor: pointer;
z-index: 12;
color: var(--text-color);
}
.favorite-icon:hover {
opacity: 1;
transform: scale(1.2);
color: #ffd700;
}
.favorite-icon.favorited {
opacity: 1;
color: #ffd700;
}
.favorite-icon.favorited:hover {
transform: scale(1.3);
color: #ffed4e;
}
/* Per-transform options (gear) */
.transform-options-gear {
position: absolute;
left: 8px;
bottom: 8px;
font-size: 0.85rem;
opacity: 0.75;
transition: opacity 0.2s ease, transform 0.2s ease, color 0.2s ease;
cursor: pointer;
z-index: 12;
color: var(--accent-color);
}
.transform-options-gear:hover {
opacity: 1;
color: var(--accent-color);
transform: scale(1.15);
}
body.transform-options-modal-open {
overflow: hidden;
}
.transform-options-backdrop {
position: fixed;
inset: 0;
z-index: 12000;
display: flex;
align-items: flex-end;
justify-content: center;
padding: 0;
background: rgba(0, 0, 0, 0.55);
-webkit-backdrop-filter: blur(2px);
backdrop-filter: blur(2px);
}
@media (min-width: 600px) {
.transform-options-backdrop {
align-items: center;
padding: 16px;
}
}
.transform-options-panel {
width: 100%;
max-width: 420px;
max-height: min(88vh, 640px);
display: flex;
flex-direction: column;
background: var(--main-bg-color);
color: var(--text-color);
border: 1px solid var(--input-border);
border-radius: 12px 12px 0 0;
box-shadow: 0 -4px 24px rgba(0, 0, 0, 0.35);
overflow: hidden;
}
@media (min-width: 600px) {
.transform-options-panel {
border-radius: 12px;
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.4);
}
}
.transform-options-panel-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 14px 16px;
border-bottom: 1px solid var(--input-border);
flex-shrink: 0;
}
.transform-options-panel-header h3 {
margin: 0;
font-size: 1.05rem;
font-weight: 600;
}
.transform-options-close {
flex-shrink: 0;
width: 40px;
height: 40px;
border: none;
border-radius: 8px;
background: transparent;
color: var(--text-color);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.1rem;
}
.transform-options-close:hover {
background: var(--button-hover-bg);
}
.transform-options-panel-body {
padding: 12px 16px 8px;
overflow-y: auto;
flex: 1;
-webkit-overflow-scrolling: touch;
}
.transform-options-field {
margin-bottom: 14px;
}
.transform-options-field label {
display: block;
margin-bottom: 6px;
font-size: 0.85rem;
font-weight: 500;
color: var(--text-color);
}
.transform-options-checkbox {
width: 22px;
height: 22px;
min-width: 22px;
min-height: 22px;
cursor: pointer;
accent-color: var(--accent-color);
}
.transform-options-select {
width: 100%;
max-width: 100%;
padding: 12px 14px;
font-size: 1rem;
border-radius: 8px;
border: 1px solid var(--input-border);
background: var(--button-bg);
color: var(--text-color);
min-height: 48px;
}
.transform-options-text,
.transform-options-number {
width: 100%;
box-sizing: border-box;
padding: 12px 14px;
font-size: 1rem;
border-radius: 8px;
border: 1px solid var(--input-border);
background: var(--button-bg);
color: var(--text-color);
min-height: 48px;
}
.transform-options-number {
-moz-appearance: textfield;
appearance: textfield;
}
.transform-options-number::-webkit-outer-spin-button,
.transform-options-number::-webkit-inner-spin-button {
-webkit-appearance: none;
appearance: none;
margin: 0;
}
.transform-options-panel-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
justify-content: flex-end;
padding: 12px 16px 16px;
padding-bottom: max(16px, env(safe-area-inset-bottom));
border-top: 1px solid var(--input-border);
flex-shrink: 0;
}
.transform-options-btn {
min-height: 44px;
min-width: 88px;
padding: 10px 16px;
border-radius: 8px;
font-size: 0.95rem;
font-weight: 500;
cursor: pointer;
border: 1px solid var(--input-border);
background: var(--button-bg);
color: var(--text-color);
}
.transform-options-btn-primary {
background: var(--accent-color);
border-color: var(--accent-color);
color: var(--main-bg-color);
}
.transform-options-btn-primary:hover {
filter: brightness(1.08);
}
.transform-options-btn-secondary:hover {
background: var(--button-hover-bg);
}
.favorites-section {
border: 2px dashed #ffd700;
background: rgba(255, 215, 0, 0.05);
}
.favorites-section .category-title {
color: #ffd700;
border-left-color: #ffd700;
}
/* Output section */
.output-section {
display: flex;
flex-direction: column;
gap: 10px;
margin-top: 16px;
padding: 16px;
background: var(--main-bg-color);
border-radius: 6px;
border: 1px solid var(--accent-color);
box-shadow: 0 2px 12px rgba(100, 181, 246, 0.15);
}
.output-heading h4 {
display: flex;
align-items: center;
gap: 8px;
color: var(--success-color);
margin-bottom: 8px;
font-size: 1rem;
}
.output-heading h4 small {
color: var(--accent-color);
font-size: 0.8rem;
margin-left: 8px;
font-weight: normal;
opacity: 0.8;
}
.output-instructions {
font-size: 0.85rem;
color: var(--text-color);
opacity: 0.7;
padding: 6px;
border-radius: 4px;
background-color: rgba(0, 0, 0, 0.2);
margin-top: 8px;
}
.output-instructions i {
color: var(--accent-color);
margin-right: 6px;
}
.output-container {
position: relative;
}
.copy-button {
position: absolute;
top: 8px;
right: 8px;
padding: 6px;
background: var(--button-bg);
border: 1px solid var(--input-border);
border-radius: 4px;
color: var(--text-color);
opacity: 0.8;
cursor: pointer;
transition: all 0.2s ease;
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
z-index: 10;
}
.copy-button:hover {
background: var(--button-hover-bg);
border-color: var(--accent-color);
color: var(--accent-color);
opacity: 1;
}
.copy-button:active {
transform: translateY(1px);
}
/* Classy secondary action buttons (Copy All / Download) */
.action-button {
background: linear-gradient(180deg, rgba(255,255,255,0.04), rgba(255,255,255,0.02));
border: 1px solid var(--input-border);
color: var(--text-color);
padding: 8px 10px;
border-radius: 6px;
cursor: pointer;
transition: border-color .15s ease, color .15s ease, box-shadow .15s ease;
}
.action-button i { margin-right: 6px; opacity: .9; }
.action-button:hover {
border-color: var(--accent-color);
color: var(--accent-color);
box-shadow: 0 0 0 1px rgba(100, 181, 246, 0.15) inset, 0 0 12px rgba(100, 181, 246, 0.12);
}
.action-button:active { transform: translateY(1px); }
.decoded-message {
position: relative;
padding: 12px;
background: var(--input-bg);
border-radius: 4px;
margin-top: 12px;
border: 1px solid var(--input-border);
font-family: 'Fira Code', monospace;
word-break: break-word;
}
/* Copy button hover styling is defined above */
.form-group label {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 12px;
color: var(--accent-color);
font-weight: 500;
}
.form-group label i {
font-size: 1.1rem;
}
/* Section dividers */
.section-divider {
border-top: 1px solid var(--section-divider);
margin: 30px 0;
}
/* GitHub link */
.actions {
display: flex;
gap: 8px;
}
.theme-button,
.github-button {
background: var(--button-bg);
color: var(--text-color);
border: 1px solid var(--input-border);
border-radius: 4px;
padding: 8px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s ease;
text-decoration: none;
width: 32px;
height: 32px;
}
.theme-button:hover,
.github-button:hover {
background: var(--button-hover-bg);
border-color: var(--accent-color);
transform: translateY(-1px);
}
.github-link:hover {
background-color: var(--button-hover-bg);
color: var(--button-hover-text);
}
/* Responsive adjustments */
/* Special styling for randomizer section */
.randomizer-special {
background: linear-gradient(135deg, rgba(88, 28, 135, 0.22), rgba(74, 20, 140, 0.22));
border: 2px solid rgba(186, 104, 200, 0.35);
border-radius: 14px;
padding: 22px;
margin: 18px 0;
position: relative;
box-shadow: 0 12px 28px rgba(0,0,0,.35) inset, 0 8px 24px rgba(88,28,135,.18);
}
.randomizer-special::before {
content: '🎲';
position: absolute;
top: -10px;
right: 20px;
font-size: 24px;
background: var(--bg-color);
padding: 0 10px;
}
.randomizer-description {
color: rgba(156, 39, 176, 0.9);
font-style: italic;
margin-bottom: 15px;
text-align: center;
}
.randomizer-info {
margin-top: 20px;
padding: 16px 16px 12px 16px;
background: rgba(123, 31, 162, 0.16);
border-radius: 12px;
border-left: 4px solid var(--randomizer-color);
}
.randomizer-info h5 {
color: var(--randomizer-color);
margin-bottom: 10px;
}
.randomizer-info ul {
margin-left: 20px;
color: var(--text-color);
}
.randomizer-info li {
margin-bottom: 5px;
}
.randomizer-info p {
margin-top: 10px;
color: rgba(200, 170, 255, 0.9);
font-style: italic;
}
.randomizer-button {
background: linear-gradient(135deg, var(--encoding-color), var(--randomizer-active-end));
color: #f8f8ff;
font-weight: 800;
position: relative;
overflow: hidden;
border: 2px solid rgba(200, 170, 255, 0.35);
padding: var(--spacing-md) var(--spacing-lg);
letter-spacing: .3px;
justify-content: center;
text-align: center;
}
.randomizer-button::after {
content: '';
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: radial-gradient(circle at center, rgba(255,255,255,0.18), rgba(255,255,255,0) 60%);
transform: rotate(25deg);
opacity: 0;
transition: opacity .25s ease;
}
.randomizer-button:hover::after { opacity: 1; }
.randomizer-button:hover { filter: brightness(1.08) saturate(1.05); }
/* Randomizer chaos animations */
.randomizer-special { position: relative; }
.chaos-overlay {
position: absolute;
inset: 0;
pointer-events: none;
overflow: visible;
z-index: 10;
}
.chaos-particle {
position: absolute;
bottom: 8px;
font-size: 16px;
opacity: 0.95;
animation: floatUpChaos 1.1s ease-out forwards;
filter: drop-shadow(0 2px 2px rgba(0,0,0,0.2));
z-index: 11;
}
@keyframes floatUpChaos {
0% { transform: translateY(10px) scale(0.8) rotate(0deg); opacity: 0; }
50% { opacity: 1; }
100% { transform: translateY(-90px) scale(1.15) rotate(15deg); opacity: 0; }
}
.shake-once {
animation: shakeChaos 420ms cubic-bezier(.36,.07,.19,.97) both;
}
@keyframes shakeChaos {
10%, 90% { transform: translate3d(-1px, 0, 0); }
20%, 80% { transform: translate3d(2px, 0, 0); }
30%, 50%, 70% { transform: translate3d(-4px, 0, 0); }
40%, 60% { transform: translate3d(4px, 0, 0); }
}
.randomizer-glow {
animation: glowChaos 1.2s ease-in-out;
}
@keyframes glowChaos {
0% { box-shadow: 0 0 0 rgba(156,39,176,0); }
30% { box-shadow: 0 0 18px rgba(156,39,176,0.6); }
100% { box-shadow: 0 0 0 rgba(156,39,176,0); }
}
/* Steganography split layout */
.steg-split-layout {
display: grid;
grid-template-columns: 280px 1fr;
gap: 16px;
}
.steg-advanced-sidebar {
position: sticky;
top: 8px;
height: max-content;
background: var(--main-bg-color);
border: 1px solid var(--input-border);
border-radius: 8px;
padding: 12px;
}
.steg-adv-panel label {
display: flex;
flex-direction: column;
gap: 6px;
margin-bottom: 8px;
}
/* Steg panel inputs - only unique overrides */
.steg-adv-panel select,
.steg-adv-panel input[type=number] {
padding: 6px 8px; /* Slightly smaller padding */
}
.steg-note {
display: block;
margin-top: 8px;
color: var(--text-muted);
font-size: 0.8rem;
}
/* Unicode / Advanced Settings: shell + header close (touch-friendly) */
.unicode-panel-header .close-button {
background: transparent;
border: none;
color: var(--text-color);
cursor: pointer;
padding: 8px;
min-width: 44px;
min-height: 44px;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2rem;
transition: all 0.2s ease;
border-radius: 4px;
pointer-events: auto;
touch-action: manipulation;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0.1);
user-select: none;
z-index: 301;
position: relative;
}
.unicode-panel-header .close-button:hover {
background: var(--button-hover-bg);
color: var(--accent-color);
}
.unicode-panel-header .close-button:active {
transform: scale(0.95);
}
.apply-status { color:#69f0ae; opacity:.9; }
.apply-steg-options.applied { border-color:#2e7d32; box-shadow: 0 0 12px rgba(105,240,174,.35) inset, 0 0 16px rgba(105,240,174,.2); }
/* API Key Settings */
.settings-section { margin-bottom: 12px; }
.settings-section h4 { color: var(--accent-color); margin: 0 0 6px 0; font-size: 0.85rem; }
.settings-hint { color: var(--muted-color, #555566); display: block; margin-bottom: 8px; font-size: 0.75rem; }
.settings-divider { border: none; border-top: 1px solid var(--border-color, #2A2A30); margin: 14px 0; }
.api-key-input-row { display: flex; gap: 6px; margin-bottom: 8px; }
.api-key-input {
flex: 1;
background: var(--bg-darkest, #0A0A0A);
border: 1px solid var(--border-color, #2A2A30);
color: var(--text-primary, #e0e0e0);
padding: 6px 10px;
border-radius: 4px;
font-family: var(--font-mono, monospace);
font-size: 0.8rem;
letter-spacing: 1px;
}
.api-key-input:focus { border-color: var(--accent-color, #FFD700); outline: none; }
.api-key-toggle {
background: var(--bg-darker, #111114);
border: 1px solid var(--border-color, #2A2A30);
color: var(--text-secondary, #B0E0E6);
padding: 6px 10px;
border-radius: 4px;
cursor: pointer;
}
.api-key-toggle:hover { border-color: var(--accent-color, #FFD700); }
.api-key-actions { display: flex; gap: 8px; align-items: center; }
.api-key-save, .api-key-clear {
background: var(--bg-darker, #111114);
border: 1px solid var(--border-color, #2A2A30);
color: var(--text-primary, #e0e0e0);
padding: 5px 12px;
border-radius: 4px;
cursor: pointer;
font-size: 0.8rem;
}
.api-key-save:hover { border-color: var(--success-color, #50C878); color: var(--success-color, #50C878); }
.api-key-clear:hover { border-color: var(--danger-color, #722F37); color: var(--danger-color, #722F37); }
/* Decoder Language Detection */
.decoder-lang-banner {
background: linear-gradient(135deg, rgba(255, 215, 0, 0.08), rgba(80, 200, 120, 0.06));
border: 1px solid rgba(255, 215, 0, 0.25);
border-radius: 8px;
padding: 10px 14px;
margin: 8px 0;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 10px;
}
.decoder-lang-info {
display: flex;
align-items: center;
gap: 8px;
color: var(--accent-color, #FFD700);
font-size: 0.9rem;
}
.decoder-lang-info i { font-size: 1.1rem; }
.lang-confidence { color: var(--muted-color, #555566); font-style: italic; }
.decoder-translate-btn {
background: var(--bg-darker, #111114);
border: 1px solid var(--accent-color, #FFD700);
color: var(--accent-color, #FFD700);
padding: 6px 14px;
border-radius: 6px;
cursor: pointer;
font-family: var(--font-mono, monospace);
font-size: 0.8rem;
transition: all 0.2s;
}
.decoder-translate-btn:hover:not(:disabled) {
background: rgba(255, 215, 0, 0.12);
box-shadow: 0 0 10px rgba(255, 215, 0, 0.15);
}
.decoder-translate-btn:disabled { opacity: 0.6; cursor: wait; }
.decoder-translate-error {
width: 100%;
color: var(--danger-color, #722F37);
font-size: 0.8rem;
margin-top: 4px;
}
/* Fluid UX: reduce scroll fatigue during repeated actions */
html {
scroll-behavior: smooth;
}
/* Tokenade presets: horizontal layout */
.tokenade-presets {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
margin: 8px 0;
}
.tokenade-presets > label {
margin-right: 4px;
}
/* Hacker style controls */
.hacker-controls {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 12px;
align-items: end;
}
/* Range sliders — use in .slider-block (PromptCraft, Anti-Classifier, Tokenade) */
.slider-block {
background: var(--input-bg);
border: 1px solid var(--input-border);
border-radius: 6px;
padding: 10px 12px;
display: flex;
flex-direction: column;
gap: 6px;
font-size: 0.8rem;
font-weight: 600;
letter-spacing: 0.02em;
color: var(--text-muted);
}
.options-grid label.slider-block {
gap: 6px;
}
.slider-block input[type="range"] {
-webkit-appearance: none;
appearance: none;
width: 100%;
height: 6px;
margin: 4px 0 2px;
background: transparent;
cursor: pointer;
border: none;
outline: none;
}
.slider-block input[type="range"]::-webkit-slider-runnable-track {
height: 6px;
border-radius: 4px;
background: linear-gradient(
90deg,
rgba(var(--accent-color-rgb), 0.42) 0%,
rgba(var(--accent-color-rgb), 0.1) 100%
);
border: 1px solid var(--input-border);
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
}
.slider-block input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 16px;
height: 16px;
margin-top: -5px;
background: var(--accent-color);
border-radius: 50%;
border: 2px solid var(--secondary-bg);
box-shadow:
0 0 10px rgba(var(--accent-color-rgb), 0.45),
0 1px 3px rgba(0, 0, 0, 0.35);
cursor: pointer;
}
.slider-block input[type="range"]:focus-visible::-webkit-slider-thumb {
box-shadow:
0 0 0 3px rgba(var(--accent-color-rgb), 0.35),
0 0 10px rgba(var(--accent-color-rgb), 0.45),
0 1px 3px rgba(0, 0, 0, 0.35);
}
.slider-block input[type="range"]::-moz-range-track {
height: 6px;
border-radius: 4px;
background: linear-gradient(
90deg,
rgba(var(--accent-color-rgb), 0.42) 0%,
rgba(var(--accent-color-rgb), 0.1) 100%
);
border: 1px solid var(--input-border);
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
}
.slider-block input[type="range"]::-moz-range-thumb {
width: 14px;
height: 14px;
background: var(--accent-color);
border-radius: 50%;
border: 2px solid var(--secondary-bg);
box-shadow:
0 0 10px rgba(var(--accent-color-rgb), 0.45),
0 1px 3px rgba(0, 0, 0, 0.35);
cursor: pointer;
}
.slider-block input[type="range"]:focus-visible::-moz-range-thumb {
box-shadow:
0 0 0 3px rgba(var(--accent-color-rgb), 0.35),
0 0 10px rgba(var(--accent-color-rgb), 0.45),
0 1px 3px rgba(0, 0, 0, 0.35);
}
.slider-value {
align-self: flex-end;
margin-top: 2px;
font-family: 'Fira Code', monospace;
font-size: 0.85rem;
font-weight: 600;
font-variant-numeric: tabular-nums;
color: var(--accent-color);
}
.segmented {
display: flex;
gap: 6px;
align-items: center;
flex-wrap: wrap;
padding: 8px;
background: var(--main-bg-color);
border: 1px solid var(--input-border);
border-radius: 6px;
}
.segmented-label { opacity: .7; margin-right: 6px; }
.segmented button {
background: var(--button-bg);
border: 1px solid var(--input-border);
color: var(--text-color);
padding: 6px 10px;
border-radius: 6px;
cursor: pointer;
}
.segmented button.active {
background: var(--accent-color);
color: var(--main-bg-color);
border-color: var(--accent-color);
}
.switch {
display:flex;
gap:8px;
align-items:center;
padding: 6px 8px 6px 8px;
background: var(--main-bg-color);
border:1px solid var(--input-border);
border-radius:6px;
margin-left: 6px;
}
.switch span { opacity:.85; }
.switch.neon { border-color:#1b5e20; box-shadow:0 0 0 1px rgba(76,175,80,.15) inset, 0 0 10px rgba(76,175,80,.15); }
.switch.neon input[type="checkbox"] {
appearance: none;
width: 36px; height: 20px; border-radius: 12px; position: relative;
background: #0b2e13; border:1px solid #1b5e20; outline: none; cursor: pointer; transition: background .2s, box-shadow .2s;
}
.switch.neon input[type="checkbox"]:after {
content: '';
position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 50%; background:#a5d6a7; transition: transform .2s; box-shadow: 0 0 6px rgba(165,214,167,.6);
}
.switch.neon input[type="checkbox"]:checked { background:#1b5e20; box-shadow: 0 0 12px rgba(76,175,80,.45); }
.switch.neon input[type="checkbox"]:checked:after { transform: translateX(16px); background:#69f0ae; box-shadow: 0 0 12px rgba(105,240,174,.75); }
/* Tokenade section visual parity with transform cards */
.token-bomb-section {
background: var(--main-bg-color);
border-radius: 8px;
padding: 16px;
border: 1px solid var(--input-border);
margin-bottom: 16px;
}
.token-bomb-section .section-header { margin-bottom: 10px; }
.token-bomb-section .output-instructions { margin-top: 8px; }
/* Tokenade disclaimer styling */
.tokenade-disclaimer {
display: flex;
align-items: flex-start;
gap: 8px;
margin: 10px 0 12px 0;
padding: 10px 12px;
border: 1px solid #1b5e20;
background: rgba(27, 94, 32, 0.15);
color: #69f0ae;
border-radius: 6px;
font-size: 0.95rem;
line-height: 1.35;
}
.tokenade-disclaimer i { color: #69f0ae; margin-top: 2px; }
/* Presets row polish */
.tokenade-presets {
margin: 8px 0 12px 0;
}
.tokenade-presets .transform-button {
flex: 1 0 auto;
padding: 5px 8px;
width: unset;
}
/* Quick picks panel */
.carrier-quick-grid {
background: var(--secondary-bg);
border: 1px solid var(--input-border);
border-radius: 8px;
padding: 10px;
margin-bottom: 8px;
grid-column: 1 / -1; /* Span full width of the grid */
width: 100%;
}
.carrier-quick-grid .emoji-grid {
border: none !important;
background: transparent !important;
padding: 6px !important;
grid-template-columns: repeat(auto-fill, minmax(32px, 1fr)) !important;
grid-auto-rows: 32px !important;
width: 100% !important;
}
.tokenade-carrier-options { margin-top: 8px; }
.carrier-quick-grid .emoji-button {
width: 32px; height: 32px; font-size: 18px;
}
/* Align tokenade options with transform look */
.tokenade-carrier-options label,
.hacker-controls .slider-block,
.hacker-controls .segmented,
.hacker-controls .switch {
margin-bottom: 6px;
}
/* Reduce extra whitespace at bottom of tab cards */
.tab-content .transform-layout > *:last-child { margin-bottom: 0; }
/* Keep the transform input visible while scrolling */
.transform-layout .input-section {
position: sticky;
top: 8px;
z-index: 20;
background: var(--secondary-bg);
border: 1px solid var(--input-border);
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
}
/* Tool action toolbar — primary generate / copy / download rows */
.tool-toolbar {
display: flex;
flex-wrap: wrap;
gap: 10px;
align-items: center;
margin: 10px 0 12px 0;
}
.tool-toolbar .action-button,
.tool-toolbar .transform-button {
white-space: nowrap;
}
.tool-toolbar .action-button.copy {
border-color: #1976d2;
color: #90caf9;
}
.tool-toolbar .action-button.copy:hover {
color: #bbdefb;
box-shadow: 0 0 0 1px rgba(144,202,249,.2) inset, 0 0 14px rgba(144,202,249,.18);
}
.tool-toolbar .action-button.download {
border-color: #2e7d32;
color: #69f0ae;
}
.tool-toolbar .action-button.download:hover {
color: #b9f6ca;
box-shadow: 0 0 0 1px rgba(105,240,174,.2) inset, 0 0 14px rgba(105,240,174,.18);
}
/* Primary “generate” actions — not transform-grid category tiles */
.tool-toolbar .transform-button.tool-primary-btn {
flex: 1;
flex-direction: row;
align-items: center;
justify-content: center;
width: auto;
min-width: 200px;
min-height: 44px;
height: auto;
padding: 10px 20px;
gap: 10px;
background: linear-gradient(135deg, var(--accent-color), #42a5f5);
color: var(--main-bg-color);
border: 1px solid var(--accent-color);
font-weight: 600;
}
.tool-toolbar .transform-button.tool-primary-btn:before,
.tool-toolbar .transform-button.tool-primary-btn:after {
display: none;
}
.tool-toolbar .transform-button.tool-primary-btn i {
opacity: 0.95;
}
.tool-toolbar .transform-button.tool-primary-btn:hover:not(:disabled) {
background: linear-gradient(135deg, var(--accent-color), #42a5f5);
border-color: var(--accent-color);
color: var(--main-bg-color);
filter: brightness(1.08);
box-shadow: 0 4px 12px rgba(var(--accent-color-rgb), 0.35);
transform: translateY(-1px);
}
.tool-toolbar .transform-button.tool-primary-btn:disabled {
opacity: 0.65;
cursor: wait;
filter: none;
}
/* Bijection / PromptCraft / Anti-Classifier — shared card shell + section chrome */
.bijection-section.transform-section,
.promptcraft-section.transform-section,
.anticlassifier-section.transform-section {
background: var(--secondary-bg);
border: 1px solid var(--input-border);
border-radius: 8px;
padding: 16px;
box-shadow: var(--panel-shadow-soft);
}
.bijection-section .section-header h3,
.promptcraft-section .section-header h3,
.anticlassifier-section .section-header h3 {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
margin-bottom: 4px;
border-left: 4px solid var(--accent-color);
padding-left: 10px;
}
.bijection-section .section-header h3 small,
.promptcraft-section .section-header h3 small,
.anticlassifier-section .section-header h3 small {
font-size: 0.75rem;
font-weight: 400;
color: var(--text-muted);
padding: 2px 8px;
border-radius: 999px;
border: 1px solid var(--input-border);
background: var(--main-bg-color);
}
.bijection-section .input-section,
.promptcraft-section .input-section,
.anticlassifier-section .input-section {
position: static;
top: auto;
z-index: auto;
background: var(--main-bg-color);
border: 1px solid var(--input-border);
border-radius: 6px;
margin-bottom: 12px;
box-shadow: none;
}
.bijection-section .bj-lede {
font-size: 0.9rem;
color: var(--text-muted);
margin: 8px 0 0;
padding-left: 14px;
line-height: 1.45;
}
.bijection-section .bj-lede a {
color: var(--accent-color);
text-decoration: underline;
text-underline-offset: 2px;
}
.lexeme-analysis-card {
margin: 0 0 14px 0;
padding: 14px;
border: 1px solid var(--input-border);
border-radius: 8px;
background:
linear-gradient(135deg, rgba(25, 118, 210, 0.08), rgba(102, 187, 106, 0.06)),
var(--main-bg-color);
box-shadow: 0 4px 14px rgba(0,0,0,0.08);
}
.lexeme-analysis-header {
display: flex;
gap: 16px;
align-items: flex-start;
justify-content: space-between;
margin-bottom: 12px;
}
.lexeme-analysis-header h4 {
margin: 2px 0 6px 0;
font-size: 1rem;
}
.lexeme-analysis-header p {
margin: 0;
color: var(--text-muted);
line-height: 1.5;
}
.lexeme-analysis-kicker {
font-size: 0.72rem;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--accent-color);
}
.lexeme-neutralize-btn {
align-self: center;
}
.lexeme-analysis-list {
display: grid;
gap: 10px;
}
.lexeme-analysis-item {
border: 1px solid var(--input-border);
border-radius: 8px;
background: rgba(255,255,255,0.03);
padding: 12px;
}
.lexeme-analysis-item-top {
display: flex;
gap: 12px;
align-items: flex-start;
justify-content: space-between;
margin-bottom: 8px;
}
.lexeme-analysis-term-group {
display: flex;
flex-wrap: wrap;
gap: 6px;
align-items: center;
}
.lexeme-term {
font-size: 0.95rem;
font-weight: 700;
}
.lexeme-chip {
display: inline-flex;
align-items: center;
padding: 2px 8px;
border-radius: 999px;
border: 1px solid var(--input-border);
background: var(--secondary-bg);
color: var(--text-muted);
font-size: 0.74rem;
line-height: 1.4;
}
.lexeme-analysis-domain {
color: var(--text-muted);
font-size: 0.82rem;
text-align: right;
}
.lexeme-analysis-rationale {
margin: 0 0 10px 0;
line-height: 1.45;
color: var(--text-color);
}
.lexeme-analysis-rewrites {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.lexeme-rewrite-btn {
padding: 7px 10px;
border-radius: 999px;
border: 1px solid rgba(25, 118, 210, 0.35);
background: rgba(25, 118, 210, 0.08);
color: var(--text-color);
font: inherit;
font-size: 0.82rem;
cursor: pointer;
transition: transform 0.15s ease, box-shadow 0.15s ease, background 0.15s ease;
}
.lexeme-rewrite-btn:hover {
transform: translateY(-1px);
background: rgba(25, 118, 210, 0.14);
box-shadow: 0 4px 10px rgba(25, 118, 210, 0.14);
}
@media (max-width: 720px) {
.lexeme-analysis-header,
.lexeme-analysis-item-top {
flex-direction: column;
}
.lexeme-analysis-domain {
text-align: left;
}
.lexeme-neutralize-btn {
width: 100%;
}
}
.bijection-section .bij-options.options-grid {
margin-top: 0;
margin-bottom: 8px;
}
.bijection-section .bij-toggles.options-grid {
margin-top: 0;
margin-bottom: 12px;
}
.bijection-section .bj-count {
font-size: 0.75rem;
font-weight: 600;
color: var(--accent-color);
font-family: 'Courier New', monospace;
margin-left: 4px;
}
.bijection-section .bj-mapping-panel {
margin: 16px 0 0;
padding: 12px;
border-radius: 6px;
border: 1px solid var(--input-border);
background: var(--main-bg-color);
}
.bijection-section .bj-mapping-head {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 10px;
margin-bottom: 10px;
}
.bijection-section .bj-mapping-head h4 {
margin: 0;
font-size: 0.95rem;
display: flex;
align-items: center;
gap: 6px;
color: var(--text-color);
}
.bijection-section .bj-mapping-grid {
display: flex;
flex-wrap: wrap;
gap: 8px;
max-height: 200px;
overflow-y: auto;
padding: 4px 0;
}
.bijection-section .bj-map-chip {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 4px 10px;
border-radius: 6px;
border: 1px solid var(--input-border);
background: var(--secondary-bg);
font-size: 0.85rem;
}
.bijection-section .bj-map-key { font-family: ui-monospace, monospace; font-weight: 600; }
.bijection-section .bj-map-val { font-family: ui-monospace, monospace; opacity: 0.95; }
.bijection-section .bj-map-arrow { opacity: 0.45; font-size: 0.8rem; }
.bijection-section .bj-output-title {
margin: 16px 0 10px;
font-size: 0.95rem;
display: flex;
align-items: center;
gap: 6px;
color: var(--text-color);
}
.bijection-section .bj-results {
display: flex;
flex-direction: column;
gap: 12px;
}
.bijection-section .bj-result-card,
.pc-result-card {
background: var(--main-bg-color);
border: 1px solid var(--input-border);
border-radius: 6px;
padding: 12px;
}
.bijection-section .bj-result-header {
display: flex;
align-items: center;
gap: 10px;
flex-wrap: wrap;
margin-bottom: 8px;
padding-bottom: 8px;
border-bottom: 1px solid var(--input-border);
}
.bijection-section .bj-result-num,
.pc-result-num {
font-size: 0.75rem;
font-weight: 600;
color: var(--accent-color);
font-family: 'Courier New', monospace;
}
.bijection-section .bj-result-meta {
flex: 1;
font-size: 0.75rem;
color: var(--text-muted);
min-width: 0;
}
.bijection-section .bj-copy-btn {
margin-left: auto;
background: transparent;
border: 1px solid var(--input-border);
color: var(--text-muted);
border-radius: 6px;
padding: 6px 10px;
cursor: pointer;
transition: border-color 0.15s ease, color 0.15s ease;
}
.bijection-section .bj-copy-btn:hover {
border-color: var(--accent-color);
color: var(--accent-color);
}
.bijection-section .bj-prompt-text {
width: 100%;
min-height: 120px;
font-family: 'Fira Code', ui-monospace, monospace;
font-size: 0.82rem;
line-height: 1.45;
background: var(--input-bg);
border: 1px solid var(--input-border);
border-radius: 4px;
color: var(--text-color);
padding: 8px;
resize: vertical;
}
.bijection-section .bj-encoded {
margin: 8px 0 0;
font-size: 0.82rem;
word-break: break-word;
color: var(--text-muted);
}
.pc-controls {
margin-top: 4px;
}
.pc-strategies {
margin-bottom: 12px;
}
.pc-label {
display: block;
font-size: 0.72rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--text-muted);
margin-bottom: 8px;
}
.pc-strategy-grid {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.pc-strategy-btn {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 6px;
min-width: 96px;
flex: 1 1 calc(33.333% - 8px);
max-width: calc(33.333% - 6px);
padding: 10px 8px;
font-size: 0.75rem;
font-weight: 500;
text-align: center;
line-height: 1.2;
color: var(--text-color);
background-color: var(--button-bg);
border: 1px solid var(--input-border);
border-radius: 6px;
cursor: pointer;
transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease, box-shadow 0.2s ease;
}
.pc-strategy-btn i {
font-size: 1rem;
opacity: 0.9;
}
.pc-strategy-btn:hover:not(.active) {
background-color: var(--button-hover-bg);
border-color: var(--accent-color);
color: var(--accent-color);
}
.pc-strategy-btn:hover:not(.active) i {
color: var(--accent-color);
}
.pc-strategy-btn.active {
background-color: var(--accent-color);
color: var(--main-bg-color);
border-color: var(--accent-color);
font-weight: 600;
box-shadow: 0 2px 8px rgba(var(--accent-color-rgb), 0.35);
}
.pc-strategy-btn.active i {
color: var(--main-bg-color);
opacity: 1;
}
.pc-strategy-btn:focus {
outline: none;
box-shadow: var(--focus-shadow);
}
.pc-strategy-btn.active:focus {
box-shadow: 0 0 0 2px rgba(var(--accent-color-rgb), 0.5), 0 2px 8px rgba(var(--accent-color-rgb), 0.35);
}
.pc-custom-instruction {
margin-bottom: 12px;
}
.pc-custom-instruction textarea {
width: 100%;
margin-top: 6px;
}
.pc-options.options-grid {
margin-top: 4px;
}
.pc-results {
display: flex;
flex-direction: column;
gap: 12px;
margin-top: 8px;
}
.pc-result-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
padding-bottom: 8px;
border-bottom: 1px solid var(--input-border);
}
.pc-result-text {
font-size: 0.9rem;
line-height: 1.5;
white-space: pre-wrap;
word-break: break-word;
color: var(--text-color);
}
.pc-empty-state {
text-align: center;
padding: 24px 16px;
color: var(--text-muted);
border: 1px dashed var(--input-border);
border-radius: 8px;
margin-top: 12px;
background: rgba(0, 0, 0, 0.15);
}
.pc-empty-state i {
font-size: 2rem;
margin-bottom: 8px;
opacity: 0.5;
color: var(--accent-color);
}
@media (max-width: 768px) {
.pc-strategy-btn {
flex: 1 1 calc(50% - 4px);
max-width: calc(50% - 4px);
}
}
@media (max-width: 480px) {
.pc-strategy-btn {
flex: 1 1 100%;
max-width: 100%;
}
}
/* Message Splitter — encapsulation + JSON/XML field panels share chrome */
.encapsulation-section,
.json-fields-section,
.xml-attributes-section {
margin-top: 16px;
padding: 16px;
background: var(--main-bg-color);
border: 1px solid var(--input-border);
border-radius: 8px;
}
.encapsulation-section .section-header,
.json-fields-section .section-header,
.xml-attributes-section .section-header {
margin-bottom: 16px;
}
.encapsulation-section .section-header h4,
.json-fields-section .section-header h4,
.xml-attributes-section .section-header h4 {
margin-bottom: 4px;
margin-top: 0;
color: var(--accent-color);
font-size: 1rem;
display: flex;
align-items: center;
gap: 8px;
}
.encapsulation-section .section-header p,
.json-fields-section .section-header p,
.xml-attributes-section .section-header p {
margin: 0;
color: var(--text-muted);
font-size: 0.9em;
}
.encapsulation-presets {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
}
.field-row {
display: flex;
gap: 8px;
margin-bottom: 8px;
align-items: center;
}
.field-row input {
flex: 1;
padding: 8px;
background-color: var(--input-bg);
border: 1px solid var(--input-border);
border-radius: 4px;
color: var(--text-color);
font-size: 0.9rem;
}
.field-row input:focus {
outline: none;
border-color: var(--accent-color);
}
.remove-field-button,
.add-field-button {
background-color: var(--button-bg);
border: 1px solid var(--input-border);
border-radius: 4px;
color: var(--text-color);
cursor: pointer;
padding: 8px 12px;
font-size: 0.9rem;
transition: all 0.2s;
white-space: nowrap;
}
.remove-field-button:hover {
background-color: #ff6b6b;
border-color: #ff6b6b;
color: white;
}
.add-field-button:hover {
background-color: var(--accent-color);
border-color: var(--accent-color);
color: var(--button-bg);
}
.add-field-button {
margin-top: 12px;
}
.encapsulation-presets small {
color: var(--text-muted);
font-weight: 500;
margin-right: 4px;
}
.preset-btn {
padding: 6px 12px;
background: var(--button-bg);
border: 1px solid var(--input-border);
border-radius: 6px;
color: var(--text-color);
cursor: pointer;
transition: all 0.2s ease;
font-family: 'Fira Code', monospace;
font-size: 0.9rem;
}
.preset-btn:hover {
background: var(--button-hover-bg);
border-color: var(--accent-color);
transform: translateY(-1px);
}
.preset-btn:active {
transform: translateY(0);
}
.split-messages-container {
margin-top: 16px;
}
.split-messages-container .output-heading {
margin-bottom: 12px;
}
.split-messages-container .output-heading h4 {
display: flex;
align-items: center;
gap: 8px;
color: var(--accent-color);
margin-bottom: 0;
}
.split-messages-container .output-heading h4 small {
font-size: 0.7em;
font-weight: normal;
color: var(--text-muted);
background-color: rgba(100, 181, 246, 0.1);
padding: 2px 8px;
border-radius: 4px;
margin-left: 8px;
}
.split-messages-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 12px;
}
.split-message-card {
background: var(--input-bg);
border: 1px solid var(--input-border);
border-radius: 8px;
padding: 12px;
transition: all 0.2s ease;
position: relative;
}
.split-message-card:hover {
border-color: var(--accent-color);
box-shadow: 0 2px 8px rgba(100, 181, 246, 0.1);
transform: translateY(-2px);
}
.split-message-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
padding-bottom: 8px;
border-bottom: 1px solid var(--input-border);
}
.message-number {
font-size: 0.85rem;
font-weight: 600;
color: var(--text-muted);
font-family: 'Fira Code', monospace;
}
.copy-button-small {
padding: 4px 8px;
background: var(--button-bg);
border: 1px solid var(--input-border);
border-radius: 4px;
color: var(--accent-color);
cursor: pointer;
transition: all 0.2s ease;
font-size: 0.9rem;
}
.copy-button-small:hover {
background: var(--accent-color);
color: var(--main-bg-color);
transform: scale(1.05);
}
.copy-button-small i {
font-size: 0.85rem;
}
.split-message-content {
font-family: 'Fira Code', monospace;
font-size: 0.95rem;
color: var(--text-color);
word-break: break-all;
line-height: 1.5;
min-height: 40px;
padding: 8px;
background: rgba(0, 0, 0, 0.2);
border-radius: 4px;
}
/* Ensure consistent spacing with other tabs */
.tab-content .transform-layout .transform-section {
margin-bottom: 16px;
}
.tab-content .transform-layout .transform-section:last-child {
margin-bottom: 0;
}
/* Options grid styling (used across multiple tabs) */
.options-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 12px;
margin: 16px 0;
}
/* Options grid label overrides */
.options-grid label.switch {
flex-direction: row;
gap: 8px;
}
.label-with-tooltip {
display: inline-flex;
align-items: center;
gap: 6px;
}
.tooltip-icon {
color: var(--text-muted);
font-size: 0.85rem;
cursor: pointer;
opacity: 0.7;
transition: opacity 0.2s ease, color 0.2s ease;
position: relative;
display: inline-block;
margin-left: 4px;
z-index: 999;
}
.tooltip-icon:hover {
opacity: 1;
color: var(--accent-color);
z-index: 999;
}
.tooltip-icon:active {
transform: scale(0.95);
}
/* Custom click-based tooltip */
.custom-tooltip {
position: fixed;
padding: 8px 12px;
background: rgba(20, 20, 25, 0.98);
color: #fff;
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
font-size: 0.8rem;
line-height: 1.4;
border-radius: 6px;
z-index: 10000;
opacity: 0;
visibility: hidden;
pointer-events: none;
max-width: 280px;
min-width: 200px;
text-align: left;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(100, 181, 246, 0.2);
transition: opacity 0.2s ease, visibility 0.2s ease;
word-wrap: break-word;
white-space: normal;
}
.custom-tooltip::before {
content: '';
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
border: 6px solid transparent;
border-top-color: rgba(20, 20, 25, 0.98);
filter: drop-shadow(0 2px 2px rgba(0, 0, 0, 0.2));
}
.custom-tooltip.active {
opacity: 1;
visibility: visible;
pointer-events: auto;
}
/* Position tooltip icons properly */
.tooltip-icon[data-tooltip] {
position: relative;
}
/* Options grid inputs inherit from standard form styles */
.options-grid .switch {
margin-bottom: 0;
margin-left: 6px;
margin-top: auto;
padding: 6px 8px;
flex-direction: row;
align-items: center;
gap: 8px;
height: fit-content;
min-height: 38px;
max-height: 38px;
align-self: flex-end;
}
/* Transform chain styling */
.transform-chain {
display: flex;
flex-direction: column;
gap: 12px;
}
.transform-chain-inline {
display: flex;
align-items: center;
gap: 12px;
flex-wrap: wrap;
}
.transform-chain-item {
display: flex;
align-items: center;
gap: 8px;
position: relative;
}
/* Transform chain select inherits .transform-select sizing */
.transform-chain-item .transform-select {
min-width: min(200px, 100%);
}
.transform-arrow {
color: var(--accent-color);
font-size: 1rem;
opacity: 0.7;
margin: 0 4px;
}
.remove-transform-inline-btn {
padding: 4px 6px;
background: transparent;
border: none;
border-radius: 4px;
color: var(--text-muted);
cursor: pointer;
transition: all 0.2s ease;
font-size: 0.85rem;
opacity: 0.6;
}
.remove-transform-inline-btn:hover {
background: rgba(211, 47, 47, 0.1);
color: #d32f2f;
opacity: 1;
}
.add-transform-inline-btn {
padding: 8px 12px;
background: var(--button-bg);
border: 1px solid var(--input-border);
border-radius: 4px;
color: var(--accent-color);
cursor: pointer;
transition: all 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
min-width: 40px;
height: 38px;
}
.add-transform-inline-btn:hover {
background: var(--button-hover-bg);
border-color: var(--accent-color);
transform: translateY(-1px);
}
.add-transform-inline-btn i {
font-size: 0.9rem;
}
.splitter-copy-option {
margin-left: 0;
}
/* Universal Decoder - Alternatives Section */
.alternatives-section {
margin-top: 1rem;
padding: 1rem;
background: var(--input-bg);
border: 1px solid var(--border-color);
border-radius: 8px;
}
.alternatives-header {
font-weight: 600;
margin-bottom: 0.75rem;
color: var(--text-color);
display: flex;
align-items: center;
gap: 0.5rem;
}
.alternatives-list {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.alternative-item {
padding: 0.75rem;
background: var(--bg-color);
border: 1px solid var(--border-color);
border-radius: 6px;
}
.alternative-method {
font-weight: 600;
color: var(--accent-color);
margin-bottom: 0.25rem;
font-size: 0.9rem;
}
.alternative-preview {
color: var(--text-secondary);
font-size: 0.85rem;
font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.input-header, .output-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.5rem;
}
.input-header label, .output-header label {
font-weight: 500;
color: var(--text-color);
}
/* ========================================
MEDIA QUERIES
All responsive styles consolidated at end of file
======================================== */
/* Desktop: 5 columns (only applies above 768px) */
@media (min-width: 769px) {
.transform-buttons .transform-button-group {
flex: 0 0 calc((100% - 32px) / 5); /* 5 columns: account for 4 gaps of 8px */
min-width: 0;
}
.translate-lang-grid-inline .translate-lang-btn {
flex: 0 0 calc((100% - 32px) / 5);
min-width: 0;
}
}
/* Tablets and below (768px) */
@media (max-width: 768px) {
.section-header-card {
flex-direction: column;
gap: 10px;
}
.section-header-card-title {
width: 100%;
}
.section-header-card-description {
padding-top: 0;
}
.emoji-grid {
grid-template-columns: repeat(auto-fill, minmax(50px, 1fr));
}
.emoji-button {
min-width: 50px;
height: 50px;
}
.tab-buttons {
display: none;
}
.tab-tool-select {
display: block;
}
.section-title {
flex-direction: column;
align-items: flex-start;
gap: var(--spacing-sm);
}
.section-title h3 {
width: 100%;
}
.section-title small {
width: 100%;
text-align: left;
}
.transform-chain-item .transform-select {
min-width: 100%; /* Full width on smaller screens */
}
.split-messages-grid {
grid-template-columns: 1fr;
}
.encapsulation-presets {
gap: var(--spacing-xs);
}
.preset-btn {
padding: 5px 10px;
font-size: 0.85rem;
}
.options-grid {
grid-template-columns: 1fr;
}
.transform-chain-inline {
flex-direction: column;
align-items: flex-start;
}
.transform-arrow {
transform: rotate(90deg);
margin: 4px 0;
}
.tool-toolbar {
flex-direction: column;
align-items: stretch;
gap: var(--spacing-sm);
}
.tool-toolbar button,
.tool-toolbar .switch {
width: 100%;
}
/* Transform buttons - 2 columns on tablets and below */
.transform-buttons {
gap: 8px;
}
.transform-buttons .transform-button-group {
flex: 0 0 calc(50% - 4px) !important; /* 2 columns: simpler calculation */
min-width: 0;
max-width: calc(50% - 4px);
}
/* Translation (AI) language tiles: 2 columns on phones/tablets (grid is more reliable than flex here) */
.translate-lang-grid.translate-lang-grid-inline {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
}
.translate-lang-grid-inline .translate-lang-btn {
flex: none;
width: 100%;
min-width: 0;
max-width: none;
white-space: normal;
}
.app-sidebar {
width: 100%;
max-width: 100%;
}
.unicode-options-panel {
z-index: 300;
}
}
/* Medium screens (900px) */
@media (max-width: 900px) {
.steg-split-layout {
grid-template-columns: 1fr;
}
.steg-advanced-sidebar {
position: relative;
top: 0;
}
}
@media (max-width: 576px) {
.button-group {
flex-direction: column;
align-items: stretch;
}
.button-group .btn {
width: 100%;
}
body {
padding: 0;
}
.container {
padding: var(--spacing-sm);
border-radius: 4px;
}
header {
flex-direction: column;
gap: var(--spacing-sm);
padding: var(--spacing-sm);
margin-bottom: 20px;
}
.logo h1 {
font-size: 1.2rem;
padding: var(--spacing-xs);
}
.actions {
width: 100%;
justify-content: center;
}
/* Transform buttons flex more compact - 2 columns on mobile */
.transform-buttons {
gap: var(--spacing-xs);
}
.transform-buttons .transform-button-group {
flex: 0 0 calc(50% - 2px) !important; /* 2 columns: simpler calculation */
min-width: 0;
max-width: calc(50% - 2px);
}
/* Translation tiles: same 2-col grid as 768px (inherit from above) */
/* Options grid single column on very small screens */
.options-grid {
grid-template-columns: 1fr;
gap: 10px;
margin: var(--spacing-sm) 0;
}
/* Hacker controls single column */
.hacker-controls {
grid-template-columns: 1fr;
gap: var(--spacing-sm);
}
.unicode-panel-header .close-button {
min-width: 48px;
min-height: 48px;
padding: 12px;
font-size: 1.4rem;
z-index: 302;
position: relative;
pointer-events: auto;
touch-action: manipulation;
background: var(--button-bg);
border: 1px solid var(--input-border);
-webkit-tap-highlight-color: rgba(0, 0, 0, 0.1);
}
.unicode-panel-header .close-button:active {
background: var(--button-active-bg);
transform: scale(0.9);
}
/* Emoji grid more compact */
.emoji-library .emoji-grid,
#emoji-grid-container .emoji-grid,
.emoji-grid-container .emoji-grid,
.emoji-grid {
grid-template-columns: repeat(auto-fill, minmax(38px, 1fr));
grid-auto-rows: 38px;
gap: var(--spacing-xs);
padding: var(--spacing-sm);
}
.emoji-button {
font-size: 1.3rem;
}
/* Emoji category tabs smaller and flexible */
.emoji-category-tab {
padding: 5px var(--spacing-sm);
font-size: 0.75rem;
min-width: auto; /* Remove fixed width */
flex: 1 1 auto; /* Allow flexible sizing */
}
/* Output heading smaller */
.output-heading h4 {
font-size: 0.9rem;
}
.output-heading h4 small {
font-size: 0.7rem;
padding: 2px var(--spacing-xs);
}
/* Tokenizer tiles more compact */
.token-tiles {
gap: var(--spacing-xs);
}
.token-chip {
padding: var(--spacing-xs) var(--spacing-xs);
font-size: 0.85rem;
}
/* Transform button preview text */
.transform-preview {
font-size: 0.7rem;
max-width: 100%;
}
/* Category section padding */
.transform-category-section {
padding: var(--spacing-sm);
}
.category-title {
font-size: 1rem;
padding-left: var(--spacing-xs);
}
/* Tokenade carrier options single column */
.tokenade-carrier-options {
grid-template-columns: 1fr;
}
/* Carrier quick grid emojis smaller */
.carrier-quick-grid .emoji-grid {
grid-template-columns: repeat(auto-fill, minmax(28px, 1fr));
grid-auto-rows: 28px;
gap: 3px;
}
.carrier-quick-grid .emoji-button {
min-width: 28px;
height: 28px;
font-size: 1rem;
}
/* Additional mobile-specific rules */
/* Smaller inputs and selects on very small screens */
input[type="number"],
input[type="text"],
input[type="email"],
input[type="password"],
select {
padding: var(--spacing-xs) var(--spacing-sm);
font-size: 14px;
}
/* Compact section headers */
.section-header h3 {
font-size: 1rem;
}
.section-header h3 small {
font-size: 0.65em;
padding: 2px var(--spacing-xs);
}
/* Smaller textareas */
textarea {
padding: 10px;
font-size: 13px;
min-height: 80px;
}
/* Encapsulation presets wrap better */
.encapsulation-presets {
gap: var(--spacing-xs);
}
.preset-btn {
padding: 5px var(--spacing-sm);
font-size: 0.8rem;
}
/* Transform section padding */
.transform-section {
padding: var(--spacing-sm);
}
.input-section,
.output-section,
.decode-section {
padding: var(--spacing-sm);
}
/* Token bomb controls more compact */
.token-bomb-section {
padding: var(--spacing-sm);
}
.tokenade-presets .transform-button {
padding: var(--spacing-xs) var(--spacing-xs);
font-size: 0.75rem;
}
/* Smaller segmented buttons */
.segmented button {
padding: 5px var(--spacing-sm);
font-size: 0.85rem;
}
/* Legend items wrap better */
.transform-category-legend {
gap: var(--spacing-xs);
}
.legend-item {
font-size: 0.75rem;
padding: 3px var(--spacing-xs);
}
/* Transform chain items stack vertically */
.transform-chain-item .transform-select {
min-width: 100%;
width: 100%;
}
/* Split messages grid single column */
.split-messages-grid {
grid-template-columns: 1fr;
gap: 10px;
}
/* Switch controls full width */
.switch {
width: 100%;
justify-content: space-between;
}
/* Randomizer section adjustments */
.randomizer-special {
padding: var(--spacing-md);
}
.randomizer-info {
padding: var(--spacing-sm);
}
.randomizer-info ul {
margin-left: var(--spacing-md);
}
}
/* Custom Spelling Alphabet tool */
.spelling-alphabet-layout .sa-empty-state {
padding: var(--spacing-md);
border: 1px dashed var(--input-border);
border-radius: 8px;
color: var(--text-muted);
}
.sa-saved-list {
display: grid;
gap: var(--spacing-md);
}
.sa-saved-card {
display: flex;
flex-wrap: wrap;
gap: var(--spacing-md);
justify-content: space-between;
align-items: flex-start;
padding: var(--spacing-md);
border: 1px solid var(--input-border);
border-radius: 8px;
background: var(--secondary-bg);
}
.sa-saved-card h4 {
margin: 0 0 var(--spacing-sm);
color: var(--accent-color);
}
.sa-saved-preview,
.sa-saved-card p {
margin: 0 0 var(--spacing-xs);
color: var(--text-muted);
}
.sa-saved-card-actions {
display: flex;
gap: var(--spacing-sm);
flex-wrap: wrap;
}
.sa-delete-btn {
color: #ef5350;
}
.sa-meta-grid {
margin-bottom: var(--spacing-md);
}
.sa-generate-row {
margin-bottom: var(--spacing-md);
}
.sa-hint {
margin-top: var(--spacing-sm);
color: var(--text-muted);
font-size: 0.95rem;
}
.sa-error {
margin-bottom: var(--spacing-md);
padding: var(--spacing-sm) var(--spacing-md);
border-radius: 6px;
border: 1px solid #ef5350;
background: rgba(239, 83, 80, 0.12);
color: #ffabab;
}
.sa-progress {
margin-bottom: var(--spacing-md);
color: var(--text-muted);
}
.sa-letter-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
gap: var(--spacing-sm);
}
.sa-letter-field {
display: flex;
flex-direction: column;
gap: 4px;
}
.sa-letter-label {
font-weight: 700;
color: var(--custom-spelling-color);
}
.sa-letter-field input {
text-transform: uppercase;
}
.sa-live-preview {
margin-top: var(--spacing-md);
padding: var(--spacing-md);
border-radius: 8px;
background: rgba(var(--custom-spelling-color-rgb), 0.08);
border: 1px solid rgba(var(--custom-spelling-color-rgb), 0.25);
}
/* Codes tool (QR + barcodes) */
.codes-layout .codes-mode-tabs {
display: flex;
gap: var(--spacing-sm);
margin-bottom: var(--spacing-md);
}
.codes-mode-btn {
flex: 1;
max-width: 220px;
padding: 10px 16px;
border: 1px solid var(--border-color);
border-radius: 8px;
background: var(--bg-secondary);
color: var(--text-color);
cursor: pointer;
font-size: 0.95rem;
transition: border-color 0.15s, background 0.15s;
}
.codes-mode-btn:hover {
border-color: var(--accent-color);
}
.codes-mode-btn.active {
border-color: var(--accent-color);
background: rgba(var(--accent-color-rgb, 99, 102, 241), 0.12);
font-weight: 600;
}
.codes-options-grid {
margin-bottom: var(--spacing-md);
}
.codes-checkbox-label {
display: flex;
align-items: center;
gap: 8px;
align-self: end;
}
.codes-error {
margin: var(--spacing-sm) 0;
padding: var(--spacing-sm) var(--spacing-md);
border-radius: 8px;
background: rgba(220, 53, 69, 0.12);
border: 1px solid rgba(220, 53, 69, 0.35);
color: #dc3545;
}
.codes-output-card {
margin-top: var(--spacing-md);
padding: var(--spacing-md);
border: 1px solid var(--border-color);
border-radius: 12px;
background: var(--bg-secondary);
}
.codes-preview-wrap {
display: flex;
justify-content: center;
align-items: center;
padding: var(--spacing-md);
background: #fff;
border-radius: 8px;
margin-bottom: var(--spacing-md);
}
.codes-preview-image {
max-width: 100%;
height: auto;
}
.codes-upload-zone {
margin-bottom: var(--spacing-md);
}
.codes-upload-label {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: var(--spacing-sm);
padding: var(--spacing-lg);
border: 2px dashed var(--border-color);
border-radius: 12px;
cursor: pointer;
text-align: center;
transition: border-color 0.15s, background 0.15s;
}
.codes-upload-label:hover {
border-color: var(--accent-color);
background: rgba(var(--accent-color-rgb, 99, 102, 241), 0.06);
}
.codes-upload-label input[type="file"] {
display: none;
}
.codes-upload-label i {
font-size: 2rem;
color: var(--accent-color);
}
.codes-hint {
margin-top: var(--spacing-sm);
color: var(--text-muted);
font-size: 0.9rem;
}
.codes-loading {
padding: var(--spacing-md);
color: var(--text-muted);
}
.codes-decode-preview {
margin: var(--spacing-md) 0;
text-align: center;
}
.codes-decode-preview img {
max-width: 100%;
max-height: 280px;
border-radius: 8px;
border: 1px solid var(--border-color);
}
.codes-decode-result {
margin-top: var(--spacing-md);
padding: var(--spacing-md);
border: 1px solid var(--border-color);
border-radius: 12px;
background: var(--bg-secondary);
}
.codes-decode-meta {
margin-bottom: var(--spacing-sm);
color: var(--text-muted);
font-size: 0.9rem;
}