@mevdragon/vidfarm-devcli 0.18.0 → 0.19.0
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/.agents/skills/editor-capabilities/SKILL.md +166 -0
- package/.agents/skills/editor-capabilities/references/re-theme-walkthrough.md +58 -0
- package/.agents/skills/vidfarm-media/SKILL.md +43 -4
- package/SKILL.director.md +190 -18
- package/SKILL.platform.md +8 -4
- package/demo/dist/app.css +1 -1
- package/demo/dist/app.js +77 -75
- package/demo/dist/favicon.ico +0 -0
- package/dist/src/app.js +3031 -300
- package/dist/src/cli.js +1549 -69
- package/dist/src/config.js +7 -0
- package/dist/src/devcli/clip-store.js +29 -2
- package/dist/src/devcli/clips.js +55 -9
- package/dist/src/devcli/composition-edit.js +658 -8
- package/dist/src/devcli/local-backend.js +123 -0
- package/dist/src/devcli/migrate-local.js +140 -0
- package/dist/src/devcli/sync.js +311 -0
- package/dist/src/devcli/timeline-edit.js +490 -0
- package/dist/src/editor-chat.js +56 -17
- package/dist/src/frontend/discover-client.js +130 -0
- package/dist/src/frontend/discover-store.js +23 -0
- package/dist/src/frontend/file-directory.js +995 -0
- package/dist/src/frontend/homepage-view.js +3 -3
- package/dist/src/frontend/template-editor-chat.js +28 -22
- package/dist/src/landing-page.js +24 -7
- package/dist/src/page-shell.js +26 -2
- package/dist/src/primitive-registry.js +409 -4
- package/dist/src/reskin/agency-page.js +1 -1
- package/dist/src/reskin/calendar-page.js +2 -1
- package/dist/src/reskin/chat-page.js +420 -85
- package/dist/src/reskin/discover-page.js +731 -39
- package/dist/src/reskin/document.js +1311 -387
- package/dist/src/reskin/help-page.js +1 -0
- package/dist/src/reskin/inpaint-clipper-page.js +649 -0
- package/dist/src/reskin/inpaint-page.js +2459 -446
- package/dist/src/reskin/inpaint-video-page.js +1339 -0
- package/dist/src/reskin/library-page.js +1168 -228
- package/dist/src/reskin/login-page.js +6 -6
- package/dist/src/reskin/pricing-page.js +2 -0
- package/dist/src/reskin/settings-page.js +55 -10
- package/dist/src/reskin/theme.js +365 -20
- package/dist/src/services/billing.js +4 -0
- package/dist/src/services/clip-curation/gemini.js +5 -0
- package/dist/src/services/clip-curation/hunt.js +81 -1
- package/dist/src/services/clip-curation/index.js +2 -1
- package/dist/src/services/clip-curation/local-agent.js +4 -3
- package/dist/src/services/clip-curation/media-select.js +85 -0
- package/dist/src/services/clip-curation/query.js +5 -1
- package/dist/src/services/clip-curation/refine.js +50 -20
- package/dist/src/services/clip-curation/scan.js +10 -3
- package/dist/src/services/clip-curation/taxonomy.js +3 -1
- package/dist/src/services/clip-curation/taxonomy.v1.json +13 -1
- package/dist/src/services/clip-records.js +42 -1
- package/dist/src/services/clip-search.js +43 -13
- package/dist/src/services/file-directory.js +117 -0
- package/dist/src/services/hyperframes.js +283 -3
- package/dist/src/services/serverless-records.js +43 -0
- package/dist/src/services/storage.js +47 -2
- package/dist/src/services/upstream.js +5 -5
- package/dist/src/template-editor-shell.js +16 -2
- package/package.json +1 -1
- package/public/assets/discover-client-app.js +1 -0
- package/public/assets/file-directory-app.js +2 -0
- package/public/assets/homepage-client-app.js +12 -12
- package/public/assets/page-runtime-client-app.js +24 -24
- package/public/assets/placeholders/scene-placeholder.png +0 -0
- package/src/assets/favicon.ico +0 -0
- package/src/assets/logo-vidfarm.png +0 -0
package/dist/src/reskin/theme.js
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
// accent over a neutral base, heavy rounded display type, soft cards, glass
|
|
19
19
|
// pill nav, warm-dark footer).
|
|
20
20
|
export const RESKIN_PAGES = [
|
|
21
|
-
{ slug: "settings", label: "Settings", emoji: "⚙️", blurb: "Profile, wallet, channels & developer keys", live: "/settings", done: true },
|
|
21
|
+
{ slug: "settings", label: "Settings", emoji: "⚙️", blurb: "Profile, wallet, channels & developer keys", live: "/settings/profile", done: true },
|
|
22
22
|
{ slug: "library", label: "Library", emoji: "🎬", blurb: "Your projects, renders & mined clips (tabbed)", live: "/library", done: true },
|
|
23
23
|
{ slug: "discover", label: "Discover", emoji: "✨", blurb: "Template feed · swipe · categories", live: "/discover", done: true },
|
|
24
24
|
{ slug: "chat", label: "Brainstorm", emoji: "💬", blurb: "Full AI brainstorm chat", live: "/chat", done: true },
|
|
@@ -84,7 +84,11 @@ export const RESKIN_CSS = `
|
|
|
84
84
|
/* layout */
|
|
85
85
|
.rk-container{width:min(var(--rk-container),100%);margin:0 auto;padding:0 var(--rk-gutter)}
|
|
86
86
|
.rk-container-wide{width:min(85rem,100%);margin:0 auto;padding:0 var(--rk-gutter)}
|
|
87
|
-
.rk-
|
|
87
|
+
/* vertical-only so it never clobbers the horizontal gutter that .rk-container
|
|
88
|
+
/ .rk-container-wide set via padding-left/right (a full padding shorthand
|
|
89
|
+
here would zero the side gutter, leaving content flush to the viewport
|
|
90
|
+
edges, most visible on mobile) */
|
|
91
|
+
.rk-page{padding-top:24px;padding-bottom:80px}
|
|
88
92
|
.rk-page-head{display:grid;gap:4px;margin-bottom:18px}
|
|
89
93
|
.rk-h1{font-size:var(--rk-text-3xl);letter-spacing:-.03em}
|
|
90
94
|
.rk-sub{font-size:var(--rk-text-base);color:var(--rk-text-muted)}
|
|
@@ -106,8 +110,9 @@ export const RESKIN_CSS = `
|
|
|
106
110
|
.rk-sidebar{position:fixed;left:0;top:0;bottom:0;width:248px;z-index:50;display:flex;flex-direction:column;gap:4px;
|
|
107
111
|
padding:20px 14px 16px;background:#fff;border-right:1px solid var(--rk-border);overflow-y:auto}
|
|
108
112
|
.rk-content{margin-left:248px;min-height:100vh;background:var(--rk-bg)}
|
|
109
|
-
.rk-sidebar-brand{display:flex;align-items:center;gap:
|
|
113
|
+
.rk-sidebar-brand{display:flex;align-items:center;gap:10px;padding:6px 10px 18px;font-family:var(--rk-font-display);
|
|
110
114
|
font-weight:800;font-size:20px;color:var(--rk-ink);letter-spacing:-.02em}
|
|
115
|
+
.rk-sidebar-brand .rk-brand-mark{width:36px;height:36px;border-radius:10px}
|
|
111
116
|
.rk-sidebar-nav{display:flex;flex-direction:column;gap:3px;flex:1;min-height:0}
|
|
112
117
|
.rk-sidebar-sep{height:1px;background:var(--rk-border);margin:8px}
|
|
113
118
|
.rk-sidebar-item{display:flex;align-items:center;padding:9px 13px;border-radius:var(--rk-r-lg);
|
|
@@ -115,15 +120,28 @@ export const RESKIN_CSS = `
|
|
|
115
120
|
transition:background var(--rk-dur) var(--rk-ease),color var(--rk-dur) var(--rk-ease)}
|
|
116
121
|
.rk-sidebar-item:hover{background:var(--rk-n-100);color:var(--rk-ink)}
|
|
117
122
|
.rk-sidebar-item.is-active{background:var(--rk-gold-tint);color:var(--rk-ink)}
|
|
123
|
+
/* signed-in identity — subtle, small, pinned to the very bottom of the sidebar
|
|
124
|
+
* so you can tell which account you're in at a glance. The chat FAB hovers
|
|
125
|
+
* ABOVE this block (see .rk-signed-in .rk-fab) rather than sharing the spot. */
|
|
126
|
+
.rk-sidebar-account{margin-top:8px;padding:8px 13px 2px;border-top:1px solid var(--rk-border);
|
|
127
|
+
color:var(--rk-n-500);line-height:1.3;overflow:hidden}
|
|
128
|
+
.rk-sidebar-account-name{font-size:12px;font-weight:600;color:var(--rk-n-600);
|
|
129
|
+
white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
130
|
+
.rk-sidebar-account-email{font-size:11px;font-weight:500;color:var(--rk-n-400);
|
|
131
|
+
white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
118
132
|
/* AI chat dock — draggable FAB (defaults to the old sidebar-foot spot) + popup panel.
|
|
119
133
|
* The panel is 2x the sidebar width and, when it opens on the left, visually
|
|
120
134
|
* REPLACES the nav (sidebar goes visibility:hidden via body.rk-chat-left so the
|
|
121
135
|
* layout never jumps). If the FAB was dragged to the right half of the viewport
|
|
122
136
|
* the panel anchors right instead, so it is never cut off. */
|
|
123
|
-
.rk-fab{position:fixed;left:16px;bottom:16px;z-index:90;width:56px;height:56px;border-radius:var(--rk-r-full);
|
|
137
|
+
.rk-fab{position:fixed;left:16px;bottom:calc(16px + env(safe-area-inset-bottom));z-index:90;width:56px;height:56px;border-radius:var(--rk-r-full);
|
|
124
138
|
border:0;cursor:grab;background:var(--rk-gold-500);color:var(--rk-ink);display:grid;place-items:center;
|
|
125
139
|
box-shadow:var(--rk-shadow-lg);touch-action:none;user-select:none;-webkit-user-select:none;
|
|
126
140
|
transition:transform var(--rk-dur) var(--rk-ease),box-shadow var(--rk-dur) var(--rk-ease),opacity var(--rk-dur) var(--rk-ease)}
|
|
141
|
+
/* signed in: the name/email block sits at the sidebar foot, so lift the FAB's
|
|
142
|
+
* default resting spot to hover just above it (never overlapping the identity).
|
|
143
|
+
* Only applies to the CSS default — a dragged FAB uses its saved inline top. */
|
|
144
|
+
.rk-signed-in .rk-fab{bottom:calc(84px + env(safe-area-inset-bottom))}
|
|
127
145
|
.rk-fab:hover{transform:translateY(-2px);box-shadow:0 6px 18px -6px rgba(252,185,0,.6),var(--rk-shadow-lg)}
|
|
128
146
|
.rk-fab.is-dragging{cursor:grabbing;transition:none;transform:scale(1.08)}
|
|
129
147
|
.rk-fab.is-open{opacity:0;pointer-events:none;transform:scale(.6)}
|
|
@@ -132,7 +150,7 @@ export const RESKIN_CSS = `
|
|
|
132
150
|
display:flex;flex-direction:row;background:var(--rk-surface);border:1px solid var(--rk-border);
|
|
133
151
|
border-radius:var(--rk-r-3xl);box-shadow:var(--rk-shadow-xl);overflow:hidden;
|
|
134
152
|
animation:rk-aichat-in .22s var(--rk-ease)}
|
|
135
|
-
.rk-aichat.has-files{width:min(772px,calc(100vw - 24px))}
|
|
153
|
+
.rk-aichat.has-files,.rk-aichat.has-history{width:min(772px,calc(100vw - 24px))}
|
|
136
154
|
.rk-aichat.is-right{left:auto;right:12px}
|
|
137
155
|
.rk-aichat[hidden]{display:none}
|
|
138
156
|
@keyframes rk-aichat-in{from{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:none}}
|
|
@@ -143,7 +161,31 @@ export const RESKIN_CSS = `
|
|
|
143
161
|
.rk-aichat-files{flex:none;width:266px;display:none;flex-direction:column;min-height:0;
|
|
144
162
|
border-right:1px solid var(--rk-border);background:var(--rk-n-50)}
|
|
145
163
|
.rk-aichat.has-files .rk-aichat-files{display:flex}
|
|
146
|
-
.rk-aichat-files .rk-aichat-crumbs{padding-top:
|
|
164
|
+
.rk-aichat-files .rk-aichat-crumbs{padding-top:2px}
|
|
165
|
+
|
|
166
|
+
/* files-only mode — opened from the /chat composer's attach button. Shows ONLY
|
|
167
|
+
the file explorer (no chat column / history), as a slim right-hand drawer. */
|
|
168
|
+
.rk-aichat.is-files-only{width:min(384px,calc(100vw - 24px))}
|
|
169
|
+
.rk-aichat.is-files-only .rk-aichat-main,
|
|
170
|
+
.rk-aichat.is-files-only .rk-aichat-history{display:none}
|
|
171
|
+
.rk-aichat.is-files-only .rk-aichat-files{display:flex;flex:1;border-right:0}
|
|
172
|
+
.rk-aichat.is-files-only .rk-aichat-files .rk-aichat-crumbs{padding-top:2px}
|
|
173
|
+
.rk-aichat-files-head{display:flex;align-items:center;gap:8px;
|
|
174
|
+
padding:14px 14px 10px;flex:none}
|
|
175
|
+
.rk-aichat-files-title{flex:1;min-width:0;font-family:var(--rk-font-display);font-weight:800;
|
|
176
|
+
font-size:15px;color:var(--rk-ink);letter-spacing:-.01em}
|
|
177
|
+
|
|
178
|
+
/* left Chat-history pane — shares the same left slot as Files (only one shows
|
|
179
|
+
at a time); reuses the rk-aichat-frow row visuals for each past chat. */
|
|
180
|
+
.rk-aichat-history{flex:none;width:266px;display:none;flex-direction:column;min-height:0;
|
|
181
|
+
border-right:1px solid var(--rk-border);background:var(--rk-n-50)}
|
|
182
|
+
.rk-aichat.has-history .rk-aichat-history{display:flex}
|
|
183
|
+
.rk-aichat-hist-head{padding:22px 14px 8px;font-family:var(--rk-font-display);font-weight:800;
|
|
184
|
+
font-size:13px;color:var(--rk-ink);letter-spacing:-.01em;flex:none}
|
|
185
|
+
.rk-aichat-hist-body{flex:1;min-height:0;overflow-y:auto;padding:2px 8px 12px;display:grid;gap:2px;align-content:start}
|
|
186
|
+
.rk-aichat-hist-body .rk-aichat-frow.is-active{background:#fff;box-shadow:var(--rk-shadow-xs);
|
|
187
|
+
outline:1.5px solid var(--rk-gold-600);outline-offset:-1.5px}
|
|
188
|
+
.rk-aichat-hist-body .rk-aichat-frow.is-active .rk-aichat-fic{background:var(--rk-gold-tint2);color:var(--rk-gold-700)}
|
|
147
189
|
.rk-aichat-crumbs{display:flex;flex-wrap:wrap;align-items:center;gap:1px;padding:0 12px 8px;flex:none}
|
|
148
190
|
.rk-aichat-crumb{padding:2px 6px;border-radius:var(--rk-r-sm);cursor:pointer;background:transparent;border:0;
|
|
149
191
|
color:var(--rk-text-muted);font-size:12px;font-weight:600;font-family:inherit;max-width:120px;overflow:hidden;
|
|
@@ -156,6 +198,9 @@ export const RESKIN_CSS = `
|
|
|
156
198
|
border:0;background:transparent;cursor:pointer;text-align:left;font-family:inherit;min-width:0;
|
|
157
199
|
transition:background var(--rk-dur) var(--rk-ease),box-shadow var(--rk-dur) var(--rk-ease)}
|
|
158
200
|
.rk-aichat-frow:hover{background:#fff;box-shadow:var(--rk-shadow-xs)}
|
|
201
|
+
/* preview trigger fills the row; attach button sits to its right */
|
|
202
|
+
.rk-aichat-fmainbtn{flex:1;min-width:0;display:flex;align-items:center;gap:9px;border:0;background:transparent;
|
|
203
|
+
padding:0;cursor:pointer;text-align:left;font-family:inherit}
|
|
159
204
|
.rk-aichat-fic{width:30px;height:30px;border-radius:var(--rk-r-md);flex:none;display:grid;place-items:center;
|
|
160
205
|
font-size:11px;font-weight:700;overflow:hidden}
|
|
161
206
|
.rk-aichat-fic-folder{background:var(--rk-gold-tint2);color:var(--rk-gold-700)}
|
|
@@ -164,8 +209,12 @@ export const RESKIN_CSS = `
|
|
|
164
209
|
.rk-aichat-fmain{flex:1;min-width:0;display:grid;gap:1px}
|
|
165
210
|
.rk-aichat-fname{font-size:12.5px;font-weight:600;color:var(--rk-ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
166
211
|
.rk-aichat-fmeta{font-size:11px;color:var(--rk-text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
167
|
-
.rk-aichat-fadd{flex:none;font-size:11px;font-weight:700;color:var(--rk-gold-700);opacity:0;
|
|
212
|
+
.rk-aichat-fadd{flex:none;font-size:11px;font-weight:700;color:var(--rk-gold-700);opacity:0;cursor:pointer;
|
|
213
|
+
border:1px solid transparent;border-radius:var(--rk-r-full);background:transparent;padding:3px 9px;font-family:inherit;
|
|
214
|
+
transition:opacity var(--rk-dur) var(--rk-ease),background var(--rk-dur) var(--rk-ease),border-color var(--rk-dur) var(--rk-ease)}
|
|
168
215
|
.rk-aichat-frow:hover .rk-aichat-fadd{opacity:1}
|
|
216
|
+
.rk-aichat-fadd:hover{background:var(--rk-gold-tint);border-color:var(--rk-gold-600)}
|
|
217
|
+
.rk-aichat-fadd:focus-visible{opacity:1}
|
|
169
218
|
.rk-aichat-fstate{padding:22px 14px;text-align:center;font-size:12.5px;color:var(--rk-text-muted);line-height:1.5;display:grid;gap:8px;justify-items:center}
|
|
170
219
|
.rk-aichat-fstate a{color:var(--rk-gold-700);font-weight:600}
|
|
171
220
|
.rk-aichat-fstate button{font-family:inherit;font-size:12px;font-weight:600;color:var(--rk-ink);cursor:pointer;
|
|
@@ -184,36 +233,291 @@ export const RESKIN_CSS = `
|
|
|
184
233
|
.rk-aichat-drop-btn:hover{background:var(--rk-gold-tint2)}
|
|
185
234
|
.rk-aichat-drop-btn:disabled{opacity:.6;cursor:default}
|
|
186
235
|
|
|
236
|
+
/* ── reusable directory explorer (createDirectoryExplorer) ──
|
|
237
|
+
Shares the .rk-aichat-frow/-fic/-fmain row look; adds search, multi-select,
|
|
238
|
+
a folder Open button, a per-row "…" kebab menu, and a copy-path toast.
|
|
239
|
+
Reused verbatim by the chat dock (attach mode) and /library/raws (standalone). */
|
|
240
|
+
.rk-dir{display:flex;flex-direction:column;min-height:0;flex:1}
|
|
241
|
+
.rk-dir-space{flex:none;display:inline-flex;gap:2px;margin:2px 12px 8px;padding:2px;
|
|
242
|
+
background:var(--rk-n-100,#f1ede6);border:1px solid var(--rk-border);border-radius:var(--rk-r-full);align-self:flex-start}
|
|
243
|
+
.rk-dir-space-btn{font-family:inherit;font-size:12px;font-weight:600;color:var(--rk-n-500,#7a7266);
|
|
244
|
+
background:transparent;border:0;border-radius:var(--rk-r-full);padding:4px 14px;cursor:pointer;
|
|
245
|
+
transition:background var(--rk-dur) var(--rk-ease),color var(--rk-dur) var(--rk-ease)}
|
|
246
|
+
.rk-dir-space-btn.is-on{background:var(--rk-surface,#fff);color:var(--rk-ink);box-shadow:var(--rk-shadow-sm,0 1px 2px rgba(0,0,0,.06))}
|
|
247
|
+
.rk-dir-search{flex:none;padding:0 12px 8px}
|
|
248
|
+
.rk-dir-search-input{width:100%;font-family:inherit;font-size:12.5px;color:var(--rk-ink);
|
|
249
|
+
background:var(--rk-surface,#fff);border:1px solid var(--rk-border);border-radius:var(--rk-r-full);padding:7px 12px;
|
|
250
|
+
transition:border-color var(--rk-dur) var(--rk-ease),box-shadow var(--rk-dur) var(--rk-ease)}
|
|
251
|
+
.rk-dir-search-input:focus{outline:none;border-color:var(--rk-gold-600);box-shadow:var(--rk-ring-gold)}
|
|
252
|
+
.rk-dir-search-input::placeholder{color:var(--rk-n-400)}
|
|
253
|
+
.rk-dir-body{flex:1 1 auto;min-height:0}
|
|
254
|
+
.rk-dir-crumbs{align-items:center}
|
|
255
|
+
.rk-dir-newfolder{margin-left:auto;flex:none;font-family:inherit;font-size:11.5px;font-weight:700;cursor:pointer;
|
|
256
|
+
color:var(--rk-gold-700);background:transparent;border:1px solid transparent;border-radius:var(--rk-r-full);padding:3px 10px;
|
|
257
|
+
transition:background var(--rk-dur) var(--rk-ease),border-color var(--rk-dur) var(--rk-ease)}
|
|
258
|
+
.rk-dir-newfolder:hover{background:var(--rk-gold-tint);border-color:var(--rk-gold-600)}
|
|
259
|
+
/* selection toolbar (shown when 1+ rows are selected) */
|
|
260
|
+
.rk-dir-selbar{flex:none;display:flex;align-items:center;gap:8px;margin:0 10px 8px;padding:7px 10px;
|
|
261
|
+
background:var(--rk-gold-tint);border:1px solid var(--rk-gold-600);border-radius:var(--rk-r-xl)}
|
|
262
|
+
.rk-dir-selbar[hidden]{display:none}
|
|
263
|
+
.rk-dir-selcount{flex:1;font-size:12px;font-weight:700;color:var(--rk-gold-700)}
|
|
264
|
+
.rk-dir-selbtn{font-family:inherit;font-size:12px;font-weight:700;color:var(--rk-ink);cursor:pointer;
|
|
265
|
+
background:#fff;border:1px solid var(--rk-gold-600);border-radius:var(--rk-r-full);padding:4px 12px}
|
|
266
|
+
.rk-dir-selbtn:hover{background:var(--rk-gold-tint2)}
|
|
267
|
+
.rk-dir-selbtn.is-ghost{border-color:var(--rk-border);color:var(--rk-text-muted);background:transparent}
|
|
268
|
+
.rk-dir-selbtn.is-ghost:hover{background:var(--rk-n-100);color:var(--rk-ink)}
|
|
269
|
+
/* per-row select checkbox — discoverable on hover, sticky when selected */
|
|
270
|
+
.rk-dir-check{flex:none;width:15px;height:15px;margin:0;accent-color:var(--rk-gold-600);cursor:pointer;opacity:0;
|
|
271
|
+
transition:opacity var(--rk-dur) var(--rk-ease)}
|
|
272
|
+
.rk-aichat-frow:hover .rk-dir-check,.rk-dir-row.is-selected .rk-dir-check,.rk-dir-check:focus-visible{opacity:1}
|
|
273
|
+
.rk-dir-row.is-selected{background:var(--rk-gold-tint);outline:1.5px solid var(--rk-gold-600);outline-offset:-1.5px}
|
|
274
|
+
/* folder Open button — always visible (it's the navigation affordance) */
|
|
275
|
+
.rk-dir-open{opacity:1;color:var(--rk-text-muted)}
|
|
276
|
+
.rk-aichat-frow:hover .rk-dir-open{color:var(--rk-gold-700)}
|
|
277
|
+
/* per-row "…" kebab */
|
|
278
|
+
.rk-dir-kebab{flex:none;width:26px;height:26px;border-radius:var(--rk-r-md);border:1px solid transparent;background:transparent;
|
|
279
|
+
cursor:pointer;color:var(--rk-n-500);font-size:16px;line-height:1;display:grid;place-items:center;opacity:0;
|
|
280
|
+
transition:opacity var(--rk-dur) var(--rk-ease),background var(--rk-dur) var(--rk-ease),border-color var(--rk-dur) var(--rk-ease)}
|
|
281
|
+
.rk-aichat-frow:hover .rk-dir-kebab,.rk-dir-kebab:focus-visible{opacity:1}
|
|
282
|
+
.rk-dir-kebab:hover{background:var(--rk-n-100);color:var(--rk-ink);border-color:var(--rk-border)}
|
|
283
|
+
/* kebab popup + copy toast (appended to <body>, so plain colors not tokens for
|
|
284
|
+
portability onto any host page) */
|
|
285
|
+
.rk-dir-menu{position:fixed;z-index:2147483000;min-width:150px;background:#fff;border:1px solid var(--rk-border,#e6e1d8);
|
|
286
|
+
border-radius:var(--rk-r-lg,12px);box-shadow:var(--rk-shadow-md,0 10px 30px rgba(40,30,10,.16));padding:5px;display:grid;gap:1px}
|
|
287
|
+
.rk-dir-menuitem{font-family:inherit;font-size:12.5px;font-weight:600;color:var(--rk-ink,#2b2620);cursor:pointer;
|
|
288
|
+
text-align:left;background:transparent;border:0;border-radius:var(--rk-r-md,8px);padding:7px 10px}
|
|
289
|
+
.rk-dir-menuitem:hover{background:var(--rk-n-100,#f2efe9)}
|
|
290
|
+
.rk-dir-menuitem.is-danger{color:#b4341f}
|
|
291
|
+
.rk-dir-menuitem.is-danger:hover{background:#fbeae6}
|
|
292
|
+
.rk-dir-toast{position:fixed;z-index:2147483001;left:50%;bottom:26px;transform:translate(-50%,12px);
|
|
293
|
+
background:#2b2620;color:#fff;font-family:var(--rk-font-body,inherit);font-size:12.5px;font-weight:600;
|
|
294
|
+
padding:9px 15px;border-radius:999px;box-shadow:0 10px 30px rgba(0,0,0,.25);max-width:80vw;overflow:hidden;
|
|
295
|
+
text-overflow:ellipsis;white-space:nowrap;opacity:0;pointer-events:none;
|
|
296
|
+
transition:opacity .18s ease,transform .18s ease}
|
|
297
|
+
.rk-dir-toast.is-on{opacity:1;transform:translate(-50%,0)}
|
|
298
|
+
|
|
187
299
|
/* chat column */
|
|
188
300
|
.rk-aichat-main{flex:1;min-width:0;display:flex;flex-direction:column}
|
|
189
301
|
.rk-aichat-head{display:flex;align-items:center;gap:8px;padding:14px 14px;border-bottom:1px solid var(--rk-border);flex:none}
|
|
190
302
|
.rk-aichat-head-main{flex:1;min-width:0;display:grid;gap:1px}
|
|
191
303
|
.rk-aichat-title{font-family:var(--rk-font-display);font-weight:800;font-size:15px;color:var(--rk-ink);letter-spacing:-.01em}
|
|
192
304
|
.rk-aichat-sub{font-size:11.5px;color:var(--rk-text-muted)}
|
|
305
|
+
.rk-aichat-back{flex:1;min-width:0;display:inline-flex;align-items:center;gap:8px;padding:7px 12px 7px 9px;
|
|
306
|
+
border-radius:999px;border:1px solid var(--rk-border);background:#fff;cursor:pointer;text-decoration:none;
|
|
307
|
+
font-family:var(--rk-font-display);font-weight:700;font-size:13.5px;color:var(--rk-ink);letter-spacing:-.01em;
|
|
308
|
+
transition:background var(--rk-dur) var(--rk-ease),border-color var(--rk-dur) var(--rk-ease)}
|
|
309
|
+
.rk-aichat-back:hover{background:var(--rk-n-100);border-color:var(--rk-n-300)}
|
|
310
|
+
.rk-aichat-back svg{width:17px;height:17px;flex:none;color:var(--rk-n-600)}
|
|
311
|
+
.rk-aichat-back span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
193
312
|
.rk-aichat-tool{width:30px;height:30px;border-radius:var(--rk-r-lg);border:1px solid var(--rk-border);background:#fff;
|
|
194
313
|
cursor:pointer;color:var(--rk-n-600);display:grid;place-items:center;font-size:13px;flex:none;
|
|
195
314
|
transition:background var(--rk-dur) var(--rk-ease),color var(--rk-dur) var(--rk-ease),border-color var(--rk-dur) var(--rk-ease)}
|
|
196
315
|
.rk-aichat-tool:hover{background:var(--rk-n-100);color:var(--rk-ink)}
|
|
197
316
|
.rk-aichat-tool svg{width:15px;height:15px}
|
|
198
317
|
.rk-aichat-tool.is-on{background:var(--rk-gold-tint);border-color:var(--rk-gold-600);color:var(--rk-ink)}
|
|
199
|
-
|
|
200
|
-
|
|
318
|
+
/* overflow-x:hidden + a capped single column (minmax(0,1fr), NOT the default
|
|
319
|
+
auto track which grows to content) keep the log scrolling ONLY vertically —
|
|
320
|
+
a wide child (long tool note / URL / file path) can no longer widen the grid
|
|
321
|
+
and force a horizontal scrollbar in the narrow dock column. */
|
|
322
|
+
.rk-aichat-log{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;padding:16px;display:grid;grid-template-columns:minmax(0,1fr);gap:10px;align-content:start;background:var(--rk-n-50)}
|
|
323
|
+
.rk-aichat-msg{max-width:85%;min-width:0;padding:10px 14px;border-radius:var(--rk-r-2xl);font-size:13.5px;line-height:1.5;overflow-wrap:anywhere;word-break:break-word}
|
|
201
324
|
.rk-aichat-msg.is-ai{background:#fff;border:1px solid var(--rk-border);color:var(--rk-text);justify-self:start;
|
|
202
325
|
border-bottom-left-radius:var(--rk-r-sm);box-shadow:var(--rk-shadow-xs)}
|
|
203
326
|
.rk-aichat-msg.is-user{background:var(--rk-gold-tint2);color:var(--rk-ink);justify-self:end;border-bottom-right-radius:var(--rk-r-sm)}
|
|
327
|
+
/* rendered markdown inside assistant replies (bold / italic / links) */
|
|
328
|
+
.rk-aichat-msg.is-ai a,.rk-aichat-stream a{color:var(--rk-gold-700);font-weight:600;text-decoration:underline;text-underline-offset:2px;overflow-wrap:anywhere}
|
|
329
|
+
.rk-aichat-msg.is-ai strong,.rk-aichat-stream strong{color:var(--rk-ink);font-weight:700}
|
|
330
|
+
.rk-aichat-msg.is-ai em,.rk-aichat-stream em{font-style:italic}
|
|
204
331
|
.rk-aichat-chips{display:flex;flex-wrap:wrap;gap:6px;padding:10px 12px 0;flex:none}
|
|
205
332
|
.rk-aichat-chips:empty{display:none}
|
|
206
333
|
.rk-aichat-chip{display:inline-flex;align-items:center;gap:4px;padding:4px 6px 4px 10px;border-radius:var(--rk-r-full);
|
|
207
334
|
background:var(--rk-gold-tint2);color:var(--rk-gold-700);font-size:11.5px;font-weight:600;max-width:190px}
|
|
208
335
|
.rk-aichat-chip span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
209
336
|
.rk-aichat-chip button{border:0;background:transparent;color:inherit;cursor:pointer;font-size:14px;line-height:1;padding:0 2px}
|
|
210
|
-
.rk-aichat-
|
|
211
|
-
.
|
|
337
|
+
.rk-aichat-chip-label{max-width:150px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-family:inherit;
|
|
338
|
+
font-size:11.5px;font-weight:600;text-align:left;text-decoration:underline;text-underline-offset:2px;text-decoration-color:transparent}
|
|
339
|
+
.rk-aichat-chip-label:hover{text-decoration-color:currentColor}
|
|
340
|
+
.rk-aichat-chip.is-pending{opacity:.75}
|
|
341
|
+
.rk-aichat-chip.is-pending .rk-aichat-chip-label{text-decoration:none;cursor:default}
|
|
342
|
+
.rk-aichat-chip-spin{width:11px;height:11px;flex:none;border-radius:50%;border:2px solid currentColor;
|
|
343
|
+
border-top-color:transparent;animation:rk-aichat-chip-spin .7s linear infinite}
|
|
344
|
+
@keyframes rk-aichat-chip-spin{to{transform:rotate(360deg)}}
|
|
345
|
+
/* composer = one bordered "text area" box: the textarea fills the top and the
|
|
346
|
+
attach + send controls sit inside it along the bottom row. */
|
|
347
|
+
.rk-aichat-composer{display:flex;flex-direction:column;gap:8px;margin:12px;padding:10px 10px 9px;flex:none;background:#fff;
|
|
348
|
+
border:1px solid var(--rk-border-strong);border-radius:var(--rk-r-2xl);box-shadow:var(--rk-shadow-xs);
|
|
349
|
+
transition:border-color var(--rk-dur) var(--rk-ease),box-shadow var(--rk-dur) var(--rk-ease)}
|
|
350
|
+
.rk-aichat-composer:focus-within{border-color:var(--rk-gold-600);box-shadow:var(--rk-ring-gold)}
|
|
351
|
+
.rk-aichat-field{width:100%;min-height:70px;max-height:210px;resize:none;border:0;background:transparent;
|
|
352
|
+
color:var(--rk-ink);font-family:var(--rk-font-body);font-size:14px;line-height:1.5;padding:4px 4px 0}
|
|
353
|
+
.rk-aichat-field:focus{outline:none;box-shadow:none}
|
|
354
|
+
.rk-aichat-field::placeholder{color:var(--rk-n-400)}
|
|
355
|
+
.rk-aichat-composer-actions{display:flex;align-items:center;gap:8px}
|
|
356
|
+
.rk-aichat-composer-actions .rk-btn{margin-left:auto}
|
|
357
|
+
/* composer paperclip — opens the folder directory nav to browse + attach files
|
|
358
|
+
(tokens so it re-themes on the dark editor dock automatically) */
|
|
359
|
+
.rk-aichat-attach{flex:none;width:38px;height:38px;border-radius:var(--rk-r-full);border:1px solid var(--rk-border);
|
|
360
|
+
background:var(--rk-surface);color:var(--rk-n-500);cursor:pointer;display:grid;place-items:center;
|
|
361
|
+
transition:background var(--rk-dur) var(--rk-ease),border-color var(--rk-dur) var(--rk-ease),color var(--rk-dur) var(--rk-ease)}
|
|
362
|
+
.rk-aichat-attach:hover,.rk-aichat-attach.is-on{border-color:var(--rk-gold-600);background:var(--rk-gold-tint);color:var(--rk-ink)}
|
|
363
|
+
.rk-aichat-attach svg{width:18px;height:18px}
|
|
364
|
+
|
|
365
|
+
/* ── live agentic turn: status → actions (tool notes + HTTP cards) → text ── */
|
|
366
|
+
.rk-aichat-turn{display:grid;gap:8px;justify-items:start;width:100%;min-width:0}
|
|
367
|
+
.rk-aichat-stream{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;max-width:100%}
|
|
368
|
+
.rk-aichat-stream[hidden]{display:none}
|
|
369
|
+
.rk-aichat-actions{display:grid;gap:6px;width:100%}
|
|
370
|
+
.rk-aichat-actions:empty{display:none}
|
|
371
|
+
.rk-aichat-status{display:flex;align-items:center;padding:2px 2px}
|
|
372
|
+
.rk-aichat-status[hidden]{display:none}
|
|
373
|
+
.rk-aichat-typing{display:inline-flex;gap:4px;align-items:center}
|
|
374
|
+
.rk-aichat-typing span{width:6px;height:6px;border-radius:50%;background:var(--rk-n-400);
|
|
375
|
+
animation:rk-aichat-blink 1.2s var(--rk-ease) infinite}
|
|
376
|
+
.rk-aichat-typing span:nth-child(2){animation-delay:.18s}
|
|
377
|
+
.rk-aichat-typing span:nth-child(3){animation-delay:.36s}
|
|
378
|
+
@keyframes rk-aichat-blink{0%,80%,100%{opacity:.28;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}
|
|
379
|
+
.rk-aichat-toolnote{display:inline-flex;align-items:center;gap:7px;font-size:11.5px;color:var(--rk-text-muted);
|
|
380
|
+
font-family:var(--rk-font-mono);background:#fff;border:1px solid var(--rk-border);
|
|
381
|
+
border-radius:var(--rk-r-lg);padding:5px 10px;width:fit-content;max-width:100%;overflow-wrap:anywhere;word-break:break-word}
|
|
382
|
+
.rk-aichat-toolnote::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--rk-gold-500);flex:none}
|
|
383
|
+
.rk-aichat-loadmore{width:100%;margin-top:6px;padding:9px 12px;font-size:12.5px;font-weight:600;
|
|
384
|
+
color:var(--rk-text);background:var(--rk-white);border:1px solid var(--rk-border);
|
|
385
|
+
border-radius:var(--rk-r-lg);cursor:pointer;font-family:var(--rk-font-mono)}
|
|
386
|
+
.rk-aichat-loadmore:hover{background:var(--rk-n-50);border-color:var(--rk-border-strong)}
|
|
387
|
+
.rk-aichat-loadmore:disabled{opacity:.6;cursor:default}
|
|
388
|
+
.rk-aichat-toolnote.is-ok{color:#0a7c3f}
|
|
389
|
+
.rk-aichat-toolnote.is-ok::before{background:#12a150}
|
|
390
|
+
.rk-aichat-toolnote.is-err{color:#b42318}
|
|
391
|
+
.rk-aichat-toolnote.is-err::before{background:#d92d20}
|
|
392
|
+
.rk-aichat-err{font-size:12.5px;color:#b42318;background:#fff;border:1px solid var(--rk-border);
|
|
393
|
+
border-radius:var(--rk-r-lg);padding:9px 11px;white-space:pre-wrap;width:100%}
|
|
394
|
+
|
|
395
|
+
/* first-class HTTP action card (chip → modal) */
|
|
396
|
+
.rk-aichat-http{display:flex;align-items:center;gap:8px;width:100%;padding:7px 9px;cursor:pointer;text-align:left;
|
|
397
|
+
background:#fff;border:1px solid var(--rk-border);border-radius:var(--rk-r-lg);box-shadow:var(--rk-shadow-xs);
|
|
398
|
+
transition:border-color var(--rk-dur) var(--rk-ease),box-shadow var(--rk-dur) var(--rk-ease)}
|
|
399
|
+
.rk-aichat-http:hover{border-color:var(--rk-gold-600);box-shadow:var(--rk-shadow-sm)}
|
|
400
|
+
.rk-aichat-http-method{flex:none;font-family:var(--rk-font-mono);font-size:10.5px;font-weight:700;letter-spacing:.03em;
|
|
401
|
+
color:var(--rk-gold-700);background:var(--rk-gold-tint);border-radius:var(--rk-r-sm);padding:2px 7px}
|
|
402
|
+
.rk-aichat-http-url{flex:1;min-width:0;font-family:var(--rk-font-mono);font-size:11.5px;color:var(--rk-n-700);
|
|
403
|
+
white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
404
|
+
.rk-aichat-http-status{flex:none;font-family:var(--rk-font-mono);font-size:11px;font-weight:700;color:var(--rk-green);
|
|
405
|
+
background:var(--rk-green-tint);border-radius:var(--rk-r-sm);padding:2px 7px}
|
|
406
|
+
.rk-aichat-http-status[data-error="true"]{color:var(--rk-red);background:var(--rk-red-tint)}
|
|
407
|
+
|
|
408
|
+
/* HTTP request/response modal (portalled to body, above the fixed panel) */
|
|
409
|
+
.rk-aichat-modal-back{position:fixed;inset:0;z-index:120;display:grid;place-items:center;padding:20px;
|
|
410
|
+
background:rgba(23,23,23,.42);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
|
|
411
|
+
animation:rk-aichat-in .16s var(--rk-ease)}
|
|
412
|
+
.rk-aichat-modal{width:min(720px,100%);max-height:min(82vh,calc(100vh - 24px));display:flex;flex-direction:column;background:var(--rk-surface);
|
|
413
|
+
border:1px solid var(--rk-border);border-radius:var(--rk-r-2xl);box-shadow:var(--rk-shadow-xl);overflow:hidden}
|
|
414
|
+
.rk-aichat-modal-head{display:flex;align-items:center;gap:9px;padding:14px 16px;border-bottom:1px solid var(--rk-border);flex:none}
|
|
415
|
+
.rk-aichat-modal-head .rk-aichat-http-url{font-size:12.5px}
|
|
416
|
+
.rk-aichat-modal-x{flex:none;margin-left:2px;width:28px;height:28px;border-radius:var(--rk-r-lg);border:1px solid var(--rk-border);
|
|
417
|
+
background:#fff;color:var(--rk-n-500);cursor:pointer;font-size:17px;line-height:1;display:grid;place-items:center}
|
|
418
|
+
.rk-aichat-modal-x:hover{background:var(--rk-n-100);color:var(--rk-ink)}
|
|
419
|
+
.rk-aichat-modal-body{padding:14px 16px;overflow-y:auto;display:grid;gap:14px}
|
|
420
|
+
.rk-aichat-http-note{font-size:12.5px;color:var(--rk-text-muted);line-height:1.5}
|
|
421
|
+
.rk-aichat-http-block{display:grid;gap:5px}
|
|
422
|
+
.rk-aichat-http-blabel{font-size:10.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--rk-text-faint)}
|
|
423
|
+
.rk-aichat-http-pre{margin:0;font-family:var(--rk-font-mono);font-size:11.5px;line-height:1.55;color:var(--rk-n-700);
|
|
424
|
+
background:var(--rk-n-50);border:1px solid var(--rk-border);border-radius:var(--rk-r-lg);padding:10px 12px;
|
|
425
|
+
max-height:220px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere}
|
|
212
426
|
|
|
213
|
-
/*
|
|
427
|
+
/* collapsible JSON tree (request/response/headers inspection in the modal) */
|
|
428
|
+
.rk-aichat-json{border:1px solid var(--rk-border);border-radius:var(--rk-r-lg);background:#fff;overflow:hidden}
|
|
429
|
+
.rk-aichat-json-bar{display:flex;align-items:center;gap:8px;padding:7px 10px;border-bottom:1px solid var(--rk-border);
|
|
430
|
+
background:var(--rk-n-50)}
|
|
431
|
+
.rk-aichat-json-all{font-family:var(--rk-font-body);font-size:11px;font-weight:700;color:var(--rk-n-600);cursor:pointer;
|
|
432
|
+
background:#fff;border:1px solid var(--rk-border);border-radius:var(--rk-r-full);padding:3px 10px}
|
|
433
|
+
.rk-aichat-json-all:hover{background:var(--rk-gold-tint);border-color:var(--rk-gold-600);color:var(--rk-ink)}
|
|
434
|
+
.rk-aichat-json-scroll{max-height:300px;overflow:auto;padding:8px 0}
|
|
435
|
+
.rk-aichat-json-line{position:relative;display:flex;align-items:flex-start;width:100%;min-height:22px;padding-right:34px}
|
|
436
|
+
.rk-aichat-json-line:hover{background:var(--rk-gold-tint)}
|
|
437
|
+
.rk-aichat-json-line.is-toggle{padding-left:0}
|
|
438
|
+
.rk-aichat-json-caret{flex:none;width:20px;height:20px;margin-top:1px;display:grid;place-items:center;border:0;
|
|
439
|
+
background:transparent;color:var(--rk-n-500);cursor:pointer}
|
|
440
|
+
.rk-aichat-json-caret svg{transition:transform var(--rk-dur) var(--rk-ease)}
|
|
441
|
+
.rk-aichat-json-caret[data-open="true"] svg{transform:rotate(90deg)}
|
|
442
|
+
.rk-aichat-json-text{display:block;width:100%;font-family:var(--rk-font-mono);font-size:11.5px;line-height:1.5;
|
|
443
|
+
color:var(--rk-n-700);white-space:pre-wrap;word-break:break-word}
|
|
444
|
+
.rk-aichat-json-copy{position:absolute;right:8px;top:2px;width:20px;height:20px;border-radius:var(--rk-r-sm);
|
|
445
|
+
display:grid;place-items:center;border:1px solid var(--rk-border);background:#fff;color:var(--rk-n-500);cursor:pointer;
|
|
446
|
+
opacity:0;box-shadow:var(--rk-shadow-xs);transition:opacity var(--rk-dur) var(--rk-ease),color var(--rk-dur) var(--rk-ease)}
|
|
447
|
+
.rk-aichat-json-line:hover .rk-aichat-json-copy,.rk-aichat-json-copy:focus-visible{opacity:1}
|
|
448
|
+
.rk-aichat-json-copy:hover{color:var(--rk-gold-700);border-color:var(--rk-gold-600)}
|
|
449
|
+
|
|
450
|
+
/* ── file preview modal (images carousel, video, audio, pdf, md/txt/json) ── */
|
|
451
|
+
.rk-aichat-preview{width:min(880px,100%);max-height:min(88vh,calc(100vh - 24px))}
|
|
452
|
+
.rk-aichat-preview-name{flex:1;min-width:0;font-family:var(--rk-font-body);font-weight:700;font-size:13px;color:var(--rk-ink);
|
|
453
|
+
white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
454
|
+
.rk-aichat-preview-open{flex:none;font-size:11.5px;font-weight:700;color:var(--rk-gold-700);text-decoration:none;
|
|
455
|
+
border:1px solid var(--rk-border);border-radius:var(--rk-r-full);padding:4px 11px}
|
|
456
|
+
.rk-aichat-preview-open:hover{background:var(--rk-gold-tint);border-color:var(--rk-gold-600)}
|
|
457
|
+
.rk-aichat-preview-body{padding:0;display:block;min-height:120px;background:var(--rk-n-50)}
|
|
458
|
+
.rk-aichat-preview-img{display:block;max-width:100%;max-height:70vh;margin:0 auto;object-fit:contain;background:var(--rk-n-100)}
|
|
459
|
+
.rk-aichat-preview-media{display:block;width:100%;max-height:70vh;background:#000}
|
|
460
|
+
.rk-aichat-preview-audiowrap{padding:34px 20px;display:grid;place-items:center}
|
|
461
|
+
.rk-aichat-preview-audio{width:100%;max-width:460px}
|
|
462
|
+
.rk-aichat-preview-frame{display:block;width:100%;height:70vh;border:0;background:#fff}
|
|
463
|
+
.rk-aichat-preview-loading{padding:34px 16px;text-align:center;font-size:12.5px;color:var(--rk-text-muted)}
|
|
464
|
+
.rk-aichat-preview-text{margin:0;border:0;border-radius:0;max-height:70vh;background:#fff}
|
|
465
|
+
.rk-aichat-preview .rk-aichat-json{border:0;border-radius:0}
|
|
466
|
+
.rk-aichat-preview .rk-aichat-json-scroll{max-height:70vh}
|
|
467
|
+
.rk-aichat-preview-md{padding:18px 22px;max-height:70vh;overflow:auto;background:#fff;font-size:13.5px;line-height:1.6;color:var(--rk-n-700)}
|
|
468
|
+
.rk-aichat-preview-md h1,.rk-aichat-preview-md h2,.rk-aichat-preview-md h3,.rk-aichat-preview-md h4,.rk-aichat-preview-md h5,.rk-aichat-preview-md h6{
|
|
469
|
+
font-family:var(--rk-font-display);color:var(--rk-ink);font-weight:800;line-height:1.25;margin:16px 0 8px}
|
|
470
|
+
.rk-aichat-preview-md h1{font-size:20px}.rk-aichat-preview-md h2{font-size:17px}.rk-aichat-preview-md h3{font-size:15px}
|
|
471
|
+
.rk-aichat-preview-md h4,.rk-aichat-preview-md h5,.rk-aichat-preview-md h6{font-size:13.5px}
|
|
472
|
+
.rk-aichat-preview-md p{margin:0 0 10px}
|
|
473
|
+
.rk-aichat-preview-md ul,.rk-aichat-preview-md ol{margin:0 0 10px;padding-left:22px}
|
|
474
|
+
.rk-aichat-preview-md li{margin:3px 0}
|
|
475
|
+
.rk-aichat-preview-md a{color:var(--rk-gold-700);font-weight:600;text-decoration:underline;text-underline-offset:2px;overflow-wrap:anywhere}
|
|
476
|
+
.rk-aichat-preview-md strong{color:var(--rk-ink);font-weight:700}.rk-aichat-preview-md em{font-style:italic}
|
|
477
|
+
.rk-aichat-preview-md code{font-family:var(--rk-font-mono);font-size:12px;background:var(--rk-n-100);border-radius:5px;padding:1px 5px;color:var(--rk-n-700)}
|
|
478
|
+
.rk-aichat-preview-md blockquote{margin:0 0 10px;padding:2px 0 2px 12px;border-left:3px solid var(--rk-border-strong);color:var(--rk-text-muted)}
|
|
479
|
+
.rk-aichat-preview-md hr{border:0;border-top:1px solid var(--rk-border);margin:14px 0}
|
|
480
|
+
.rk-aichat-preview-code{margin:0 0 10px;font-family:var(--rk-font-mono);font-size:11.5px;line-height:1.5;color:var(--rk-n-700);
|
|
481
|
+
background:var(--rk-n-50);border:1px solid var(--rk-border);border-radius:var(--rk-r-lg);padding:10px 12px;overflow:auto;white-space:pre}
|
|
482
|
+
.rk-aichat-preview-code code{background:transparent;padding:0}
|
|
483
|
+
.rk-aichat-preview-empty{padding:40px 16px;display:grid;gap:12px;justify-items:center;text-align:center;font-size:12.5px;color:var(--rk-text-muted)}
|
|
484
|
+
.rk-aichat-preview-dl{font-size:12.5px;font-weight:700;color:var(--rk-ink);cursor:pointer;background:var(--rk-gold-tint);
|
|
485
|
+
border:1px solid var(--rk-gold-600);border-radius:var(--rk-r-full);padding:7px 15px;text-decoration:none}
|
|
486
|
+
.rk-aichat-preview-dl:hover{background:var(--rk-gold-tint2)}
|
|
487
|
+
.rk-aichat-preview-nav{display:flex;align-items:center;justify-content:center;gap:14px;padding:11px 16px;
|
|
488
|
+
border-top:1px solid var(--rk-border);flex:none;background:var(--rk-surface)}
|
|
489
|
+
.rk-aichat-preview-nav[hidden]{display:none}
|
|
490
|
+
.rk-aichat-preview-btn{font-family:inherit;font-size:12px;font-weight:700;color:var(--rk-ink);cursor:pointer;
|
|
491
|
+
background:#fff;border:1px solid var(--rk-border);border-radius:var(--rk-r-full);padding:6px 14px;
|
|
492
|
+
transition:background var(--rk-dur) var(--rk-ease),border-color var(--rk-dur) var(--rk-ease)}
|
|
493
|
+
.rk-aichat-preview-btn:hover:not(:disabled){background:var(--rk-gold-tint);border-color:var(--rk-gold-600)}
|
|
494
|
+
.rk-aichat-preview-btn:disabled{opacity:.4;cursor:default}
|
|
495
|
+
.rk-aichat-preview-count{font-size:11.5px;font-weight:600;color:var(--rk-text-muted);font-variant-numeric:tabular-nums;min-width:52px;text-align:center}
|
|
496
|
+
|
|
497
|
+
/* create_video pipeline: live status row + clickable result links */
|
|
498
|
+
.rk-aichat-flow{display:flex;align-items:center;gap:9px;font-size:12.5px;color:var(--rk-text-muted);padding:2px 2px}
|
|
499
|
+
.rk-aichat-flow[hidden]{display:none}
|
|
500
|
+
.rk-aichat-flow-label{line-height:1.4}
|
|
501
|
+
.rk-aichat-msg a,.rk-aichat-stream a{color:var(--rk-gold-700);font-weight:700;text-decoration:underline;
|
|
502
|
+
text-underline-offset:2px;overflow-wrap:anywhere}
|
|
503
|
+
.rk-aichat-msg a:hover,.rk-aichat-stream a:hover{color:var(--rk-ink)}
|
|
504
|
+
|
|
505
|
+
/* narrow: stack the left drawer above the chat so neither pane is cut off.
|
|
506
|
+
Cap the drawer to a fraction of the *viewport* (not 44% of the panel) and
|
|
507
|
+
floor the chat log so the composer is never crushed on short/landscape phones. */
|
|
214
508
|
@media(max-width:700px){
|
|
215
|
-
.rk-aichat.has-files{flex-direction:column}
|
|
216
|
-
.rk-aichat.has-files .rk-aichat-files
|
|
509
|
+
.rk-aichat.has-files,.rk-aichat.has-history{flex-direction:column}
|
|
510
|
+
.rk-aichat.has-files .rk-aichat-files,
|
|
511
|
+
.rk-aichat.has-history .rk-aichat-history{width:auto;max-height:min(44%,34vh);border-right:0;border-bottom:1px solid var(--rk-border)}
|
|
512
|
+
.rk-aichat-log{min-height:60px}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/* touch devices have no hover, so controls that reveal on :hover would stay
|
|
516
|
+
invisible. Un-hide them on coarse pointers: the row kebab "…" (Copy path /
|
|
517
|
+
Delete), the multi-select checkbox, the folder Open chevron, the chat +Attach
|
|
518
|
+
button, and the JSON copy button. (Hover-only decorative states stay as-is.) */
|
|
519
|
+
@media(hover:none){
|
|
520
|
+
.rk-dir-kebab,.rk-dir-check,.rk-dir-open,.rk-aichat-fadd,.rk-aichat-json-copy{opacity:1}
|
|
217
521
|
}
|
|
218
522
|
|
|
219
523
|
/* brand + glass helpers (kept — reused by the sidebar brand + the login page) */
|
|
@@ -221,9 +525,9 @@ export const RESKIN_CSS = `
|
|
|
221
525
|
-webkit-backdrop-filter:blur(var(--rk-glass-blur));border:1px solid var(--rk-border);box-shadow:var(--rk-shadow-nav)}
|
|
222
526
|
.rk-brand{display:inline-flex;align-items:center;gap:8px;font-family:var(--rk-font-display);
|
|
223
527
|
font-weight:800;font-size:20px;color:var(--rk-ink);letter-spacing:-.02em;flex:none}
|
|
224
|
-
.rk-brand-mark{width:26px;height:26px;border-radius:8px;
|
|
225
|
-
|
|
226
|
-
color:
|
|
528
|
+
.rk-brand-mark{display:inline-block;vertical-align:middle;width:26px;height:26px;border-radius:8px;
|
|
529
|
+
background:center/contain no-repeat url("/assets/logo-vidfarm.png");
|
|
530
|
+
font-size:0;color:transparent;flex:none;text-indent:-9999px;overflow:hidden}
|
|
227
531
|
.rk-brand-tag{font-family:var(--rk-font-body);font-size:11px;font-weight:600;color:var(--rk-gold-700);
|
|
228
532
|
background:var(--rk-gold-tint2);padding:2px 8px;border-radius:var(--rk-r-full);letter-spacing:.02em}
|
|
229
533
|
|
|
@@ -235,10 +539,38 @@ export const RESKIN_CSS = `
|
|
|
235
539
|
.rk-sidebar-nav{flex-direction:row;gap:4px;flex:1}
|
|
236
540
|
.rk-sidebar-sep{display:none}
|
|
237
541
|
.rk-sidebar-item{padding:8px 12px}
|
|
542
|
+
/* horizontal strip: FAB no longer collides with the foot, drop the reserve */
|
|
543
|
+
/* horizontal strip: kill the foot border + top offset so the account block
|
|
544
|
+
sits centered in the row instead of showing a stray hairline above it */
|
|
545
|
+
.rk-sidebar-account{padding:8px 13px 2px;border-top:0;margin-top:0}
|
|
546
|
+
/* strip/burger layout: the account block is no longer at the sidebar foot,
|
|
547
|
+
so drop the FAB back to its normal bottom-left resting spot */
|
|
548
|
+
.rk-signed-in .rk-fab{bottom:calc(16px + env(safe-area-inset-bottom))}
|
|
238
549
|
.rk-content{margin-left:0}
|
|
239
550
|
.rk-chat-left .rk-sidebar{visibility:visible}
|
|
240
551
|
}
|
|
241
552
|
|
|
553
|
+
/* hamburger button — hidden except on phones (see ≤640 block below) */
|
|
554
|
+
.rk-nav-burger{display:none;margin-left:auto;flex:none;width:40px;height:40px;border-radius:var(--rk-r-lg);
|
|
555
|
+
border:1px solid var(--rk-border);background:#fff;color:var(--rk-n-700);cursor:pointer;place-items:center;
|
|
556
|
+
transition:background var(--rk-dur) var(--rk-ease),border-color var(--rk-dur) var(--rk-ease)}
|
|
557
|
+
.rk-nav-burger:hover{background:var(--rk-n-100);border-color:var(--rk-border-strong)}
|
|
558
|
+
|
|
559
|
+
/* phones: swap the horizontal-scroll strip for a real hamburger dropdown so all
|
|
560
|
+
nav items + the account block are reachable (the strip pushes them off-screen). */
|
|
561
|
+
@media(max-width:640px){
|
|
562
|
+
.rk-sidebar{flex-wrap:wrap;overflow:visible;position:sticky;top:0;z-index:60;gap:8px;
|
|
563
|
+
background:#fff;border-bottom:1px solid var(--rk-border)}
|
|
564
|
+
.rk-nav-burger{display:grid}
|
|
565
|
+
.rk-sidebar-nav{order:3;flex-basis:100%;flex-direction:column;gap:3px;display:none;padding-bottom:4px}
|
|
566
|
+
.rk-nav-toggle-cb:checked~.rk-sidebar-nav{display:flex}
|
|
567
|
+
.rk-sidebar-item{width:100%;padding:11px 13px}
|
|
568
|
+
/* account block only inside the open dropdown (it's just noise in the collapsed bar) */
|
|
569
|
+
.rk-sidebar-account{display:none;order:4;flex-basis:100%;border-top:1px solid var(--rk-border);
|
|
570
|
+
margin-top:2px;padding-top:8px}
|
|
571
|
+
.rk-nav-toggle-cb:checked~.rk-sidebar-account{display:block}
|
|
572
|
+
}
|
|
573
|
+
|
|
242
574
|
/* buttons */
|
|
243
575
|
.rk-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:11px 18px;
|
|
244
576
|
border-radius:var(--rk-r-full);font-family:var(--rk-font-body);font-size:14px;font-weight:600;
|
|
@@ -250,6 +582,12 @@ export const RESKIN_CSS = `
|
|
|
250
582
|
.rk-btn-ink:hover{background:#000;box-shadow:var(--rk-shadow-md);transform:translateY(-1px)}
|
|
251
583
|
.rk-btn-gold{background:var(--rk-gold-500);color:var(--rk-ink);font-weight:700;box-shadow:var(--rk-shadow-sm)}
|
|
252
584
|
.rk-btn-gold:hover{background:var(--rk-gold-700);box-shadow:0 6px 18px -6px rgba(252,185,0,.6);transform:translateY(-1px)}
|
|
585
|
+
/* interruptive Stop — the composer send button while a reply is streaming.
|
|
586
|
+
Fixed charcoal (not token-based) so it reads on both the light /chat page
|
|
587
|
+
and the dark editor dock. */
|
|
588
|
+
.rk-btn.is-stop{background:#2f2f2f;color:#fff;box-shadow:var(--rk-shadow-sm)}
|
|
589
|
+
.rk-btn.is-stop:hover{background:#1a1a1a;box-shadow:var(--rk-shadow-md);transform:none}
|
|
590
|
+
.rk-btn.is-stop svg{width:14px;height:14px}
|
|
253
591
|
.rk-btn-ghost{background:#fff;color:var(--rk-ink);border-color:var(--rk-border);box-shadow:var(--rk-shadow-xs)}
|
|
254
592
|
.rk-btn-ghost:hover{border-color:var(--rk-border-strong);box-shadow:var(--rk-shadow-sm)}
|
|
255
593
|
.rk-btn-danger{background:#fff;color:var(--rk-red);border-color:var(--rk-red-tint)}
|
|
@@ -257,6 +595,8 @@ export const RESKIN_CSS = `
|
|
|
257
595
|
.rk-btn-sm{padding:7px 13px;font-size:13px}
|
|
258
596
|
.rk-btn-lg{padding:14px 24px;font-size:15px}
|
|
259
597
|
.rk-btn-block{width:100%}
|
|
598
|
+
/* touch: guarantee a comfortable tap size on the small pill buttons */
|
|
599
|
+
@media(hover:none){.rk-btn-sm{min-height:40px}}
|
|
260
600
|
|
|
261
601
|
/* badges + pills */
|
|
262
602
|
.rk-badge{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;border-radius:var(--rk-r-full);
|
|
@@ -275,6 +615,11 @@ export const RESKIN_CSS = `
|
|
|
275
615
|
padding:28px;box-shadow:var(--rk-shadow-card)}
|
|
276
616
|
.rk-card-hover{transition:transform var(--rk-dur) var(--rk-ease),box-shadow var(--rk-dur) var(--rk-ease)}
|
|
277
617
|
.rk-card-hover:hover{transform:translateY(-2px);box-shadow:var(--rk-shadow-lg)}
|
|
618
|
+
/* subtle loading spinner injected over any <video> that is still buffering (see document.ts) */
|
|
619
|
+
.rk-vspin{position:absolute;top:50%;left:50%;width:24px;height:24px;margin:-12px 0 0 -12px;border-radius:50%;border:2.5px solid rgba(255,255,255,.28);border-top-color:rgba(255,255,255,.92);box-shadow:0 1px 5px rgba(0,0,0,.28);animation:rk-vspin-rot .72s linear infinite;pointer-events:none;opacity:0;transition:opacity .2s var(--rk-ease);z-index:4}
|
|
620
|
+
.rk-vspin.is-on{opacity:1}
|
|
621
|
+
@keyframes rk-vspin-rot{to{transform:rotate(360deg)}}
|
|
622
|
+
@media(prefers-reduced-motion:reduce){.rk-vspin{animation-duration:1.5s}}
|
|
278
623
|
.rk-card-pad-sm{padding:20px}
|
|
279
624
|
.rk-card h2{font-size:var(--rk-text-2xl);letter-spacing:-.02em}
|
|
280
625
|
.rk-card h3{font-size:var(--rk-text-lg);font-weight:700;font-family:var(--rk-font-display)}
|
|
@@ -315,10 +660,10 @@ export const RESKIN_CSS = `
|
|
|
315
660
|
|
|
316
661
|
/* two-column shell with sticky side rail (settings, etc.) */
|
|
317
662
|
.rk-shell{display:grid;grid-template-columns:248px minmax(0,1fr);gap:32px;align-items:start}
|
|
318
|
-
@media(max-width:
|
|
663
|
+
@media(max-width:900px){.rk-shell{grid-template-columns:1fr}}
|
|
319
664
|
.rk-side{position:sticky;top:88px;display:grid;gap:4px;background:#fff;border:1px solid var(--rk-border);
|
|
320
665
|
border-radius:var(--rk-r-2xl);padding:12px;box-shadow:var(--rk-shadow-card)}
|
|
321
|
-
@media(max-width:
|
|
666
|
+
@media(max-width:900px){.rk-side{position:static;grid-auto-flow:column;overflow:auto}}
|
|
322
667
|
.rk-side-item{display:flex;align-items:center;gap:10px;padding:11px 14px;border-radius:var(--rk-r-xl);
|
|
323
668
|
font-size:14px;font-weight:600;color:var(--rk-n-600);cursor:pointer;border:0;background:transparent;
|
|
324
669
|
box-sizing:border-box;text-decoration:none;
|
|
@@ -354,7 +699,7 @@ export const RESKIN_CSS = `
|
|
|
354
699
|
.rk-hero-art{position:absolute;inset:0;z-index:0;background:
|
|
355
700
|
radial-gradient(58% 46% at 78% 20%,rgba(255,241,204,.9),transparent 60%),
|
|
356
701
|
linear-gradient(180deg,#3f9fe0 0%,#6cc0f5 55%,#a9dbfb 100%)}
|
|
357
|
-
.rk-hero{position:relative;z-index:1;text-align:center;padding:119px var(--rk-gutter) 72px}
|
|
702
|
+
.rk-hero{position:relative;z-index:1;text-align:center;padding:clamp(56px,12vh,119px) var(--rk-gutter) clamp(44px,8vh,72px)}
|
|
358
703
|
|
|
359
704
|
:where(.rk-root a,.rk-root button,.rk-root input,.rk-root textarea,.rk-root select):focus-visible{outline:none;box-shadow:var(--rk-ring-gold)}
|
|
360
705
|
.rk-reveal[hidden]{display:none}
|
|
@@ -164,6 +164,10 @@ function resolveCostCenterSlug(input) {
|
|
|
164
164
|
|| explicitSlug === "video_download_lambda"
|
|
165
165
|
|| explicitSlug === "video_ingest_lambda"
|
|
166
166
|
|| explicitSlug === "rapidapi_remove_background"
|
|
167
|
+
// Local sharp chroma-key background removal + the 2-step media-overlay
|
|
168
|
+
// primitive (BYOK image gen + chroma key): platform compute/convenience.
|
|
169
|
+
|| explicitSlug === "greenscreen_chroma_key"
|
|
170
|
+
|| explicitSlug === "media_overlay"
|
|
167
171
|
|| explicitSlug === "primitive_media_lambda"
|
|
168
172
|
|| explicitSlug === "job_runner_lambda"
|
|
169
173
|
|| explicitSlug === "step_functions_standard"
|
|
@@ -107,6 +107,7 @@ export class ClipModelClient {
|
|
|
107
107
|
const cats = getTaxonomy(this.taxonomyVersion).categories;
|
|
108
108
|
const enumArray = (values) => z.array(z.enum(values)).default([]);
|
|
109
109
|
return z.object({
|
|
110
|
+
content_type: enumArray(cats.content_type),
|
|
110
111
|
subject: enumArray(cats.subject),
|
|
111
112
|
action: enumArray(cats.action),
|
|
112
113
|
emotion: enumArray(cats.emotion),
|
|
@@ -161,6 +162,7 @@ export class ClipModelClient {
|
|
|
161
162
|
console.warn(`[clips] tag failed (${this.provider}) @${input.scene.start_time_sec.toFixed(1)}s: ${message}`);
|
|
162
163
|
return {
|
|
163
164
|
tags: {
|
|
165
|
+
content_type: [],
|
|
164
166
|
subject: [],
|
|
165
167
|
action: [],
|
|
166
168
|
emotion: [],
|
|
@@ -238,6 +240,7 @@ export class ClipModelClient {
|
|
|
238
240
|
const cats = getTaxonomy(this.taxonomyVersion).categories;
|
|
239
241
|
const opt = (values) => z.array(z.enum(values)).optional();
|
|
240
242
|
const schema = z.object({
|
|
243
|
+
content_type: opt(cats.content_type),
|
|
241
244
|
subject: opt(cats.subject),
|
|
242
245
|
action: opt(cats.action),
|
|
243
246
|
emotion: opt(cats.emotion),
|
|
@@ -307,6 +310,7 @@ export function buildClipEmbeddingText(tags, description) {
|
|
|
307
310
|
if (tags.transcript)
|
|
308
311
|
parts.push(`Transcript: ${tags.transcript}`);
|
|
309
312
|
const tagBits = [
|
|
313
|
+
...(tags.content_type ?? []),
|
|
310
314
|
...tags.subject,
|
|
311
315
|
...tags.action,
|
|
312
316
|
...tags.emotion,
|
|
@@ -339,6 +343,7 @@ export function buildTaggingPrompt(transcript, version, hasAudio = false, guidan
|
|
|
339
343
|
taxonomyForPrompt(version),
|
|
340
344
|
"",
|
|
341
345
|
"Rules:",
|
|
346
|
+
"- `content_type` is the single most important tag: what KIND of shot is this? Pick the 1-2 best from talking_head (a person speaking to camera), b_roll (supporting/cutaway footage with no one addressing the camera), product_shot (a product is the focus), screen_recording (a screen/app/UI capture), demo (showing how something works), reaction (someone reacting), interview (two+ people in conversation), establishing (a wide scene-setting shot), lifestyle (ambient real-life moment), text_graphic (text card / motion graphic). Always set at least one when you can tell.",
|
|
342
347
|
"- Pick only tags you are confident about from the keyframes/audio. Omit a category (empty list) rather than guess.",
|
|
343
348
|
"- If there is no clear person/subject, use subject: [\"no_subject\"].",
|
|
344
349
|
"- If there is no speech, set audio_type appropriately (e.g. music/ambient/silence) and leave transcript empty.",
|