anentrypoint-design 0.0.175 → 0.0.177
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/247420.js +12 -12
- package/package.json +1 -1
- package/src/components/chat.js +71 -8
- package/src/components/interaction-primitives.js +50 -0
- package/src/components.js +1 -1
- package/src/kits/os/freddie/pages-chat.js +112 -33
- package/src/kits/os/freddie-dashboard.css +18 -0
- package/src/kits/os/theme.css +514 -0
package/src/kits/os/theme.css
CHANGED
|
@@ -760,3 +760,517 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
|
|
|
760
760
|
.wm-win { position: static !important; box-shadow: none !important; border: 1px solid var(--fg) !important; page-break-inside: avoid; margin: 0 0 12px; width: auto !important; height: auto !important; }
|
|
761
761
|
.wm-win.wm-min { display: none !important; }
|
|
762
762
|
}
|
|
763
|
+
|
|
764
|
+
/* ============================================================================
|
|
765
|
+
* Relocated from thebird (2026-05-30) — moves design CSS out of docs/*.js
|
|
766
|
+
* modules to enforce the zero-design-CSS-in-thebird rule.
|
|
767
|
+
* Source files: docs/chat-config.js, docs/fsbrowse-app.js, docs/wm.js,
|
|
768
|
+
* docs/apps.js (todo-app), docs/freddie-keys.js.
|
|
769
|
+
* ============================================================================ */
|
|
770
|
+
|
|
771
|
+
/* ---- chat-config strip (was: docs/chat-config.js ensureStyles) ---- */
|
|
772
|
+
.ds-247420 .wm-body:has(> .freddie-chat-wrap) { display: flex; flex-direction: column; padding: 0; }
|
|
773
|
+
.ds-247420 .freddie-chat-wrap { position: absolute; inset: 0; display: flex; flex-direction: column; min-height: 0; }
|
|
774
|
+
.ds-247420 .freddie-chat-wrap > freddie-chat { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; overflow: hidden; }
|
|
775
|
+
.ds-247420 .cc-strip { flex: 0 0 auto; font-size: 12px; border-bottom: 1px solid color-mix(in oklab, var(--fg) 16%, transparent); }
|
|
776
|
+
.ds-247420 .cc-toggle { all: unset; cursor: pointer; display: inline-flex; align-items: center; gap: .4em; padding: .35em .7em; color: var(--fg, inherit); opacity: .75; }
|
|
777
|
+
.ds-247420 .cc-toggle:hover { opacity: 1; }
|
|
778
|
+
.ds-247420 .cc-toggle.cc-open { opacity: 1; font-weight: 600; }
|
|
779
|
+
.ds-247420 .cc-body { padding: .5em .7em .7em; display: flex; flex-direction: column; gap: .5em; max-height: 42vh; overflow: auto; }
|
|
780
|
+
.ds-247420 .cc-body[hidden] { display: none; }
|
|
781
|
+
.ds-247420 .cc-row { display: flex; gap: .6em; flex-wrap: wrap; }
|
|
782
|
+
.ds-247420 .cc-row > .cc-field { flex: 1 1 140px; min-width: 0; }
|
|
783
|
+
.ds-247420 .cc-field { display: flex; flex-direction: column; gap: .2em; }
|
|
784
|
+
.ds-247420 .cc-field-label { font-size: 11px; opacity: .65; text-transform: lowercase; }
|
|
785
|
+
.ds-247420 .cc-strip select,
|
|
786
|
+
.ds-247420 .cc-strip input { font: inherit; font-size: 12px; padding: .3em .4em; width: 100%; box-sizing: border-box; background: var(--panel-1, transparent); color: var(--fg, inherit); border: 1px solid color-mix(in oklab, var(--fg) 18%, transparent); border-radius: 6px; }
|
|
787
|
+
.ds-247420 .cc-acp-mode-wrap { display: flex; align-items: center; gap: .4em; }
|
|
788
|
+
.ds-247420 .cc-acp-mode-wrap select { flex: 1; }
|
|
789
|
+
.ds-247420 .cc-acp-status { opacity: .5; font-size: 13px; }
|
|
790
|
+
.ds-247420 .cc-acp-status.cc-reachable { opacity: 1; color: var(--os-accent, #247420); }
|
|
791
|
+
.ds-247420 .cc-details > summary { cursor: pointer; opacity: .7; padding: .2em 0; }
|
|
792
|
+
.ds-247420 .cc-skills,
|
|
793
|
+
.ds-247420 .cc-plugins { display: flex; flex-wrap: wrap; gap: .3em .8em; padding: .3em 0; }
|
|
794
|
+
.ds-247420 .cc-check { display: inline-flex; align-items: center; gap: .3em; cursor: pointer; }
|
|
795
|
+
.ds-247420 .cc-check input { width: auto; }
|
|
796
|
+
.ds-247420 .cc-empty { opacity: .5; font-style: italic; }
|
|
797
|
+
|
|
798
|
+
/* ---- fsbrowse files app (was: docs/fsbrowse-app.js ensureStyles) ---- */
|
|
799
|
+
.ds-247420 .fsb-root { position: absolute; inset: 0; display: flex; flex-direction: column; min-height: 0; font-size: 13px; color: var(--fg, inherit); }
|
|
800
|
+
.ds-247420 .fsb-bar { flex: 0 0 auto; display: flex; align-items: center; gap: .4em; padding: .45em .6em; border-bottom: 1px solid color-mix(in oklab, var(--fg) 16%, transparent); flex-wrap: wrap; }
|
|
801
|
+
.ds-247420 .fsb-crumbs { flex: 1; display: flex; align-items: center; gap: .2em; min-width: 0; overflow: auto; white-space: nowrap; }
|
|
802
|
+
.ds-247420 .fsb-crumb { cursor: pointer; opacity: .75; text-decoration: none; color: inherit; }
|
|
803
|
+
.ds-247420 .fsb-crumb:hover { opacity: 1; text-decoration: underline; }
|
|
804
|
+
.ds-247420 .fsb-crumb-sep { opacity: .4; }
|
|
805
|
+
.ds-247420 .fsb-btn { all: unset; cursor: pointer; padding: .3em .55em; border: 1px solid color-mix(in oklab, var(--fg) 18%, transparent); border-radius: 6px; opacity: .85; }
|
|
806
|
+
.ds-247420 .fsb-btn:hover { opacity: 1; background: color-mix(in oklab, var(--fg) 6%, transparent); }
|
|
807
|
+
.ds-247420 .fsb-list { flex: 1; min-height: 0; overflow: auto; padding: .3em 0; }
|
|
808
|
+
.ds-247420 .fsb-row { display: flex; align-items: center; gap: .6em; padding: .35em .7em; cursor: pointer; border: 0; }
|
|
809
|
+
.ds-247420 .fsb-row:hover { background: color-mix(in oklab, var(--fg) 6%, transparent); }
|
|
810
|
+
.ds-247420 .fsb-icon { width: 1.3em; text-align: center; flex: 0 0 auto; }
|
|
811
|
+
.ds-247420 .fsb-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
812
|
+
.ds-247420 .fsb-size { opacity: .55; font-size: 11px; font-variant-numeric: tabular-nums; flex: 0 0 auto; }
|
|
813
|
+
.ds-247420 .fsb-actions { display: flex; gap: .3em; flex: 0 0 auto; opacity: 0; }
|
|
814
|
+
.ds-247420 .fsb-row:hover .fsb-actions { opacity: 1; }
|
|
815
|
+
.ds-247420 .fsb-act { all: unset; cursor: pointer; padding: .1em .35em; border-radius: 5px; opacity: .7; font-size: 12px; }
|
|
816
|
+
.ds-247420 .fsb-act:hover { opacity: 1; background: color-mix(in oklab, var(--fg) 12%, transparent); }
|
|
817
|
+
.ds-247420 .fsb-empty { opacity: .5; padding: 1.5em; text-align: center; font-style: italic; }
|
|
818
|
+
.ds-247420 .fsb-view { flex: 1; min-height: 0; overflow: auto; margin: 0; padding: .7em; white-space: pre-wrap; word-break: break-word; font: 12px/1.5 var(--os-mono, ui-monospace, monospace); background: var(--panel-1, transparent); }
|
|
819
|
+
.ds-247420 .fsb-dropping { outline: 2px dashed var(--os-accent, #247420); outline-offset: -6px; }
|
|
820
|
+
|
|
821
|
+
/* ---- wm canvas (infinite zoom/pan surface — was: docs/desktop-camera.js canvas.style.cssText) ----
|
|
822
|
+
* .wm-root is the fixed clipping viewport; .wm-canvas is the inner transformed
|
|
823
|
+
* layer that carries translate()/scale() updates per camera tick. Compositor-
|
|
824
|
+
* promoted via will-change:transform so per-frame pan/zoom does GPU-only work. */
|
|
825
|
+
.ds-247420 .wm-canvas { position: absolute; inset: 0; transform-origin: 0 0; will-change: transform; }
|
|
826
|
+
|
|
827
|
+
/* ---- wm context menu (was: docs/wm.js showWindowMenu cssText) ---- */
|
|
828
|
+
.ds-247420 .wm-context-menu { position: fixed; background: var(--panel-2, #1a1a1a); border: 1px solid color-mix(in oklab, var(--fg) 18%, transparent); border-radius: 6px; z-index: 9700; font-family: var(--ff-ui); color: var(--fg, #fff); min-width: 140px; box-shadow: 0 8px 32px rgba(0, 0, 0, .35); padding: 4px; }
|
|
829
|
+
.ds-247420 .wm-context-menu-item { display: block; width: 100%; padding: 7px 10px; border: none; border-radius: 4px; background: none; color: inherit; font-family: inherit; text-align: left; cursor: pointer; font-size: 13px; }
|
|
830
|
+
.ds-247420 .wm-context-menu-item:hover { background: color-mix(in oklab, var(--fg) 8%, transparent); }
|
|
831
|
+
|
|
832
|
+
/* ---- wm snap preview (was: docs/wm.js snapPreviewEl cssText) ---- */
|
|
833
|
+
.ds-247420 .wm-snap-preview { position: fixed; z-index: 9050; background: var(--os-accent, #247420); opacity: 0.22; border: 2px solid var(--os-accent, #247420); border-radius: 6px; pointer-events: none; display: none; transition: left 80ms ease, top 80ms ease, width 80ms ease, height 80ms ease; }
|
|
834
|
+
|
|
835
|
+
/* ---- wm alt-tab switcher (was: docs/wm.js switcherEl cssText) ---- */
|
|
836
|
+
.ds-247420 .wm-switcher { position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%); padding: 16px 20px; background: var(--panel-2, #1a1a1a); border: 1px solid var(--os-accent, #247420); border-radius: 8px; z-index: 9600; font-family: var(--ff-ui); color: var(--fg, #fff); min-width: 240px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); }
|
|
837
|
+
.ds-247420 .wm-switcher-row { padding: 8px 12px; border-radius: 4px; margin: 2px 0; cursor: pointer; }
|
|
838
|
+
.ds-247420 .wm-switcher-row.is-active { background: color-mix(in oklab, var(--os-accent) 25%, transparent); }
|
|
839
|
+
|
|
840
|
+
/* ---- todo app (was: docs/apps.js todo-app cssText) ---- */
|
|
841
|
+
.ds-247420 .tb-todo-bar { display: flex; gap: 6px; margin-bottom: 8px; }
|
|
842
|
+
.ds-247420 .tb-todo-input { flex: 1; padding: 5px 8px; border: 1px solid color-mix(in oklab, var(--fg) 18%, transparent); border-radius: 4px; font: inherit; background: var(--panel-1, transparent); color: var(--fg, inherit); }
|
|
843
|
+
.ds-247420 .tb-todo-list { list-style: none; padding: 0; margin: 6px 0; }
|
|
844
|
+
.ds-247420 .tb-todo-footer { display: flex; gap: 8px; align-items: center; margin-top: 6px; font-size: 11px; }
|
|
845
|
+
.ds-247420 .tb-todo-status { margin-top: 10px; font-size: 11px; color: color-mix(in oklab, var(--fg) 55%, transparent); padding: 6px 8px; background: var(--panel-1, transparent); border-radius: 4px; min-height: 14px; }
|
|
846
|
+
.ds-247420 .tb-todo-item { display: flex; gap: 8px; align-items: center; padding: 5px 6px; border-bottom: 1px solid color-mix(in oklab, var(--fg) 8%, transparent); }
|
|
847
|
+
.ds-247420 .tb-todo-text { flex: 1; }
|
|
848
|
+
.ds-247420 .tb-todo-text.is-done { text-decoration: line-through; color: color-mix(in oklab, var(--fg) 45%, transparent); }
|
|
849
|
+
.ds-247420 .tb-todo-del { padding: 2px 8px; }
|
|
850
|
+
|
|
851
|
+
/* ---- freddie keys panel (was: docs/freddie-keys.js cssText) ---- */
|
|
852
|
+
.ds-247420 .fk-root { padding: 12px; overflow: auto; height: 100%; font-family: var(--os-mono, monospace); font-size: 12px; }
|
|
853
|
+
.ds-247420 .fk-status { margin-top: 8px; color: color-mix(in oklab, var(--fg) 60%, transparent); min-height: 1.2em; }
|
|
854
|
+
.ds-247420 .fk-row { display: grid; grid-template-columns: 140px 1fr auto auto; gap: 6px; align-items: center; margin: 2px 0; }
|
|
855
|
+
.ds-247420 .fk-input { font-family: var(--os-mono, monospace); font-size: 11px; padding: 2px 4px; }
|
|
856
|
+
.ds-247420 .fk-title { font-weight: 600; margin-bottom: 8px; }
|
|
857
|
+
.ds-247420 .fk-nim-wrap { display: flex; gap: 6px; align-items: center; margin: 4px 0 10px 0; }
|
|
858
|
+
.ds-247420 .fk-nim-in { font-family: var(--os-mono, monospace); font-size: 11px; padding: 2px 4px; flex: 1; }
|
|
859
|
+
.ds-247420 .fk-badge { font-size: 10px; padding: 2px 6px; border: 1px solid color-mix(in oklab, var(--fg) 18%, transparent); border-radius: 3px; color: var(--os-accent, #247420); }
|
|
860
|
+
.ds-247420 .fk-agent-title,
|
|
861
|
+
.ds-247420 .fk-host-title { margin-top: 14px; font-size: 11px; color: color-mix(in oklab, var(--fg) 60%, transparent); }
|
|
862
|
+
.ds-247420 .fk-summary { font-size: 10px; color: color-mix(in oklab, var(--fg) 60%, transparent); margin: 6px 0; }
|
|
863
|
+
|
|
864
|
+
/* ============================================================================
|
|
865
|
+
* Freddie chat redesign (2026-05-30) — extends ds-chat / freddie-chat with
|
|
866
|
+
* agent-loop chrome: tool-call cards, thinking indicator, system/centered
|
|
867
|
+
* roles, suggestion chips on empty state, cancel-while-generating button.
|
|
868
|
+
* Drives the {role: 'tool'|'system'|'thinking'} + parts:[{kind:'tool'|...}]
|
|
869
|
+
* shape that freddie's agent machine now produces.
|
|
870
|
+
* ============================================================================ */
|
|
871
|
+
|
|
872
|
+
/* Centered chrome for system/tool/thinking — full row, no avatar column. */
|
|
873
|
+
.ds-247420 .chat-msg.centered { grid-template-columns: 1fr; padding: 4px 12%; }
|
|
874
|
+
.ds-247420 .chat-msg.centered .chat-stack { align-items: center; }
|
|
875
|
+
.ds-247420 .chat-msg.system .chat-bubble { background: transparent; border: 0; font-style: italic; opacity: 0.65; font-size: 12px; padding: 4px 8px; text-align: center; max-width: 100%; }
|
|
876
|
+
|
|
877
|
+
/* Tool-call card — collapsible details with status icon + name + label. */
|
|
878
|
+
.ds-247420 .chat-tool { display: block; background: var(--panel-1, color-mix(in oklab, var(--fg) 4%, transparent)); border: 1px solid color-mix(in oklab, var(--fg) 14%, transparent); border-radius: 8px; padding: 0; max-width: min(640px, 92%); overflow: hidden; font-size: 12px; }
|
|
879
|
+
.ds-247420 .chat-tool[open] { background: var(--panel-1, color-mix(in oklab, var(--fg) 6%, transparent)); }
|
|
880
|
+
.ds-247420 .chat-tool.tool-error { border-color: color-mix(in oklab, var(--danger, #c0392b) 60%, transparent); }
|
|
881
|
+
.ds-247420 .chat-tool.tool-done { border-color: color-mix(in oklab, var(--os-accent, #247420) 35%, transparent); }
|
|
882
|
+
.ds-247420 .chat-tool-head { display: flex; align-items: center; gap: 8px; padding: 6px 10px; cursor: pointer; list-style: none; user-select: none; }
|
|
883
|
+
.ds-247420 .chat-tool-head::-webkit-details-marker { display: none; }
|
|
884
|
+
.ds-247420 .chat-tool-icon { display: inline-flex; width: 14px; height: 14px; align-items: center; justify-content: center; font-family: var(--os-mono, monospace); font-size: 12px; opacity: 0.7; }
|
|
885
|
+
.ds-247420 .chat-tool.tool-error .chat-tool-icon { color: var(--danger, #c0392b); opacity: 1; }
|
|
886
|
+
.ds-247420 .chat-tool.tool-done .chat-tool-icon { color: var(--os-accent, #247420); opacity: 1; }
|
|
887
|
+
.ds-247420 .chat-tool.tool-running .chat-tool-icon { animation: chat-spin 1.4s linear infinite; }
|
|
888
|
+
@keyframes chat-spin { to { transform: rotate(360deg); } }
|
|
889
|
+
.ds-247420 .chat-tool-name { font-family: var(--os-mono, monospace); font-weight: 600; font-size: 12px; }
|
|
890
|
+
.ds-247420 .chat-tool-label { opacity: 0.7; font-size: 11px; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
891
|
+
.ds-247420 .chat-tool-status { font-size: 10px; opacity: 0.55; text-transform: uppercase; letter-spacing: 0.05em; margin-left: auto; }
|
|
892
|
+
.ds-247420 .chat-tool-body { padding: 4px 10px 10px; display: flex; flex-direction: column; gap: 8px; border-top: 1px solid color-mix(in oklab, var(--fg) 8%, transparent); }
|
|
893
|
+
.ds-247420 .chat-tool-section { display: flex; flex-direction: column; gap: 3px; }
|
|
894
|
+
.ds-247420 .chat-tool-section-label { font-size: 10px; opacity: 0.5; text-transform: lowercase; letter-spacing: 0.05em; }
|
|
895
|
+
.ds-247420 .chat-tool-pre { margin: 0; padding: 6px 8px; background: color-mix(in oklab, var(--fg) 4%, transparent); border-radius: 4px; max-height: 200px; overflow: auto; font: 11px/1.45 var(--os-mono, ui-monospace, monospace); white-space: pre-wrap; word-break: break-word; }
|
|
896
|
+
.ds-247420 .chat-tool-pre.is-error { color: var(--danger, #c0392b); }
|
|
897
|
+
|
|
898
|
+
/* Thinking indicator — typing dots + label, transient (assistant-side). */
|
|
899
|
+
.ds-247420 .chat-thinking { display: inline-flex; align-items: center; gap: 8px; background: transparent; border: 0; padding: 4px 8px; opacity: 0.7; font-size: 12px; }
|
|
900
|
+
.ds-247420 .chat-thinking-dots { display: inline-flex; gap: 3px; }
|
|
901
|
+
.ds-247420 .chat-thinking-dots span { width: 5px; height: 5px; border-radius: 50%; background: var(--fg); opacity: 0.4; animation: chat-thinking-bounce 1.2s infinite ease-in-out; }
|
|
902
|
+
.ds-247420 .chat-thinking-dots span:nth-child(2) { animation-delay: 0.15s; }
|
|
903
|
+
.ds-247420 .chat-thinking-dots span:nth-child(3) { animation-delay: 0.3s; }
|
|
904
|
+
@keyframes chat-thinking-bounce { 0%, 80%, 100% { transform: scale(0.8); opacity: 0.4; } 40% { transform: scale(1); opacity: 1; } }
|
|
905
|
+
@media (prefers-reduced-motion: reduce) {
|
|
906
|
+
.ds-247420 .chat-thinking-dots span { animation: none; opacity: 0.7; }
|
|
907
|
+
.ds-247420 .chat-tool.tool-running .chat-tool-icon { animation: none; }
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
/* Empty-state suggestion chips — clickable prompts. */
|
|
911
|
+
.ds-247420 .chat-empty-suggestions { display: flex; flex-wrap: wrap; gap: 6px; justify-content: center; margin-top: 12px; max-width: 480px; }
|
|
912
|
+
.ds-247420 .chat-empty-suggestion { all: unset; cursor: pointer; font-size: 12px; padding: 6px 10px; border: 1px solid color-mix(in oklab, var(--fg) 18%, transparent); border-radius: 999px; background: var(--panel-1, transparent); transition: background 120ms ease, border-color 120ms ease; }
|
|
913
|
+
.ds-247420 .chat-empty-suggestion:hover { background: color-mix(in oklab, var(--os-accent, #247420) 10%, transparent); border-color: var(--os-accent, #247420); }
|
|
914
|
+
.ds-247420 .chat-empty-suggestion:focus-visible { outline: 2px solid var(--os-accent, #247420); outline-offset: 2px; }
|
|
915
|
+
|
|
916
|
+
/* Cancel-while-generating button replaces send. */
|
|
917
|
+
.ds-247420 .chat-composer .send.cancel { background: var(--danger, #c0392b); color: var(--on-color, #fff); }
|
|
918
|
+
.ds-247420 .chat-composer .send.cancel:hover { background: color-mix(in oklab, var(--danger, #c0392b) 80%, black); }
|
|
919
|
+
|
|
920
|
+
/* ============================================================================
|
|
921
|
+
* Jank pass 2 (2026-05-30) — outer-layer scroll containment + iframe gesture
|
|
922
|
+
* blocking + backdrop blur. Compositor-promotion on .wm-win drag/resize was
|
|
923
|
+
* already addressed in pass 1 (commit 7e057b6); these are the rules pass 1
|
|
924
|
+
* did not surface.
|
|
925
|
+
* ============================================================================ */
|
|
926
|
+
|
|
927
|
+
/* Scroll containment on the desktop frame too — pass 1 only set
|
|
928
|
+
* overscroll-behavior on .wm-body. Touch-trackpad two-finger pan over the
|
|
929
|
+
* desktop could leak to document.body in some Chromium versions, briefly
|
|
930
|
+
* rubber-banding the page while the camera also panned. */
|
|
931
|
+
.ds-247420 .wm-root,
|
|
932
|
+
.ds-247420 .wm-canvas { overscroll-behavior: contain; }
|
|
933
|
+
|
|
934
|
+
/* Block iframe pointer-events while a wm window is being dragged/resized so
|
|
935
|
+
* mid-gesture cursor crossings into an iframe child don't swallow the drag
|
|
936
|
+
* (the iframe captures pointerover and the outer wm pointermove stops firing).
|
|
937
|
+
* .wm-dragging / .wm-resizing classes are toggled by docs/wm.js for gesture
|
|
938
|
+
* duration only. */
|
|
939
|
+
.ds-247420 .wm-dragging iframe,
|
|
940
|
+
.ds-247420 .wm-resizing iframe,
|
|
941
|
+
.ds-247420 body:has(.wm-win.wm-dragging) iframe,
|
|
942
|
+
.ds-247420 body:has(.wm-win.wm-resizing) iframe { pointer-events: none; }
|
|
943
|
+
|
|
944
|
+
/* Subtle backdrop blur behind modal overlays — depth cue without compounding
|
|
945
|
+
* paint cost since the blur layer is GPU-composited. Respect reduced-motion
|
|
946
|
+
* by falling back to plain dim. */
|
|
947
|
+
.ds-247420 .tb-sess-overlay { backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); }
|
|
948
|
+
@media (prefers-reduced-motion: reduce) {
|
|
949
|
+
.ds-247420 .tb-sess-overlay { backdrop-filter: none; -webkit-backdrop-filter: none; }
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
/* -----------------------------------------------------------------------
|
|
953
|
+
* Freddie chat — jank pass 3 (2026-05-31)
|
|
954
|
+
* Pins layout, spacing, focus, scrollbar, role-distinct bubbles, focus ring,
|
|
955
|
+
* overflow-wrap, empty-state typography, composer chrome, suggestion list.
|
|
956
|
+
* Visual code lives in this kit; thebird only wires state.
|
|
957
|
+
* ----------------------------------------------------------------------- */
|
|
958
|
+
|
|
959
|
+
.ds-247420 freddie-chat,
|
|
960
|
+
.ds-247420 ds-chat,
|
|
961
|
+
.ds-247420 freddie-chat.chat,
|
|
962
|
+
.ds-247420 ds-chat.chat {
|
|
963
|
+
display: flex;
|
|
964
|
+
flex-direction: column;
|
|
965
|
+
min-height: 0;
|
|
966
|
+
height: 100%;
|
|
967
|
+
overflow: hidden;
|
|
968
|
+
/* zero legacy .ds-247420 .chat + .chat (app-shell) token leak — host
|
|
969
|
+
carries `.chat` class so the legacy full-page chat-card rule
|
|
970
|
+
(margin:12px 0; max-width:820; min-height:480; padding-bottom:50)
|
|
971
|
+
applies. Bump specificity with the doubled-class selector. */
|
|
972
|
+
margin: 0 !important;
|
|
973
|
+
padding: 0 !important;
|
|
974
|
+
gap: 0 !important;
|
|
975
|
+
max-width: none !important;
|
|
976
|
+
background: transparent !important;
|
|
977
|
+
border-radius: 0 !important;
|
|
978
|
+
}
|
|
979
|
+
.ds-247420 freddie-chat > .chat,
|
|
980
|
+
.ds-247420 ds-chat > .chat {
|
|
981
|
+
flex: 1 1 auto;
|
|
982
|
+
min-height: 0;
|
|
983
|
+
display: flex;
|
|
984
|
+
flex-direction: column;
|
|
985
|
+
overflow: hidden;
|
|
986
|
+
margin: 0;
|
|
987
|
+
padding: 0;
|
|
988
|
+
gap: 0;
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
.ds-247420 .chat-head {
|
|
992
|
+
display: flex;
|
|
993
|
+
align-items: center;
|
|
994
|
+
gap: 8px;
|
|
995
|
+
padding: 8px 12px;
|
|
996
|
+
border-bottom: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
|
|
997
|
+
min-height: 38px;
|
|
998
|
+
flex: 0 0 auto;
|
|
999
|
+
background: var(--panel-0, transparent);
|
|
1000
|
+
}
|
|
1001
|
+
.ds-247420 .chat-head .dot {
|
|
1002
|
+
width: 8px;
|
|
1003
|
+
height: 8px;
|
|
1004
|
+
border-radius: 50%;
|
|
1005
|
+
background: var(--os-accent, #247420);
|
|
1006
|
+
flex-shrink: 0;
|
|
1007
|
+
}
|
|
1008
|
+
.ds-247420 .chat-head .ds-chat-title {
|
|
1009
|
+
font-size: 13px;
|
|
1010
|
+
font-weight: 600;
|
|
1011
|
+
margin: 0;
|
|
1012
|
+
white-space: nowrap;
|
|
1013
|
+
overflow: hidden;
|
|
1014
|
+
text-overflow: ellipsis;
|
|
1015
|
+
flex-shrink: 0;
|
|
1016
|
+
}
|
|
1017
|
+
.ds-247420 .chat-head .sub {
|
|
1018
|
+
font-size: 12px;
|
|
1019
|
+
opacity: 0.7;
|
|
1020
|
+
white-space: nowrap;
|
|
1021
|
+
overflow: hidden;
|
|
1022
|
+
text-overflow: ellipsis;
|
|
1023
|
+
min-width: 0;
|
|
1024
|
+
flex: 1 1 auto;
|
|
1025
|
+
}
|
|
1026
|
+
.ds-247420 .chat-head .spread { flex: 0; }
|
|
1027
|
+
|
|
1028
|
+
.ds-247420 .chat-thread {
|
|
1029
|
+
flex: 1 1 auto;
|
|
1030
|
+
min-height: 0;
|
|
1031
|
+
overflow-y: auto;
|
|
1032
|
+
overflow-x: hidden;
|
|
1033
|
+
padding: 12px;
|
|
1034
|
+
display: flex;
|
|
1035
|
+
flex-direction: column;
|
|
1036
|
+
gap: 6px;
|
|
1037
|
+
scrollbar-width: thin;
|
|
1038
|
+
scrollbar-color: color-mix(in oklab, var(--fg) 22%, transparent) transparent;
|
|
1039
|
+
scroll-behavior: smooth;
|
|
1040
|
+
overscroll-behavior: contain;
|
|
1041
|
+
}
|
|
1042
|
+
.ds-247420 .chat-thread::-webkit-scrollbar { width: 8px; }
|
|
1043
|
+
.ds-247420 .chat-thread::-webkit-scrollbar-track { background: transparent; }
|
|
1044
|
+
.ds-247420 .chat-thread::-webkit-scrollbar-thumb {
|
|
1045
|
+
background: color-mix(in oklab, var(--fg) 18%, transparent);
|
|
1046
|
+
border-radius: 4px;
|
|
1047
|
+
}
|
|
1048
|
+
.ds-247420 .chat-thread::-webkit-scrollbar-thumb:hover {
|
|
1049
|
+
background: color-mix(in oklab, var(--fg) 30%, transparent);
|
|
1050
|
+
}
|
|
1051
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1052
|
+
.ds-247420 .chat-thread { scroll-behavior: auto; }
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
.ds-247420 .chat-msg {
|
|
1056
|
+
display: grid;
|
|
1057
|
+
grid-template-columns: 28px 1fr;
|
|
1058
|
+
gap: 8px;
|
|
1059
|
+
align-items: start;
|
|
1060
|
+
}
|
|
1061
|
+
.ds-247420 .chat-msg.you {
|
|
1062
|
+
grid-template-columns: 1fr 28px;
|
|
1063
|
+
justify-items: end;
|
|
1064
|
+
}
|
|
1065
|
+
.ds-247420 .chat-msg.you .chat-stack { align-items: flex-end; }
|
|
1066
|
+
.ds-247420 .chat-msg.centered {
|
|
1067
|
+
grid-template-columns: 1fr;
|
|
1068
|
+
justify-items: center;
|
|
1069
|
+
padding: 2px 12%;
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
.ds-247420 .chat-avatar {
|
|
1073
|
+
width: 28px;
|
|
1074
|
+
height: 28px;
|
|
1075
|
+
border-radius: 50%;
|
|
1076
|
+
background: color-mix(in oklab, var(--os-accent, #247420) 18%, transparent);
|
|
1077
|
+
color: var(--fg);
|
|
1078
|
+
display: inline-flex;
|
|
1079
|
+
align-items: center;
|
|
1080
|
+
justify-content: center;
|
|
1081
|
+
font-size: 12px;
|
|
1082
|
+
font-weight: 600;
|
|
1083
|
+
text-transform: lowercase;
|
|
1084
|
+
flex-shrink: 0;
|
|
1085
|
+
user-select: none;
|
|
1086
|
+
}
|
|
1087
|
+
.ds-247420 .chat-msg.you .chat-avatar {
|
|
1088
|
+
background: var(--os-accent, #247420);
|
|
1089
|
+
color: var(--on-color, #fff);
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
.ds-247420 .chat-stack {
|
|
1093
|
+
display: flex;
|
|
1094
|
+
flex-direction: column;
|
|
1095
|
+
gap: 3px;
|
|
1096
|
+
min-width: 0;
|
|
1097
|
+
align-items: flex-start;
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
.ds-247420 .chat-bubble {
|
|
1101
|
+
background: var(--panel-1, color-mix(in oklab, var(--fg) 5%, transparent));
|
|
1102
|
+
color: var(--fg);
|
|
1103
|
+
border: 1px solid color-mix(in oklab, var(--fg) 8%, transparent);
|
|
1104
|
+
border-radius: 12px;
|
|
1105
|
+
padding: 8px 12px;
|
|
1106
|
+
font-size: 14px;
|
|
1107
|
+
line-height: 1.5;
|
|
1108
|
+
max-width: min(720px, 86%);
|
|
1109
|
+
overflow-wrap: anywhere;
|
|
1110
|
+
word-break: break-word;
|
|
1111
|
+
}
|
|
1112
|
+
.ds-247420 .chat-msg.you .chat-bubble {
|
|
1113
|
+
background: var(--os-accent, #247420);
|
|
1114
|
+
color: var(--on-color, #fff);
|
|
1115
|
+
border-color: color-mix(in oklab, var(--os-accent, #247420) 60%, black);
|
|
1116
|
+
border-bottom-right-radius: 4px;
|
|
1117
|
+
}
|
|
1118
|
+
.ds-247420 .chat-msg.them .chat-bubble {
|
|
1119
|
+
border-bottom-left-radius: 4px;
|
|
1120
|
+
}
|
|
1121
|
+
.ds-247420 .chat-bubble + .chat-bubble { margin-top: 4px; }
|
|
1122
|
+
.ds-247420 .chat-bubble pre,
|
|
1123
|
+
.ds-247420 .chat-bubble code { font-family: var(--os-mono, ui-monospace, monospace); font-size: 12.5px; }
|
|
1124
|
+
.ds-247420 .chat-bubble pre {
|
|
1125
|
+
margin: 6px 0 0;
|
|
1126
|
+
padding: 8px 10px;
|
|
1127
|
+
background: color-mix(in oklab, var(--fg) 6%, transparent);
|
|
1128
|
+
border-radius: 6px;
|
|
1129
|
+
max-height: 320px;
|
|
1130
|
+
overflow: auto;
|
|
1131
|
+
white-space: pre;
|
|
1132
|
+
scrollbar-width: thin;
|
|
1133
|
+
}
|
|
1134
|
+
.ds-247420 .chat-msg.you .chat-bubble pre {
|
|
1135
|
+
background: color-mix(in oklab, black 25%, transparent);
|
|
1136
|
+
color: var(--on-color, #fff);
|
|
1137
|
+
}
|
|
1138
|
+
.ds-247420 .chat-bubble a {
|
|
1139
|
+
color: inherit;
|
|
1140
|
+
text-decoration: underline;
|
|
1141
|
+
text-decoration-thickness: 1px;
|
|
1142
|
+
text-underline-offset: 2px;
|
|
1143
|
+
overflow-wrap: anywhere;
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
.ds-247420 .chat-meta {
|
|
1147
|
+
font-size: 11px;
|
|
1148
|
+
opacity: 0.55;
|
|
1149
|
+
display: inline-flex;
|
|
1150
|
+
align-items: center;
|
|
1151
|
+
gap: 6px;
|
|
1152
|
+
padding: 0 4px;
|
|
1153
|
+
}
|
|
1154
|
+
.ds-247420 .chat-msg.you .chat-meta { flex-direction: row-reverse; }
|
|
1155
|
+
|
|
1156
|
+
.ds-247420 .chat-empty {
|
|
1157
|
+
flex: 1 1 auto;
|
|
1158
|
+
display: flex;
|
|
1159
|
+
flex-direction: column;
|
|
1160
|
+
align-items: center;
|
|
1161
|
+
justify-content: center;
|
|
1162
|
+
text-align: center;
|
|
1163
|
+
padding: 32px 24px;
|
|
1164
|
+
color: var(--fg);
|
|
1165
|
+
gap: 4px;
|
|
1166
|
+
}
|
|
1167
|
+
.ds-247420 .chat-empty-title {
|
|
1168
|
+
font-size: 18px;
|
|
1169
|
+
font-weight: 600;
|
|
1170
|
+
margin: 0;
|
|
1171
|
+
letter-spacing: -0.01em;
|
|
1172
|
+
}
|
|
1173
|
+
.ds-247420 .chat-empty-sub {
|
|
1174
|
+
font-size: 13px;
|
|
1175
|
+
opacity: 0.65;
|
|
1176
|
+
margin: 0;
|
|
1177
|
+
max-width: 420px;
|
|
1178
|
+
line-height: 1.5;
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
.ds-247420 .chat-composer {
|
|
1182
|
+
display: flex;
|
|
1183
|
+
flex-direction: column;
|
|
1184
|
+
gap: 6px;
|
|
1185
|
+
padding: 8px 10px;
|
|
1186
|
+
border-top: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
|
|
1187
|
+
background: var(--panel-0, transparent);
|
|
1188
|
+
flex: 0 0 auto;
|
|
1189
|
+
}
|
|
1190
|
+
.ds-247420 .chat-composer textarea {
|
|
1191
|
+
font: 14px/1.45 var(--os-ui, system-ui), sans-serif;
|
|
1192
|
+
background: var(--panel-1, color-mix(in oklab, var(--fg) 5%, transparent));
|
|
1193
|
+
color: var(--fg);
|
|
1194
|
+
border: 1px solid color-mix(in oklab, var(--fg) 14%, transparent);
|
|
1195
|
+
border-radius: 8px;
|
|
1196
|
+
padding: 8px 10px;
|
|
1197
|
+
resize: none;
|
|
1198
|
+
outline: none;
|
|
1199
|
+
width: 100%;
|
|
1200
|
+
min-height: 40px;
|
|
1201
|
+
max-height: 200px;
|
|
1202
|
+
box-sizing: border-box;
|
|
1203
|
+
transition: border-color 120ms ease;
|
|
1204
|
+
}
|
|
1205
|
+
.ds-247420 .chat-composer textarea:hover {
|
|
1206
|
+
border-color: color-mix(in oklab, var(--fg) 22%, transparent);
|
|
1207
|
+
}
|
|
1208
|
+
.ds-247420 .chat-composer textarea:focus-visible {
|
|
1209
|
+
outline: 2px solid var(--os-accent, #247420);
|
|
1210
|
+
outline-offset: 0;
|
|
1211
|
+
border-color: color-mix(in oklab, var(--os-accent, #247420) 60%, transparent);
|
|
1212
|
+
}
|
|
1213
|
+
.ds-247420 .chat-composer-toolbar {
|
|
1214
|
+
display: flex;
|
|
1215
|
+
align-items: center;
|
|
1216
|
+
gap: 4px;
|
|
1217
|
+
}
|
|
1218
|
+
.ds-247420 .composer-btn {
|
|
1219
|
+
all: unset;
|
|
1220
|
+
cursor: pointer;
|
|
1221
|
+
display: inline-flex;
|
|
1222
|
+
align-items: center;
|
|
1223
|
+
justify-content: center;
|
|
1224
|
+
width: 32px;
|
|
1225
|
+
height: 32px;
|
|
1226
|
+
border-radius: 6px;
|
|
1227
|
+
color: var(--fg);
|
|
1228
|
+
opacity: 0.65;
|
|
1229
|
+
transition: background-color 120ms ease, opacity 120ms ease;
|
|
1230
|
+
}
|
|
1231
|
+
.ds-247420 .composer-btn:hover {
|
|
1232
|
+
background: color-mix(in oklab, var(--fg) 6%, transparent);
|
|
1233
|
+
opacity: 1;
|
|
1234
|
+
}
|
|
1235
|
+
.ds-247420 .composer-btn:focus-visible {
|
|
1236
|
+
outline: 2px solid var(--os-accent, #247420);
|
|
1237
|
+
outline-offset: 2px;
|
|
1238
|
+
opacity: 1;
|
|
1239
|
+
}
|
|
1240
|
+
.ds-247420 .chat-composer .send {
|
|
1241
|
+
all: unset;
|
|
1242
|
+
cursor: pointer;
|
|
1243
|
+
margin-left: auto;
|
|
1244
|
+
width: 36px;
|
|
1245
|
+
height: 32px;
|
|
1246
|
+
border-radius: 6px;
|
|
1247
|
+
background: var(--os-accent, #247420);
|
|
1248
|
+
color: var(--on-color, #fff);
|
|
1249
|
+
display: inline-flex;
|
|
1250
|
+
align-items: center;
|
|
1251
|
+
justify-content: center;
|
|
1252
|
+
transition: background 120ms ease, transform 60ms ease;
|
|
1253
|
+
}
|
|
1254
|
+
.ds-247420 .chat-composer .send:hover {
|
|
1255
|
+
background: color-mix(in oklab, var(--os-accent, #247420) 88%, black);
|
|
1256
|
+
}
|
|
1257
|
+
.ds-247420 .chat-composer .send:active { transform: scale(0.96); }
|
|
1258
|
+
.ds-247420 .chat-composer .send:focus-visible {
|
|
1259
|
+
outline: 2px solid var(--os-accent, #247420);
|
|
1260
|
+
outline-offset: 2px;
|
|
1261
|
+
}
|
|
1262
|
+
.ds-247420 .chat-composer .send:disabled,
|
|
1263
|
+
.ds-247420 .chat-composer .send[disabled] {
|
|
1264
|
+
opacity: 0.35;
|
|
1265
|
+
cursor: not-allowed;
|
|
1266
|
+
background: color-mix(in oklab, var(--fg) 25%, transparent);
|
|
1267
|
+
}
|
|
1268
|
+
|
|
1269
|
+
.ds-247420 .ds-icon { --ds-icon-stroke: 1.7; }
|
|
1270
|
+
|
|
1271
|
+
.ds-247420 .aicat-face {
|
|
1272
|
+
font-family: var(--os-mono, ui-monospace, monospace);
|
|
1273
|
+
font-size: 11px;
|
|
1274
|
+
line-height: 1.2;
|
|
1275
|
+
margin: 0;
|
|
1276
|
+
}
|