Spaces:
Runtime error
Runtime error
deploy: update Space from deploy_preflight --push
Browse files- .codeboarding/logs/wrapper-server.log +6 -0
- app.py +9 -6
- core/theme.py +45 -0
.codeboarding/logs/wrapper-server.log
CHANGED
|
@@ -285,3 +285,9 @@ INFO: 127.0.0.1:44498 - "GET /health HTTP/1.1" 200 OK
|
|
| 285 |
[stderr] 2026-06-14 06:32:23 INFO [watchfiles.main:308] 1 change detected
|
| 286 |
[stderr] 2026-06-14 06:32:23 WARNING [codeboarding_pro.analysis_controller:506] Skipping incremental update: full analysis artifacts not ready yet
|
| 287 |
[stderr] 2026-06-14 06:32:23 INFO [codeboarding_pro.analysis_controller:314] No cached analysis results; skipping health report
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 285 |
[stderr] 2026-06-14 06:32:23 INFO [watchfiles.main:308] 1 change detected
|
| 286 |
[stderr] 2026-06-14 06:32:23 WARNING [codeboarding_pro.analysis_controller:506] Skipping incremental update: full analysis artifacts not ready yet
|
| 287 |
[stderr] 2026-06-14 06:32:23 INFO [codeboarding_pro.analysis_controller:314] No cached analysis results; skipping health report
|
| 288 |
+
[stderr] 2026-06-14 06:33:50 INFO [watchfiles.main:308] 1 change detected
|
| 289 |
+
[stderr] 2026-06-14 06:33:51 WARNING [codeboarding_pro.analysis_controller:506] Skipping incremental update: full analysis artifacts not ready yet
|
| 290 |
+
[stderr] 2026-06-14 06:33:51 INFO [codeboarding_pro.analysis_controller:314] No cached analysis results; skipping health report
|
| 291 |
+
[stderr] 2026-06-14 06:34:08 INFO [watchfiles.main:308] 1 change detected
|
| 292 |
+
[stderr] 2026-06-14 06:34:09 WARNING [codeboarding_pro.analysis_controller:506] Skipping incremental update: full analysis artifacts not ready yet
|
| 293 |
+
[stderr] 2026-06-14 06:34:09 INFO [codeboarding_pro.analysis_controller:314] No cached analysis results; skipping health report
|
app.py
CHANGED
|
@@ -633,9 +633,9 @@ def build() -> gr.Blocks:
|
|
| 633 |
with gr.Group():
|
| 634 |
gr.HTML(rule("PART"))
|
| 635 |
part_status = gr.Markdown("", elem_classes=["ce-pad"])
|
| 636 |
-
with gr.Row():
|
| 637 |
# LEFT: 3D viewer with intro + job-log copy below it (moved from top)
|
| 638 |
-
with gr.Column(scale=3):
|
| 639 |
part_placeholder = gr.HTML(_viewer_placeholder())
|
| 640 |
model3d = gr.Model3D(value=None, label="", height=360, visible=False)
|
| 641 |
# intro + job log moved DOWN into the part area
|
|
@@ -644,13 +644,16 @@ def build() -> gr.Blocks:
|
|
| 644 |
"You give it the part, the material, and the room; it "
|
| 645 |
"infers what kind of part this is."))
|
| 646 |
studio_log = gr.HTML(studio_log_html())
|
| 647 |
-
# RIGHT: dropzone
|
| 648 |
-
with gr.Column(scale=1):
|
| 649 |
mesh_in = gr.File(file_types=[".stl", ".glb", ".obj"],
|
| 650 |
label="UPLOAD MESH", elem_classes=["ce-drop"])
|
| 651 |
benchy_btn = gr.Button("QUICK-LOAD BENCHY",
|
| 652 |
-
elem_classes=["ce-pillbtn", "ce-icon-anchor"
|
| 653 |
-
|
|
|
|
|
|
|
|
|
|
| 654 |
gen_kind = gr.Radio(["box", "cylinder", "cone", "sphere"], value="box",
|
| 655 |
show_label=False, elem_classes=["ce-pills"])
|
| 656 |
gen_size = gr.Number(value=30, label="SIZE (mm)", elem_classes=["ce-num"])
|
|
|
|
| 633 |
with gr.Group():
|
| 634 |
gr.HTML(rule("PART"))
|
| 635 |
part_status = gr.Markdown("", elem_classes=["ce-pad"])
|
| 636 |
+
with gr.Row(equal_height=False, elem_classes=["ce-part-row"]):
|
| 637 |
# LEFT: 3D viewer with intro + job-log copy below it (moved from top)
|
| 638 |
+
with gr.Column(scale=3, elem_classes=["ce-part-viewer-col"]):
|
| 639 |
part_placeholder = gr.HTML(_viewer_placeholder())
|
| 640 |
model3d = gr.Model3D(value=None, label="", height=360, visible=False)
|
| 641 |
# intro + job log moved DOWN into the part area
|
|
|
|
| 644 |
"You give it the part, the material, and the room; it "
|
| 645 |
"infers what kind of part this is."))
|
| 646 |
studio_log = gr.HTML(studio_log_html())
|
| 647 |
+
# RIGHT: dropzone TOP, then two matching-style mesh-source buttons
|
| 648 |
+
with gr.Column(scale=1, elem_classes=["ce-part-actions-col"]):
|
| 649 |
mesh_in = gr.File(file_types=[".stl", ".glb", ".obj"],
|
| 650 |
label="UPLOAD MESH", elem_classes=["ce-drop"])
|
| 651 |
benchy_btn = gr.Button("QUICK-LOAD BENCHY",
|
| 652 |
+
elem_classes=["ce-pillbtn", "ce-icon-anchor",
|
| 653 |
+
"ce-mesh-source"], scale=0)
|
| 654 |
+
# GENERATE A PRIMITIVE: styled to match QUICK-LOAD BENCHY (ce-mesh-source)
|
| 655 |
+
with gr.Accordion("GENERATE A PRIMITIVE", open=False,
|
| 656 |
+
elem_classes=["ce-mesh-source", "ce-accordion-pill"]):
|
| 657 |
gen_kind = gr.Radio(["box", "cylinder", "cone", "sphere"], value="box",
|
| 658 |
show_label=False, elem_classes=["ce-pills"])
|
| 659 |
gen_size = gr.Number(value=30, label="SIZE (mm)", elem_classes=["ce-num"])
|
core/theme.py
CHANGED
|
@@ -241,6 +241,51 @@ textarea:focus, input:focus {{ border-color:var(--ao-orange) !important; box-sha
|
|
| 241 |
max-width:55%; }}
|
| 242 |
.ce-envbar .ce-envbar-readout * {{ font-size:12px !important; }}
|
| 243 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 244 |
/* ββ OVERRIDE ENVIRONMENT POPUP ββ
|
| 245 |
Hidden by default; toggled via JS clicking the OVERRIDE button.
|
| 246 |
Modal-style overlay with the override fields inside. */
|
|
|
|
| 241 |
max-width:55%; }}
|
| 242 |
.ce-envbar .ce-envbar-readout * {{ font-size:12px !important; }}
|
| 243 |
|
| 244 |
+
/* ββ PART row: top-align the viewer (left) and the dropzone/buttons (right) ββ */
|
| 245 |
+
.ce-part-row {{ align-items:flex-start !important; gap:16px !important; }}
|
| 246 |
+
.ce-part-viewer-col, .ce-part-actions-col {{ align-self:flex-start !important; }}
|
| 247 |
+
|
| 248 |
+
/* Right column: dropzone on top, then matching-style mesh-source buttons.
|
| 249 |
+
gap gives breathing room between dropzone β button β button. */
|
| 250 |
+
.ce-part-actions-col {{ display:flex !important; flex-direction:column !important;
|
| 251 |
+
gap:12px !important; padding-top:0 !important; }}
|
| 252 |
+
|
| 253 |
+
/* Constrain dropzone height so it doesn't dominate; match the viewer's visual weight */
|
| 254 |
+
.ce-part-actions-col .ce-drop {{ min-height:140px !important; max-height:180px !important; }}
|
| 255 |
+
.ce-part-actions-col .ce-drop > * {{ min-height:140px !important; }}
|
| 256 |
+
|
| 257 |
+
/* QUICK-LOAD BENCHY + GENERATE A PRIMITIVE share the same "mesh source" pill look.
|
| 258 |
+
Both fill the column width, equal height, equal padding. */
|
| 259 |
+
.ce-mesh-source {{ width:100% !important; }}
|
| 260 |
+
.ce-mesh-source button, .ce-mesh-source > button {{
|
| 261 |
+
width:100% !important; justify-content:center !important;
|
| 262 |
+
padding:12px 16px !important; min-height:44px !important;
|
| 263 |
+
font-size:12px !important; letter-spacing:1px !important; }}
|
| 264 |
+
|
| 265 |
+
/* Accordion-as-pill: make the GENERATE A PRIMITIVE accordion header look
|
| 266 |
+
identical to QUICK-LOAD BENCHY when collapsed. */
|
| 267 |
+
.ce-accordion-pill {{ background:transparent !important; border:none !important;
|
| 268 |
+
padding:0 !important; }}
|
| 269 |
+
.ce-accordion-pill > button, .ce-accordion-pill > .label-wrap {{
|
| 270 |
+
border-radius:999px !important; border:1px solid var(--ao-orange) !important;
|
| 271 |
+
background:var(--ao-surface) !important; color:var(--ao-orange-soft) !important;
|
| 272 |
+
text-transform:uppercase !important; letter-spacing:.5px !important;
|
| 273 |
+
font-size:12px !important; font-weight:700 !important;
|
| 274 |
+
padding:12px 16px !important; min-height:44px !important;
|
| 275 |
+
cursor:pointer !important; display:flex !important;
|
| 276 |
+
align-items:center !important; justify-content:center !important;
|
| 277 |
+
width:100% !important; gap:8px !important; }}
|
| 278 |
+
.ce-accordion-pill > button:hover, .ce-accordion-pill > .label-wrap:hover {{
|
| 279 |
+
background:var(--ao-orange) !important; color:#131313 !important; }}
|
| 280 |
+
/* hide the accordion's expand arrow (we want pure pill look) */
|
| 281 |
+
.ce-accordion-pill .icon, .ce-accordion-pill svg {{ display:none !important; }}
|
| 282 |
+
/* inner content (radio + number + generate) gets a nicer recessed area when open */
|
| 283 |
+
.ce-accordion-pill > .wrap, .ce-accordion-pill .gap {{
|
| 284 |
+
padding:14px 12px !important; margin-top:8px !important;
|
| 285 |
+
background:var(--ao-surface) !important;
|
| 286 |
+
border:1px solid var(--ao-outline-dim) !important;
|
| 287 |
+
display:flex !important; flex-direction:column !important; gap:10px !important; }}
|
| 288 |
+
|
| 289 |
/* ββ OVERRIDE ENVIRONMENT POPUP ββ
|
| 290 |
Hidden by default; toggled via JS clicking the OVERRIDE button.
|
| 291 |
Modal-style overlay with the override fields inside. */
|