@axerity/cli 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 (186) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/axerity.default.json +135 -0
  4. package/axerity.schema.json +268 -0
  5. package/bin/axerity.js +305 -0
  6. package/mdsvex.config.js +261 -0
  7. package/package.json +103 -0
  8. package/scripts/prepare-engine.mjs +20 -0
  9. package/src/app.d.ts +17 -0
  10. package/src/app.html +39 -0
  11. package/src/content/demo/api/meta.json +5 -0
  12. package/src/content/demo/api/pet/add-pet.md +105 -0
  13. package/src/content/demo/api/pet/delete-pet.md +70 -0
  14. package/src/content/demo/api/pet/find-by-status.md +72 -0
  15. package/src/content/demo/api/pet/find-by-tags.md +64 -0
  16. package/src/content/demo/api/pet/get-pet.md +99 -0
  17. package/src/content/demo/api/pet/meta.json +15 -0
  18. package/src/content/demo/api/pet/pet-object.md +112 -0
  19. package/src/content/demo/api/pet/update-pet-with-form.md +69 -0
  20. package/src/content/demo/api/pet/update-pet.md +79 -0
  21. package/src/content/demo/api/pet/upload-image.md +79 -0
  22. package/src/content/demo/api/store/delete-order.md +62 -0
  23. package/src/content/demo/api/store/get-order.md +70 -0
  24. package/src/content/demo/api/store/inventory.md +54 -0
  25. package/src/content/demo/api/store/meta.json +5 -0
  26. package/src/content/demo/api/store/order-object.md +77 -0
  27. package/src/content/demo/api/store/place-order.md +83 -0
  28. package/src/content/demo/api/user/create-user.md +69 -0
  29. package/src/content/demo/api/user/create-with-list.md +57 -0
  30. package/src/content/demo/api/user/delete-user.md +61 -0
  31. package/src/content/demo/api/user/get-user.md +69 -0
  32. package/src/content/demo/api/user/login.md +80 -0
  33. package/src/content/demo/api/user/logout.md +45 -0
  34. package/src/content/demo/api/user/meta.json +14 -0
  35. package/src/content/demo/api/user/update-user.md +69 -0
  36. package/src/content/demo/api/user/user-object.md +85 -0
  37. package/src/content/demo/changelog.md +44 -0
  38. package/src/content/demo/components/accordion.md +70 -0
  39. package/src/content/demo/components/api.md +185 -0
  40. package/src/content/demo/components/badge.md +34 -0
  41. package/src/content/demo/components/callout.md +83 -0
  42. package/src/content/demo/components/cards.md +88 -0
  43. package/src/content/demo/components/code-group.md +55 -0
  44. package/src/content/demo/components/columns.md +42 -0
  45. package/src/content/demo/components/frame.md +51 -0
  46. package/src/content/demo/components/icon.md +54 -0
  47. package/src/content/demo/components/kbd.md +28 -0
  48. package/src/content/demo/components/meta.json +26 -0
  49. package/src/content/demo/components/roadmap.md +86 -0
  50. package/src/content/demo/components/steps.md +72 -0
  51. package/src/content/demo/components/tabs.md +146 -0
  52. package/src/content/demo/components/tooltip.md +44 -0
  53. package/src/content/demo/components/tree.md +83 -0
  54. package/src/content/demo/components/type-table.md +77 -0
  55. package/src/content/demo/components/update.md +48 -0
  56. package/src/content/demo/components/video.md +56 -0
  57. package/src/content/demo/components/webhooks.md +109 -0
  58. package/src/content/demo/components/websockets.md +101 -0
  59. package/src/content/demo/configuration/ai.md +40 -0
  60. package/src/content/demo/configuration/cli.md +46 -0
  61. package/src/content/demo/configuration/deployment.md +105 -0
  62. package/src/content/demo/configuration/index.md +92 -0
  63. package/src/content/demo/configuration/layouts.md +51 -0
  64. package/src/content/demo/configuration/meta.json +5 -0
  65. package/src/content/demo/configuration/navigation.md +167 -0
  66. package/src/content/demo/configuration/openapi.md +103 -0
  67. package/src/content/demo/configuration/search.md +36 -0
  68. package/src/content/demo/index.md +59 -0
  69. package/src/content/demo/installation.md +49 -0
  70. package/src/content/demo/meta.json +15 -0
  71. package/src/content/demo/quick-start.md +47 -0
  72. package/src/content/demo/theming/advanced.md +116 -0
  73. package/src/content/demo/theming/code.md +66 -0
  74. package/src/content/demo/theming/colors.md +103 -0
  75. package/src/content/demo/theming/index.md +88 -0
  76. package/src/content/demo/theming/layout.md +71 -0
  77. package/src/content/demo/theming/meta.json +5 -0
  78. package/src/content/demo/theming/themes.md +99 -0
  79. package/src/content/demo/theming/typography.md +83 -0
  80. package/src/content/demo/writing/code-blocks.md +154 -0
  81. package/src/content/demo/writing/diagrams.md +44 -0
  82. package/src/content/demo/writing/frontmatter.md +33 -0
  83. package/src/content/demo/writing/markdown.md +62 -0
  84. package/src/content/demo/writing/meta.json +5 -0
  85. package/src/hooks.server.ts +49 -0
  86. package/src/lib/assets/favicon.svg +1 -0
  87. package/src/lib/base.ts +12 -0
  88. package/src/lib/components/DynamicIcon.svelte +26 -0
  89. package/src/lib/components/docs/Analytics.svelte +38 -0
  90. package/src/lib/components/docs/Banner.svelte +44 -0
  91. package/src/lib/components/docs/Breadcrumbs.svelte +38 -0
  92. package/src/lib/components/docs/CopyPageMenu.svelte +119 -0
  93. package/src/lib/components/docs/DocsLayout.svelte +192 -0
  94. package/src/lib/components/docs/Footer.svelte +60 -0
  95. package/src/lib/components/docs/Mermaid.svelte +39 -0
  96. package/src/lib/components/docs/Navbar.svelte +144 -0
  97. package/src/lib/components/docs/PageMeta.svelte +35 -0
  98. package/src/lib/components/docs/PageNav.svelte +44 -0
  99. package/src/lib/components/docs/SearchDialog.svelte +182 -0
  100. package/src/lib/components/docs/Sidebar.svelte +85 -0
  101. package/src/lib/components/docs/SidebarDropdown.svelte +56 -0
  102. package/src/lib/components/docs/SidebarFooterLinks.svelte +19 -0
  103. package/src/lib/components/docs/SidebarGroup.svelte +54 -0
  104. package/src/lib/components/docs/SidebarLink.svelte +67 -0
  105. package/src/lib/components/docs/TableOfContents.svelte +77 -0
  106. package/src/lib/components/docs/ThemeToggle.svelte +19 -0
  107. package/src/lib/components/docs/VersionSwitcher.svelte +80 -0
  108. package/src/lib/components/kit/Accordion.svelte +60 -0
  109. package/src/lib/components/kit/AccordionGroup.svelte +13 -0
  110. package/src/lib/components/kit/Badge.svelte +32 -0
  111. package/src/lib/components/kit/Callout.svelte +51 -0
  112. package/src/lib/components/kit/Card.svelte +72 -0
  113. package/src/lib/components/kit/CardGroup.svelte +21 -0
  114. package/src/lib/components/kit/CodeGroup.svelte +65 -0
  115. package/src/lib/components/kit/Columns.svelte +26 -0
  116. package/src/lib/components/kit/Event.svelte +23 -0
  117. package/src/lib/components/kit/EventList.svelte +9 -0
  118. package/src/lib/components/kit/File.svelte +15 -0
  119. package/src/lib/components/kit/Folder.svelte +46 -0
  120. package/src/lib/components/kit/Frame.svelte +81 -0
  121. package/src/lib/components/kit/Icon.svelte +17 -0
  122. package/src/lib/components/kit/Kbd.svelte +11 -0
  123. package/src/lib/components/kit/Roadmap.svelte +15 -0
  124. package/src/lib/components/kit/RoadmapItem.svelte +109 -0
  125. package/src/lib/components/kit/Step.svelte +63 -0
  126. package/src/lib/components/kit/Steps.svelte +16 -0
  127. package/src/lib/components/kit/Tab.svelte +27 -0
  128. package/src/lib/components/kit/Tabs.svelte +75 -0
  129. package/src/lib/components/kit/Tooltip.svelte +33 -0
  130. package/src/lib/components/kit/Tree.svelte +11 -0
  131. package/src/lib/components/kit/TypeTable.svelte +187 -0
  132. package/src/lib/components/kit/Update.svelte +32 -0
  133. package/src/lib/components/kit/Video.svelte +64 -0
  134. package/src/lib/components/kit/accordion-context.ts +1 -0
  135. package/src/lib/components/kit/api/Api.svelte +80 -0
  136. package/src/lib/components/kit/api/ApiExamplePanel.svelte +100 -0
  137. package/src/lib/components/kit/api/ApiField.svelte +124 -0
  138. package/src/lib/components/kit/api/Channel.svelte +121 -0
  139. package/src/lib/components/kit/api/Endpoint.svelte +116 -0
  140. package/src/lib/components/kit/api/Enum.svelte +44 -0
  141. package/src/lib/components/kit/api/EnumValues.svelte +35 -0
  142. package/src/lib/components/kit/api/Expandable.svelte +70 -0
  143. package/src/lib/components/kit/api/Message.svelte +67 -0
  144. package/src/lib/components/kit/api/ObjectExample.svelte +11 -0
  145. package/src/lib/components/kit/api/RequestExample.svelte +11 -0
  146. package/src/lib/components/kit/api/ResponseExample.svelte +11 -0
  147. package/src/lib/components/kit/api/Webhook.svelte +115 -0
  148. package/src/lib/components/kit/api/api-context.ts +15 -0
  149. package/src/lib/components/kit/tabs-context.ts +8 -0
  150. package/src/lib/components/kit/tabs-store.svelte.ts +28 -0
  151. package/src/lib/config/site.ts +34 -0
  152. package/src/lib/content/index.ts +50 -0
  153. package/src/lib/content/raw.ts +21 -0
  154. package/src/lib/content/tree.ts +169 -0
  155. package/src/lib/index.ts +79 -0
  156. package/src/lib/nav-match.ts +23 -0
  157. package/src/lib/openapi/generate.ts +629 -0
  158. package/src/lib/server/og.ts +140 -0
  159. package/src/lib/state/search.svelte.ts +9 -0
  160. package/src/lib/state/theme.svelte.ts +58 -0
  161. package/src/lib/types.ts +216 -0
  162. package/src/params/docpage.ts +3 -0
  163. package/src/params/mdfile.ts +3 -0
  164. package/src/routes/+error.svelte +46 -0
  165. package/src/routes/+layout.svelte +25 -0
  166. package/src/routes/[...path=mdfile]/+server.ts +21 -0
  167. package/src/routes/[...slug=docpage]/+page.svelte +63 -0
  168. package/src/routes/[...slug=docpage]/+page.ts +44 -0
  169. package/src/routes/layout.css +897 -0
  170. package/src/routes/llms-full.txt/+server.ts +22 -0
  171. package/src/routes/llms.txt/+server.ts +20 -0
  172. package/src/routes/og/[...slug]/+server.ts +77 -0
  173. package/src/routes/rss.xml/+server.ts +65 -0
  174. package/src/routes/search.json/+server.ts +54 -0
  175. package/src/routes/sitemap.xml/+server.ts +21 -0
  176. package/static/favicon-dark.svg +6 -0
  177. package/static/favicon-light.svg +6 -0
  178. package/static/favicon.svg +14 -0
  179. package/static/fonts/geist-400.ttf +0 -0
  180. package/static/fonts/geist-600.ttf +0 -0
  181. package/static/fonts/geist-700.ttf +0 -0
  182. package/static/og-image.png +0 -0
  183. package/static/robots.txt +4 -0
  184. package/svelte.config.js +35 -0
  185. package/tsconfig.json +20 -0
  186. package/vite.config.ts +46 -0
@@ -0,0 +1,124 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import { withBase } from '$lib/base';
4
+
5
+ let {
6
+ name,
7
+ type,
8
+ typeLink,
9
+ required = false,
10
+ deprecated = false,
11
+ default: defaultValue,
12
+ children
13
+ }: {
14
+ name: string;
15
+ type?: string;
16
+ typeLink?: string;
17
+ required?: boolean;
18
+ deprecated?: boolean;
19
+ default?: string;
20
+ children?: Snippet;
21
+ } = $props();
22
+ </script>
23
+
24
+ <div class="field">
25
+ <div class="field-head">
26
+ <code class="field-name" class:field-deprecated={deprecated}>{name}</code>
27
+ {#if type}
28
+ {#if typeLink}
29
+ <a class="field-type field-type-link" href={withBase(typeLink)}>{type}</a>
30
+ {:else}
31
+ <span class="field-type">{type}</span>
32
+ {/if}
33
+ {/if}
34
+ {#if required}
35
+ <span class="field-flag field-required">required</span>
36
+ {/if}
37
+ {#if deprecated}
38
+ <span class="field-flag">deprecated</span>
39
+ {/if}
40
+ {#if defaultValue !== undefined}
41
+ <span class="field-default">default: <code>{defaultValue}</code></span>
42
+ {/if}
43
+ </div>
44
+ {#if children}
45
+ <div class="field-desc">
46
+ {@render children()}
47
+ </div>
48
+ {/if}
49
+ </div>
50
+
51
+ <style>
52
+ .field {
53
+ padding: 0.7rem 0;
54
+ border-top: 1px solid var(--border);
55
+ }
56
+ .field:last-of-type {
57
+ border-bottom: 1px solid var(--border);
58
+ }
59
+
60
+ .field-head {
61
+ display: flex;
62
+ flex-wrap: wrap;
63
+ align-items: baseline;
64
+ gap: 0.5rem;
65
+ }
66
+
67
+ .field-name {
68
+ font-family: var(--font-mono);
69
+ font-size: 0.85rem;
70
+ font-weight: 600;
71
+ color: var(--fg);
72
+ }
73
+ .field-deprecated {
74
+ text-decoration: line-through;
75
+ opacity: 0.7;
76
+ }
77
+
78
+ .field-type {
79
+ font-family: var(--font-mono);
80
+ font-size: 0.8rem;
81
+ color: var(--fg-muted);
82
+ }
83
+ .field-type-link {
84
+ color: var(--accent);
85
+ text-decoration: underline;
86
+ text-underline-offset: 2px;
87
+ }
88
+
89
+ .field-flag {
90
+ padding: 0.05rem 0.4rem;
91
+ border-radius: 9999px;
92
+ font-size: 0.62rem;
93
+ font-weight: 600;
94
+ text-transform: uppercase;
95
+ letter-spacing: 0.03em;
96
+ color: var(--fg-subtle);
97
+ background-color: var(--bg-subtle);
98
+ }
99
+ .field-required {
100
+ color: oklch(0.62 0.21 25);
101
+ background-color: color-mix(in oklch, oklch(0.62 0.21 25) 14%, transparent);
102
+ }
103
+
104
+ .field-default {
105
+ font-size: 0.78rem;
106
+ color: var(--fg-subtle);
107
+ }
108
+ .field-default code {
109
+ font-family: var(--font-mono);
110
+ }
111
+
112
+ .field-desc {
113
+ margin-top: 0.4rem;
114
+ font-size: 0.9rem;
115
+ line-height: 1.6;
116
+ color: var(--fg-muted);
117
+ }
118
+ .field-desc :global(> :first-child) {
119
+ margin-top: 0;
120
+ }
121
+ .field-desc :global(> :last-child) {
122
+ margin-bottom: 0;
123
+ }
124
+ </style>
@@ -0,0 +1,121 @@
1
+ <script lang="ts">
2
+ import { setContext } from 'svelte';
3
+ import type { Snippet } from 'svelte';
4
+ import { API, type ApiContext, type ApiExampleEntry } from './api-context';
5
+ import ApiExamplePanel from './ApiExamplePanel.svelte';
6
+
7
+ let {
8
+ address,
9
+ protocol = 'ws',
10
+ server,
11
+ description,
12
+ children
13
+ }: {
14
+ address: string;
15
+ protocol?: string;
16
+ server?: string;
17
+ description?: string;
18
+ children: Snippet;
19
+ } = $props();
20
+
21
+ const examples = $state<ApiExampleEntry[]>([]);
22
+ let counter = 0;
23
+
24
+ const objects = $derived(examples.filter((example) => example.kind === 'object'));
25
+ const messages = $derived(examples.filter((example) => example.kind !== 'object'));
26
+
27
+ const url = $derived((server ? server.replace(/\/$/, '') : '') + address);
28
+
29
+ setContext<ApiContext>(API, {
30
+ registerExample(entry) {
31
+ const id = counter++;
32
+ examples.push({ ...entry, id });
33
+ return id;
34
+ },
35
+ unregisterExample(id) {
36
+ const index = examples.findIndex((example) => example.id === id);
37
+ if (index !== -1) examples.splice(index, 1);
38
+ }
39
+ });
40
+ </script>
41
+
42
+ <div class="api">
43
+ <div class="api-main">
44
+ <div class="channel-head">
45
+ <span class="channel-protocol">{protocol.toUpperCase()}</span>
46
+ <code class="channel-address">{url}</code>
47
+ </div>
48
+ {#if description}
49
+ <p class="channel-sub">{description}</p>
50
+ {/if}
51
+ {@render children()}
52
+ </div>
53
+
54
+ <div class="api-rail">
55
+ <div class="api-rail-sticky">
56
+ {#each objects as object (object.id)}
57
+ <ApiExamplePanel label={object.title} entries={[object]} />
58
+ {/each}
59
+ <ApiExamplePanel label="Messages" entries={messages} />
60
+ </div>
61
+ </div>
62
+ </div>
63
+
64
+ <style>
65
+ .api {
66
+ display: grid;
67
+ grid-template-columns: minmax(0, 1fr);
68
+ gap: 2rem;
69
+ }
70
+ @media (min-width: 1024px) {
71
+ .api {
72
+ grid-template-columns: minmax(0, 1fr) 28rem;
73
+ gap: 2.5rem;
74
+ align-items: start;
75
+ }
76
+ }
77
+ .api-main :global(h2) {
78
+ margin-top: 1.75rem;
79
+ font-size: 1.2rem;
80
+ }
81
+
82
+ .channel-head {
83
+ display: flex;
84
+ align-items: center;
85
+ gap: 0.625rem;
86
+ margin-bottom: 0.5rem;
87
+ }
88
+ .channel-protocol {
89
+ flex-shrink: 0;
90
+ border-radius: var(--radius-md);
91
+ background-color: color-mix(in oklab, var(--accent) 14%, transparent);
92
+ padding: 0.15rem 0.5rem;
93
+ font-family: var(--font-mono);
94
+ font-size: 0.7rem;
95
+ font-weight: 700;
96
+ letter-spacing: 0.02em;
97
+ color: var(--accent);
98
+ }
99
+ .channel-address {
100
+ font-family: var(--font-mono);
101
+ font-size: 1.05rem;
102
+ font-weight: 600;
103
+ color: var(--fg);
104
+ }
105
+ .channel-sub {
106
+ margin-top: 0;
107
+ color: var(--fg-muted);
108
+ }
109
+
110
+ .api-rail-sticky {
111
+ display: flex;
112
+ flex-direction: column;
113
+ gap: 1rem;
114
+ }
115
+ @media (min-width: 1024px) {
116
+ .api-rail-sticky {
117
+ position: sticky;
118
+ top: calc(var(--spacing-header) + 1.5rem);
119
+ }
120
+ }
121
+ </style>
@@ -0,0 +1,116 @@
1
+ <script lang="ts">
2
+ import Copy from '@lucide/svelte/icons/copy';
3
+ import Check from '@lucide/svelte/icons/check';
4
+
5
+ let {
6
+ method = 'GET',
7
+ path,
8
+ baseUrl = ''
9
+ }: { method?: string; path: string; baseUrl?: string } = $props();
10
+
11
+ const upper = $derived(method.toUpperCase());
12
+
13
+ const segments = $derived(path.split(/(\{[^}]+\})/).filter(Boolean));
14
+
15
+ let copied = $state(false);
16
+ async function copy() {
17
+ try {
18
+ await navigator.clipboard.writeText(baseUrl + path);
19
+ copied = true;
20
+ setTimeout(() => (copied = false), 1500);
21
+ } catch {
22
+ copied = false;
23
+ }
24
+ }
25
+ </script>
26
+
27
+ <div class="endpoint">
28
+ <span class="endpoint-method" data-method={upper}>{upper}</span>
29
+ <code class="endpoint-path">
30
+ {#if baseUrl}<span class="endpoint-base">{baseUrl}</span
31
+ >{/if}{#each segments as segment (segment)}{#if /^\{.*\}$/.test(segment)}<span
32
+ class="endpoint-param">{segment}</span
33
+ >{:else}{segment}{/if}{/each}
34
+ </code>
35
+ <button type="button" class="endpoint-copy" onclick={copy} aria-label="Copy endpoint URL">
36
+ {#if copied}
37
+ <Check size={15} />
38
+ {:else}
39
+ <Copy size={15} />
40
+ {/if}
41
+ </button>
42
+ </div>
43
+
44
+ <style>
45
+ .endpoint {
46
+ display: flex;
47
+ align-items: center;
48
+ gap: 0.65rem;
49
+ margin: 1.25rem 0;
50
+ padding: 0.55rem 0.65rem 0.55rem 0.75rem;
51
+ border: 1px solid var(--border);
52
+ border-radius: 0.5rem;
53
+ background-color: var(--bg-subtle);
54
+ }
55
+
56
+ .endpoint-method {
57
+ flex-shrink: 0;
58
+ padding: 0.15rem 0.5rem;
59
+ border-radius: 0.3rem;
60
+ font-family: var(--font-mono);
61
+ font-size: 0.72rem;
62
+ font-weight: 700;
63
+ letter-spacing: 0.02em;
64
+ color: var(--m);
65
+ background-color: color-mix(in oklch, var(--m) 15%, transparent);
66
+ }
67
+ .endpoint-method[data-method='GET'] {
68
+ --m: oklch(0.6 0.15 155);
69
+ }
70
+ .endpoint-method[data-method='POST'] {
71
+ --m: oklch(0.6 0.16 250);
72
+ }
73
+ .endpoint-method[data-method='PUT'] {
74
+ --m: oklch(0.68 0.15 75);
75
+ }
76
+ .endpoint-method[data-method='PATCH'] {
77
+ --m: oklch(0.62 0.19 300);
78
+ }
79
+ .endpoint-method[data-method='DELETE'] {
80
+ --m: oklch(0.62 0.21 25);
81
+ }
82
+
83
+ .endpoint-path {
84
+ flex: 1;
85
+ overflow-x: auto;
86
+ font-family: var(--font-mono);
87
+ font-size: 0.85rem;
88
+ color: var(--fg);
89
+ white-space: nowrap;
90
+ }
91
+ .endpoint-base {
92
+ color: var(--fg-subtle);
93
+ }
94
+ .endpoint-param {
95
+ color: var(--accent);
96
+ }
97
+
98
+ .endpoint-copy {
99
+ display: inline-flex;
100
+ flex-shrink: 0;
101
+ align-items: center;
102
+ justify-content: center;
103
+ width: 1.85rem;
104
+ height: 1.85rem;
105
+ border-radius: 0.375rem;
106
+ color: var(--fg-subtle);
107
+ cursor: pointer;
108
+ transition:
109
+ color 0.15s,
110
+ background-color 0.15s;
111
+ }
112
+ .endpoint-copy:hover {
113
+ color: var(--fg);
114
+ background-color: var(--surface);
115
+ }
116
+ </style>
@@ -0,0 +1,44 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ let { value, children }: { value: string; children?: Snippet } = $props();
5
+ </script>
6
+
7
+ <div class="enum-item">
8
+ <code class="enum-pill">{value}</code>
9
+ {#if children}
10
+ <div class="enum-desc">
11
+ {@render children()}
12
+ </div>
13
+ {/if}
14
+ </div>
15
+
16
+ <style>
17
+ .enum-item {
18
+ padding: 0.6rem 0;
19
+ }
20
+
21
+ .enum-pill {
22
+ display: inline-block;
23
+ padding: 0.1rem 0.45rem;
24
+ border: 1px solid var(--border);
25
+ border-radius: 0.3rem;
26
+ background-color: var(--surface);
27
+ font-family: var(--font-mono);
28
+ font-size: 0.8rem;
29
+ color: var(--fg);
30
+ }
31
+
32
+ .enum-desc {
33
+ margin-top: 0.35rem;
34
+ font-size: 0.85rem;
35
+ line-height: 1.5;
36
+ color: var(--fg-muted);
37
+ }
38
+ .enum-desc :global(> :first-child) {
39
+ margin-top: 0;
40
+ }
41
+ .enum-desc :global(> :last-child) {
42
+ margin-bottom: 0;
43
+ }
44
+ </style>
@@ -0,0 +1,35 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ let { title = 'Possible enum values', children }: { title?: string; children: Snippet } =
5
+ $props();
6
+ </script>
7
+
8
+ <div class="enum">
9
+ <div class="enum-head">{title}</div>
10
+ <div class="enum-body">
11
+ {@render children()}
12
+ </div>
13
+ </div>
14
+
15
+ <style>
16
+ .enum {
17
+ margin: 0.75rem 0;
18
+ border: 1px solid var(--border);
19
+ border-radius: 0.5rem;
20
+ background-color: var(--bg-subtle);
21
+ }
22
+ .enum-head {
23
+ padding: 0.55rem 0.85rem;
24
+ border-bottom: 1px solid var(--border);
25
+ font-size: 0.78rem;
26
+ font-weight: 600;
27
+ color: var(--fg-muted);
28
+ }
29
+ .enum-body {
30
+ padding: 0.25rem 0.85rem;
31
+ }
32
+ .enum-body > :global(.enum-item:not(:first-child)) {
33
+ border-top: 1px solid var(--border);
34
+ }
35
+ </style>
@@ -0,0 +1,70 @@
1
+ <script lang="ts">
2
+ import { untrack } from 'svelte';
3
+ import type { Snippet } from 'svelte';
4
+ import { slide } from 'svelte/transition';
5
+ import Plus from '@lucide/svelte/icons/plus';
6
+ import Minus from '@lucide/svelte/icons/minus';
7
+
8
+ let {
9
+ title = 'child attributes',
10
+ open = false,
11
+ children
12
+ }: { title?: string; open?: boolean; children: Snippet } = $props();
13
+
14
+ let isOpen = $state(untrack(() => open));
15
+ </script>
16
+
17
+ <div class="expandable">
18
+ <button
19
+ type="button"
20
+ class="expandable-toggle"
21
+ onclick={() => (isOpen = !isOpen)}
22
+ aria-expanded={isOpen}
23
+ >
24
+ {#if isOpen}
25
+ <Minus size={14} />
26
+ {:else}
27
+ <Plus size={14} />
28
+ {/if}
29
+ <span>{isOpen ? 'Hide' : 'Show'} {title}</span>
30
+ </button>
31
+
32
+ {#if isOpen}
33
+ <div class="expandable-body" transition:slide={{ duration: 150 }}>
34
+ {@render children()}
35
+ </div>
36
+ {/if}
37
+ </div>
38
+
39
+ <style>
40
+ .expandable {
41
+ margin-top: 0.6rem;
42
+ }
43
+
44
+ .expandable-toggle {
45
+ display: inline-flex;
46
+ align-items: center;
47
+ gap: 0.4rem;
48
+ padding: 0.3rem 0.7rem;
49
+ border: 1px solid var(--border);
50
+ border-radius: 0.375rem;
51
+ background-color: var(--surface);
52
+ font-size: 0.8rem;
53
+ font-weight: 500;
54
+ color: var(--fg-muted);
55
+ cursor: pointer;
56
+ transition:
57
+ color 0.12s,
58
+ border-color 0.12s;
59
+ }
60
+ .expandable-toggle:hover {
61
+ color: var(--fg);
62
+ border-color: var(--border-strong);
63
+ }
64
+
65
+ .expandable-body {
66
+ margin-top: 0.5rem;
67
+ padding-left: 1rem;
68
+ border-left: 1px solid var(--border);
69
+ }
70
+ </style>
@@ -0,0 +1,67 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import ArrowUp from '@lucide/svelte/icons/arrow-up';
4
+ import ArrowDown from '@lucide/svelte/icons/arrow-down';
5
+
6
+ let {
7
+ direction = 'receive',
8
+ name,
9
+ children
10
+ }: {
11
+ direction?: 'send' | 'receive' | 'publish' | 'subscribe';
12
+ name?: string;
13
+ children?: Snippet;
14
+ } = $props();
15
+
16
+ const isSend = $derived(direction === 'send' || direction === 'publish');
17
+ </script>
18
+
19
+ <div class="message">
20
+ <div class="message-head" data-direction={isSend ? 'send' : 'receive'}>
21
+ {#if isSend}
22
+ <ArrowUp size={14} />
23
+ {:else}
24
+ <ArrowDown size={14} />
25
+ {/if}
26
+ <span class="message-label">{isSend ? 'Send' : 'Receive'}</span>
27
+ {#if name}
28
+ <code class="message-name">{name}</code>
29
+ {/if}
30
+ </div>
31
+ {#if children}
32
+ <div class="message-body">
33
+ {@render children()}
34
+ </div>
35
+ {/if}
36
+ </div>
37
+
38
+ <style>
39
+ .message {
40
+ margin: 1.75rem 0 0;
41
+ }
42
+ .message-head {
43
+ display: inline-flex;
44
+ align-items: center;
45
+ gap: 0.5rem;
46
+ border-radius: var(--radius-md);
47
+ padding: 0.25rem 0.6rem;
48
+ font-size: 0.8rem;
49
+ font-weight: 600;
50
+ color: var(--d);
51
+ background-color: color-mix(in oklab, var(--d) 12%, transparent);
52
+ }
53
+ .message-head[data-direction='send'] {
54
+ --d: oklch(0.6 0.16 250);
55
+ }
56
+ .message-head[data-direction='receive'] {
57
+ --d: oklch(0.6 0.15 155);
58
+ }
59
+ .message-name {
60
+ font-family: var(--font-mono);
61
+ font-weight: 600;
62
+ color: inherit;
63
+ }
64
+ .message-body :global(> :first-child) {
65
+ margin-top: 0.75rem;
66
+ }
67
+ </style>
@@ -0,0 +1,11 @@
1
+ <script lang="ts">
2
+ import { getContext, onDestroy, untrack } from 'svelte';
3
+ import type { Snippet } from 'svelte';
4
+ import { API, type ApiContext } from './api-context';
5
+
6
+ let { title = 'Object', children }: { title?: string; children: Snippet } = $props();
7
+
8
+ const api = getContext<ApiContext>(API);
9
+ const id = untrack(() => api.registerExample({ title, kind: 'object', snippet: children }));
10
+ onDestroy(() => api.unregisterExample(id));
11
+ </script>
@@ -0,0 +1,11 @@
1
+ <script lang="ts">
2
+ import { getContext, onDestroy, untrack } from 'svelte';
3
+ import type { Snippet } from 'svelte';
4
+ import { API, type ApiContext } from './api-context';
5
+
6
+ let { title = 'Request', children }: { title?: string; children: Snippet } = $props();
7
+
8
+ const api = getContext<ApiContext>(API);
9
+ const id = untrack(() => api.registerExample({ title, kind: 'request', snippet: children }));
10
+ onDestroy(() => api.unregisterExample(id));
11
+ </script>
@@ -0,0 +1,11 @@
1
+ <script lang="ts">
2
+ import { getContext, onDestroy, untrack } from 'svelte';
3
+ import type { Snippet } from 'svelte';
4
+ import { API, type ApiContext } from './api-context';
5
+
6
+ let { title = 'Response', children }: { title?: string; children: Snippet } = $props();
7
+
8
+ const api = getContext<ApiContext>(API);
9
+ const id = untrack(() => api.registerExample({ title, kind: 'response', snippet: children }));
10
+ onDestroy(() => api.unregisterExample(id));
11
+ </script>