kylebrodeur commited on
Commit
6d716c9
Β·
verified Β·
1 Parent(s): b718ede

deploy: update Space from deploy_preflight --push

Browse files
Files changed (3) hide show
  1. .codeboarding/logs/wrapper-server.log +6 -0
  2. app.py +9 -6
  3. 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 on TOP, two buttons stacked BELOW
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"], scale=0)
653
- with gr.Accordion("GENERATE A PRIMITIVE", open=False):
 
 
 
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. */