jamdesk 1.1.114 → 1.1.116

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.
@@ -53,6 +53,17 @@ describe('extractImageRefs', () => {
53
53
  ].join('\n'));
54
54
  expect(refs).toEqual([{ src: '/real.png', line: 7 }]);
55
55
  });
56
+ it('does NOT span across a JSX expression with two adjacent comments', () => {
57
+ // `{ /* a */ b /* c */ }` is a JSX expression that evaluates to `b` — it's
58
+ // NOT one giant comment. The regex must stop matching at the first `*/`,
59
+ // not greedily extend to the second one. If it overshoots, an image
60
+ // reference between the comments (or one captured *inside* `b`) would be
61
+ // silently stripped along with surrounding markup.
62
+ const refs = extractImageRefs('{ /* before */ <img src="/x.png" /> /* after */ }');
63
+ // The <img> sits between two JSX comments — neither comment encloses it,
64
+ // so it should be picked up as a real reference.
65
+ expect(refs).toEqual([{ src: '/x.png', line: 1 }]);
66
+ });
56
67
  it('ignores image syntax inside JSX/MDX comments with internal whitespace', () => {
57
68
  // Some MDX formatters and hand-written prose space out the braces, e.g.
58
69
  // `{ /* ... */ }` instead of `{/* ... */}`. All variants must silence
@@ -1 +1 @@
1
- {"version":3,"file":"validate-image-refs.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/validate-image-refs.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,kCAAkC,CAAC;AAE1C,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,IAAI,GAAG,gBAAgB,CAAC,qDAAqD,CAAC,CAAC;QACrF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,IAAI,GAAG,gBAAgB,CAAC,sCAAsC,CAAC,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG,gBAAgB,CAAC,8BAA8B,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,gBAAgB,CAAC,4BAA4B,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,gBAAgB,CAAC,8CAA8C,CAAC,CAAC;QAC9E,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,IAAI,GAAG,gBAAgB,CAAC,kCAAkC,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,IAAI,GAAG,gBAAgB,CAC3B,yDAAyD,CAC1D,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YACnB,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;YAC1B,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;YAC1B,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;SAC3B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,kEAAkE;QAClE,MAAM,IAAI,GAAG,gBAAgB,CAC3B,wDAAwD,CACzD,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,IAAI,GAAG,gBAAgB,CAC3B;YACE,+CAA+C;YAC/C,EAAE;YACF,KAAK;YACL,oCAAoC;YACpC,KAAK;YACL,EAAE;YACF,yBAAyB;SAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,wEAAwE;QACxE,sEAAsE;QACtE,wBAAwB;QACxB,MAAM,IAAI,GAAG,gBAAgB,CAC3B;YACE,4CAA4C;YAC5C,6CAA6C;YAC7C,+CAA+C;YAC/C,EAAE;YACF,yBAAyB;SAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,IAAI,GAAG,gBAAgB,CAC3B;YACE,4CAA4C;YAC5C,EAAE;YACF,MAAM;YACN,gCAAgC;YAChC,KAAK;YACL,EAAE;YACF,yBAAyB;SAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,uEAAuE;QACvE,MAAM,IAAI,GAAG,gBAAgB,CAC3B;YACE,OAAO;YACP,iBAAiB;YACjB,kCAAkC;YAClC,SAAS;YACT,QAAQ;YACR,EAAE;YACF,yBAAyB;SAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,IAAI,GAAG,gBAAgB,CAC3B;YACE,UAAU;YACV,EAAE;YACF,aAAa;YACb,0BAA0B;YAC1B,iCAAiC;YACjC,KAAK;YACL,EAAE;YACF,kBAAkB;YAClB,yBAAyB;SAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,UAAkB,CAAC;IAEvB,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,SAAS,KAAK,CAAC,OAAe,EAAE,OAAe;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC3C,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,KAAK,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAC9B,KAAK,CAAC,UAAU,EAAE,4CAA4C,CAAC,CAAC;QAEhE,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,KAAK,CAAC,UAAU,EAAE,4CAA4C,CAAC,CAAC;QAEhE,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAChC,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,CAAC;YACP,GAAG,EAAE,sBAAsB;SAC5B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,KAAK,CAAC,UAAU,EAAE;YAChB,yCAAyC;YACzC,wCAAwC;YACxC,mCAAmC;YACnC,kDAAkD;SACnD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEd,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,KAAK,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QAC7B,KAAK,CAAC,iBAAiB,EAAE,0BAA0B,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,KAAK,CAAC,iBAAiB,EAAE,6BAA6B,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,KAAK,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAC9B,KAAK,CAAC,UAAU,EAAE,0CAA0C,CAAC,CAAC;QAE9D,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,KAAK,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;QACrC,KAAK,CAAC,UAAU,EAAE,iCAAiC,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,KAAK,CACH,yBAAyB,EACzB,qIAAqI,CACtI,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAChC,IAAI,EAAE,yBAAyB;YAC/B,GAAG,EAAE,iDAAiD;SACvD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"validate-image-refs.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/validate-image-refs.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,kCAAkC,CAAC;AAE1C,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,IAAI,GAAG,gBAAgB,CAAC,qDAAqD,CAAC,CAAC;QACrF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,IAAI,GAAG,gBAAgB,CAAC,sCAAsC,CAAC,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG,gBAAgB,CAAC,8BAA8B,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,gBAAgB,CAAC,4BAA4B,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,gBAAgB,CAAC,8CAA8C,CAAC,CAAC;QAC9E,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,IAAI,GAAG,gBAAgB,CAAC,kCAAkC,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,IAAI,GAAG,gBAAgB,CAC3B,yDAAyD,CAC1D,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YACnB,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;YAC1B,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;YAC1B,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;SAC3B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,kEAAkE;QAClE,MAAM,IAAI,GAAG,gBAAgB,CAC3B,wDAAwD,CACzD,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,IAAI,GAAG,gBAAgB,CAC3B;YACE,+CAA+C;YAC/C,EAAE;YACF,KAAK;YACL,oCAAoC;YACpC,KAAK;YACL,EAAE;YACF,yBAAyB;SAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,2EAA2E;QAC3E,yEAAyE;QACzE,oEAAoE;QACpE,yEAAyE;QACzE,mDAAmD;QACnD,MAAM,IAAI,GAAG,gBAAgB,CAC3B,mDAAmD,CACpD,CAAC;QACF,yEAAyE;QACzE,iDAAiD;QACjD,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,wEAAwE;QACxE,sEAAsE;QACtE,wBAAwB;QACxB,MAAM,IAAI,GAAG,gBAAgB,CAC3B;YACE,4CAA4C;YAC5C,6CAA6C;YAC7C,+CAA+C;YAC/C,EAAE;YACF,yBAAyB;SAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,IAAI,GAAG,gBAAgB,CAC3B;YACE,4CAA4C;YAC5C,EAAE;YACF,MAAM;YACN,gCAAgC;YAChC,KAAK;YACL,EAAE;YACF,yBAAyB;SAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,uEAAuE;QACvE,MAAM,IAAI,GAAG,gBAAgB,CAC3B;YACE,OAAO;YACP,iBAAiB;YACjB,kCAAkC;YAClC,SAAS;YACT,QAAQ;YACR,EAAE;YACF,yBAAyB;SAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,IAAI,GAAG,gBAAgB,CAC3B;YACE,UAAU;YACV,EAAE;YACF,aAAa;YACb,0BAA0B;YAC1B,iCAAiC;YACjC,KAAK;YACL,EAAE;YACF,kBAAkB;YAClB,yBAAyB;SAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,UAAkB,CAAC;IAEvB,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,SAAS,KAAK,CAAC,OAAe,EAAE,OAAe;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC3C,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,KAAK,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAC9B,KAAK,CAAC,UAAU,EAAE,4CAA4C,CAAC,CAAC;QAEhE,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,KAAK,CAAC,UAAU,EAAE,4CAA4C,CAAC,CAAC;QAEhE,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAChC,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,CAAC;YACP,GAAG,EAAE,sBAAsB;SAC5B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,KAAK,CAAC,UAAU,EAAE;YAChB,yCAAyC;YACzC,wCAAwC;YACxC,mCAAmC;YACnC,kDAAkD;SACnD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEd,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,KAAK,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QAC7B,KAAK,CAAC,iBAAiB,EAAE,0BAA0B,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,KAAK,CAAC,iBAAiB,EAAE,6BAA6B,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,KAAK,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAC9B,KAAK,CAAC,UAAU,EAAE,0CAA0C,CAAC,CAAC;QAE9D,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,KAAK,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;QACrC,KAAK,CAAC,UAAU,EAAE,iCAAiC,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,KAAK,CACH,yBAAyB,EACzB,qIAAqI,CACtI,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAChC,IAAI,EAAE,yBAAyB;YAC/B,GAAG,EAAE,iDAAiD;SACvD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate-image-refs.d.ts","sourceRoot":"","sources":["../../src/lib/validate-image-refs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,MAAM,WAAW,eAAe;IAC9B,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;CACb;AAkED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CA4BjF;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,eAAe,EAAE,CAAC,CAmC5B"}
1
+ {"version":3,"file":"validate-image-refs.d.ts","sourceRoot":"","sources":["../../src/lib/validate-image-refs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,MAAM,WAAW,eAAe;IAC9B,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;CACb;AAsED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CA4BjF;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,eAAe,EAAE,CAAC,CAmC5B"}
@@ -63,8 +63,12 @@ function stripCodeRegions(content) {
63
63
  // JSX/MDX comments: tolerate internal whitespace between the braces and the
64
64
  // comment delimiters (e.g. `{ /* ... */ }`) — some MDX formatters and
65
65
  // hand-written prose use the spaced form, and we still want to silence
66
- // example image syntax inside them.
67
- out = out.replace(/\{\s*\/\*[\s\S]*?\*\/\s*\}/g, blank);
66
+ // example image syntax inside them. The body uses a tempered greedy
67
+ // `(?:(?!\*\/)[\s\S])*?` rather than `[\s\S]*?` so a JSX expression with
68
+ // two adjacent comments (`{ /* a */ b /* c */ }`) doesn't get matched as
69
+ // one giant span — the body must stop at the FIRST `*/`, then a `}` must
70
+ // follow (with optional whitespace) for the match to commit.
71
+ out = out.replace(/\{\s*\/\*(?:(?!\*\/)[\s\S])*?\*\/\s*\}/g, blank);
68
72
  // Fenced code blocks (allow leading indent on opener and closer, e.g.,
69
73
  // inside <Tab> wrappers that indent their children).
70
74
  out = out.replace(/(^|\n)[ \t]*(```|~~~)[^\n]*\n([\s\S]*?)\n[ \t]*\2(?=\n|$)/g, blank);
@@ -1 +1 @@
1
- {"version":3,"file":"validate-image-refs.js","sourceRoot":"","sources":["../../src/lib/validate-image-refs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate-image-refs.js","sourceRoot":"","sources":["../../src/lib/validate-image-refs.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jamdesk",
3
- "version": "1.1.114",
3
+ "version": "1.1.116",
4
4
  "description": "CLI for Jamdesk — build, preview, and deploy documentation sites from MDX. Dev server with hot reload, 50+ components, OpenAPI support, AI search, and Mintlify migration",
5
5
  "keywords": [
6
6
  "jamdesk",
@@ -171,6 +171,10 @@ export function Sidebar({ config, layout = 'header-logo', tabsPosition: tabsPosi
171
171
  const [expandedGroups, setExpandedGroups] = useState<Set<string>>(() => {
172
172
  const initialNav = resolveNavigation(config, pathname || '/');
173
173
  const rootPath = linkPrefix || '/';
174
+ // `pathname || rootPath` handles both the null-pathname mask (`?? ''`
175
+ // above) and the bare-root case in one expression — when pathname is the
176
+ // root (or empty), seedPath becomes rootPath, then the bare-root remap
177
+ // below replaces it with the first page's path.
174
178
  let seedPath = pathname || rootPath;
175
179
  if (seedPath === rootPath) {
176
180
  const firstPage = findFirstPageInGroups(initialNav.groups);
@@ -547,11 +547,23 @@ export type MintlifyLayout = 'sidenav' | 'topnav';
547
547
 
548
548
  /**
549
549
  * Background configuration
550
+ *
551
+ * `decoration: "none"` disables the theme's default decoration — on Jam this
552
+ * removes the light-mode radial gradient. `color` overrides the theme's
553
+ * `--color-bg-primary` in light and dark mode. `gradient` tunes the Jam
554
+ * gradient (color, size, position, opacity); ignored when `decoration` is
555
+ * anything other than `gradient`, or on themes without a default gradient.
550
556
  */
551
557
  export interface BackgroundConfig {
552
558
  image?: string | { light: string; dark: string };
553
- decoration?: 'gradient' | 'grid' | 'windows';
559
+ decoration?: 'gradient' | 'grid' | 'windows' | 'none';
554
560
  color?: ColorPair;
561
+ gradient?: {
562
+ color?: string;
563
+ size?: string;
564
+ position?: 'top center' | 'top left' | 'top right' | 'center';
565
+ opacity?: number;
566
+ };
555
567
  }
556
568
 
557
569
  /**
@@ -21,7 +21,7 @@ import {
21
21
  isPreloadedFont,
22
22
  getPrimaryFontFamily,
23
23
  } from '@/lib/fonts';
24
- import type { DocsConfig, FontConfig, LanguageCode } from '@/lib/docs-types';
24
+ import type { BackgroundConfig, DocsConfig, FontConfig, LanguageCode } from '@/lib/docs-types';
25
25
  import { LinkPrefixProvider } from '@/lib/link-prefix-context';
26
26
  import { ProjectSlugProvider } from '@/lib/project-slug-context';
27
27
  import { getAnalyticsScript } from '@/lib/analytics-script';
@@ -155,6 +155,114 @@ export function generatePrimaryColorVariables(
155
155
  }`;
156
156
  }
157
157
 
158
+ // Matches hex, rgb(), or hsl() — intentionally identical surface to the
159
+ // `colorRegex` inside generatePrimaryColorVariables (and broader than the
160
+ // schema's colorPairSchema, which is hex-only). Drift between these is
161
+ // intentional: docs.json validation rejects rgb/hsl in color.{light,dark},
162
+ // but at runtime we accept anything that looks valid to defend against
163
+ // hand-written configs that bypass the validator.
164
+ const BG_COLOR_REGEX =
165
+ /^(#[0-9a-f]{3}|#[0-9a-f]{6}|rgb\(\s*\d+\s*,\s*\d+\s*,\s*\d+\s*\)|hsl\(\s*\d+\s*,\s*\d+%\s*,\s*\d+%\s*\))$/i;
166
+ const BG_SIZE_REGEX = /^\d+(\.\d+)?(px|rem|em|vh|vw|%)$/;
167
+ const BG_POSITION_ALLOWED = new Set([
168
+ 'top center',
169
+ 'top left',
170
+ 'top right',
171
+ 'center',
172
+ ]);
173
+
174
+ /**
175
+ * Build a `<style>` body that overrides `--color-bg-primary` (light + dark)
176
+ * and exposes gradient knobs (`--jd-gradient-color/size/position/opacity`)
177
+ * to the Jam theme CSS. Returns `null` when nothing is configured or only
178
+ * invalid values were provided.
179
+ *
180
+ * `decoration: "none"` is NOT rendered here — it's wired through the body's
181
+ * `data-decoration` attribute so the gradient rules can opt out via :not().
182
+ */
183
+ export function generateBackgroundVariables(
184
+ background: BackgroundConfig | undefined,
185
+ ): string | null {
186
+ if (!background) return null;
187
+
188
+ // When the gradient is opted out via decoration: "none", suppress all
189
+ // gradient-related CSS vars so they don't leak into other rules. The
190
+ // body[data-decoration="none"] selector already gates the Jam gradient
191
+ // off, but emitting orphan `--jd-gradient-*` vars on :root would let any
192
+ // future descendant rule pick them up. Keep :root clean.
193
+ const gradientDisabled = background.decoration === 'none';
194
+
195
+ // typeof guards defend the .trim() calls against callers that bypass Ajv
196
+ // (dashboard live-preview, hand-written configs). Contract is silent-drop.
197
+ const validateString = (value: unknown, regex: RegExp): string | null => {
198
+ if (typeof value !== 'string') return null;
199
+ const trimmed = value.trim();
200
+ return regex.test(trimmed) ? trimmed : null;
201
+ };
202
+
203
+ const validLight = validateString(background.color?.light, BG_COLOR_REGEX);
204
+ const validDark = validateString(background.color?.dark, BG_COLOR_REGEX);
205
+
206
+ const g = gradientDisabled ? undefined : background.gradient;
207
+ const validGradientColor = validateString(g?.color, BG_COLOR_REGEX);
208
+ const validGradientSize = validateString(g?.size, BG_SIZE_REGEX);
209
+ const validGradientPosition =
210
+ g?.position && BG_POSITION_ALLOWED.has(g.position) ? g.position : null;
211
+ const validGradientOpacity =
212
+ typeof g?.opacity === 'number' && g.opacity >= 0 && g.opacity <= 1
213
+ ? g.opacity
214
+ : null;
215
+
216
+ const rootLines: string[] = [];
217
+ if (validLight) rootLines.push(` --color-bg-primary: ${validLight};`);
218
+ if (validGradientColor)
219
+ rootLines.push(` --jd-gradient-color: ${validGradientColor};`);
220
+ if (validGradientSize)
221
+ rootLines.push(` --jd-gradient-size: ${validGradientSize};`);
222
+ if (validGradientPosition)
223
+ rootLines.push(` --jd-gradient-position: ${validGradientPosition};`);
224
+ if (validGradientOpacity !== null) {
225
+ // Pre-compute the three stop percentages so the CSS sees integers/clean
226
+ // decimals instead of `calc(0.12 * 66.67%)` → `8.0004%`. Some Blink/WebKit
227
+ // versions clamp fractional percentages on color-mix inputs.
228
+ // Stops scale proportionally from the peak opacity.
229
+ const roundedPct = (multiplier: number) =>
230
+ Math.round(validGradientOpacity * multiplier * 100) / 100; // 2-decimal precision
231
+ rootLines.push(` --jd-gradient-opacity: ${validGradientOpacity};`);
232
+ // Also emit the pre-computed per-stop percentages so CSS doesn't need calc().
233
+ rootLines.push(` --jd-gradient-stop-peak: ${roundedPct(100)}%;`);
234
+ rootLines.push(` --jd-gradient-stop-mid: ${roundedPct(66.67)}%;`);
235
+ rootLines.push(` --jd-gradient-stop-far: ${roundedPct(33.33)}%;`);
236
+ }
237
+
238
+ const darkLines: string[] = [];
239
+ if (validDark) darkLines.push(` --color-bg-primary: ${validDark};`);
240
+
241
+ // Dev-only warning when both decoration:"none" and gradient:{...} are set —
242
+ // the gradient is silently ignored, which would confuse the customer.
243
+ if (
244
+ gradientDisabled &&
245
+ background.gradient &&
246
+ Object.keys(background.gradient).length > 0 &&
247
+ process.env.NODE_ENV === 'development'
248
+ ) {
249
+ console.warn(
250
+ '[bg-config] background.gradient is ignored because background.decoration is "none". Set decoration to "gradient" (or omit) to apply gradient tuning.',
251
+ );
252
+ }
253
+
254
+ if (rootLines.length === 0 && darkLines.length === 0) return null;
255
+
256
+ const blocks: string[] = [];
257
+ if (rootLines.length > 0) {
258
+ blocks.push(`:root {\n${rootLines.join('\n')}\n}`);
259
+ }
260
+ if (darkLines.length > 0) {
261
+ blocks.push(`.dark {\n${darkLines.join('\n')}\n}`);
262
+ }
263
+ return blocks.join('\n\n');
264
+ }
265
+
158
266
  export function getFontClassName(
159
267
  themeName: ThemeName | undefined,
160
268
  customFonts?: FontConfig,
@@ -284,6 +392,12 @@ export async function DocsChrome({
284
392
  config.colors?.light,
285
393
  config.colors?.dark,
286
394
  );
395
+ const backgroundVariables = generateBackgroundVariables(config.background);
396
+ // 'gradient' | 'grid' | 'windows' | 'none' | undefined. Only "none" currently
397
+ // alters rendering (gates off Jam's light-mode gradient + chrome transparency).
398
+ // The other values are stored on the body as data-decoration="<value>" so future
399
+ // CSS rules can target them, but no rule consumes them yet.
400
+ const decoration = config.background?.decoration;
287
401
 
288
402
  const appearanceDefault = config.appearance?.default || 'system';
289
403
  const appearanceStrict = config.appearance?.strict || false;
@@ -494,6 +608,14 @@ export async function DocsChrome({
494
608
  {primaryColorVariables}
495
609
  </style>
496
610
  )}
611
+ {backgroundVariables && (
612
+ <style
613
+ precedence="jd-layout"
614
+ href={`jd-bg-${resolvedProjectSlug}`}
615
+ >
616
+ {backgroundVariables}
617
+ </style>
618
+ )}
497
619
  {customCss && (
498
620
  <style
499
621
  precedence="jd-layout"
@@ -510,7 +632,7 @@ export async function DocsChrome({
510
632
  />
511
633
  )}
512
634
  </head>
513
- <body className={fontClassName} data-theme={themeName || 'jam'} suppressHydrationWarning>
635
+ <body className={fontClassName} data-theme={themeName || 'jam'} data-decoration={decoration || undefined} suppressHydrationWarning>
514
636
  {config.integrations?.gtm?.tagId && (
515
637
  <ConditionalGTM gtmId={config.integrations.gtm.tagId} />
516
638
  )}
@@ -347,8 +347,15 @@ function groupContainsPath(group: ResolvedGroup, path: string): boolean {
347
347
  // MAIN RESOLVER
348
348
  // =============================================================================
349
349
 
350
- // Cache resolved navigation per pathname to avoid re-resolving for Sidebar + Header
351
- const navigationCache = new Map<string, { navigation: ResolvedNavigation; timestamp: number }>();
350
+ // Cache resolved navigation per pathname to avoid re-resolving for Sidebar +
351
+ // Header within one render pass. The cache key includes `config.name`, but
352
+ // names are user-editable and collide across projects (we have customers
353
+ // sharing "Documentation", "Status", "Blog"). Without an identity tiebreaker,
354
+ // two same-named projects served by the same Vercel instance can read each
355
+ // other's resolved nav. We store the source config reference alongside the
356
+ // result and verify identity on read — across requests the references differ,
357
+ // so the cached entry is treated as a miss and recomputed.
358
+ const navigationCache = new Map<string, { config: DocsConfig; navigation: ResolvedNavigation; timestamp: number }>();
352
359
  const MAX_NAVIGATION_CACHE_SIZE = 500; // Max 500 project:pathname combinations
353
360
 
354
361
  /**
@@ -369,10 +376,11 @@ export function resolveNavigation(
369
376
  config: DocsConfig,
370
377
  pathname: string
371
378
  ): ResolvedNavigation {
372
- // Check cache first (include project name in key for multi-tenant correctness)
379
+ // Check cache first. The key includes project name for diagnostic clarity;
380
+ // the actual cross-tenant safety comes from the config-identity check below.
373
381
  const cacheKey = `${config.name || 'default'}:${pathname}`;
374
382
  const cached = navigationCache.get(cacheKey);
375
- if (cached) return cached.navigation;
383
+ if (cached && cached.config === config) return cached.navigation;
376
384
  let navigation = config.navigation;
377
385
 
378
386
  // Handle languages format (multi-language navigation)
@@ -508,7 +516,7 @@ export function resolveNavigation(
508
516
  }
509
517
 
510
518
  // Cache the result before returning
511
- navigationCache.set(cacheKey, { navigation: result, timestamp: Date.now() });
519
+ navigationCache.set(cacheKey, { config, navigation: result, timestamp: Date.now() });
512
520
  evictOldest(navigationCache, MAX_NAVIGATION_CACHE_SIZE);
513
521
  return result;
514
522
  }
@@ -272,17 +272,51 @@
272
272
  "enum": [
273
273
  "gradient",
274
274
  "grid",
275
- "windows"
275
+ "windows",
276
+ "none"
276
277
  ],
277
- "description": "Choose a background decoration style. Options: `gradient`, `grid`, or `windows`"
278
+ "description": "Background decoration style. Currently implemented: `gradient` (the default for Jam) and `none` (disables Jam's light-mode radial gradient). `grid` and `windows` are reserved for future Mintlify-compatible decorations and currently render as the theme default (no warning is emitted) — do not rely on them yet."
278
279
  },
279
280
  "color": {
280
281
  "$ref": "#/definitions/colorPairSchema",
281
- "description": "Customize background colors for light and dark themes"
282
+ "description": "Customize background colors for light and dark themes. Overrides the theme's default `--color-bg-primary`"
283
+ },
284
+ "gradient": {
285
+ "type": "object",
286
+ "properties": {
287
+ "color": {
288
+ "type": "string",
289
+ "pattern": "^(#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})|rgb\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*\\)|hsl\\(\\s*\\d+\\s*,\\s*\\d+%\\s*,\\s*\\d+%\\s*\\))$",
290
+ "description": "Gradient color (hex, rgb, or hsl). Defaults to the theme primary color"
291
+ },
292
+ "size": {
293
+ "type": "string",
294
+ "pattern": "^\\d+(\\.\\d+)?(px|rem|em|vh|vw|%)$",
295
+ "description": "Gradient radius (e.g. `500px`, `60vh`). Defaults to `500px`"
296
+ },
297
+ "position": {
298
+ "type": "string",
299
+ "enum": [
300
+ "top center",
301
+ "top left",
302
+ "top right",
303
+ "center"
304
+ ],
305
+ "description": "Gradient origin position. Defaults to `top center`"
306
+ },
307
+ "opacity": {
308
+ "type": "number",
309
+ "minimum": 0,
310
+ "maximum": 1,
311
+ "description": "Peak gradient opacity at the center (0–1). Defaults to 0.12"
312
+ }
313
+ },
314
+ "additionalProperties": false,
315
+ "description": "Customize the theme's background gradient. Currently applies only to the Jam theme (light mode). Ignored when `decoration` is `none`"
282
316
  }
283
317
  },
284
318
  "additionalProperties": false,
285
- "description": "Configure background images, colors, and decorative patterns"
319
+ "description": "Configure background images, colors, decorative patterns, and gradient parameters"
286
320
  },
287
321
  "navbar": {
288
322
  "type": "object",
@@ -169,19 +169,29 @@
169
169
 
170
170
  /* ===== JAM THEME BACKGROUND GRADIENT (LIGHT MODE ONLY) ===== */
171
171
  /*
172
- * Radial gradient radiates from top center and fades to transparent by 500px.
173
- * Uses a lighter version of the primary color from docs.json (--color-primary).
174
- * Only applied in light mode - no gradient in dark mode.
172
+ * Radial gradient radiates from --jd-gradient-position and fades to transparent
173
+ * by --jd-gradient-size. All knobs are tunable via docs.json `background.gradient`.
174
+ * Light mode only no gradient in dark mode.
175
175
  *
176
- * IMPORTANT: Scoped to data-theme="jam" so other themes don't inherit this.
176
+ * Scoped to data-theme="jam" so other themes don't inherit this. Gated on
177
+ * :not([data-decoration="none"]) so users can disable via
178
+ * `background.decoration: "none"`.
177
179
  *
178
- * Note: We override background-color from base.css and use background instead
179
- * to layer the gradient on top of the base color.
180
+ * Defaults (used when docs.json doesn't override):
181
+ * --jd-gradient-color : var(--color-primary, #2266C2)
182
+ * --jd-gradient-size : 500px
183
+ * --jd-gradient-position : top center
184
+ * --jd-gradient-opacity : 0.12
185
+ *
186
+ * Browser support: parametric customization requires color-mix() (Chrome 111+,
187
+ * Firefox 113+, Safari 16.2+). Older browsers fall back to the static rgba
188
+ * gradient block below — they see the original look but cannot customize it.
180
189
  */
181
- body[data-theme="jam"]:not(.dark) {
190
+ body[data-theme="jam"]:not(.dark):not([data-decoration="none"]) {
182
191
  /* Override solid background-color from base.css */
183
192
  background-color: transparent;
184
- /* Fallback for browsers that don't support color-mix */
193
+ /* Fallback gradient (static, for browsers without color-mix). Older browsers
194
+ keep the original Jam look even if they ignore docs.json customization. */
185
195
  background:
186
196
  radial-gradient(
187
197
  circle 500px at top center,
@@ -195,80 +205,81 @@ body[data-theme="jam"]:not(.dark) {
195
205
  background-attachment: fixed;
196
206
  }
197
207
 
198
- /* Modern browsers: use color-mix to dynamically use --color-primary from docs.json */
199
- @supports (color-mix(in srgb, red, transparent)) {
200
- body[data-theme="jam"]:not(.dark) {
208
+ /* Modern browsers: parametric gradient consuming the CSS vars.
209
+ Stop percentages come from --jd-gradient-stop-{peak,mid,far} when opacity
210
+ is overridden; otherwise they fall back to the literal default percentages.
211
+ Pre-computing in TS avoids fractional-percentage edge cases in older Blink
212
+ (e.g., `calc(0.12 * 66.67%)` → 8.0004% can be clamped). */
213
+ @supports (background: color-mix(in srgb, red, transparent)) {
214
+ body[data-theme="jam"]:not(.dark):not([data-decoration="none"]) {
201
215
  background:
202
216
  radial-gradient(
203
- circle 500px at top center,
204
- color-mix(in srgb, var(--color-primary, #2266C2) 12%, transparent) 0%,
205
- color-mix(in srgb, var(--color-primary, #2266C2) 8%, transparent) 30%,
206
- color-mix(in srgb, var(--color-primary, #2266C2) 4%, transparent) 60%,
217
+ circle var(--jd-gradient-size, 500px) at var(--jd-gradient-position, top center),
218
+ color-mix(in srgb, var(--jd-gradient-color, var(--color-primary, #2266C2)) var(--jd-gradient-stop-peak, 12%), transparent) 0%,
219
+ color-mix(in srgb, var(--jd-gradient-color, var(--color-primary, #2266C2)) var(--jd-gradient-stop-mid, 8%), transparent) 30%,
220
+ color-mix(in srgb, var(--jd-gradient-color, var(--color-primary, #2266C2)) var(--jd-gradient-stop-far, 4%), transparent) 60%,
207
221
  transparent 100%
208
222
  ),
209
223
  var(--color-bg-primary, #ffffff);
224
+ background-repeat: no-repeat;
225
+ background-attachment: fixed;
210
226
  }
211
227
  }
212
228
 
213
- /* Make main content area and wrappers transparent in light mode so gradient shows through */
214
- /* Override the bg-[var(--color-bg-primary)] Tailwind classes */
215
- body[data-theme="jam"]:not(.dark) main {
229
+ /* Make main content / wrappers / chrome transparent in light mode SO the gradient shows through.
230
+ Only applies when the gradient is active (gated on :not([data-decoration="none"])). */
231
+ body[data-theme="jam"]:not(.dark):not([data-decoration="none"]) main {
216
232
  background-color: transparent !important;
217
233
  }
218
234
 
219
- /* Target wrapper divs that contain the main content (exclude chat panel) */
220
- body[data-theme="jam"]:not(.dark) > div > div.flex:not([role="dialog"]):not(:has([data-chat-panel])) {
235
+ body[data-theme="jam"]:not(.dark):not([data-decoration="none"]) > div > div.flex:not([role="dialog"]):not(:has([data-chat-panel])) {
221
236
  background-color: transparent !important;
222
237
  }
223
238
 
224
- body[data-theme="jam"]:not(.dark) > div > div.flex > main {
239
+ body[data-theme="jam"]:not(.dark):not([data-decoration="none"]) > div > div.flex > main {
225
240
  background-color: transparent !important;
226
241
  }
227
242
 
228
- /* For sidebar-logo layout: target the content wrapper */
229
- body[data-theme="jam"]:not(.dark) div.flex-1.lg\:ml-\[300px\] {
243
+ body[data-theme="jam"]:not(.dark):not([data-decoration="none"]) div.flex-1.lg\:ml-\[300px\] {
230
244
  background-color: transparent !important;
231
245
  }
232
246
 
233
- /* Make header transparent in light mode so gradient shows through */
234
- /* Override the bg-[var(--color-bg-primary)]/80 Tailwind class */
235
- body[data-theme="jam"]:not(.dark) header {
247
+ body[data-theme="jam"]:not(.dark):not([data-decoration="none"]) header {
236
248
  background-color: transparent !important;
237
249
  background: transparent !important;
238
250
  }
239
251
 
240
- /* Make sidebar transparent in light mode so gradient shows through */
241
- /* Override the bg-[var(--color-bg-primary)] and bg-[var(--color-bg-sidebar)] Tailwind classes */
242
- /* Only on desktop - mobile needs solid background for overlay menu */
243
252
  @media (min-width: 1024px) {
244
- body[data-theme="jam"]:not(.dark) aside {
253
+ body[data-theme="jam"]:not(.dark):not([data-decoration="none"]) aside {
245
254
  background-color: transparent !important;
246
255
  background: transparent !important;
247
256
  }
248
257
  }
249
258
 
250
- /* ===== SCROLL-BASED GRADIENT AND HEADER CHANGES ===== */
251
- /* When user scrolls past 500px, hide gradient and make header solid */
259
+ /* ===== SOLID-BG MODE (decoration: "none") ===== */
260
+ /* Drop the gradient entirely; use --color-bg-primary as the flat body fill.
261
+ Chrome is left untouched — base.css already paints it with --color-bg-primary
262
+ because the transparent overrides above are gated off in this mode. */
263
+ body[data-theme="jam"]:not(.dark)[data-decoration="none"] {
264
+ background: var(--color-bg-primary, #ffffff);
265
+ }
252
266
 
253
- /* Smooth transition for gradient fade */
254
- body[data-theme="jam"]:not(.dark) {
267
+ /* ===== SCROLL-BASED GRADIENT AND HEADER CHANGES ===== */
268
+ body[data-theme="jam"]:not(.dark):not([data-decoration="none"]) {
255
269
  transition: background 0.3s ease-out;
256
270
  }
257
271
 
258
- /* When scrolled: hide gradient, show solid background */
259
- body[data-theme="jam"]:not(.dark).scrolled {
272
+ body[data-theme="jam"]:not(.dark):not([data-decoration="none"]).scrolled {
260
273
  background: var(--color-bg-primary, #ffffff) !important;
261
274
  }
262
275
 
263
- /* When scrolled: make header solid so content doesn't show through */
264
- body[data-theme="jam"]:not(.dark).scrolled header {
276
+ body[data-theme="jam"]:not(.dark):not([data-decoration="none"]).scrolled header {
265
277
  background-color: var(--color-bg-primary) !important;
266
278
  background: var(--color-bg-primary) !important;
267
279
  transition: background 0.3s ease-out;
268
280
  }
269
281
 
270
- /* Smooth transition for header background */
271
- body[data-theme="jam"]:not(.dark) header {
282
+ body[data-theme="jam"]:not(.dark):not([data-decoration="none"]) header {
272
283
  transition: background 0.3s ease-out;
273
284
  }
274
285