mint 0.8.1 → 0.10.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 (83) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -26
  3. data/README.md +117 -37
  4. data/bin/mint +2 -81
  5. data/config/templates/base/navigation.css +136 -0
  6. data/config/templates/base/print.css +152 -0
  7. data/config/templates/{reset.css → base/reset.css} +1 -1
  8. data/config/templates/base/style.css +117 -137
  9. data/config/templates/base/utilities.css +136 -0
  10. data/config/templates/base/variables.css +124 -0
  11. data/config/templates/basic/style.css +151 -0
  12. data/config/templates/default/layout.erb +33 -3
  13. data/config/templates/default/style.css +95 -164
  14. data/config/templates/magazine/style.css +383 -0
  15. data/config/templates/nord/style.css +105 -220
  16. data/config/templates/nord-dark/style.css +82 -263
  17. data/lib/mint/commandline/parse.rb +144 -0
  18. data/lib/mint/commandline/publish.rb +46 -0
  19. data/lib/mint/commandline/run.rb +30 -0
  20. data/lib/mint/config.rb +162 -0
  21. data/lib/mint/{css.rb → css_dsl.rb} +9 -9
  22. data/lib/mint/css_parser.rb +45 -25
  23. data/lib/mint/document.rb +250 -365
  24. data/lib/mint/document_tree.rb +163 -0
  25. data/lib/mint/exceptions.rb +2 -3
  26. data/lib/mint/helpers.rb +23 -180
  27. data/lib/mint/layout.rb +26 -9
  28. data/lib/mint/renderers/css_renderer.rb +32 -0
  29. data/lib/mint/renderers/erb_renderer.rb +11 -0
  30. data/lib/mint/renderers/markdown_renderer.rb +45 -0
  31. data/lib/mint/style.rb +21 -31
  32. data/lib/mint/template.rb +30 -0
  33. data/lib/mint/version.rb +1 -1
  34. data/lib/mint/workspace.rb +171 -0
  35. data/lib/mint.rb +44 -12
  36. data/man/mint.1 +85 -44
  37. data/spec/cli/README.md +2 -2
  38. data/spec/cli/argument_parsing_spec.rb +89 -147
  39. data/spec/cli/bin_integration_spec.rb +23 -243
  40. data/spec/cli/full_workflow_integration_spec.rb +99 -442
  41. data/spec/cli/original_style_integration_spec.rb +58 -0
  42. data/spec/cli/publish_workflow_spec.rb +72 -70
  43. data/spec/commandline_path_integration_spec.rb +230 -0
  44. data/spec/config_file_integration_spec.rb +362 -0
  45. data/spec/{css_spec.rb → css_dsl_spec.rb} +7 -3
  46. data/spec/css_parser_spec.rb +59 -1
  47. data/spec/document_spec.rb +37 -242
  48. data/spec/flattened_path_spec.rb +150 -0
  49. data/spec/layout_spec.rb +42 -3
  50. data/spec/mint_spec.rb +22 -217
  51. data/spec/path_handling_spec.rb +237 -0
  52. data/spec/run_cli_tests.rb +1 -1
  53. data/spec/spec_helper.rb +3 -10
  54. data/spec/style_spec.rb +31 -56
  55. data/spec/support/cli_helpers.rb +7 -10
  56. data/spec/support/matchers.rb +1 -1
  57. data/spec/template_spec.rb +31 -0
  58. data/spec/workspace_spec.rb +177 -0
  59. metadata +75 -89
  60. data/bin/mint-epub +0 -20
  61. data/config/templates/garden/layout.erb +0 -38
  62. data/config/templates/garden/style.css +0 -303
  63. data/config/templates/nord/layout.erb +0 -11
  64. data/config/templates/nord-dark/layout.erb +0 -11
  65. data/config/templates/zen/layout.erb +0 -11
  66. data/config/templates/zen/style.css +0 -114
  67. data/lib/mint/command_line.rb +0 -360
  68. data/lib/mint/css_template.rb +0 -37
  69. data/lib/mint/markdown_template.rb +0 -47
  70. data/lib/mint/mint.rb +0 -313
  71. data/lib/mint/plugin.rb +0 -136
  72. data/lib/mint/plugins/epub.rb +0 -293
  73. data/lib/mint/resource.rb +0 -101
  74. data/plugins/templates/epub/layouts/container.haml +0 -5
  75. data/plugins/templates/epub/layouts/content.haml +0 -35
  76. data/plugins/templates/epub/layouts/layout.haml +0 -6
  77. data/plugins/templates/epub/layouts/title.haml +0 -11
  78. data/plugins/templates/epub/layouts/toc.haml +0 -26
  79. data/spec/cli/configuration_management_spec.rb +0 -363
  80. data/spec/cli/template_management_spec.rb +0 -300
  81. data/spec/helpers_spec.rb +0 -249
  82. data/spec/plugin_spec.rb +0 -449
  83. data/spec/resource_spec.rb +0 -135
@@ -1,187 +1,167 @@
1
- @import '../reset.css';
1
+ @import './reset.css';
2
+ @import './variables.css';
2
3
 
3
4
  body {
4
- font-family: var(--body-font-family), Georgia, serif;
5
- }
6
-
7
- h1, h2 {
8
- line-height: 1.3;
9
- }
10
-
11
- h2, h3, h4, h5, h6 {
12
- line-height: var(--screen-line-height);
5
+ line-height: var(--base-line-height);
6
+ font-size: var(--base-font-size);
13
7
  }
14
8
 
15
9
  h1, h2, h3, h4, h5, h6 {
16
- font-family: var(--header-font-family);
17
- font-weight: normal;
10
+ margin-top: var(--space-md);
11
+ margin-bottom: var(--space-sm);
12
+ line-height: var(--base-line-height);
18
13
  }
19
14
 
20
15
  h1 {
21
- font-size: calc(var(--screen-font-size) * 1.5);
22
- margin-top: var(--screen-unit);
23
- margin-bottom: var(--screen-unit);
16
+ font-size: var(--font-size-2xl);
17
+ margin-top: 0;
18
+ margin-bottom: var(--space-base);
24
19
  }
25
20
 
26
21
  h2 {
27
- font-size: calc(var(--screen-font-size) * 1.2);
28
- margin-top: calc(var(--screen-unit) * 3 / 2);
29
- margin-bottom: calc(var(--screen-unit) * 1 / 2);
22
+ font-size: var(--font-size-xl);
30
23
  }
31
24
 
32
25
  h3 {
33
- font-size: calc(var(--screen-font-size) * 1.1);
34
- margin-top: calc(var(--screen-unit) * 7 / 4);
35
- margin-bottom: calc(var(--screen-unit) * 1 / 4);
26
+ font-size: var(--font-size-lg);
36
27
  }
37
28
 
38
29
  h4 {
39
- font-size: calc(var(--screen-font-size) * 1.05);
40
- margin-top: calc(var(--screen-unit) * 7 / 8);
41
- margin-bottom: calc(var(--screen-unit) * 1 / 8);
30
+ font-size: var(--font-size-base);
42
31
  }
43
32
 
44
33
  h5, h6 {
45
- font-size: var(--screen-font-size);
46
- margin-top: calc(var(--screen-unit) * 7 / 8);
47
- margin-bottom: calc(var(--screen-unit) * 1 / 8);
48
- }
49
-
50
- ul {
51
- list-style-type: square;
52
- }
53
-
54
- ul ul {
55
- list-style-type: circle;
34
+ font-size: var(--font-size-sm);
56
35
  }
57
36
 
58
37
  ul, ol {
59
- margin: calc(var(--screen-unit) / 4) 0 0 calc(var(--screen-unit) / 2);
60
- padding-left: calc(var(--screen-unit) * 1.2);
38
+ margin: var(--space-base) 0;
39
+ padding-left: var(--space-lg);
61
40
  }
62
41
 
63
- ul li p, ol li p {
64
- text-indent: 0 !important;
42
+ li {
43
+ margin: var(--space-xs) 0;
65
44
  }
66
45
 
67
- ul li + li, ol li + li {
68
- margin-top: calc(var(--screen-unit) / 4);
46
+ ul ul, ol ol, ul ol, ol ul {
47
+ margin: var(--space-xs) 0;
69
48
  }
70
49
 
71
50
  p {
72
- margin: calc(var(--screen-unit) / 2) 0;
73
- }
74
-
75
- ul + p, ol + p, blockquote + p, pre + p {
76
- text-indent: 0;
51
+ margin: var(--space-base) 0;
77
52
  }
78
53
 
79
- a:link, a:visited, a:active {
80
- color: var(--link-color);
54
+ a {
55
+ color: var(--color-accent);
81
56
  text-decoration: none;
57
+ border-bottom: 1px solid transparent;
58
+ transition: var(--transition-fast);
82
59
  }
83
60
 
84
61
  a:hover {
85
- text-decoration: underline;
62
+ color: var(--color-accent-hover);
63
+ border-bottom-color: var(--color-accent-hover);
86
64
  }
87
65
 
88
66
  code {
89
- font-family: Monaco, Menlo, Mensch, Consolas, Monotype, mono;
90
- font-style: normal;
67
+ font-family: 'SF Mono', 'JetBrains Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, monospace;
68
+ font-size: var(--font-size-xs);
69
+ background-color: var(--color-code-bg);
70
+ color: var(--color-code-text);
71
+ padding: 0.1em 0.3em;
72
+ border-radius: var(--radius-sm);
73
+ border: 1px solid var(--color-code-border);
91
74
  }
92
75
 
93
76
  pre {
94
- display: block;
95
- margin-left: var(--screen-unit);
96
- margin-right: calc(var(--screen-unit) * 2);
97
- padding: calc(var(--screen-unit) / 3) var(--screen-unit);
98
- padding-left: calc(var(--screen-unit) * 3 / 4);
77
+ font-family: 'SF Mono', 'JetBrains Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, monospace;
78
+ }
79
+
80
+ pre code {
81
+ background-color: transparent;
82
+ border: none;
83
+ padding: 0;
84
+ border-radius: 0;
85
+ font-size: var(--font-size-xs);
86
+ }
87
+
88
+ pre {
89
+ margin: var(--space-base) 0;
90
+ padding: var(--space-base);
91
+ overflow-x: auto;
99
92
  white-space: pre;
93
+ background-color: var(--color-pre-bg);
94
+ color: var(--color-pre-text);
95
+ border: 1px solid var(--color-pre-border);
96
+ border-radius: var(--radius-base);
100
97
  }
101
98
 
102
99
  blockquote {
103
- display: block;
104
- margin-left: var(--screen-unit);
105
- margin-right: calc(var(--screen-unit) * 2);
106
- padding: calc(var(--screen-unit) / 3) var(--screen-unit);
107
- padding-left: calc(var(--screen-unit) * 3 / 4);
100
+ margin: var(--space-base) 0;
101
+ padding: var(--space-sm) var(--space-base);
102
+ margin-left: 0;
103
+ background-color: var(--color-quote-bg);
104
+ color: var(--color-quote-text);
105
+ border-left: 3px solid var(--color-quote-border);
106
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
108
107
  }
109
108
 
110
- pre p, blockquote p {
111
- margin: 0;
112
- line-height: 1.35;
109
+ img {
110
+ max-width: 100%;
111
+ height: auto;
113
112
  }
114
113
 
115
- img {
116
- display: block;
117
- }
118
-
119
- @media screen {
120
- body {
121
- font-size: var(--screen-font-size);
122
- line-height: var(--screen-line-height);
123
- background-color: #666;
124
- color: var(--text-color);
125
- }
126
-
127
- #container {
128
- display: block;
129
- border: solid 1px #999;
130
- width: 780px;
131
- padding: 40px 60px;
132
- margin: calc(var(--screen-unit) / 2) auto;
133
- background-color: #fff;
134
- box-sizing: border-box;
135
- -moz-box-sizing: border-box;
136
- -webkit-box-sizing: border-box;
137
- }
138
-
139
- code {
140
- font-size: calc(var(--screen-font-size) * 7 / 8);
141
- }
142
-
143
- pre {
144
- white-space: pre-wrap;
145
- white-space: -moz-pre-wrap;
146
- white-space: -o-pre-wrap;
147
- word-wrap: break-word;
148
- }
149
-
150
- pre code {
151
- font-size: calc(var(--screen-font-size) * 3 / 4);
152
- }
153
- }
154
-
155
- @media print {
156
- @page {
157
- margin-left: 1in;
158
- margin-right: 1in;
159
- margin-top: 1in;
160
- margin-bottom: 1in;
161
- }
162
-
163
- body {
164
- font-size: var(--print-font-size);
165
- line-height: var(--print-line-height);
166
- width: auto;
167
- margin: 0;
168
- padding: 0;
169
- }
170
-
171
- code {
172
- font-size: calc(var(--print-font-size) * 7 / 8);
173
- }
174
-
175
- pre code {
176
- font-size: calc(var(--print-font-size) * 3 / 4);
177
- }
178
-
179
- h1, h2, h3, h4, h5, h6, li, blockquote {
180
- page-break-inside: avoid;
181
- }
182
-
183
- p {
184
- widows: 3;
185
- orphans: 3;
186
- }
187
- }
114
+ table {
115
+ border-collapse: collapse;
116
+ margin: var(--space-base) 0;
117
+ width: 100%;
118
+ background-color: var(--color-table-bg);
119
+ border: 1px solid var(--color-table-border);
120
+ border-radius: var(--radius-base);
121
+ overflow: hidden;
122
+ }
123
+
124
+ th, td {
125
+ padding: var(--space-sm) var(--space-sm);
126
+ text-align: left;
127
+ border-bottom: 1px solid var(--color-table-border);
128
+ border-left: none;
129
+ border-right: none;
130
+ border-top: none;
131
+ }
132
+
133
+ th {
134
+ background-color: var(--color-table-header-bg);
135
+ color: var(--color-table-header-text);
136
+ font-weight: 500;
137
+ }
138
+
139
+ tr:last-child td {
140
+ border-bottom: none;
141
+ }
142
+
143
+ tr:nth-child(even) {
144
+ background-color: var(--color-table-stripe);
145
+ }
146
+
147
+ tr:hover {
148
+ background-color: var(--color-table-hover);
149
+ }
150
+
151
+ hr {
152
+ margin: var(--space-xl) 0;
153
+ border: none;
154
+ height: 1px;
155
+ background-color: var(--color-border);
156
+ }
157
+
158
+ strong {
159
+ font-weight: bold;
160
+ }
161
+
162
+ em {
163
+ font-style: italic;
164
+ }
165
+
166
+ /* Import print styles - templates can override specific aspects */
167
+ @import './print.css';
@@ -0,0 +1,136 @@
1
+ /* Base Utility Classes & Common Patterns
2
+ * Provides reusable patterns that templates can apply
3
+ */
4
+
5
+ /* Typography Utilities */
6
+ .heading-scale h1 {
7
+ font-size: var(--font-size-2xl);
8
+ margin-top: 0;
9
+ margin-bottom: var(--space-base);
10
+ }
11
+
12
+ .heading-scale h2 {
13
+ font-size: var(--font-size-xl);
14
+ margin-top: var(--space-xl);
15
+ margin-bottom: var(--space-sm);
16
+ }
17
+
18
+ .heading-scale h3 {
19
+ font-size: var(--font-size-lg);
20
+ margin-top: var(--space-lg);
21
+ margin-bottom: var(--space-sm);
22
+ }
23
+
24
+ .heading-scale h4 {
25
+ font-size: var(--font-size-base);
26
+ margin-top: var(--space-base);
27
+ margin-bottom: var(--space-xs);
28
+ }
29
+
30
+ .heading-scale h5,
31
+ .heading-scale h6 {
32
+ font-size: var(--font-size-sm);
33
+ margin-top: var(--space-base);
34
+ margin-bottom: var(--space-xs);
35
+ }
36
+
37
+ /* Navigation Container Utilities */
38
+ .nav-container {
39
+ margin-left: var(--navigation-width);
40
+ padding-left: var(--navigation-gap);
41
+ }
42
+
43
+ .nav-container-mobile {
44
+ margin-left: auto;
45
+ padding-left: var(--container-padding);
46
+ }
47
+
48
+ /* Common Container Patterns */
49
+ .container-default {
50
+ max-width: var(--container-max-width);
51
+ margin: var(--space-xl) auto;
52
+ padding: var(--container-padding);
53
+ }
54
+
55
+ .container-with-nav {
56
+ max-width: calc(var(--container-max-width) - var(--navigation-width));
57
+ margin-right: auto;
58
+ margin-top: var(--space-xl);
59
+ margin-bottom: var(--space-xl);
60
+ padding: var(--container-padding);
61
+ }
62
+
63
+ /* Layout Utilities */
64
+ .flow > * + * {
65
+ margin-top: var(--space-base);
66
+ }
67
+
68
+ .flow-sm > * + * {
69
+ margin-top: var(--space-sm);
70
+ }
71
+
72
+ .flow-lg > * + * {
73
+ margin-top: var(--space-lg);
74
+ }
75
+
76
+ /* Visual Utilities */
77
+ .surface {
78
+ background-color: var(--color-surface);
79
+ border: 1px solid var(--color-border);
80
+ border-radius: var(--radius-base);
81
+ }
82
+
83
+ .surface-subtle {
84
+ background-color: var(--color-surface-subtle);
85
+ }
86
+
87
+ .surface-elevated {
88
+ background-color: var(--color-surface);
89
+ box-shadow: var(--shadow-lg);
90
+ border: 1px solid var(--color-border);
91
+ border-radius: var(--radius-lg);
92
+ }
93
+
94
+ /* Text Utilities */
95
+ .text-subtle {
96
+ color: var(--color-text-subtle);
97
+ }
98
+
99
+ .text-muted {
100
+ color: var(--color-text-muted);
101
+ }
102
+
103
+ .text-accent {
104
+ color: var(--color-accent);
105
+ }
106
+
107
+ /* Responsive Utilities */
108
+ .hide-mobile {
109
+ display: block;
110
+ }
111
+
112
+ .show-mobile {
113
+ display: none;
114
+ }
115
+
116
+ @media (max-width: 960px) {
117
+ .hide-mobile {
118
+ display: none;
119
+ }
120
+
121
+ .show-mobile {
122
+ display: block;
123
+ }
124
+
125
+ /* Reset navigation containers on mobile */
126
+ .nav-container {
127
+ margin-left: auto;
128
+ padding-left: var(--container-padding);
129
+ }
130
+
131
+ .container-with-nav {
132
+ max-width: var(--container-max-width);
133
+ margin: var(--space-base) auto;
134
+ padding: var(--container-padding);
135
+ }
136
+ }
@@ -0,0 +1,124 @@
1
+ /* Base Design System Variables
2
+ * All templates inherit from this foundation
3
+ * Templates should override these variables to create their visual identity
4
+ */
5
+
6
+ :root {
7
+ /* Typography Foundation */
8
+ --base-font-size: 16px;
9
+ --base-line-height: 1.6;
10
+ --base-unit: calc(var(--base-font-size) * var(--base-line-height));
11
+
12
+ /* Typographic Scale - Templates can override --scale-ratio */
13
+ --scale-ratio: 1.25; /* Minor third by default */
14
+ --font-size-xs: calc(var(--base-font-size) * 0.75);
15
+ --font-size-sm: calc(var(--base-font-size) * 0.875);
16
+ --font-size-base: var(--base-font-size);
17
+ --font-size-lg: calc(var(--base-font-size) * var(--scale-ratio));
18
+ --font-size-xl: calc(var(--font-size-lg) * var(--scale-ratio));
19
+ --font-size-2xl: calc(var(--font-size-xl) * var(--scale-ratio));
20
+ --font-size-3xl: calc(var(--font-size-2xl) * var(--scale-ratio));
21
+
22
+ /* Spacing Scale - Based on typographic rhythm */
23
+ --space-xs: calc(var(--base-unit) * 0.25);
24
+ --space-sm: calc(var(--base-unit) * 0.5);
25
+ --space-base: var(--base-unit);
26
+ --space-md: var(--space-base);
27
+ --space-lg: calc(var(--base-unit) * 1.5);
28
+ --space-xl: calc(var(--base-unit) * 2);
29
+ --space-2xl: calc(var(--base-unit) * 3);
30
+ --space-3xl: calc(var(--base-unit) * 4);
31
+
32
+ /* Semantic Colors - Templates override these for theming */
33
+ --color-text: #1a1a1a;
34
+ --color-text-subtle: #666666;
35
+ --color-text-muted: #8a8a8a;
36
+ --color-background: #ffffff;
37
+ --color-surface: #ffffff;
38
+ --color-surface-subtle: #f8f9fa;
39
+ --color-border: #e5e5e5;
40
+ --color-border-subtle: #f0f0f0;
41
+ --color-accent: #007acc;
42
+ --color-accent-hover: #005fa3;
43
+ --color-accent-subtle: rgba(0, 122, 204, 0.1);
44
+
45
+ /* Component-Specific Colors */
46
+ --color-code-bg: #f8f8f8;
47
+ --color-code-text: #d14;
48
+ --color-code-border: var(--color-border);
49
+ --color-pre-bg: #f8f8f8;
50
+ --color-pre-text: var(--color-text);
51
+ --color-pre-border: var(--color-border);
52
+ --color-quote-bg: #fafafa;
53
+ --color-quote-text: var(--color-text-subtle);
54
+ --color-quote-border: var(--color-accent);
55
+ --color-nav-bg: #f8f9fa;
56
+ --color-nav-text: var(--color-text-subtle);
57
+ --color-nav-text-hover: var(--color-text);
58
+ --color-nav-text-active: var(--color-accent);
59
+ --color-nav-bg-hover: var(--color-surface-subtle);
60
+ --color-nav-bg-active: var(--color-accent-subtle);
61
+ --color-nav-border: var(--color-border);
62
+ --color-nav-border-active: var(--color-accent);
63
+
64
+ /* Table Colors */
65
+ --color-table-bg: var(--color-surface);
66
+ --color-table-header-bg: var(--color-surface-subtle);
67
+ --color-table-header-text: var(--color-text);
68
+ --color-table-border: var(--color-border);
69
+ --color-table-stripe: rgba(0, 0, 0, 0.02);
70
+ --color-table-hover: rgba(0, 0, 0, 0.04);
71
+
72
+ /* Container & Layout */
73
+ --container-max-width: 85ch;
74
+ --container-padding: var(--space-xl);
75
+ --navigation-width: 280px;
76
+ --navigation-gap: 2rem;
77
+
78
+ /* Border Radius */
79
+ --radius-sm: 3px;
80
+ --radius-base: 6px;
81
+ --radius-lg: 8px;
82
+
83
+ /* Shadows */
84
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
85
+ --shadow-base: 0 2px 4px rgba(0, 0, 0, 0.1);
86
+ --shadow-lg: 0 4px 6px rgba(0, 0, 0, 0.05), 0 10px 20px rgba(0, 0, 0, 0.1);
87
+
88
+ /* Print Styles */
89
+ --print-font-size: 11pt;
90
+ --print-line-height: 1.4;
91
+ --print-margin: 0.75in;
92
+
93
+ /* Transitions */
94
+ --transition-fast: 0.15s ease;
95
+ --transition-base: 0.2s ease;
96
+
97
+ /* Z-Index Scale */
98
+ --z-navigation: 100;
99
+ --z-dropdown: 200;
100
+ --z-modal: 300;
101
+ }
102
+
103
+ /* Screen-specific overrides for responsive typography */
104
+ @media (max-width: 960px) {
105
+ :root {
106
+ --base-font-size: 16px;
107
+ --container-padding: var(--space-base);
108
+ }
109
+ }
110
+
111
+ @media (max-width: 640px) {
112
+ :root {
113
+ --base-font-size: 15px;
114
+ --container-padding: var(--space-sm);
115
+ }
116
+ }
117
+
118
+ /* Print overrides */
119
+ @media print {
120
+ :root {
121
+ --base-font-size: var(--print-font-size);
122
+ --base-line-height: var(--print-line-height);
123
+ }
124
+ }