@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.
- package/LICENSE +21 -0
- package/README.md +1 -0
- package/axerity.default.json +135 -0
- package/axerity.schema.json +268 -0
- package/bin/axerity.js +305 -0
- package/mdsvex.config.js +261 -0
- package/package.json +103 -0
- package/scripts/prepare-engine.mjs +20 -0
- package/src/app.d.ts +17 -0
- package/src/app.html +39 -0
- package/src/content/demo/api/meta.json +5 -0
- package/src/content/demo/api/pet/add-pet.md +105 -0
- package/src/content/demo/api/pet/delete-pet.md +70 -0
- package/src/content/demo/api/pet/find-by-status.md +72 -0
- package/src/content/demo/api/pet/find-by-tags.md +64 -0
- package/src/content/demo/api/pet/get-pet.md +99 -0
- package/src/content/demo/api/pet/meta.json +15 -0
- package/src/content/demo/api/pet/pet-object.md +112 -0
- package/src/content/demo/api/pet/update-pet-with-form.md +69 -0
- package/src/content/demo/api/pet/update-pet.md +79 -0
- package/src/content/demo/api/pet/upload-image.md +79 -0
- package/src/content/demo/api/store/delete-order.md +62 -0
- package/src/content/demo/api/store/get-order.md +70 -0
- package/src/content/demo/api/store/inventory.md +54 -0
- package/src/content/demo/api/store/meta.json +5 -0
- package/src/content/demo/api/store/order-object.md +77 -0
- package/src/content/demo/api/store/place-order.md +83 -0
- package/src/content/demo/api/user/create-user.md +69 -0
- package/src/content/demo/api/user/create-with-list.md +57 -0
- package/src/content/demo/api/user/delete-user.md +61 -0
- package/src/content/demo/api/user/get-user.md +69 -0
- package/src/content/demo/api/user/login.md +80 -0
- package/src/content/demo/api/user/logout.md +45 -0
- package/src/content/demo/api/user/meta.json +14 -0
- package/src/content/demo/api/user/update-user.md +69 -0
- package/src/content/demo/api/user/user-object.md +85 -0
- package/src/content/demo/changelog.md +44 -0
- package/src/content/demo/components/accordion.md +70 -0
- package/src/content/demo/components/api.md +185 -0
- package/src/content/demo/components/badge.md +34 -0
- package/src/content/demo/components/callout.md +83 -0
- package/src/content/demo/components/cards.md +88 -0
- package/src/content/demo/components/code-group.md +55 -0
- package/src/content/demo/components/columns.md +42 -0
- package/src/content/demo/components/frame.md +51 -0
- package/src/content/demo/components/icon.md +54 -0
- package/src/content/demo/components/kbd.md +28 -0
- package/src/content/demo/components/meta.json +26 -0
- package/src/content/demo/components/roadmap.md +86 -0
- package/src/content/demo/components/steps.md +72 -0
- package/src/content/demo/components/tabs.md +146 -0
- package/src/content/demo/components/tooltip.md +44 -0
- package/src/content/demo/components/tree.md +83 -0
- package/src/content/demo/components/type-table.md +77 -0
- package/src/content/demo/components/update.md +48 -0
- package/src/content/demo/components/video.md +56 -0
- package/src/content/demo/components/webhooks.md +109 -0
- package/src/content/demo/components/websockets.md +101 -0
- package/src/content/demo/configuration/ai.md +40 -0
- package/src/content/demo/configuration/cli.md +46 -0
- package/src/content/demo/configuration/deployment.md +105 -0
- package/src/content/demo/configuration/index.md +92 -0
- package/src/content/demo/configuration/layouts.md +51 -0
- package/src/content/demo/configuration/meta.json +5 -0
- package/src/content/demo/configuration/navigation.md +167 -0
- package/src/content/demo/configuration/openapi.md +103 -0
- package/src/content/demo/configuration/search.md +36 -0
- package/src/content/demo/index.md +59 -0
- package/src/content/demo/installation.md +49 -0
- package/src/content/demo/meta.json +15 -0
- package/src/content/demo/quick-start.md +47 -0
- package/src/content/demo/theming/advanced.md +116 -0
- package/src/content/demo/theming/code.md +66 -0
- package/src/content/demo/theming/colors.md +103 -0
- package/src/content/demo/theming/index.md +88 -0
- package/src/content/demo/theming/layout.md +71 -0
- package/src/content/demo/theming/meta.json +5 -0
- package/src/content/demo/theming/themes.md +99 -0
- package/src/content/demo/theming/typography.md +83 -0
- package/src/content/demo/writing/code-blocks.md +154 -0
- package/src/content/demo/writing/diagrams.md +44 -0
- package/src/content/demo/writing/frontmatter.md +33 -0
- package/src/content/demo/writing/markdown.md +62 -0
- package/src/content/demo/writing/meta.json +5 -0
- package/src/hooks.server.ts +49 -0
- package/src/lib/assets/favicon.svg +1 -0
- package/src/lib/base.ts +12 -0
- package/src/lib/components/DynamicIcon.svelte +26 -0
- package/src/lib/components/docs/Analytics.svelte +38 -0
- package/src/lib/components/docs/Banner.svelte +44 -0
- package/src/lib/components/docs/Breadcrumbs.svelte +38 -0
- package/src/lib/components/docs/CopyPageMenu.svelte +119 -0
- package/src/lib/components/docs/DocsLayout.svelte +192 -0
- package/src/lib/components/docs/Footer.svelte +60 -0
- package/src/lib/components/docs/Mermaid.svelte +39 -0
- package/src/lib/components/docs/Navbar.svelte +144 -0
- package/src/lib/components/docs/PageMeta.svelte +35 -0
- package/src/lib/components/docs/PageNav.svelte +44 -0
- package/src/lib/components/docs/SearchDialog.svelte +182 -0
- package/src/lib/components/docs/Sidebar.svelte +85 -0
- package/src/lib/components/docs/SidebarDropdown.svelte +56 -0
- package/src/lib/components/docs/SidebarFooterLinks.svelte +19 -0
- package/src/lib/components/docs/SidebarGroup.svelte +54 -0
- package/src/lib/components/docs/SidebarLink.svelte +67 -0
- package/src/lib/components/docs/TableOfContents.svelte +77 -0
- package/src/lib/components/docs/ThemeToggle.svelte +19 -0
- package/src/lib/components/docs/VersionSwitcher.svelte +80 -0
- package/src/lib/components/kit/Accordion.svelte +60 -0
- package/src/lib/components/kit/AccordionGroup.svelte +13 -0
- package/src/lib/components/kit/Badge.svelte +32 -0
- package/src/lib/components/kit/Callout.svelte +51 -0
- package/src/lib/components/kit/Card.svelte +72 -0
- package/src/lib/components/kit/CardGroup.svelte +21 -0
- package/src/lib/components/kit/CodeGroup.svelte +65 -0
- package/src/lib/components/kit/Columns.svelte +26 -0
- package/src/lib/components/kit/Event.svelte +23 -0
- package/src/lib/components/kit/EventList.svelte +9 -0
- package/src/lib/components/kit/File.svelte +15 -0
- package/src/lib/components/kit/Folder.svelte +46 -0
- package/src/lib/components/kit/Frame.svelte +81 -0
- package/src/lib/components/kit/Icon.svelte +17 -0
- package/src/lib/components/kit/Kbd.svelte +11 -0
- package/src/lib/components/kit/Roadmap.svelte +15 -0
- package/src/lib/components/kit/RoadmapItem.svelte +109 -0
- package/src/lib/components/kit/Step.svelte +63 -0
- package/src/lib/components/kit/Steps.svelte +16 -0
- package/src/lib/components/kit/Tab.svelte +27 -0
- package/src/lib/components/kit/Tabs.svelte +75 -0
- package/src/lib/components/kit/Tooltip.svelte +33 -0
- package/src/lib/components/kit/Tree.svelte +11 -0
- package/src/lib/components/kit/TypeTable.svelte +187 -0
- package/src/lib/components/kit/Update.svelte +32 -0
- package/src/lib/components/kit/Video.svelte +64 -0
- package/src/lib/components/kit/accordion-context.ts +1 -0
- package/src/lib/components/kit/api/Api.svelte +80 -0
- package/src/lib/components/kit/api/ApiExamplePanel.svelte +100 -0
- package/src/lib/components/kit/api/ApiField.svelte +124 -0
- package/src/lib/components/kit/api/Channel.svelte +121 -0
- package/src/lib/components/kit/api/Endpoint.svelte +116 -0
- package/src/lib/components/kit/api/Enum.svelte +44 -0
- package/src/lib/components/kit/api/EnumValues.svelte +35 -0
- package/src/lib/components/kit/api/Expandable.svelte +70 -0
- package/src/lib/components/kit/api/Message.svelte +67 -0
- package/src/lib/components/kit/api/ObjectExample.svelte +11 -0
- package/src/lib/components/kit/api/RequestExample.svelte +11 -0
- package/src/lib/components/kit/api/ResponseExample.svelte +11 -0
- package/src/lib/components/kit/api/Webhook.svelte +115 -0
- package/src/lib/components/kit/api/api-context.ts +15 -0
- package/src/lib/components/kit/tabs-context.ts +8 -0
- package/src/lib/components/kit/tabs-store.svelte.ts +28 -0
- package/src/lib/config/site.ts +34 -0
- package/src/lib/content/index.ts +50 -0
- package/src/lib/content/raw.ts +21 -0
- package/src/lib/content/tree.ts +169 -0
- package/src/lib/index.ts +79 -0
- package/src/lib/nav-match.ts +23 -0
- package/src/lib/openapi/generate.ts +629 -0
- package/src/lib/server/og.ts +140 -0
- package/src/lib/state/search.svelte.ts +9 -0
- package/src/lib/state/theme.svelte.ts +58 -0
- package/src/lib/types.ts +216 -0
- package/src/params/docpage.ts +3 -0
- package/src/params/mdfile.ts +3 -0
- package/src/routes/+error.svelte +46 -0
- package/src/routes/+layout.svelte +25 -0
- package/src/routes/[...path=mdfile]/+server.ts +21 -0
- package/src/routes/[...slug=docpage]/+page.svelte +63 -0
- package/src/routes/[...slug=docpage]/+page.ts +44 -0
- package/src/routes/layout.css +897 -0
- package/src/routes/llms-full.txt/+server.ts +22 -0
- package/src/routes/llms.txt/+server.ts +20 -0
- package/src/routes/og/[...slug]/+server.ts +77 -0
- package/src/routes/rss.xml/+server.ts +65 -0
- package/src/routes/search.json/+server.ts +54 -0
- package/src/routes/sitemap.xml/+server.ts +21 -0
- package/static/favicon-dark.svg +6 -0
- package/static/favicon-light.svg +6 -0
- package/static/favicon.svg +14 -0
- package/static/fonts/geist-400.ttf +0 -0
- package/static/fonts/geist-600.ttf +0 -0
- package/static/fonts/geist-700.ttf +0 -0
- package/static/og-image.png +0 -0
- package/static/robots.txt +4 -0
- package/svelte.config.js +35 -0
- package/tsconfig.json +20 -0
- 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>
|