2026-09-24 13:05:20 -04:00
/* Self-hosted fonts for consistent rendering across machines */
@ font-face {
font-family : 'SBL Hebrew' ;
src : url ( 'fonts/SBLHebrew-Regular.woff2' ) format ( 'woff2' );
font-weight : 400 ;
font-style : normal ;
font-display : swap ;
}
@ font-face {
font-family : 'SBL Greek' ;
src : url ( 'fonts/SBLGreek-Regular.woff2' ) format ( 'woff2' );
font-weight : 400 ;
font-style : normal ;
font-display : swap ;
}
@ font-face {
font-family : 'Paladins' ;
src : url ( 'fonts/paladins.ttf' ) format ( 'truetype' );
font-weight : 400 ;
font-style : normal ;
font-display : swap ;
}
@ font-face {
font-family : 'Ethnocentric' ;
src : url ( 'fonts/Ethnocentric-Regular.otf' ) format ( 'opentype' );
font-weight : 400 ;
font-style : normal ;
font-display : swap ;
}
/* Word info popup sizing (select tool) */
. word-info-popup {
/* Cards are centred on screen, so grow from the top CENTRE — growing from the left edge made a
centred card look like it was sliding in from the side. */
transform-origin : top center ;
font-size : 2.0 em ; /* scale text inside popup */
}
. word-info-popup . word-info-header {
padding : 20 px 24 px ; /* larger header */
}
. word-info-popup . word-info-title {
font-size : 1.45 em ; /* relative to popup font-size */
}
. word-info-popup . word-info-content {
padding : 20 px 24 px 28 px 24 px ; /* extra bottom padding to prevent cutoff */
}
. word-info-popup . word-info-section {
margin-bottom : 16 px ;
}
. word-info-popup . word-info-label {
font-size : 1.0 em ; /* match scaled base size */
}
. word-info-popup . word-info-value {
font-size : 1.05 em ; /* slightly larger for readability */
line-height : 1.6 ;
}
. word-info-popup . word-info-value strong ,
. word-info-popup . word-info-value em {
font-size : 1.05 em ;
}
. word-info-popup . word-info-close {
font-size : 1.3 em ;
}
. tool-rail-edge {
position : fixed ;
right : 0 ;
top : 0 ;
height : 1 px ; /* placeholder; JS positions it */
width : 1 px ;
pointer-events : none ;
}
/* Reset and Base Styles */
* {
margin : 0 ;
padding : 0 ;
box-sizing : border-box ;
-webkit- tap-highlight-color : transparent !important ;
-webkit- touch-callout : none !important ;
}
/* Global safe area at top to avoid bezel gesture region */
: root {
--safe-area-top : 24 px ;
--safe-area-left : 24 px ;
--safe-area-right : 24 px ;
}
/* Full-bleed slides mode: ignore left/right safe areas */
. slides-fullbleed # app {
/* Keep safe-area paddings so toolbar/tabs align exactly with Bible mode */
padding-left : var ( -- safe - area - left ) !important ;
padding-right : var ( -- safe - area - right ) !important ;
}
. slides-fullbleed . reading-area {
overflow : hidden !important ;
background : #000 !important ;
position : relative ;
}
. slides-fullbleed . bible-text {
padding : 0 !important ;
}
/* Hide the toolbar separator line in slides mode so the top edge stays pure black */
. slides-fullbleed . toolbar :: after {
display : none !important ;
}
/* Hide page count indicator in Slides tab */
. slides-fullbleed [ id ^= "notesCount" ] {
display : none !important ;
}
/* Prevent any slide canvas/image from bleeding into the top safe area */
. slides-fullbleed . reading-area . passage-text ,
. slides-fullbleed . reading-area canvas ,
. slides-fullbleed . reading-area img ,
. slides-fullbleed . reading-area > * {
position : relative ;
top : 0 ;
}
/* Override browser default text selection styling */
:: selection {
background : transparent !important ;
color : inherit !important ;
text-decoration : none !important ;
}
:: -moz-selection {
background : transparent !important ;
color : inherit !important ;
text-decoration : none !important ;
}
/* Allow text selection only in content areas */
. bible-text ,
input ,
textarea ,
select ,
[ contenteditable ] {
-webkit- user-select : text !important ;
-moz- user-select : text !important ;
-ms- user-select : text !important ;
user-select : text !important ;
}
/* Disable text selection for UI elements */
. tab ,
. new-tab-btn ,
. tool-icon ,
. toolbar-btn ,
. load-btn ,
button {
-webkit- user-select : none !important ;
-moz- user-select : none !important ;
-ms- user-select : none !important ;
user-select : none !important ;
-webkit- touch-callout : none !important ;
}
/* Allow text selection in reading areas */
. reading-area ,
. bible-text {
-webkit- user-select : text !important ;
-moz- user-select : text !important ;
-ms- user-select : text !important ;
user-select : text !important ;
}
body {
font-family : Georgia , 'Times New Roman' , Times , serif ;
background-color : #000000 ;
color : #e0e0e0 ;
overflow : hidden ;
overflow-x : hidden ; /* prevent horizontal page scroll when swiping tool rail */
min-height : 100 vh ;
width : 100 vw ;
background : #000000 !important ;
color-scheme : dark ; /* hint iOS/Safari to use dark UI controls */
}
# app {
display : flex ;
flex-direction : column ;
min-height : 100 vh ;
width : 100 vw ;
padding-left : var ( -- safe - area - left );
padding-right : var ( -- safe - area - right );
}
/* Top spacer to provide non-interactive safe area */
# app :: before {
content : '' ;
display : block ;
height : var ( -- safe - area - top );
background : #000000 ; /* match toolbar black */
}
/* In slides mode, reduce the top spacer to the thinnest mask only */
. slides-fullbleed # app :: before {
/* Keep the same spacer height as Bible mode so tabs align vertically */
height : var ( -- safe - area - top );
}
/* Translation Selector */
. translation-select {
min-width : 80 px ;
}
/* Unified header band height across views */
: root { --header-band-height : 98 px ; }
/* Toolbar Styles */
. toolbar {
display : flex ;
align-items : center ;
justify-content : space-between ;
padding : 6 px 20 px ; /* tighter to align vertically with tab height */
background : #000000 !important ; /* set header to pure black */
border-bottom : none ; /* replaced by full-width separator */
position : relative ;
z-index : 11000 ; /* ensure toolbars and color popups render above chapter header */
touch-action : none ; /* prevent single-finger page pan */
overflow : visible ; /* allow elements to render outside toolbar height */
will-change : transform ; /* keep composited to avoid micro-shifts */
transform : translateZ ( 0 );
overscroll-behavior : none ; /* prevent scroll chaining over toolbar */
}
/* Full-width separator that ignores side safe areas */
. toolbar :: after {
content : '' ;
position : absolute ;
left : calc ( var ( -- safe - area - left ) * -1 );
right : calc ( var ( -- safe - area - right ) * -1 );
bottom : 0 ;
height : 1 px ;
background : #404040 ;
pointer-events : none ;
}
. toolbar-left , . toolbar-right {
display : flex ;
align-items : center ;
gap : 15 px ;
}
/* Slide-out tool rail on the right */
. toolbar-right {
position : relative ;
}
/* Compact tool indicator near tool menu */
. tool-indicator {
display : inline-flex ;
align-items : center ;
justify-content : center ;
gap : 0 ;
background : rgba ( 42 , 42 , 42 , 0.96 );
border : 1 px solid #404040 ;
border-radius : 50 % ;
padding : 0 ; /* no side padding so icon centers perfectly */
color : #e0e0e0 ;
font-size : 0 ; /* hide any text labels; icon size set on child */
line-height : 1 ;
height : 28 px ;
width : 28 px ; /* make it a perfect circle */
}
. tool-indicator i {
font-size : 14 px ;
}
. tool-indicator . hidden {
display : none !important ;
}
. tool-rail {
position : fixed ; /* overlay so it never shifts layout */
right : var ( -- safe - area - right );
top : 0 ; /* JS will position precisely */
/* Keep the rail fully off-screen when closed so only the handle/arrow shows */
transform : translateX ( calc ( 100 % + 48 px )); /* push completely off-screen */
display : flex ;
align-items : center ;
gap : 12 px ;
background : rgba ( 42 , 42 , 42 , 0.96 );
border : 1 px solid #404040 ;
border-right : none ;
padding : 0 12 px 0 16 px ; /* vertical padding removed; height will match toolbar */
border-top-left-radius : 12 px ;
border-bottom-left-radius : 12 px ;
transition : transform 0.25 s ease , opacity 0.25 s ease ;
opacity : 0 ; /* hidden when closed */
pointer-events : none ; /* non-interactive when closed */
will-change : transform ;
z-index : 11005 ; /* above toolbar siblings and chapter header */
}
. tool-rail . open {
transform : translateX ( 0 ); /* slide in from right */
opacity : 0.95 ; /* visible only when open */
pointer-events : auto ; /* interactive only when open */
}
/* When open, extend the top and bottom border lines across the right safe area */
. tool-rail . open :: before ,
. tool-rail . open :: after {
content : '' ;
position : absolute ;
right : calc ( var ( -- safe - area - right ) * -1 );
width : var ( -- safe - area - right );
height : 1 px ;
background : #404040 ; /* match rail border color */
pointer-events : none ;
}
. tool-rail . open :: before { top : -1 px ; }
. tool-rail . open :: after { bottom : -1 px ; }
. tool-rail . tool-icon {
background : #2a2a2a ;
border : 2 px solid #404040 ;
border-radius : 10 px ;
padding : 4 px 8 px ; /* smaller to fit inside toolbar height */
font-size : 16 px ; /* reduce icon size slightly */
line-height : 1 ; /* avoid extra vertical expansion */
min-height : 0 ;
}
/* Removed old arrow handle; tool menu opens from the compact indicator */
/* Dropdown Styles */
. dropdown {
position : relative ;
display : inline-block ;
}
. dropdown-btn {
background : #2a2a2a ;
border : 2 px solid #404040 ;
border-radius : 8 px ;
padding : 12 px 16 px ;
font-size : 16 px ;
font-weight : 500 ;
color : #e0e0e0 ;
cursor : pointer ;
min-width : 80 px ;
display : flex ;
align-items : center ;
justify-content : space-between ;
transition : all 0.2 s ease ;
box-shadow : 0 2 px 4 px rgba ( 0 , 0 , 0 , 0.3 );
}
. dropdown-btn : hover {
border-color : #4a9eff ;
box-shadow : 0 4 px 8 px rgba ( 74 , 158 , 255 , 0.3 );
}
. dropdown-btn : active {
transform : translateY ( 1 px );
}
. dropdown-arrow {
font-size : 10 px ;
margin-left : 8 px ;
transition : transform 0.2 s ease ;
color : #e0e0e0 ;
}
. dropdown . active . dropdown-arrow {
transform : rotate ( 180 deg );
}
. dropdown-content {
display : none ;
position : absolute ;
top : 100 % ;
left : 0 ;
background : #2a2a2a ;
border : 2 px solid #404040 ;
border-radius : 8 px ;
box-shadow : 0 8 px 25 px rgba ( 0 , 0 , 0 , 0.4 );
z-index : 1001 ;
min-width : 180 px ;
max-height : 300 px ;
overflow-y : auto ;
margin-top : 5 px ;
}
. dropdown . active . dropdown-content {
display : block ;
}
. dropdown-item {
padding : 12 px 16 px ;
font-size : 14 px ;
cursor : pointer ;
transition : background-color 0.2 s ease ;
border-bottom : 1 px solid #404040 ;
color : #e0e0e0 ;
display : flex ;
align-items : center ;
gap : 10 px ;
}
. dropdown-item : last-child {
border-bottom : none ;
}
. dropdown-item : hover {
background-color : #404040 ;
}
. dropdown-item : active {
background-color : #505050 ;
}
. dropdown-item i {
width : 16 px ;
text-align : center ;
}
/* Color Dropdown */
. color-item {
width : 28 px ;
height : 28 px ;
border-radius : 50 % ;
border : 2 px solid transparent ;
cursor : pointer ;
transition : border-color 0.2 s , transform 0.2 s ;
display : inline-block ;
}
. color-item : hover , . color-item . selected {
border-color : #fff ;
transform : scale ( 1.1 );
}
# colorDropdown {
display : flex ;
flex-direction : row ;
gap : 8 px ;
padding : 10 px 12 px ;
min-width : 0 ;
justify-content : center ;
background : #232323 ;
}
/* Opacity Dropdown */
. opacity-item {
padding : 10 px 16 px ;
font-size : 14 px ;
cursor : pointer ;
transition : background-color 0.2 s ease ;
border-bottom : 1 px solid #404040 ;
color : #e0e0e0 ;
}
. opacity-item : last-child {
border-bottom : none ;
}
. opacity-item : hover {
background-color : #404040 ;
}
/* Search Box */
. search-box {
padding : 12 px 16 px ;
border-bottom : 1 px solid #404040 ;
}
. search-box input {
width : 100 % ;
padding : 8 px 12 px ;
border : 2 px solid #404040 ;
border-radius : 6 px ;
font-size : 14 px ;
outline : none ;
transition : border-color 0.2 s ease ;
background : #2a2a2a ;
color : #e0e0e0 ;
}
. search-box input : focus {
border-color : #4a9eff ;
}
. search-box input :: placeholder {
color : #888 ;
}
/* Chapter List */
. chapter-list {
max-height : 250 px ;
overflow-y : auto ;
}
/* Toolbar Buttons */
. toolbar-btn {
background : #2a2a2a !important ;
border : 2 px solid #404040 ;
border-radius : 8 px ;
padding : 6 px 10 px ; /* smaller to match tab height */
font-size : 14 px ;
font-weight : 500 ;
color : #e0e0e0 !important ;
cursor : pointer ;
transition : all 0.2 s ease ;
box-shadow : 0 2 px 4 px rgba ( 0 , 0 , 0 , 0.3 );
min-width : 42 px ;
display : flex ;
align-items : center ;
justify-content : center ;
}
. toolbar-btn : hover {
border-color : #4a9eff ;
box-shadow : 0 4 px 8 px rgba ( 74 , 158 , 255 , 0.3 );
}
. toolbar-btn : active {
background : #404040 !important ;
transform : translateY ( 1 px );
}
. toolbar-btn i {
font-size : 14 px ;
}
/* Tool Button Specific */
. tool-btn {
min-width : 60 px ;
}
/* Reading Area */
. reading-area {
flex : 1 ;
position : relative ;
overflow-y : auto ;
overflow-x : hidden ;
background : #000000 !important ; /* force dark on iPad */
height : calc ( 100 vh - var ( -- safe - area - top ));
min-height : 0 ;
}
. reading-area :: -webkit-scrollbar {
display : none ; /* Chrome/Safari/Webkit */
}
. bible-text , . bible-text * {
-webkit- user-select : none !important ;
-moz- user-select : none !important ;
-ms- user-select : none !important ;
user-select : none !important ;
}
. bible-text {
position : relative ;
z-index : 1 ;
padding : 30 px ;
line-height : 1.8 ;
/* Base reading size; overridable from Settings > Bible Reading via --bible-font-size (defaults to 60px, unchanged) */
font-size : var ( -- bible - font - size , 60 px );
color : #e0e0e0 ;
background : #1a1a1a ;
font-weight : 400 ;
letter-spacing : 0.01 em ;
}
. bible-text :: -webkit-scrollbar {
width : 12 px ;
}
. bible-text :: -webkit-scrollbar-track {
background : #2a2a2a ;
border-radius : 6 px ;
}
. bible-text :: -webkit-scrollbar-thumb {
background : #404040 ;
border-radius : 6 px ;
}
. bible-text :: -webkit-scrollbar-thumb : hover {
background : #505050 ;
}
/* Prayer Tab Styles */
. prayer-text {
-webkit- user-select : text !important ;
-moz- user-select : text !important ;
-ms- user-select : text !important ;
user-select : text !important ;
outline : none ;
white-space : pre-wrap ;
word-wrap : break-word ;
/* Prevent drag behavior that interferes with text selection */
-webkit- user-drag : none !important ;
-khtml- user-drag : none !important ;
-moz- user-drag : none !important ;
-o- user-drag : none !important ;
user-drag : none !important ;
/* Ensure proper cursor for text selection */
cursor : text !important ;
/* Disable drag and drop */
draggable : false !important ;
}
. prayer-text : focus {
outline : none ;
}
/* Make text selection visible in prayer tab */
. prayer-text :: selection {
background : #4a9eff !important ;
color : #ffffff !important ;
text-shadow : none !important ;
}
. prayer-text :: -moz-selection {
background : #4a9eff !important ;
color : #ffffff !important ;
text-shadow : none !important ;
}
. prayer-text * :: selection {
background : #4a9eff !important ;
color : #ffffff !important ;
text-shadow : none !important ;
}
. prayer-text * :: -moz-selection {
background : #4a9eff !important ;
color : #ffffff !important ;
text-shadow : none !important ;
}
/* Ensure prayer text area allows proper text selection */
. prayer-reading-area {
-webkit- user-select : text !important ;
-moz- user-select : text !important ;
-ms- user-select : text !important ;
user-select : text !important ;
cursor : text !important ;
}
. prayer-reading-area * {
-webkit- user-select : text !important ;
-moz- user-select : text !important ;
-ms- user-select : text !important ;
user-select : text !important ;
}
/* Prayer text formatting styles */
. prayer-text b ,
. prayer-text strong {
font-weight : 700 ;
}
. prayer-text i ,
. prayer-text em {
font-style : italic ;
}
. prayer-text mark {
background-color : #ffff00 ;
color : #000 ;
padding : 2 px 0 ;
}
/* Support for highlighted text via backgroundColor */
. prayer-text [ style *= "background-color: rgb(255, 255, 0)" ],
. prayer-text [ style *= "background-color:#ffff00" ],
. prayer-text [ style *= "background-color: yellow" ] {
background-color : #ffff00 !important ;
color : #000 ;
padding : 2 px 0 ;
}
/* Prevent drawing on prayer tab - disable pointer events for annotation canvases */
[ id ^= "readingArea" ] : has ( . prayer-text ) {
pointer-events : auto !important ;
}
[ id ^= "readingArea" ] : has ( . prayer-text ) canvas {
pointer-events : none !important ;
display : none !important ;
}
/* Prayer tab reading area - no drawing */
. prayer-text ~ canvas ,
# readingArea [ id *= "prayer" ] canvas {
pointer-events : none !important ;
display : none !important ;
}
/* Prayer Keyboard Styles */
. prayer-keyboard {
position : fixed ;
width : 760 px ;
max-width : 95 vw ;
background : #2a2a2a ;
border : 2 px solid #404040 ;
border-radius : 12 px ;
box-shadow : 0 8 px 32 px rgba ( 0 , 0 , 0 , 0.6 );
z-index : 20000 ;
user-select : none ;
touch-action : none ;
}
. prayer-keyboard-header {
display : flex ;
justify-content : space-between ;
align-items : center ;
padding : 12 px 16 px ;
background : #1a1a1a ;
border-bottom : 1 px solid #404040 ;
border-radius : 12 px 12 px 0 0 ;
cursor : move ;
gap : 12 px ;
}
. prayer-keyboard-title {
font-size : 16 px ;
font-weight : 500 ;
color : #e0e0e0 ;
flex-shrink : 0 ;
}
. prayer-format-toolbar {
display : flex ;
gap : 6 px ;
align-items : center ;
flex : 1 ;
justify-content : center ;
}
. prayer-format-btn {
background : #2a2a2a ;
border : 2 px solid #404040 ;
border-radius : 6 px ;
color : #e0e0e0 ;
font-size : 16 px ;
font-weight : 600 ;
padding : 6 px 12 px ;
min-width : 36 px ;
height : 32 px ;
cursor : pointer ;
transition : all 0.15 s ;
display : flex ;
align-items : center ;
justify-content : center ;
touch-action : manipulation ;
}
. prayer-format-btn : hover {
background : #333 ;
border-color : #555 ;
}
. prayer-format-btn : active {
transform : scale ( 0.95 );
}
. prayer-format-btn . active {
background : #4a9eff ;
border-color : #4a9eff ;
color : #fff ;
}
. prayer-format-btn b {
font-weight : 700 ;
}
. prayer-format-btn i {
font-style : italic ;
}
. prayer-format-btn svg {
display : block ;
width : 20 px ;
height : 20 px ;
stroke : currentColor ;
fill : none ;
}
. prayer-keyboard-close {
background : transparent ;
border : none ;
color : #e0e0e0 ;
font-size : 24 px ;
line-height : 1 ;
cursor : pointer ;
padding : 0 ;
width : 28 px ;
height : 28 px ;
display : flex ;
align-items : center ;
justify-content : center ;
border-radius : 4 px ;
transition : background 0.2 s ;
}
. prayer-keyboard-close : hover {
background : #404040 ;
}
. prayer-keyboard-body {
padding : 12 px ;
display : flex ;
flex-direction : column ;
gap : 8 px ;
}
. prayer-keyboard-row {
display : flex ;
gap : 6 px ;
justify-content : center ;
}
. prayer-key-btn {
background : #1a1a1a ;
border : 2 px solid #404040 ;
border-radius : 8 px ;
color : #e0e0e0 ;
font-size : 18 px ;
font-weight : 500 ;
padding : 12 px 16 px ;
min-width : 48 px ;
cursor : pointer ;
transition : all 0.15 s ;
font-family : Georgia , serif ;
touch-action : manipulation ;
}
. prayer-key-btn : active {
background : #4a9eff ;
border-color : #4a9eff ;
transform : scale ( 0.95 );
}
. prayer-key-space {
flex : 1 ;
min-width : 120 px ;
}
. prayer-key-backspace ,
. prayer-key-enter {
min-width : 80 px ;
font-size : 20 px ;
}
. prayer-key-shift ,
. prayer-key-tab {
min-width : 70 px ;
font-size : 16 px ;
}
. prayer-key-active {
background : #4a9eff !important ;
border-color : #4a9eff !important ;
color : #fff !important ;
}
/* Caps Lock state for Shift: distinct from momentary Shift so the user can
tell at a glance whether typing letters will stay capitalized. Gold tint
with a thicker border + inner ring works against the dark keyboard chrome. */
. prayer-key-shift . prayer-key-locked {
background : #2a2418 !important ;
border-color : #f0b400 !important ;
color : #ffd45a !important ;
box-shadow : inset 0 0 0 1 px rgba ( 240 , 180 , 0 , 0.55 );
}
. prayer-key-shift . prayer-key-locked . prayer-key-glyph {
color : #ffd45a ;
}
. prayer-key-glyph {
display : inline-block ;
font-size : 1.05 em ;
line-height : 1 ;
margin-right : 2 px ;
}
. bible-text :: after {
/* Leave a full-page buffer so the last verse can reach/past the top edge */
content : '' ;
display : block ;
width : 100 % ;
min-height : 200 px ;
height : 100 vh ;
pointer-events : none ;
}
@ supports ( height : 100dvh ) {
. bible-text :: after {
height : 100 dvh ;
}
}
. bible-text . verse . verse-number {
color : #ffffff ;
font-weight : 500 ;
margin-right : 4 px ;
margin-left : 4 px ;
}
/* Smaller verse numbers for ESV (match your target look) */
/* Smaller bracketed verse numbers for all translations (match your ESV screenshot) */
. reading-area . verse . verse-number {
font-size : 0.6 em ;
opacity : 0.75 ;
}
. reading-area . verse . verse-highlighted {
background : rgba ( 205 , 205 , 205 , 0.42 );
border-radius : 6 px ;
box-shadow : 0 0 0 1 px rgba ( 210 , 210 , 210 , 0.52 );
-webkit- box-decoration-break : clone ;
box-decoration-break : clone ;
}
. bible-text . verse . verse-bracket {
color : #ffffff ;
font-weight : 500 ;
}
. chapter-header {
background : #1a1a1a ;
padding : 0 ; /* fixed band height so bottom rule never jumps */
margin : 0 0 22 px 0 ; /* extra gap so first verse never touches bottom rule */
border-bottom : none ; /* replaced by full-width separator */
position : sticky ;
top : var ( -- safe - area - top );
/* Keep above any annotation canvas (z-index ~5000) */
z-index : 6001 ;
width : 100 % ;
display : none ; /* Hidden by default, shown via JavaScript */
touch-action : none ; /* block one-finger panning on passage header */
overscroll-behavior : none ; /* stop scroll chaining from header */
height : var ( -- header - band - height ) !important ; /* lock to selection header height */
min-height : var ( -- header - band - height ) !important ;
overflow : visible ; /* allow descenders to render fully */
}
. chapter-header :: after {
content : '' ;
position : absolute ;
left : calc ( var ( -- safe - area - left ) * -1 );
right : calc ( var ( -- safe - area - right ) * -1 );
bottom : 0 ; /* keep exactly aligned with selection bar rule */
height : 1 px ;
background : #404040 ;
pointer-events : none ;
z-index : 0 ;
}
. chapter-header-inner {
display : flex ;
align-items : center ;
justify-content : center ;
gap : 12 px ;
height : 100 % !important ; /* fill fixed header band */
}
. chapter-header-inner , . chapter-header-inner * {
touch-action : none ; /* ensure descendants don’ t initiate scroll/pan */
}
. chapter-header-inner . header-back-btn {
margin-left : 12 px ;
margin-top : 0 ; /* center vertically in header */
display : flex ;
align-items : center ;
justify-content : center ;
}
/* Translation dropdown in chapter header */
. translation-dropdown {
position : absolute ;
background : #2a2a2a ;
border : 1 px solid #3a3a3a ;
border-radius : 14 px ; /* 1.8x of 8px ≈ 14px */
padding : 11 px ; /* 1.8x of 6px ≈ 10.8 */
z-index : 1000 ;
box-shadow : 0 12 px 26 px rgba ( 0 , 0 , 0 , 0.4 );
font-size : 1.8 em ; /* scale contents by ~1.8x overall */
}
. translation-dropdown . translation-option {
display : block ;
padding : 14 px 22 px ; /* 1.8x of 8x12 */
background : transparent ;
border : none ;
color : #e0e0e0 ;
text-align : left ;
width : 100 % ;
border-radius : 10 px ; /* 1.8x of 6px ≈ 10px */
cursor : pointer ;
}
. translation-dropdown . translation-option : hover {
background : #3a3a3a ;
}
. translation-dropdown . translation-option . selected {
background : #4a9eff 33 ;
color : #bcdcff ;
}
. chapter-title {
font-size : 60 px ;
font-weight : 800 ;
color : #d2b48c ;
text-align : center ;
margin : 0 ;
padding : 0 ;
line-height : 1.16 ; /* keep descenders clear while matching rule position */
white-space : nowrap ; /* never wrap to two lines */
position : relative ;
z-index : 1 ; /* render above the rule */
}
/* Override inline positioning injected by JS to keep title truly centered */
. chapter-header . chapter-title {
position : static !important ;
left : auto !important ;
top : auto !important ;
transform : none !important ;
text-align : center ;
margin : 0 auto ;
}
/* Remove negative vertical offsets on header controls injected inline */
. chapter-header . header-back-btn ,
. chapter-header . chapter-nav-btns {
margin-top : 0 !important ;
}
/* In the new grid header, ensure the back button participates in flow (not absolute) */
. chapter-left-controls . header-back-btn [ data-action = "back-to-selector" ] {
position : static !important ;
top : auto !important ;
left : auto !important ;
transform : none !important ;
z-index : auto !important ;
}
/* Ensure the bible text starts right below the header */
. bible-text {
margin-top : 0 ;
padding : 30 px ;
}
/* Hide the selector container by default when a passage is loaded */
. selector-container {
transition : all 0.3 s ease ;
}
. content-wrapper {
position : relative ;
min-height : 100 % ;
}
. annotation-canvas {
position : absolute ;
top : 0 ;
left : 0 ;
width : 100 % ;
height : 100 % ;
z-index : 2 ;
pointer-events : none ;
background : transparent !important ;
cursor : crosshair ;
touch-action : pan-x pan-y ;
will-change : transform ;
}
. annotation-overlay-canvas {
position : absolute ;
top : 0 ;
left : 0 ;
width : 100 % ;
height : 100 % ;
z-index : 3 ;
pointer-events : none ;
background : transparent !important ;
will-change : transform ;
}
body . drawing ,
body . drawing * {
user-select : none !important ;
}
. drawing . bible-text {
user-select : none !important ;
}
/* Touch gesture feedback */
. reading-area . gesturing {
user-select : none ;
-webkit- user-select : none ;
-moz- user-select : none ;
-ms- user-select : none ;
}
/* Improved touch handling for mobile */
@ media ( max-width : 768px ) {
. toolbar {
padding : 12 px 20 px ;
min-height : 60 px ;
}
. dropdown-btn {
padding : 10 px 14 px ;
font-size : 14 px ;
min-width : 70 px ;
}
. bible-text {
padding : 20 px ;
font-size : 16 px ;
}
. toolbar-left , . toolbar-right {
gap : 12 px ;
}
. reading-area {
-webkit- overflow-scrolling : touch ;
overscroll-behavior : contain ;
}
. bible-text . zoomed {
font-size : 16 px ; /* Maintain readable size when zoomed */
}
}
/* High Contrast Mode */
@ media ( prefers-contrast : high ) {
. dropdown-btn {
border-width : 3 px ;
border-color : #ffffff ;
}
. dropdown-content {
border-width : 3 px ;
border-color : #ffffff ;
}
. bible-text {
color : #ffffff ;
}
. bible-text . verse . verse-number {
color : #111 !important ;
}
}
/* Focus States */
. dropdown-btn : focus ,
. toolbar-btn : focus ,
. search-box input : focus {
outline : 2 px solid #4a9eff ;
outline-offset : 2 px ;
}
/* Dropdown Scrollbar Styling */
. dropdown-content :: -webkit-scrollbar {
width : 8 px ;
}
. dropdown-content :: -webkit-scrollbar-track {
background : #2a2a2a ;
border-radius : 4 px ;
}
. dropdown-content :: -webkit-scrollbar-thumb {
background : #404040 ;
border-radius : 4 px ;
}
. dropdown-content :: -webkit-scrollbar-thumb : hover {
background : #505050 ;
}
. slider-group {
display : flex ;
align-items : center ;
gap : 8 px ;
margin-right : 16 px ;
}
. tool-slider {
display : flex ;
gap : 4 px ;
position : relative ;
}
. tool-icon {
background : none ;
border : none ;
color : #e0e0e0 ;
font-size : 18 px ; /* slightly smaller for tighter fit */
padding : 4 px 6 px ; /* smaller padding to prevent overflow */
border-radius : 6 px ;
cursor : pointer ;
transition : background 0.15 s , color 0.15 s ;
}
/* Pen tool icon color styling */
. tool-icon [ data-tool = "pen" ] {
color : var ( -- pen - color , #ffff00 ) !important ;
transition : none !important ;
}
. tool-icon [ data-tool = "pen" ] : hover ,
. tool-icon [ data-tool = "pen" ] : focus ,
. tool-icon [ data-tool = "pen" ] : active {
color : var ( -- pen - color , #ffff00 ) !important ;
background : none !important ;
border : none !important ;
}
. tool-icon . selected , . tool-icon : hover {
background : #333 ;
color : #4a9eff ;
}
/* Keep pen tool color when selected */
. tool-icon [ data-tool = "pen" ] . selected ,
. tool-icon [ data-tool = "pen" ] . selected : hover ,
. tool-icon [ data-tool = "pen" ] . selected : focus ,
. tool-icon [ data-tool = "pen" ] . selected : active {
background : #333 !important ;
border : 2 px solid var ( -- pen - color , #ffff00 ) !important ;
color : var ( -- pen - color , #ffff00 ) !important ;
box-shadow : 0 0 0 2 px var ( -- pen - color , #ffff00 ), 0 0 8 px rgba ( 255 , 255 , 0 , 0.5 ) !important ;
}
. tool-icon : active , . tool-icon : focus {
outline : none ;
}
. tool-icon : not ( . selected ) : active , . tool-icon : not ( . selected ) : focus {
background : none !important ;
/* Don't override color - let each tool keep its specific color */
}
. color-slider {
display : flex ;
gap : 6 px ;
}
. color-slider . color-item {
width : 22 px ;
height : 22 px ;
border-radius : 50 % ;
border : 2 px solid transparent ;
cursor : pointer ;
transition : border-color 0.2 s , transform 0.2 s ;
}
. color-slider . color-item . selected , . color-slider . color-item : hover {
border-color : #4a9eff ;
transform : scale ( 1.1 );
}
. opacity-slider {
width : 70 px ;
accent-color : #ffffff ;
margin-left : 4 px ;
-webkit- appearance : none ;
appearance : none ;
height : 6 px ;
border-radius : 3 px ;
background : #666666 ;
outline : none ;
position : relative ;
z-index : 1 ;
}
. opacity-slider :: -webkit-slider-thumb {
-webkit- appearance : none ;
appearance : none ;
width : 18 px ;
height : 18 px ;
border-radius : 50 % ;
background : var ( -- opacity - handle - color , #000000 );
border : 2 px solid #ffffff ;
cursor : pointer ;
box-shadow : 0 2 px 4 px rgba ( 0 , 0 , 0 , 0.3 );
position : relative ;
z-index : 10 ;
}
. opacity-slider :: -moz-range-thumb {
width : 18 px ;
height : 18 px ;
border-radius : 50 % ;
background : var ( -- opacity - handle - color , #000000 );
border : 2 px solid #ffffff ;
cursor : pointer ;
box-shadow : 0 2 px 4 px rgba ( 0 , 0 , 0 , 0.3 );
position : relative ;
z-index : 10 ;
}
. color-picker-wrapper {
position : relative ;
display : flex ;
align-items : center ;
justify-content : center ;
margin : 0 10 px ;
}
. color-picker-btn {
width : 32 px ;
height : 32 px ;
border-radius : 50 % ;
border : 2 px solid #555 ;
cursor : pointer ;
background-color : #ffff00 ;
transition : transform 0.1 s ease ;
}
. color-picker-btn : active {
transform : scale ( 0.9 );
}
. color-picker-popup {
display : none ;
position : absolute ;
bottom : 150 % ;
left : 50 % ;
transform : translateX ( -50 % );
background-color : transparent ;
border-radius : 50 % ;
padding : 10 px ;
z-index : 11014 ;
width : 160 px ;
height : 160 px ;
filter : drop-shadow ( 0 -4 px 8 px rgba ( 0 , 0 , 0 , 0.4 ));
}
. color-preview {
display : none ;
position : absolute ;
top : -65 px ;
left : 50 % ;
transform : translateX ( -50 % );
width : 55 px ;
height : 55 px ;
border-radius : 50 % ;
border : 4 px solid white ;
box-shadow : 0 0 12 px rgba ( 0 , 0 , 0 , 0.6 );
z-index : 11015 ;
}
. color-picker-popup . show . color-preview {
display : block ;
}
. color-picker-popup . show {
display : flex ;
align-items : center ;
justify-content : center ;
}
. color-wheel {
position : relative ;
width : 100 % ;
height : 100 % ;
border-radius : 50 % ;
background : conic-gradient ( red , yellow , lime , aqua , blue , magenta , red );
}
. color-handle {
position : absolute ;
width : 24 px ;
height : 24 px ;
border : 4 px solid white ;
border-radius : 50 % ;
transform : translate ( -50 % , -50 % );
pointer-events : none ;
box-shadow : 0 0 8 px rgba ( 0 , 0 , 0 , 0.5 );
}
. tool-icon . selected , . tool-icon : focus {
background : #333 ;
color : #4a9eff ;
outline : none ;
}
/* Browser Tabs */
. browser-tabs {
display : flex ;
align-items : center ;
background : none ;
border : none ;
border-radius : 0 ;
box-shadow : none ;
padding : 0 ;
position : relative ;
}
/* Reset app button (fixed at start of tab strip) */
. reset-app-btn {
display : flex ;
align-items : center ;
justify-content : center ;
width : 28 px ;
height : 28 px ;
min-width : 28 px ;
background : transparent ;
border : none ;
border-radius : 6 px ;
color : #9aa0a6 ; /* subtle light gray */
font-size : 18 px ;
cursor : pointer ;
margin-right : 8 px ;
transition : background-color 0.2 s , color 0.2 s ;
padding : 0 ;
line-height : 1 ;
touch-action : manipulation ;
}
. reset-app-btn : hover {
background-color : rgba ( 255 , 255 , 255 , 0.06 );
color : #cfcfcf ;
}
. reset-app-btn : active {
background-color : rgba ( 255 , 255 , 255 , 0.12 );
}
. reset-app-btn i { pointer-events : none ; }
. tab-bar {
display : flex ;
flex : 1 ;
overflow-x : auto ; /* allow horizontal panning when many tabs are open */
overflow-y : visible ; /* allow close button below tabs to be visible */
background : none ;
border : none ;
box-shadow : none ;
padding : 0 ;
position : relative ; /* ensure it can stack above slide mask */
z-index : 2002 ; /* higher than any slide mask */
will-change : transform ; /* prevent brief horizontal shift during heavy layout */
transform : translateZ ( 0 );
touch-action : none ; /* prevent one-finger scroll on tab strip */
overscroll-behavior : none ; /* prevent scroll leak from tab strip */
scrollbar-width : none ; /* Firefox: hide visual scrollbar */
}
. tab-bar :: -webkit-scrollbar {
width : 0 ;
height : 0 ;
}
. tab {
display : flex ;
align-items : center ;
gap : 4 px ;
padding : 4 px 10 px ;
background : transparent ;
border : none ;
cursor : pointer ;
max-width : 100 % ;
position : relative ;
border-radius : 8 px 8 px 0 0 ;
box-shadow : none ;
height : 38 px ;
transition : background 0.15 s ;
flex : 0 0 auto ; /* keep tab width stable; overflow handled by tab-bar scrolling */
min-width : 40 px ; /* Ensure minimum width for icon */
overflow : visible ; /* allow close button below */
touch-action : none ; /* ensure JS receives full gesture for swipe/hold to close */
}
. tab . dragging {
z-index : 5 ;
}
/* The swipe-down close buttons live here, on <body>, and never inside a tab: the tab bar clips its own
children, and a tab-row rebuild would orphan a button that had been moved out to be shown. One layer,
swept and refilled by renderTabs(). See the long note above renderTabs()'s positionCloseOverlay. */
# tabCloseLayer {
position : fixed ;
left : 0 ;
top : 0 ;
width : 0 ;
height : 0 ;
z-index : 100000 ;
pointer-events : none ; /* only a button that is actually up takes input */
}
/* Close overlay uses fixed positioning set in JS for reliability on TVs */
. tab . tab-close-confirm ,
. tab-close-confirm {
position : fixed ;
/* Parked off-screen until JS places it. A fixed box with no offsets falls back to its STATIC
position, which is what used to drop the x into the tab row, high and half a width to the left. */
left : -9999 px ;
top : -9999 px ;
opacity : 0 ;
pointer-events : none ; /* disabled until visible */
transition : opacity 0.18 s ease , transform 0.18 s ease ;
transform : translate ( -50 % , 0 ) scale ( 0.9 );
z-index : 100000 ; /* ensure above all UI */
background : transparent ; /* only show the button */
}
. tab . tab-close-confirm . show ,
. tab-close-confirm . show {
opacity : 1 ;
pointer-events : auto ; /* clickable only when shown */
transform : translate ( -50 % , 0 ) scale ( 1 );
}
/* Match popup close button styling */
. tab . tab-close-btn ,
. tab-close-btn {
background : none ;
border : none ;
color : #e0e0e0 ;
font-size : 20 px ;
cursor : pointer ;
padding : 0 ;
width : 30 px ;
height : 30 px ;
line-height : 30 px ;
text-align : center ;
border-radius : 4 px ;
transition : all 0.2 s ease ;
}
. tab . tab-close-btn : hover ,
. tab-close-btn : hover {
background : rgba ( 255 , 255 , 255 , 0.1 );
color : #ff6b6b ;
}
. tab . tab-close-btn : active ,
. tab-close-btn : active {
background : rgba ( 255 , 107 , 107 , 0.15 );
color : #ff6b6b ;
}
. tab . active {
background : transparent ;
border-bottom : 3 px solid #4a9eff ;
}
. tab-title {
display : flex ;
align-items : center ;
justify-content : center ;
font-size : 13 px ;
font-weight : 500 ;
color : #e0e0e0 ;
flex : 1 1 auto ;
min-width : 0 ;
max-width : 100 % ;
}
/* Removed explicit close button; using hold-to-close gesture on tab */
2026-10-21 21:25:35 -04:00
. bible-icon , . media-icon , . whiteboard-icon , . media-tab-icon , . graphics-tab-icon , . maps-tab-icon , . browser-tab-icon , . prayer-tab-icon , . alpha-icon , . notes-icon , . ask-tab-icon {
2026-09-24 13:05:20 -04:00
opacity : 0.7 ;
transition : opacity 0.2 s ;
}
. tab : hover . bible-icon ,
. tab . active . bible-icon ,
. tab : hover . media-icon ,
. tab . active . media-icon ,
. tab : hover . whiteboard-icon ,
. tab . active . whiteboard-icon ,
. tab : hover . media-tab-icon ,
. tab . active . media-tab-icon ,
. tab : hover . graphics-tab-icon ,
. tab . active . graphics-tab-icon ,
. tab : hover . maps-tab-icon ,
. tab . active . maps-tab-icon ,
2026-10-21 21:25:35 -04:00
. tab : hover . browser-tab-icon ,
. tab . active . browser-tab-icon ,
2026-09-24 13:05:20 -04:00
. tab : hover . prayer-tab-icon ,
. tab . active . prayer-tab-icon ,
. tab : hover . alpha-icon ,
. tab . active . alpha-icon ,
. tab : hover . notes-icon ,
. tab . active . notes-icon ,
. tab : hover . ask-tab-icon ,
. tab . active . ask-tab-icon {
opacity : 1 ;
}
/* Media Tab Content Styles */
. media-content {
padding : 20 px ;
color : #e0e0e0 ;
line-height : 1.6 ;
}
. media-welcome {
max-width : 800 px ;
margin : 0 auto ;
}
. media-welcome h2 {
color : #4a9eff ;
margin-bottom : 20 px ;
font-size : 2 rem ;
text-align : center ;
}
. media-welcome h3 {
color : #e0e0e0 ;
margin : 25 px 0 15 px ;
font-size : 1.4 rem ;
}
. drive-section {
background : #1a1a1a ;
border : 1 px solid #404040 ;
border-radius : 8 px ;
padding : 20 px ;
margin : 20 px 0 ;
}
. drive-config {
display : flex ;
align-items : center ;
gap : 10 px ;
margin-bottom : 10 px ;
}
. drive-folder-input {
flex : 1 ;
min-width : 0 ;
padding : 10 px ;
background : #2a2a2a ;
color : #e0e0e0 ;
border : 1 px solid #404040 ;
border-radius : 4 px ;
font-size : 14 px ;
}
. drive-folder-input : focus {
outline : none ;
border-color : #4a9eff ;
box-shadow : 0 0 0 2 px rgba ( 74 , 158 , 255 , 0.2 );
}
. drive-update-btn {
padding : 10 px 20 px ;
background : #4a9eff ;
color : white ;
border : none ;
border-radius : 4 px ;
cursor : pointer ;
font-size : 14 px ;
font-weight : 500 ;
transition : all 0.2 s ease ;
}
. drive-update-btn : hover {
background : #3a8eff ;
transform : translateY ( -1 px );
box-shadow : 0 2 px 4 px rgba ( 0 , 0 , 0 , 0.2 );
}
. drive-update-btn : active {
transform : translateY ( 0 );
box-shadow : none ;
}
. drive-help {
font-size : 0.9 em ;
color : #888 ;
margin-top : 8 px ;
line-height : 1.4 ;
}
. drive-viewer {
background : #1a1a1a ;
border : 1 px solid #404040 ;
border-radius : 8 px ;
overflow : hidden ;
margin : 20 px 0 ;
height : 400 px ;
}
. drive-viewer iframe {
width : 100 % ;
height : 100 % ;
border : none ;
background : #fff ;
}
. media-notes-section {
margin-top : 30 px ;
}
. media-welcome p {
margin-bottom : 15 px ;
font-size : 1.1 rem ;
}
. media-welcome ul {
margin-bottom : 20 px ;
margin-left : 20 px ;
}
. media-welcome li {
margin-bottom : 8 px ;
}
. media-notes {
width : 100 % ;
margin-top : 20 px ;
padding : 15 px ;
border : 2 px solid #404040 ;
border-radius : 8 px ;
background : #1a1a1a ;
color : #e0e0e0 ;
font-family : Georgia , 'Times New Roman' , Times , serif ;
font-size : 16 px ;
line-height : 1.5 ;
resize : vertical ;
min-height : 200 px ;
}
. media-notes : focus {
outline : none ;
border-color : #4a9eff ;
box-shadow : 0 0 0 3 px rgba ( 74 , 158 , 255 , 0.2 );
}
. media-notes :: placeholder {
color : #888 ;
}
/* New Media Tab Workspace Styles */
. media-workspace {
display : flex ;
flex-direction : column ;
height : 100 % ;
background : #2a2a2a ;
padding : 20 px ;
gap : 20 px ;
}
. media-thumbnails-section {
flex : 1 ;
overflow : hidden ;
background : #1a1a1a ;
border-radius : 8 px ;
padding : 20 px ;
}
. media-card-grid {
display : grid ;
grid-template-columns : repeat ( auto - fill , minmax ( 200 px , 1 fr ));
gap : 20 px ;
padding : 10 px ;
}
. media-card {
position : relative ;
width : 120 px ;
height : 120 px ;
margin : 10 px ;
border : none ;
border-radius : 0 ;
overflow : hidden ;
cursor : move ;
background : transparent ;
transition : none ;
}
. media-card : hover {
transform : none ;
box-shadow : none ;
}
. media-card . dragging {
opacity : 0.5 ;
}
. media-thumbnail {
width : 100 % ;
height : 100 % ;
display : flex ;
align-items : center ;
justify-content : center ;
overflow : hidden ;
}
. media-thumbnail img {
width : 100 % ;
height : 100 % ;
object-fit : cover ;
}
. file-icon {
font-size : 32 px ;
color : #666 ;
}
. canvas-content {
position : relative ;
width : 100 % ;
height : 100 % ;
min-height : 500 px ;
}
# mediaCanvas . drag-over {
background-color : transparent ;
border : none ;
}
. media-card . card-content {
padding : 15 px ;
display : flex ;
flex-direction : column ;
gap : 10 px ;
}
. media-card . card-icon {
font-size : 24 px ;
text-align : center ;
}
. media-card . card-thumbnail {
width : 100 % ;
height : 150 px ;
display : flex ;
align-items : center ;
justify-content : center ;
background : #1a1a1a ;
border-radius : 4 px ;
overflow : hidden ;
}
. media-card . card-thumbnail img {
width : 100 % ;
height : 100 % ;
object-fit : cover ;
}
. media-card . loading-card . card-icon {
animation : spin 1 s linear infinite ;
}
. media-card . error-card {
border : none ;
background : transparent ;
}
. media-card . error-card : hover {
border : none ;
background : transparent ;
}
. media-card . empty-card {
border : none ;
background : transparent ;
}
. media-card . empty-card : hover {
border : none ;
background : transparent ;
}
@ keyframes spin {
100 % { transform : rotate ( 360 deg ); }
}
. media-card . card-title {
font-size : 14 px ;
font-weight : 500 ;
color : #e0e0e0 ;
white-space : nowrap ;
overflow : hidden ;
text-overflow : ellipsis ;
text-align : center ;
}
. media-card . card-subtitle {
font-size : 12 px ;
color : #808080 ;
text-align : center ;
}
. media-canvas {
flex : 2 ;
background : #1a1a1a ;
border-radius : 8 px ;
padding : 20 px ;
position : relative ;
overflow : hidden ;
}
. media-canvas . drag-over {
border : none ;
background : transparent ;
}
. canvas-content {
width : 100 % ;
height : 100 % ;
position : relative ;
min-height : 500 px ;
touch-action : auto !important ;
overflow : hidden ;
}
. canvas-placeholder {
position : absolute ;
top : 50 % ;
left : 50 % ;
transform : translate ( -50 % , -50 % );
text-align : center ;
color : #666666 ;
}
. placeholder-icon {
font-size : 48 px ;
margin-bottom : 10 px ;
}
. placeholder-text {
font-size : 16 px ;
}
. canvas-media-item {
position : absolute ;
background : transparent ;
border : none ;
border-radius : 0 ;
box-shadow : none ;
overflow : hidden ;
cursor : move ;
user-select : none ;
touch-action : none ;
}
. canvas-media-item img {
width : 100 % ;
height : 100 % ;
object-fit : contain ;
pointer-events : none ; /* Prevent image from interfering with drag */
}
. canvas-media-item iframe {
width : 100 % ;
height : 100 % ;
border : none ;
pointer-events : none ; /* Prevent iframe from interfering with drag */
}
/* Make sure the canvas content is properly positioned for absolute items */
. canvas-content {
width : 100 % ;
height : 100 % ;
position : relative ;
min-height : 500 px ;
padding : 0 ;
}
/* Ensure proper stacking context for media items */
. canvas-media-item {
z-index : 1 ;
}
. canvas-media-item : hover {
z-index : 2 ;
}
. media-item-content {
width : 100 % ;
height : 100 % ;
padding : 10 px ;
display : flex ;
flex-direction : column ;
align-items : center ;
justify-content : center ;
position : relative ; /* Added for absolute positioning of children */
}
. media-item-content img {
width : 100 % ;
height : 100 % ;
object-fit : contain ;
pointer-events : none ; /* Prevent image from interfering with drag */
}
. media-item-icon {
font-size : 24 px ;
margin-bottom : 10 px ;
}
. media-item-name {
font-size : 14 px ;
color : #e0e0e0 ;
text-align : center ;
word-break : break-word ;
}
/* Media Responsive Styles */
@ media ( max-width : 768px ) {
. media-workspace {
padding : 10 px ;
gap : 10 px ;
}
. media-card-grid {
grid-template-columns : repeat ( auto - fill , minmax ( 150 px , 1 fr ));
gap : 10 px ;
}
. media-card {
font-size : 12 px ;
}
. media-card . card-icon {
font-size : 20 px ;
}
. canvas-media-item {
min-width : 100 px ;
min-height : 80 px ;
}
. media-item-icon {
font-size : 20 px ;
}
}
/* Link Chooser Popup Styles */
. link-chooser-popup {
position : fixed ;
top : 0 ;
left : 0 ;
width : 100 % ;
height : 100 % ;
z-index : 10000 ;
display : flex ;
align-items : center ;
justify-content : center ;
}
. popup-overlay {
position : absolute ;
top : 0 ;
left : 0 ;
width : 100 % ;
height : 100 % ;
background : rgba ( 0 , 0 , 0 , 0.7 );
backdrop-filter : blur ( 5 px );
}
. popup-content {
background : #2a2a2a ;
border : 1 px solid #404040 ;
border-radius : 8 px ;
width : 90 % ;
max-width : 600 px ;
position : relative ;
z-index : 1 ;
max-height : 85 vh ;
overflow-y : auto ;
}
. popup-header {
display : flex ;
align-items : center ;
justify-content : space-between ;
padding : 20 px 25 px ;
border-bottom : 1 px solid #404040 ;
}
. popup-header h3 {
margin : 0 ;
color : #e0e0e0 ;
font-size : 18 px ;
}
. popup-close {
background : none ;
border : none ;
color : #888 ;
font-size : 24 px ;
cursor : pointer ;
padding : 0 ;
width : 30 px ;
height : 30 px ;
display : flex ;
align-items : center ;
justify-content : center ;
border-radius : 4 px ;
}
. popup-close : hover {
background : #404040 ;
color : #e0e0e0 ;
}
. popup-body {
padding : 25 px ;
}
. popup-body label {
display : block ;
margin-bottom : 8 px ;
color : #e0e0e0 ;
font-weight : 500 ;
}
. popup-body . drive-folder-input {
width : 100 % ;
margin-bottom : 10 px ;
}
. popup-body . drive-help {
font-size : 0.85 em ;
color : #888 ;
line-height : 1.4 ;
}
/* Enhanced input styles for larger popup */
. input-section {
margin-bottom : 25 px ;
}
. input-wrapper {
position : relative ;
}
. drive-folder-input-large {
width : 100 % ;
padding : 15 px ;
font-size : 16 px ;
background : #1a1a1a ;
color : #e0e0e0 ;
border : 2 px solid #404040 ;
border-radius : 8 px ;
font-family : Georgia , 'Times New Roman' , Times , serif ;
transition : all 0.3 s ease ;
margin-bottom : 12 px ;
}
. drive-folder-input-large : focus {
outline : none ;
border-color : #4a9eff ;
box-shadow : 0 0 0 3 px rgba ( 74 , 158 , 255 , 0.2 );
background : #222 ;
}
. drive-folder-input-large :: placeholder {
color : #666 ;
font-style : italic ;
}
. input-status {
display : flex ;
align-items : center ;
gap : 8 px ;
padding : 8 px 12 px ;
border-radius : 6 px ;
font-size : 14 px ;
background : #333 ;
border : 1 px solid #404040 ;
transition : all 0.3 s ease ;
}
. input-status . valid {
background : rgba ( 76 , 175 , 80 , 0.1 );
border-color : #4caf50 ;
color : #4caf50 ;
}
. input-status . warning {
background : rgba ( 255 , 193 , 7 , 0.1 );
border-color : #ffc107 ;
color : #ffc107 ;
}
. input-status . success {
background : rgba ( 76 , 175 , 80 , 0.2 );
border-color : #4caf50 ;
color : #4caf50 ;
font-weight : 500 ;
}
. status-icon {
font-size : 16 px ;
line-height : 1 ;
}
. status-text {
flex : 1 ;
font-weight : 500 ;
}
. help-section {
background : #1a1a1a ;
border : 1 px solid #333 ;
border-radius : 8 px ;
padding : 20 px ;
margin-bottom : 20 px ;
}
. help-section h4 {
margin : 0 0 15 px 0 ;
color : #4a9eff ;
font-size : 16 px ;
}
. help-steps {
margin : 0 0 15 px 0 ;
padding-left : 20 px ;
color : #ccc ;
}
. help-steps li {
margin-bottom : 8 px ;
line-height : 1.4 ;
}
. help-steps strong {
color : #4a9eff ;
}
. example-section {
background : #0d1117 ;
border : 1 px solid #30363d ;
border-radius : 6 px ;
padding : 15 px ;
margin-top : 15 px ;
}
. example-section p {
margin : 0 0 8 px 0 ;
color : #e0e0e0 ;
font-size : 14 px ;
}
. example-section code {
background : #21262d ;
color : #4a9eff ;
padding : 4 px 8 px ;
border-radius : 4 px ;
font-family : 'Courier New' , monospace ;
font-size : 13 px ;
word-break : break-all ;
}
. current-config {
background : rgba ( 74 , 158 , 255 , 0.05 );
border : 1 px solid #4a9eff ;
border-radius : 8 px ;
padding : 20 px ;
margin-top : 20 px ;
}
. current-config h4 {
margin : 0 0 15 px 0 ;
color : #4a9eff ;
font-size : 16 px ;
}
. current-id {
margin-bottom : 12 px ;
font-size : 14 px ;
color : #ccc ;
}
. current-id strong {
color : #e0e0e0 ;
}
. current-id code {
background : #1a1a1a ;
color : #4a9eff ;
padding : 4 px 8 px ;
border-radius : 4 px ;
font-family : 'Courier New' , monospace ;
font-size : 12 px ;
border : 1 px solid #333 ;
}
. preview-link a {
display : inline-flex ;
align-items : center ;
gap : 6 px ;
color : #4a9eff ;
text-decoration : none ;
font-size : 14 px ;
font-weight : 500 ;
padding : 8 px 12 px ;
background : rgba ( 74 , 158 , 255 , 0.1 );
border : 1 px solid #4a9eff ;
border-radius : 6 px ;
transition : all 0.2 s ease ;
}
. preview-link a : hover {
background : rgba ( 74 , 158 , 255 , 0.2 );
transform : translateY ( -1 px );
}
. popup-footer {
display : flex ;
gap : 10 px ;
justify-content : flex-end ;
padding : 20 px 25 px ;
border-top : 1 px solid #404040 ;
}
. popup-btn {
padding : 10 px 20 px ;
border : none ;
border-radius : 4 px ;
font-size : 14 px ;
font-weight : 500 ;
cursor : pointer ;
transition : all 0.2 s ease ;
}
. popup-btn . cancel {
background : #404040 ;
color : #e0e0e0 ;
}
. popup-btn . cancel : hover {
background : #505050 ;
}
. popup-btn . save {
background : #4a9eff ;
color : white ;
}
. popup-btn . save : hover {
background : #3a8eff ;
}
/* Mobile Responsive Styles for Media Tab */
@ media ( max-width : 768px ) {
. media-workspace {
padding : 15 px ;
gap : 15 px ;
}
. media-card-grid {
grid-template-columns : repeat ( auto - fill , minmax ( 100 px , 1 fr ));
gap : 10 px ;
}
. media-card {
padding : 10 px ;
min-height : 70 px ;
}
. media-card . card-icon {
font-size : 20 px ;
}
. canvas-media-item {
min-width : 120 px ;
min-height : 80 px ;
padding : 10 px ;
}
. media-item-icon {
font-size : 24 px ;
}
. popup-content {
width : 95 % ;
margin : 20 px ;
}
. popup-header , . popup-body , . popup-footer {
padding : 15 px 20 px ;
}
. drive-folder-input-large {
font-size : 16 px ; /* Prevent zoom on iOS */
padding : 12 px ;
}
. help-section {
padding : 15 px ;
}
. current-config {
padding : 15 px ;
}
. popup-content {
max-width : 95 % ;
}
}
. chapter-select ,
. verse-select {
background : #404040 ;
border : 2 px solid #505050 ;
border-radius : 6 px ;
padding : 8 px 12 px ;
font-size : 14 px ;
color : #e0e0e0 ;
min-width : 80 px ;
outline : none ;
transition : border-color 0.2 s ease ;
}
. chapter-select : focus ,
. verse-select : focus {
border-color : #4a9eff ;
}
. book-select , . translation-select {
background-image : url ( "data:image/svg+xml;utf8,<svg fill='white' height='16' viewBox='0 0 20 20' width='16' xmlns='http://www.w3.org/2000/svg'><path d='M7.293 7.293a1 1 0 011.414 0L10 8.586l1.293-1.293a1 1 0 111.414 1.414l-2 2a1 1 0 01-1.414 0l-2-2a1 1 0 010-1.414z'/></svg>" );
background-repeat : no-repeat ;
background-position : right 14 px center ;
background-size : 18 px 18 px ;
padding-right : 38 px ;
}
. chapter-select :: -ms-expand ,
. verse-select :: -ms-expand ,
. book-select :: -ms-expand ,
. translation-select :: -ms-expand {
display : none ;
}
. chapter-select : hover ,
. verse-select : hover ,
. book-select : hover ,
. translation-select : hover {
border-color : #666 ;
}
. load-btn {
background : #4a9eff ;
border : none ;
border-radius : 6 px ;
padding : 8 px 16 px ;
font-size : 14 px ;
font-weight : 500 ;
color : #ffffff ;
cursor : pointer ;
transition : all 0.2 s ease ;
}
/* Make select options larger for touch */
select option {
font-size : 20 px ;
padding : 16 px 0 ;
}
/* Tab Content */
. tab-content {
flex : 1 ;
display : flex ;
flex-direction : column ;
overflow : hidden ;
background : #181818 ;
transition : opacity 140 ms ease ;
will-change : opacity ;
}
. media-fade {
opacity : 0 ;
transition : opacity 180 ms ease ;
}
. media-fade . media-fade-visible {
opacity : 1 ;
}
. tab-panel {
display : none ;
flex-direction : column ;
flex : 1 1 auto ;
min-height : 0 ;
opacity : 1 ;
transition : opacity 140 ms ease ;
}
. tab-panel . active {
display : flex ;
}
. tab-panel . tab-fade-enter {
opacity : 0 ;
}
. tab-panel . tab-fade-enter-active {
opacity : 1 ;
}
. tab-content . tab-container-fade-enter {
opacity : 0 ;
}
. tab-content . tab-container-fade-enter . tab-container-fade-enter-active {
opacity : 1 ;
}
. notes-stage {
display : flex ;
justify-content : center ;
align-items : flex-start ;
}
. notes-stage . content-wrapper {
width : 100 % ;
display : flex ;
justify-content : center ;
align-items : flex-start ;
}
. notes-stage . bible-text {
width : 100 % ;
display : flex ;
justify-content : center ;
align-items : flex-start ;
}
. notes-stage . passage-text ,
. notes-stage . notes-passage {
width : 100 % ;
display : flex ;
justify-content : center ;
align-items : flex-end ;
margin : 0 auto ;
}
. notes-stage canvas ,
. notes-stage img {
margin : 0 auto ;
display : block ;
}
/* Passage Selector */
. passage-selector {
background : #2a2a2a ;
border-bottom : 1 px solid #404040 ;
padding : 15 px 20 px !important ;
}
. selector-row {
display : flex ;
align-items : center ;
gap : 10 px ;
}
. selector-row span {
font-size : 22 px ;
font-weight : bold ;
color : #4a9eff ;
margin : 0 6 px ;
letter-spacing : 2 px ;
vertical-align : middle ;
}
. book-select {
background : #404040 ;
border : 2 px solid #505050 ;
border-radius : 6 px ;
padding : 8 px 12 px ;
font-size : 14 px ;
color : #e0e0e0 ;
min-width : 150 px ;
outline : none ;
transition : border-color 0.2 s ease ;
}
. book-select : focus {
border-color : #4a9eff ;
}
/* Book select placeholder styling */
. book-select [ data-placeholder ] : not ([ data-placeholder = "" ]) : invalid {
color : #888 ;
}
. book-select [ data-placeholder ] : not ([ data-placeholder = "" ]) : invalid :: before {
content : attr ( data - placeholder );
color : #888 ;
position : absolute ;
pointer-events : none ;
}
/* Alternative approach using CSS to show placeholder text */
. book-select option [ value = "" ] {
display : none ;
}
. book-select : invalid {
color : #888 ;
}
. book-select : invalid :: before {
content : attr ( data - placeholder );
color : #888 ;
position : absolute ;
pointer-events : none ;
}
/* Book select placeholder styling - improved approach */
. book-select [ data-show-placeholder = "true" ] {
color : #888 ;
}
. book-select [ data-show-placeholder = "true" ] :: before {
content : "Book" ;
color : #888 ;
position : absolute ;
pointer-events : none ;
padding : 14 px 18 px ;
font-size : 18 px ;
}
. translation-select {
background : #404040 ;
border : 2 px solid #505050 ;
border-radius : 6 px ;
padding : 8 px 12 px ;
font-size : 14 px ;
color : #e0e0e0 ;
min-width : 80 px ;
outline : none ;
transition : border-color 0.2 s ease ;
}
. translation-select : focus {
border-color : #4a9eff ;
}
. chapter-select : hover ,
. verse-select : hover {
border-color : #666 ;
}
. chapter-select : focus ,
. verse-select : focus {
outline : none ;
border-color : #3498db ;
box-shadow : 0 0 0 2 px rgba ( 52 , 152 , 219 , 0.2 );
}
. load-btn : hover {
background : #3a8eef ;
transform : translateY ( -1 px );
}
. load-btn : active {
transform : translateY ( 0 );
}
. new-tab-btn {
display : flex ;
align-items : center ;
justify-content : center ;
width : 28 px ;
height : 28 px ;
min-width : 28 px ;
background : transparent ;
border : none ;
border-radius : 6 px ;
color : #4a9eff ;
font-size : 20 px ;
cursor : pointer ;
margin-left : 8 px ;
transition : background-color 0.2 s ;
padding : 0 ;
line-height : 1 ;
}
. new-tab-btn : hover {
background-color : rgba ( 74 , 158 , 255 , 0.1 );
}
. new-tab-btn : active {
background-color : rgba ( 74 , 158 , 255 , 0.2 );
}
. new-tab-btn . menu-open {
background-color : rgba ( 74 , 158 , 255 , 0.18 );
}
. new-tab-quick-menu {
position : absolute ;
top : 50 % ;
right : -8 px ;
transform : translate ( 100 % , -50 % ) scale ( 0.96 );
transform-origin : left center ;
display : flex ;
flex-direction : row ;
align-items : center ;
flex-wrap : nowrap ;
gap : 6 px ;
min-width : 0 ;
padding : 8 px ;
border-radius : 10 px ;
border : 1 px solid rgba ( 74 , 158 , 255 , 0.35 );
background : rgba ( 20 , 22 , 26 , 0.96 );
box-shadow : 0 14 px 30 px rgba ( 0 , 0 , 0 , 0.44 );
opacity : 0 ;
pointer-events : none ;
transition : opacity 0.16 s ease , transform 0.16 s ease ;
z-index : 100020 ;
}
. new-tab-quick-menu . show {
opacity : 1 ;
transform : translate ( 100 % , -50 % ) scale ( 1 );
pointer-events : auto ;
}
. new-tab-menu-item {
display : inline-flex ;
align-items : center ;
justify-content : center ;
width : 36 px ;
height : 32 px ;
border : none ;
border-radius : 8 px ;
padding : 0 ;
background : rgba ( 255 , 255 , 255 , 0.03 );
color : #e0e0e0 ;
cursor : pointer ;
text-align : center ;
font-size : 13 px ;
}
. new-tab-menu-item : hover {
background : rgba ( 74 , 158 , 255 , 0.16 );
}
. new-tab-menu-item : active {
background : rgba ( 74 , 158 , 255 , 0.24 );
}
. new-tab-menu-icon {
display : flex ;
align-items : center ;
justify-content : center ;
width : 100 % ;
height : 100 % ;
border-radius : 6 px ;
color : #4a9eff ;
background : rgba ( 74 , 158 , 255 , 0.09 );
font-weight : 600 ;
letter-spacing : 0.02 em ;
}
. new-tab-menu-label {
display : none ;
}
. size-slider {
-webkit- appearance : none ;
appearance : none ;
width : 120 px ;
height : 8 px ;
border-radius : 5 px ;
background : #555 ;
outline : none ;
transition : opacity .2 s ;
display : block ;
margin : 0 ;
padding : 0 ;
}
/* When the slider is wrapped with a ticks overlay, let it span the full wrap
so its travel matches the tick positions exactly. */
. size-slider-wrap > . size-slider {
width : 100 % ;
}
. size-slider :: -webkit-slider-runnable-track {
height : 8 px ;
background : transparent ;
border : none ;
}
. size-slider :: -webkit-slider-thumb {
-webkit- appearance : none ;
appearance : none ;
width : 20 px ;
height : 20 px ;
box-sizing : border-box ;
border-radius : 50 % ;
background : #e0e0e0 ; /* avoid pure white on iOS invert */
border : 3 px solid #888 ;
cursor : pointer ;
margin-top : -6 px ; /* keep thumb centered on 8px track */
box-shadow : 0 0 4 px rgba ( 0 , 0 , 0 , 0.35 );
}
. size-slider :: -moz-range-track {
height : 8 px ;
background : transparent ;
border : none ;
}
. size-slider :: -moz-range-thumb {
width : 20 px ;
height : 20 px ;
box-sizing : border-box ;
border-radius : 50 % ;
background : #e0e0e0 ;
border : 3 px solid #888 ;
cursor : pointer ;
box-shadow : 0 0 4 px rgba ( 0 , 0 , 0 , 0.35 );
}
. size-slider :: -moz-range-progress {
background : transparent ;
}
. tool-wrapper {
display : flex ;
gap : 8 px ;
position : relative ;
z-index : 11010 ; /* keep tool controls above surrounding UI */
}
. size-slider-popup {
position : absolute ;
top : 120 % ;
left : 50 % ;
transform : translateX ( -50 % ) scaleY ( 0 );
transform-origin : top center ;
background-color : #2a2a2a ;
border : 1 px solid #404040 ;
border-radius : 8 px ;
box-shadow : 0 4 px 12 px rgba ( 0 , 0 , 0 , 0.3 );
padding : 10 px 12 px ;
display : flex ;
flex-direction : column ;
align-items : stretch ;
gap : 8 px ;
transition : transform 0.18 s cubic-bezier ( .4 , 1.6 , .6 , 1 ), opacity 0.18 s cubic-bezier ( .4 , 1.6 , .6 , 1 );
opacity : 0 ;
pointer-events : none ;
min-width : 200 px ;
justify-content : center ;
z-index : 1000 ;
}
. size-slider-popup . show {
transform : translateX ( -50 % ) scaleY ( 1 );
opacity : 1 ;
pointer-events : auto ;
}
/* Wraps the pen-size slider together with an absolutely-positioned ticks layer.
The wrapper has extra vertical room so tick marks can extend above and below
the 8px track without being clipped (a native <input type=range> background
would otherwise be limited to the track height). */
. size-slider-wrap {
position : relative ;
width : 100 % ;
/* Height must be at least the tallest tick mark (24px for default). */
height : 28 px ;
display : flex ;
align-items : center ;
}
. size-slider-wrap . size-slider {
position : relative ;
z-index : 2 ;
width : 100 % ;
}
/* Tick-mark overlay sits behind the slider thumb but in front of the track. */
. size-slider-ticks {
position : absolute ;
inset : 0 ;
pointer-events : none ;
z-index : 1 ;
}
. size-slider-tick {
position : absolute ;
top : 50 % ;
transform : translate ( -50 % , -50 % );
width : 2 px ;
height : 16 px ;
background : #d8d8d8 ;
border-radius : 1 px ;
box-shadow : 0 0 0 1 px rgba ( 0 , 0 , 0 , 0.35 );
}
. size-slider-tick . is-end {
width : 3 px ;
height : 18 px ;
background : #ffffff ;
}
. size-slider-tick . is-default {
width : 4 px ;
height : 24 px ;
background : #4a9eff ;
border-radius : 2 px ;
box-shadow :
0 0 0 1 px rgba ( 0 , 0 , 0 , 0.55 ),
0 0 8 px rgba ( 74 , 158 , 255 , 0.7 );
}
. hue-slider {
-webkit- appearance : none ;
appearance : none ;
width : 120 px ;
height : 8 px ;
border-radius : 5 px ;
background : linear-gradient ( to right , red , yellow , lime , aqua , blue , magenta , red );
outline : none ;
opacity : 0.9 ;
transition : opacity .2 s ;
padding : 0 ;
}
. hue-slider : hover {
opacity : 1 ;
}
. hue-slider :: -webkit-slider-thumb {
-webkit- appearance : none ;
appearance : none ;
width : 20 px ;
height : 20 px ;
border-radius : 50 % ;
background : #e0e0e0 ; /* avoid pure white on iOS invert */
border : 3 px solid var ( -- hue - color , #e0e0e0 );
cursor : pointer ;
box-shadow : 0 0 4 px rgba ( 0 , 0 , 0 , 0.4 );
}
. hue-slider :: -moz-range-thumb {
width : 20 px ;
height : 20 px ;
border-radius : 50 % ;
background : #e0e0e0 ;
border : 3 px solid var ( -- hue - color , #e0e0e0 );
cursor : pointer ;
}
. toolbar-right {
display : flex ;
align-items : center ;
gap : 10 px ;
}
. color-dropdown-wrapper {
position : relative ;
z-index : 11010 ;
}
. color-btn {
padding : 8 px ;
}
. color-dropdown {
display : none ;
position : absolute ;
top : 100 % ;
left : 50 % ;
transform : translateX ( -50 % );
background-color : #2a2a2a ;
border : 1 px solid #404040 ;
border-radius : 8 px ;
padding : 10 px ;
box-shadow : 0 4 px 12 px rgba ( 0 , 0 , 0 , 0.3 );
z-index : 11012 ;
margin-top : 8 px ;
}
. color-dropdown . show {
display : block ;
}
. color-presets {
display : flex ;
gap : 10 px ;
margin-bottom : 10 px ;
}
. color-swatch {
width : 30 px ;
height : 30 px ;
border-radius : 50 % ;
cursor : pointer ;
border : 2 px solid transparent ;
transition : all 0.2 s ease ;
}
. color-swatch . preset : hover ,
. color-swatch . preset . selected {
border-color : #4a9eff ;
transform : scale ( 1.1 );
}
. color-picker-swatch {
display : flex ;
justify-content : center ;
}
. color-swatch . picker {
width : 100 % ;
height : 30 px ;
padding : 0 ;
border : none ;
background : none ;
}
. pen-color-dropdown {
position : absolute ;
top : 115 % ; /* closer so it doesn't exceed toolbar bounds visually */
left : 50 % ;
transform : translateX ( -50 % ) scaleY ( 0 );
transform-origin : top center ;
background-color : #2a2a2a ;
border : 1 px solid #404040 ;
border-radius : 8 px ;
box-shadow : 0 4 px 12 px rgba ( 0 , 0 , 0 , 0.3 );
padding : 10 px 12 px ;
display : flex ;
gap : 12 px ;
transition : transform 0.18 s cubic-bezier ( .4 , 1.6 , .6 , 1 ), opacity 0.18 s cubic-bezier ( .4 , 1.6 , .6 , 1 );
opacity : 0 ;
pointer-events : none ;
min-width : 200 px ;
justify-content : center ;
z-index : 11012 ;
}
. pen-color-option {
width : 28 px !important ;
height : 28 px !important ;
border-radius : 50 % !important ;
border : none !important ;
background : var ( -- pen - color ) !important ;
box-shadow : none !important ;
outline : none !important ;
padding : 0 !important ;
margin : 0 !important ;
opacity : 1 !important ;
filter : none !important ;
mix-blend-mode : normal !important ;
}
. pen-color-option [ style *= '#fefefe' ],
. pen-color-option [ style *= '#ffff00' ] {
border : none !important ;
box-shadow : none !important ;
}
. pen-color-option : focus , . pen-color-option . selected {
outline : 2 px solid #4a9eff ;
outline-offset : 2 px ;
}
. pen-color-dropdown . show {
transform : translateX ( -50 % ) scaleY ( 1 );
opacity : 1 ;
pointer-events : auto ;
}
. highlighter-color-dropdown {
position : absolute ;
top : 120 % ;
left : 50 % ;
transform : translateX ( -50 % ) scaleY ( 0 );
transform-origin : top center ;
background-color : #2a2a2a ;
border : 1 px solid #404040 ;
border-radius : 8 px ;
box-shadow : 0 4 px 12 px rgba ( 0 , 0 , 0 , 0.3 );
padding : 10 px 12 px ;
display : flex ;
gap : 12 px ;
transition : transform 0.18 s cubic-bezier ( .4 , 1.6 , .6 , 1 ), opacity 0.18 s cubic-bezier ( .4 , 1.6 , .6 , 1 );
opacity : 0 ;
pointer-events : none ;
min-width : 200 px ;
justify-content : center ;
z-index : 11012 ;
}
. highlighter-color-dropdown . show {
transform : translateX ( -50 % ) scaleY ( 1 );
opacity : 1 ;
pointer-events : auto ;
}
. highlighter-color-option {
width : 28 px !important ;
height : 28 px !important ;
border-radius : 50 % !important ;
border : none !important ;
background : var ( -- highlighter - color ) !important ;
box-shadow : none !important ;
outline : none !important ;
padding : 0 !important ;
margin : 0 !important ;
opacity : 1 !important ;
filter : none !important ;
mix-blend-mode : normal !important ;
}
. highlighter-color-option : focus , . highlighter-color-option . selected {
outline : 2 px solid #4a9eff ;
outline-offset : 2 px ;
}
. tool-icon [ data-tool = "highlight" ] {
color : var ( -- highlighter - color , #ffff00 ) !important ;
transition : none !important ;
position : relative ;
}
/* Removed ::before circle for highlighter tool icon */
. tool-icon [ data-tool = "highlight" ] . selected ,
. tool-icon [ data-tool = "highlight" ] . selected : hover ,
. tool-icon [ data-tool = "highlight" ] . selected : focus ,
. tool-icon [ data-tool = "highlight" ] . selected : active {
background : #333 !important ;
border : 2 px solid var ( -- highlighter - color , #ffff00 ) !important ;
color : var ( -- highlighter - color , #ffff00 ) !important ;
box-shadow : 0 0 0 2 px var ( -- highlighter - color , #ffff00 ), 0 0 8 px rgba ( 255 , 255 , 0 , 0.5 );
}
. tool-icon [ data-tool = "highlight" ] . selected :: before {
opacity : 0.5 ;
transform : translate ( -50 % , -50 % ) scale ( 1.2 );
}
. tool-icon [ data-tool = "erase" ] {
color : #ffb6c1 !important ; /* Classic pink eraser */
}
. tool-icon [ data-tool = "erase" ] . selected ,
. tool-icon [ data-tool = "erase" ] . selected : hover ,
. tool-icon [ data-tool = "erase" ] . selected : focus ,
. tool-icon [ data-tool = "erase" ] . selected : active {
background : #333 !important ;
border : 2 px solid #ffb6c1 !important ;
color : #ffb6c1 !important ;
box-shadow : 0 0 0 2 px #ffb6c1 , 0 0 8 px rgba ( 255 , 182 , 193 , 0.5 ) !important ;
}
/* Select tool styling */
. tool-icon [ data-tool = "select" ] {
color : #4a9eff !important ;
transition : none !important ;
}
. tool-icon [ data-tool = "select" ] : hover ,
. tool-icon [ data-tool = "select" ] : focus ,
. tool-icon [ data-tool = "select" ] : active {
color : #4a9eff !important ;
background : none !important ;
border : none !important ;
}
. tool-icon [ data-tool = "select" ] . selected ,
. tool-icon [ data-tool = "select" ] . selected : hover ,
. tool-icon [ data-tool = "select" ] . selected : focus ,
. tool-icon [ data-tool = "select" ] . selected : active {
background : #333 !important ;
border : 2 px solid #4a9eff !important ;
color : #4a9eff !important ;
box-shadow : 0 0 0 2 px #4a9eff , 0 0 8 px rgba ( 74 , 158 , 255 , 0.5 ) !important ;
}
/* Clickable word styling */
. clickable-word {
position : relative ;
/* No visual styling - words look exactly like normal text */
transition : none ;
}
. clickable-word . has-data {
cursor : pointer ;
}
/* Subtle underline only when Select tool is active */
. select-mode-active . clickable-word . has-data {
text-decoration : underline ;
text-decoration-thickness : 0.05 em ;
text-underline-offset : 0.12 em ;
}
/* intentionally no hover/active styling to keep text look natural */
/* Touch hold visual feedback for word selection intentionally no-op */
/* Select mode active body styling */
. select-mode-active . bible-text {
cursor : default ;
-webkit- user-select : none !important ;
-moz- user-select : none !important ;
-ms- user-select : none !important ;
user-select : none !important ;
}
. select-mode-active . reading-area {
cursor : default ;
-webkit- user-select : none !important ;
-moz- user-select : none !important ;
-ms- user-select : none !important ;
user-select : none !important ;
}
/* Disable text selection in select mode */
. select-mode-active * {
-webkit- user-select : none !important ;
-moz- user-select : none !important ;
-ms- user-select : none !important ;
user-select : none !important ;
}
/* Allow text selection only for clickable words in select mode */
. select-mode-active . clickable-word . has-data {
-webkit- user-select : none !important ;
-moz- user-select : none !important ;
-ms- user-select : none !important ;
user-select : none !important ;
cursor : pointer ;
}
. tool-icon [ data-tool = "pen" ] : hover ,
. tool-icon [ data-tool = "pen" ] : focus ,
. tool-icon [ data-tool = "pen" ] : active {
color : var ( -- pen - color , #ffff00 ) !important ;
}
# undoBtn , # redoBtn , # resetBtn {
background : #2a2a2a ;
color : #e0e0e0 ;
border : 2 px solid #404040 ;
transition : all 0.15 s ease ;
position : relative ;
overflow : hidden ; /* For progress indicator */
cursor : pointer ;
}
/* Base hover effects for undo/redo/clear buttons - will be overridden by more specific rules above */
# undoBtn : disabled , # redoBtn : disabled {
background : #1a1a1a ;
color : #666 ;
border-color : #333 ;
cursor : not-allowed ;
opacity : 0.5 ;
transform : none ;
box-shadow : none ;
}
# undoBtn : disabled : hover , # redoBtn : disabled : hover {
background : #1a1a1a ;
border-color : #333 ;
transform : none ;
box-shadow : none ;
}
# undoBtn : active : not ( : disabled ), # redoBtn : active : not ( : disabled ), # resetBtn : active : not ( : disabled ) {
background : #444 !important ;
color : #fff !important ;
box-shadow : 0 0 8 px #222 , 0 0 15 px rgba ( 74 , 158 , 255 , 0.4 ) !important ;
transform : translateY ( 0 ) !important ;
border-color : #4a9eff !important ;
}
# undoBtn : focus , # redoBtn : focus , # resetBtn : focus {
outline : 2 px solid #4a9eff ;
outline-offset : 2 px ;
box-shadow : 0 0 8 px rgba ( 74 , 158 , 255 , 0.3 ), 0 0 12 px rgba ( 74 , 158 , 255 , 0.2 ) !important ;
border-color : #4a9eff !important ;
}
/* Visual feedback for undo/redo button clicks */
# undoBtn . clicked , # redoBtn . clicked {
transform : scale ( 0.95 );
background-color : #404040 ;
transition : transform 0.1 s ease , background-color 0.1 s ease ;
}
# undoBtn :: after , # redoBtn :: after {
content : '' ;
position : absolute ;
top : 0 ;
left : 0 ;
right : 0 ;
bottom : 0 ;
background : linear-gradient ( 45 deg , transparent 30 % , rgba ( 255 , 255 , 255 , 0.1 ) 50 % , transparent 70 % );
transform : translateX ( -100 % );
transition : transform 0.6 s ease ;
pointer-events : none ;
border-radius : 8 px ;
}
/* Removed keyboard shortcut hints under undo/redo buttons */
# penSizeSliderPopup {
min-width : 300 px !important ;
}
# penSizeSlider {
width : 100 % !important ;
min-width : 280 px !important ;
}
. verse-bracket {
color : #d2b48c !important ;
font-weight : 600 ;
font-size : 20 px ;
margin-right : 0 ;
}
/* Eraser Visual Assistant */
. eraser-visual-aid {
position : fixed ;
pointer-events : none ;
border : 2 px solid #ffb6c1 ;
background : rgba ( 255 , 182 , 193 , 0.15 );
border-radius : 50 % ;
z-index : 10002 ;
transition : opacity 0.1 s , width 0.1 s , height 0.1 s ;
opacity : 0 ;
box-shadow : 0 0 8 px #ffb6c1 44 ;
}
. eraser-visual-aid . active {
opacity : 1 ;
}
/* Word Info Popup */
. word-info-popup {
position : absolute ;
min-width : 640 px ;
max-width : 800 px ;
/* FULLY opaque: at 0.98 the scripture behind still ghosted through large white text on
a dark room screen (about 5/255 difference — subtle on a monitor, obvious on a big TV). */
background : #1e1e1e ;
/* backdrop-filter removed: the card is opaque so the blur was invisible, but it still forced a full re-blur of the screen behind on EVERY scroll frame (measured: 16.7ms -> 33.2ms per frame, 26/40 dropped). */
border : 2 px solid #4a9eff ;
border-radius : 12 px ;
box-shadow : 0 8 px 25 px rgba ( 0 , 0 , 0 , 0.6 ), 0 0 20 px rgba ( 74 , 158 , 255 , 0.3 );
z-index : 20000 ;
padding : 0 ;
font-family : Georgia , 'Times New Roman' , Times , serif ;
opacity : 0 ;
transform : scale ( 0.8 ) translateY ( -10 px ) translateZ ( 0 ); /* Force GPU acceleration */
transition : all 0.3 s cubic-bezier ( 0.4 , 0 , 0.2 , 1 );
cursor : move ;
user-select : none ;
/* CSS containment for performance isolation */
contain : layout style paint ;
/* Prevent overly tall cards on dense definitions */
max-height : 75 vh ;
overflow : hidden ;
/* Use flexbox layout for proper scrolling */
display : flex ;
flex-direction : column ;
/* Optimize rendering - only use will-change when dragging */
transform-style : preserve-3d ;
}
. word-info-popup . show {
opacity : 1 ;
transform : scale ( 1 ) translateY ( 0 ) translateZ ( 0 );
/* Reduce backdrop-filter when not dragging for better performance */
/* backdrop-filter removed: the card is opaque so the blur was invisible, but it still forced a full re-blur of the screen behind on EVERY scroll frame (measured: 16.7ms -> 33.2ms per frame, 26/40 dropped). */
}
. word-info-popup . dragging {
box-shadow : 0 12 px 35 px rgba ( 0 , 0 , 0 , 0.8 ), 0 0 25 px rgba ( 74 , 158 , 255 , 0.5 );
transform : scale ( 1.02 ) translateZ ( 0 );
/* Disable transitions during drag for maximum performance */
transition : none !important ;
transform-origin : center ;
/* Only apply will-change when actively dragging for better performance */
will-change : transform , left , top ;
/* Reduce backdrop-filter during drag for better performance */
/* backdrop-filter removed: the card is opaque so the blur was invisible, but it still forced a full re-blur of the screen behind on EVERY scroll frame (measured: 16.7ms -> 33.2ms per frame, 26/40 dropped). */
}
. word-info-header {
display : flex ;
justify-content : space-between ;
align-items : center ;
padding : 16 px 20 px ;
background : linear-gradient ( 135 deg , rgba ( 74 , 158 , 255 , 0.1 ), rgba ( 74 , 158 , 255 , 0.05 ));
border-bottom : 1 px solid rgba ( 74 , 158 , 255 , 0.3 );
border-radius : 10 px 10 px 0 0 ;
cursor : move ;
flex-shrink : 0 ; /* Prevent header from shrinking */
}
. word-info-title {
font-size : 28 px ; /* enlarged title */
font-weight : 600 ;
color : #4a9eff ;
margin : 0 ;
word-break : break-word ;
}
. word-info-close {
background : none ;
border : none ;
color : #e0e0e0 ;
font-size : 20 px ;
cursor : pointer ;
padding : 5 px ;
border-radius : 4 px ;
transition : all 0.2 s ease ;
display : flex ;
align-items : center ;
justify-content : center ;
width : 30 px ;
height : 30 px ;
}
. word-info-close : hover {
background : rgba ( 255 , 255 , 255 , 0.1 );
color : #ff6b6b ;
transform : rotate ( 90 deg );
}
. word-info-content {
padding : 20 px 20 px 40 px 20 px ; /* increased bottom padding to prevent cutoff */
overflow-y : auto ; /* allow scrolling inside when content exceeds max-height */
overflow-x : hidden ; /* prevent horizontal scrolling */
flex : 1 ; /* Take remaining space in flex container */
min-height : 0 ; /* Allow flex item to shrink below content size */
/* Smooth scrolling */
scroll-behavior : smooth ;
/* Custom scrollbar styling */
scrollbar-width : thin ;
scrollbar-color : rgba ( 74 , 158 , 255 , 0.5 ) rgba ( 30 , 30 , 30 , 0.5 );
}
. word-info-section {
margin-bottom : 18 px ;
}
. word-info-section : last-child {
margin-bottom : 0 ;
padding-bottom : 12 px ; /* increased padding to last section to prevent cutoff */
}
. word-info-label {
font-size : 18 px ; /* larger section labels */
font-weight : 600 ;
color : #888 ;
text-transform : uppercase ;
letter-spacing : 0.5 px ;
margin-bottom : 6 px ;
display : block ;
}
. word-info-value {
font-size : 1.25 em ; /* scale with popup base font-size */
color : #e0e0e0 ;
line-height : 1.4 ;
word-break : break-word ;
}
. word-info-value . hebrew {
font-size : 1.35 em ; /* larger for script legibility */
direction : rtl ;
text-align : right ;
font-family : 'SBL Hebrew' , 'Times New Roman' , serif ;
}
. word-info-value . wlca-hit ,
. word-info-value . ntgt-hit {
text-decoration : underline ;
text-decoration-color : #4a9eff ;
text-decoration-thickness : 2 px ;
text-underline-offset : 3 px ;
}
. word-info-value . bdbt . bdbt-lexeme {
font-size : 1.4 em ;
font-weight : 600 ;
margin-bottom : 10 px ; /* increased from 8px for better spacing */
}
. word-info-value . bdbt . bdbt-meta {
font-size : 0.95 em ;
color : #c8c8c8 ;
margin-bottom : 8 px ; /* increased from 6px for better spacing */
margin-top : 2 px ;
direction : ltr ;
text-align : left ;
}
. word-info-value . bdbt . bdbt-meta : last-of-type {
margin-bottom : 10 px ; /* extra space before definition */
}
. word-info-value . bdbt . bdbt-definition {
margin-top : 12 px ; /* increased from 10px */
margin-bottom : 4 px ; /* add bottom margin to prevent cutoff */
direction : ltr ;
text-align : left ;
line-height : 1.5 ; /* better line spacing for readability */
}
/* Remove hyperlinks from popup content - make them non-clickable */
. word-info-popup a ,
. word-info-content a ,
. word-info-value a ,
. bdbt-definition a {
pointer-events : none ;
cursor : default ;
text-decoration : none ;
color : inherit ;
}
. word-info-popup a : hover ,
. word-info-content a : hover ,
. word-info-value a : hover ,
. bdbt-definition a : hover {
text-decoration : none ;
color : inherit ;
}
. word-info-value . bdbt . bdbt-missing ,
. word-info-value . wlca-missing ,
. word-info-value . ntgt-missing {
color : #888 ;
font-style : italic ;
}
. word-info-value . greek {
font-size : 1.3 em ;
font-family : 'SBL Greek' , 'Times New Roman' , serif ;
}
. word-info-value . frequency {
color : #4a9eff ;
font-weight : 600 ;
}
/* Accordance section styling */
. word-info-section . accordance-section {
margin-top : 12 px ;
padding-top : 12 px ;
border-top : 1 px solid rgba ( 255 , 255 , 255 , 0.1 );
}
. word-info-value . accordance {
font-size : 1.1 em ;
color : #d0d0d0 ;
}
. accordance-item {
margin-bottom : 10 px ;
padding : 8 px 0 ;
line-height : 1.5 ;
}
. accordance-item : last-child {
margin-bottom : 0 ;
}
. accordance-item strong {
color : #4a9eff ;
font-weight : 600 ;
margin-right : 8 px ;
}
. accordance-refs ,
. accordance-commentaries {
list-style : none ;
padding-left : 0 ;
margin-top : 6 px ;
}
. accordance-refs li ,
. accordance-commentaries li {
padding : 4 px 0 ;
padding-left : 16 px ;
position : relative ;
color : #b0b0b0 ;
}
. accordance-refs li :: before ,
. accordance-commentaries li :: before {
content : "•" ;
position : absolute ;
left : 0 ;
color : #4a9eff ;
}
. word-info-divider {
height : 1 px ;
background : linear-gradient ( 90 deg , transparent , rgba ( 74 , 158 , 255 , 0.3 ), transparent );
margin : 16 px 0 ;
}
/* Popup animations */
@ keyframes popupSlideIn {
0 % {
opacity : 0 ;
transform : scale ( 0.8 ) translateY ( -20 px );
}
100 % {
opacity : 1 ;
transform : scale ( 1 ) translateY ( 0 );
}
}
@ keyframes popupSlideOut {
0 % {
opacity : 1 ;
transform : scale ( 1 ) translateY ( 0 );
}
100 % {
opacity : 0 ;
transform : scale ( 0.8 ) translateY ( -20 px );
}
}
@ keyframes popupHighlight {
0 % {
box-shadow : 0 8 px 25 px rgba ( 0 , 0 , 0 , 0.6 );
border-color : transparent ;
}
50 % {
box-shadow : 0 12 px 35 px rgba ( 74 , 158 , 255 , 0.8 ), 0 0 25 px rgba ( 74 , 158 , 255 , 0.5 );
border-color : #4a9eff ;
transform : scale ( 1.02 );
}
100 % {
box-shadow : 0 8 px 25 px rgba ( 0 , 0 , 0 , 0.6 );
border-color : transparent ;
transform : scale ( 1 );
}
}
. word-info-popup . highlight-existing {
animation : popupHighlight 0.5 s ease-in-out ;
}
/* Touch device optimizations for popup */
@ media ( pointer : coarse ) {
. word-info-popup {
min-width : 280 px ;
max-width : 320 px ;
}
. word-info-header {
padding : 18 px 20 px ;
}
. word-info-close {
width : 35 px ;
height : 35 px ;
font-size : 22 px ;
}
. word-info-content {
padding : 18 px 18 px 40 px 18 px ; /* increased bottom padding on touch devices to prevent cutoff */
}
}
/* Clear button pulsing animation */
@ keyframes clearButtonPulse {
0 % {
transform : scale ( 1.05 );
box-shadow : 0 0 20 px rgba ( 255 , 68 , 68 , 0.6 );
}
100 % {
transform : scale ( 1.08 );
box-shadow : 0 0 30 px rgba ( 255 , 68 , 68 , 0.8 );
}
}
/* Progress indicator styling - enhanced for cross-platform compatibility */
# clearProgressIndicator {
position : absolute ;
top : -2 px ;
left : 0 ;
width : 0 % ;
height : 3 px ;
background : linear-gradient ( 90 deg , #ff4444 , #ff6666 );
border-radius : 3 px 3 px 0 0 ;
transition : none ; /* Controlled by JavaScript for smooth animation */
pointer-events : none ;
z-index : 10 ;
opacity : 1 ;
/* Enhanced cross-platform support */
backface-visibility : hidden ;
transform : translateZ ( 0 );
will-change : width ;
/* Touch device optimization */
-webkit- transform : translateZ ( 0 );
-webkit- backface-visibility : hidden ;
/* Classic thin bar styling */
box-shadow : 0 1 px 2 px rgba ( 255 , 68 , 68 , 0.6 );
}
/* Hide scrollbars everywhere */
. reading-area , . tab-content , body , html {
scrollbar-width : none !important ; /* Firefox */
-ms- overflow-style : none !important ; /* IE 10+ */
}
. reading-area :: -webkit-scrollbar , . tab-content :: -webkit-scrollbar , body :: -webkit-scrollbar , html :: -webkit-scrollbar {
display : none !important ;
width : 0 !important ;
background : transparent !important ;
}
/* Hide scrollbars for all elements */
* {
scrollbar-width : none !important ; /* Firefox */
-ms- overflow-style : none !important ; /* IE 10+ */
}
* :: -webkit-scrollbar {
display : none !important ;
width : 0 !important ;
background : transparent !important ;
}
/* Remove white area at bottom: ensure .tab-content and .reading-area fill space */
html , body {
background-color : #000000 !important ;
color-scheme : dark ;
}
/* iPad/Safari: force dark backgrounds on all major containers to prevent white flashes */
# app ,
. tab-content ,
. tab-panel ,
. selector-container ,
. selection-content ,
. translation-bar ,
. card-grid ,
. content-wrapper {
background-color : #000000 !important ;
}
/* iPad/Safari: ensure tiles never invert to white when active */
. selection-card ,
. verse-card {
background-color : #2a2a2a !important ;
border-color : #404040 !important ;
}
. selection-card : active ,
. verse-card : active {
background-color : #3a3a3a !important ;
}
# app {
min-height : 100 vh ;
display : flex ;
flex-direction : column ;
}
. tab-content {
flex : 1 ;
display : flex ;
flex-direction : column ;
/* Avoid nested scrolling; selection-content handles scrolling */
overflow : hidden ;
background : #000000 !important ;
}
. reading-area {
flex : 1 ;
position : relative ;
overflow-y : auto ;
overflow-x : hidden ;
background : #000000 !important ;
/* Constrain height so passages can scroll within viewport */
height : 100 vh ;
max-height : 100 vh ;
/* PORTRAIT MODE FIX: Use dvh for better portrait support on touch devices */
height : 100 dvh ;
max-height : 100 dvh ;
/* Fallback for older browsers */
height : calc ( 100 vh - env ( keyboard - inset - height , 0 px ));
max-height : calc ( 100 vh - env ( keyboard - inset - height , 0 px ));
/* Enforce two-finger scrolling; tools override as needed */
touch-action : none ;
-webkit- overflow-scrolling : touch ;
overscroll-behavior : contain ;
/* PORTRAIT MODE FIX: Ensure proper dimensions in portrait */
min-height : 0 ;
width : 100 % ;
}
/* When a drawing tool is active, enable pointer events on the canvas (add a class in JS if needed) */
. annotation-canvas . drawing-enabled {
pointer-events : auto ;
}
/* Enhanced hover effects for undo/redo/clear buttons - works on all devices */
# undoBtn : hover : not ( : disabled ),
# redoBtn : hover : not ( : disabled ),
# resetBtn : hover : not ( : disabled ) {
background : #404040 !important ;
border-color : #4a9eff !important ;
transform : translateY ( -1 px ) !important ;
box-shadow : 0 4 px 8 px rgba ( 74 , 158 , 255 , 0.3 ), 0 0 12 px rgba ( 74 , 158 , 255 , 0.2 ) !important ;
transition : all 0.15 s ease !important ;
}
/* Comprehensive hover effect disabling for touch devices - but preserve button effects */
@ media ( hover : none ) and ( pointer : coarse ) {
/* Disable ALL hover states completely but preserve colors */
* : hover {
background : inherit !important ;
border-color : inherit !important ;
transform : none !important ;
box-shadow : inherit !important ;
opacity : inherit !important ;
filter : none !important ;
/* Don't override color - let elements keep their colors */
}
/* Specific UI element hover disabling but preserve colors */
. tab : hover ,
. new-tab-btn : hover ,
. tool-icon : hover ,
. load-btn : hover ,
. chapter-select : hover ,
. verse-select : hover ,
. book-select : hover ,
. translation-select : hover {
background : transparent !important ;
border-color : inherit !important ;
transform : none !important ;
box-shadow : none !important ;
transition : none !important ;
}
}
/* Force proper tool states on touch devices using feature detection */
@ media ( pointer : coarse ) {
/* Completely override any hover effects for tools */
. tool-icon {
transition : none !important ;
}
. tool-icon : hover ,
. tool-icon : focus ,
. tool-icon : active {
background : transparent !important ;
/* Don't override color - let each tool keep its specific color */
border : none !important ;
box-shadow : none !important ;
transform : none !important ;
}
/* Force pen tool color */
. tool-icon [ data-tool = "pen" ] {
color : var ( -- pen - color , #ffff00 ) !important ;
}
. tool-icon [ data-tool = "pen" ] : hover ,
. tool-icon [ data-tool = "pen" ] : focus ,
. tool-icon [ data-tool = "pen" ] : active {
color : var ( -- pen - color , #ffff00 ) !important ;
background : transparent !important ;
}
/* Force highlighter tool color */
. tool-icon [ data-tool = "highlight" ] {
color : var ( -- highlighter - color , #ffff00 ) !important ;
}
. tool-icon [ data-tool = "highlight" ] : hover ,
. tool-icon [ data-tool = "highlight" ] : focus ,
. tool-icon [ data-tool = "highlight" ] : active {
color : var ( -- highlighter - color , #ffff00 ) !important ;
background : transparent !important ;
}
/* Force eraser tool color */
. tool-icon [ data-tool = "erase" ] {
color : #ffb6c1 !important ;
}
. tool-icon [ data-tool = "erase" ] : hover ,
. tool-icon [ data-tool = "erase" ] : focus ,
. tool-icon [ data-tool = "erase" ] : active {
color : #ffb6c1 !important ;
background : transparent !important ;
}
/* Disable tab hover effects completely but preserve text color */
. tab : hover {
background : transparent !important ;
/* Don't override color - let tabs keep their text color */
}
/* Disable new tab button hover effects */
. new-tab-btn : hover {
background : #232323 !important ;
color : #4a9eff !important ;
box-shadow : 0 2 px 8 px rgba ( 0 , 0 , 0 , 0.08 ) !important ;
}
}
/* Additional optimizations for detected touch devices */
. touch-device . tab : hover ,
. touch-device . new-tab-btn : hover ,
. touch-device . tool-icon : hover ,
. touch-device . toolbar-btn : hover {
background : initial !important ;
/* Don't reset color - preserve each element's intended color */
border-color : initial !important ;
transform : none !important ;
box-shadow : initial !important ;
transition : none !important ;
}
/* GLOBAL: Disable native text selection and touch callouts everywhere */
html , body , *, * :: before , * :: after {
-webkit- user-select : none !important ;
-moz- user-select : none !important ;
-ms- user-select : none !important ;
user-select : none !important ;
-webkit- touch-callout : none !important ;
}
/* Ensure tab text stays light gray on touch devices */
. touch-device . tab . tab-title ,
. tab . tab-title {
color : #e0e0e0 !important ;
}
/* Ensure proper tool states on touch devices */
. touch-device . tool-icon . selected {
background : #333 !important ;
color : #4a9eff !important ;
}
. touch-device . tool-icon [ data-tool = "pen" ] . selected {
background : #333 !important ;
color : var ( -- pen - color , #ffff00 ) !important ;
}
. touch-device . tool-icon [ data-tool = "highlight" ] . selected {
background : #333 !important ;
border : 2 px solid var ( -- highlighter - color , #ffff00 ) !important ;
color : var ( -- highlighter - color , #ffff00 ) !important ;
box-shadow : 0 0 0 2 px var ( -- highlighter - color , #ffff00 ), 0 0 8 px rgba ( 255 , 255 , 0 , 0.5 );
}
. touch-device . tool-icon [ data-tool = "erase" ] . selected {
background : #333 !important ;
border : 2 px solid #ffb6c1 !important ;
color : #ffb6c1 !important ;
box-shadow : 0 0 0 2 px #ffb6c1 , 0 0 8 px rgba ( 255 , 182 , 193 , 0.5 ) !important ;
}
/* Touch-specific optimizations */
@ media ( pointer : coarse ) {
/* Make touch targets larger for better usability */
. tab {
min-height : 44 px ;
touch-action : manipulation ;
}
. new-tab-btn {
min-width : 44 px ;
min-height : 44 px ;
touch-action : manipulation ;
}
. tool-icon {
min-width : 44 px ;
min-height : 44 px ;
touch-action : manipulation ;
}
/* Prevent text selection on touch devices for UI elements */
. tab ,
. new-tab-btn ,
. tool-icon ,
. toolbar-btn {
-webkit- user-select : none ;
-moz- user-select : none ;
-ms- user-select : none ;
user-select : none ;
-webkit- touch-callout : none ;
}
}
/* Card-Based Selector Styles */
. selector-container {
padding : 0 ;
background : transparent ;
border : none ;
margin : 0 ;
/* Make selector fill available space and allow inner content to scroll */
display : flex ;
flex-direction : column ;
flex : 1 1 auto ;
min-height : 0 ;
height : 100 % ;
}
. translation-bar {
display : flex ;
align-items : center ;
padding : 0 25 px ; /* match chapter header vertical size */
height : var ( -- header - band - height ) !important ;
min-height : var ( -- header - band - height ) !important ;
background : rgba ( 35 , 35 , 35 , 0.95 );
backdrop-filter : blur ( 10 px );
border-bottom : none ; /* replaced by full-width separator */
position : sticky ;
top : var ( -- safe - area - top );
z-index : 5 ;
touch-action : none ; /* enforce two-finger scroll */
}
. translation-bar :: after {
content : '' ;
position : absolute ;
left : calc ( var ( -- safe - area - left ) * -1 );
right : calc ( var ( -- safe - area - right ) * -1 );
bottom : 0 ;
height : 1 px ;
background : #404040 ;
pointer-events : none ;
}
. back-button-area {
position : absolute ;
left : 25 px ;
display : flex ;
align-items : center ;
}
/* Back button shown over passage to return to selector */
. header-back-btn [ data-action = "back-to-selector" ] {
position : absolute ;
top : 50 % ;
left : 12 px ;
transform : translateY ( -50 % );
z-index : 10 ;
background : #2a2a2a ;
color : #e0e0e0 ;
border : 2 px solid #404040 ; /* match other buttons */
border-radius : 8 px ;
padding : 8 px 16 px ; /* standard size */
cursor : pointer ;
}
. header-back-btn [ data-action = "back-to-selector" ] i {
margin : 0 ;
}
. translation-label {
display : none ;
}
. translation-options {
display : flex ;
gap : 10 px ;
flex-wrap : wrap ;
justify-content : center ;
width : 100 % ;
}
/* OT/NT filter buttons container sits to the left of translation buttons */
. translation-bar . canon-filter {
display : inline-flex ;
gap : 8 px ;
margin-right : 10 px ;
}
. translation-btn {
padding : 8 px 16 px ;
border : 2 px solid #404040 ;
border-radius : 8 px ;
background : #2a2a2a ;
color : #e0e0e0 ;
font-size : 14 px ;
font-weight : 500 ;
cursor : pointer ;
transition : all 0.2 s ease ;
min-width : 50 px ;
text-align : center ;
}
/* Ensure back button in translation bar matches translation buttons */
/* remove special sizing override for back button inside translation bar */
. translation-btn : hover {
border-color : #4a9eff ;
box-shadow : 0 2 px 8 px rgba ( 74 , 158 , 255 , 0.3 );
}
. translation-btn . selected {
background : #4a9eff ;
border-color : #4a9eff ;
color : #ffffff ;
box-shadow : 0 2 px 8 px rgba ( 74 , 158 , 255 , 0.4 );
}
. translation-empty {
width : 100 % ;
padding : 10 px 14 px ;
border : 1 px dashed #555 ;
border-radius : 8 px ;
color : #bbb ;
background : rgba ( 42 , 42 , 42 , 0.7 );
text-align : center ;
font-size : 13 px ;
}
. translation-dropdown-empty {
min-width : 220 px ;
padding : 10 px 12 px ;
color : #bbb ;
font-size : 13 px ;
line-height : 1.35 ;
text-align : center ;
}
/* Mobile Responsive Styles */
@ media ( max-width : 768px ) {
. translation-bar {
padding : 15 px 20 px ;
}
. back-button-area {
position : static ;
margin-bottom : 10 px ;
}
. translation-options {
justify-content : center ;
}
. translation-btn {
flex : 0 1 auto ;
min-width : 60 px ;
}
. selection-content {
padding : 20 px 15 px ;
}
. stage-title {
font-size : 20 px ;
margin-bottom : 15 px ;
}
. card-grid {
grid-template-columns : repeat ( auto - fill , minmax ( 150 px , 1 fr ));
gap : 12 px ;
}
# verseCards {
grid-template-columns : repeat ( auto - fill , minmax ( 150 px , 1 fr ));
gap : 12 px ;
}
. selection-card {
padding : 20 px ;
}
. card-title {
font-size : 16 px ;
}
. verse-card {
min-height : 45 px ;
}
. verse-number {
font-size : 14 px ;
}
. load-passage-btn {
padding : 12 px 24 px ;
font-size : 14 px ;
}
}
/* Touch Device Enhancements */
@ media ( pointer : coarse ) {
. selection-card ,
. verse-card ,
. translation-btn ,
. breadcrumb-btn ,
. load-passage-btn {
min-height : 48 px ;
}
. verse-card {
min-height : 52 px ;
}
. selection-card : hover {
transform : none ;
}
. load-passage-btn : hover {
transform : none ;
}
}
/* Header Back Button Styles */
. header-back-btn {
display : flex ;
align-items : center ;
gap : 8 px ;
padding : 8 px 16 px ; /* match translation button sizing */
background : #2a2a2a ;
border : 2 px solid #404040 ;
border-radius : 8 px ;
color : #e0e0e0 ;
cursor : pointer ;
transition : all 0.2 s ease ;
font-size : 14 px ;
font-weight : 500 ;
}
. chapter-left-controls {
white-space : nowrap ; /* keep back + up/down on a single line */
}
/* Slimmer Up/Down chapter nav buttons that visually match the back button */
. header-nav-btn {
padding : 6 px 10 px ; /* slimmer than the back button */
min-width : 32 px ;
height : 32 px ;
display : inline-flex ;
align-items : center ;
justify-content : center ;
border-radius : 8 px ; /* match back button radius */
}
/* In chapter header, make +5/-5 buttons match back/top/bottom size */
. chapter-header . header-nav-btn {
padding : 8 px 16 px !important ;
height : auto !important ;
min-width : 42 px !important ;
font-size : 14 px !important ;
line-height : 1 !important ;
}
/* Remove persistent highlight/focus/active styling on header buttons (touch holds) */
. chapter-header . header-back-btn ,
. chapter-header . header-top-btn ,
. chapter-header . header-down-btn ,
. chapter-header . header-nav-btn {
outline : none !important ;
box-shadow : none !important ;
}
. chapter-header . header-back-btn : hover ,
. chapter-header . header-back-btn : active ,
. chapter-header . header-back-btn : focus ,
. chapter-header . header-top-btn : hover ,
. chapter-header . header-top-btn : active ,
. chapter-header . header-top-btn : focus ,
. chapter-header . header-down-btn : hover ,
. chapter-header . header-down-btn : active ,
. chapter-header . header-down-btn : focus ,
. chapter-header . header-nav-btn : hover ,
. chapter-header . header-nav-btn : active ,
. chapter-header . header-nav-btn : focus {
background : #2a2a2a !important ;
border-color : #404040 !important ;
transform : none !important ;
box-shadow : none !important ;
}
. header-nav-btn i {
font-size : 14 px ; /* smaller icon for sleeker look */
line-height : 1 ;
}
/* Removed 3-finger gesture feedback styles per user request */
/* Ensure cluster spacing is tight and stable on TVs */
. chapter-left-controls . chapter-nav-btns { gap : 6 px ; }
. header-back-btn : hover {
border-color : #4a9eff ;
box-shadow : 0 2 px 8 px rgba ( 74 , 158 , 255 , 0.3 );
}
. header-back-btn i {
font-size : 14 px ; /* match translation button text size */
}
. selection-content {
padding : 25 px ;
background : #000000 !important ; /* force black for Notes; bible selectors are overridden below if needed */
/* Fill remaining space to bottom of viewport like passages */
flex : 1 1 auto ;
min-height : 0 ;
max-height : none ; /* let inner grids control scroll so headroom works */
overflow-y : auto ;
-webkit- overflow-scrolling : touch ;
/* Allow natural one-finger vertical scroll in selectors */
touch-action : pan-y ;
padding-bottom : 16 px ;
}
[ id ^= "pointsCards" ],
. selector-container ,
. card-grid {
background : transparent !important ;
}
/* Provide even more scroll affordance for book and chapter grids in portrait */
/* Removed grid ::after spacer that caused bottom-row tiles to stretch */
. selection-stage {
transition : all 0.3 s ease ;
}
. selection-stage . hidden {
display : none ;
}
/* When a stage is visible, ensure its grid overflows and scrolls */
. selection-stage : not ( . hidden ) . card-grid ,
. selection-stage : not ( . hidden ) [ id ^= "bookCards" ],
. selection-stage : not ( . hidden ) [ id ^= "chapterCards" ],
. selection-stage : not ( . hidden ) [ id ^= "verseCards" ] {
overflow-y : auto ;
max-height : none ;
}
. stage-title {
font-size : 24 px ;
font-weight : 600 ;
color : #e0e0e0 ;
margin-bottom : 20 px ;
text-align : center ;
}
. stage-breadcrumb {
margin-bottom : 20 px ;
display : flex ;
justify-content : center ;
}
. breadcrumb-btn {
display : flex ;
align-items : center ;
gap : 8 px ;
padding : 10 px 16 px ;
background : #2a2a2a ;
border : 2 px solid #404040 ;
border-radius : 8 px ;
color : #e0e0e0 ;
cursor : pointer ;
transition : all 0.2 s ease ;
font-size : 14 px ;
font-weight : 500 ;
}
. breadcrumb-btn : hover {
border-color : #4a9eff ;
box-shadow : 0 2 px 8 px rgba ( 74 , 158 , 255 , 0.3 );
}
. card-grid {
display : grid ;
grid-template-columns : repeat ( auto - fill , minmax ( 270 px , 1 fr ));
gap : 23 px ;
margin-bottom : 29 px ;
align-content : start ; /* prevent rows from stretching vertically */
}
/* Force exactly four columns across for book selection grid */
[ id ^= "bookCards" ] {
grid-template-columns : repeat ( 4 , 1 fr );
}
/* Force exactly four columns for chapters and verses to match books */
[ id ^= "chapterCards" ],
[ id ^= "verseCards" ] {
grid-template-columns : repeat ( 4 , 1 fr );
}
/* FINAL OVERRIDE: ensure verse grid always renders 4 columns regardless of earlier rules */
[ id ^= "verseCards" ] {
grid-template-columns : repeat ( 4 , 1 fr ) !important ;
}
/* Ensure chapter and verse tiles exactly match book tile sizing */
[ id ^= "chapterCards" ] . selection-card ,
[ id ^= "verseCards" ] . selection-card {
height : 114 px ;
padding : 29 px ;
}
[ id ^= "chapterCards" ] . card-title ,
[ id ^= "verseCards" ] . card-title {
font-size : 26 px ;
}
[ id ^= "verseCards" ] {
grid-template-columns : repeat ( auto - fill , minmax ( 270 px , 1 fr ));
gap : 23 px ;
/* Allow one-finger vertical scroll */
touch-action : pan-y ;
overflow-y : auto ;
max-height : none ;
padding-bottom : 16 px ;
}
/* Also disable native pan on book and chapter grids to enforce two-finger */
/* Allow container to be the stable scroll target for two-finger gestures */
. selection-content {
touch-action : none !important ;
/* Ensure it can actually scroll as a viewport-sized container */
max-height : calc ( 100 vh - 0 px ) !important ;
overflow-y : auto !important ;
}
[ id ^= "bookCards" ],
[ id ^= "chapterCards" ],
[ id ^= "verseCards" ] {
/* Keep two-finger preference but let JS decide the scroll target */
touch-action : none ;
overflow-y : auto ;
max-height : none ;
/* Small base padding only; no large spacer rows */
padding-bottom : 16 px ;
-webkit- overflow-scrolling : touch ;
align-content : start ;
}
/* Spacer row that doesn't stretch last tiles: forces its own grid row */
[ id ^= "bookCards" ] :: after ,
[ id ^= "chapterCards" ] :: after ,
[ id ^= "verseCards" ] :: after {
/* Remove spacer that created a large black area at the bottom */
content : '' ;
display : none !important ;
height : 0 !important ;
grid-column : 1 / -1 ;
pointer-events : none ;
}
/* Portrait fix: ensure book grid fully scrolls and is easy to pan vertically */
/* No special portrait override needed now; JS computes exact height */
/* Ensure all selector grids inside selection-content are scrollable with two-finger JS */
. selection-content . card-grid {
overflow-y : auto ;
max-height : none ;
touch-action : pan-y ;
/* Small bottom padding for reach; passages style */
padding-bottom : 16 px ;
}
. selection-card {
background : #2a2a2a ;
border : 2 px solid #404040 ;
border-radius : 12 px ;
padding : 29 px ;
cursor : pointer ;
transition : all 0.2 s ease ;
position : relative ;
overflow : hidden ;
user-select : none ;
height : 114 px ; /* uniform tile height (halfway between 84 and 144) */
box-sizing : border-box ;
}
. selection-card : hover {
border-color : #4a9eff ;
box-shadow : 0 4 px 12 px rgba ( 74 , 158 , 255 , 0.3 );
}
. selection-card . selected {
background : #4a9eff ;
border-color : #4a9eff ;
color : #ffffff ;
box-shadow : 0 4 px 12 px rgba ( 74 , 158 , 255 , 0.4 );
}
. selection-card . range-start ,
. selection-card . range-end {
background : #4a9eff ;
border-color : #4a9eff ;
color : #ffffff ;
box-shadow : 0 4 px 12 px rgba ( 74 , 158 , 255 , 0.4 );
}
. card-content {
display : flex ;
flex-direction : column ;
gap : 8 px ;
justify-content : center ;
align-items : center ;
height : 100 % ;
}
. card-title {
font-size : 26 px ; /* bumped up for better readability */
font-weight : 500 ;
color : inherit ;
text-align : center ;
white-space : nowrap ;
overflow : hidden ;
text-overflow : ellipsis ;
}
. card-info {
font-size : 13 px ;
color : #888 ;
font-weight : 400 ;
}
/* Keep verse selection tiles visually consistent with chapter/book tiles */
. verse-card {
background : #2a2a2a ;
border : 2 px solid #404040 ;
border-radius : 12 px ;
padding : 29 px ;
cursor : pointer ;
transition : all 0.2 s ease ;
position : relative ;
display : flex ;
align-items : center ;
justify-content : center ;
height : 114 px ; /* match selection-card */
user-select : none ;
}
. verse-card : hover {
border-color : #4a9eff ;
box-shadow : 0 2 px 8 px rgba ( 74 , 158 , 255 , 0.3 );
}
. verse-card . selected {
background : #4a9eff ;
border-color : #4a9eff ;
color : #ffffff ;
}
. verse-card . range-start {
background : linear-gradient ( 135 deg , #4a9eff , #357abd );
border-color : #4a9eff ;
color : #ffffff ;
}
. verse-card . range-end {
background : linear-gradient ( 135 deg , #357abd , #4a9eff );
border-color : #4a9eff ;
color : #ffffff ;
}
. verse-number {
font-size : 16 px ;
font-weight : 600 ;
color : inherit ;
}
. verse-selection-info {
text-align : center ;
color : #888 ;
font-size : 14 px ;
margin-bottom : 20 px ;
font-style : italic ;
}
. load-button-container {
display : flex ;
justify-content : center ;
margin-top : 30 px ;
}
. load-passage-btn {
display : flex ;
align-items : center ;
gap : 10 px ;
padding : 15 px 30 px ;
background : linear-gradient ( 135 deg , #28a745 , #20c997 );
border : none ;
border-radius : 12 px ;
color : #ffffff ;
font-size : 16 px ;
font-weight : 600 ;
cursor : pointer ;
transition : all 0.2 s ease ;
box-shadow : 0 4 px 12 px rgba ( 40 , 167 , 69 , 0.3 );
}
. load-passage-btn : hover {
transform : translateY ( -2 px );
box-shadow : 0 6 px 16 px rgba ( 40 , 167 , 69 , 0.4 );
}
. load-passage-btn : active {
transform : translateY ( 0 );
box-shadow : 0 2 px 8 px rgba ( 40 , 167 , 69 , 0.3 );
}
/* Animation for stage transitions */
@ keyframes slideIn {
from {
opacity : 0 ;
transform : translateX ( 20 px );
}
to {
opacity : 1 ;
transform : translateX ( 0 );
}
}
. selection-stage : not ( . hidden ) {
animation : slideIn 0.3 s ease ;
}
/* Hide old selector styles when not needed */
. passage-selector ,
. selector-row {
display : none ;
}
/* Smooth fade-in for passage display */
@ keyframes smoothFadeIn {
from { opacity : 0 ; transform : translateY ( 6 px ); }
to { opacity : 1 ; transform : translateY ( 0 ); }
}
. smooth-fade-in {
animation : smoothFadeIn 220 ms ease-out both ;
}
/* Slides: fade-in for first page to match Bible tab */
. slides-first-fade-in {
animation : smoothFadeIn 220 ms ease-out both ;
}
/* Splash Screen Overlay */
. splash-overlay {
position : fixed ;
inset : 0 ;
z-index : 30000 ;
background : #000 ;
display : flex ;
align-items : center ;
justify-content : center ;
opacity : 1 ;
visibility : visible ;
transition : opacity 300 ms ease , visibility 300 ms ease ;
}
. splash-overlay . hidden {
opacity : 0 ;
visibility : hidden ;
pointer-events : none ;
}
. splash-overlay img . splash-image {
max-width : 100 vw ;
max-height : 100 vh ;
width : 100 % ;
height : 100 % ;
object-fit : contain ;
user-select : none ;
-webkit- user-drag : none ;
pointer-events : none ;
}
/* Pure Black Background Overrides: ensure all grey backgrounds are #000000 */
html , body {
background : #000000 !important ;
background-color : #000000 !important ;
}
# app ,
. tab-content ,
. tab-panel ,
. reading-area ,
. bible-text ,
. chapter-header ,
. selector-container ,
. selection-content ,
. translation-bar ,
. dropdown-content ,
. dropdown-btn ,
. toolbar-btn ,
. tool-rail ,
. tool-rail . tool-icon ,
. color-dropdown ,
. pen-color-dropdown ,
. highlighter-color-dropdown ,
. media-workspace ,
. media-thumbnails-section ,
. media-canvas ,
. media-card . card-thumbnail ,
. drive-section ,
. drive-viewer ,
. media-notes ,
. help-section ,
. chapter-select ,
. verse-select ,
. book-select ,
. translation-select ,
[ id ^= "bookCards" ],
[ id ^= "chapterCards" ],
[ id ^= "verseCards" ] {
background : #000000 !important ;
background-color : #000000 !important ;
}
/* Notes tab: force the selector area behind point buttons to pure black */
[ id ^= "mediaSelectorContainer" ],
[ id ^= "mediaSelectionContent" ],
[ id ^= "pointsStage" ] {
background : #000000 !important ;
background-color : #000000 !important ;
}
/* Ensure the tab-panel and tab-content also render pure black behind any overflow */
. tab-panel , . tab-content {
background : #000000 !important ;
}
/* Media tab: centered graphic viewer */
. media-tab-body {
padding : 16 px ;
}
. media-tab-stage {
width : 100 % ;
display : flex ;
justify-content : center ;
}
. media-tab-image {
max-width : 1200 px ;
width : 100 % ;
height : auto ;
border-radius : 10 px ;
box-shadow : 0 14 px 32 px rgba ( 0 , 0 , 0 , 0.45 );
background : #111111 ;
}
. media-tab-placeholder {
color : #d8d8d8 ;
text-align : center ;
padding : 18 px ;
}
/* Safe area removal overrides: Windows touchscreen TV full-bleed */
: root {
--safe-area-top : 0 px !important ;
--safe-area-left : 0 px !important ;
--safe-area-right : 0 px !important ;
}
/* Remove all side paddings controlled by safe areas */
# app {
padding-left : 0 !important ;
padding-right : 0 !important ;
}
/* Remove any top spacer */
# app :: before {
content : '' !important ;
display : none !important ;
height : 0 !important ;
}
/* Ensure sticky headers anchor to the very top */
. chapter-header ,
. translation-bar {
top : 0 !important ;
}
/* FINAL: Lock root scrolling and rely on internal containers for scroll */
html , body {
overflow : hidden !important ;
overscroll-behavior : none !important ;
}
# app {
height : 100 vh !important ;
max-height : 100 vh !important ;
}
. reading-area {
height : auto !important ;
max-height : none !important ;
flex : 1 1 auto !important ;
}
/* Menu tool icon styling - matches other tool icons */
. tool-icon [ data-tool = "menu" ] {
color : #e0e0e0 !important ;
}
. tool-icon [ data-tool = "menu" ] : hover ,
. tool-icon [ data-tool = "menu" ] : focus ,
. tool-icon [ data-tool = "menu" ] : active {
color : #4a9eff !important ;
background : #333 !important ;
}
. tool-icon [ data-tool = "menu" ] . selected ,
. tool-icon [ data-tool = "menu" ] . selected : hover ,
. tool-icon [ data-tool = "menu" ] . selected : focus ,
. tool-icon [ data-tool = "menu" ] . selected : active {
background : #333 !important ;
border : 2 px solid #4a9eff !important ;
color : #4a9eff !important ;
box-shadow : 0 0 0 2 px #4a9eff , 0 0 8 px rgba ( 74 , 158 , 255 , 0.5 ) !important ;
}
/* Touch Menu Overlay */
. touch-menu-overlay {
position : fixed ;
inset : 0 ;
background : rgba ( 0 , 0 , 0 , 0.85 );
z-index : 20000 ;
display : flex ;
align-items : flex-start ; /* sit near the top... */
justify-content : center ;
padding-top : 12 vh ; /* ...but not at the very top — near standing line of sight */
opacity : 1 ;
visibility : visible ;
transition : opacity 0.3 s ease , visibility 0.3 s ease ;
-webkit- tap-highlight-color : transparent ;
}
. touch-menu-overlay . hidden {
opacity : 0 ;
visibility : hidden ;
pointer-events : none ;
}
. touch-menu-content {
background : rgba ( 26 , 26 , 26 , 0.95 );
border : 2 px solid #404040 ;
border-radius : 16 px ;
padding : 24 px ;
padding-top : 50 px ; /* Extra top padding to prevent overlap with close button */
min-width : 320 px ;
max-width : 90 vw ;
position : relative ;
box-shadow : 0 8 px 32 px rgba ( 0 , 0 , 0 , 0.6 );
backdrop-filter : blur ( 4 px );
}
. touch-menu-close {
position : absolute ;
top : 12 px ;
right : 12 px ;
width : 36 px ;
height : 36 px ;
border-radius : 50 % ;
background : transparent ;
border : 2 px solid #404040 ;
color : #e0e0e0 ;
font-size : 16 px ;
cursor : pointer ;
display : flex ;
align-items : center ;
justify-content : center ;
transition : all 0.2 s ease ;
-webkit- tap-highlight-color : transparent ;
touch-action : manipulation ;
z-index : 10 ;
}
. touch-menu-close : hover {
background : #2a2a2a ;
border-color : #4a9eff ;
color : #4a9eff ;
}
. touch-menu-close : active {
transform : scale ( 0.9 );
}
. touch-menu-items {
display : flex ;
flex-direction : column ;
gap : 12 px ;
margin-top : 0 ;
}
. touch-menu-item {
display : flex ;
align-items : center ;
gap : 16 px ;
padding : 16 px 20 px ;
background : #2a2a2a ;
border : 2 px solid #404040 ;
border-radius : 12 px ;
color : #e0e0e0 ;
font-size : 18 px ;
font-weight : 500 ;
cursor : pointer ;
transition : all 0.2 s ease ;
text-align : left ;
width : 100 % ;
-webkit- tap-highlight-color : transparent ;
touch-action : manipulation ;
}
. touch-menu-item i {
font-size : 20 px ;
width : 28 px ;
text-align : center ;
flex-shrink : 0 ;
}
. touch-menu-item span {
flex : 1 ;
}
. touch-menu-item : hover {
background : #333333 ;
border-color : #4a9eff ;
color : #ffffff ;
transform : translateX ( 2 px );
box-shadow : 0 2 px 8 px rgba ( 74 , 158 , 255 , 0.2 );
}
. touch-menu-item : active {
transform : translateX ( 1 px ) scale ( 0.98 );
background : #2a2a2a ;
}
/* Ensure menu overlay is above splash overlay */
. splash-overlay {
z-index : 30000 ;
}
. touch-menu-overlay {
z-index : 40000 ;
}
/* =====================================================================
* ASK TAB — voice-driven AI assistant
* Uses the Paladins display font sized to match Bible text so it stays
* readable from a distance and on broadcast camera in live production.
* ===================================================================== */
. ask-reading-area {
color : #e6e8ee ;
-webkit- user-select : text ;
user-select : text ;
font-family : 'Ethnocentric' , Georgia , 'Times New Roman' , Times , serif ;
}
. ask-reading-area ,
. ask-reading-area * {
font-family : 'Ethnocentric' , Georgia , 'Times New Roman' , Times , serif ;
}
. ask-shell {
max-width : 1200 px ;
margin : 0 auto ;
padding : 22 px 30 px 80 px ;
display : flex ;
flex-direction : column ;
gap : 22 px ;
min-height : 100 vh ;
position : relative ;
}
/* Tiny floating corner with just the status dot + clear button.
* Replaces the old labeled status pill so the page stays uncluttered. */
. ask-corner {
position : absolute ;
top : 14 px ;
left : 14 px ;
display : flex ;
align-items : center ;
gap : 8 px ;
z-index : 5 ;
}
. ask-status-dot {
width : 9 px ;
height : 9 px ;
border-radius : 50 % ;
background : #555a64 ;
transition : background 0.25 s ease , box-shadow 0.25 s ease ;
cursor : help ;
}
. ask-status-dot . online {
background : #34d399 ;
box-shadow : 0 0 0 4 px rgba ( 52 , 211 , 153 , 0.14 );
}
. ask-status-dot . thinking {
background : #4a9eff ;
animation : askPulse 1.1 s ease-in-out infinite ;
}
@ keyframes askPulse {
0 %, 100 % { box-shadow : 0 0 0 0 rgba ( 74 , 158 , 255 , 0.45 ); }
50 % { box-shadow : 0 0 0 7 px rgba ( 74 , 158 , 255 , 0 ); }
}
/* Ask-tab model warm-up progress bar (shows only while loading; hidden once ready) */
. ask-loading-bar {
width : 100 % ;
height : 3 px ;
background : rgba ( 255 , 255 , 255 , 0.06 );
overflow : hidden ;
}
. ask-loading-fill {
height : 100 % ;
width : 3 % ;
background : linear-gradient ( 90 deg , #0090ff , #4a9eff );
border-radius : 0 2 px 2 px 0 ;
transition : width 0.3 s ease ;
}
/* ---- Presentation tools: laser pointer / spotlight ---- */
/* Capture layer sits above content + annotation canvas (~6001) but BELOW the toolbar
(11000) and tool rail (11005), so the operator can always tap another tool to exit. */
. pt-overlay {
position : fixed ;
inset : 0 ;
z-index : 10500 ;
pointer-events : auto ;
touch-action : none ;
display : none ;
}
. pt-overlay . pt-laser { background : transparent ; }
/* Spotlight = a full-width horizontal band (~2 lines tall) that follows the touch Y and dims
above/below, so a specific line/verse reads clearly for the audience and cameras. */
/* --pt-half = half the clear band's height, --pt-edge = that plus the soft feather. JS rewrites both
during a two-finger pinch; the fallbacks below are the original fixed sizes, so the look is
identical if JS never touches them. */
. pt-overlay . pt-spotlight {
background : linear-gradient ( to bottom ,
rgba ( 0 , 0 , 0 , 0.88 ) 0 ,
rgba ( 0 , 0 , 0 , 0.88 ) calc ( var ( -- pt - cy , 50 % ) - var ( -- pt - edge , 130 px )),
rgba ( 0 , 0 , 0 , 0 ) calc ( var ( -- pt - cy , 50 % ) - var ( -- pt - half , 110 px )),
rgba ( 0 , 0 , 0 , 0 ) calc ( var ( -- pt - cy , 50 % ) + var ( -- pt - half , 110 px )),
rgba ( 0 , 0 , 0 , 0.88 ) calc ( var ( -- pt - cy , 50 % ) + var ( -- pt - edge , 130 px )),
rgba ( 0 , 0 , 0 , 0.88 ) 100 % );
}
/* Spotlight armed but not yet touched: dim the whole screen, no bright band until a finger lands. */
. pt-overlay . pt-spotlight . pt-armed {
background : rgba ( 0 , 0 , 0 , 0.88 );
}
/* Laser trail canvas — full-screen, non-interactive (overlay div above it captures the pointer) */
. pt-laser-canvas {
position : absolute ;
inset : 0 ;
pointer-events : none ;
}
/* Tappable scripture references inside AI answers — open a new Bible tab at that verse */
. ask-ref {
color : #6db1ff ;
text-decoration : underline ;
text-decoration-color : rgba ( 109 , 177 , 255 , 0.5 );
text-underline-offset : 3 px ;
cursor : pointer ;
border-radius : 4 px ;
padding : 0 2 px ;
}
. ask-ref : active { background : rgba ( 109 , 177 , 255 , 0.18 ); }
/* ===== Verse-exact original word card (STEP interlinear) inside word popups =====
TEACHING TOOL sizing: the congregation reads this on the stage TV, so every element scales
from the Bible reading size (default 60px) — card text sits slightly below it. */
. il-section . word-info-value { line-height : 1.35 ; }
/* Header: original word + the English word it renders, side by side, CENTERED on the card. */
. il-head {
display : flex ;
align-items : baseline ;
justify-content : center ;
flex-wrap : wrap ;
gap : 0.45 em ;
margin : 2 px 0 0 ;
text-align : center ;
}
. il-word {
font-size : calc ( var ( -- bible - font - size , 60 px ) * 1.05 );
line-height : 1.2 ;
color : #ffd97a ; /* warm gold — reads clearly on camera */
}
. il-eng {
font-size : calc ( var ( -- bible - font - size , 60 px ) * 0.62 );
color : #ffffff ;
font-weight : 600 ;
}
. il-eng :: before {
content : "= " ;
color : #7a8794 ;
font-weight : 400 ;
}
. il-translit {
text-align : center ; /* sits directly under the centered word pair */
font-style : italic ;
color : #9fb6c9 ;
font-size : calc ( var ( -- bible - font - size , 60 px ) * 0.45 );
margin-bottom : 10 px ;
}
. il-row { margin : 8 px 0 ; font-size : calc ( var ( -- bible - font - size , 60 px ) * 0.75 ); color : #d9d9d9 ; }
. il-key { color : #7fa7d9 ; font-weight : 600 ; margin-right : 6 px ; }
. il-gloss { color : #eaeaea ; font-weight : 600 ; }
. il-lemma { font-size : calc ( var ( -- bible - font - size , 60 px ) * 0.8 ); }
. il-def { color : #f2f2f2 ; background : rgba ( 127 , 167 , 217 , 0.08 ); border-left : 4 px solid #7fa7d9 ; padding : 10 px 14 px ; margin : 10 px 0 ; border-radius : 6 px ; }
. il-origin { color : #f2e6c8 ; background : rgba ( 255 , 217 , 122 , 0.07 ); border-left : 4 px solid #d9b96a ; padding : 10 px 14 px ; margin : 10 px 0 ; border-radius : 6 px ; }
. il-usage { color : #d9ead9 ; background : rgba ( 140 , 200 , 140 , 0.07 ); border-left : 4 px solid #8cc88c ; padding : 10 px 14 px ; margin : 10 px 0 ; border-radius : 6 px ; }
. il-code { font-family : Consolas , monospace ; font-size : calc ( var ( -- bible - font - size , 60 px ) * 0.4 ); color : #9a9a9a ; }
. il-note { font-size : calc ( var ( -- bible - font - size , 60 px ) * 0.3 ); color : #8a8a8a ; margin-top : 4 px ; }
/* Popups carrying the card grow to teaching size; the title matches ("Greek — John 3:16").
Beats the base rule AND the coarse-pointer 320px cap (higher specificity + later in file). */
. word-info-popup : has ( . il-section ) { width : min ( 92 vw , 980 px ); max-width : 92 vw ; min-width : min ( 92 vw , 640 px ); }
. word-info-popup : has ( . il-section ) . word-info-title { font-size : calc ( var ( -- bible - font - size , 60 px ) * 0.5 ); }
/* Active state for the presentation tool-rail buttons (subtle bg tint; keeps the laser's own colour) */
. tool-icon . pt-active {
background : rgba ( 255 , 90 , 60 , 0.18 ) !important ;
border-radius : 6 px ;
/* Ring it the way a selected drawing tool is ringed, in the button's own colour, so exactly one
button in the rail is outlined at any time. Without this, arming the laser left NOTHING ringed
and read as "the tool outline disappeared". box-shadow only — a border would shift the layout. */
box-shadow : 0 0 0 2 px currentColor , 0 0 8 px currentColor !important ;
}
/* Laser icon default colour (yellow); JS sets the live colour inline as the swatch changes */
. tool-icon [ data-tool = "laser" ] {
color : #ffff00 !important ;
}
/* Laser colour picker — mirrors the pen/highlighter dropdown */
. laser-color-dropdown {
position : absolute ;
top : 115 % ;
left : 50 % ;
transform : translateX ( -50 % ) scaleY ( 0 );
transform-origin : top center ;
background-color : #2a2a2a ;
border : 1 px solid #404040 ;
border-radius : 8 px ;
box-shadow : 0 4 px 12 px rgba ( 0 , 0 , 0 , 0.3 );
padding : 10 px 12 px ;
display : flex ;
gap : 12 px ;
transition : transform 0.18 s cubic-bezier ( .4 , 1.6 , .6 , 1 ), opacity 0.18 s cubic-bezier ( .4 , 1.6 , .6 , 1 );
opacity : 0 ;
pointer-events : none ;
min-width : 200 px ;
justify-content : center ;
z-index : 11012 ;
}
. laser-color-dropdown . show {
transform : translateX ( -50 % ) scaleY ( 1 );
opacity : 1 ;
pointer-events : auto ;
}
. laser-color-option {
width : 28 px !important ;
height : 28 px !important ;
border-radius : 50 % !important ;
border : none !important ;
box-shadow : none !important ;
outline : none !important ;
padding : 0 !important ;
margin : 0 !important ;
cursor : pointer ;
}
. laser-color-option : focus , . laser-color-option . selected {
outline : 2 px solid #4a9eff ;
outline-offset : 2 px ;
}
/* ---- Optional draggable quick-tool dock (Settings > Presentation) ---- */
. quick-dock {
position : fixed ;
left : 12 px ;
top : 34 vh ;
z-index : 11020 ; /* above content, overlays and toolbar so it's always tappable wherever placed */
display : flex ;
flex-direction : column ;
align-items : center ;
gap : 6 px ;
background : rgba ( 28 , 28 , 30 , 0.72 );
border : 1 px solid rgba ( 255 , 255 , 255 , 0.12 );
border-radius : 14 px ;
padding : 6 px 6 px 8 px ;
backdrop-filter : blur ( 4 px );
-webkit- backdrop-filter : blur ( 4 px );
opacity : 0.4 ; /* auto-dims; brightens only while you're using it */
/*
* An explicit width so opening a colour picker can EASE the dock wider instead of snapping: a width
* of 'auto' cannot be transitioned. 58px = one 46px button plus the 6px padding either side; the
* wide value below fits the swatch row. overflow:hidden keeps the swatches inside the panel while it
* is still growing.
*/
width : 58 px ;
overflow : hidden ;
transition : opacity 0.2 s ease , width 0.18 s ease ;
touch-action : none ;
user-select : none ;
-webkit- user-select : none ;
}
. quick-dock . qd-bright , . quick-dock . dragging { opacity : 1 ; }
. qd-grip {
color : #7a7a7a ;
cursor : grab ;
font-size : 13 px ; /* icon stays small */
line-height : 1 ;
width : 100 % ; /* whole top of the dock is the drag handle */
min-height : 36 px ; /* large touch target so it grabs on the first touch */
display : flex ;
align-items : center ;
justify-content : center ;
touch-action : none ;
}
. quick-dock . dragging . qd-grip { cursor : grabbing ; }
. qd-btn {
width : 46 px ;
height : 46 px ;
border : none ;
border-radius : 10 px ;
background : transparent ;
color : #e6e6e6 ;
font-size : 20 px ;
cursor : pointer ;
display : flex ;
align-items : center ;
justify-content : center ;
transition : background 0.12 s ease ;
}
. qd-btn : active { background : rgba ( 255 , 255 , 255 , 0.10 ); }
/* Active tool: coloured ring + glow using the icon's own colour (matches the top rail's selected look) */
. qd-btn . active { background : rgba ( 255 , 255 , 255 , 0.10 ); box-shadow : 0 0 0 2 px currentColor , 0 0 8 px currentColor ; }
/* Static fallback colours; JS then mirrors the live top-toolbar colours exactly */
. qd-btn [ data-qd = "pen" ] { color : var ( -- pen - color , #ffff00 ); }
. qd-btn [ data-qd = "highlight" ] { color : #ffff00 ; }
. qd-btn [ data-qd = "erase" ] { color : #ffb6c1 ; }
. qd-btn [ data-qd = "laser" ] { color : #ffff00 ; }
. qd-btn [ data-qd = "clear" ] { position : relative ; overflow : visible ; color : #e6e6e6 ; }
/* Clear button hold feedback — mirrors the top trash button (red progress bar, blue-glow, red flash) */
. qd-clear-progress {
position : absolute ;
top : -2 px ;
left : 0 ;
height : 3 px ;
width : 0 % ;
background : #ff0000 ;
border-radius : 3 px 3 px 0 0 ;
box-shadow : 0 0 8 px rgba ( 255 , 0 , 0 , 0.6 );
pointer-events : none ;
}
. qd-btn . qd-holding { box-shadow : 0 0 0 2 px #4a9eff , 0 0 12 px rgba ( 74 , 158 , 255 , 0.6 ); color : #fff !important ; }
. qd-btn . qd-flash { animation : qdFlash 0.16 s ease ; }
@ keyframes qdFlash {
0 % { background : #ff4444 ; color : #fff ; box-shadow : 0 0 15 px rgba ( 255 , 68 , 68 , 0.85 ); }
100 % { background : transparent ; }
}
/* ---- Red letter (words of Christ) — words are marked .red-letter during render; they only turn
red when the feature is enabled (body.red-letter-on), so toggling is instant with no re-render. ---- */
body . red-letter-on . bible-text . clickable-word . red-letter {
color : #ff5252 !important ;
}
. qd-colors {
display : none ;
flex-flow : row wrap ;
gap : 6 px ;
justify-content : center ;
max-width : 116 px ;
padding-top : 6 px ;
margin-top : 2 px ;
border-top : 1 px solid rgba ( 255 , 255 , 255 , 0.10 );
}
. qd-colors . show { display : flex ; opacity : 1 ; }
/* Swatches fade in just behind the widening panel, so nothing appears outside it mid-animation. */
. qd-colors { opacity : 0 ; transition : opacity 0.14 s ease 0.05 s ; }
. quick-dock . qd-wide { width : 128 px ; }
. qd-color {
width : 22 px ;
height : 22 px ;
border-radius : 50 % ;
border : none ;
cursor : pointer ;
padding : 0 ;
}
/* When floating, hide the top tool-rail handle + rail so tools aren't in two places */
body . qd-on # toolIndicator , body . qd-on # toolRailEdge , body . qd-on # toolRail { display : none !important ; }
/* Hint shown while dragging the dock into the top zone (release to re-dock) */
. quick-dock . qd-will-dock { outline : 2 px dashed rgba ( 120 , 180 , 255 , 0.8 ); outline-offset : 3 px ; }
/* Grip inside the opened tool rail (first item, left of the pen) — drag to float the toolbar */
. qd-rail-grip {
display : flex ;
align-items : center ;
justify-content : center ;
color : #8a8a8a ;
cursor : grab ;
font-size : 18 px ;
padding : 4 px 8 px ;
touch-action : none ;
user-select : none ;
-webkit- user-select : none ;
}
. qd-rail-grip : active { cursor : grabbing ; color : #cfd3da ; }
. ask-clear-btn {
width : 28 px ;
height : 28 px ;
border : none ;
border-radius : 50 % ;
background : transparent ;
color : #6e7585 ;
cursor : pointer ;
display : inline-flex ;
align-items : center ;
justify-content : center ;
padding : 0 ;
transition : background 0.18 s ease , color 0.18 s ease ;
-webkit- tap-highlight-color : transparent ;
}
. ask-clear-btn : hover {
background : rgba ( 255 , 255 , 255 , 0.06 );
color : #e6e8ee ;
}
. ask-mic-area {
display : flex ;
flex-direction : column ;
align-items : center ;
gap : 18 px ;
padding : 60 px 0 4 px ;
}
. ask-mic-btn {
position : relative ;
width : 132 px ;
height : 132 px ;
border-radius : 50 % ;
border : none ;
background : linear-gradient ( 180 deg , #1f2630 0 % , #14181f 100 % );
color : #4a9eff ;
cursor : pointer ;
display : flex ;
align-items : center ;
justify-content : center ;
box-shadow :
0 0 0 1 px rgba ( 74 , 158 , 255 , 0.18 ),
0 18 px 38 px rgba ( 0 , 0 , 0 , 0.45 ),
inset 0 1 px 0 rgba ( 255 , 255 , 255 , 0.04 );
transition : transform 0.18 s ease , color 0.18 s ease , box-shadow 0.25 s ease ;
-webkit- tap-highlight-color : transparent ;
}
. ask-mic-btn : hover {
transform : translateY ( -1 px );
color : #6db3ff ;
}
. ask-mic-btn : active {
transform : translateY ( 0 ) scale ( 0.97 );
}
. ask-mic-btn . listening {
color : #ff5b6e ;
box-shadow :
0 0 0 2 px rgba ( 255 , 91 , 110 , 0.45 ),
0 18 px 38 px rgba ( 0 , 0 , 0 , 0.45 ),
inset 0 1 px 0 rgba ( 255 , 255 , 255 , 0.05 );
}
. ask-mic-glyph {
position : relative ;
z-index : 2 ;
}
. ask-mic-ring {
position : absolute ;
inset : -8 px ;
border-radius : 50 % ;
border : 2 px solid rgba ( 74 , 158 , 255 , 0.2 );
pointer-events : none ;
opacity : 0 ;
transition : opacity 0.2 s ease ;
}
. ask-mic-btn . listening . ask-mic-ring {
opacity : 1 ;
animation : askRing 1.4 s ease-out infinite ;
border-color : rgba ( 255 , 91 , 110 , 0.55 );
}
. ask-mic-btn . listening . ask-mic-ring . ring-2 {
animation-delay : 0.7 s ;
border-color : rgba ( 255 , 91 , 110 , 0.32 );
}
@ keyframes askRing {
0 % { transform : scale ( 0.92 ); opacity : 0.7 ; }
80 % { transform : scale ( 1.35 ); opacity : 0 ; }
100 % { transform : scale ( 1.45 ); opacity : 0 ; }
}
. ask-transcript {
color : #e6e8ee ;
font-size : 30 px ;
text-align : center ;
max-width : 100 % ;
line-height : 1.45 ;
font-weight : 400 ;
letter-spacing : 0.01 em ;
}
/* Only show the transcript / answer / panel once they have actual content. */
. ask-transcript : empty {
display : none ;
}
. ask-answer-area {
background : rgba ( 255 , 255 , 255 , 0.03 );
border : 1 px solid rgba ( 255 , 255 , 255 , 0.07 );
border-radius : 14 px ;
padding : 18 px 22 px ;
transition : border-color 0.25 s ease ;
}
. ask-answer-area : has ( . ask-answer-text : empty ) {
display : none ;
}
. ask-answer-text {
color : #e6e8ee ;
font-size : 26 px ;
line-height : 1.5 ;
white-space : pre-wrap ;
word-wrap : break-word ;
letter-spacing : 0.01 em ;
}
/* History list shows newest at the top so the most relevant Q&A is always
* visible without scrolling. We render in reverse-chronological order. */
. ask-history {
display : flex ;
flex-direction : column ;
gap : 12 px ;
margin-top : 6 px ;
}
. ask-bubble {
padding : 14 px 20 px ;
border-radius : 14 px ;
border : 1 px solid rgba ( 255 , 255 , 255 , 0.06 );
font-size : 26 px ;
line-height : 1.5 ;
max-width : 100 % ;
letter-spacing : 0.01 em ;
}
. ask-bubble-role {
font-size : 13 px ;
letter-spacing : 0.15 em ;
text-transform : uppercase ;
color : #6e7585 ;
margin-bottom : 6 px ;
font-weight : 600 ;
}
. ask-bubble-content {
color : #c8cdd6 ;
word-wrap : break-word ;
white-space : pre-wrap ;
}
. ask-bubble-user {
background : rgba ( 74 , 158 , 255 , 0.08 );
border-color : rgba ( 74 , 158 , 255 , 0.18 );
}
. ask-bubble-user . ask-bubble-role { color : #4a9eff ; }
. ask-bubble-assistant {
background : rgba ( 255 , 255 , 255 , 0.02 );
}
/* ---- Tool button selection ring: two fixes, both about the ring being invisible ---- */
/* 1. While the laser or spotlight owns the screen, the drawing tools should read as unselected.
presentation-tools.js sets .pt-tool-active on <body> and hides the ring HERE rather than removing
the .selected class, because app.js owns that class and repaints it from currentTool at dozens of
call sites. That tug-of-war is what made the pen's outline flicker away and come back mid-laser.
Higher specificity than the .dark-ink rules below, so an active overlay always wins. */
body . pt-tool-active . tool-icon [ data-tool = "pen" ] . selected ,
body . pt-tool-active . tool-icon [ data-tool = "highlight" ] . selected ,
body . pt-tool-active . tool-icon [ data-tool = "erase" ] . selected ,
body . pt-tool-active . tool-icon [ data-tool = "select" ] . selected {
border-color : transparent !important ;
box-shadow : none !important ;
}
/* 2. The ring is drawn in the ink colour. The Notes page is white paper, so its pen is black, which
put a black ring on the dark grey button: 1.66:1 contrast, indistinguishable from no ring at all
on the stage TV. app.js/quick-dock.js add .dark-ink when the ink is too dark (window.isDarkInk),
and the button becomes a white-paper chip — still showing the colour it will draw in. Placed at
the end of the file so it also beats the .touch-device duplicates further up. */
. tool-icon [ data-tool = "pen" ] . selected . dark-ink ,
. tool-icon [ data-tool = "highlight" ] . selected . dark-ink {
background : #ededed !important ;
box-shadow : 0 0 0 2 px rgba ( 255 , 255 , 255 , 0.9 ), 0 0 8 px rgba ( 255 , 255 , 255 , 0.35 ) !important ;
}
. qd-btn . active . dark-ink {
background : #ededed ;
box-shadow : 0 0 0 2 px rgba ( 255 , 255 , 255 , 0.9 ), 0 0 8 px rgba ( 255 , 255 , 255 , 0.35 );
}
/* ---- Thrown card: one quick fade out ----
A card flicked off either side closes with a short fade and a small slide in the direction it went.
These rules must outrank BOTH .word-info-popup (whose base transform is the opening pose,
scale(0.8) translateY(-10px)) and .word-info-popup.show, or removing .show mid-fade animates the card
back into view — which is the "disappears, reappears, then closes" flicker. Deliberately understated:
no outline, no bounce, just gone. */
. word-info-popup . pd-closing ,
. word-info-popup . pd-closing . show {
transition : opacity 0.16 s ease-out , transform 0.16 s ease-out !important ;
opacity : 0 !important ;
pointer-events : none !important ;
}
. word-info-popup . pd-closing . pd-left { transform : translateX ( -45 % ) scale ( 0.97 ) !important ; }
. word-info-popup . pd-closing . pd-right { transform : translateX ( 45 % ) scale ( 0.97 ) !important ; }
/* ============================================================================
ProPresenter Sync tab (propresenter-sync.js). It is a Bible tab; on stage NOTHING marks it as
special — no state dot, no banner, no verse tint. Link state is read in Settings › ProPresenter
Sync and on Companion buttons (/bibleapp/feedback/state/ppsync_*). Only the strip icon is styled.
============================================================================ */
. ppsync-tab-icon { opacity : 0.7 ; transition : opacity 0.2 s ; }
. tab : hover . ppsync-tab-icon , . tab . active . ppsync-tab-icon { opacity : 1 ; }
/* The sync tab never slides its text: the app's reveal (smoothFadeIn: fade + 6px slide up, re-run by every
scroll-to-verse) is off on its panel, so a chapter change is the snapshot cross-fade and nothing else. Off
PERMANENTLY, not only during the swap — lifting a suppressed CSS animation restarts it, which is exactly
the after-fade jump this rule exists to prevent. */
. tab-panel . ppsync-panel . smooth-fade-in { animation : none !important ; }
/* ============================================================================
Two-finger tool selector (tool-wheel.js). A ring of tools around the tap point, sized for a hand on the
75" stage TV (1080 CSS px wide): each choice ~7 cm across, ~9 cm from the tap. It fans out from the
centre and folds back into it — it never appears or vanishes in place. --tw-scale shrinks the whole
thing only in a window too small to hold it (a dev browser; never the stage TV).
============================================================================ */
. tool-wheel {
position : fixed ;
left : 0 ;
top : 0 ;
width : 0 ;
height : 0 ;
z-index : 60000 ; /* above the laser/spotlight overlay (10500) and the popups; below the splash */
pointer-events : none ; /* only the hub and the choices take input — the page around them stays live */
touch-action : none ;
user-select : none ;
-webkit- user-select : none ;
--tw-scale : 1 ;
}
. tool-wheel . tw-hub ,
. tool-wheel . tw-item {
position : absolute ;
left : 0 ;
top : 0 ;
pointer-events : auto ;
display : flex ;
flex-direction : column ;
align-items : center ;
justify-content : center ;
border-radius : 50 % ;
box-sizing : border-box ;
touch-action : none ;
cursor : pointer ;
-webkit- tap-highlight-color : transparent ;
will-change : transform , opacity ;
}
. tool-wheel . tw-hub {
width : calc ( 48 px * var ( -- tw - scale ));
height : calc ( 48 px * var ( -- tw - scale ));
margin : calc ( -24 px * var ( -- tw - scale )) 0 0 calc ( -24 px * var ( -- tw - scale ));
background : rgba ( 22 , 22 , 24 , 0.92 );
border : 1 px solid rgba ( 255 , 255 , 255 , 0.16 );
color : #9a9a9a ;
font-size : calc ( 17 px * var ( -- tw - scale ));
opacity : 0 ;
transform : scale ( 0.5 );
transition : opacity 0.14 s ease , transform 0.18 s cubic-bezier ( 0.2 , 0.8 , 0.3 , 1.15 );
}
. tool-wheel . tw-item {
width : calc ( 84 px * var ( -- tw - scale ));
height : calc ( 84 px * var ( -- tw - scale ));
margin : calc ( -42 px * var ( -- tw - scale )) 0 0 calc ( -42 px * var ( -- tw - scale ));
gap : calc ( 4 px * var ( -- tw - scale ));
background : rgba ( 24 , 24 , 26 , 0.96 );
border : 2 px solid rgba ( 255 , 255 , 255 , 0.14 );
box-shadow : 0 6 px 18 px rgba ( 0 , 0 , 0 , 0.55 );
color : #e6e6e6 ;
font-family : - apple-system , 'Segoe UI' , system-ui , Roboto , sans-serif ;
opacity : 0 ;
transform : translate ( 0 px , 0 px ) scale ( 0.45 );
transition : transform 0.2 s cubic-bezier ( 0.2 , 0.8 , 0.3 , 1.12 ) var ( -- tw - delay , 0 ms ),
opacity 0.15 s ease var ( -- tw - delay , 0 ms ),
background 0.12 s ease ,
box-shadow 0.12 s ease ;
}
. tool-wheel . tw-item i { font-size : calc ( 28 px * var ( -- tw - scale )); line-height : 1 ; }
. tool-wheel . tw-item span { font-size : calc ( 12 px * var ( -- tw - scale )); line-height : 1 ; letter-spacing : 0.02 em ; color : #d4d4d4 ; }
. tool-wheel . tw-open . tw-hub { opacity : 1 ; transform : scale ( 1 ); }
. tool-wheel . tw-open . tw-item { opacity : 1 ; transform : translate ( var ( -- tw - x ), var ( -- tw - y )) scale ( 1 ); }
/* The active tool: ring + glow in its own ink colour, as the toolbar and the dock draw it */
. tool-wheel . tw-item . tw-active {
background : rgba ( 255 , 255 , 255 , 0.12 );
box-shadow : 0 0 0 2 px currentColor , 0 0 12 px currentColor , 0 6 px 18 px rgba ( 0 , 0 , 0 , 0.55 );
}
. tool-wheel . tw-item . tw-active . dark-ink {
background : #ededed ;
box-shadow : 0 0 0 2 px rgba ( 255 , 255 , 255 , 0.9 ), 0 0 8 px rgba ( 255 , 255 , 255 , 0.35 );
}
. tool-wheel . tw-item . tw-active . dark-ink span { color : #333 ; }
. tool-wheel . tw-open . tw-item . tw-pressed {
transform : translate ( var ( -- tw - x ), var ( -- tw - y )) scale ( 0.92 );
background : rgba ( 255 , 255 , 255 , 0.2 );
transition-delay : 0 ms ;
}
. tool-wheel . tw-open . tw-item . tw-chosen {
transform : translate ( var ( -- tw - x ), var ( -- tw - y )) scale ( 1.12 );
box-shadow : 0 0 0 3 px currentColor , 0 0 22 px currentColor ;
transition : transform 0.1 s ease-out , box-shadow 0.1 s ease-out ;
}
/* Closing: fold back toward the tap point and fade; the chosen tool lingers a beat brighter, then follows */
. tool-wheel . tw-open . tw-closing . tw-hub {
opacity : 0 ;
transform : scale ( 0.5 );
transition : opacity 0.1 s ease-in , transform 0.12 s ease-in ;
}
. tool-wheel . tw-open . tw-closing . tw-item {
opacity : 0 ;
transform : translate ( calc ( var ( -- tw - x ) * 0.82 ), calc ( var ( -- tw - y ) * 0.82 )) scale ( 0.7 );
transition : transform 0.15 s ease-in , opacity 0.12 s ease-in ;
}
. tool-wheel . tw-open . tw-closing . tw-item . tw-chosen {
transform : translate ( var ( -- tw - x ), var ( -- tw - y )) scale ( 1.16 );
transition : transform 0.17 s ease-out , opacity 0.14 s ease-in 0.03 s ;
}
/* ----------------------------------------------------------------------------
SLIM — the second shape of the same selector (Settings › Presentation).
One dial instead of five scattered discs: a band of wedges around a hole, the close hub sitting in
the hole. About two thirds the width of the ring and a third of the area, so far less of the passage
is covered while a tool is being picked — and far less of it is on camera if the program feed catches
the moment. The wedges touch, so their own outlines draw the dial (outer circle, inner circle, one
line between each pair) and there is no dead space between choices for a thumb to fall into.
It unfolds and folds exactly like the ring: the dial springs open from the tap point while each wedge
and its icon slide outward on the same 22 ms-apart stagger, and everything folds back into the centre.
---------------------------------------------------------------------------- */
. tool-wheel-slim . tw-dial {
position : absolute ;
left : 0 ;
top : 0 ;
pointer-events : none ; /* the SVG wedges inside take input; the box around them does not */
opacity : 0 ;
transform : scale ( calc ( var ( -- tw - scale ) * 0.55 ));
transform-origin : 50 % 50 % ;
transition : opacity 0.14 s ease , transform 0.2 s cubic-bezier ( 0.2 , 0.8 , 0.3 , 1.12 );
will-change : transform , opacity ;
}
. tool-wheel-slim . tw-open . tw-dial {
opacity : 1 ;
transform : scale ( var ( -- tw - scale ));
}
. tool-wheel-slim . tw-svg {
display : block ;
width : 100 % ;
height : 100 % ;
overflow : visible ;
}
/* A wedge. The fill is the dial's own dark ground; currentColor (set from the toolbar in paint())
only comes through once it is the active tool. */
. tool-wheel-slim . tw-seg > path {
fill : rgba ( 24 , 24 , 26 , 0.96 );
stroke : rgba ( 255 , 255 , 255 , 0.17 );
stroke-width : 1.4 ;
stroke-linejoin : round ;
pointer-events : auto ;
transition : fill 0.12 s ease , fill - opacity 0.12 s ease , stroke 0.12 s ease , stroke-width 0.12 s ease ;
}
. tool-wheel-slim . tw-seg {
opacity : 0 ;
transform : translate ( var ( -- tw - sx , 0 px ), var ( -- tw - sy , 0 px ));
transition : transform 0.2 s cubic-bezier ( 0.2 , 0.8 , 0.3 , 1.12 ) var ( -- tw - delay , 0 ms ),
opacity 0.15 s ease var ( -- tw - delay , 0 ms );
}
. tool-wheel-slim . tw-open . tw-seg {
opacity : 1 ;
transform : translate ( 0 px , 0 px );
}
/* The active tool, in its own ink — the same signal the ring gives with a glowing border. */
. tool-wheel-slim . tw-seg . tw-active > path {
fill : currentColor ;
fill-opacity : 0.26 ;
stroke : currentColor ;
stroke-width : 2.6 ;
}
/* A near-black ink would be invisible as a tint on a dark dial, so it goes light instead (as the ring
does) and its icon goes dark against it. */
. tool-wheel-slim . tw-seg . tw-active . dark-ink > path {
fill : #ededed ;
fill-opacity : 0.92 ;
stroke : rgba ( 255 , 255 , 255 , 0.9 );
}
. tool-wheel-slim . tw-seg . tw-pressed > path {
fill : currentColor ;
fill-opacity : 0.42 ;
transition-delay : 0 ms ;
}
. tool-wheel-slim . tw-seg . tw-chosen > path {
fill : currentColor ;
fill-opacity : 0.6 ;
stroke : currentColor ;
stroke-width : 3.2 ;
transition : fill - opacity 0.1 s ease-out , stroke-width 0.1 s ease-out ;
}
/* Icons ride over the wedges and never take a touch, so every press lands on the wedge below. */
. tool-wheel-slim . tw-icons {
position : absolute ;
left : 0 ;
top : 0 ;
width : 0 ;
height : 0 ;
pointer-events : none ;
}
. tool-wheel-slim . tw-ico {
position : absolute ;
left : 0 ;
top : 0 ;
display : flex ;
flex-direction : column ;
align-items : center ;
justify-content : center ;
gap : calc ( 3 px * var ( -- tw - scale ));
width : calc ( 62 px * var ( -- tw - scale ));
margin : calc ( -18 px * var ( -- tw - scale )) 0 0 calc ( -31 px * var ( -- tw - scale ));
color : #e6e6e6 ;
font-family : - apple-system , 'Segoe UI' , system-ui , Roboto , sans-serif ;
text-align : center ;
opacity : 0 ;
transform : translate ( var ( -- tw - x0 ), var ( -- tw - y0 )) scale ( 0.6 );
transition : transform 0.2 s cubic-bezier ( 0.2 , 0.8 , 0.3 , 1.12 ) var ( -- tw - delay , 0 ms ),
opacity 0.15 s ease var ( -- tw - delay , 0 ms );
will-change : transform , opacity ;
}
. tool-wheel-slim . tw-open . tw-ico {
opacity : 1 ;
transform : translate ( var ( -- tw - x ), var ( -- tw - y )) scale ( 1 );
}
. tool-wheel-slim . tw-ico i { font-size : calc ( 22 px * var ( -- tw - scale )); line-height : 1 ; }
. tool-wheel-slim . tw-ico span {
font-size : calc ( 10 px * var ( -- tw - scale ));
line-height : 1 ;
letter-spacing : 0.02 em ;
color : #cfcfcf ;
white-space : nowrap ;
}
. tool-wheel-slim . tw-ico . tw-active span { color : #f2f2f2 ; }
/* Light wedge, dark glyph (see the dark-ink note above). Beats the inline ink colour paint() sets. */
. tool-wheel-slim . tw-ico . tw-active . dark-ink ,
. tool-wheel-slim . tw-ico . tw-active . dark-ink span { color : #2b2b2b !important ; }
/* The hub sits in the hole: smaller than the ring's, because the hole is smaller. */
. tool-wheel-slim . tw-hub {
width : calc ( 52 px * var ( -- tw - scale ));
height : calc ( 52 px * var ( -- tw - scale ));
margin : calc ( -26 px * var ( -- tw - scale )) 0 0 calc ( -26 px * var ( -- tw - scale ));
font-size : calc ( 18 px * var ( -- tw - scale ));
}
/* Folding away: the dial shrinks back into the tap point and the wedges and icons draw back with it. */
. tool-wheel-slim . tw-open . tw-closing . tw-dial {
opacity : 0 ;
transform : scale ( calc ( var ( -- tw - scale ) * 0.62 ));
transition : opacity 0.12 s ease-in , transform 0.15 s ease-in ;
}
. tool-wheel-slim . tw-open . tw-closing . tw-seg {
opacity : 0 ;
transition : opacity 0.12 s ease-in ;
}
. tool-wheel-slim . tw-open . tw-closing . tw-ico {
opacity : 0 ;
transform : translate ( var ( -- tw - x0 ), var ( -- tw - y0 )) scale ( 0.72 );
transition : transform 0.15 s ease-in , opacity 0.12 s ease-in ;
}
/* The tool just chosen holds a beat brighter before it goes, so the pick is seen, not guessed. */
. tool-wheel-slim . tw-open . tw-closing . tw-seg . tw-chosen {
opacity : 1 ;
transition : opacity 0.14 s ease-in 0.04 s ;
}
. tool-wheel-slim . tw-open . tw-closing . tw-ico . tw-active {
transform : translate ( var ( -- tw - x ), var ( -- tw - y )) scale ( 1.06 );
transition : transform 0.17 s ease-out , opacity 0.14 s ease-in 0.04 s ;
}
/* Notes tab: the sheet is the page. .bible-text's 30px padding is a reading margin for scripture; on the
notes stage it put a black border around the sheet on the stage AND on the follower's program feed
(the notes were the one tab that did not run edge to edge). Scoped so the Bible text keeps its margin. */
. notes-stage . bible-text ,
. notes-stage . notes-stage-body { padding : 0 !important ; margin : 0 !important ; width : 100 % !important ; max-width : none !important ; }
/* The notes body must be exactly the content width: as a flex item of the centring wrapper it came out 1px
short (1079 of 1080 on the TV) — a hairline of black at the paper's right edge on the program feed. */
. notes-stage . content-wrapper { display : block !important ; }