refactor: convert all flexbox layouts to CSS Grid in modal styles

- Convert modal container from flex column to grid with explicit rows
- Replace flex centering with grid place-items: center
- Convert header layouts from flex space-between to grid 1fr auto
- Transform input areas from flex to grid column layouts
- Update chat messages from flex column to grid single column
- Convert TTS controls, voice selection, and audio controls to grid
- Replace flex-wrap patterns with grid auto-fit minmax columns
- Remove all flex-shrink, flex-direction, and space-between properties
- Update align-self flex-start/end to justify-self start/end for grid
- Apply changes to both builtin and PicoCSS override stylesheets

This completes the systematic conversion from Flexbox to CSS Grid
layouts throughout the modal interface as requested.
This commit is contained in:
Russell Ballestrini 2025-07-10 13:49:37 -04:00
parent 8c61e7e8e4
commit a7323e68cd
2 changed files with 132 additions and 157 deletions

View file

@ -49,19 +49,18 @@ dialog#uncloseai-embedded-modal[data-theme="light"] {
.uncloseai-modal-container {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
display: grid;
grid-template-rows: auto 1fr auto auto;
overflow: hidden;
}
/* Header */
.uncloseai-modal-header {
flex-shrink: 0;
padding: 16px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
display: flex;
justify-content: space-between;
display: grid;
grid-template-columns: 1fr auto;
align-items: center;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
@ -76,9 +75,8 @@ dialog#uncloseai-embedded-modal[data-theme="light"] {
height: 36px;
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
display: grid;
place-items: center;
transition: background 0.2s;
margin-right: 8px;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
@ -90,7 +88,6 @@ dialog#uncloseai-embedded-modal[data-theme="light"] {
/* Chat area */
.uncloseai-modal-chat-area {
flex: 1;
overflow-y: auto;
padding: 16px;
-webkit-overflow-scrolling: touch;
@ -122,11 +119,11 @@ dialog#uncloseai-embedded-modal[data-theme="light"] {
/* Controls */
.uncloseai-modal-controls {
flex-shrink: 0;
padding: 8px 16px;
border-top: 1px solid rgba(0, 0, 0, 0.1);
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
display: flex;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: 8px;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
@ -134,17 +131,16 @@ dialog#uncloseai-embedded-modal[data-theme="light"] {
/* Input area */
.uncloseai-modal-input-area {
flex-shrink: 0;
padding: 16px;
display: flex;
display: grid;
grid-template-columns: 1fr auto;
gap: 12px;
align-items: flex-end;
align-items: end;
box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
}
/* Input field */
.uncloseai-modal-input {
flex: 1;
min-height: 44px;
max-height: 120px;
padding: 12px;
@ -174,11 +170,9 @@ dialog#uncloseai-embedded-modal[data-theme="light"] {
cursor: pointer;
font-size: 20px;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
display: grid;
place-items: center;
transition: transform 0.2s;
flex-shrink: 0;
}
.uncloseai-modal-send-btn:hover {
@ -188,13 +182,13 @@ dialog#uncloseai-embedded-modal[data-theme="light"] {
/* Chat messages */
.uncloseai-chat-box {
max-width: 100%;
display: flex;
flex-direction: column;
display: grid;
grid-template-columns: 1fr;
gap: 12px;
}
.user-message {
align-self: flex-end;
justify-self: end;
background: #007bff;
color: white;
padding: 12px 16px;
@ -204,7 +198,7 @@ dialog#uncloseai-embedded-modal[data-theme="light"] {
}
.ai-message {
align-self: flex-start;
justify-self: start;
background: white;
color: #495057;
padding: 12px 16px;
@ -250,8 +244,8 @@ dialog#translate-modal {
color: white;
padding: 16px 20px;
margin: -1em -1em 1em -1em;
display: flex;
justify-content: space-between;
display: grid;
grid-template-columns: 1fr auto;
align-items: center;
}
@ -269,9 +263,8 @@ dialog#translate-modal {
padding: 0;
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
display: grid;
place-items: center;
}
.translate-modal-header .close-btn:hover {
@ -281,11 +274,12 @@ dialog#translate-modal {
/* Tab navigation */
.translate-tab-nav {
list-style: none;
display: flex;
display: grid;
grid-template-columns: 1fr 1fr;
margin: 0;
padding: 0;
border-bottom: 2px solid #e9ecef;
gap: 0;
gap: 2px;
margin-bottom: 20px;
}
@ -371,7 +365,6 @@ dialog#translate-modal {
}
.translate-tab-nav li {
flex: 1;
margin: 0;
}
@ -488,8 +481,8 @@ dialog#tts-modal {
background: linear-gradient(45deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 20px;
display: flex;
justify-content: space-between;
display: grid;
grid-template-columns: 1fr auto;
align-items: center;
}
@ -507,22 +500,20 @@ dialog#tts-modal {
padding: 0;
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
display: grid;
place-items: center;
}
/* TTS content container */
.tts-modal-content {
padding: 20px;
overflow-y: auto;
flex: 1;
}
/* TTS modal article */
.tts-modal-article {
display: flex;
flex-direction: column;
display: grid;
grid-template-columns: 1fr;
height: 100%;
overflow: hidden;
}
@ -568,14 +559,15 @@ dialog#tts-modal {
/* Voice selection */
.tts-voice-container {
display: flex;
flex-wrap: wrap;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 10px;
margin: 16px 0;
}
.tts-voice-label {
display: flex;
display: grid;
grid-template-columns: auto 1fr;
align-items: center;
gap: 5px;
cursor: pointer;
@ -584,7 +576,8 @@ dialog#tts-modal {
/* Speed control */
.tts-speed-control {
margin: 16px 0;
display: flex;
display: grid;
grid-template-columns: auto 1fr auto;
align-items: center;
gap: 10px;
}
@ -607,7 +600,8 @@ dialog#tts-modal {
/* Audio controls */
.tts-audio-controls {
display: flex;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
align-items: center;
gap: 12px;
padding: 12px;
@ -633,7 +627,6 @@ dialog#tts-modal {
}
.tts-progress-container {
flex: 1;
height: 6px;
background: #e0e0e0;
border-radius: 3px;
@ -655,13 +648,14 @@ dialog#tts-modal {
/* Container Classes */
.uncloseai-flex-container {
display: flex;
flex-direction: column;
display: grid;
grid-template-columns: 1fr;
gap: 12px;
}
.uncloseai-flex-row {
display: flex;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(auto, max-content));
align-items: center;
gap: 8px;
}
@ -735,9 +729,8 @@ dialog#tts-modal {
border: none;
color: white;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
display: grid;
place-items: center;
font-size: 18px;
transition: background 0.2s;
}
@ -769,9 +762,8 @@ dialog#tts-modal {
}
.uncloseai-title-container {
flex: 1;
display: flex;
flex-direction: column;
display: grid;
grid-template-columns: 1fr;
gap: 4px;
}
@ -799,10 +791,11 @@ dialog#tts-modal {
/* Message action buttons */
.uncloseai-message-actions {
margin-top: 8px;
display: flex;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(auto, max-content));
gap: 8px;
opacity: 0.8;
justify-content: flex-end;
justify-content: end;
}
/* =================================================================== */
@ -813,18 +806,17 @@ dialog#tts-modal {
.uncloseai-modal-container {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
display: grid;
grid-template-columns: 1fr;
overflow: hidden;
}
.uncloseai-modal-header {
flex-shrink: 0;
padding: 16px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
display: flex;
justify-content: space-between;
display: grid;
grid-template-columns: 1fr auto;
align-items: center;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
@ -855,7 +847,6 @@ dialog#tts-modal {
/* Chat area */
.uncloseai-modal-chat-area {
flex: 1;
overflow-y: auto;
padding: 16px;
-webkit-overflow-scrolling: touch;
@ -864,8 +855,8 @@ dialog#tts-modal {
.uncloseai-chat-box {
max-width: 100%;
display: flex;
flex-direction: column;
display: grid;
grid-template-columns: 1fr;
gap: 12px;
}
@ -905,11 +896,11 @@ dialog#tts-modal {
/* Action grid and controls */
.uncloseai-modal-controls {
flex-shrink: 0;
padding: 8px 16px;
border-top: 1px solid rgba(0, 0, 0, 0.1);
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
display: flex;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: 8px;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
@ -917,17 +908,16 @@ dialog#tts-modal {
/* Input area */
.uncloseai-modal-input-area {
flex-shrink: 0;
padding: 16px;
display: flex;
display: grid;
grid-template-columns: 1fr auto;
gap: 12px;
align-items: flex-end;
align-items: end;
box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
}
/* Chat input */
.uncloseai-modal-input {
flex: 1;
min-height: 44px;
max-height: 120px;
padding: 12px;
@ -959,11 +949,9 @@ dialog#tts-modal {
cursor: pointer;
font-size: 20px;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
display: grid;
place-items: center;
transition: transform 0.2s;
flex-shrink: 0;
}
.uncloseai-modal-send-btn:hover {
@ -972,7 +960,7 @@ dialog#tts-modal {
/* Messages */
.user-message {
align-self: flex-end;
justify-self: end;
background: rgba(0, 123, 255, 0.95);
color: white;
padding: 12px 16px;
@ -982,7 +970,7 @@ dialog#tts-modal {
}
.ai-message {
align-self: flex-start;
justify-self: start;
background: rgba(255, 255, 255, 0.95);
color: #495057;
padding: 12px 16px;
@ -1152,13 +1140,13 @@ dialog#uncloseai-embedded-modal[data-theme="dark"] .user-message {
}
.widget-input-container {
display: flex;
display: grid;
grid-template-columns: 1fr auto;
gap: 10px;
margin-bottom: 10px;
}
.widget-input-field {
flex: 1;
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;

View file

@ -65,19 +65,18 @@ dialog#uncloseai-embedded-modal[data-theme="light"] {
.uncloseai-modal-container {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
display: grid;
grid-template-rows: auto 1fr auto auto;
overflow: hidden;
}
/* Header */
.uncloseai-modal-header {
flex-shrink: 0;
padding: 16px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
display: flex;
justify-content: space-between;
display: grid;
grid-template-columns: 1fr auto;
align-items: center;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
@ -92,9 +91,8 @@ dialog#uncloseai-embedded-modal[data-theme="light"] {
height: 36px;
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
display: grid;
place-items: center;
transition: background 0.2s;
margin-right: 8px;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
@ -106,7 +104,6 @@ dialog#uncloseai-embedded-modal[data-theme="light"] {
/* Chat area */
.uncloseai-modal-chat-area {
flex: 1;
overflow-y: auto;
padding: 16px;
-webkit-overflow-scrolling: touch;
@ -137,11 +134,11 @@ dialog#uncloseai-embedded-modal[data-theme="light"] {
/* Controls */
.uncloseai-modal-controls {
flex-shrink: 0;
padding: 8px 16px;
border-top: 1px solid rgba(0, 0, 0, 0.1);
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
display: flex;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: 8px;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
@ -149,17 +146,16 @@ dialog#uncloseai-embedded-modal[data-theme="light"] {
/* Input area */
.uncloseai-modal-input-area {
flex-shrink: 0;
padding: 16px;
display: flex;
display: grid;
grid-template-columns: 1fr auto;
gap: 12px;
align-items: flex-end;
align-items: end;
box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
}
/* Input field */
.uncloseai-modal-input {
flex: 1;
min-height: 44px;
max-height: 120px;
padding: 12px;
@ -189,11 +185,9 @@ dialog#uncloseai-embedded-modal[data-theme="light"] {
cursor: pointer;
font-size: 20px;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
display: grid;
place-items: center;
transition: transform 0.2s;
flex-shrink: 0;
}
.uncloseai-modal-send-btn:hover {
@ -203,13 +197,13 @@ dialog#uncloseai-embedded-modal[data-theme="light"] {
/* Chat messages */
.uncloseai-chat-box {
max-width: 100%;
display: flex;
flex-direction: column;
display: grid;
grid-template-columns: 1fr;
gap: 12px;
}
.user-message {
align-self: flex-end;
justify-self: end;
background: #007bff;
color: white;
padding: 12px 16px;
@ -219,7 +213,7 @@ dialog#uncloseai-embedded-modal[data-theme="light"] {
}
.ai-message {
align-self: flex-start;
justify-self: start;
background: white;
color: #495057;
padding: 12px 16px;
@ -281,8 +275,8 @@ dialog#translate-modal {
color: white;
padding: 16px 20px;
margin: -1em -1em 1em -1em;
display: flex;
justify-content: space-between;
display: grid;
grid-template-columns: 1fr auto;
align-items: center;
}
@ -300,9 +294,8 @@ dialog#translate-modal {
padding: 0;
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
display: grid;
place-items: center;
}
.translate-modal-header .close-btn:hover {
@ -312,11 +305,12 @@ dialog#translate-modal {
/* Tab navigation */
.translate-tab-nav {
list-style: none;
display: flex;
display: grid;
grid-template-columns: 1fr 1fr;
margin: 0;
padding: 0;
border-bottom: 2px solid #e9ecef;
gap: 0;
gap: 2px;
margin-bottom: 20px;
}
@ -402,7 +396,6 @@ dialog#translate-modal {
}
.translate-tab-nav li {
flex: 1;
margin: 0;
}
@ -538,8 +531,8 @@ dialog#tts-modal {
background: linear-gradient(45deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 20px;
display: flex;
justify-content: space-between;
display: grid;
grid-template-columns: 1fr auto;
align-items: center;
}
@ -557,22 +550,20 @@ dialog#tts-modal {
padding: 0;
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
display: grid;
place-items: center;
}
/* TTS content container */
.tts-modal-content {
padding: 20px;
overflow-y: auto;
flex: 1;
}
/* TTS modal article */
.tts-modal-article {
display: flex;
flex-direction: column;
display: grid;
grid-template-rows: auto 1fr auto;
height: 100%;
overflow: hidden;
}
@ -618,14 +609,15 @@ dialog#tts-modal {
/* Voice selection */
.tts-voice-container {
display: flex;
flex-wrap: wrap;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 10px;
margin: 16px 0;
}
.tts-voice-label {
display: flex;
display: grid;
grid-template-columns: auto 1fr;
align-items: center;
gap: 5px;
cursor: pointer;
@ -634,7 +626,8 @@ dialog#tts-modal {
/* Speed control */
.tts-speed-control {
margin: 16px 0;
display: flex;
display: grid;
grid-template-columns: auto 1fr auto;
align-items: center;
gap: 10px;
}
@ -657,7 +650,8 @@ dialog#tts-modal {
/* Audio controls */
.tts-audio-controls {
display: flex;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
align-items: center;
gap: 12px;
padding: 12px;
@ -683,7 +677,6 @@ dialog#tts-modal {
}
.tts-progress-container {
flex: 1;
height: 6px;
background: #e0e0e0;
border-radius: 3px;
@ -705,13 +698,14 @@ dialog#tts-modal {
/* Container Classes */
.uncloseai-flex-container {
display: flex;
flex-direction: column;
display: grid;
grid-template-columns: 1fr;
gap: 12px;
}
.uncloseai-flex-row {
display: flex;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(auto, max-content));
align-items: center;
gap: 8px;
}
@ -785,9 +779,8 @@ dialog#tts-modal {
border: none;
color: white;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
display: grid;
place-items: center;
font-size: 18px;
transition: background 0.2s;
}
@ -819,9 +812,8 @@ dialog#tts-modal {
}
.uncloseai-title-container {
flex: 1;
display: flex;
flex-direction: column;
display: grid;
grid-template-columns: 1fr;
gap: 4px;
}
@ -849,10 +841,11 @@ dialog#tts-modal {
/* Message action buttons */
.uncloseai-message-actions {
margin-top: 8px;
display: flex;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(auto, max-content));
gap: 8px;
opacity: 0.8;
justify-content: flex-end;
justify-content: end;
}
/* =================================================================== */
@ -863,18 +856,17 @@ dialog#tts-modal {
.uncloseai-modal-container {
width: 100% !important;
height: 100% !important;
display: flex !important;
flex-direction: column !important;
display: grid !important;
grid-template-rows: auto 1fr auto auto !important;
overflow: hidden !important;
}
.uncloseai-modal-header {
flex-shrink: 0 !important;
padding: 16px !important;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important;
color: white !important;
display: flex !important;
justify-content: space-between !important;
display: grid !important;
grid-template-columns: 1fr auto !important;
align-items: center !important;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1) !important;
}
@ -905,7 +897,6 @@ dialog#tts-modal {
/* Chat area */
.uncloseai-modal-chat-area {
flex: 1 !important;
overflow-y: auto !important;
padding: 16px !important;
-webkit-overflow-scrolling: touch !important;
@ -913,14 +904,13 @@ dialog#tts-modal {
.uncloseai-chat-box {
max-width: 100% !important;
display: flex !important;
flex-direction: column !important;
display: grid !important;
grid-template-columns: 1fr !important;
gap: 12px !important;
}
/* Settings panel */
.uncloseai-modal-settings {
flex-shrink: 0 !important;
border-top: 1px solid rgba(0, 0, 0, 0.1) !important;
border-bottom: 1px solid rgba(0, 0, 0, 0.1) !important;
padding: 16px !important;
@ -946,11 +936,11 @@ dialog#tts-modal {
/* Action grid and controls */
.uncloseai-modal-controls {
flex-shrink: 0 !important;
padding: 8px 16px !important;
border-top: 1px solid rgba(0, 0, 0, 0.1) !important;
border-bottom: 1px solid rgba(0, 0, 0, 0.1) !important;
display: flex !important;
display: grid !important;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)) !important;
gap: 8px !important;
overflow-x: auto !important;
-webkit-overflow-scrolling: touch !important;
@ -958,17 +948,16 @@ dialog#tts-modal {
/* Input area */
.uncloseai-modal-input-area {
flex-shrink: 0 !important;
padding: 16px !important;
display: flex !important;
display: grid !important;
grid-template-columns: 1fr auto !important;
gap: 12px !important;
align-items: flex-end !important;
align-items: end !important;
box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1) !important;
}
/* Chat input */
.uncloseai-modal-input {
flex: 1 !important;
min-height: 44px !important;
max-height: 120px !important;
padding: 12px !important;
@ -1000,11 +989,9 @@ dialog#tts-modal {
cursor: pointer !important;
font-size: 20px !important;
font-weight: bold !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
display: grid !important;
place-items: center !important;
transition: transform 0.2s !important;
flex-shrink: 0 !important;
}
.uncloseai-modal-send-btn:hover {
@ -1013,7 +1000,7 @@ dialog#tts-modal {
/* Messages */
.user-message {
align-self: flex-end !important;
justify-self: end !important;
background: rgba(0, 123, 255, 0.95) !important;
color: white !important;
padding: 12px 16px !important;
@ -1023,7 +1010,7 @@ dialog#tts-modal {
}
.ai-message {
align-self: flex-start !important;
justify-self: start !important;
background: rgba(255, 255, 255, 0.95) !important;
color: #495057 !important;
padding: 12px 16px !important;
@ -1193,13 +1180,13 @@ dialog#uncloseai-embedded-modal[data-theme="dark"] .user-message {
}
.widget-input-container {
display: flex;
display: grid;
grid-template-columns: 1fr auto;
gap: 10px;
margin-bottom: 10px;
}
.widget-input-field {
flex: 1;
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;