project-logbook 0.4.0 → 1.0.0
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/README.md +36 -1
- package/dist/commands/build.js +34 -76
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/init.js +1 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.js +7 -2
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/list.js +4 -16
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/log.d.ts +1 -3
- package/dist/commands/log.js +4 -3
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/new.js +1 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/preview.js +1 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/release.js +1 -0
- package/dist/commands/release.js.map +1 -0
- package/dist/commands/start.d.ts +1 -1
- package/dist/commands/start.js +53 -12
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.js +7 -18
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/steer.js +1 -0
- package/dist/commands/steer.js.map +1 -0
- package/dist/commands/upgrade.js +1 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -0
- package/dist/lib/about-content.js +1 -0
- package/dist/lib/about-content.js.map +1 -0
- package/dist/lib/adr-renderer.d.ts +12 -0
- package/dist/lib/adr-renderer.js +53 -0
- package/dist/lib/adr-renderer.js.map +1 -0
- package/dist/lib/build-helpers.js +8 -3
- package/dist/lib/build-helpers.js.map +1 -0
- package/dist/lib/build-steps.d.ts +20 -2
- package/dist/lib/build-steps.js +107 -13
- package/dist/lib/build-steps.js.map +1 -0
- package/dist/lib/config.d.ts +8 -0
- package/dist/lib/config.js +19 -1
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/entry-id.js +1 -0
- package/dist/lib/entry-id.js.map +1 -0
- package/dist/lib/entry-paths.js +1 -0
- package/dist/lib/entry-paths.js.map +1 -0
- package/dist/lib/git-helpers.d.ts +5 -16
- package/dist/lib/git-helpers.js +52 -78
- package/dist/lib/git-helpers.js.map +1 -0
- package/dist/lib/git-url-helpers.d.ts +16 -0
- package/dist/lib/git-url-helpers.js +76 -0
- package/dist/lib/git-url-helpers.js.map +1 -0
- package/dist/lib/hast-helpers.js +1 -0
- package/dist/lib/hast-helpers.js.map +1 -0
- package/dist/lib/html-attributes.js +1 -0
- package/dist/lib/html-attributes.js.map +1 -0
- package/dist/lib/html-escape.js +1 -0
- package/dist/lib/html-escape.js.map +1 -0
- package/dist/lib/image-helpers.js +20 -30
- package/dist/lib/image-helpers.js.map +1 -0
- package/dist/lib/jira-helpers.js +1 -0
- package/dist/lib/jira-helpers.js.map +1 -0
- package/dist/lib/lint-runner.js +1 -0
- package/dist/lib/lint-runner.js.map +1 -0
- package/dist/lib/lint-types.js +1 -0
- package/dist/lib/lint-types.js.map +1 -0
- package/dist/lib/lockfile.js +1 -0
- package/dist/lib/lockfile.js.map +1 -0
- package/dist/lib/logbook-client.js +1 -0
- package/dist/lib/logbook-client.js.map +1 -0
- package/dist/lib/markdown-processors.js +1 -0
- package/dist/lib/markdown-processors.js.map +1 -0
- package/dist/lib/migrations.js +1 -0
- package/dist/lib/migrations.js.map +1 -0
- package/dist/lib/package-version.js +1 -0
- package/dist/lib/package-version.js.map +1 -0
- package/dist/lib/rss.js +1 -0
- package/dist/lib/rss.js.map +1 -0
- package/dist/lib/session.js +47 -35
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/styles.js +1 -0
- package/dist/lib/styles.js.map +1 -0
- package/dist/lib/template-helpers.d.ts +6 -1
- package/dist/lib/template-helpers.js +64 -0
- package/dist/lib/template-helpers.js.map +1 -0
- package/dist/lib/template-types.d.ts +22 -2
- package/dist/lib/template-types.js +1 -0
- package/dist/lib/template-types.js.map +1 -0
- package/dist/lib/templates.d.ts +7 -2
- package/dist/lib/templates.js +54 -34
- package/dist/lib/templates.js.map +1 -0
- package/dist/lib/theme.js +1 -0
- package/dist/lib/theme.js.map +1 -0
- package/dist/lib/url-helpers.js +1 -0
- package/dist/lib/url-helpers.js.map +1 -0
- package/dist/linters/diff-to-narrative.d.ts +2 -1
- package/dist/linters/diff-to-narrative.js +3 -10
- package/dist/linters/diff-to-narrative.js.map +1 -0
- package/dist/linters/frontmatter.js +1 -0
- package/dist/linters/frontmatter.js.map +1 -0
- package/dist/linters/index.js +1 -0
- package/dist/linters/index.js.map +1 -0
- package/dist/linters/jira-prefix.js +1 -0
- package/dist/linters/jira-prefix.js.map +1 -0
- package/dist/linters/links.js +26 -4
- package/dist/linters/links.js.map +1 -0
- package/dist/linters/lockfile.js +1 -0
- package/dist/linters/lockfile.js.map +1 -0
- package/dist/linters/placeholders.js +6 -4
- package/dist/linters/placeholders.js.map +1 -0
- package/dist/linters/project-integrity.js +1 -0
- package/dist/linters/project-integrity.js.map +1 -0
- package/dist/linters/readability.js +2 -3
- package/dist/linters/readability.js.map +1 -0
- package/dist/linters/technical-log.js +1 -0
- package/dist/linters/technical-log.js.map +1 -0
- package/dist/linters/workspaces.js +1 -0
- package/dist/linters/workspaces.js.map +1 -0
- package/dist/templates/WELCOME.md +12 -0
- package/dist/templates/index.md +2 -1
- package/dist/templates/logbook-client.js +29 -0
- package/dist/templates/styles.css +205 -32
- package/dist/utils/date.js +1 -0
- package/dist/utils/date.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +9 -0
- package/dist/utils/frontmatter.js +16 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/fs.d.ts +10 -0
- package/dist/utils/fs.js +112 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/id.js +1 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/log-timeline.d.ts +2 -1
- package/dist/utils/log-timeline.js +1 -0
- package/dist/utils/log-timeline.js.map +1 -0
- package/dist/utils/slug.js +1 -0
- package/dist/utils/slug.js.map +1 -0
- package/dist/utils/string.js +1 -0
- package/dist/utils/string.js.map +1 -0
- package/dist/utils/timeline-helpers.d.ts +2 -2
- package/dist/utils/timeline-helpers.js +5 -2
- package/dist/utils/timeline-helpers.js.map +1 -0
- package/dist/utils/validation.d.ts +5 -0
- package/dist/utils/validation.js +21 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +10 -4
- package/src/templates/WELCOME.md +12 -0
- package/src/templates/index.md +2 -1
- package/src/templates/logbook-client.js +29 -0
- package/src/templates/styles.css +205 -32
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
export function groupTimelineItems(entries, commits, tags) {
|
|
1
|
+
export function groupTimelineItems(entries, commits, tags, adrs = []) {
|
|
2
2
|
const toMs = (item) => {
|
|
3
3
|
if (item.kind === 'entry')
|
|
4
4
|
return item.dateEnd ? new Date(item.dateEnd).getTime() : new Date(item.dateStart).getTime();
|
|
5
|
+
if (item.kind === 'adr')
|
|
6
|
+
return new Date(item.date).getTime();
|
|
5
7
|
return new Date(item.timestamp).getTime();
|
|
6
8
|
};
|
|
7
|
-
const all = [...entries, ...commits, ...tags];
|
|
9
|
+
const all = [...entries, ...commits, ...tags, ...adrs];
|
|
8
10
|
all.sort((a, b) => toMs(b) - toMs(a));
|
|
9
11
|
const groups = [];
|
|
10
12
|
for (const item of all) {
|
|
@@ -17,3 +19,4 @@ export function groupTimelineItems(entries, commits, tags) {
|
|
|
17
19
|
}
|
|
18
20
|
return groups;
|
|
19
21
|
}
|
|
22
|
+
//# sourceMappingURL=timeline-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline-helpers.js","sourceRoot":"","sources":["../../src/utils/timeline-helpers.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,kBAAkB,CAChC,OAAmD,EACnD,OAA6B,EAC7B,IAAuB,EACvB,OAA0B,EAAE;IAG5B,MAAM,IAAI,GAAG,CAAC,IAAa,EAAU,EAAE;QACrC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;YACvB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9F,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9D,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5C,CAAC,CAAC;IAEF,MAAM,GAAG,GAAc,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;IAClE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,IAAI,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if a logbook entry contains bracket-style template placeholders, TODOs, or fallback prompt text.
|
|
3
|
+
*/
|
|
4
|
+
export function hasUnfilledPlaceholders(entry) {
|
|
5
|
+
// Check frontmatter field values for bracket-style unfilled placeholders
|
|
6
|
+
const dataValues = Object.values(entry.data)
|
|
7
|
+
.filter((v) => typeof v === 'string')
|
|
8
|
+
.join('\n');
|
|
9
|
+
const frontmatterHasPlaceholders = dataValues.includes('[DATE_END]') ||
|
|
10
|
+
dataValues.includes('[DATE_START]') ||
|
|
11
|
+
dataValues.includes('[WRITE_SUMMARY_HERE]') ||
|
|
12
|
+
dataValues.includes('[PROMPTER]') ||
|
|
13
|
+
dataValues.includes('[HARNESS]') ||
|
|
14
|
+
dataValues.includes('[LLM]');
|
|
15
|
+
// Check body content for unfilled template hints (strip fenced and inline code blocks to avoid false positives)
|
|
16
|
+
const contentWithoutCode = entry.content.replace(/```[\s\S]*?```/g, '').replace(/`[^`]*`/g, '');
|
|
17
|
+
const bodyHasPlaceholders = contentWithoutCode.includes('TODO:') ||
|
|
18
|
+
entry.content.includes('Write a polished, highly readable "short story" of the change here.');
|
|
19
|
+
return frontmatterHasPlaceholders || bodyHasPlaceholders;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAgB;IACtD,yEAAyE;IACzE,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;SACzC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;SACjD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,0BAA0B,GAC9B,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QACjC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC;QACnC,UAAU,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC3C,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QACjC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;QAChC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE/B,gHAAgH;IAChH,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAChG,MAAM,mBAAmB,GACvB,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC;QACpC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,qEAAqE,CAAC,CAAC;IAEhG,OAAO,0BAA0B,IAAI,mBAAmB,CAAC;AAC3D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "project-logbook",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "A command-line tool for project logbooks.",
|
|
5
5
|
"workspaces": [
|
|
6
6
|
"demo-app"
|
|
@@ -24,9 +24,10 @@
|
|
|
24
24
|
"lint": "eslint src --ext .ts --fix",
|
|
25
25
|
"format": "prettier --write --list-different .",
|
|
26
26
|
"knip": "cross-env NO_CONSOLE=true knip || true",
|
|
27
|
-
"madge": "
|
|
27
|
+
"madge": "madge --circular --extensions ts --ts-config ./tsconfig.json src/index.ts",
|
|
28
|
+
"jscpd": "jscpd src",
|
|
28
29
|
"test": "vitest run",
|
|
29
|
-
"pre": "npm run format && npm run lint && npm run test && npm run build && npm run knip && npm run madge && npm run dev build && npm run dev lint",
|
|
30
|
+
"pre": "npm run format && npm run lint && npm audit && npm run test && npm run build && npm run knip && npm run madge && npm run jscpd && npm run dev build && npm run dev lint",
|
|
30
31
|
"next": "node scripts/create-ticket-from-backlog.js",
|
|
31
32
|
"link": "npm run build && npm link",
|
|
32
33
|
"open": "npm run dev build && node scripts/open-and-view-dist.js"
|
|
@@ -36,7 +37,7 @@
|
|
|
36
37
|
"cli",
|
|
37
38
|
"project"
|
|
38
39
|
],
|
|
39
|
-
"author": "",
|
|
40
|
+
"author": "falvhb",
|
|
40
41
|
"license": "MIT",
|
|
41
42
|
"devDependencies": {
|
|
42
43
|
"@types/fs-extra": "^11.0.4",
|
|
@@ -48,13 +49,18 @@
|
|
|
48
49
|
"@vitest/coverage-v8": "^3.1.4",
|
|
49
50
|
"cross-env": "^7.0.3",
|
|
50
51
|
"eslint": "^9.27.0",
|
|
52
|
+
"jscpd": "^4.2.4",
|
|
51
53
|
"knip": "^5.55.0",
|
|
54
|
+
"madge": "^8.0.0",
|
|
52
55
|
"prettier": "^3.5.3",
|
|
53
56
|
"rimraf": "^6.1.3",
|
|
54
57
|
"tsx": "^4.21.0",
|
|
55
58
|
"typescript": "^6.0.3",
|
|
56
59
|
"vitest": "^3.1.4"
|
|
57
60
|
},
|
|
61
|
+
"overrides": {
|
|
62
|
+
"typescript": "^6.0.3"
|
|
63
|
+
},
|
|
58
64
|
"dependencies": {
|
|
59
65
|
"chalk": "^5.6.2",
|
|
60
66
|
"commander": "^14.0.3",
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Welcome to the Project Logbook!
|
|
2
|
+
|
|
3
|
+
This website is a **Project Logbook** — a chronological timeline of this project's evolution, design decisions, and development history.
|
|
4
|
+
|
|
5
|
+
Unlike traditional static documentation, a logbook behaves like a **dev log** or **news feed** of the codebase. Each item in the timeline below represents a completed feature or bugfix, containing:
|
|
6
|
+
- **Original Specifications:** The initial requirements and user stories.
|
|
7
|
+
- **Technical Log:** Step-by-step notes and decisions made during development.
|
|
8
|
+
- **The Story:** An engaging narrative explaining the rationale, pivots, and solutions.
|
|
9
|
+
|
|
10
|
+
Click around to explore how this project was built step by step!
|
|
11
|
+
|
|
12
|
+
Wait, did we mention it has an [**RSS Feed**](rss.xml)? Yes, you can subscribe to stay updated on new logbook entries in real-time!
|
package/src/templates/index.md
CHANGED
|
@@ -31,4 +31,5 @@ TODO: Write a polished, highly readable ticket summary that reads like an engagi
|
|
|
31
31
|
- **Use bullet points:** TODO: Whenever listing multiple items (like friction points, test scenarios, or rewritten paths), use a bulleted list instead of a dense paragraph to make it scannable.
|
|
32
32
|
- **Use bold emphasis:** TODO: Bold key concepts, problems, and solutions to guide the reader's eye.
|
|
33
33
|
- **Format code:** TODO: Use inline backticks for files, plugins, HTML elements, and code snippets (e.g., `src/lib/build-helpers.ts`).
|
|
34
|
-
- **Keep paragraphs short:** TODO: Ensure no paragraph is longer than 3-4 sentences. Keep the pacing quick and engaging.
|
|
34
|
+
- **Keep paragraphs short:** TODO: Ensure no paragraph is longer than 3-4 sentences. Keep the pacing quick and engaging.
|
|
35
|
+
- **Do not state the obvious**: TODO: Passed tests, lints, pre-commit suites are mandatory and no ticket is released without this. This does not need to be mentioned
|
|
@@ -168,6 +168,32 @@
|
|
|
168
168
|
}
|
|
169
169
|
}
|
|
170
170
|
|
|
171
|
+
/* ── 4. Welcome banner functionality ────────────────────────────────────── */
|
|
172
|
+
function initWelcomeBanner() {
|
|
173
|
+
var banner = document.getElementById('welcome-banner');
|
|
174
|
+
if (!banner) return;
|
|
175
|
+
try {
|
|
176
|
+
if (localStorage.getItem('welcome-banner-dismissed') !== 'true') {
|
|
177
|
+
banner.style.display = 'block';
|
|
178
|
+
}
|
|
179
|
+
} catch (e) {
|
|
180
|
+
// In case localStorage is disabled/unavailable, default to showing
|
|
181
|
+
banner.style.display = 'block';
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
var closeBtn = document.getElementById('welcome-banner-close');
|
|
185
|
+
if (closeBtn) {
|
|
186
|
+
closeBtn.addEventListener('click', function () {
|
|
187
|
+
banner.style.display = 'none';
|
|
188
|
+
try {
|
|
189
|
+
localStorage.setItem('welcome-banner-dismissed', 'true');
|
|
190
|
+
} catch (e) {
|
|
191
|
+
/* localStorage unavailable */
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
171
197
|
/* ── Bootstrap ─────────────────────────────────────────────────────────── */
|
|
172
198
|
document.addEventListener('DOMContentLoaded', function () {
|
|
173
199
|
updateRelativeDates();
|
|
@@ -181,6 +207,9 @@
|
|
|
181
207
|
|
|
182
208
|
// Initialize tab functionality
|
|
183
209
|
initTabs();
|
|
210
|
+
|
|
211
|
+
// Initialize welcome banner if present
|
|
212
|
+
initWelcomeBanner();
|
|
184
213
|
});
|
|
185
214
|
|
|
186
215
|
// Expose showTab globally for onclick handlers
|
package/src/templates/styles.css
CHANGED
|
@@ -19,10 +19,16 @@ body {
|
|
|
19
19
|
header {
|
|
20
20
|
background: var(--card-bg);
|
|
21
21
|
border-bottom: 1px solid var(--border);
|
|
22
|
-
padding: 2rem
|
|
22
|
+
padding: 2rem 0 0 0;
|
|
23
23
|
text-align: center;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
.header-inner {
|
|
27
|
+
max-width: var(--max-width);
|
|
28
|
+
margin: 0 auto;
|
|
29
|
+
padding: 0 1.5rem;
|
|
30
|
+
}
|
|
31
|
+
|
|
26
32
|
header h1 {
|
|
27
33
|
margin: 0;
|
|
28
34
|
font-size: 2.25rem;
|
|
@@ -168,15 +174,15 @@ main {
|
|
|
168
174
|
display: inline-flex;
|
|
169
175
|
align-items: center;
|
|
170
176
|
font-size: 0.8125rem;
|
|
171
|
-
font-weight: 500;
|
|
172
177
|
color: var(--primary);
|
|
173
178
|
text-decoration: none;
|
|
174
|
-
transition:
|
|
175
|
-
color 0.2s,
|
|
176
|
-
background 0.2s;
|
|
177
179
|
background: var(--primary-soft);
|
|
178
180
|
padding: 0.5rem 1rem;
|
|
179
181
|
border-radius: 2rem;
|
|
182
|
+
font-weight: 500;
|
|
183
|
+
transition:
|
|
184
|
+
background 0.2s,
|
|
185
|
+
color 0.2s;
|
|
180
186
|
}
|
|
181
187
|
|
|
182
188
|
.back-link:hover {
|
|
@@ -184,23 +190,7 @@ main {
|
|
|
184
190
|
color: white;
|
|
185
191
|
}
|
|
186
192
|
|
|
187
|
-
/* Action
|
|
188
|
-
.action-bar {
|
|
189
|
-
display: flex;
|
|
190
|
-
align-items: center;
|
|
191
|
-
justify-content: space-between;
|
|
192
|
-
gap: 1rem;
|
|
193
|
-
margin-bottom: 3rem;
|
|
194
|
-
flex-wrap: wrap;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
.action-tabs-wrapper {
|
|
198
|
-
display: flex;
|
|
199
|
-
align-items: center;
|
|
200
|
-
gap: 1rem;
|
|
201
|
-
flex-wrap: wrap;
|
|
202
|
-
}
|
|
203
|
-
|
|
193
|
+
/* Jira Action Button */
|
|
204
194
|
.jira-link-btn {
|
|
205
195
|
display: inline-flex;
|
|
206
196
|
align-items: center;
|
|
@@ -221,6 +211,48 @@ main {
|
|
|
221
211
|
color: white;
|
|
222
212
|
}
|
|
223
213
|
|
|
214
|
+
/* Header Navigation - Back button, tabs, and Jira link */
|
|
215
|
+
.header-nav {
|
|
216
|
+
display: grid;
|
|
217
|
+
grid-template-columns: 1fr auto 1fr;
|
|
218
|
+
align-items: center;
|
|
219
|
+
margin-top: 2rem;
|
|
220
|
+
gap: 1rem;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.header-nav-left {
|
|
224
|
+
text-align: left;
|
|
225
|
+
display: flex;
|
|
226
|
+
align-items: center;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.header-nav-right {
|
|
230
|
+
text-align: right;
|
|
231
|
+
display: flex;
|
|
232
|
+
align-items: center;
|
|
233
|
+
justify-content: flex-end;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.header-nav--center {
|
|
237
|
+
display: flex;
|
|
238
|
+
justify-content: center;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
@media (max-width: 640px) {
|
|
242
|
+
.header-nav {
|
|
243
|
+
display: flex;
|
|
244
|
+
flex-direction: column;
|
|
245
|
+
align-items: center;
|
|
246
|
+
gap: 1rem;
|
|
247
|
+
padding-bottom: 1rem;
|
|
248
|
+
}
|
|
249
|
+
.header-nav-left,
|
|
250
|
+
.header-nav-right {
|
|
251
|
+
text-align: center;
|
|
252
|
+
justify-content: center;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
224
256
|
/* Jira link in build-meta - inline style */
|
|
225
257
|
.build-meta .jira-link-btn {
|
|
226
258
|
margin-left: 0.5rem;
|
|
@@ -261,21 +293,25 @@ article h1 {
|
|
|
261
293
|
|
|
262
294
|
.tabs {
|
|
263
295
|
display: flex;
|
|
264
|
-
gap:
|
|
265
|
-
background:
|
|
266
|
-
padding: 0
|
|
267
|
-
border-radius: 0
|
|
296
|
+
gap: 1.5rem;
|
|
297
|
+
background: none;
|
|
298
|
+
padding: 0;
|
|
299
|
+
border-radius: 0;
|
|
268
300
|
width: fit-content;
|
|
301
|
+
margin-bottom: -1px;
|
|
302
|
+
position: relative;
|
|
303
|
+
z-index: 2;
|
|
269
304
|
}
|
|
270
305
|
|
|
271
306
|
.tab {
|
|
272
|
-
padding: 0.
|
|
273
|
-
font-size: 0.
|
|
307
|
+
padding: 0.75rem 0.25rem;
|
|
308
|
+
font-size: 0.875rem;
|
|
274
309
|
font-weight: 600;
|
|
275
310
|
color: var(--text-muted);
|
|
276
311
|
cursor: pointer;
|
|
277
|
-
border-
|
|
278
|
-
transition: all 0.2s
|
|
312
|
+
border-bottom: 2px solid transparent;
|
|
313
|
+
transition: all 0.2s ease;
|
|
314
|
+
border-radius: 0;
|
|
279
315
|
}
|
|
280
316
|
|
|
281
317
|
.tab:hover {
|
|
@@ -284,8 +320,9 @@ article h1 {
|
|
|
284
320
|
|
|
285
321
|
.tab.active {
|
|
286
322
|
color: var(--primary);
|
|
287
|
-
|
|
288
|
-
|
|
323
|
+
border-bottom-color: var(--primary);
|
|
324
|
+
background: none;
|
|
325
|
+
box-shadow: none;
|
|
289
326
|
}
|
|
290
327
|
|
|
291
328
|
/* Pagination Links */
|
|
@@ -504,6 +541,11 @@ footer .build-time a:hover {
|
|
|
504
541
|
color: #374151;
|
|
505
542
|
}
|
|
506
543
|
|
|
544
|
+
.tag-superseded {
|
|
545
|
+
background: #f3f4f6;
|
|
546
|
+
color: #4b5563;
|
|
547
|
+
}
|
|
548
|
+
|
|
507
549
|
/* Timeline card tag styling */
|
|
508
550
|
.timeline-card .tags-wrapper {
|
|
509
551
|
margin-top: 0.5rem;
|
|
@@ -812,3 +854,134 @@ article img[src$='.svg'] {
|
|
|
812
854
|
font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, monospace;
|
|
813
855
|
font-size: 0.8125rem;
|
|
814
856
|
}
|
|
857
|
+
|
|
858
|
+
/* Welcome Banner */
|
|
859
|
+
.welcome-banner {
|
|
860
|
+
background: var(--bg-card, #ffffff);
|
|
861
|
+
border: 1px solid var(--border, #e2e8f0);
|
|
862
|
+
padding: 1.5rem;
|
|
863
|
+
border-radius: 0.5rem;
|
|
864
|
+
margin-top: 1.5rem;
|
|
865
|
+
margin-bottom: 2rem;
|
|
866
|
+
position: relative;
|
|
867
|
+
box-shadow:
|
|
868
|
+
0 1px 3px 0 rgba(0, 0, 0, 0.1),
|
|
869
|
+
0 1px 2px -1px rgba(0, 0, 0, 0.1);
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
.welcome-banner-content h1 {
|
|
873
|
+
font-size: 1.25rem;
|
|
874
|
+
margin-top: 0;
|
|
875
|
+
margin-bottom: 0.75rem;
|
|
876
|
+
color: var(--text-main, #1e293b);
|
|
877
|
+
display: flex;
|
|
878
|
+
align-items: center;
|
|
879
|
+
gap: 0.5rem;
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
.welcome-banner-content p {
|
|
883
|
+
margin: 0 0 0.75rem 0;
|
|
884
|
+
line-height: 1.5;
|
|
885
|
+
color: var(--text, #334155);
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
.welcome-banner-content ul {
|
|
889
|
+
margin: 0 0 1rem 0;
|
|
890
|
+
padding-left: 1.25rem;
|
|
891
|
+
color: var(--text, #334155);
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
.welcome-banner-content li {
|
|
895
|
+
margin-bottom: 0.5rem;
|
|
896
|
+
line-height: 1.4;
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
.welcome-banner-close {
|
|
900
|
+
position: absolute;
|
|
901
|
+
top: 1rem;
|
|
902
|
+
right: 1rem;
|
|
903
|
+
background: none;
|
|
904
|
+
border: none;
|
|
905
|
+
font-size: 1.25rem;
|
|
906
|
+
cursor: pointer;
|
|
907
|
+
color: var(--text-muted, #64748b);
|
|
908
|
+
line-height: 1;
|
|
909
|
+
padding: 0.25rem;
|
|
910
|
+
border-radius: 0.25rem;
|
|
911
|
+
display: flex;
|
|
912
|
+
align-items: center;
|
|
913
|
+
justify-content: center;
|
|
914
|
+
transition:
|
|
915
|
+
background-color 0.2s,
|
|
916
|
+
color 0.2s;
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
.welcome-banner-close:hover {
|
|
920
|
+
background-color: var(--primary-soft, #f0fdf4);
|
|
921
|
+
color: var(--text-main, #1e293b);
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
/* ADR Details and Cards */
|
|
925
|
+
.adr-detail-card {
|
|
926
|
+
max-width: var(--max-width);
|
|
927
|
+
margin: 0 auto;
|
|
928
|
+
background: var(--card-bg);
|
|
929
|
+
padding: 2rem;
|
|
930
|
+
border-radius: 0.5rem;
|
|
931
|
+
border: 1px solid var(--border);
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
.adr-detail-meta {
|
|
935
|
+
margin-bottom: 1.5rem;
|
|
936
|
+
font-size: 0.85rem;
|
|
937
|
+
color: var(--text-muted);
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
.adr-status-badge {
|
|
941
|
+
margin-right: 0.5rem;
|
|
942
|
+
text-transform: uppercase;
|
|
943
|
+
font-size: 0.7rem;
|
|
944
|
+
padding: 0.15rem 0.4rem;
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
.adr-detail-title {
|
|
948
|
+
font-size: 2rem;
|
|
949
|
+
margin-top: 0;
|
|
950
|
+
margin-bottom: 1.5rem;
|
|
951
|
+
letter-spacing: -0.025em;
|
|
952
|
+
font-weight: 800;
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
.adr-detail-body {
|
|
956
|
+
margin-top: 2rem;
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
.adr-detail-tags {
|
|
960
|
+
margin-top: 2rem;
|
|
961
|
+
border-top: 1px solid var(--border);
|
|
962
|
+
padding-top: 1.5rem;
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
.adr-indicator-badge {
|
|
966
|
+
background: #e0f2fe !important;
|
|
967
|
+
color: #0369a1 !important;
|
|
968
|
+
font-weight: bold;
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
.timeline-card--adr {
|
|
972
|
+
background: color-mix(in srgb, var(--primary) 4%, var(--card-bg, #ffffff)) !important;
|
|
973
|
+
border: 1px solid color-mix(in srgb, var(--primary) 12%, var(--border, #e5e7eb)) !important;
|
|
974
|
+
border-radius: 0.5rem;
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
.timeline-card--adr .item-summary {
|
|
978
|
+
font-style: italic;
|
|
979
|
+
border-left: 2px solid var(--primary);
|
|
980
|
+
padding-left: 0.75rem;
|
|
981
|
+
margin-top: 0.5rem;
|
|
982
|
+
color: var(--text-muted);
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
.timeline-card--adr .tags-wrapper {
|
|
986
|
+
margin-top: 0.5rem;
|
|
987
|
+
}
|