@tekyzinc/gsd-t 2.73.20 → 2.73.21
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,13 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to GSD-T are documented here. Updated with each release.
|
|
4
4
|
|
|
5
|
+
## [2.73.21] - 2026-04-09
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- **Undo All / Cmd+Z now reverts display** — undo properly sends `gsdt-set-svg-attr` for SVG changes and skips fixture changes. Undo All individually reverts each change before resetting CSS, so the preview updates correctly.
|
|
9
|
+
- **Can re-enter original value** — changing a property back to its original value now removes the tracked change and reverts the style (previously rejected as "no change").
|
|
10
|
+
- **Gap propagation for bar charts** — setting `gap` on a flex/grid container propagates to all sibling containers with the same display type (e.g., all bar columns). Shows "→ N all columns" feedback.
|
|
11
|
+
|
|
5
12
|
## [2.73.20] - 2026-04-09
|
|
6
13
|
|
|
7
14
|
### Added
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tekyzinc/gsd-t",
|
|
3
|
-
"version": "2.73.
|
|
3
|
+
"version": "2.73.21",
|
|
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",
|
|
@@ -790,10 +790,27 @@
|
|
|
790
790
|
}
|
|
791
791
|
}
|
|
792
792
|
} else if (tag === "div" && parent) {
|
|
793
|
-
|
|
793
|
+
const elStyle = getComputedStyle(lockedEl);
|
|
794
794
|
const parentStyle = getComputedStyle(parent);
|
|
795
|
-
|
|
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;
|
|
804
|
+
const sibStyle = getComputedStyle(sib);
|
|
805
|
+
if (sibStyle.display === elDisplay) {
|
|
806
|
+
sib.style.setProperty(cssName, msg.value, "important");
|
|
807
|
+
propagatedCount++;
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
} else if ((parentStyle.display === "flex" || parentStyle.display === "inline-flex") &&
|
|
796
812
|
parent.classList.contains("overflow-hidden")) {
|
|
813
|
+
// For bar segments: propagate to sibling divs in the same flex container
|
|
797
814
|
for (const sib of parent.children) {
|
|
798
815
|
if (sib === lockedEl || sib.tagName !== "DIV") continue;
|
|
799
816
|
sib.style.setProperty(cssName, msg.value, "important");
|
|
@@ -809,6 +826,7 @@
|
|
|
809
826
|
const tag = lockedEl.tagName.toLowerCase();
|
|
810
827
|
const columnProps = new Set(["text-align", "width", "min-width", "max-width"]);
|
|
811
828
|
const rowProps = new Set(["height", "min-height", "max-height"]);
|
|
829
|
+
const layoutProps = new Set(["gap", "row-gap", "column-gap"]);
|
|
812
830
|
if ((tag === "td" || tag === "th") && columnProps.has(cssName)) {
|
|
813
831
|
const row = lockedEl.closest("tr");
|
|
814
832
|
const colIdx = row ? Array.from(row.children).indexOf(lockedEl) + 1 : 0;
|
|
@@ -817,6 +835,8 @@
|
|
|
817
835
|
propagateScope = "all rows";
|
|
818
836
|
} else if (tag === "tr") {
|
|
819
837
|
propagateScope = "all rows";
|
|
838
|
+
} else if (layoutProps.has(cssName)) {
|
|
839
|
+
propagateScope = "all columns";
|
|
820
840
|
} else {
|
|
821
841
|
propagateScope = "similar";
|
|
822
842
|
}
|
|
@@ -1879,17 +1879,35 @@
|
|
|
1879
1879
|
function commit() {
|
|
1880
1880
|
if (cancelled) return;
|
|
1881
1881
|
const newVal = inputEl.value.trim();
|
|
1882
|
-
if (newVal
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
value: newVal,
|
|
1888
|
-
propagate: true,
|
|
1889
|
-
}, "*");
|
|
1882
|
+
if (!newVal) {
|
|
1883
|
+
valEl.textContent = existing ? existing.newValue : currentVal;
|
|
1884
|
+
if (existing) valEl.classList.add("changed");
|
|
1885
|
+
return;
|
|
1886
|
+
}
|
|
1890
1887
|
|
|
1888
|
+
// Apply the style change to the iframe (always, even if reverting to original)
|
|
1889
|
+
previewIframe.contentWindow.postMessage({
|
|
1890
|
+
type: "gsdt-set-style",
|
|
1891
|
+
property: prop,
|
|
1892
|
+
value: newVal,
|
|
1893
|
+
propagate: true,
|
|
1894
|
+
}, "*");
|
|
1895
|
+
|
|
1896
|
+
const compId = filteredQueue[selectedIdx]?.id;
|
|
1897
|
+
if (newVal === currentVal) {
|
|
1898
|
+
// Reverting to original — remove tracked change
|
|
1899
|
+
if (compId && existing) {
|
|
1900
|
+
const list = changes.get(compId);
|
|
1901
|
+
const idx = list.findIndex(c => c.path === currentElementPath && c.property === prop);
|
|
1902
|
+
if (idx >= 0) list.splice(idx, 1);
|
|
1903
|
+
if (list.length === 0) changes.delete(compId);
|
|
1904
|
+
renderChanges(compId);
|
|
1905
|
+
renderComponentList();
|
|
1906
|
+
}
|
|
1907
|
+
valEl.textContent = currentVal;
|
|
1908
|
+
valEl.classList.remove("changed");
|
|
1909
|
+
} else {
|
|
1891
1910
|
// Track the change
|
|
1892
|
-
const compId = filteredQueue[selectedIdx]?.id;
|
|
1893
1911
|
if (compId) {
|
|
1894
1912
|
if (!changes.has(compId)) changes.set(compId, []);
|
|
1895
1913
|
const list = changes.get(compId);
|
|
@@ -1908,12 +1926,8 @@
|
|
|
1908
1926
|
renderChanges(compId);
|
|
1909
1927
|
renderComponentList();
|
|
1910
1928
|
}
|
|
1911
|
-
|
|
1912
1929
|
valEl.textContent = newVal;
|
|
1913
1930
|
valEl.classList.add("changed");
|
|
1914
|
-
} else {
|
|
1915
|
-
valEl.textContent = existing ? existing.newValue : currentVal;
|
|
1916
|
-
if (existing) valEl.classList.add("changed");
|
|
1917
1931
|
}
|
|
1918
1932
|
}
|
|
1919
1933
|
|
|
@@ -1941,14 +1955,22 @@
|
|
|
1941
1955
|
if (!list || index < 0 || index >= list.length) return;
|
|
1942
1956
|
const change = list[index];
|
|
1943
1957
|
|
|
1944
|
-
// Revert in iframe
|
|
1958
|
+
// Revert in iframe based on property type
|
|
1945
1959
|
if (previewIframe.contentWindow) {
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1960
|
+
if (change.property.startsWith("svg:")) {
|
|
1961
|
+
previewIframe.contentWindow.postMessage({
|
|
1962
|
+
type: "gsdt-set-svg-attr",
|
|
1963
|
+
attribute: change.property.slice(4),
|
|
1964
|
+
value: change.oldValue,
|
|
1965
|
+
}, "*");
|
|
1966
|
+
} else if (!change.property.startsWith("fixture:")) {
|
|
1967
|
+
previewIframe.contentWindow.postMessage({
|
|
1968
|
+
type: "gsdt-set-style",
|
|
1969
|
+
property: change.property,
|
|
1970
|
+
value: change.oldValue,
|
|
1971
|
+
propagate: true,
|
|
1972
|
+
}, "*");
|
|
1973
|
+
}
|
|
1952
1974
|
}
|
|
1953
1975
|
|
|
1954
1976
|
// Remove from change list
|
|
@@ -2189,14 +2211,32 @@
|
|
|
2189
2211
|
undoAllChanges.addEventListener("click", () => {
|
|
2190
2212
|
const compId = filteredQueue[selectedIdx]?.id;
|
|
2191
2213
|
if (compId) {
|
|
2214
|
+
// Revert each change individually (SVG attrs need setAttribute, not cssText reset)
|
|
2215
|
+
const list = changes.get(compId) || [];
|
|
2216
|
+
if (previewIframe.contentWindow) {
|
|
2217
|
+
for (const change of list) {
|
|
2218
|
+
if (change.property.startsWith("svg:")) {
|
|
2219
|
+
previewIframe.contentWindow.postMessage({
|
|
2220
|
+
type: "gsdt-set-svg-attr",
|
|
2221
|
+
attribute: change.property.slice(4),
|
|
2222
|
+
value: change.oldValue,
|
|
2223
|
+
}, "*");
|
|
2224
|
+
} else if (!change.property.startsWith("fixture:")) {
|
|
2225
|
+
previewIframe.contentWindow.postMessage({
|
|
2226
|
+
type: "gsdt-set-style",
|
|
2227
|
+
property: change.property,
|
|
2228
|
+
value: change.oldValue,
|
|
2229
|
+
propagate: true,
|
|
2230
|
+
}, "*");
|
|
2231
|
+
}
|
|
2232
|
+
}
|
|
2233
|
+
// Also reset inline CSS overrides
|
|
2234
|
+
previewIframe.contentWindow.postMessage({ type: "gsdt-reset-styles" }, "*");
|
|
2235
|
+
}
|
|
2192
2236
|
changes.delete(compId);
|
|
2193
2237
|
renderChanges(compId);
|
|
2194
2238
|
renderComponentList();
|
|
2195
2239
|
refreshPropHighlights(compId);
|
|
2196
|
-
// Reset iframe styles
|
|
2197
|
-
if (previewIframe.contentWindow) {
|
|
2198
|
-
previewIframe.contentWindow.postMessage({ type: "gsdt-reset-styles" }, "*");
|
|
2199
|
-
}
|
|
2200
2240
|
}
|
|
2201
2241
|
});
|
|
2202
2242
|
|