@astro-minimax/core 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 (103) hide show
  1. package/README.md +29 -0
  2. package/package.json +41 -0
  3. package/src/assets/icons/IconArchive.svg +1 -0
  4. package/src/assets/icons/IconArrowLeft.svg +1 -0
  5. package/src/assets/icons/IconArrowNarrowUp.svg +1 -0
  6. package/src/assets/icons/IconArrowRight.svg +1 -0
  7. package/src/assets/icons/IconArticle.svg +1 -0
  8. package/src/assets/icons/IconBrandX.svg +1 -0
  9. package/src/assets/icons/IconCalendar.svg +1 -0
  10. package/src/assets/icons/IconChevronLeft.svg +1 -0
  11. package/src/assets/icons/IconChevronRight.svg +1 -0
  12. package/src/assets/icons/IconEdit.svg +1 -0
  13. package/src/assets/icons/IconFacebook.svg +1 -0
  14. package/src/assets/icons/IconGitHub.svg +1 -0
  15. package/src/assets/icons/IconHash.svg +1 -0
  16. package/src/assets/icons/IconHome.svg +1 -0
  17. package/src/assets/icons/IconLinkedin.svg +1 -0
  18. package/src/assets/icons/IconMail.svg +1 -0
  19. package/src/assets/icons/IconMenuDeep.svg +1 -0
  20. package/src/assets/icons/IconMoon.svg +1 -0
  21. package/src/assets/icons/IconPinterest.svg +1 -0
  22. package/src/assets/icons/IconProject.svg +1 -0
  23. package/src/assets/icons/IconRss.svg +1 -0
  24. package/src/assets/icons/IconSearch.svg +1 -0
  25. package/src/assets/icons/IconSeries.svg +1 -0
  26. package/src/assets/icons/IconSunHigh.svg +1 -0
  27. package/src/assets/icons/IconTag.svg +1 -0
  28. package/src/assets/icons/IconTelegram.svg +1 -0
  29. package/src/assets/icons/IconUser.svg +1 -0
  30. package/src/assets/icons/IconWhatsapp.svg +1 -0
  31. package/src/assets/icons/IconX.svg +1 -0
  32. package/src/components/ai/AIChatWidget.astro +377 -0
  33. package/src/components/blog/Comments.astro +527 -0
  34. package/src/components/blog/Copyright.astro +152 -0
  35. package/src/components/blog/EditPost.astro +59 -0
  36. package/src/components/blog/FloatingTOC.astro +260 -0
  37. package/src/components/blog/InlineTOC.astro +223 -0
  38. package/src/components/blog/PostActions.astro +306 -0
  39. package/src/components/blog/RelatedPosts.astro +60 -0
  40. package/src/components/blog/SeriesNav.astro +176 -0
  41. package/src/components/blog/ShareLinks.astro +26 -0
  42. package/src/components/nav/BackButton.astro +37 -0
  43. package/src/components/nav/BackToTopButton.astro +223 -0
  44. package/src/components/nav/Breadcrumb.astro +57 -0
  45. package/src/components/nav/FloatingActions.astro +206 -0
  46. package/src/components/nav/Footer.astro +107 -0
  47. package/src/components/nav/Header.astro +252 -0
  48. package/src/components/nav/Pagination.astro +45 -0
  49. package/src/components/social/Socials.astro +19 -0
  50. package/src/components/social/Sponsors.astro +34 -0
  51. package/src/components/social/Sponsorship.astro +44 -0
  52. package/src/components/ui/Alert.astro +28 -0
  53. package/src/components/ui/Card.astro +206 -0
  54. package/src/components/ui/Collapse.astro +82 -0
  55. package/src/components/ui/ColorPreview.astro +29 -0
  56. package/src/components/ui/Datetime.astro +61 -0
  57. package/src/components/ui/GithubCard.astro +191 -0
  58. package/src/components/ui/LinkButton.astro +21 -0
  59. package/src/components/ui/Tag.astro +37 -0
  60. package/src/components/ui/TagCloud.astro +69 -0
  61. package/src/components/ui/Timeline.astro +39 -0
  62. package/src/layouts/AboutLayout.astro +24 -0
  63. package/src/layouts/Layout.astro +329 -0
  64. package/src/layouts/Main.astro +42 -0
  65. package/src/layouts/PostDetails.astro +445 -0
  66. package/src/plugins/rehype-autolink-headings.ts +46 -0
  67. package/src/plugins/rehype-external-links.ts +35 -0
  68. package/src/plugins/rehype-table-scroll.ts +35 -0
  69. package/src/plugins/remark-add-zoomable.ts +28 -0
  70. package/src/plugins/remark-reading-time.ts +18 -0
  71. package/src/plugins/shiki-transformers.ts +212 -0
  72. package/src/scripts/lightbox.ts +63 -0
  73. package/src/scripts/reading-position.ts +56 -0
  74. package/src/scripts/theme-utils.ts +19 -0
  75. package/src/scripts/theme.ts +179 -0
  76. package/src/scripts/web-vitals.ts +96 -0
  77. package/src/styles/code-blocks.css +194 -0
  78. package/src/styles/components.css +252 -0
  79. package/src/styles/global.css +403 -0
  80. package/src/styles/typography.css +149 -0
  81. package/src/types.ts +89 -0
  82. package/src/utils/generateOgImages.ts +38 -0
  83. package/src/utils/getCategoryPath.ts +23 -0
  84. package/src/utils/getPath.ts +52 -0
  85. package/src/utils/getPostsByCategory.ts +17 -0
  86. package/src/utils/getPostsByGroupCondition.ts +25 -0
  87. package/src/utils/getPostsByLang.ts +27 -0
  88. package/src/utils/getPostsByTag.ts +10 -0
  89. package/src/utils/getReadingTime.ts +33 -0
  90. package/src/utils/getRelatedPosts.ts +59 -0
  91. package/src/utils/getSeriesData.ts +57 -0
  92. package/src/utils/getSortedPosts.ts +18 -0
  93. package/src/utils/getTagsWithCount.ts +38 -0
  94. package/src/utils/getUniqueCategories.ts +81 -0
  95. package/src/utils/getUniqueTags.ts +23 -0
  96. package/src/utils/i18n.ts +249 -0
  97. package/src/utils/loadGoogleFont.ts +38 -0
  98. package/src/utils/og-templates/post.js +229 -0
  99. package/src/utils/og-templates/site.js +128 -0
  100. package/src/utils/pathUtils.ts +17 -0
  101. package/src/utils/postFilter.ts +11 -0
  102. package/src/utils/slugify.ts +23 -0
  103. package/src/utils/toc.ts +27 -0
@@ -0,0 +1,194 @@
1
+ /* ===== Code Block Container ===== */
2
+ .astro-code {
3
+ position: relative;
4
+ display: flex;
5
+ flex-direction: column;
6
+ margin-top: 0.5rem;
7
+ margin-bottom: 0.5rem;
8
+ border-radius: 0.75rem;
9
+ border: 1px solid var(--border);
10
+ overflow: hidden;
11
+ }
12
+
13
+ .astro-code pre {
14
+ margin: 0;
15
+ padding-top: 0.85rem;
16
+ padding-bottom: 0.85rem;
17
+ padding-inline: 0;
18
+ background: none !important;
19
+ overflow-x: auto;
20
+ }
21
+
22
+ .astro-code pre code {
23
+ display: block;
24
+ width: fit-content;
25
+ min-width: 100%;
26
+ min-height: 1.5rem;
27
+ counter-reset: step;
28
+ counter-increment: step 0;
29
+ }
30
+
31
+ /* ===== Line Numbers ===== */
32
+ .astro-code pre code .line {
33
+ padding-inline-end: 3rem;
34
+ }
35
+
36
+ .astro-code pre code .line::before {
37
+ content: counter(step);
38
+ counter-increment: step;
39
+ display: inline-block;
40
+ width: 3ch;
41
+ margin-right: 1.25rem;
42
+ margin-left: 0.75rem;
43
+ text-align: right;
44
+ color: var(--foreground-soft);
45
+ opacity: 0.35;
46
+ font-size: 0.8em;
47
+ }
48
+
49
+ /* ===== Title Bar ===== */
50
+ .astro-code .code-title {
51
+ font-size: 0.875rem;
52
+ color: var(--foreground-soft);
53
+ padding: 0.25rem 0.75rem;
54
+ border-bottom: 1px solid var(--border);
55
+ background: var(--muted);
56
+ border-radius: 0.75rem 0.75rem 0 0;
57
+ }
58
+
59
+ .astro-code:has(.code-title) pre {
60
+ border-radius: 0 0 0.75rem 0.75rem;
61
+ }
62
+
63
+ /* ===== Language Label ===== */
64
+ .astro-code .code-language {
65
+ position: absolute;
66
+ top: 0;
67
+ right: 0;
68
+ padding: 0.125rem 0.75rem;
69
+ font-size: 0.75rem;
70
+ color: var(--foreground-soft);
71
+ opacity: 0.6;
72
+ pointer-events: none;
73
+ transition: opacity 0.2s;
74
+ }
75
+
76
+ .astro-code:has(.code-title) .code-language {
77
+ top: auto;
78
+ bottom: 0;
79
+ }
80
+
81
+ /* ===== Copy Button ===== */
82
+ .astro-code .code-copy {
83
+ position: absolute;
84
+ top: 0.5rem;
85
+ right: 0.5rem;
86
+ z-index: 10;
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: center;
90
+ padding: 0.25rem;
91
+ border-radius: 0.5rem;
92
+ border: 1px solid var(--border);
93
+ background-color: var(--card);
94
+ color: var(--foreground-soft);
95
+ cursor: pointer;
96
+ opacity: 0;
97
+ transition:
98
+ opacity 0.2s,
99
+ background-color 0.2s,
100
+ color 0.2s;
101
+ }
102
+
103
+ .astro-code .code-copy .success {
104
+ display: none;
105
+ }
106
+
107
+ .astro-code .code-copy.copied .ready {
108
+ display: none;
109
+ }
110
+
111
+ .astro-code .code-copy.copied .success {
112
+ display: block;
113
+ color: #22c55e;
114
+ }
115
+
116
+ .astro-code:has(.code-title) .code-copy {
117
+ top: calc(0.5rem + 1.75rem);
118
+ }
119
+
120
+ .astro-code:hover .code-copy,
121
+ .astro-code:focus-within .code-copy {
122
+ opacity: 1;
123
+ }
124
+
125
+ .astro-code:hover .code-language,
126
+ .astro-code:focus-within .code-language {
127
+ opacity: 0;
128
+ }
129
+
130
+ .astro-code .code-copy:hover {
131
+ background-color: var(--muted);
132
+ color: var(--foreground);
133
+ }
134
+
135
+ /* ===== Collapse Toggle ===== */
136
+ .astro-code.collapsed pre {
137
+ max-height: 24rem;
138
+ overflow: hidden;
139
+ }
140
+
141
+ .astro-code .code-collapse-fade {
142
+ display: none;
143
+ }
144
+
145
+ .astro-code.collapsed .code-collapse-fade {
146
+ display: block;
147
+ position: absolute;
148
+ bottom: 2.5rem;
149
+ left: 0;
150
+ right: 0;
151
+ height: 4rem;
152
+ background: linear-gradient(to bottom, transparent, var(--background));
153
+ pointer-events: none;
154
+ }
155
+
156
+ .astro-code .code-collapse-toggle {
157
+ display: none;
158
+ align-items: center;
159
+ justify-content: center;
160
+ gap: 0.25rem;
161
+ width: 100%;
162
+ padding: 0.375rem;
163
+ font-size: 0.75rem;
164
+ color: var(--foreground-soft);
165
+ background: var(--muted);
166
+ border: none;
167
+ border-top: 1px solid var(--border);
168
+ cursor: pointer;
169
+ transition: background-color 0.2s;
170
+ }
171
+
172
+ .astro-code.collapsed .code-collapse-toggle {
173
+ display: flex;
174
+ }
175
+
176
+ .astro-code:not(.collapsed) .code-collapse-toggle {
177
+ display: flex;
178
+ }
179
+
180
+ .astro-code:not(.collapsed) .code-collapse-toggle svg {
181
+ transform: rotate(180deg);
182
+ }
183
+
184
+ .astro-code:not(.collapsed) .code-collapse-toggle span {
185
+ display: none;
186
+ }
187
+
188
+ .astro-code:not(.collapsed) .code-collapse-toggle::after {
189
+ content: "Collapse";
190
+ }
191
+
192
+ .astro-code .code-collapse-toggle:hover {
193
+ background: var(--card);
194
+ }
@@ -0,0 +1,252 @@
1
+ /* ===== GitHub Alerts ===== */
2
+ .markdown-alert {
3
+ padding: 0.5rem 1rem;
4
+ margin-bottom: 1rem;
5
+ border-left: 0.25em solid;
6
+ border-radius: 0.375rem;
7
+ }
8
+
9
+ .markdown-alert-title {
10
+ display: flex;
11
+ align-items: center;
12
+ font-weight: 600;
13
+ margin-bottom: 0.25rem;
14
+ }
15
+
16
+ .markdown-alert-title::before {
17
+ content: "";
18
+ display: inline-block;
19
+ width: 1em;
20
+ height: 1em;
21
+ margin-right: 0.5rem;
22
+ background-size: contain;
23
+ background-repeat: no-repeat;
24
+ }
25
+
26
+ .markdown-alert-note {
27
+ background-color: rgba(9, 105, 218, 0.1);
28
+ border-color: #0969da;
29
+ }
30
+ .markdown-alert-note .markdown-alert-title {
31
+ color: #0969da;
32
+ }
33
+ .markdown-alert-note .markdown-alert-title::before {
34
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath fill='%230969da' d='M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM7 5.5a1 1 0 1 1 2 0 1 1 0 0 1-2 0Z'/%3E%3C/svg%3E");
35
+ }
36
+
37
+ .markdown-alert-tip {
38
+ background-color: rgba(26, 127, 55, 0.1);
39
+ border-color: #1a7f37;
40
+ }
41
+ .markdown-alert-tip .markdown-alert-title {
42
+ color: #1a7f37;
43
+ }
44
+ .markdown-alert-tip .markdown-alert-title::before {
45
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath fill='%231a7f37' d='M8 1.5c-2.363 0-4 1.15-4 2.5 0 .906.75 1.75 1.875 2.281C7.063 6.813 7.5 7.375 7.5 8v.5h1V8c0-.625.438-1.188 1.125-1.719C10.75 5.75 11.5 4.906 11.5 4c0-1.35-1.637-2.5-4-2.5ZM5.5 4c0-.563.906-1.5 2.5-1.5s2.5.937 2.5 1.5c0 .375-.5.875-1.25 1.281C8.625 5.75 8 6.438 8 7.25h-.5c0-.813-.625-1.5-1.25-1.969C5.5 4.875 5 4.375 5.5 4ZM3.5 9.5a.5.5 0 0 0 0 1h9a.5.5 0 0 0 0-1h-9ZM4 11.5a.5.5 0 0 0 0 1h8a.5.5 0 0 0 0-1H4Z'/%3E%3C/svg%3E");
46
+ }
47
+
48
+ .markdown-alert-important {
49
+ background-color: rgba(130, 80, 223, 0.1);
50
+ border-color: #8250df;
51
+ }
52
+ .markdown-alert-important .markdown-alert-title {
53
+ color: #8250df;
54
+ }
55
+ .markdown-alert-important .markdown-alert-title::before {
56
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath fill='%238250df' d='M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.78a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 1.5a.75.75 0 0 1 .75.75v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 .75-.75ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z'/%3E%3C/svg%3E");
57
+ }
58
+
59
+ .markdown-alert-warning {
60
+ background-color: rgba(154, 103, 0, 0.1);
61
+ border-color: #9a6700;
62
+ }
63
+ .markdown-alert-warning .markdown-alert-title {
64
+ color: #9a6700;
65
+ }
66
+ .markdown-alert-warning .markdown-alert-title::before {
67
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath fill='%239a6700' d='M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z'/%3E%3C/svg%3E");
68
+ }
69
+
70
+ .markdown-alert-caution {
71
+ background-color: rgba(207, 34, 46, 0.1);
72
+ border-color: #cf222e;
73
+ }
74
+ .markdown-alert-caution .markdown-alert-title {
75
+ color: #cf222e;
76
+ }
77
+ .markdown-alert-caution .markdown-alert-title::before {
78
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath fill='%23cf222e' d='M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z'/%3E%3C/svg%3E");
79
+ }
80
+
81
+ /* ===== Dark Mode Alert Styles ===== */
82
+ html[data-theme="dark"] .markdown-alert {
83
+ background-color: rgba(22, 27, 34, 0.95);
84
+ }
85
+
86
+ html[data-theme="dark"] .markdown-alert,
87
+ html[data-theme="dark"] .markdown-alert p,
88
+ html[data-theme="dark"] .markdown-alert li,
89
+ html[data-theme="dark"] .markdown-alert span,
90
+ html[data-theme="dark"] .markdown-alert strong,
91
+ html[data-theme="dark"] .markdown-alert em,
92
+ html[data-theme="dark"] .markdown-alert code,
93
+ html[data-theme="dark"] .app-prose .markdown-alert p,
94
+ html[data-theme="dark"] .app-prose .markdown-alert li,
95
+ html[data-theme="dark"] .app-prose .markdown-alert span,
96
+ html[data-theme="dark"] .app-prose .markdown-alert strong {
97
+ color: #f0f6fc !important;
98
+ }
99
+
100
+ html[data-theme="dark"] .markdown-alert-note {
101
+ background-color: rgba(9, 105, 218, 0.15);
102
+ border-color: #58a6ff;
103
+ }
104
+ html[data-theme="dark"] .markdown-alert-note .markdown-alert-title {
105
+ color: #58a6ff;
106
+ }
107
+ html[data-theme="dark"] .markdown-alert-tip {
108
+ background-color: rgba(26, 127, 55, 0.15);
109
+ border-color: #3fb950;
110
+ }
111
+ html[data-theme="dark"] .markdown-alert-tip .markdown-alert-title {
112
+ color: #3fb950;
113
+ }
114
+ html[data-theme="dark"] .markdown-alert-important {
115
+ background-color: rgba(130, 80, 223, 0.15);
116
+ border-color: #a371f7;
117
+ }
118
+ html[data-theme="dark"] .markdown-alert-important .markdown-alert-title {
119
+ color: #a371f7;
120
+ }
121
+ html[data-theme="dark"] .markdown-alert-warning {
122
+ background-color: rgba(154, 103, 0, 0.15);
123
+ border-color: #d29922;
124
+ }
125
+ html[data-theme="dark"] .markdown-alert-warning .markdown-alert-title {
126
+ color: #d29922;
127
+ }
128
+ html[data-theme="dark"] .markdown-alert-caution {
129
+ background-color: rgba(207, 34, 46, 0.15);
130
+ border-color: #f85149;
131
+ }
132
+ html[data-theme="dark"] .markdown-alert-caution .markdown-alert-title {
133
+ color: #f85149;
134
+ }
135
+ html[data-theme="dark"] .markdown-alert a {
136
+ color: #58a6ff !important;
137
+ }
138
+ html[data-theme="dark"] .markdown-alert a:hover {
139
+ color: #79c0ff !important;
140
+ }
141
+ html[data-theme="dark"] .markdown-alert code {
142
+ background-color: rgba(110, 118, 129, 0.4) !important;
143
+ color: #f0f6fc !important;
144
+ }
145
+
146
+ /* ===== KaTeX Dark Mode ===== */
147
+ html[data-theme="dark"] .katex {
148
+ color: #f0f6fc;
149
+ }
150
+ html[data-theme="dark"] .katex-display {
151
+ color: #f0f6fc;
152
+ margin: 1rem 0;
153
+ overflow-x: auto;
154
+ overflow-y: hidden;
155
+ }
156
+ html[data-theme="dark"] .katex .mord,
157
+ html[data-theme="dark"] .katex .mbin,
158
+ html[data-theme="dark"] .katex .mrel,
159
+ html[data-theme="dark"] .katex .mopen,
160
+ html[data-theme="dark"] .katex .mclose,
161
+ html[data-theme="dark"] .katex .mpunct,
162
+ html[data-theme="dark"] .katex .minner,
163
+ html[data-theme="dark"] .katex .mathnormal {
164
+ color: #f0f6fc;
165
+ }
166
+ html[data-theme="dark"] .katex .frac-line,
167
+ html[data-theme="dark"] .katex .overline-line,
168
+ html[data-theme="dark"] .katex .underline-line,
169
+ html[data-theme="dark"] .katex .sqrt-line {
170
+ border-color: #f0f6fc;
171
+ }
172
+ html[data-theme="dark"] .katex .sqrt-sign,
173
+ html[data-theme="dark"] .katex .msupsub,
174
+ html[data-theme="dark"] .katex .delimsizing,
175
+ html[data-theme="dark"] .katex .nulldelimiter,
176
+ html[data-theme="dark"] .katex .col-align-c,
177
+ html[data-theme="dark"] .katex .col-align-l,
178
+ html[data-theme="dark"] .katex .col-align-r {
179
+ color: #f0f6fc;
180
+ }
181
+
182
+ /* ===== kbd ===== */
183
+ kbd {
184
+ padding: 0.125rem 0.375rem;
185
+ font-family: inherit;
186
+ font-size: 0.875em;
187
+ border-radius: 0.25rem;
188
+ border: 1px solid #d1d5db;
189
+ background-color: #f3f4f6;
190
+ box-shadow: 0 1px 0 #d1d5db;
191
+ white-space: nowrap;
192
+ }
193
+ html[data-theme="dark"] kbd {
194
+ background-color: rgba(110, 118, 129, 0.4);
195
+ color: #f0f6fc;
196
+ border-color: rgba(110, 118, 129, 0.6);
197
+ box-shadow: 0 1px 0 rgba(110, 118, 129, 0.5);
198
+ }
199
+ html[data-theme="dark"] .app-prose kbd {
200
+ background-color: rgba(110, 118, 129, 0.4) !important;
201
+ color: #f0f6fc !important;
202
+ border-color: rgba(110, 118, 129, 0.6) !important;
203
+ box-shadow: 0 1px 0 rgba(110, 118, 129, 0.5) !important;
204
+ }
205
+
206
+ /* ===== Lightbox ===== */
207
+ #lightbox-overlay {
208
+ position: fixed;
209
+ inset: 0;
210
+ z-index: 9999;
211
+ display: flex;
212
+ align-items: center;
213
+ justify-content: center;
214
+ background: rgba(0, 0, 0, 0.85);
215
+ opacity: 0;
216
+ pointer-events: none;
217
+ transition: opacity 0.25s ease;
218
+ backdrop-filter: blur(4px);
219
+ }
220
+ #lightbox-overlay.active {
221
+ opacity: 1;
222
+ pointer-events: auto;
223
+ }
224
+ #lightbox-overlay img {
225
+ max-width: 90vw;
226
+ max-height: 90vh;
227
+ object-fit: contain;
228
+ border-radius: 0.5rem;
229
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
230
+ transform: scale(0.95);
231
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
232
+ }
233
+ #lightbox-overlay.active img {
234
+ transform: scale(1);
235
+ }
236
+ .lightbox-close {
237
+ position: absolute;
238
+ top: 1rem;
239
+ right: 1.5rem;
240
+ font-size: 2rem;
241
+ color: #fff;
242
+ background: none;
243
+ border: none;
244
+ cursor: pointer;
245
+ opacity: 0.7;
246
+ transition: opacity 0.2s;
247
+ line-height: 1;
248
+ z-index: 1;
249
+ }
250
+ .lightbox-close:hover {
251
+ opacity: 1;
252
+ }