releasehx 0.1.1 → 0.2.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.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +366 -331
  3. data/build/docs/_config.yml +18 -1
  4. data/build/docs/_release_index.adoc +10 -0
  5. data/build/docs/config-reference.adoc +203 -16
  6. data/build/docs/config-reference.json +60 -10
  7. data/build/docs/index.adoc +316 -59
  8. data/build/docs/landing.adoc +11 -4
  9. data/build/docs/manpage.adoc +2 -2
  10. data/build/docs/release-procedure.adoc +365 -0
  11. data/build/docs/release-procedure.html +87 -0
  12. data/build/docs/releasehx.1 +17 -5
  13. data/build/docs/releases.adoc +28 -0
  14. data/build/docs/sample-config.adoc +2 -0
  15. data/build/docs/sample-config.yml +16 -9
  16. data/lib/releasehx/cli.rb +21 -9
  17. data/lib/releasehx/configuration.rb +0 -1
  18. data/lib/releasehx/generated.rb +1 -1
  19. data/lib/releasehx/mcp/assets/agent-config-guide.md +1 -1
  20. data/lib/releasehx/mcp/assets/config-def.yml +126 -8
  21. data/lib/releasehx/mcp/assets/config-reference.adoc +203 -16
  22. data/lib/releasehx/mcp/assets/config-reference.json +60 -10
  23. data/lib/releasehx/mcp/assets/sample-config.yml +16 -9
  24. data/lib/releasehx/mcp/server.rb +0 -1
  25. data/lib/releasehx/ops/enrich_ops.rb +161 -55
  26. data/lib/releasehx/ops/template_ops.rb +1 -1
  27. data/lib/releasehx/rhyml/adapter.rb +13 -9
  28. data/lib/releasehx/rhyml/mappings/github.yaml +3 -1
  29. data/lib/releasehx/rhyml/templates/bootstrap-overrides.css +15 -0
  30. data/lib/releasehx/rhyml/templates/changelog.adoc.liquid +2 -0
  31. data/lib/releasehx/rhyml/templates/changelog.html.liquid +6 -4
  32. data/lib/releasehx/rhyml/templates/changelog.md.liquid +1 -0
  33. data/lib/releasehx/rhyml/templates/embedded.css.liquid +263 -0
  34. data/lib/releasehx/rhyml/templates/entry.adoc.liquid +4 -7
  35. data/lib/releasehx/rhyml/templates/entry.html.liquid +21 -20
  36. data/lib/releasehx/rhyml/templates/entry.md.liquid +14 -21
  37. data/lib/releasehx/rhyml/templates/head-parser.liquid +6 -2
  38. data/lib/releasehx/rhyml/templates/header.liquid +13 -4
  39. data/lib/releasehx/rhyml/templates/history.html.liquid +152 -33
  40. data/lib/releasehx/rhyml/templates/metadata-entry.adoc.liquid +83 -49
  41. data/lib/releasehx/rhyml/templates/metadata-entry.html.liquid +60 -1
  42. data/lib/releasehx/rhyml/templates/metadata-entry.md.liquid +65 -113
  43. data/lib/releasehx/rhyml/templates/metadata-note.adoc.liquid +83 -49
  44. data/lib/releasehx/rhyml/templates/metadata-note.html.liquid +59 -22
  45. data/lib/releasehx/rhyml/templates/metadata-note.md.liquid +68 -23
  46. data/lib/releasehx/rhyml/templates/note.adoc.liquid +2 -40
  47. data/lib/releasehx/rhyml/templates/note.html.liquid +25 -19
  48. data/lib/releasehx/rhyml/templates/note.md.liquid +43 -29
  49. data/lib/releasehx/rhyml/templates/parts-listing.liquid +6 -6
  50. data/lib/releasehx/rhyml/templates/release-notes.adoc.liquid +2 -0
  51. data/lib/releasehx/rhyml/templates/release-notes.html.liquid +6 -4
  52. data/lib/releasehx/rhyml/templates/release-notes.md.liquid +1 -0
  53. data/lib/releasehx/rhyml/templates/release.adoc.liquid +2 -0
  54. data/lib/releasehx/rhyml/templates/release.md.liquid +8 -7
  55. data/lib/releasehx/rhyml/templates/rhyml-change.yaml.liquid +36 -35
  56. data/lib/releasehx/rhyml/templates/wrapper.html.liquid +103 -0
  57. data/lib/releasehx/sgyml/helpers.rb +0 -2
  58. data/lib/releasehx/transforms/adf_to_markdown.rb +1 -1
  59. data/lib/releasehx/version.rb +0 -2
  60. data/lib/releasehx.rb +2 -2
  61. data/specs/data/config-def.yml +126 -8
  62. metadata +50 -26
  63. data/build/docs/Gemfile.lock +0 -95
  64. data/build/docs/schemagraphy_readme.html +0 -0
  65. data/build/docs/sourcerer_readme.html +0 -46
  66. data/lib/schemagraphy/attribute_resolver.rb +0 -48
  67. data/lib/schemagraphy/cfgyml/definition.rb +0 -90
  68. data/lib/schemagraphy/cfgyml/doc_builder.rb +0 -52
  69. data/lib/schemagraphy/cfgyml/path_reference.rb +0 -24
  70. data/lib/schemagraphy/data_query/json_pointer.rb +0 -42
  71. data/lib/schemagraphy/loader.rb +0 -59
  72. data/lib/schemagraphy/regexp_utils.rb +0 -215
  73. data/lib/schemagraphy/safe_expression.rb +0 -189
  74. data/lib/schemagraphy/schema_utils.rb +0 -124
  75. data/lib/schemagraphy/tag_utils.rb +0 -32
  76. data/lib/schemagraphy/templating.rb +0 -104
  77. data/lib/schemagraphy.rb +0 -17
  78. data/lib/sourcerer/builder.rb +0 -120
  79. data/lib/sourcerer/jekyll/bootstrapper.rb +0 -78
  80. data/lib/sourcerer/jekyll/liquid/file_system.rb +0 -74
  81. data/lib/sourcerer/jekyll/liquid/filters.rb +0 -215
  82. data/lib/sourcerer/jekyll/liquid/tags.rb +0 -44
  83. data/lib/sourcerer/jekyll/monkeypatches.rb +0 -73
  84. data/lib/sourcerer/jekyll.rb +0 -26
  85. data/lib/sourcerer/plaintext_converter.rb +0 -75
  86. data/lib/sourcerer/templating.rb +0 -190
  87. data/lib/sourcerer.rb +0 -322
@@ -0,0 +1,263 @@
1
+ /* ReleaseHx Embedded CSS - {{ theme | capitalize }} Theme */
2
+
3
+ /* CSS Custom Properties - Theme: {{ theme }} */
4
+ :root {
5
+ {%- if theme == 'compact' %}
6
+ --release-spacing: 1.5rem;
7
+ --section-spacing: 1rem;
8
+ --item-spacing: 0.5rem;
9
+ --container-padding: 1rem;
10
+ --heading-margin: 0.75rem;
11
+ {%- elsif theme == 'detailed' %}
12
+ --release-spacing: 4rem;
13
+ --section-spacing: 3rem;
14
+ --item-spacing: 1.5rem;
15
+ --container-padding: 3rem;
16
+ --heading-margin: 2rem;
17
+ {%- else %}
18
+ --release-spacing: 3rem;
19
+ --section-spacing: 2.5rem;
20
+ --item-spacing: 1rem;
21
+ --container-padding: 2rem;
22
+ --heading-margin: 1.5rem;
23
+ {%- endif %}
24
+
25
+ /* Light Theme Colors */
26
+ --primary-color: #0d6efd;
27
+ --success-color: #198754;
28
+ --info-color: #0dcaf0;
29
+ --warning-color: #ffc107;
30
+ --danger-color: #dc3545;
31
+ --light-bg: #f8f9fa;
32
+ --white-bg: #ffffff;
33
+ --text-color: #212529;
34
+ --text-muted: #6c757d;
35
+ --border-color: #dee2e6;
36
+ --border-radius: 0.375rem;
37
+ --shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
38
+ --shadow-hover: 0 2px 8px rgba(0, 0, 0, 0.1);
39
+ }
40
+
41
+ /* Dark Theme Colors */
42
+ @media (prefers-color-scheme: dark) {
43
+ :root {
44
+ --primary-color: #6ea8fe;
45
+ --success-color: #75b798;
46
+ --info-color: #6edff6;
47
+ --warning-color: #ffda6a;
48
+ --danger-color: #ea868f;
49
+ --light-bg: #212529;
50
+ --white-bg: #2b3035;
51
+ --text-color: #ffffff;
52
+ --text-muted: #adb5bd;
53
+ --border-color: #495057;
54
+ --shadow: 0 1px 3px rgba(255, 255, 255, 0.1);
55
+ --shadow-hover: 0 2px 8px rgba(255, 255, 255, 0.15);
56
+ }
57
+ }
58
+
59
+ /* Manual Dark Theme Override */
60
+ .dark-theme {
61
+ --primary-color: #6ea8fe;
62
+ --success-color: #75b798;
63
+ --info-color: #6edff6;
64
+ --warning-color: #ffda6a;
65
+ --danger-color: #ea868f;
66
+ --light-bg: #212529;
67
+ --white-bg: #2b3035;
68
+ --text-color: #ffffff;
69
+ --text-muted: #adb5bd;
70
+ --border-color: #495057;
71
+ --shadow: 0 1px 3px rgba(255, 255, 255, 0.1);
72
+ --shadow-hover: 0 2px 8px rgba(255, 255, 255, 0.15);
73
+ }
74
+
75
+ /* Base Styles */
76
+ body {
77
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
78
+ line-height: 1.6;
79
+ color: var(--text-color);
80
+ background-color: var(--light-bg);
81
+ }
82
+
83
+ /* Container and Layout */
84
+ .release-history {
85
+ max-width: 1200px;
86
+ margin: 0 auto;
87
+ padding: var(--container-padding);
88
+ }
89
+
90
+ .release-section {
91
+ margin-bottom: var(--release-spacing);
92
+ padding: var(--container-padding);
93
+ background-color: var(--white-bg);
94
+ border-radius: var(--border-radius);
95
+ box-shadow: var(--shadow);
96
+ }
97
+
98
+ /* Section Styling */
99
+ .changelog-section, .notes-section {
100
+ margin-bottom: var(--section-spacing);
101
+ padding: var(--container-padding);
102
+ border-radius: var(--border-radius);
103
+ }
104
+
105
+ .changelog-section {
106
+ border-left: 4px solid var(--success-color);
107
+ background-color: rgba(25, 135, 84, 0.02);
108
+ }
109
+
110
+ .notes-section {
111
+ border-left: 4px solid var(--info-color);
112
+ background-color: rgba(13, 202, 240, 0.02);
113
+ }
114
+
115
+ /* Release Notes */
116
+ .release-note {
117
+ margin-bottom: var(--item-spacing);
118
+ transition: box-shadow 0.2s ease;
119
+ border: 1px solid var(--border-color);
120
+ border-radius: var(--border-radius);
121
+ }
122
+
123
+ .release-note:hover {
124
+ box-shadow: var(--shadow-hover);
125
+ border-color: var(--primary-color);
126
+ }
127
+
128
+ .card-header {
129
+ background-color: var(--light-bg);
130
+ border-bottom: 1px solid #dee2e6;
131
+ padding: 1rem 1.25rem;
132
+ }
133
+
134
+ .card-body {
135
+ padding: 1.25rem;
136
+ }
137
+
138
+ .card-footer {
139
+ background-color: var(--light-bg);
140
+ border-top: 1px solid #dee2e6;
141
+ padding: 0.75rem 1.25rem;
142
+ }
143
+
144
+ /* Changelog Entries */
145
+ .change-entry {
146
+ margin-bottom: var(--item-spacing);
147
+ padding: 0.75rem 1rem;
148
+ border: 1px solid var(--border-color);
149
+ border-radius: var(--border-radius);
150
+ transition: all 0.15s ease;
151
+ }
152
+
153
+ .change-entry:hover {
154
+ background-color: var(--light-bg);
155
+ border-color: var(--primary-color);
156
+ transform: translateX(4px);
157
+ }
158
+
159
+ /* Typography */
160
+ h1, h2, h3, h4, h5, h6 {
161
+ margin-bottom: var(--heading-margin);
162
+ line-height: 1.2;
163
+ }
164
+
165
+ {%- if theme == 'compact' %}
166
+ h1 { font-size: 1.75rem; }
167
+ h2 { font-size: 1.5rem; }
168
+ h3 { font-size: 1.25rem; }
169
+ {%- elsif theme == 'detailed' %}
170
+ h1 { font-size: 3rem; }
171
+ h2 { font-size: 2.5rem; }
172
+ h3 { font-size: 2rem; }
173
+ {%- endif %}
174
+
175
+ /* Badges and Labels */
176
+ .badge {
177
+ font-size: 0.75em;
178
+ padding: 0.35em 0.65em;
179
+ border-radius: 0.375rem;
180
+ font-weight: 600;
181
+ }
182
+
183
+ .badge-primary { background-color: var(--primary-color); color: white; }
184
+ .badge-success { background-color: var(--success-color); color: white; }
185
+ .badge-info { background-color: var(--info-color); color: white; }
186
+ .badge-warning { background-color: var(--warning-color); color: black; }
187
+ .badge-danger { background-color: var(--danger-color); color: white; }
188
+
189
+ /* Metadata Display */
190
+ .change-metadata {
191
+ display: flex;
192
+ flex-wrap: wrap;
193
+ gap: 0.5rem;
194
+ align-items: center;
195
+ }
196
+
197
+ .metadata-item {
198
+ display: inline-flex;
199
+ align-items: center;
200
+ gap: 0.25rem;
201
+ }
202
+
203
+ /* Links */
204
+ a {
205
+ color: var(--primary-color);
206
+ text-decoration: none;
207
+ }
208
+
209
+ a:hover {
210
+ text-decoration: underline;
211
+ }
212
+
213
+ /* Responsive Design */
214
+ @media (max-width: 768px) {
215
+ .release-history {
216
+ padding: 1rem;
217
+ }
218
+
219
+ .release-section {
220
+ padding: 1.5rem;
221
+ }
222
+
223
+ .change-entry {
224
+ padding: 0.5rem 0.75rem;
225
+ }
226
+
227
+ {%- if theme == 'detailed' %}
228
+ h1 { font-size: 2rem; }
229
+ h2 { font-size: 1.75rem; }
230
+ h3 { font-size: 1.5rem; }
231
+ {%- endif %}
232
+ }
233
+
234
+ /* Print Styles */
235
+ @media print {
236
+ body {
237
+ background: white;
238
+ color: black;
239
+ }
240
+
241
+ .release-section {
242
+ box-shadow: none;
243
+ border: 1px solid var(--border-color);
244
+ break-inside: avoid;
245
+ page-break-inside: avoid;
246
+ }
247
+
248
+ .release-note {
249
+ break-inside: avoid;
250
+ page-break-inside: avoid;
251
+ }
252
+
253
+ a {
254
+ color: black;
255
+ text-decoration: none;
256
+ }
257
+
258
+ a:after {
259
+ content: " (" attr(href) ")";
260
+ font-size: 0.8em;
261
+ color: #666;
262
+ }
263
+ }
@@ -1,4 +1,3 @@
1
- {%- embed metadata-entry.adoc.liquid -%}
2
1
  {%- assign frame = content_config.items.frame %}
3
2
  {%- assign summ = change.summ %}
4
3
  {%- case frame %}
@@ -16,11 +15,9 @@
16
15
  {%- if frame == "ordered" %}
17
16
  [start={{ item_count }}]
18
17
  {%- endif %}
18
+ [.change-entry]
19
19
  {{ bullet -}}
20
- {{ change.summ | trim }} +
21
- {%- if change_metadata != "" -%}
22
- {{ change_metadata | trim }}
23
- {%- endif %}
24
- {%- if change.note %}
25
- xref:note-{{ change.chid }}[icon:sticky-note[]NOTE]
20
+ {{ change.summ | trim }}
21
+ {%- if change.note %} +
22
+ xref:note-{{ change.chid }}[NOTE]
26
23
  {%- endif %}
@@ -1,4 +1,3 @@
1
- {%- embed metadata-entry.html.liquid -%}
2
1
  {%- assign frame = frame %}
3
2
  {%- case frame %}
4
3
  {%- when "unordered" %}
@@ -10,29 +9,31 @@
10
9
  {%- assign item_class = "list-group-item border-0 px-0" %}
11
10
  {%- assign bullet = "" %}
12
11
  {%- else %}
13
- {%- assign list_class = "list-unstyled" %}
14
- {%- assign item_class = "mb-2" %}
12
+ {%- assign list_class = "list-group" %}
13
+ {%- assign item_class = "list-group-item px-3 py-2" %}
15
14
  {%- assign bullet = "" %}
16
15
  {%- endcase %}
17
16
 
18
17
  <div class="change-entry {{ item_class }}" id="entry-{{ change.chid }}">
19
- <div class="d-flex align-items-start">
20
- <div class="flex-grow-1">
21
- <span class="change-summary">{{ bullet }}{{ change.summ | trim | pasterize }}</span>
22
- {%- if change_metadata != "" -%}
23
- <div class="change-metadata mt-1">
24
- {{ change_metadata | trim }}
25
- </div>
26
- {%- endif %}
27
- </div>
28
- {%- if change.note %}
29
- <div class="note-link">
30
- <a href="#note-{{ change.chid }}" class="text-decoration-none">
31
- <i class="fa fa-sticky-note-o"></i>
32
- <small>NOTE</small>
33
- </a>
34
- </div>
35
- {%- endif %}
18
+ <div class="d-flex align-items-start justify-content-between">
19
+ <div class="flex-grow-1">
20
+ <p class="change-summary mb-2">
21
+ <span class="text-body">{{ bullet }}{{ change.summ | trim | pasterize }}</span>
22
+ </p>
23
+ {%- if change_metadata != "" -%}
24
+ <div class="change-metadata">
25
+ {{ change_metadata | trim }}
26
+ </div>
27
+ {%- endif %}
28
+ </div>
29
+ {%- if change.note %}
30
+ <div class="note-link ms-3 ps-2 text-nowrap">
31
+ <a href="#note-{{ change.chid }}" class="badge bg-warning text-decoration-none" title="Has a release note">
32
+ <i class="fa fa-sticky-note-o"></i>
33
+ <small>NOTE</small>
34
+ </a>
36
35
  </div>
36
+ {%- endif %}
37
+ </div>
37
38
  </div>
38
39
 
@@ -1,25 +1,18 @@
1
+ <!-- .change-entry -->
1
2
  {%- embed metadata-entry.md.liquid -%}
2
- {%- assign frame = content_config.items.frame | default: "unordered" %}
3
- {%- assign summ = change.summ %}
3
+ {%- assign frame = content_config.items.frame | default: 'unordered' %}
4
4
  {%- case frame %}
5
- {%- when "unordered" %}
6
- {%- assign bullet = "- " %}
7
- {%- when "ordered" %}
8
- {%- assign bullet = "1. " %}
9
- {%- when "basic" %}
10
- {%- assign bullet = "- " %}
11
- {%- else %}
12
- {%- assign bullet = "" %}
5
+ {%- when 'unordered' %}
6
+ {%- assign bullet = '- ' %}
7
+ {%- when 'ordered' %}
8
+ {%- assign bullet = '1. ' %}
9
+ {%- when 'basic' %}
10
+ {%- assign bullet = '- ' %}
11
+ {%- else %}
12
+ {%- assign bullet = '' %}
13
13
  {%- endcase %}
14
14
 
15
- {%- if frame == "basic" %}
16
-
17
- {{ bullet }}{{ change.summ | trim }}{% if change_metadata != "" %} ({{ change_metadata | trim | replace: " | ", ", " }}){% endif %}{% if change.note and change.note != "" %} [NOTE](#note-{{ change.chid }}){% endif %}
18
- {%- elsif frame == "paragraph" %}
19
-
20
- {{ change.summ | trim }}{% if change_metadata != "" %} ({{ change_metadata | trim }}){% endif %}{% if change.note and change.note != "" %} [NOTE](#note-{{ change.chid }}){% endif %}
21
- {%- else %}
22
-
23
- {{ bullet }}{{ change.summ | trim }}{% if change_metadata != "" %} ({{ change_metadata | trim }}){% endif %}{% if change.note and change.note != "" %} [NOTE](#note-{{ change.chid }}){% endif %}
24
- {%- endif %}
25
-
15
+ {{ bullet -}}
16
+ {{- change.summ | trim }}
17
+ {%- if change_metadata != '' %} {{ change_metadata | trim }}{%- endif -%}
18
+ {%- if change.note and change.note != '' %} [📝](#note-{{ change.chid }}){%- endif -%}
@@ -13,6 +13,10 @@
13
13
  {%- assign tplt_extn = "html" %}
14
14
  {%- assign show_frontmatter = config.modes.html_frontmatter %}
15
15
  {%- assign format_frontmatter = config.history.html_frontmatter %}
16
+ {%- comment %} Force frontmatter off when HTML is wrapped (full HTML structure) {%- endcomment %}
17
+ {%- if config.modes.html_wrap == true %}
18
+ {%- assign show_frontmatter = false %}
19
+ {%- endif %}
16
20
  {%- endcase %}
17
21
  {%- assign header_level = config.history.htag | replace: "h", "" | plus: 0 %}
18
22
  {%- assign dflt_next_header_level = header_level | plus: 1 %}
@@ -27,8 +31,8 @@
27
31
 
28
32
  {%- assign group_kinds_list = "tag,type,part" | split: "," %}
29
33
 
30
- {%- if show_frontmatter %}
34
+ {%- if show_frontmatter -%}
31
35
  {{ format_frontmatter | render: vars -}}
32
- {%- endif %}
36
+ {%- endif -%}
33
37
 
34
38
  {%- include header.liquid format=format level=header_level text=history_header %}
@@ -2,7 +2,18 @@
2
2
  {%- assign level = include.level %}
3
3
  {%- assign format = include.format %}
4
4
  {%- if format == "html" %}
5
- <h{{ level }}>{{ text }}</h{{ level }}>
5
+ {%- case level %}
6
+ {%- when 1 %}
7
+ <h{{ level }} class="display-5 fw-bold mb-4">{{ text }}</h{{ level }}>
8
+ {%- when 2 %}
9
+ <h{{ level }} class="h2 fw-bold border-bottom pb-3 mb-3">{{ text }}</h{{ level }}>
10
+ {%- when 3 %}
11
+ <h{{ level }} class="h3 fw-bold text-primary mt-4 mb-2">{{ text }}</h{{ level }}>
12
+ {%- when 4 %}
13
+ <h{{ level }} class="h4 fw-semibold mt-3 mb-2">{{ text }}</h{{ level }}>
14
+ {%- else %}
15
+ <h{{ level }} class="fw-semibold mt-2 mb-2">{{ text }}</h{{ level }}>
16
+ {%- endcase %}
6
17
  {%- else %}
7
18
  {%- if format == "asciidoc" %}
8
19
  {%- assign header_char = "=" %}
@@ -12,6 +23,4 @@
12
23
  {%- capture header_chars %}
13
24
  {%- for i in (1..level) %}{{ header_char }}{% endfor %}
14
25
  {%- endcapture %}
15
- {{ header_chars }} {{ text }}
16
-
17
- {%- endif %}
26
+ {{ header_chars }} {{ text }}{%- endif %}
@@ -1,51 +1,170 @@
1
1
  {% raw %}
2
- {%- if config.modes.wrapped != false -%}
2
+ {%- if config.modes.html_wrap != false -%}
3
3
  <!DOCTYPE html>
4
4
  <html lang="en">
5
5
  <head>
6
- <meta charset="UTF-8">
7
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
8
- <title>{{ config.history.head | default: "Release History" }}</title>
9
- <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
10
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
11
- <style>
12
- .release-section { margin-bottom: 3rem; }
13
- .changelog-section, .notes-section { margin-bottom: 2.5rem; }
14
- .release-note { margin-bottom: 1.5rem; }
15
- .meta-icon { margin-right: 0.25rem; }
16
- .meta-label { margin-right: 0.5rem; }
17
- .change-entry { margin-bottom: 1rem; }
18
- .change-metadata { font-size: 0.9rem; color: #6c757d; }
19
- .note-link { margin-left: 0.5rem; }
20
- .git-link, .issue-link { margin-left: 0.25rem; }
21
- </style>
6
+ <meta charset="UTF-8">
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8
+ <meta name="description" content="Release history and changelog">
9
+ <title>{{ config.history.head | default: "Release History" }}</title>
10
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
11
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
12
+ <style>
13
+ :root {
14
+ --release-spacing: 3rem;
15
+ --section-spacing: 2.5rem;
16
+ --item-spacing: 1rem;
17
+ }
18
+
19
+ body {
20
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
21
+ background-color: #f8f9fa;
22
+ }
23
+
24
+ .release-history {
25
+ max-width: 1200px;
26
+ margin: 0 auto;
27
+ }
28
+
29
+ .release-section {
30
+ margin-bottom: var(--release-spacing);
31
+ padding: 2rem;
32
+ background-color: white;
33
+ border-radius: 0.375rem;
34
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
35
+ }
36
+
37
+ .changelog-section, .notes-section {
38
+ margin-bottom: var(--section-spacing);
39
+ }
40
+
41
+ .changelog-section {
42
+ border-left: 4px solid #198754;
43
+ }
44
+
45
+ .notes-section {
46
+ border-left: 4px solid #0dcaf0;
47
+ }
48
+
49
+ .release-note {
50
+ margin-bottom: var(--item-spacing);
51
+ transition: box-shadow 0.2s ease;
52
+ }
53
+
54
+ .release-note:hover {
55
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
56
+ }
57
+
58
+ .change-entry {
59
+ margin-bottom: var(--item-spacing);
60
+ padding: 0.75rem 0;
61
+ transition: background-color 0.15s ease;
62
+ }
63
+
64
+ .change-entry:hover {
65
+ background-color: #f8f9fa;
66
+ border-radius: 0.25rem;
67
+ padding: 0.75rem 0.5rem;
68
+ }
69
+
70
+ .change-summary {
71
+ color: #212529;
72
+ line-height: 1.5;
73
+ }
74
+
75
+ .change-metadata {
76
+ font-size: 0.875rem;
77
+ margin-top: 0.5rem;
78
+ display: flex;
79
+ flex-wrap: wrap;
80
+ gap: 0.5rem;
81
+ }
82
+
83
+ .meta-icon {
84
+ margin-right: 0.25rem;
85
+ opacity: 0.7;
86
+ }
87
+
88
+ .meta-label, .meta-link {
89
+ margin-right: 0.25rem;
90
+ display: inline-block;
91
+ }
92
+
93
+ .note-link {
94
+ margin-left: 0.5rem;
95
+ flex-shrink: 0;
96
+ }
97
+
98
+ .issue-link, .git-link, .docs-link, .user-link {
99
+ font-size: 0.8rem;
100
+ text-decoration: none;
101
+ padding: 0.25rem 0.5rem;
102
+ border-radius: 0.25rem;
103
+ white-space: nowrap;
104
+ }
105
+
106
+ /* Print styles */
107
+ @media print {
108
+ body {
109
+ background-color: white;
110
+ }
111
+
112
+ .release-section {
113
+ page-break-inside: avoid;
114
+ box-shadow: none;
115
+ border: 1px solid #dee2e6;
116
+ }
117
+
118
+ .release-note {
119
+ page-break-inside: avoid;
120
+ }
121
+
122
+ .change-entry:hover {
123
+ background-color: white;
124
+ }
125
+
126
+ a[href]:after {
127
+ content: " (" attr(href) ")";
128
+ font-size: 0.75rem;
129
+ color: #6c757d;
130
+ }
131
+ }
132
+ </style>
22
133
  </head>
23
- <body class="container py-4">
134
+ <body>
135
+ <div class="container-lg py-5">
24
136
  {%- endif -%}
25
137
 
26
138
  {%- if config.modes.html_frontmatter -%}
27
139
  {%- assign frontmatter = config.history.html_frontmatter | render: vars -%}
28
140
  {%- if frontmatter and frontmatter != "" -%}
29
- <!-- {{ frontmatter }} -->
141
+ <!-- {{ frontmatter }} -->
30
142
  {%- endif -%}
31
143
  {%- endif -%}
32
144
 
33
- <div class="release-history">
34
- <h1 class="mb-4">{{ config.history.head | render: vars | default: "Release History" }}</h1>
145
+ <article class="release-history">
146
+ <header class="mb-5">
147
+ <h1 class="display-4 fw-bold mb-2">{{ config.history.head | render: vars | default: "Release History" }}</h1>
148
+ <p class="lead text-muted">Complete history of releases, changes, and improvements</p>
149
+ </header>
35
150
 
36
- {%- for release in var.releases %}
37
- {%- assign config = var.config %}
38
- {%- assign release = var.release %}
39
- {%- assign changes = var.changes %}
40
- {%- assign sorted = var.sorted -%}
41
- {%- include release.html.liquid
42
- release=release
43
- config=config
44
- level=2 %}
45
- {%- endfor %}
46
- </div>
151
+ <main>
152
+ {%- for release in var.releases %}
153
+ {%- assign config = var.config %}
154
+ {%- assign release = var.release %}
155
+ {%- assign changes = var.changes %}
156
+ {%- assign sorted = var.sorted -%}
157
+ {%- include release.html.liquid
158
+ release=release
159
+ config=config
160
+ level=2 %}
161
+ {%- endfor %}
162
+ </main>
163
+ </article>
47
164
 
48
- {%- if config.modes.wrapped != false -%}
165
+ </div>
166
+
167
+ {%- if config.modes.html_wrap != false -%}
49
168
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
50
169
  </body>
51
170
  </html>