@anselmdk/feature-spec-md 0.8.2 → 0.9.0-rc.1

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.
Files changed (73) hide show
  1. package/README.md +48 -1
  2. package/SPEC_FORMAT.md +89 -11
  3. package/dist/cli.js +16 -8
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config.d.ts +5 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +97 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/featureSpecs.d.ts +2 -0
  10. package/dist/featureSpecs.d.ts.map +1 -1
  11. package/dist/featureSpecs.js +86 -1
  12. package/dist/featureSpecs.js.map +1 -1
  13. package/dist/githubActionDiffReport.d.ts +5 -0
  14. package/dist/githubActionDiffReport.d.ts.map +1 -1
  15. package/dist/githubActionDiffReport.js +154 -46
  16. package/dist/githubActionDiffReport.js.map +1 -1
  17. package/dist/githubActionFtp.d.ts.map +1 -1
  18. package/dist/githubActionFtp.js +14 -2
  19. package/dist/githubActionFtp.js.map +1 -1
  20. package/dist/githubActionOutput.d.ts.map +1 -1
  21. package/dist/githubActionOutput.js.map +1 -1
  22. package/dist/githubReportMetadata.js +14 -5
  23. package/dist/githubReportMetadata.js.map +1 -1
  24. package/dist/index.d.ts +6 -5
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +2 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/mockReports.d.ts.map +1 -1
  29. package/dist/mockReports.js +41 -8
  30. package/dist/mockReports.js.map +1 -1
  31. package/dist/mocks/current/tests/supportDesk.spec.d.ts.map +1 -1
  32. package/dist/mocks/current/tests/supportDesk.spec.js +15 -3
  33. package/dist/mocks/current/tests/supportDesk.spec.js.map +1 -1
  34. package/dist/mocks/previous/tests/supportDesk.spec.d.ts.map +1 -1
  35. package/dist/mocks/previous/tests/supportDesk.spec.js +14 -2
  36. package/dist/mocks/previous/tests/supportDesk.spec.js.map +1 -1
  37. package/dist/playwright.d.ts.map +1 -1
  38. package/dist/playwright.js +3 -1
  39. package/dist/playwright.js.map +1 -1
  40. package/dist/reportArtifacts.d.ts.map +1 -1
  41. package/dist/reportArtifacts.js.map +1 -1
  42. package/dist/reportHtml.d.ts.map +1 -1
  43. package/dist/reportHtml.js +75 -2
  44. package/dist/reportHtml.js.map +1 -1
  45. package/dist/reportTemplate.d.ts +4 -1
  46. package/dist/reportTemplate.d.ts.map +1 -1
  47. package/dist/reportTemplate.js +290 -53
  48. package/dist/reportTemplate.js.map +1 -1
  49. package/dist/reportTemplates/shared.d.ts.map +1 -1
  50. package/dist/reportTemplates/shared.js.map +1 -1
  51. package/dist/screenshots.d.ts.map +1 -1
  52. package/dist/screenshots.js +3 -1
  53. package/dist/screenshots.js.map +1 -1
  54. package/dist/specDocuments.d.ts +3 -1
  55. package/dist/specDocuments.d.ts.map +1 -1
  56. package/dist/specDocuments.js +12 -1
  57. package/dist/specDocuments.js.map +1 -1
  58. package/dist/types.d.ts +29 -0
  59. package/dist/types.d.ts.map +1 -1
  60. package/docs/evidence-policy.md +1 -0
  61. package/docs/report-development.md +9 -9
  62. package/docs/spec-driven-flow.md +1 -0
  63. package/package.json +1 -1
  64. package/src/mocks/current/specs/support-desk.design.md +1 -0
  65. package/src/mocks/current/specs/support-desk.model.md +1 -0
  66. package/src/mocks/current/specs/support-platform.stack.md +1 -0
  67. package/src/mocks/current/specs/ticket-inbox.feature.md +1 -0
  68. package/src/mocks/current/specs/ticket-reply.feature.md +1 -0
  69. package/src/mocks/current/tests/supportDesk.spec.ts +19 -3
  70. package/src/mocks/previous/specs/support-desk.model.md +1 -0
  71. package/src/mocks/previous/specs/ticket-inbox.feature.md +1 -0
  72. package/src/mocks/previous/specs/ticket-reply.feature.md +1 -0
  73. package/src/mocks/previous/tests/supportDesk.spec.ts +14 -2
@@ -1,7 +1,7 @@
1
1
  import { html } from "./html.js";
2
2
  import { githubReportMetadataFromEnv } from "./githubReportMetadata.js";
3
3
  import { insertReportMetadata, } from "./reportMetadata.js";
4
- import { indentTemplateBlock, reportPageDefaults } from "./reportTemplates/shared.js";
4
+ import { indentTemplateBlock, reportPageDefaults, } from "./reportTemplates/shared.js";
5
5
  export function renderHtmlPage({ title, body, styles = "", scripts = "", maxWidth, metadata = githubReportMetadataFromEnv(), }) {
6
6
  const defaults = reportPageDefaults(maxWidth, styles);
7
7
  const page = `<!doctype html>
@@ -10,21 +10,94 @@ export function renderHtmlPage({ title, body, styles = "", scripts = "", maxWidt
10
10
  <meta charset="utf-8">
11
11
  <meta name="viewport" content="width=device-width, initial-scale=1">
12
12
  <title>${html(title)}</title>
13
+ <script>(function(){var saved;try{saved=localStorage.getItem("feature-spec-md-theme");}catch(error){}var dark=window.matchMedia("(prefers-color-scheme: dark)").matches;document.documentElement.dataset.theme=saved|| (dark?"dark":"light");})();</script>
13
14
  <style>
15
+ :root {
16
+ color-scheme: light;
17
+ --bg: #ffffff;
18
+ --fg: #1f2328;
19
+ --surface: #ffffff;
20
+ --surface-muted: #f6f8fa;
21
+ --surface-hover: #eef2f6;
22
+ --border: #d0d7de;
23
+ --muted: #57606a;
24
+ --link: #0969da;
25
+ --success: #1a7f37;
26
+ --danger: #cf222e;
27
+ --warning: #9a6700;
28
+ --diff-added: #dafbe1;
29
+ --diff-removed: #ffebe9;
30
+ --overlay: rgba(0, 0, 0, .82);
31
+ }
32
+ :root[data-theme="dark"] {
33
+ color-scheme: dark;
34
+ --bg: #0d1117;
35
+ --fg: #e6edf3;
36
+ --surface: #161b22;
37
+ --surface-muted: #21262d;
38
+ --surface-hover: #30363d;
39
+ --border: #3d444d;
40
+ --muted: #9198a1;
41
+ --link: #58a6ff;
42
+ --success: #3fb950;
43
+ --danger: #f85149;
44
+ --warning: #d29922;
45
+ --diff-added: #12261e;
46
+ --diff-removed: #2d1517;
47
+ --overlay: rgba(0, 0, 0, .9);
48
+ }
49
+ * { box-sizing: border-box; }
14
50
  body {
15
51
  font-family: system-ui, sans-serif;
16
52
  max-width: ${defaults.maxWidth};
17
53
  margin: 0 auto;
18
54
  padding: 40px 24px;
19
- color: #1f2328;
55
+ color: var(--fg);
56
+ background: var(--bg);
20
57
  line-height: 1.5;
21
58
  }
59
+ .theme-toggle { position: fixed; z-index: 20; top: 12px; right: 12px; border: 1px solid var(--border); border-radius: 999px; background: var(--surface); color: var(--fg); cursor: pointer; font: inherit; font-size: 13px; font-weight: 600; padding: 7px 12px; }
60
+ .theme-toggle:hover { background: var(--surface-hover); }
61
+ .theme-toggle:focus-visible, [data-lightbox]:focus-visible, .lightbox-close:focus-visible { outline: 2px solid var(--link); outline-offset: 2px; }
62
+ [data-lightbox] { cursor: zoom-in; }
63
+ .image-lightbox { width: 100vw; height: 100vh; max-width: none; max-height: none; margin: 0; padding: 0; border: 0; background: transparent; overflow: hidden; }
64
+ .image-lightbox::backdrop { background: var(--overlay); }
65
+ .lightbox-close { position: fixed; z-index: 2; top: 14px; right: 14px; border: 1px solid rgba(255,255,255,.5); border-radius: 999px; background: rgba(0,0,0,.72); color: white; cursor: pointer; font: inherit; font-weight: 700; padding: 8px 13px; }
66
+ .lightbox-viewport { width: 100%; height: 100%; overflow: auto; padding: 56px 24px 24px; }
67
+ .lightbox-viewport img { display: block; width: auto; height: auto; max-width: none; max-height: none; margin: 0 auto; background: white; }
22
68
  ${indentTemplateBlock(defaults.styleText, 4)}
23
69
  </style>
24
70
  </head>
25
71
  <body>
72
+ <button class="theme-toggle" type="button" aria-label="Toggle dark mode">Dark mode</button>
26
73
  ${indentTemplateBlock(body, 2)}
27
74
  ${scripts ? indentTemplateBlock(scripts, 2) : ""}
75
+ <dialog class="image-lightbox" aria-label="Screenshot viewer">
76
+ <button class="lightbox-close" type="button">Close</button>
77
+ <div class="lightbox-viewport"><img alt=""></div>
78
+ </dialog>
79
+ <script>
80
+ (function(){
81
+ var root=document.documentElement;
82
+ var themeButton=document.querySelector(".theme-toggle");
83
+ function updateThemeButton(){themeButton.textContent=root.dataset.theme==="dark"?"Light mode":"Dark mode";}
84
+ themeButton.addEventListener("click",function(){
85
+ root.dataset.theme=root.dataset.theme==="dark"?"light":"dark";
86
+ try{localStorage.setItem("feature-spec-md-theme",root.dataset.theme);}catch(error){}
87
+ updateThemeButton();
88
+ document.dispatchEvent(new CustomEvent("feature-spec-theme-change",{detail:{theme:root.dataset.theme}}));
89
+ });
90
+ updateThemeButton();
91
+
92
+ var dialog=document.querySelector(".image-lightbox");
93
+ var viewer=dialog.querySelector("img");
94
+ function openImage(target){viewer.src=target.currentSrc||target.src;viewer.alt=target.alt||"Screenshot";dialog.showModal();dialog.querySelector(".lightbox-viewport").scrollTo(0,0);}
95
+ document.addEventListener("click",function(event){var target=event.target.closest("img[data-lightbox]");if(target){event.preventDefault();openImage(target);}});
96
+ document.addEventListener("keydown",function(event){var target=event.target;if((event.key==="Enter"||event.key===" ")&&target instanceof HTMLImageElement&&target.matches("[data-lightbox]")){event.preventDefault();openImage(target);}});
97
+ dialog.querySelector(".lightbox-close").addEventListener("click",function(){dialog.close();});
98
+ dialog.addEventListener("click",function(event){if(event.target===dialog)dialog.close();});
99
+ })();
100
+ </script>
28
101
  </body>
29
102
  </html>
30
103
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"reportHtml.js","sourceRoot":"","sources":["../src/reportHtml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EACL,oBAAoB,GAErB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAWtF,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,EACL,IAAI,EACJ,MAAM,GAAG,EAAE,EACX,OAAO,GAAG,EAAE,EACZ,QAAQ,EACR,QAAQ,GAAG,2BAA2B,EAAE,GACxB;IAChB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG;;;;;WAKJ,IAAI,CAAC,KAAK,CAAC;;;;mBAIH,QAAQ,CAAC,QAAQ;;;;;;EAMlC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;;;;EAI1C,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC;EAC5B,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;;;CAG/C,CAAC;IAEA,OAAO,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"reportHtml.js","sourceRoot":"","sources":["../src/reportHtml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EACL,oBAAoB,GAErB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AAWrC,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,EACL,IAAI,EACJ,MAAM,GAAG,EAAE,EACX,OAAO,GAAG,EAAE,EACZ,QAAQ,EACR,QAAQ,GAAG,2BAA2B,EAAE,GACxB;IAChB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG;;;;;WAKJ,IAAI,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAwCH,QAAQ,CAAC,QAAQ;;;;;;;;;;;;;;;;EAgBlC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;;;;;EAK1C,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC;EAC5B,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6B/C,CAAC;IAEA,OAAO,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { CoverageSummary, DesignSpec, FeatureSpec, ModelSpec, SpecScreenshot, StackSpec, ValidationIssue } from "./types.js";
1
+ import type { CoverageSummary, DesignSpec, FeatureSpec, ModelSpec, ReportLayer, SpecScreenshot, StackSpec, ValidationIssue } from "./types.js";
2
2
  export type ReportOptions = {
3
3
  coverage?: CoverageSummary;
4
4
  models?: ModelSpec[];
@@ -11,6 +11,9 @@ export type ReportOptions = {
11
11
  githubBaseUrl?: string;
12
12
  githubRef?: string;
13
13
  repositoryUrl?: string;
14
+ layers?: ReportLayer[];
15
+ layersDefaultOpen?: boolean;
16
+ documentsDefaultOpen?: boolean;
14
17
  };
15
18
  export declare function renderHtmlReport(specs: FeatureSpec[], options?: ReportOptions): string;
16
19
  //# sourceMappingURL=reportTemplate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reportTemplate.d.ts","sourceRoot":"","sources":["../src/reportTemplate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EAEV,WAAW,EAEX,SAAS,EACT,cAAc,EACd,SAAS,EAET,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAiCF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,OAAO,GAAE,aAAkB,UAcjF"}
1
+ {"version":3,"file":"reportTemplate.d.ts","sourceRoot":"","sources":["../src/reportTemplate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EAEV,WAAW,EAEX,SAAS,EACT,WAAW,EACX,cAAc,EACd,SAAS,EAET,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAwCF,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,GAAE,aAAkB,UAe5B"}