-
❓ .gitignoreUnknown, 37 B⬇
-
❓ README.mdUnknown, 2.94 kB⬇
-
🌐 admin_panel.phpWeb, 1.54 kB⬇
-
🌐 api.jsWeb, 22.21 kB⬇
-
🌐 api.phpWeb, 9.62 kB⬇
-
🌐 app.jsWeb, 61.42 kB⬇
-
🌐 attachments.jsWeb, 7.30 kB⬇
-
🌐 base.cssWeb, 2.23 kB⬇
-
🌐 choices-editor.jsWeb, 28.11 kB⬇
-
🌐 choices.cssWeb, 1.14 kB⬇
-
🌐 content.jsWeb, 31.08 kB⬇
-
🌐 context.jsWeb, 9.26 kB⬇
-
🌐 conversation-index.jsWeb, 10.74 kB⬇
-
🌐 conversation.cssWeb, 16.33 kB⬇
-
🌐 conversation.jsWeb, 1.11 kB⬇
-
🌐 dialogs.cssWeb, 11.43 kB⬇
-
🌐 diction.jsWeb, 948 B⬇
-
🌐 document-index.jsWeb, 1.04 kB⬇
-
🌐 document-model.jsWeb, 12.88 kB⬇
-
🌐 document.cssWeb, 6.74 kB⬇
-
🌐 document.jsWeb, 44.96 kB⬇
-
🌐 dynamic.phpWeb, 533 B⬇
-
📷 favicon-lg.pngImage, 9.11 kB⬇
-
📷 favicon.pngImage, 3.12 kB⬇
-
🌐 index-lists.cssWeb, 4.77 kB⬇
-
🌐 index.phpWeb, 49.72 kB⬇
-
🌐 indexjs.jsWeb, 377 B⬇
-
🌐 instant-answer.cssWeb, 5.17 kB⬇
-
🌐 layout.cssWeb, 11.37 kB⬇
-
🌐 login.phpWeb, 997 B⬇
-
❓ manifest.webmanifestUnknown, 262 B⬇
-
🌐 memory.jsWeb, 407 B⬇
-
🌐 mermaid.cssWeb, 6.16 kB⬇
-
🌐 model-presets.jsonWeb, 5.51 kB⬇
-
🌐 models.jsonWeb, 8.05 kB⬇
-
🌐 notes.cssWeb, 11.97 kB⬇
-
🌐 overlays.cssWeb, 13.97 kB⬇
-
⚠️ php.iniOS File, 424 B⬇
-
🌐 rankings-view.jsWeb, 5.67 kB⬇
-
🌐 rankings.cssWeb, 3.35 kB⬇
-
🌐 scratchpad-conversation.jsWeb, 4.87 kB⬇
-
🌐 scratchpad-index.jsWeb, 15.55 kB⬇
-
🌐 scratchpad-model.jsWeb, 13.29 kB⬇
-
🌐 scratchpad.cssWeb, 3.12 kB⬇
-
🌐 settings.cssWeb, 4.65 kB⬇
-
🌐 shared-view.cssWeb, 3.48 kB⬇
-
🌐 shared.cssWeb, 16.26 kB⬇
-
🌐 shared.jsWeb, 14.63 kB⬇
-
🌐 shared.phpWeb, 3.28 kB⬇
-
🌐 sticky-notes-editor.jsWeb, 64.84 kB⬇
-
🌐 storage.jsWeb, 36.73 kB⬇
-
🌐 style.cssWeb, 12.06 kB⬇
-
🌐 sw.jsWeb, 1.69 kB⬇
-
🌐 sync.jsWeb, 19.02 kB⬇
-
🌐 tools-index.jsWeb, 15.00 kB⬇
-
🌐 users.jsWeb, 49.86 kB⬇
-
🌐 utility-models.jsonWeb, 1.04 kB⬇
-
🌐 voice-models.jsonWeb, 4.81 kB⬇
/* Conversation area: response rendering chrome, tab bar, prompt buttons, option chips, empty state, response toolbars, and conversation links. */
.div-attachments-split {
display: flex;
flex-direction: column;
min-height: 100%;
padding: var(--DM-margin);
gap: var(--DM-margin);
box-sizing: border-box;
}
.div-attachments-conversation {
flex: 0 0 auto;
}
.div-attachments-global {
flex: 1 1 auto;
min-height: 0;
overflow-y: auto;
}
.div-attachments-actions {
flex: 0 0 auto;
display: flex;
gap: var(--DM-margin-q);
justify-content: flex-end;
}
.div-attachment-row {
display: flex;
align-items: center;
gap: var(--DM-margin-q);
padding: 2pt 0;
}
.span-attachment-name {
flex: 1 1 auto;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
min-width: 0;
}
.span-attachment-size {
flex: 0 0 auto;
opacity: 0.7;
font-size: 0.9em;
}
.p-attachments-empty {
opacity: 0.6;
}
.div-chat-title-bar{
position: relative;
display: flex;
align-items: center;
gap: var(--DM-margin-s);
padding: var(--DM-margin-q) var(--DM-margin) var(--DM-margin-q) var(--DM-margin);
background-color: var(--BG-panel);
}
/* Pencil button and title share one underline that fades out to the right. */
.div-chat-title-inner {
display: flex;
align-items: center;
gap: var(--DM-margin-s);
flex: 1;
min-width: 0;
border-bottom: 1pt solid var(--BD-panel);
mask-image: linear-gradient(to right, black calc(100% - 3em), transparent 100%);
-webkit-mask-image: linear-gradient(to right, black calc(100% - 3em), transparent 100%);
}
#id-div-response-title h4 {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
line-clamp: 2;
overflow: hidden;
}
/* Title edit dialog: the pencil button beside the title and the text entry
with the magic wand that fills it with a generated title. */
.btn-title-edit {
height: 14pt;
line-height: 14pt;
padding: 0 2pt;
border: none;
background: none;
cursor: pointer;
opacity: 0.5;
flex: 0 0 auto;
}
.btn-title-edit:hover {
opacity: 1;
/* background highlight instead of the global button hover glow, which
the title underline's fade mask cuts off */
background-color: var(--BG-panel2);
box-shadow: none;
filter: none;
}
.div-title-dialog-row {
display: flex;
align-items: stretch;
gap: var(--DM-margin-q);
}
.div-title-dialog-row input {
flex: 1;
min-width: 0;
margin-bottom: 0;
}
/* The magic wand stretches to the text entry's height and gets the rounded
buttons styling used across the dialogs. */
.div-title-dialog-row button {
border: 1pt solid var(--AC-btn);
border-radius: var(--DM-margin-q);
padding: 0 var(--DM-margin-q);
cursor: pointer;
}
.div-tab-bar {
display: flex;
align-items: center;
flex-wrap: wrap;
margin: 0 var(--DM-margin);
}
.div-tab-bar button {
border: 1pt solid var(--BD-panel-l);
border-bottom: none;
border-radius: var(--DM-margin-q) var(--DM-margin-q) 0 0;
padding: var(--DM-margin-q);
cursor: pointer;
}
/* Icon actions next to the sync switch: regular buttons, not tabs, sized
to the tab row height so the bar keeps a single line */
.div-tab-bar button.btn-tab-action {
border-bottom: 1pt solid var(--BD-panel-l);
border-radius: var(--DM-margin-q);
display: inline-flex;
align-items: center;
justify-content: center;
height: 2em;
padding: 0 0.3em;
margin-left: 0.35em;
position: relative;
}
/* Share status dot (util/share.js): success while the conversation matches
its shared copy, alert once it changed; hidden while not shared. */
.span-share-dot {
display: none;
position: absolute;
top: -2px;
right: -2px;
width: 0.5em;
height: 0.5em;
border-radius: 50%;
}
.btn-tab-action.btn-share-updated .span-share-dot {
display: block;
background-color: var(--TX-status-success);
}
.btn-tab-action.btn-share-outdated .span-share-dot {
display: block;
background-color: var(--TX-status-error);
}
.btn-tab-action svg {
width: 1.15em;
height: 1.15em;
display: block;
fill: currentColor;
}
.label-sync-switch {
display: inline-flex;
align-items: center;
gap: 0.4em;
margin-left: auto;
cursor: pointer;
}
.label-sync-switch input {
position: absolute;
opacity: 0;
pointer-events: none;
width: 1px;
height: 1px;
margin: 0;
}
.span-sync-switch {
display: inline-block;
width: 2.1em;
height: 1.1em;
border: 1px solid var(--BD-panel-l);
border-radius: 1em;
background: var(--BG-panel);
position: relative;
transition: background 0.15s ease, border-color 0.15s ease;
}
.span-sync-switch::after {
content: '';
position: absolute;
top: 50%;
left: 0.15em;
width: 0.8em;
height: 0.8em;
border-radius: 50%;
background: var(--FG-muted);
transform: translateY(-50%);
transition: left 0.15s ease, background 0.15s ease;
}
.label-sync-switch input:checked + .span-sync-switch {
background: var(--AC-trim);
border-color: var(--AC-trim);
}
.label-read-option input:checked + .span-sync-switch {
background: var(--AC-btn);
border-color: var(--AC-btn);
}
.label-read-option input:checked + .span-sync-switch::after {
background: var(--BG-base);
}
.label-sync-switch input:checked + .span-sync-switch::after {
left: calc(100% - 0.95em);
background: var(--BG-base);
}
.label-sync-switch:has(input:focus-visible) .span-sync-switch {
outline: 2px solid var(--AC-btn);
outline-offset: 2px;
}
.span-title-sync {
margin-left: 0.3em;
}
.span-title-sync.is-syncing {
opacity: 0.35;
}
#btn-send.sending-sync::after {
content: ' \2601\FE0E';
}
.div-tab-bar button.active {
border-color: var(--BD-panel);
text-decoration: underline;
}
.div-tab-bar button:not(.active) {
background-color: var(--BG-panel);
}
.div-tab-bar button:hover {
box-shadow: 0 0 6px var(--BD-panel);
}
.div-tab-bar button:focus {
outline: none;
}
.div-chat-container{
padding: var(--DM-margin-h);
min-width: 0;
}
#id-div-response-title {
flex: 1;
min-width: 0;
padding-right: 2em;
}
#id-span-title-loading {
position: absolute;
right: var(--DM-margin);
top: var(--DM-margin-q);
height: 2.0em;
display: inline-flex;
align-items: center;
justify-content: center;
user-select: none;
}
#div-response-progress {
margin-top: 0;
margin-bottom: var(--DM-margin-h);
display: flex;
justify-content: space-between;
align-items: center;
.span-progress-tokens {
flex: 1;
margin: 0 8px;
overflow: hidden;
white-space: nowrap;
}
button {
height: 18pt;
font-size: 8pt;
text-transform: uppercase;
line-height: 9pt;
border: 1pt solid var(--AC-btn);
border-radius: var(--DM-margin-q);
padding: var(--DM-margin-s);
min-width: 3em;
cursor: pointer;
}
}
.div-chat-buttons{
display: grid;
grid-template-columns: 1fr 0.5em 1fr 1fr 0.5em 1fr;
grid-column-gap: var(--DM-margin-q);
align-items: center;
&.scratchpad-buttons {
grid-template-columns: 1fr 0.5em 1fr 1fr 1fr 0.5em 1fr;
}
&.ranking-buttons {
grid-template-columns: 1fr 0.5em 1fr 1fr 0.5em 1fr 1fr;
}
&.document-buttons {
display: flex;
gap: var(--DM-margin-h);
align-items: center;
.div-prompt-buttons-group {
display: contents;
}
.div-prompt-buttons-group > div {
display: none;
}
button, select {
flex: 1 1 0;
width: auto;
min-width: 0;
}
}
/* the flex display is required for base-select to paint its picker icon
(a non-important display is ignored), so hiding goes through a class
that out-specifies this !important instead of an inline style */
select.div-document-export {
display: flex !important;
align-items: center;
justify-content: center;
padding: var(--DM-margin-q);
}
select.div-document-export::picker-icon {
margin-inline-start: 0.25em;
}
select.div-document-export.export-hidden {
display: none !important;
}
button, select {
height: 18pt;
font-size: 8pt;
text-transform: uppercase;
line-height: 9pt;
border: 1pt solid var(--AC-btn);
border-radius: var(--DM-margin-q);
padding: var(--DM-margin-s);
min-width: 3em;
cursor: pointer;
}
}
.div-prompt-buttons-group {
display: contents;
}
.btn-read-dim {
opacity: 0.5;
}
/* Highlights the action button (Rank / Send) a query chip targets */
.btn-action-highlight {
border-color: var(--AC-trim) !important;
box-shadow: 0 0 6px var(--AC-trim) !important;
}
.label-read-option {
margin-left: 0;
gap: 0.3em;
font-size: 7.5pt;
height: 16pt;
padding: 2px 6px;
background: var(--BG-base);
border: 1px solid var(--AC-btn);
border-radius: var(--DM-margin-q);
box-sizing: border-box;
}
.response-reading {
background-color: var(--AC-trim-tint-soft);
}
.span-read-loading {
margin: 0;
font-size: 8pt;
align-self: center;
color: var(--AC-btn);
}
/* Horizontal margins match the prompt inset so the chips align with the
prompt box; the layout-state rules below adjust the bottom spacing. */
.div-options-chips {
margin: var(--DM-margin-q) var(--DM-margin) 0 var(--DM-margin);
}
/* Layout-state context overrides: the panel-state classes belong to
layout.css; these adjust conversation chrome per state. */
.div-structure-body-v-i-c .div-options-chips,
.div-structure-body-v-c .div-options-chips,
.div-structure-body-i-c .div-options-chips {
padding-bottom: var(--DM-margin-h);
}
.div-structure-body-c .div-options-chips {
padding-bottom: 0;
margin-left: calc(var(--DM-margin) / 2);
margin-right: calc(var(--DM-margin) / 2);
}
.span-query-chip {
border-radius: 1em;
padding: var(--DM-margin-s) var(--DM-margin-q);
margin: 0 var(--DM-margin-q) 0 0;
font-size: 80%;
cursor: pointer;
}
.span-option-chip {
display: inline-block;
border: 1px solid var(--AC-btn);
border-radius: 1em;
padding: 0 var(--DM-margin-q);
margin: var(--DM-margin-s) var(--DM-margin-s) 0 0;
font-size: 80%;
text-transform: uppercase;
cursor: pointer;
white-space: nowrap;
}
@media screen and (max-width: 780px) {
.span-option-chip {
font-size: 70%;
margin: 0 1pt 0 0;
padding: 0 var(--DM-margin-s);
}
}
.span-clickable-query {
text-decoration: underline;
}
.consideration-item {
border: 1px solid var(--BD-panel-l);
padding: var(--DM-margin-q);
margin-bottom: var(--DM-margin-q);
border-radius: var(--DM-margin-q);
}
#new-topic-input,
#new-consideration-input {
width: 100%;
box-sizing: border-box;
margin: var(--DM-margin-q) 0;
padding: var(--DM-margin-q);
border: 1pt solid var(--BD-input);
border-radius: var(--DM-margin-q);
background-color: var(--BG-base);
color: var(--FG-base);
}
#new-topic-input:hover,
#new-consideration-input:hover {
border-color: var(--BD-input);
}
#new-topic-input:focus,
#new-consideration-input:focus {
outline: 2px solid var(--BD-input);
border-color: var(--BD-input);
}
#new-consideration-input {
min-height: 4.5em;
resize: vertical;
font-family: inherit;
line-height: 1.4em;
}
.div-chat-empty {
min-height: 100%;
box-sizing: border-box;
display: grid;
grid-template-rows: 1fr;
}
.div-chat-empty .simplebar-content {
display: grid;
grid-template-rows: auto;
min-height: 100%;
}
/* Keep the track inside the container's rounded frame instead of touching
its edges. */
.div-chat-empty .simplebar-track.simplebar-vertical {
top: var(--DM-margin-q);
bottom: var(--DM-margin-q);
right: var(--DM-margin-q);
}
.div-chat-empty-header {
padding: var(--DM-margin);
background-color: var(--BG-panel);
}
.div-chat-empty-inset {
display: grid;
place-items: center;
height: 80%;
margin: var(--DM-margin);
}
.div-chat-empty-inset > div {
display: flex;
flex-direction: column;
align-items: center;
width: 100%;
gap: 20px;
}
.div-chat-empty-row {
display: flex;
gap: var(--DM-margin-h);
width: 100%;
max-width: 400px;
}
.div-chat-empty-row button, .div-chat-empty-row select {
flex: 1;
width: 100%;
box-sizing: border-box;
margin-bottom: 0;
}
.div-chat-empty-row select {
/* !important required: Chromium base-select ignores the flex display on first paint otherwise */
display: flex !important;
align-items: center;
}
.div-chat-empty-inset button {
width: 100%;
max-width: 400px;
min-width: 40%;
box-sizing: border-box;
margin-bottom: 20px;
}
.div-chat-empty-inset button:last-child {
margin-bottom: 0;
}
/* Compact response toolbar buttons (chat and scratchpad responses carry the
btn-compact class). The element+class selector ties with the ancestor
.div-structure-chat-container button sizing and wins on file order. */
button.btn-compact {
height: 16pt;
line-height: 8pt;
font-size: 7.5pt;
padding: 2px 6px;
vertical-align: middle;
min-width: unset;
margin: 0;
}
.div-chat-response-buttons {
display: flex;
justify-content: flex-start;
align-items: center;
flex-wrap: wrap;
gap: var(--DM-margin-q);
margin: var(--DM-margin-q) 0;
}
.div-chat-response-buttons-left, .div-chat-response-buttons-right {
display: flex;
gap: var(--DM-margin-q);
}
.div-chat-response-buttons-right {
margin-left: auto;
}
.div-chat-read-controls {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: var(--DM-margin-q);
}
.span-read-cost {
font-size: 0.75em;
white-space: nowrap;
align-self: center;
}
/* Measurement helper: force one row so the fit test can detect overflow */
.div-chat-response-buttons.wrap-check {
flex-wrap: nowrap;
}
.div-chat-response-buttons.wrap-check > div {
flex-shrink: 0;
}
/* Wrapped: copy with redo/undo/delete on the first row, audio controls on
the second (see ChatRenderer._bind_response_toolbar_wrap) */
.div-chat-response-buttons.wrapped {
align-items: flex-start;
}
.div-chat-response-buttons.wrapped .div-chat-read-controls {
order: 1;
flex-basis: 100%;
}
.div-chat-item .div-chat-response-buttons {
position: sticky;
top: 0;
z-index: 10;
background-color: var(--BG-base);
border-bottom: 1pt solid var(--BD-divider);
margin: 0 calc(-1 * var(--DM-margin-h)) var(--DM-margin-q) calc(-1 * var(--DM-margin-h));
padding: var(--DM-margin-q) var(--DM-margin-h);
}
@media screen and (max-width: 780px) {
.div-chat-response-buttons {
align-items: flex-start;
}
.div-chat-read-controls {
order: 1;
flex-basis: 100%;
}
}
/* Conversation Area Link Styles: contextual link theming for the
conversation surfaces (containers owned by layout.css, overlays by
overlays.css) */
.div-chat-container-scroll a,
.div-chat-container-scroll a:link,
.div-chat-container-scroll a:visited,
.div-chat-document-scroll a,
.div-chat-document-scroll a:link,
.div-chat-document-scroll a:visited,
#id-div-response-render a,
#id-div-response-render a:link,
#id-div-response-render a:visited,
.div-response-content a,
.div-response-content a:link,
.div-response-content a:visited,
#id-table-overlay-view a,
#id-table-overlay-view a:link,
#id-table-overlay-view a:visited,
#id-table-overlay-title a,
#id-table-overlay-title a:link,
#id-table-overlay-title a:visited {
color: var(--TX-link);
text-decoration: underline;
text-underline-offset: 2px;
}
.div-chat-container-scroll a:hover,
.div-chat-container-scroll a:active,
.div-chat-context-scroll a:hover,
.div-chat-document-scroll a:hover,
.div-chat-document-scroll a:active,
#id-div-response-render a:hover,
#id-div-response-render a:active,
.div-response-content a:hover,
.div-response-content a:active,
#id-table-overlay-view a:hover,
#id-table-overlay-view a:active,
#id-table-overlay-title a:hover,
#id-table-overlay-title a:active {
color: var(--FG-base);
text-decoration: underline;
}
/* Conversation tables: horizontal scroll container so wide tables stay inside their column */
.div-table-scroll {
overflow-x: auto;
max-width: 100%;
}
conversation.css
×
Type: Web, text/plain
16.33 Kilobytes
Last Modified 2026-11-04 09:48:28
⬇ Download File
Type: Web, text/plain
16.33 Kilobytes
Last Modified 2026-11-04 09:48:28
⬇ Download File