Skip to content

💡 Per-side border colors #69

@natemoo-re

Description

@natemoo-re

Is your feature request related to a problem?

A border applies one color to all four sides—there's no way to color sides independently. You can't draw a box with, say, a red top edge and a green bottom edge, or give one side its own background. The border op only takes scalar per-side widths plus a single shared color.

Describe the solution you'd like

Let each side accept a structured form { width, color? } (in addition to the scalar width), overriding the shared color for that edge:

open("box", {
  border: {
    color: rgba(255, 255, 255), // shared fallback
    top: { width: 1, color: rgba(255, 0, 0) }, // red top
    bottom: { width: 1, color: rgba(0, 255, 0) }, // green bottom
    left: 1,
    right: 1,
  },
});

The shared color stays the fallback for any side that doesn't override. Once #68 lands, the same design should apply for bg.

Describe alternatives you've considered

Nesting four separate single-edge bordered elements to recolor each side is possible but explodes the element count, doesn't share corners cleanly, and is fragile under resize. Per-side data belongs on the one border op.

Additional context

Failing test case on nm/repro/border-per-side (test · diff).

Today the border op carries one color plus a single packed width word; render_border (src/clayterm.c:300) draws every edge with that one color. Per-side color/bg needs the border type (ops.ts) to accept { width, color?, bg? } per side and additional words in the border wire format—ideally the same per-side encoding being added in the feat/border-style branch.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions