@marlinjai/clearify 1.5.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 (80) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -0
  3. package/bin/clearify.js +2 -0
  4. package/dist/node/chunk-5TD7NQIW.js +25 -0
  5. package/dist/node/chunk-B2Q23JW3.js +55 -0
  6. package/dist/node/chunk-CQ4MNGBE.js +301 -0
  7. package/dist/node/chunk-GFD54GNO.js +223 -0
  8. package/dist/node/chunk-IBK35HZR.js +194 -0
  9. package/dist/node/chunk-L24ILRSX.js +125 -0
  10. package/dist/node/chunk-NXQNNLGC.js +395 -0
  11. package/dist/node/chunk-PRTER35L.js +48 -0
  12. package/dist/node/chunk-SCZZB7OE.js +9 -0
  13. package/dist/node/chunk-V7LLYIRO.js +8 -0
  14. package/dist/node/chunk-WT5W333R.js +136 -0
  15. package/dist/node/cli/index.d.ts +2 -0
  16. package/dist/node/cli/index.js +41 -0
  17. package/dist/node/core/config.d.ts +9 -0
  18. package/dist/node/core/config.js +16 -0
  19. package/dist/node/core/mermaid-renderer.d.ts +22 -0
  20. package/dist/node/core/mermaid-renderer.js +125 -0
  21. package/dist/node/core/mermaid-utils.d.ts +3 -0
  22. package/dist/node/core/mermaid-utils.js +6 -0
  23. package/dist/node/core/navigation.d.ts +2 -0
  24. package/dist/node/core/navigation.js +13 -0
  25. package/dist/node/core/openapi-parser.d.ts +14 -0
  26. package/dist/node/core/openapi-parser.js +6 -0
  27. package/dist/node/core/remark-mermaid.d.ts +10 -0
  28. package/dist/node/core/remark-mermaid.js +11 -0
  29. package/dist/node/core/search.d.ts +31 -0
  30. package/dist/node/core/search.js +6 -0
  31. package/dist/node/node/build.d.ts +3 -0
  32. package/dist/node/node/build.js +14 -0
  33. package/dist/node/node/check.d.ts +3 -0
  34. package/dist/node/node/check.js +10 -0
  35. package/dist/node/node/index.d.ts +11 -0
  36. package/dist/node/node/index.js +108 -0
  37. package/dist/node/node/init.d.ts +6 -0
  38. package/dist/node/node/init.js +6 -0
  39. package/dist/node/presets/nestjs.d.ts +15 -0
  40. package/dist/node/presets/nestjs.js +98 -0
  41. package/dist/node/types/index.d.ts +79 -0
  42. package/dist/node/types/index.js +6 -0
  43. package/dist/node/vite-plugin/index.d.ts +13 -0
  44. package/dist/node/vite-plugin/index.js +11 -0
  45. package/package.json +94 -0
  46. package/src/client/App.tsx +101 -0
  47. package/src/client/Page.tsx +15 -0
  48. package/src/client/entry-server.tsx +79 -0
  49. package/src/client/index.html +18 -0
  50. package/src/client/main.tsx +11 -0
  51. package/src/theme/CodeBlock.tsx +103 -0
  52. package/src/theme/Content.tsx +32 -0
  53. package/src/theme/Footer.tsx +53 -0
  54. package/src/theme/Head.tsx +80 -0
  55. package/src/theme/HeadContext.tsx +32 -0
  56. package/src/theme/Header.tsx +177 -0
  57. package/src/theme/Layout.tsx +44 -0
  58. package/src/theme/MDXComponents.tsx +40 -0
  59. package/src/theme/NotFound.tsx +246 -0
  60. package/src/theme/Search.tsx +359 -0
  61. package/src/theme/Sidebar.tsx +325 -0
  62. package/src/theme/TableOfContents.tsx +153 -0
  63. package/src/theme/ThemeProvider.tsx +77 -0
  64. package/src/theme/components/Accordion.tsx +109 -0
  65. package/src/theme/components/Badge.tsx +72 -0
  66. package/src/theme/components/Breadcrumbs.tsx +88 -0
  67. package/src/theme/components/Callout.tsx +115 -0
  68. package/src/theme/components/Card.tsx +103 -0
  69. package/src/theme/components/CodeGroup.tsx +79 -0
  70. package/src/theme/components/Columns.tsx +42 -0
  71. package/src/theme/components/Frame.tsx +55 -0
  72. package/src/theme/components/Mermaid.tsx +99 -0
  73. package/src/theme/components/MermaidStatic.tsx +32 -0
  74. package/src/theme/components/OpenAPI.tsx +160 -0
  75. package/src/theme/components/OpenAPIPage.tsx +16 -0
  76. package/src/theme/components/Steps.tsx +76 -0
  77. package/src/theme/components/Tabs.tsx +75 -0
  78. package/src/theme/components/Tooltip.tsx +108 -0
  79. package/src/theme/components/index.ts +14 -0
  80. package/src/theme/styles/globals.css +363 -0
@@ -0,0 +1,75 @@
1
+ import React, { useState, Children, isValidElement } from 'react';
2
+
3
+ interface TabProps {
4
+ label: string;
5
+ children: React.ReactNode;
6
+ }
7
+
8
+ export function Tab({ children }: TabProps) {
9
+ return <>{children}</>;
10
+ }
11
+
12
+ interface TabsProps {
13
+ children: React.ReactNode;
14
+ }
15
+
16
+ export function Tabs({ children }: TabsProps) {
17
+ const [active, setActive] = useState(0);
18
+ const tabs = Children.toArray(children).filter(isValidElement) as React.ReactElement<TabProps>[];
19
+
20
+ return (
21
+ <div
22
+ style={{
23
+ marginBottom: '1.25rem',
24
+ border: '1px solid var(--clearify-border)',
25
+ borderRadius: 'var(--clearify-radius)',
26
+ overflow: 'hidden',
27
+ background: 'var(--clearify-bg)',
28
+ }}
29
+ >
30
+ <div
31
+ style={{
32
+ display: 'flex',
33
+ borderBottom: '1px solid var(--clearify-border)',
34
+ backgroundColor: 'var(--clearify-bg-secondary)',
35
+ padding: '0 0.25rem',
36
+ gap: '0.125rem',
37
+ }}
38
+ >
39
+ {tabs.map((tab, i) => {
40
+ const isActive = active === i;
41
+ return (
42
+ <button
43
+ key={i}
44
+ onClick={() => setActive(i)}
45
+ style={{
46
+ padding: '0.625rem 1rem',
47
+ background: 'none',
48
+ border: 'none',
49
+ borderBottom: isActive ? '2px solid var(--clearify-primary)' : '2px solid transparent',
50
+ cursor: 'pointer',
51
+ fontSize: '0.8125rem',
52
+ fontWeight: isActive ? 600 : 400,
53
+ color: isActive ? 'var(--clearify-primary)' : 'var(--clearify-text-secondary)',
54
+ transition: 'color 0.15s, border-color 0.15s',
55
+ fontFamily: 'var(--font-sans)',
56
+ }}
57
+ className="clearify-tab-btn"
58
+ >
59
+ {tab.props.label}
60
+ </button>
61
+ );
62
+ })}
63
+ </div>
64
+ <div style={{ padding: '1.125rem' }}>
65
+ {tabs[active]}
66
+ </div>
67
+
68
+ <style>{`
69
+ .clearify-tab-btn:hover {
70
+ color: var(--clearify-text) !important;
71
+ }
72
+ `}</style>
73
+ </div>
74
+ );
75
+ }
@@ -0,0 +1,108 @@
1
+ import React from 'react';
2
+
3
+ interface TooltipProps {
4
+ children: React.ReactNode;
5
+ content: string;
6
+ position?: 'top' | 'bottom' | 'left' | 'right';
7
+ }
8
+
9
+ const positionStyles: Record<string, React.CSSProperties> = {
10
+ top: {
11
+ bottom: '100%',
12
+ left: '50%',
13
+ transform: 'translateX(-50%)',
14
+ marginBottom: '6px',
15
+ },
16
+ bottom: {
17
+ top: '100%',
18
+ left: '50%',
19
+ transform: 'translateX(-50%)',
20
+ marginTop: '6px',
21
+ },
22
+ left: {
23
+ right: '100%',
24
+ top: '50%',
25
+ transform: 'translateY(-50%)',
26
+ marginRight: '6px',
27
+ },
28
+ right: {
29
+ left: '100%',
30
+ top: '50%',
31
+ transform: 'translateY(-50%)',
32
+ marginLeft: '6px',
33
+ },
34
+ };
35
+
36
+ const arrowStyles: Record<string, React.CSSProperties> = {
37
+ top: {
38
+ bottom: '-4px',
39
+ left: '50%',
40
+ transform: 'translateX(-50%) rotate(45deg)',
41
+ },
42
+ bottom: {
43
+ top: '-4px',
44
+ left: '50%',
45
+ transform: 'translateX(-50%) rotate(45deg)',
46
+ },
47
+ left: {
48
+ right: '-4px',
49
+ top: '50%',
50
+ transform: 'translateY(-50%) rotate(45deg)',
51
+ },
52
+ right: {
53
+ left: '-4px',
54
+ top: '50%',
55
+ transform: 'translateY(-50%) rotate(45deg)',
56
+ },
57
+ };
58
+
59
+ export function Tooltip({ children, content, position = 'top' }: TooltipProps) {
60
+ return (
61
+ <span
62
+ style={{
63
+ position: 'relative',
64
+ display: 'inline-flex',
65
+ alignItems: 'center',
66
+ }}
67
+ className="clearify-tooltip-wrapper"
68
+ >
69
+ {children}
70
+ <span
71
+ className="clearify-tooltip"
72
+ style={{
73
+ position: 'absolute',
74
+ ...positionStyles[position],
75
+ padding: '0.375rem 0.625rem',
76
+ borderRadius: 'var(--clearify-radius-sm)',
77
+ fontSize: '0.75rem',
78
+ fontWeight: 500,
79
+ lineHeight: 1.4,
80
+ whiteSpace: 'nowrap',
81
+ backgroundColor: 'var(--clearify-text)',
82
+ color: 'var(--clearify-bg)',
83
+ pointerEvents: 'none',
84
+ opacity: 0,
85
+ transition: 'opacity 0.15s cubic-bezier(0.4, 0, 0.2, 1)',
86
+ zIndex: 50,
87
+ }}
88
+ >
89
+ {content}
90
+ <span
91
+ style={{
92
+ position: 'absolute',
93
+ width: '8px',
94
+ height: '8px',
95
+ backgroundColor: 'var(--clearify-text)',
96
+ ...arrowStyles[position],
97
+ }}
98
+ />
99
+ </span>
100
+
101
+ <style>{`
102
+ .clearify-tooltip-wrapper:hover .clearify-tooltip {
103
+ opacity: 1 !important;
104
+ }
105
+ `}</style>
106
+ </span>
107
+ );
108
+ }
@@ -0,0 +1,14 @@
1
+ export { Breadcrumbs } from './Breadcrumbs.js';
2
+ export { Callout } from './Callout.js';
3
+ export { Tabs, Tab } from './Tabs.js';
4
+ export { Steps, Step } from './Steps.js';
5
+ export { Card, CardGroup } from './Card.js';
6
+ export { CodeGroup } from './CodeGroup.js';
7
+ export { Mermaid } from './Mermaid.js';
8
+ export { MermaidStatic } from './MermaidStatic.js';
9
+ export { OpenAPI } from './OpenAPI.js';
10
+ export { Accordion, AccordionGroup } from './Accordion.js';
11
+ export { Badge } from './Badge.js';
12
+ export { Tooltip } from './Tooltip.js';
13
+ export { Columns, Column } from './Columns.js';
14
+ export { Frame } from './Frame.js';
@@ -0,0 +1,363 @@
1
+ @import 'tailwindcss';
2
+ @plugin '@tailwindcss/typography';
3
+
4
+ @custom-variant dark (&:where(.dark, .dark *));
5
+
6
+ @theme {
7
+ --color-primary-50: oklch(0.97 0.015 270);
8
+ --color-primary-100: oklch(0.93 0.035 270);
9
+ --color-primary-200: oklch(0.87 0.07 270);
10
+ --color-primary-300: oklch(0.78 0.12 270);
11
+ --color-primary-400: oklch(0.68 0.17 270);
12
+ --color-primary-500: oklch(0.59 0.22 270);
13
+ --color-primary-600: oklch(0.52 0.22 270);
14
+ --color-primary-700: oklch(0.45 0.20 270);
15
+ --color-primary-800: oklch(0.38 0.16 270);
16
+ --color-primary-900: oklch(0.33 0.12 270);
17
+ }
18
+
19
+ /* ─── Design tokens ─── */
20
+ :root {
21
+ --clearify-primary: #6366f1;
22
+ --clearify-primary-hover: #818cf8;
23
+ --clearify-primary-soft: rgba(99, 102, 241, 0.08);
24
+ --clearify-gradient: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #a78bfa 100%);
25
+ --clearify-gradient-subtle: linear-gradient(135deg, rgba(99, 102, 241, 0.05) 0%, rgba(139, 92, 246, 0.05) 100%);
26
+
27
+ --clearify-bg: #fafafa;
28
+ --clearify-bg-secondary: #f4f4f5;
29
+ --clearify-bg-tertiary: #e4e4e7;
30
+ --clearify-surface: rgba(255, 255, 255, 0.72);
31
+ --clearify-surface-elevated: rgba(255, 255, 255, 0.85);
32
+
33
+ --clearify-text: #18181b;
34
+ --clearify-text-secondary: #71717a;
35
+ --clearify-text-tertiary: #a1a1aa;
36
+ --clearify-border: rgba(0, 0, 0, 0.06);
37
+ --clearify-border-strong: rgba(0, 0, 0, 0.1);
38
+ --clearify-ring: rgba(99, 102, 241, 0.3);
39
+
40
+ --clearify-sidebar-width: 272px;
41
+ --clearify-toc-width: 232px;
42
+ --clearify-header-height: 60px;
43
+ --clearify-content-max: 50rem;
44
+
45
+ --clearify-radius-sm: 6px;
46
+ --clearify-radius: 10px;
47
+ --clearify-radius-lg: 14px;
48
+ --clearify-radius-xl: 20px;
49
+
50
+ --clearify-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.04);
51
+ --clearify-shadow: 0 2px 8px rgba(0, 0, 0, 0.05), 0 1px 2px rgba(0, 0, 0, 0.04);
52
+ --clearify-shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.04);
53
+ --clearify-shadow-glow: 0 0 0 1px rgba(99, 102, 241, 0.15), 0 4px 16px rgba(99, 102, 241, 0.1);
54
+
55
+ --font-sans: 'Plus Jakarta Sans', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
56
+ --font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, monospace;
57
+ }
58
+
59
+ .dark {
60
+ --clearify-primary: #818cf8;
61
+ --clearify-primary-hover: #a5b4fc;
62
+ --clearify-primary-soft: rgba(129, 140, 248, 0.1);
63
+ --clearify-gradient: linear-gradient(135deg, #818cf8 0%, #a78bfa 50%, #c4b5fd 100%);
64
+ --clearify-gradient-subtle: linear-gradient(135deg, rgba(129, 140, 248, 0.06) 0%, rgba(167, 139, 250, 0.06) 100%);
65
+
66
+ --clearify-bg: #09090b;
67
+ --clearify-bg-secondary: #18181b;
68
+ --clearify-bg-tertiary: #27272a;
69
+ --clearify-surface: rgba(24, 24, 27, 0.78);
70
+ --clearify-surface-elevated: rgba(24, 24, 27, 0.92);
71
+
72
+ --clearify-text: #fafafa;
73
+ --clearify-text-secondary: #a1a1aa;
74
+ --clearify-text-tertiary: #71717a;
75
+ --clearify-border: rgba(255, 255, 255, 0.06);
76
+ --clearify-border-strong: rgba(255, 255, 255, 0.1);
77
+ --clearify-ring: rgba(129, 140, 248, 0.35);
78
+
79
+ --clearify-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
80
+ --clearify-shadow: 0 2px 8px rgba(0, 0, 0, 0.3), 0 1px 2px rgba(0, 0, 0, 0.2);
81
+ --clearify-shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.2);
82
+ --clearify-shadow-glow: 0 0 0 1px rgba(129, 140, 248, 0.2), 0 4px 16px rgba(129, 140, 248, 0.08);
83
+ }
84
+
85
+ /* ─── Base reset ─── */
86
+ * {
87
+ box-sizing: border-box;
88
+ margin: 0;
89
+ padding: 0;
90
+ }
91
+
92
+ html {
93
+ scroll-behavior: smooth;
94
+ scroll-padding-top: calc(var(--clearify-header-height) + 1.5rem);
95
+ }
96
+
97
+ body {
98
+ font-family: var(--font-sans);
99
+ background-color: var(--clearify-bg);
100
+ color: var(--clearify-text);
101
+ line-height: 1.65;
102
+ -webkit-font-smoothing: antialiased;
103
+ -moz-osx-font-smoothing: grayscale;
104
+ font-feature-settings: 'ss01', 'ss02', 'cv01';
105
+ }
106
+
107
+ a {
108
+ color: var(--clearify-primary);
109
+ text-decoration: none;
110
+ transition: color 0.15s ease;
111
+ }
112
+
113
+ a:hover {
114
+ color: var(--clearify-primary-hover);
115
+ text-decoration: none;
116
+ }
117
+
118
+ ::selection {
119
+ background: rgba(99, 102, 241, 0.2);
120
+ color: inherit;
121
+ }
122
+
123
+ .dark ::selection {
124
+ background: rgba(129, 140, 248, 0.25);
125
+ }
126
+
127
+ /* ─── Scrollbar ─── */
128
+ ::-webkit-scrollbar {
129
+ width: 6px;
130
+ height: 6px;
131
+ }
132
+
133
+ ::-webkit-scrollbar-track {
134
+ background: transparent;
135
+ }
136
+
137
+ ::-webkit-scrollbar-thumb {
138
+ background: var(--clearify-border-strong);
139
+ border-radius: 3px;
140
+ }
141
+
142
+ ::-webkit-scrollbar-thumb:hover {
143
+ background: var(--clearify-text-tertiary);
144
+ }
145
+
146
+ /* ─── Background gradient mesh ─── */
147
+ .clearify-bg-mesh {
148
+ position: fixed;
149
+ inset: 0;
150
+ z-index: -1;
151
+ pointer-events: none;
152
+ overflow: hidden;
153
+ }
154
+
155
+ .clearify-bg-mesh::before {
156
+ content: '';
157
+ position: absolute;
158
+ top: -40%;
159
+ right: -20%;
160
+ width: 80%;
161
+ height: 80%;
162
+ border-radius: 50%;
163
+ background: radial-gradient(circle, rgba(99, 102, 241, 0.04) 0%, transparent 70%);
164
+ filter: blur(60px);
165
+ }
166
+
167
+ .clearify-bg-mesh::after {
168
+ content: '';
169
+ position: absolute;
170
+ bottom: -30%;
171
+ left: -10%;
172
+ width: 60%;
173
+ height: 60%;
174
+ border-radius: 50%;
175
+ background: radial-gradient(circle, rgba(139, 92, 246, 0.03) 0%, transparent 70%);
176
+ filter: blur(60px);
177
+ }
178
+
179
+ .dark .clearify-bg-mesh::before {
180
+ background: radial-gradient(circle, rgba(99, 102, 241, 0.06) 0%, transparent 70%);
181
+ }
182
+
183
+ .dark .clearify-bg-mesh::after {
184
+ background: radial-gradient(circle, rgba(139, 92, 246, 0.04) 0%, transparent 70%);
185
+ }
186
+
187
+ /* ─── Prose overrides for MDX content ─── */
188
+ .clearify-prose {
189
+ max-width: none;
190
+ }
191
+
192
+ .clearify-prose h1 {
193
+ font-size: 2.25rem;
194
+ font-weight: 800;
195
+ margin-bottom: 0.75rem;
196
+ line-height: 1.15;
197
+ letter-spacing: -0.035em;
198
+ color: var(--clearify-text);
199
+ }
200
+
201
+ .clearify-prose h2 {
202
+ font-size: 1.5rem;
203
+ font-weight: 700;
204
+ margin-top: 3rem;
205
+ margin-bottom: 0.75rem;
206
+ padding-bottom: 0.625rem;
207
+ letter-spacing: -0.02em;
208
+ border-bottom: 1px solid var(--clearify-border);
209
+ }
210
+
211
+ .clearify-prose h3 {
212
+ font-size: 1.25rem;
213
+ font-weight: 650;
214
+ margin-top: 2.25rem;
215
+ margin-bottom: 0.5rem;
216
+ letter-spacing: -0.015em;
217
+ }
218
+
219
+ .clearify-prose h4 {
220
+ font-size: 1.05rem;
221
+ font-weight: 600;
222
+ margin-top: 1.75rem;
223
+ margin-bottom: 0.5rem;
224
+ }
225
+
226
+ .clearify-prose p {
227
+ margin-bottom: 1.125rem;
228
+ color: var(--clearify-text-secondary);
229
+ }
230
+
231
+ .clearify-prose ul, .clearify-prose ol {
232
+ margin-bottom: 1.125rem;
233
+ padding-left: 1.5rem;
234
+ color: var(--clearify-text-secondary);
235
+ }
236
+
237
+ .clearify-prose li {
238
+ margin-bottom: 0.375rem;
239
+ }
240
+
241
+ .clearify-prose li::marker {
242
+ color: var(--clearify-text-tertiary);
243
+ }
244
+
245
+ .clearify-prose code:not(pre code) {
246
+ background-color: var(--clearify-primary-soft);
247
+ padding: 0.15rem 0.45rem;
248
+ border-radius: var(--clearify-radius-sm);
249
+ font-size: 0.85em;
250
+ font-family: var(--font-mono);
251
+ font-weight: 500;
252
+ color: var(--clearify-primary);
253
+ border: 1px solid var(--clearify-border);
254
+ }
255
+
256
+ .clearify-prose pre {
257
+ background-color: var(--clearify-bg-secondary);
258
+ border: 1px solid var(--clearify-border);
259
+ border-radius: var(--clearify-radius);
260
+ padding: 1rem 1.25rem;
261
+ overflow-x: auto;
262
+ margin-bottom: 1.25rem;
263
+ font-size: 0.8125rem;
264
+ line-height: 1.75;
265
+ font-family: var(--font-mono);
266
+ }
267
+
268
+ .clearify-prose table {
269
+ width: 100%;
270
+ border-collapse: separate;
271
+ border-spacing: 0;
272
+ margin-bottom: 1.25rem;
273
+ font-size: 0.875rem;
274
+ border-radius: var(--clearify-radius);
275
+ overflow: hidden;
276
+ border: 1px solid var(--clearify-border);
277
+ }
278
+
279
+ .clearify-prose th,
280
+ .clearify-prose td {
281
+ padding: 0.625rem 1rem;
282
+ text-align: left;
283
+ border-bottom: 1px solid var(--clearify-border);
284
+ }
285
+
286
+ .clearify-prose th {
287
+ background-color: var(--clearify-bg-secondary);
288
+ font-weight: 600;
289
+ font-size: 0.8125rem;
290
+ text-transform: uppercase;
291
+ letter-spacing: 0.03em;
292
+ color: var(--clearify-text-secondary);
293
+ }
294
+
295
+ .clearify-prose tr:last-child td {
296
+ border-bottom: none;
297
+ }
298
+
299
+ .clearify-prose strong {
300
+ font-weight: 650;
301
+ color: var(--clearify-text);
302
+ }
303
+
304
+ .clearify-prose blockquote {
305
+ border-left: 3px solid var(--clearify-primary);
306
+ padding: 0.75rem 1.25rem;
307
+ color: var(--clearify-text-secondary);
308
+ margin-bottom: 1.25rem;
309
+ background: var(--clearify-gradient-subtle);
310
+ border-radius: 0 var(--clearify-radius) var(--clearify-radius) 0;
311
+ font-style: italic;
312
+ }
313
+
314
+ .clearify-prose hr {
315
+ border: none;
316
+ border-top: 1px solid var(--clearify-border);
317
+ margin: 2.5rem 0;
318
+ }
319
+
320
+ .clearify-prose img {
321
+ max-width: 100%;
322
+ border-radius: var(--clearify-radius);
323
+ border: 1px solid var(--clearify-border);
324
+ }
325
+
326
+ /* ─── Transitions ─── */
327
+ .clearify-transition {
328
+ transition-property: color, background-color, border-color, box-shadow, opacity, transform;
329
+ transition-duration: 0.15s;
330
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
331
+ }
332
+
333
+ .clearify-transition-slow {
334
+ transition-property: color, background-color, border-color, box-shadow, opacity, transform;
335
+ transition-duration: 0.25s;
336
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
337
+ }
338
+
339
+ /* ─── Mermaid static SVG theme toggling ─── */
340
+ .clearify-mermaid-dark { display: none; }
341
+ .dark .clearify-mermaid-light { display: none; }
342
+ .dark .clearify-mermaid-dark { display: block; }
343
+
344
+ /* ─── Animation keyframes ─── */
345
+ @keyframes clearify-fade-in {
346
+ from { opacity: 0; transform: translateY(4px); }
347
+ to { opacity: 1; transform: translateY(0); }
348
+ }
349
+
350
+ @keyframes clearify-slide-in {
351
+ from { opacity: 0; transform: translateX(-8px); }
352
+ to { opacity: 1; transform: translateX(0); }
353
+ }
354
+
355
+ @keyframes clearify-scale-in {
356
+ from { opacity: 0; transform: scale(0.97); }
357
+ to { opacity: 1; transform: scale(1); }
358
+ }
359
+
360
+ @keyframes clearify-shimmer {
361
+ 0% { background-position: -200% 0; }
362
+ 100% { background-position: 200% 0; }
363
+ }