specra 0.1.14 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/LICENSE.MD +25 -4
  2. package/README.md +67 -58
  3. package/config/specra.config.schema.json +16 -0
  4. package/config/svelte-config.js +63 -0
  5. package/dist/api-parser.types.d.ts +59 -0
  6. package/dist/api-parser.types.js +5 -0
  7. package/dist/api.types.d.ts +137 -0
  8. package/dist/api.types.js +5 -0
  9. package/dist/category.d.ts +21 -0
  10. package/dist/category.js +48 -0
  11. package/dist/components/ConfigProvider.svelte +13 -0
  12. package/dist/components/ConfigProvider.svelte.d.ts +31 -0
  13. package/dist/components/docs/Accordion.svelte +18 -0
  14. package/dist/components/docs/Accordion.svelte.d.ts +10 -0
  15. package/dist/components/docs/AccordionItem.svelte +41 -0
  16. package/dist/components/docs/AccordionItem.svelte.d.ts +10 -0
  17. package/dist/components/docs/Badge.svelte +28 -0
  18. package/dist/components/docs/Badge.svelte.d.ts +9 -0
  19. package/dist/components/docs/Breadcrumb.svelte +80 -0
  20. package/dist/components/docs/Breadcrumb.svelte.d.ts +8 -0
  21. package/dist/components/docs/Callout.svelte +96 -0
  22. package/dist/components/docs/Callout.svelte.d.ts +10 -0
  23. package/dist/components/docs/Card.svelte +63 -0
  24. package/dist/components/docs/Card.svelte.d.ts +12 -0
  25. package/dist/components/docs/CardGrid.svelte +24 -0
  26. package/dist/components/docs/CardGrid.svelte.d.ts +8 -0
  27. package/dist/components/docs/CategoryIndex.svelte +110 -0
  28. package/dist/components/docs/CategoryIndex.svelte.d.ts +29 -0
  29. package/dist/components/docs/CodeBlock.svelte +172 -0
  30. package/dist/components/docs/CodeBlock.svelte.d.ts +8 -0
  31. package/dist/components/docs/Column.svelte +25 -0
  32. package/dist/components/docs/Column.svelte.d.ts +8 -0
  33. package/dist/components/docs/Columns.svelte +38 -0
  34. package/dist/components/docs/Columns.svelte.d.ts +13 -0
  35. package/dist/components/docs/DevModeBadge.svelte +15 -0
  36. package/dist/components/docs/DevModeBadge.svelte.d.ts +18 -0
  37. package/dist/components/docs/DocBadge.svelte +28 -0
  38. package/dist/components/docs/DocBadge.svelte.d.ts +9 -0
  39. package/dist/components/docs/DocLayout.svelte +107 -0
  40. package/dist/components/docs/DocLayout.svelte.d.ts +32 -0
  41. package/dist/components/docs/DocLoading.svelte +53 -0
  42. package/dist/components/docs/DocLoading.svelte.d.ts +18 -0
  43. package/dist/components/docs/DocMetadata.svelte +106 -0
  44. package/dist/components/docs/DocMetadata.svelte.d.ts +18 -0
  45. package/dist/components/docs/DocNavigation.svelte +56 -0
  46. package/dist/components/docs/DocNavigation.svelte.d.ts +12 -0
  47. package/dist/components/docs/DocTags.svelte +22 -0
  48. package/dist/components/docs/DocTags.svelte.d.ts +6 -0
  49. package/dist/components/docs/DraftBadge.svelte +10 -0
  50. package/dist/components/docs/DraftBadge.svelte.d.ts +18 -0
  51. package/dist/components/docs/Footer.svelte +72 -0
  52. package/dist/components/docs/Footer.svelte.d.ts +7 -0
  53. package/dist/components/docs/Frame.svelte +27 -0
  54. package/dist/components/docs/Frame.svelte.d.ts +9 -0
  55. package/dist/components/docs/Header.svelte +123 -0
  56. package/dist/components/docs/Header.svelte.d.ts +9 -0
  57. package/dist/components/docs/HeaderWithMenu.svelte +34 -0
  58. package/dist/components/docs/HeaderWithMenu.svelte.d.ts +17 -0
  59. package/dist/components/docs/HotReloadIndicator.svelte +44 -0
  60. package/dist/components/docs/HotReloadIndicator.svelte.d.ts +3 -0
  61. package/dist/components/docs/Icon.svelte +103 -0
  62. package/dist/components/docs/Icon.svelte.d.ts +11 -0
  63. package/dist/components/docs/Image.svelte +88 -0
  64. package/dist/components/docs/Image.svelte.d.ts +11 -0
  65. package/dist/components/docs/ImageCard.svelte +91 -0
  66. package/dist/components/docs/ImageCard.svelte.d.ts +12 -0
  67. package/dist/components/docs/ImageCardGrid.svelte +25 -0
  68. package/dist/components/docs/ImageCardGrid.svelte.d.ts +8 -0
  69. package/dist/components/docs/LayoutProviders.svelte +57 -0
  70. package/dist/components/docs/LayoutProviders.svelte.d.ts +9 -0
  71. package/dist/components/docs/Logo.svelte +25 -0
  72. package/dist/components/docs/Logo.svelte.d.ts +11 -0
  73. package/dist/components/docs/Math.svelte +54 -0
  74. package/dist/components/docs/Math.svelte.d.ts +7 -0
  75. package/dist/components/docs/MdxContent.svelte +41 -0
  76. package/dist/components/docs/MdxHotReload.svelte +78 -0
  77. package/dist/components/docs/MdxHotReload.svelte.d.ts +9 -0
  78. package/dist/components/docs/MdxLayout.svelte +16 -0
  79. package/dist/components/docs/MdxLayout.svelte.d.ts +6 -0
  80. package/dist/components/docs/Mermaid.svelte +88 -0
  81. package/dist/components/docs/Mermaid.svelte.d.ts +7 -0
  82. package/dist/components/docs/MobileDocLayout.svelte +211 -0
  83. package/dist/components/docs/MobileDocLayout.svelte.d.ts +35 -0
  84. package/dist/components/docs/MobileSidebar.svelte +122 -0
  85. package/dist/components/docs/MobileSidebar.svelte.d.ts +31 -0
  86. package/dist/components/docs/MobileSidebarWrapper.svelte +122 -0
  87. package/dist/components/docs/MobileSidebarWrapper.svelte.d.ts +32 -0
  88. package/dist/components/docs/NotFoundContent.svelte +40 -0
  89. package/dist/components/docs/NotFoundContent.svelte.d.ts +6 -0
  90. package/dist/components/docs/SearchHighlight.svelte +116 -0
  91. package/dist/components/docs/SearchHighlight.svelte.d.ts +3 -0
  92. package/dist/components/docs/SearchModal.svelte +239 -0
  93. package/dist/components/docs/SearchModal.svelte.d.ts +9 -0
  94. package/dist/components/docs/Sidebar.svelte +69 -0
  95. package/dist/components/docs/Sidebar.svelte.d.ts +31 -0
  96. package/dist/components/docs/SidebarMenuItems.svelte +344 -0
  97. package/dist/components/docs/SidebarMenuItems.svelte.d.ts +33 -0
  98. package/dist/components/docs/SidebarSkeleton.svelte +50 -0
  99. package/dist/components/docs/SidebarSkeleton.svelte.d.ts +18 -0
  100. package/dist/components/docs/SiteBanner.svelte +92 -0
  101. package/dist/components/docs/SiteBanner.svelte.d.ts +7 -0
  102. package/dist/components/docs/Step.svelte +44 -0
  103. package/dist/components/docs/Step.svelte.d.ts +8 -0
  104. package/dist/components/docs/Steps.svelte +15 -0
  105. package/dist/components/docs/Steps.svelte.d.ts +7 -0
  106. package/dist/components/docs/Tab.svelte +40 -0
  107. package/dist/components/docs/Tab.svelte.d.ts +8 -0
  108. package/dist/components/docs/TabGroups.svelte +183 -0
  109. package/dist/components/docs/TabGroups.svelte.d.ts +25 -0
  110. package/dist/components/docs/TableOfContents.svelte +100 -0
  111. package/dist/components/docs/TableOfContents.svelte.d.ts +9 -0
  112. package/dist/components/docs/Tabs.svelte +69 -0
  113. package/dist/components/docs/Tabs.svelte.d.ts +8 -0
  114. package/dist/components/docs/ThemeToggle.svelte +16 -0
  115. package/dist/components/docs/ThemeToggle.svelte.d.ts +18 -0
  116. package/dist/components/docs/Tooltip.svelte +44 -0
  117. package/dist/components/docs/Tooltip.svelte.d.ts +10 -0
  118. package/dist/components/docs/VersionSwitcher.svelte +95 -0
  119. package/dist/components/docs/VersionSwitcher.svelte.d.ts +7 -0
  120. package/dist/components/docs/Video.svelte +84 -0
  121. package/dist/components/docs/Video.svelte.d.ts +12 -0
  122. package/dist/components/docs/api/ApiEndpoint.svelte +61 -0
  123. package/dist/components/docs/api/ApiEndpoint.svelte.d.ts +11 -0
  124. package/dist/components/docs/api/ApiParams.svelte +80 -0
  125. package/dist/components/docs/api/ApiParams.svelte.d.ts +14 -0
  126. package/dist/components/docs/api/ApiPlayground.svelte +259 -0
  127. package/dist/components/docs/api/ApiPlayground.svelte.d.ts +16 -0
  128. package/dist/components/docs/api/ApiReference.svelte +278 -0
  129. package/dist/components/docs/api/ApiReference.svelte.d.ts +23 -0
  130. package/dist/components/docs/api/ApiResponse.svelte +66 -0
  131. package/dist/components/docs/api/ApiResponse.svelte.d.ts +9 -0
  132. package/dist/components/docs/api/index.d.ts +5 -0
  133. package/dist/components/docs/api/index.js +5 -0
  134. package/dist/components/docs/componentTextProps.d.ts +3 -0
  135. package/dist/components/docs/componentTextProps.js +61 -0
  136. package/dist/components/docs/index.d.ts +54 -0
  137. package/dist/components/docs/index.js +56 -0
  138. package/dist/components/global/VersionNotFound.svelte +48 -0
  139. package/dist/components/global/VersionNotFound.svelte.d.ts +7 -0
  140. package/dist/components/global/index.d.ts +1 -0
  141. package/dist/components/global/index.js +1 -0
  142. package/dist/components/index.d.ts +6 -822
  143. package/dist/components/index.js +11 -3857
  144. package/dist/components/ui/Badge.svelte +48 -0
  145. package/dist/components/ui/Badge.svelte.d.ts +15 -0
  146. package/dist/components/ui/Button.svelte +58 -0
  147. package/dist/components/ui/Button.svelte.d.ts +17 -0
  148. package/dist/components/ui/Dialog.svelte +16 -0
  149. package/dist/components/ui/Dialog.svelte.d.ts +9 -0
  150. package/dist/components/ui/DialogClose.svelte +16 -0
  151. package/dist/components/ui/DialogClose.svelte.d.ts +9 -0
  152. package/dist/components/ui/DialogContent.svelte +43 -0
  153. package/dist/components/ui/DialogContent.svelte.d.ts +10 -0
  154. package/dist/components/ui/DialogDescription.svelte +21 -0
  155. package/dist/components/ui/DialogDescription.svelte.d.ts +9 -0
  156. package/dist/components/ui/DialogFooter.svelte +20 -0
  157. package/dist/components/ui/DialogFooter.svelte.d.ts +9 -0
  158. package/dist/components/ui/DialogHeader.svelte +20 -0
  159. package/dist/components/ui/DialogHeader.svelte.d.ts +9 -0
  160. package/dist/components/ui/DialogTitle.svelte +21 -0
  161. package/dist/components/ui/DialogTitle.svelte.d.ts +9 -0
  162. package/dist/components/ui/Input.svelte +23 -0
  163. package/dist/components/ui/Input.svelte.d.ts +8 -0
  164. package/dist/components/ui/Textarea.svelte +19 -0
  165. package/dist/components/ui/Textarea.svelte.d.ts +7 -0
  166. package/dist/components/ui/index.d.ts +11 -0
  167. package/dist/components/ui/index.js +11 -0
  168. package/dist/config.d.ts +8 -0
  169. package/dist/config.js +9 -0
  170. package/dist/config.schema.json +471 -0
  171. package/dist/config.server.d.ts +46 -0
  172. package/dist/config.server.js +149 -0
  173. package/dist/{mdx-ColN3Cyg.d.mts → config.types.d.ts} +22 -75
  174. package/dist/config.types.js +39 -0
  175. package/dist/dev-utils.d.ts +29 -0
  176. package/dist/dev-utils.js +63 -0
  177. package/dist/index.d.ts +19 -4
  178. package/dist/index.js +25 -4864
  179. package/dist/mdx-cache.d.ts +41 -0
  180. package/dist/mdx-cache.js +160 -0
  181. package/dist/mdx-components.js +50 -1931
  182. package/dist/mdx-security.d.ts +76 -0
  183. package/dist/mdx-security.js +217 -0
  184. package/dist/mdx.d.ts +73 -0
  185. package/dist/mdx.js +1099 -0
  186. package/dist/middleware/index.d.ts +1 -0
  187. package/dist/middleware/index.js +2 -0
  188. package/dist/middleware/security.d.ts +22 -47
  189. package/dist/middleware/security.js +111 -137
  190. package/dist/parsers/base-parser.d.ts +14 -0
  191. package/dist/parsers/base-parser.js +1 -0
  192. package/dist/parsers/index.d.ts +16 -0
  193. package/dist/parsers/index.js +51 -0
  194. package/dist/parsers/openapi-parser.d.ts +18 -0
  195. package/dist/parsers/openapi-parser.js +209 -0
  196. package/dist/parsers/postman-parser.d.ts +20 -0
  197. package/dist/parsers/postman-parser.js +260 -0
  198. package/dist/parsers/specra-parser.d.ts +10 -0
  199. package/dist/parsers/specra-parser.js +18 -0
  200. package/dist/redirects.d.ts +12 -0
  201. package/dist/redirects.js +30 -0
  202. package/dist/remark-code-meta.d.ts +6 -0
  203. package/dist/remark-code-meta.js +21 -0
  204. package/dist/sidebar-utils.d.ts +59 -0
  205. package/dist/sidebar-utils.js +144 -0
  206. package/dist/stores/config.d.ts +20 -0
  207. package/dist/stores/config.js +45 -0
  208. package/dist/stores/index.d.ts +4 -0
  209. package/dist/stores/index.js +4 -0
  210. package/dist/stores/sidebar.d.ts +7 -0
  211. package/dist/stores/sidebar.js +12 -0
  212. package/dist/stores/tabs.d.ts +6 -0
  213. package/dist/stores/tabs.js +41 -0
  214. package/dist/stores/theme.d.ts +7 -0
  215. package/dist/stores/theme.js +75 -0
  216. package/dist/{styles.css → styles/globals.css} +136 -6
  217. package/dist/toc.d.ts +9 -0
  218. package/dist/toc.js +15 -0
  219. package/dist/utils.d.ts +13 -0
  220. package/dist/utils.js +30 -0
  221. package/package.json +47 -90
  222. package/dist/app/api/mdx-watch/route.d.mts +0 -10
  223. package/dist/app/api/mdx-watch/route.d.ts +0 -10
  224. package/dist/app/api/mdx-watch/route.js +0 -118
  225. package/dist/app/api/mdx-watch/route.js.map +0 -1
  226. package/dist/app/api/mdx-watch/route.mjs +0 -91
  227. package/dist/app/api/mdx-watch/route.mjs.map +0 -1
  228. package/dist/chunk-6S3EJVEO.mjs +0 -259
  229. package/dist/chunk-6S3EJVEO.mjs.map +0 -1
  230. package/dist/chunk-BE7EROIW.mjs +0 -212
  231. package/dist/chunk-BE7EROIW.mjs.map +0 -1
  232. package/dist/chunk-CWHRZHZO.mjs +0 -168
  233. package/dist/chunk-CWHRZHZO.mjs.map +0 -1
  234. package/dist/chunk-D5VDVYFY.mjs +0 -1325
  235. package/dist/chunk-D5VDVYFY.mjs.map +0 -1
  236. package/dist/chunk-WMCO2UX5.mjs +0 -585
  237. package/dist/chunk-WMCO2UX5.mjs.map +0 -1
  238. package/dist/chunk-XEMGCPZZ.mjs +0 -475
  239. package/dist/chunk-XEMGCPZZ.mjs.map +0 -1
  240. package/dist/components/index.d.mts +0 -822
  241. package/dist/components/index.js.map +0 -1
  242. package/dist/components/index.mjs +0 -3744
  243. package/dist/components/index.mjs.map +0 -1
  244. package/dist/index.d.mts +0 -4
  245. package/dist/index.js.map +0 -1
  246. package/dist/index.mjs +0 -1900
  247. package/dist/index.mjs.map +0 -1
  248. package/dist/layouts/index.d.mts +0 -34
  249. package/dist/layouts/index.d.ts +0 -34
  250. package/dist/layouts/index.js +0 -453
  251. package/dist/layouts/index.js.map +0 -1
  252. package/dist/layouts/index.mjs +0 -173
  253. package/dist/layouts/index.mjs.map +0 -1
  254. package/dist/lib/index.d.mts +0 -583
  255. package/dist/lib/index.d.ts +0 -583
  256. package/dist/lib/index.js +0 -1595
  257. package/dist/lib/index.js.map +0 -1
  258. package/dist/lib/index.mjs +0 -111
  259. package/dist/lib/index.mjs.map +0 -1
  260. package/dist/mdx-ColN3Cyg.d.ts +0 -352
  261. package/dist/mdx-components.d.mts +0 -86
  262. package/dist/mdx-components.d.ts +0 -86
  263. package/dist/mdx-components.js.map +0 -1
  264. package/dist/mdx-components.mjs +0 -206
  265. package/dist/mdx-components.mjs.map +0 -1
  266. package/dist/middleware/security.d.mts +0 -82
  267. package/dist/middleware/security.js.map +0 -1
  268. package/dist/middleware/security.mjs +0 -84
  269. package/dist/middleware/security.mjs.map +0 -1
  270. package/dist/styles.css.map +0 -1
  271. package/dist/styles.d.mts +0 -2
  272. package/dist/styles.d.ts +0 -2
  273. package/dist/styles.js +0 -2
  274. package/dist/styles.js.map +0 -1
  275. package/dist/styles.mjs +0 -1
  276. package/dist/styles.mjs.map +0 -1
package/LICENSE.MD CHANGED
@@ -1,6 +1,6 @@
1
- MIT License
1
+ MIT License with Branding Requirement
2
2
 
3
- Copyright (c) 2025 dalmasonto, arthur-kamau
3
+ Copyright (c) 2025-2026 dalmasonto, arthur-kamau
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -9,8 +9,29 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
9
  copies of the Software, and to permit persons to whom the Software is
10
10
  furnished to do so, subject to the following conditions:
11
11
 
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
12
+ 1. The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ 2. BRANDING / WATERMARK REQUIREMENT: All documentation sites generated using
16
+ this Software MUST display the "Powered by Specra" watermark in a visible
17
+ location (footer or equivalent) on every public-facing page. This watermark
18
+ must include the text "Powered by Specra" and link to https://specra-docs.com.
19
+
20
+ The watermark MUST NOT be removed, hidden, obscured, or made invisible by
21
+ any means (including but not limited to CSS, JavaScript, DOM manipulation,
22
+ or build-time stripping) unless the user holds an active paid subscription
23
+ (Starter tier or above) on the Specra platform (https://specra-docs.com)
24
+ that explicitly grants the right to remove Specra branding.
25
+
26
+ Removal, hiding, or circumvention of the watermark without a valid paid
27
+ subscription constitutes a COPYRIGHT VIOLATION and a breach of this license,
28
+ and may result in legal action.
29
+
30
+ 3. Users with an active paid subscription (Starter, Pro, or Enterprise) on the
31
+ Specra platform may remove the watermark by setting the appropriate
32
+ configuration option. This right is non-transferable and applies only while
33
+ the subscription remains active. If a subscription lapses or is cancelled,
34
+ the watermark must be restored.
14
35
 
15
36
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
37
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
package/README.md CHANGED
@@ -1,20 +1,20 @@
1
1
  # Specra
2
2
 
3
- A modern documentation library for Next.js that makes it easy to create beautiful, feature-rich documentation sites.
4
- To view the docs, visit [Specra Docs](https://specra.vercel.app).
3
+ A modern documentation library for SvelteKit that makes it easy to create beautiful, feature-rich documentation sites.
4
+ To view the docs, visit [Specra Docs](https://specra-docs.com).
5
5
 
6
6
  ## Features
7
7
 
8
- - 📝 **MDX Support** - Write documentation in Markdown with React components
9
- - 📚 **Multi-Version Docs** - Support multiple documentation versions seamlessly
10
- - 🔌 **API Reference Generation** - Auto-generate API docs from OpenAPI, Postman, or Specra formats
11
- - 🔍 **Full-Text Search** - Integrated MeiliSearch support for fast search
12
- - 🎯 **Tab Groups** - Organize content into multiple navigation tabs
13
- - 🌓 **Dark Mode** - Built-in theme switching with system preference detection
14
- - 🎨 **Customizable** - Highly configurable with Tailwind CSS
15
- - **Fast** - Built on Next.js with optimized performance
16
- - 📱 **Responsive** - Mobile-friendly design out of the box
17
- - 🔥 **Hot Reload** - Instant updates during development
8
+ - **MDX Support** - Write documentation in Markdown with Svelte components
9
+ - **Multi-Version Docs** - Support multiple documentation versions seamlessly
10
+ - **API Reference Generation** - Auto-generate API docs from OpenAPI, Postman, or Specra formats
11
+ - **Full-Text Search** - Integrated MeiliSearch support for fast search
12
+ - **Tab Groups** - Organize content into multiple navigation tabs
13
+ - **Dark Mode** - Built-in theme switching with system preference detection
14
+ - **Customizable** - Highly configurable with Tailwind CSS
15
+ - **Fast** - Built on SvelteKit with optimized performance
16
+ - **Responsive** - Mobile-friendly design out of the box
17
+ - **Hot Reload** - Instant updates during development
18
18
 
19
19
  ## Installation
20
20
 
@@ -28,58 +28,47 @@ pnpm add specra
28
28
 
29
29
  ## Quick Start
30
30
 
31
- ### 1. Create a new Next.js app (if you don't have one)
31
+ ### 1. Create a new SvelteKit app (if you don't have one)
32
32
 
33
33
  ```bash
34
- npx create-next-app@latest my-docs
34
+ npx create-specra my-docs
35
35
  cd my-docs
36
36
  ```
37
37
 
38
- ### 2. Install Specra
38
+ Or manually with SvelteKit:
39
39
 
40
40
  ```bash
41
+ npx sv create my-docs
42
+ cd my-docs
41
43
  npm install specra
42
44
  ```
43
45
 
44
- ### 3. Set up your app structure
46
+ ### 2. Set up your project structure
45
47
 
46
48
  ```
47
49
  my-docs/
48
- ├── app/
49
- │ ├── layout.tsx # Re-export from Specra
50
- │ ├── page.tsx # Your landing page
51
- └── docs/
52
- └── [version]/
53
- └── [...slug]/
54
- └── page.tsx # Re-export from Specra
55
- ├── docs/ # Your MDX content
50
+ ├── src/
51
+ │ ├── routes/
52
+ ├── +layout.svelte # Root layout with Specra components
53
+ │ ├── +layout.ts # Load config
54
+ │ ├── +page.svelte # Your landing page
55
+ └── docs/
56
+ └── [version]/
57
+ │ │ └── [...slug]/
58
+ │ │ ├── +page.svelte # Doc page
59
+ │ │ └── +page.ts # Load doc data
60
+ │ └── app.html
61
+ ├── docs/ # Your MDX content
56
62
  │ └── v1.0.0/
57
63
  │ └── getting-started.mdx
58
- ├── public/
64
+ ├── static/
59
65
  │ └── logo.png
60
- └── specra.config.json # Specra configuration
61
- ```
62
-
63
- ### 4. Configure app/layout.tsx
64
-
65
- ```typescript
66
- // app/layout.tsx
67
- export { default } from 'specra/app/layout'
68
- export { generateMetadata } from 'specra/app/layout'
69
- ```
70
-
71
- ### 5. Configure app/docs/[version]/[...slug]/page.tsx
72
-
73
- ```typescript
74
- // app/docs/[version]/[...slug]/page.tsx
75
- export { default } from 'specra/app/docs-page'
76
- export {
77
- generateStaticParams,
78
- generateMetadata
79
- } from 'specra/app/docs-page'
66
+ ├── specra.config.json # Specra configuration
67
+ ├── svelte.config.js
68
+ └── vite.config.ts
80
69
  ```
81
70
 
82
- ### 6. Create specra.config.json
71
+ ### 3. Configure specra.config.json
83
72
 
84
73
  ```json
85
74
  {
@@ -87,20 +76,28 @@ export {
87
76
  "title": "My Documentation",
88
77
  "description": "Awesome docs built with Specra",
89
78
  "url": "https://docs.example.com",
90
- "logo": "/logo.png"
79
+ "activeVersion": "v1.0.0"
91
80
  },
92
81
  "theme": {
93
82
  "defaultMode": "system",
94
- "primaryColor": "#0070f3"
83
+ "respectPrefersColorScheme": true
95
84
  },
96
85
  "navigation": {
97
- "sidebar": true,
98
- "breadcrumbs": true
86
+ "showSidebar": true,
87
+ "collapsibleSidebar": true,
88
+ "showBreadcrumbs": true,
89
+ "showTableOfContents": true,
90
+ "sidebarStyle": "card"
91
+ },
92
+ "features": {
93
+ "versioning": true,
94
+ "showVersionBadge": false,
95
+ "showReadingTime": true
99
96
  }
100
97
  }
101
98
  ```
102
99
 
103
- ### 7. Create your first doc
100
+ ### 4. Create your first doc
104
101
 
105
102
  ```mdx
106
103
  ---
@@ -113,9 +110,9 @@ description: Learn how to get started with our platform
113
110
  Welcome to the documentation!
114
111
  ```
115
112
 
116
- ### 8. Import globals.css
113
+ ### 5. Import globals.css
117
114
 
118
- Add to your `app/globals.css`:
115
+ Add to your root stylesheet:
119
116
 
120
117
  ```css
121
118
  @import 'specra/styles';
@@ -123,17 +120,17 @@ Add to your `app/globals.css`:
123
120
  /* Your custom styles */
124
121
  ```
125
122
 
126
- ### 9. Run development server
123
+ ### 6. Run development server
127
124
 
128
125
  ```bash
129
126
  npm run dev
130
127
  ```
131
128
 
132
- Visit `http://localhost:3000/docs/v1.0.0/getting-started` to see your docs!
129
+ Visit `http://localhost:5173/docs/v1.0.0/getting-started` to see your docs!
133
130
 
134
131
  ## Configuration
135
132
 
136
- See [Configuration Guide](https://docs.specra.dev/configuration) for full documentation.
133
+ See [Configuration Guide](https://specra-docs.com/docs) for full documentation.
137
134
 
138
135
  ## Upgrading
139
136
 
@@ -145,14 +142,26 @@ npm update specra
145
142
 
146
143
  Your content and configuration stay the same - only the SDK updates!
147
144
 
145
+ ## Specra SaaS
146
+
147
+ The official documentation site ([specra-docs](https://specra-docs.com)) also serves as a SaaS platform with paid tiers (Starter, Pro, Enterprise). It includes:
148
+ - Authentication (Auth.js with GitHub OAuth + email/password)
149
+ - Subscription billing via Stripe (USD) and M-Pesa Daraja (KES)
150
+ - User dashboard with plan management and billing history
151
+ - PostgreSQL database via Prisma v7
152
+
153
+ The SaaS layer is implemented entirely within specra-docs and does not affect the SDK itself. Users of the SDK can build free, self-hosted documentation sites without any billing features.
154
+
148
155
  ## Why Specra?
149
156
 
150
157
  Specra is designed to be the easiest way to create documentation for your projects. It handles all the complex parts (versioning, search, API references) while letting you focus on writing great content.
151
158
 
152
159
  ## License
153
160
 
154
- MIT
161
+ MIT with Branding Requirement — see [LICENSE.MD](LICENSE.MD).
162
+
163
+ All documentation sites built with Specra must display the "Powered by Specra" watermark. Removing the watermark requires an active paid subscription (Starter tier or above) at [specra-docs.com](https://specra-docs.com). Unauthorized removal of the watermark is a copyright violation.
155
164
 
156
165
  ## Authors
157
166
 
158
- dalmasonto, arthur-kamau
167
+ dalmasonto, arthur-kamau
@@ -164,6 +164,10 @@
164
164
  "description": "Show tags",
165
165
  "type": "boolean"
166
166
  },
167
+ "showVersionBadge": {
168
+ "description": "Show version badge in the sidebar",
169
+ "type": "boolean"
170
+ },
167
171
  "versioning": {
168
172
  "description": "Enable version dropdown",
169
173
  "type": "boolean"
@@ -322,6 +326,14 @@
322
326
  "description": "Whether to show table of contents",
323
327
  "type": "boolean"
324
328
  },
329
+ "sidebarStyle": {
330
+ "description": "Sidebar visual style: \"card\" (rounded container) or \"flush\" (attached to screen edge)",
331
+ "enum": [
332
+ "card",
333
+ "flush"
334
+ ],
335
+ "type": "string"
336
+ },
325
337
  "tabGroups": {
326
338
  "description": "Tab groups for organizing documentation sections",
327
339
  "items": {
@@ -451,6 +463,10 @@
451
463
  "description": "Organization or author name",
452
464
  "type": "string"
453
465
  },
466
+ "projectId": {
467
+ "description": "Project ID to tie this doc site to a Specra project for visitor tracking",
468
+ "type": "string"
469
+ },
454
470
  "projectName": {
455
471
  "description": "Project name",
456
472
  "type": "string"
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Specra SvelteKit Configuration
3
+ *
4
+ * Provides a function that returns SvelteKit-compatible configuration
5
+ * with mdsvex preprocessor and all required remark/rehype plugins.
6
+ *
7
+ * Usage in svelte.config.js:
8
+ * ```js
9
+ * import { specraConfig } from 'specra/svelte-config'
10
+ * const config = specraConfig()
11
+ * export default config
12
+ * ```
13
+ */
14
+ import { mdsvex } from 'mdsvex'
15
+ import remarkGfm from 'remark-gfm'
16
+ import remarkMath from 'remark-math'
17
+ import rehypeSlug from 'rehype-slug'
18
+ import rehypeKatex from 'rehype-katex'
19
+ import rehypeRaw from 'rehype-raw'
20
+
21
+ /**
22
+ * Get mdsvex preprocessor config with all Specra remark/rehype plugins
23
+ */
24
+ export function specraMdsvexConfig(options = {}) {
25
+ return {
26
+ extensions: ['.md', '.svx', '.mdx'],
27
+ remarkPlugins: [
28
+ remarkGfm,
29
+ remarkMath,
30
+ ...(options.remarkPlugins || [])
31
+ ],
32
+ rehypePlugins: [
33
+ rehypeSlug,
34
+ rehypeKatex,
35
+ rehypeRaw,
36
+ ...(options.rehypePlugins || [])
37
+ ],
38
+ smartypants: {
39
+ dashes: 'oldschool'
40
+ },
41
+ ...options
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Create a full SvelteKit config with Specra defaults
47
+ */
48
+ export function specraConfig(options = {}) {
49
+ const { vitePreprocess } = options.vitePreprocess || {}
50
+
51
+ return {
52
+ extensions: ['.svelte', '.md', '.svx', '.mdx'],
53
+ preprocess: [
54
+ ...(vitePreprocess ? [vitePreprocess()] : []),
55
+ mdsvex(specraMdsvexConfig(options.mdsvex || {}))
56
+ ],
57
+ kit: {
58
+ ...(options.kit || {})
59
+ }
60
+ }
61
+ }
62
+
63
+ export default specraConfig
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Simple API Documentation Format for Specra
3
+ * Easy to write, easy to parse
4
+ */
5
+ export interface ApiParam {
6
+ name: string;
7
+ type: string;
8
+ required?: boolean;
9
+ description?: string;
10
+ default?: any;
11
+ example?: any;
12
+ }
13
+ export interface ApiHeader {
14
+ name: string;
15
+ value: string;
16
+ description?: string;
17
+ }
18
+ export interface ApiResponse {
19
+ status: number;
20
+ description?: string;
21
+ example?: any;
22
+ schema?: any;
23
+ }
24
+ export interface ApiEndpointSpec {
25
+ title: string;
26
+ method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
27
+ path: string;
28
+ description?: string;
29
+ pathParams?: ApiParam[];
30
+ queryParams?: ApiParam[];
31
+ headers?: ApiHeader[];
32
+ body?: {
33
+ description?: string;
34
+ example?: any;
35
+ schema?: any;
36
+ };
37
+ successResponse?: ApiResponse;
38
+ errorResponses?: ApiResponse[];
39
+ examples?: {
40
+ title: string;
41
+ language: string;
42
+ code: string;
43
+ }[];
44
+ }
45
+ export interface SpecraApiSpec {
46
+ version?: string;
47
+ title?: string;
48
+ description?: string;
49
+ baseUrl: string;
50
+ env?: Record<string, string>;
51
+ globalHeaders?: ApiHeader[];
52
+ auth?: {
53
+ type: "bearer" | "apiKey" | "basic";
54
+ description?: string;
55
+ headerName?: string;
56
+ tokenPrefix?: string;
57
+ };
58
+ endpoints: ApiEndpointSpec[];
59
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Simple API Documentation Format for Specra
3
+ * Easy to write, easy to parse
4
+ */
5
+ export {};
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Specra API Documentation Schema
3
+ * Supports REST, GraphQL, and WebSocket APIs
4
+ */
5
+ export type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS";
6
+ export interface ApiParameter {
7
+ name: string;
8
+ type: string;
9
+ required?: boolean;
10
+ description?: string;
11
+ default?: any;
12
+ example?: any;
13
+ enum?: string[];
14
+ }
15
+ export interface ApiResponse {
16
+ status: number;
17
+ description: string;
18
+ schema?: any;
19
+ example?: any;
20
+ headers?: Record<string, string>;
21
+ }
22
+ export interface ApiExample {
23
+ title: string;
24
+ language: string;
25
+ code: string;
26
+ }
27
+ export interface ApiAuthentication {
28
+ type: "apiKey" | "bearer" | "basic" | "oauth2" | "none";
29
+ description?: string;
30
+ location?: "header" | "query" | "cookie";
31
+ name?: string;
32
+ scheme?: string;
33
+ }
34
+ export interface RestEndpoint {
35
+ type: "rest";
36
+ method: HttpMethod;
37
+ path: string;
38
+ summary: string;
39
+ description?: string;
40
+ operationId?: string;
41
+ tags?: string[];
42
+ deprecated?: boolean;
43
+ authentication?: ApiAuthentication;
44
+ pathParams?: ApiParameter[];
45
+ queryParams?: ApiParameter[];
46
+ headers?: ApiParameter[];
47
+ body?: {
48
+ contentType: string;
49
+ schema?: any;
50
+ example?: any;
51
+ description?: string;
52
+ };
53
+ responses: ApiResponse[];
54
+ examples?: ApiExample[];
55
+ }
56
+ export interface GraphQLField {
57
+ name: string;
58
+ type: string;
59
+ description?: string;
60
+ args?: ApiParameter[];
61
+ deprecated?: boolean;
62
+ deprecationReason?: string;
63
+ }
64
+ export interface GraphQLType {
65
+ name: string;
66
+ kind: "OBJECT" | "INPUT_OBJECT" | "ENUM" | "SCALAR" | "INTERFACE" | "UNION";
67
+ description?: string;
68
+ fields?: GraphQLField[];
69
+ enumValues?: {
70
+ name: string;
71
+ description?: string;
72
+ }[];
73
+ }
74
+ export interface GraphQLQuery {
75
+ type: "graphql";
76
+ operationType: "query" | "mutation" | "subscription";
77
+ name: string;
78
+ description?: string;
79
+ args?: ApiParameter[];
80
+ returnType: string;
81
+ example?: string;
82
+ response?: any;
83
+ }
84
+ export interface GraphQLSchema {
85
+ queries?: GraphQLQuery[];
86
+ mutations?: GraphQLQuery[];
87
+ subscriptions?: GraphQLQuery[];
88
+ types?: GraphQLType[];
89
+ }
90
+ export interface WebSocketEvent {
91
+ type: "websocket";
92
+ event: string;
93
+ direction: "client-to-server" | "server-to-client" | "bidirectional";
94
+ description?: string;
95
+ payload?: {
96
+ schema?: any;
97
+ example?: any;
98
+ };
99
+ response?: {
100
+ schema?: any;
101
+ example?: any;
102
+ };
103
+ }
104
+ export interface WebSocketConnection {
105
+ url: string;
106
+ authentication?: ApiAuthentication;
107
+ description?: string;
108
+ events: WebSocketEvent[];
109
+ }
110
+ export interface ApiDocumentation {
111
+ version: string;
112
+ title: string;
113
+ description?: string;
114
+ baseUrl?: string;
115
+ servers?: Array<{
116
+ url: string;
117
+ description?: string;
118
+ }>;
119
+ rest?: {
120
+ endpoints: RestEndpoint[];
121
+ };
122
+ graphql?: GraphQLSchema;
123
+ websocket?: WebSocketConnection[];
124
+ authentication?: ApiAuthentication[];
125
+ headers?: Record<string, string>;
126
+ }
127
+ export interface ApiSpecConfig {
128
+ source: "openapi" | "postman" | "insomnia" | "specra" | "manual";
129
+ path?: string;
130
+ spec?: ApiDocumentation;
131
+ autoGenerate?: boolean;
132
+ outputDir?: string;
133
+ }
134
+ export interface ParsedApiSpec {
135
+ source: ApiSpecConfig["source"];
136
+ documentation: ApiDocumentation;
137
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Specra API Documentation Schema
3
+ * Supports REST, GraphQL, and WebSocket APIs
4
+ */
5
+ export {};
@@ -0,0 +1,21 @@
1
+ export interface CategoryConfig {
2
+ label?: string;
3
+ position?: number;
4
+ sidebar_position?: number;
5
+ link?: {
6
+ type: "generated-index" | "doc";
7
+ slug?: string;
8
+ };
9
+ collapsed?: boolean;
10
+ collapsible?: boolean;
11
+ icon?: string;
12
+ tab_group?: string;
13
+ }
14
+ /**
15
+ * Read category.json from a folder
16
+ */
17
+ export declare function getCategoryConfig(folderPath: string): CategoryConfig | null;
18
+ /**
19
+ * Get all category configs for a version
20
+ */
21
+ export declare function getAllCategoryConfigs(version: string): Map<string, CategoryConfig>;
@@ -0,0 +1,48 @@
1
+ // Note: This file uses server-only APIs (fs, path) and should only be imported in Server Components
2
+ import fs from "fs";
3
+ import path from "path";
4
+ const DOCS_DIR = path.join(process.cwd(), "docs");
5
+ /**
6
+ * Read category.json from a folder
7
+ */
8
+ export function getCategoryConfig(folderPath) {
9
+ try {
10
+ const categoryPath = path.join(folderPath, "_category_.json");
11
+ if (!fs.existsSync(categoryPath)) {
12
+ return null;
13
+ }
14
+ const content = fs.readFileSync(categoryPath, "utf8");
15
+ return JSON.parse(content);
16
+ }
17
+ catch (error) {
18
+ console.error(`Error reading category config from ${folderPath}:`, error);
19
+ return null;
20
+ }
21
+ }
22
+ /**
23
+ * Get all category configs for a version
24
+ */
25
+ export function getAllCategoryConfigs(version) {
26
+ const configs = new Map();
27
+ const versionDir = path.join(DOCS_DIR, version);
28
+ if (!fs.existsSync(versionDir)) {
29
+ return configs;
30
+ }
31
+ function scanDirectory(dir, relativePath = "") {
32
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
33
+ for (const entry of entries) {
34
+ if (entry.isDirectory()) {
35
+ const fullPath = path.join(dir, entry.name);
36
+ const relPath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
37
+ const config = getCategoryConfig(fullPath);
38
+ if (config) {
39
+ configs.set(relPath, config);
40
+ }
41
+ // Recursively scan subdirectories
42
+ scanDirectory(fullPath, relPath);
43
+ }
44
+ }
45
+ }
46
+ scanDirectory(versionDir);
47
+ return configs;
48
+ }
@@ -0,0 +1,13 @@
1
+ <script lang="ts">
2
+ import { setConfigContext } from '../stores/config.js';
3
+ import type { SpecraConfig } from '../config.types.js';
4
+
5
+ interface Props {
6
+ config: SpecraConfig;
7
+ }
8
+
9
+ let { config }: Props = $props();
10
+ setConfigContext(config);
11
+ </script>
12
+
13
+ <slot />
@@ -0,0 +1,31 @@
1
+ import type { SpecraConfig } from '../config.types.js';
2
+ interface Props {
3
+ config: SpecraConfig;
4
+ }
5
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
6
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
7
+ $$bindings?: Bindings;
8
+ } & Exports;
9
+ (internal: unknown, props: Props & {
10
+ $$events?: Events;
11
+ $$slots?: Slots;
12
+ }): Exports & {
13
+ $set?: any;
14
+ $on?: any;
15
+ };
16
+ z_$$bindings?: Bindings;
17
+ }
18
+ type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
19
+ default: any;
20
+ } ? Props extends Record<string, never> ? any : {
21
+ children?: any;
22
+ } : {});
23
+ declare const ConfigProvider: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<Props, {
24
+ default: {};
25
+ }>, {
26
+ [evt: string]: CustomEvent<any>;
27
+ }, {
28
+ default: {};
29
+ }, {}, "">;
30
+ type ConfigProvider = InstanceType<typeof ConfigProvider>;
31
+ export default ConfigProvider;