@autumnsgrove/groveengine 0.1.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 (219) hide show
  1. package/README.md +163 -0
  2. package/dist/auth/jwt.d.ts +14 -0
  3. package/dist/auth/jwt.js +109 -0
  4. package/dist/auth/session.d.ts +42 -0
  5. package/dist/auth/session.js +105 -0
  6. package/dist/components/admin/GutterManager.svelte +910 -0
  7. package/dist/components/admin/GutterManager.svelte.d.ts +15 -0
  8. package/dist/components/admin/MarkdownEditor.svelte +3114 -0
  9. package/dist/components/admin/MarkdownEditor.svelte.d.ts +43 -0
  10. package/dist/components/custom/CollapsibleSection.svelte +74 -0
  11. package/dist/components/custom/CollapsibleSection.svelte.d.ts +15 -0
  12. package/dist/components/custom/ContentWithGutter.svelte +646 -0
  13. package/dist/components/custom/ContentWithGutter.svelte.d.ts +19 -0
  14. package/dist/components/custom/GutterItem.svelte +201 -0
  15. package/dist/components/custom/GutterItem.svelte.d.ts +11 -0
  16. package/dist/components/custom/LeftGutter.svelte +271 -0
  17. package/dist/components/custom/LeftGutter.svelte.d.ts +17 -0
  18. package/dist/components/custom/MobileTOC.svelte +273 -0
  19. package/dist/components/custom/MobileTOC.svelte.d.ts +11 -0
  20. package/dist/components/custom/TableOfContents.svelte +163 -0
  21. package/dist/components/custom/TableOfContents.svelte.d.ts +11 -0
  22. package/dist/components/gallery/ImageGallery.svelte +681 -0
  23. package/dist/components/gallery/ImageGallery.svelte.d.ts +11 -0
  24. package/dist/components/gallery/Lightbox.svelte +107 -0
  25. package/dist/components/gallery/Lightbox.svelte.d.ts +19 -0
  26. package/dist/components/gallery/LightboxCaption.svelte +25 -0
  27. package/dist/components/gallery/LightboxCaption.svelte.d.ts +11 -0
  28. package/dist/components/gallery/ZoomableImage.svelte +163 -0
  29. package/dist/components/gallery/ZoomableImage.svelte.d.ts +17 -0
  30. package/dist/components/ui/Accordion.svelte +74 -0
  31. package/dist/components/ui/Accordion.svelte.d.ts +42 -0
  32. package/dist/components/ui/Badge.svelte +48 -0
  33. package/dist/components/ui/Badge.svelte.d.ts +26 -0
  34. package/dist/components/ui/Button.svelte +74 -0
  35. package/dist/components/ui/Button.svelte.d.ts +34 -0
  36. package/dist/components/ui/Card.svelte +102 -0
  37. package/dist/components/ui/Card.svelte.d.ts +46 -0
  38. package/dist/components/ui/Dialog.svelte +91 -0
  39. package/dist/components/ui/Dialog.svelte.d.ts +43 -0
  40. package/dist/components/ui/Input.svelte +81 -0
  41. package/dist/components/ui/Input.svelte.d.ts +35 -0
  42. package/dist/components/ui/Select.svelte +69 -0
  43. package/dist/components/ui/Select.svelte.d.ts +36 -0
  44. package/dist/components/ui/Sheet.svelte +98 -0
  45. package/dist/components/ui/Sheet.svelte.d.ts +45 -0
  46. package/dist/components/ui/Skeleton.svelte +31 -0
  47. package/dist/components/ui/Skeleton.svelte.d.ts +26 -0
  48. package/dist/components/ui/Table.svelte +59 -0
  49. package/dist/components/ui/Table.svelte.d.ts +44 -0
  50. package/dist/components/ui/Tabs.svelte +76 -0
  51. package/dist/components/ui/Tabs.svelte.d.ts +41 -0
  52. package/dist/components/ui/Textarea.svelte +81 -0
  53. package/dist/components/ui/Textarea.svelte.d.ts +35 -0
  54. package/dist/components/ui/Toast.svelte +18 -0
  55. package/dist/components/ui/Toast.svelte.d.ts +7 -0
  56. package/dist/components/ui/accordion/accordion-content.svelte +24 -0
  57. package/dist/components/ui/accordion/accordion-content.svelte.d.ts +4 -0
  58. package/dist/components/ui/accordion/accordion-item.svelte +12 -0
  59. package/dist/components/ui/accordion/accordion-item.svelte.d.ts +4 -0
  60. package/dist/components/ui/accordion/accordion-trigger.svelte +29 -0
  61. package/dist/components/ui/accordion/accordion-trigger.svelte.d.ts +7 -0
  62. package/dist/components/ui/accordion/index.d.ts +6 -0
  63. package/dist/components/ui/accordion/index.js +8 -0
  64. package/dist/components/ui/badge/badge.svelte +50 -0
  65. package/dist/components/ui/badge/badge.svelte.d.ts +60 -0
  66. package/dist/components/ui/badge/index.d.ts +2 -0
  67. package/dist/components/ui/badge/index.js +2 -0
  68. package/dist/components/ui/button/button.svelte +82 -0
  69. package/dist/components/ui/button/button.svelte.d.ts +132 -0
  70. package/dist/components/ui/button/index.d.ts +2 -0
  71. package/dist/components/ui/button/index.js +4 -0
  72. package/dist/components/ui/card/card-content.svelte +16 -0
  73. package/dist/components/ui/card/card-content.svelte.d.ts +5 -0
  74. package/dist/components/ui/card/card-description.svelte +16 -0
  75. package/dist/components/ui/card/card-description.svelte.d.ts +5 -0
  76. package/dist/components/ui/card/card-footer.svelte +16 -0
  77. package/dist/components/ui/card/card-footer.svelte.d.ts +5 -0
  78. package/dist/components/ui/card/card-header.svelte +16 -0
  79. package/dist/components/ui/card/card-header.svelte.d.ts +5 -0
  80. package/dist/components/ui/card/card-title.svelte +25 -0
  81. package/dist/components/ui/card/card-title.svelte.d.ts +8 -0
  82. package/dist/components/ui/card/card.svelte +20 -0
  83. package/dist/components/ui/card/card.svelte.d.ts +5 -0
  84. package/dist/components/ui/card/index.d.ts +7 -0
  85. package/dist/components/ui/card/index.js +9 -0
  86. package/dist/components/ui/dialog/dialog-content.svelte +38 -0
  87. package/dist/components/ui/dialog/dialog-content.svelte.d.ts +9 -0
  88. package/dist/components/ui/dialog/dialog-description.svelte +16 -0
  89. package/dist/components/ui/dialog/dialog-description.svelte.d.ts +4 -0
  90. package/dist/components/ui/dialog/dialog-footer.svelte +20 -0
  91. package/dist/components/ui/dialog/dialog-footer.svelte.d.ts +5 -0
  92. package/dist/components/ui/dialog/dialog-header.svelte +20 -0
  93. package/dist/components/ui/dialog/dialog-header.svelte.d.ts +5 -0
  94. package/dist/components/ui/dialog/dialog-overlay.svelte +19 -0
  95. package/dist/components/ui/dialog/dialog-overlay.svelte.d.ts +4 -0
  96. package/dist/components/ui/dialog/dialog-title.svelte +16 -0
  97. package/dist/components/ui/dialog/dialog-title.svelte.d.ts +4 -0
  98. package/dist/components/ui/dialog/index.d.ts +12 -0
  99. package/dist/components/ui/dialog/index.js +14 -0
  100. package/dist/components/ui/index.d.ts +26 -0
  101. package/dist/components/ui/index.js +29 -0
  102. package/dist/components/ui/input/index.d.ts +2 -0
  103. package/dist/components/ui/input/index.js +4 -0
  104. package/dist/components/ui/input/input.svelte +46 -0
  105. package/dist/components/ui/input/input.svelte.d.ts +13 -0
  106. package/dist/components/ui/select/index.d.ts +11 -0
  107. package/dist/components/ui/select/index.js +13 -0
  108. package/dist/components/ui/select/select-content.svelte +39 -0
  109. package/dist/components/ui/select/select-content.svelte.d.ts +7 -0
  110. package/dist/components/ui/select/select-group-heading.svelte +16 -0
  111. package/dist/components/ui/select/select-group-heading.svelte.d.ts +4 -0
  112. package/dist/components/ui/select/select-item.svelte +37 -0
  113. package/dist/components/ui/select/select-item.svelte.d.ts +4 -0
  114. package/dist/components/ui/select/select-scroll-down-button.svelte +19 -0
  115. package/dist/components/ui/select/select-scroll-down-button.svelte.d.ts +4 -0
  116. package/dist/components/ui/select/select-scroll-up-button.svelte +19 -0
  117. package/dist/components/ui/select/select-scroll-up-button.svelte.d.ts +4 -0
  118. package/dist/components/ui/select/select-separator.svelte +13 -0
  119. package/dist/components/ui/select/select-separator.svelte.d.ts +4 -0
  120. package/dist/components/ui/select/select-trigger.svelte +24 -0
  121. package/dist/components/ui/select/select-trigger.svelte.d.ts +4 -0
  122. package/dist/components/ui/separator/index.d.ts +2 -0
  123. package/dist/components/ui/separator/index.js +4 -0
  124. package/dist/components/ui/separator/separator.svelte +22 -0
  125. package/dist/components/ui/separator/separator.svelte.d.ts +4 -0
  126. package/dist/components/ui/sheet/index.d.ts +12 -0
  127. package/dist/components/ui/sheet/index.js +14 -0
  128. package/dist/components/ui/sheet/sheet-content.svelte +53 -0
  129. package/dist/components/ui/sheet/sheet-content.svelte.d.ts +62 -0
  130. package/dist/components/ui/sheet/sheet-description.svelte +16 -0
  131. package/dist/components/ui/sheet/sheet-description.svelte.d.ts +4 -0
  132. package/dist/components/ui/sheet/sheet-footer.svelte +20 -0
  133. package/dist/components/ui/sheet/sheet-footer.svelte.d.ts +5 -0
  134. package/dist/components/ui/sheet/sheet-header.svelte +20 -0
  135. package/dist/components/ui/sheet/sheet-header.svelte.d.ts +5 -0
  136. package/dist/components/ui/sheet/sheet-overlay.svelte +21 -0
  137. package/dist/components/ui/sheet/sheet-overlay.svelte.d.ts +6 -0
  138. package/dist/components/ui/sheet/sheet-title.svelte +16 -0
  139. package/dist/components/ui/sheet/sheet-title.svelte.d.ts +4 -0
  140. package/dist/components/ui/skeleton/index.d.ts +2 -0
  141. package/dist/components/ui/skeleton/index.js +4 -0
  142. package/dist/components/ui/skeleton/skeleton.svelte +17 -0
  143. package/dist/components/ui/skeleton/skeleton.svelte.d.ts +5 -0
  144. package/dist/components/ui/table/index.d.ts +9 -0
  145. package/dist/components/ui/table/index.js +11 -0
  146. package/dist/components/ui/table/table-body.svelte +16 -0
  147. package/dist/components/ui/table/table-body.svelte.d.ts +5 -0
  148. package/dist/components/ui/table/table-caption.svelte +16 -0
  149. package/dist/components/ui/table/table-caption.svelte.d.ts +5 -0
  150. package/dist/components/ui/table/table-cell.svelte +20 -0
  151. package/dist/components/ui/table/table-cell.svelte.d.ts +5 -0
  152. package/dist/components/ui/table/table-footer.svelte +16 -0
  153. package/dist/components/ui/table/table-footer.svelte.d.ts +5 -0
  154. package/dist/components/ui/table/table-head.svelte +23 -0
  155. package/dist/components/ui/table/table-head.svelte.d.ts +5 -0
  156. package/dist/components/ui/table/table-header.svelte +16 -0
  157. package/dist/components/ui/table/table-header.svelte.d.ts +5 -0
  158. package/dist/components/ui/table/table-row.svelte +23 -0
  159. package/dist/components/ui/table/table-row.svelte.d.ts +5 -0
  160. package/dist/components/ui/table/table.svelte +18 -0
  161. package/dist/components/ui/table/table.svelte.d.ts +5 -0
  162. package/dist/components/ui/tabs/index.d.ts +6 -0
  163. package/dist/components/ui/tabs/index.js +8 -0
  164. package/dist/components/ui/tabs/tabs-content.svelte +19 -0
  165. package/dist/components/ui/tabs/tabs-content.svelte.d.ts +4 -0
  166. package/dist/components/ui/tabs/tabs-list.svelte +19 -0
  167. package/dist/components/ui/tabs/tabs-list.svelte.d.ts +4 -0
  168. package/dist/components/ui/tabs/tabs-trigger.svelte +19 -0
  169. package/dist/components/ui/tabs/tabs-trigger.svelte.d.ts +4 -0
  170. package/dist/components/ui/textarea/index.d.ts +2 -0
  171. package/dist/components/ui/textarea/index.js +4 -0
  172. package/dist/components/ui/textarea/textarea.svelte +24 -0
  173. package/dist/components/ui/textarea/textarea.svelte.d.ts +6 -0
  174. package/dist/components/ui/toast.d.ts +86 -0
  175. package/dist/components/ui/toast.js +99 -0
  176. package/dist/db/schema.sql +238 -0
  177. package/dist/index.d.ts +14 -0
  178. package/dist/index.js +20 -0
  179. package/dist/payments/index.d.ts +33 -0
  180. package/dist/payments/index.js +47 -0
  181. package/dist/payments/shop.d.ts +165 -0
  182. package/dist/payments/shop.js +588 -0
  183. package/dist/payments/stripe/client.d.ts +231 -0
  184. package/dist/payments/stripe/client.js +198 -0
  185. package/dist/payments/stripe/index.d.ts +18 -0
  186. package/dist/payments/stripe/index.js +17 -0
  187. package/dist/payments/stripe/provider.d.ts +50 -0
  188. package/dist/payments/stripe/provider.js +530 -0
  189. package/dist/payments/types.d.ts +355 -0
  190. package/dist/payments/types.js +7 -0
  191. package/dist/server/logger.d.ts +53 -0
  192. package/dist/server/logger.js +252 -0
  193. package/dist/styles/content.css +514 -0
  194. package/dist/styles/tokens.css +175 -0
  195. package/dist/utils/api.d.ts +20 -0
  196. package/dist/utils/api.js +109 -0
  197. package/dist/utils/cn.d.ts +15 -0
  198. package/dist/utils/cn.js +18 -0
  199. package/dist/utils/csrf.d.ts +22 -0
  200. package/dist/utils/csrf.js +72 -0
  201. package/dist/utils/debounce.d.ts +7 -0
  202. package/dist/utils/debounce.js +14 -0
  203. package/dist/utils/gallery.d.ts +66 -0
  204. package/dist/utils/gallery.js +181 -0
  205. package/dist/utils/gutter.d.ts +54 -0
  206. package/dist/utils/gutter.js +169 -0
  207. package/dist/utils/imageProcessor.d.ts +58 -0
  208. package/dist/utils/imageProcessor.js +205 -0
  209. package/dist/utils/json.d.ts +17 -0
  210. package/dist/utils/json.js +26 -0
  211. package/dist/utils/markdown.d.ts +101 -0
  212. package/dist/utils/markdown.js +947 -0
  213. package/dist/utils/sanitize.d.ts +25 -0
  214. package/dist/utils/sanitize.js +127 -0
  215. package/dist/utils/validation.d.ts +46 -0
  216. package/dist/utils/validation.js +169 -0
  217. package/dist/utils.d.ts +5 -0
  218. package/dist/utils.js +5 -0
  219. package/package.json +129 -0
@@ -0,0 +1,514 @@
1
+ /**
2
+ * Shared Content Styles
3
+ *
4
+ * Used by:
5
+ * - src/routes/about/+page.svelte
6
+ * - src/routes/blog/[slug]/+page.svelte
7
+ *
8
+ * Import this file to get consistent layout and typography styles
9
+ * for content pages with optional gutter sidebars.
10
+ */
11
+
12
+ /* ==========================================================================
13
+ Layout Grid System
14
+ ========================================================================== */
15
+
16
+ .content-layout {
17
+ max-width: 800px;
18
+ margin: 0 auto;
19
+ }
20
+
21
+ .content-layout.has-gutters {
22
+ display: grid;
23
+ grid-template-columns: 1fr;
24
+ max-width: 1400px;
25
+ gap: 2rem;
26
+ }
27
+
28
+ /* Desktop: Both gutters */
29
+ @media (min-width: 1200px) {
30
+ .content-layout.has-both-gutters {
31
+ grid-template-columns: 240px 1fr 200px;
32
+ }
33
+
34
+ .content-layout.has-left-gutter:not(.has-both-gutters) {
35
+ grid-template-columns: 240px 1fr;
36
+ max-width: 1100px;
37
+ }
38
+
39
+ .content-layout.has-right-gutter:not(.has-both-gutters) {
40
+ grid-template-columns: 1fr 200px;
41
+ max-width: 1000px;
42
+ }
43
+ }
44
+
45
+ /* Tablet: Both gutters */
46
+ @media (min-width: 769px) and (max-width: 1199px) {
47
+ .content-layout.has-both-gutters {
48
+ grid-template-columns: 200px 1fr 200px;
49
+ max-width: 1200px;
50
+ }
51
+
52
+ .content-layout.has-left-gutter:not(.has-both-gutters) {
53
+ grid-template-columns: 200px 1fr;
54
+ max-width: 900px;
55
+ }
56
+
57
+ .content-layout.has-right-gutter:not(.has-both-gutters) {
58
+ grid-template-columns: 1fr 200px;
59
+ max-width: 900px;
60
+ }
61
+
62
+ /* Hide mobile gutter content since left gutter container is visible */
63
+ .mobile-gutter-content,
64
+ .mobile-gutter-inline {
65
+ display: none !important;
66
+ float: none;
67
+ }
68
+ }
69
+
70
+ /* ==========================================================================
71
+ Visibility Utilities
72
+ ========================================================================== */
73
+
74
+ .desktop-only {
75
+ display: none;
76
+ }
77
+
78
+ @media (min-width: 769px) {
79
+ .desktop-only {
80
+ display: block;
81
+ }
82
+ }
83
+
84
+ /* ==========================================================================
85
+ Mobile Gutter Content
86
+ ========================================================================== */
87
+
88
+ .mobile-gutter-content {
89
+ display: block;
90
+ margin: 0 auto 2rem auto;
91
+ padding: 1rem;
92
+ background: #f5f5f5;
93
+ border-radius: 8px;
94
+ transition: background-color 0.3s ease;
95
+ text-align: center;
96
+ }
97
+
98
+ .mobile-gutter-inline {
99
+ float: right;
100
+ clear: right;
101
+ width: 35%;
102
+ max-width: 250px;
103
+ min-width: 120px;
104
+ margin: 0.25rem 0 1rem 1.5rem;
105
+ padding: 0;
106
+ background: none;
107
+ border-radius: 0;
108
+ }
109
+
110
+ /* On very small mobile, don't float - just display inline and centered */
111
+ @media (max-width: 400px) {
112
+ .mobile-gutter-inline {
113
+ float: none;
114
+ clear: none;
115
+ max-width: none;
116
+ margin: 1rem auto 1.5rem auto;
117
+ padding: 0.75rem;
118
+ background: #f8f8f8;
119
+ border-radius: 6px;
120
+ text-align: center;
121
+ }
122
+
123
+ .dark .mobile-gutter-inline {
124
+ background: #1a1a1a;
125
+ }
126
+ }
127
+
128
+ .dark .mobile-gutter-content {
129
+ background: #1a1a1a;
130
+ }
131
+
132
+ @media (min-width: 1200px) {
133
+ .mobile-gutter-content {
134
+ display: none;
135
+ }
136
+ }
137
+
138
+ /* ==========================================================================
139
+ Gutter Containers
140
+ ========================================================================== */
141
+
142
+ .left-gutter-container,
143
+ .right-gutter-container {
144
+ min-width: 0;
145
+ }
146
+
147
+ /* Explicit grid positioning to handle missing gutters */
148
+ @media (min-width: 1200px) {
149
+ /* Both gutters - 3 column layout */
150
+ .content-layout.has-both-gutters .left-gutter-container {
151
+ grid-column: 1;
152
+ }
153
+
154
+ .content-layout.has-both-gutters .content-article {
155
+ grid-column: 2;
156
+ }
157
+
158
+ .content-layout.has-both-gutters .right-gutter-container {
159
+ grid-column: 3;
160
+ }
161
+
162
+ /* Left gutter only - 2 column layout */
163
+ .content-layout.has-left-gutter:not(.has-right-gutter) .left-gutter-container {
164
+ grid-column: 1;
165
+ }
166
+
167
+ .content-layout.has-left-gutter:not(.has-right-gutter) .content-article {
168
+ grid-column: 2;
169
+ }
170
+
171
+ /* Right gutter only - 2 column layout */
172
+ .content-layout.has-right-gutter:not(.has-left-gutter) .content-article {
173
+ grid-column: 1;
174
+ }
175
+
176
+ .content-layout.has-right-gutter:not(.has-left-gutter) .right-gutter-container {
177
+ grid-column: 2;
178
+ }
179
+ }
180
+
181
+ /* Tablet grid positioning */
182
+ @media (min-width: 769px) and (max-width: 1199px) {
183
+ /* Both gutters - 3 column layout */
184
+ .content-layout.has-both-gutters .left-gutter-container {
185
+ grid-column: 1;
186
+ }
187
+
188
+ .content-layout.has-both-gutters .content-article {
189
+ grid-column: 2;
190
+ }
191
+
192
+ .content-layout.has-both-gutters .right-gutter-container {
193
+ grid-column: 3;
194
+ }
195
+
196
+ /* Left gutter only - 2 column layout */
197
+ .content-layout.has-left-gutter:not(.has-right-gutter) .left-gutter-container {
198
+ grid-column: 1;
199
+ }
200
+
201
+ .content-layout.has-left-gutter:not(.has-right-gutter) .content-article {
202
+ grid-column: 2;
203
+ }
204
+
205
+ /* Right gutter only - 2 column layout */
206
+ .content-layout.has-right-gutter:not(.has-left-gutter) .content-article {
207
+ grid-column: 1;
208
+ }
209
+
210
+ .content-layout.has-right-gutter:not(.has-left-gutter) .right-gutter-container {
211
+ grid-column: 2;
212
+ }
213
+ }
214
+
215
+ /* ==========================================================================
216
+ Content Article
217
+ ========================================================================== */
218
+
219
+ .content-article {
220
+ max-width: 800px;
221
+ min-width: 0;
222
+ }
223
+
224
+ /* ==========================================================================
225
+ Content Header
226
+ ========================================================================== */
227
+
228
+ .content-header {
229
+ margin-bottom: 3rem;
230
+ padding-bottom: 2rem;
231
+ border-bottom: 2px solid #e0e0e0;
232
+ transition: border-color 0.3s ease;
233
+ }
234
+
235
+ .dark .content-header {
236
+ border-bottom: 2px solid #333;
237
+ }
238
+
239
+ .content-header h1 {
240
+ font-size: 2.5rem;
241
+ color: #2c5f2d;
242
+ margin: 0;
243
+ line-height: 1.2;
244
+ transition: color 0.3s ease;
245
+ }
246
+
247
+ .dark .content-header h1 {
248
+ color: #5cb85f;
249
+ }
250
+
251
+ /* ==========================================================================
252
+ Content Body - Scroll Offset for Headers
253
+ ========================================================================== */
254
+
255
+ /* Scroll offset to account for sticky header */
256
+ .content-body h2,
257
+ .content-body h3,
258
+ .content-body h4,
259
+ .content-body h5,
260
+ .content-body h6 {
261
+ scroll-margin-top: 5rem;
262
+ }
263
+
264
+ /* ==========================================================================
265
+ Code Block Extensions (beyond what prose provides)
266
+ ========================================================================== */
267
+
268
+ /* GitHub-style code block wrapper */
269
+ .content-body .code-block-wrapper {
270
+ margin: 1.5rem 0;
271
+ border-radius: 8px;
272
+ border: 1px solid #d0d7de;
273
+ overflow: hidden;
274
+ transition: border-color 0.3s ease;
275
+ }
276
+
277
+ .dark .content-body .code-block-wrapper {
278
+ border-color: #3a3a3a;
279
+ }
280
+
281
+ /* Rendered markdown block (for ```markdown code blocks) */
282
+ .content-body .rendered-markdown-block {
283
+ margin: 1.5rem 0;
284
+ border-radius: 8px;
285
+ border: 1px solid #d0d7de;
286
+ overflow: hidden;
287
+ transition: border-color 0.3s ease;
288
+ }
289
+
290
+ .dark .content-body .rendered-markdown-block {
291
+ border-color: #3a3a3a;
292
+ }
293
+
294
+ .content-body .rendered-markdown-header {
295
+ display: flex;
296
+ justify-content: space-between;
297
+ align-items: center;
298
+ padding: 0.5rem 1rem;
299
+ background: #f6f8fa;
300
+ border-bottom: 1px solid #d0d7de;
301
+ font-size: 0.875rem;
302
+ transition: background-color 0.3s ease, border-color 0.3s ease;
303
+ }
304
+
305
+ .dark .content-body .rendered-markdown-header {
306
+ background: #1c1c1c;
307
+ border-bottom-color: #3a3a3a;
308
+ }
309
+
310
+ .content-body .rendered-markdown-label {
311
+ color: #57606a;
312
+ font-weight: 500;
313
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
314
+ font-size: 0.75rem;
315
+ text-transform: uppercase;
316
+ letter-spacing: 0.05em;
317
+ transition: color 0.3s ease;
318
+ }
319
+
320
+ .dark .content-body .rendered-markdown-label {
321
+ color: #8b949e;
322
+ }
323
+
324
+ .content-body .rendered-markdown-content {
325
+ padding: 1rem 1.5rem;
326
+ background: #ffffff;
327
+ transition: background-color 0.3s ease;
328
+ }
329
+
330
+ .dark .content-body .rendered-markdown-content {
331
+ background: #0d1117;
332
+ }
333
+
334
+ /* Reset some styles inside rendered markdown */
335
+ .content-body .rendered-markdown-content > :first-child {
336
+ margin-top: 0;
337
+ }
338
+
339
+ .content-body .rendered-markdown-content > :last-child {
340
+ margin-bottom: 0;
341
+ }
342
+
343
+ /* Code block header with language and copy button */
344
+ .content-body .code-block-header {
345
+ display: flex;
346
+ justify-content: space-between;
347
+ align-items: center;
348
+ padding: 0.5rem 1rem;
349
+ background: #f6f8fa;
350
+ border-bottom: 1px solid #d0d7de;
351
+ font-size: 0.875rem;
352
+ transition: background-color 0.3s ease, border-color 0.3s ease;
353
+ }
354
+
355
+ .dark .content-body .code-block-header {
356
+ background: #1c1c1c;
357
+ border-bottom-color: #3a3a3a;
358
+ }
359
+
360
+ /* Language label */
361
+ .content-body .code-block-language {
362
+ color: #57606a;
363
+ font-weight: 500;
364
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
365
+ text-transform: uppercase;
366
+ font-size: 0.75rem;
367
+ letter-spacing: 0.05em;
368
+ transition: color 0.3s ease;
369
+ }
370
+
371
+ .dark .content-body .code-block-language {
372
+ color: #8b949e;
373
+ }
374
+
375
+ /* Copy button */
376
+ .content-body .code-block-copy {
377
+ display: flex;
378
+ align-items: center;
379
+ gap: 0.4rem;
380
+ background: transparent;
381
+ border: 1px solid #d0d7de;
382
+ color: #57606a;
383
+ padding: 0.35rem 0.65rem;
384
+ border-radius: 6px;
385
+ cursor: pointer;
386
+ font-size: 0.75rem;
387
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
388
+ transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
389
+ }
390
+
391
+ .dark .content-body .code-block-copy {
392
+ border-color: #3a3a3a;
393
+ color: #8b949e;
394
+ }
395
+
396
+ .content-body .code-block-copy:hover {
397
+ background: #f3f4f6;
398
+ border-color: #b8bfc6;
399
+ color: #24292f;
400
+ }
401
+
402
+ .dark .content-body .code-block-copy:hover {
403
+ background: #2a2a2a;
404
+ border-color: #4a4a4a;
405
+ color: #e0e0e0;
406
+ }
407
+
408
+ .content-body .code-block-copy:active {
409
+ background: #e1e4e8;
410
+ transform: scale(0.98);
411
+ }
412
+
413
+ .dark .content-body .code-block-copy:active {
414
+ background: #333;
415
+ }
416
+
417
+ /* Success state for copy button */
418
+ .content-body .code-block-copy.copied {
419
+ background: #dafbe1;
420
+ border-color: #2ea44f;
421
+ color: #1a7f37;
422
+ }
423
+
424
+ .dark .content-body .code-block-copy.copied {
425
+ background: #1a3a24;
426
+ border-color: #5cb85f;
427
+ color: #5cb85f;
428
+ }
429
+
430
+ .content-body .code-block-copy svg {
431
+ width: 14px;
432
+ height: 14px;
433
+ }
434
+
435
+ /* Code block pre */
436
+ .content-body .code-block-wrapper pre {
437
+ background: #ffffff;
438
+ padding: 1rem;
439
+ margin: 0;
440
+ overflow-x: auto;
441
+ transition: background-color 0.3s ease;
442
+ /* Word wrap enabled by default */
443
+ white-space: pre-wrap;
444
+ word-wrap: break-word;
445
+ overflow-wrap: break-word;
446
+ }
447
+
448
+ /* Disable word wrap with .no-wrap class on the wrapper */
449
+ .content-body .code-block-wrapper.no-wrap pre {
450
+ white-space: pre;
451
+ word-wrap: normal;
452
+ overflow-wrap: normal;
453
+ }
454
+
455
+ .dark .content-body .code-block-wrapper pre {
456
+ background: #0d1117;
457
+ }
458
+
459
+ .content-body .code-block-wrapper pre code {
460
+ background: none;
461
+ padding: 0;
462
+ color: #24292f;
463
+ font-family: 'Courier New', Consolas, Monaco, monospace;
464
+ font-size: 0.875rem;
465
+ line-height: 1.6;
466
+ transition: color 0.3s ease;
467
+ /* Inherit wrapping from pre */
468
+ white-space: inherit;
469
+ }
470
+
471
+ .dark .content-body .code-block-wrapper pre code {
472
+ color: #c9d1d9;
473
+ }
474
+
475
+ /* Scrollbar for code blocks */
476
+ .content-body .code-block-wrapper pre::-webkit-scrollbar {
477
+ height: 8px;
478
+ }
479
+
480
+ .content-body .code-block-wrapper pre::-webkit-scrollbar-track {
481
+ background: #f6f8fa;
482
+ border-radius: 0 0 8px 8px;
483
+ }
484
+
485
+ .dark .content-body .code-block-wrapper pre::-webkit-scrollbar-track {
486
+ background: #1c1c1c;
487
+ }
488
+
489
+ .content-body .code-block-wrapper pre::-webkit-scrollbar-thumb {
490
+ background: #d0d7de;
491
+ border-radius: 4px;
492
+ }
493
+
494
+ .dark .content-body .code-block-wrapper pre::-webkit-scrollbar-thumb {
495
+ background: #3a3a3a;
496
+ }
497
+
498
+ .content-body .code-block-wrapper pre::-webkit-scrollbar-thumb:hover {
499
+ background: #b8bfc6;
500
+ }
501
+
502
+ .dark .content-body .code-block-wrapper pre::-webkit-scrollbar-thumb:hover {
503
+ background: #4a4a4a;
504
+ }
505
+
506
+ /* ==========================================================================
507
+ Responsive Typography Adjustments
508
+ ========================================================================== */
509
+
510
+ @media (max-width: 768px) {
511
+ .content-header h1 {
512
+ font-size: 2rem;
513
+ }
514
+ }
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Token Bridge CSS Variables
3
+ *
4
+ * This file provides backward compatibility by mapping the original AutumnsGrove
5
+ * CSS variable names to the new shadcn HSL system. This allows existing components
6
+ * to continue working during the migration process.
7
+ *
8
+ * Usage: Import this file after app.css in +layout.svelte during migration.
9
+ * Once all components are migrated to shadcn, this file can be removed.
10
+ */
11
+
12
+ :root {
13
+ /* Primary colors - map to shadcn primary */
14
+ --color-primary: hsl(var(--primary));
15
+ --color-primary-hover: hsl(121 37% 40%);
16
+ --color-primary-light: hsl(121 37% 45%);
17
+ --color-primary-light-hover: hsl(121 37% 52%);
18
+
19
+ /* Text colors */
20
+ --color-text: hsl(var(--foreground));
21
+ --color-text-muted: hsl(var(--muted-foreground));
22
+ --color-text-subtle: hsl(0 0% 53%);
23
+
24
+ /* Background colors */
25
+ --color-bg-secondary: hsl(var(--secondary));
26
+ --color-border: hsl(var(--border));
27
+
28
+ /* Dark mode values */
29
+ --color-text-dark: hsl(var(--foreground));
30
+ --color-text-muted-dark: hsl(var(--muted-foreground));
31
+ --color-text-subtle-dark: hsl(0 0% 72%);
32
+ --color-bg-secondary-dark: hsl(0 0% 10%);
33
+ --color-bg-tertiary-dark: hsl(0 0% 16%);
34
+ --color-border-dark: hsl(var(--border));
35
+
36
+ /* Danger/Error colors */
37
+ --color-danger: hsl(var(--destructive));
38
+ --color-danger-hover: hsl(354 75% 45%);
39
+
40
+ /* Component-specific */
41
+ --mobile-menu-bg: hsl(var(--card));
42
+ --mobile-menu-border: hsl(var(--border));
43
+ --tag-bg: hsl(var(--accent));
44
+ --tag-bg-hover: hsl(270 45% 45%);
45
+
46
+ /* Border radius - map to shadcn system */
47
+ --border-radius-standard: var(--radius);
48
+ --border-radius-small: calc(var(--radius) - 4px);
49
+ --border-radius-button: calc(var(--radius) - 2px);
50
+
51
+ /* Component-specific colors for standardized dark mode */
52
+ /* Blog header */
53
+ --blog-header-title: #2c5f2d;
54
+ --blog-header-text: #666;
55
+
56
+ /* Admin actions */
57
+ --admin-indicator: #28a745;
58
+ --admin-link-text: #666;
59
+ --admin-link-hover-bg: rgba(0, 0, 0, 0.05);
60
+
61
+ /* Post viewer */
62
+ --viewer-border: #e0e0e0;
63
+ --viewer-bg: #fafafa;
64
+ --viewer-hover-shadow: rgba(44, 95, 45, 0.15);
65
+ --viewer-date-text: #888;
66
+ --viewer-content-text: #555;
67
+ --viewer-footer-border: #e8e8e8;
68
+ --viewer-tag-bg: #e8f5e9;
69
+ --viewer-caption-text: #777;
70
+ --viewer-caption-border: #ddd;
71
+
72
+ /* Light mode backgrounds and text */
73
+ --light-bg-primary: #ffffff;
74
+ --light-bg-secondary: #f9f9f9;
75
+ --light-bg-tertiary: #f5f5f5;
76
+ --light-bg-hover: rgba(0, 0, 0, 0.05);
77
+ --light-text-primary: #333;
78
+ --light-text-secondary: #555;
79
+ --light-text-tertiary: #777;
80
+ --light-text-muted: #888;
81
+ --light-text-light: #999;
82
+ --light-text-very-light: #aaa;
83
+ --light-border-primary: #e0e0e0;
84
+ --light-border-secondary: #e8e8e8;
85
+ --light-border-light: #ddd;
86
+
87
+ /* Accent colors */
88
+ --accent-success: #28a745;
89
+ --accent-success-dark: #4cae4c;
90
+ --accent-success-light: #5cb85f;
91
+ --accent-warning: #ffc107;
92
+ --accent-warning-dark: #f0ad4e;
93
+ --accent-danger: #dc3545;
94
+ --accent-danger-dark: #d73a49;
95
+ --accent-info: #17a2b8;
96
+
97
+ /* Status colors - light mode */
98
+ --status-success-bg: #e8f5e9;
99
+ --status-warning-bg: #fff3cd;
100
+ --status-danger-bg: #fdecea;
101
+ --status-info-bg: #f0f7f0;
102
+
103
+ /* Card and container backgrounds */
104
+ --card-border: #e0e0e0;
105
+
106
+ /* Specialty/Chart colors */
107
+ --chart-gray: #777;
108
+ --chart-gray-dark: #b8b8b8;
109
+ --chart-gray-light: #666;
110
+ --chart-purple: #a87ddb;
111
+ --chart-error-red: #e57373;
112
+ --chart-success-green: #39d353;
113
+ --chart-info-blue: #5865f2;
114
+ }
115
+
116
+ .dark {
117
+ /* Dark mode tag colors */
118
+ --tag-bg: hsl(270 38% 55%);
119
+ --tag-bg-hover: hsl(270 38% 49%);
120
+
121
+ /* Dark mode component-specific overrides */
122
+ /* Blog header */
123
+ --blog-header-title: #5cb85f;
124
+ --blog-header-text: var(--color-text-muted-dark);
125
+
126
+ /* Admin actions */
127
+ --admin-indicator: #5cb85f;
128
+ --admin-link-text: #a8a8a8;
129
+ --admin-link-hover-bg: rgba(255, 255, 255, 0.05);
130
+
131
+ /* Post viewer */
132
+ --viewer-border: #3a3a3a;
133
+ --viewer-bg: #1a1a1a;
134
+ --viewer-hover-shadow: rgba(92, 184, 95, 0.2);
135
+ --viewer-date-text: #a8a8a8;
136
+ --viewer-content-text: #c8c8c8;
137
+ --viewer-footer-border: #333;
138
+ --viewer-tag-bg: #1f3a1f;
139
+ --viewer-caption-text: #a0a0a0;
140
+ --viewer-caption-border: #444;
141
+
142
+ /* Dark mode backgrounds and text */
143
+ --light-bg-primary: #1a1a1a;
144
+ --light-bg-secondary: #252525;
145
+ --light-bg-tertiary: #2a2a2a;
146
+ --light-bg-hover: rgba(255, 255, 255, 0.05);
147
+ --light-text-primary: #f5f5f5;
148
+ --light-text-secondary: #d4d4d4;
149
+ --light-text-tertiary: #c0c0c0;
150
+ --light-text-muted: #a8a8a8;
151
+ --light-text-light: #909090;
152
+ --light-text-very-light: #eeeeee;
153
+ --light-border-primary: #3a3a3a;
154
+ --light-border-secondary: #333;
155
+ --light-border-light: #444;
156
+
157
+ /* Accent colors in dark mode */
158
+ --accent-success: #5cb85f;
159
+ --accent-success-dark: #4cae4c;
160
+ --accent-success-light: #7cd97f;
161
+ --accent-warning: #ffc107;
162
+ --accent-warning-dark: #f0ad4e;
163
+ --accent-danger: #ff8080;
164
+ --accent-danger-dark: #dc3545;
165
+ --accent-info: #17a2b8;
166
+
167
+ /* Status colors - dark mode */
168
+ --status-success-bg: #1f3a1f;
169
+ --status-warning-bg: #3d3520;
170
+ --status-danger-bg: #3d2020;
171
+ --status-info-bg: #1a3a1b;
172
+
173
+ /* Card and container backgrounds */
174
+ --card-border: #333;
175
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Client-side API utility with automatic CSRF token injection
3
+ * Provides fetch wrapper with security headers and error handling
4
+ */
5
+ /**
6
+ * Fetch wrapper with automatic CSRF token injection
7
+ * @param {string} url - API endpoint URL
8
+ * @param {RequestInit} options - Fetch options
9
+ * @returns {Promise<any>} Response JSON
10
+ * @throws {Error} If request fails
11
+ */
12
+ export function apiRequest(url: string, options?: RequestInit): Promise<any>;
13
+ export namespace api {
14
+ export function get(url: string, options?: RequestInit): Promise<any>;
15
+ export function post(url: string, body: any, options?: RequestInit): Promise<any>;
16
+ export function put(url: string, body: any, options?: RequestInit): Promise<any>;
17
+ export function _delete(url: string, options?: RequestInit): Promise<any>;
18
+ export { _delete as delete };
19
+ export function patch(url: string, body: any, options?: RequestInit): Promise<any>;
20
+ }