@tekyzinc/gsd-t 2.73.21 → 2.73.23

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/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  All notable changes to GSD-T are documented here. Updated with each release.
4
4
 
5
+ ## [2.73.23] - 2026-04-09
6
+
7
+ ### Fixed
8
+ - **Container props auto-redirect to parent** — setting `gap`, `borderRadius`, or `overflow` on a bar segment (child) now auto-targets the parent flex/grid container. Previously only worked when the container itself was selected.
9
+
10
+ ## [2.73.22] - 2026-04-09
11
+
12
+ ### Added
13
+ - **Stack-level border-radius** — setting `borderRadius` on a flex/grid bar column container auto-sets `overflow: hidden` (so rounded corners clip child segments) and propagates to all sibling columns. One change rounds all stacked bars.
14
+
5
15
  ## [2.73.21] - 2026-04-09
6
16
 
7
17
  ### Fixed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tekyzinc/gsd-t",
3
- "version": "2.73.21",
3
+ "version": "2.73.23",
4
4
  "description": "GSD-T: Contract-Driven Development for Claude Code — 56 slash commands with headless CI/CD mode, graph-powered code analysis, real-time agent dashboard, execution intelligence, task telemetry, doc-ripple enforcement, backlog management, impact analysis, test sync, milestone archival, and PRD generation",
5
5
  "author": "Tekyz, Inc.",
6
6
  "license": "MIT",
@@ -712,8 +712,22 @@
712
712
  const propagate = msg.propagate !== false; // default true
713
713
  let propagatedCount = 0;
714
714
 
715
- // Apply to primary element
716
- lockedEl.style.setProperty(cssName, msg.value, "important");
715
+ // Container-only props: if applied to a non-container child, redirect to parent
716
+ const containerOnlyProps = new Set(["gap", "row-gap", "column-gap", "border-radius"]);
717
+ let targetEl = lockedEl;
718
+ if (containerOnlyProps.has(cssName)) {
719
+ const elStyle = getComputedStyle(lockedEl);
720
+ const isContainer = elStyle.display === "flex" || elStyle.display === "inline-flex" || elStyle.display === "grid";
721
+ if (!isContainer && lockedEl.parentElement) {
722
+ const parentStyle = getComputedStyle(lockedEl.parentElement);
723
+ if (parentStyle.display === "flex" || parentStyle.display === "inline-flex" || parentStyle.display === "grid") {
724
+ targetEl = lockedEl.parentElement;
725
+ }
726
+ }
727
+ }
728
+
729
+ // Apply to target element (may be parent for container-only props)
730
+ targetEl.style.setProperty(cssName, msg.value, "important");
717
731
 
718
732
  // Typography props cascade to descendants
719
733
  const inheritProps = new Set(["font-size", "font-weight", "font-family", "line-height",
@@ -792,18 +806,28 @@
792
806
  } else if (tag === "div" && parent) {
793
807
  const elStyle = getComputedStyle(lockedEl);
794
808
  const parentStyle = getComputedStyle(parent);
795
- const layoutProps = new Set(["gap", "row-gap", "column-gap"]);
796
-
797
- if (layoutProps.has(cssName)) {
798
- // Layout props on a flex/grid container: find all sibling containers with same structure
799
- // (e.g., all bar columns in a chart — same parent, same display type)
800
- const elDisplay = elStyle.display;
801
- if (elDisplay === "flex" || elDisplay === "inline-flex" || elDisplay === "grid") {
802
- for (const sib of parent.children) {
803
- if (sib === lockedEl || sib.tagName !== "DIV") continue;
809
+
810
+ // Props that propagate across sibling containers (all bar columns)
811
+ const containerProps = new Set(["gap", "row-gap", "column-gap", "border-radius", "overflow"]);
812
+
813
+ if (containerProps.has(cssName)) {
814
+ // Use targetEl (may be parent if redirected) for container propagation
815
+ const containerEl = targetEl;
816
+ const containerParent = containerEl.parentElement;
817
+ const containerDisplay = getComputedStyle(containerEl).display;
818
+ if (containerParent && (containerDisplay === "flex" || containerDisplay === "inline-flex" || containerDisplay === "grid")) {
819
+ // Auto-set overflow:hidden when border-radius is applied to a container
820
+ if (cssName === "border-radius" && msg.value && msg.value !== "0px" && msg.value !== "0") {
821
+ containerEl.style.setProperty("overflow", "hidden", "important");
822
+ }
823
+ for (const sib of containerParent.children) {
824
+ if (sib === containerEl || sib.tagName !== "DIV") continue;
804
825
  const sibStyle = getComputedStyle(sib);
805
- if (sibStyle.display === elDisplay) {
826
+ if (sibStyle.display === containerDisplay) {
806
827
  sib.style.setProperty(cssName, msg.value, "important");
828
+ if (cssName === "border-radius" && msg.value && msg.value !== "0px" && msg.value !== "0") {
829
+ sib.style.setProperty("overflow", "hidden", "important");
830
+ }
807
831
  propagatedCount++;
808
832
  }
809
833
  }
@@ -826,7 +850,7 @@
826
850
  const tag = lockedEl.tagName.toLowerCase();
827
851
  const columnProps = new Set(["text-align", "width", "min-width", "max-width"]);
828
852
  const rowProps = new Set(["height", "min-height", "max-height"]);
829
- const layoutProps = new Set(["gap", "row-gap", "column-gap"]);
853
+ const containerPropsLabel = new Set(["gap", "row-gap", "column-gap", "border-radius", "overflow"]);
830
854
  if ((tag === "td" || tag === "th") && columnProps.has(cssName)) {
831
855
  const row = lockedEl.closest("tr");
832
856
  const colIdx = row ? Array.from(row.children).indexOf(lockedEl) + 1 : 0;
@@ -835,7 +859,7 @@
835
859
  propagateScope = "all rows";
836
860
  } else if (tag === "tr") {
837
861
  propagateScope = "all rows";
838
- } else if (layoutProps.has(cssName)) {
862
+ } else if (containerPropsLabel.has(cssName)) {
839
863
  propagateScope = "all columns";
840
864
  } else {
841
865
  propagateScope = "similar";