andesine 0.1.0 → 0.4.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 (81) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +27 -8
  3. package/dist/cli.js +1611 -121
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config.schema.json +20 -3
  6. package/dist/templates/pages/.env.example +5 -0
  7. package/dist/templates/pages/AGENTS.md +79 -0
  8. package/dist/templates/pages/LICENSE +21 -0
  9. package/dist/templates/pages/README.md +72 -0
  10. package/dist/templates/pages/andesine.config.ts +39 -0
  11. package/dist/templates/pages/astro.config.ts +23 -0
  12. package/dist/templates/pages/gitignore +13 -0
  13. package/dist/templates/pages/package.template.json +45 -0
  14. package/dist/templates/pages/src/api/openapi.yaml +246 -0
  15. package/dist/templates/pages/src/assets/andesine.svg +1 -0
  16. package/dist/templates/pages/src/assets/andesine.ts +6 -0
  17. package/dist/templates/pages/src/assets/favicon.svg +13 -0
  18. package/dist/templates/pages/src/assets/social-dots.svg +14 -0
  19. package/dist/templates/pages/src/components/content/callout.astro +26 -0
  20. package/dist/templates/pages/src/components/content/card-grid.astro +1 -0
  21. package/dist/templates/pages/src/components/content/card.astro +31 -0
  22. package/dist/templates/pages/src/components/content/code-block.astro +34 -0
  23. package/dist/templates/pages/src/components/content/code-group.astro +13 -0
  24. package/dist/templates/pages/src/components/content/copy-button.tsx +53 -0
  25. package/dist/templates/pages/src/components/content/disclosure.astro +26 -0
  26. package/dist/templates/pages/src/components/content/figure.astro +10 -0
  27. package/dist/templates/pages/src/components/content/file-tree.astro +47 -0
  28. package/dist/templates/pages/src/components/content/index.ts +30 -0
  29. package/dist/templates/pages/src/components/content/steps.astro +16 -0
  30. package/dist/templates/pages/src/components/content/tab.astro +7 -0
  31. package/dist/templates/pages/src/components/content/tabs.astro +15 -0
  32. package/dist/templates/pages/src/components/content/tabs.tsx +99 -0
  33. package/dist/templates/pages/src/components/effects/page-scroll-shadow.tsx +27 -0
  34. package/dist/templates/pages/src/components/effects/page-scrollbar.tsx +35 -0
  35. package/dist/templates/pages/src/components/layout/call-to-action.tsx +28 -0
  36. package/dist/templates/pages/src/components/layout/footer.astro +44 -0
  37. package/dist/templates/pages/src/components/layout/group-label.tsx +34 -0
  38. package/dist/templates/pages/src/components/layout/header.astro +53 -0
  39. package/dist/templates/pages/src/components/layout/mobile-navigation.tsx +51 -0
  40. package/dist/templates/pages/src/components/layout/navigation-links.tsx +57 -0
  41. package/dist/templates/pages/src/components/layout/navigation-tree.tsx +138 -0
  42. package/dist/templates/pages/src/components/layout/outline.tsx +162 -0
  43. package/dist/templates/pages/src/components/layout/page-actions.tsx +87 -0
  44. package/dist/templates/pages/src/components/layout/powered-by.tsx +29 -0
  45. package/dist/templates/pages/src/components/layout/section-tabs.tsx +83 -0
  46. package/dist/templates/pages/src/components/layout/sidebar.tsx +65 -0
  47. package/dist/templates/pages/src/components/primitives/button.tsx +121 -0
  48. package/dist/templates/pages/src/components/primitives/card.tsx +25 -0
  49. package/dist/templates/pages/src/components/primitives/dialog.tsx +47 -0
  50. package/dist/templates/pages/src/components/primitives/input.tsx +22 -0
  51. package/dist/templates/pages/src/components/primitives/logo.tsx +41 -0
  52. package/dist/templates/pages/src/components/primitives/menu.tsx +121 -0
  53. package/dist/templates/pages/src/components/primitives/scroll-area.tsx +103 -0
  54. package/dist/templates/pages/src/components/primitives/shortcut.tsx +60 -0
  55. package/dist/templates/pages/src/components/primitives/tooltip.tsx +39 -0
  56. package/dist/templates/pages/src/components/reference/facts.astro +27 -0
  57. package/dist/templates/pages/src/components/reference/fields.astro +102 -0
  58. package/dist/templates/pages/src/components/reference/method-badge.astro +18 -0
  59. package/dist/templates/pages/src/components/reference/methods.ts +17 -0
  60. package/dist/templates/pages/src/components/reference/operation.astro +252 -0
  61. package/dist/templates/pages/src/components/reference/styles.ts +14 -0
  62. package/dist/templates/pages/src/components/search/highlighted-text.tsx +22 -0
  63. package/dist/templates/pages/src/components/search/search-answer.tsx +123 -0
  64. package/dist/templates/pages/src/components/search/search-palette.tsx +174 -0
  65. package/dist/templates/pages/src/components/search/search-results.tsx +229 -0
  66. package/dist/templates/pages/src/components/social/card.ts +77 -0
  67. package/dist/templates/pages/src/content/docs/customization/index.mdx +11 -0
  68. package/dist/templates/pages/src/content/docs/customization/styles.mdx +18 -0
  69. package/dist/templates/pages/src/content/docs/getting-started/api-reference.mdx +100 -0
  70. package/dist/templates/pages/src/content/docs/getting-started/components.mdx +156 -0
  71. package/dist/templates/pages/src/content/docs/getting-started/configuration.mdx +194 -0
  72. package/dist/templates/pages/src/content/docs/getting-started/deployment.mdx +142 -0
  73. package/dist/templates/pages/src/content/docs/getting-started/index.mdx +22 -0
  74. package/dist/templates/pages/src/content/docs/getting-started/writing-pages.mdx +35 -0
  75. package/dist/templates/pages/src/content/docs/index.mdx +21 -0
  76. package/dist/templates/pages/src/content.config.ts +1 -0
  77. package/dist/templates/pages/src/layouts/page.astro +195 -0
  78. package/dist/templates/pages/src/styles/global.css +95 -0
  79. package/dist/templates/pages/tsconfig.json +10 -0
  80. package/dist/templates/pages/uno.config.ts +168 -0
  81. package/package.json +2 -2
@@ -85,11 +85,28 @@
85
85
  },
86
86
  "collections": {
87
87
  "default": [],
88
- "description": "Collection IDs or paths; empty selects all accessible collections.",
88
+ "description": "Collection IDs, name paths, or objects with collectionSlugPath; empty selects all accessible collections.",
89
89
  "type": "array",
90
90
  "items": {
91
- "type": "string",
92
- "minLength": 1
91
+ "anyOf": [
92
+ {
93
+ "type": "string",
94
+ "minLength": 1
95
+ },
96
+ {
97
+ "type": "object",
98
+ "properties": {
99
+ "collectionSlugPath": {
100
+ "type": "string",
101
+ "minLength": 1
102
+ }
103
+ },
104
+ "required": [
105
+ "collectionSlugPath"
106
+ ],
107
+ "additionalProperties": false
108
+ }
109
+ ]
93
110
  }
94
111
  },
95
112
  "output": {
@@ -0,0 +1,5 @@
1
+ ANDESINE_COLLECTION_ID=
2
+ # A publishable key (adn_pk_...) builds a fully static site.
3
+ ANDESINE_PUBLIC_KEY=
4
+ # Or a secret key; search and AI answers then need a server.
5
+ ANDESINE_API_KEY=
@@ -0,0 +1,79 @@
1
+ # AGENTS.md
2
+
3
+ Rules for coding agents that write or change pages in this Andesine Pages site.
4
+
5
+ ## File layout
6
+
7
+ - Pages are `.md` or `.mdx` files in the directory of a files source, e.g.
8
+ `src/content/docs/`. `andesine.config.ts` lists the sources and their mounts.
9
+ - The file path gives the URL: `guides/setup.md` is `/guides/setup/`, and
10
+ `guides/index.md` is the landing page of the `guides` group.
11
+ - A folder is a navigation group. Add an `index.md(x)` to give it a landing page and
12
+ a title.
13
+ - Put images next to the page and link them with a relative path.
14
+ - Do not edit `dist/`, `.astro/`, or `node_modules/`. Do not put the API key in any
15
+ file; `.env` holds it and is not committed.
16
+
17
+ ## Frontmatter
18
+
19
+ Every page needs a `title`. The other fields are optional:
20
+
21
+ | Field | Default | Use |
22
+ | ------------------ | ------- | --------------------------------------------------- |
23
+ | `description` | None | One sentence for search, previews, and social cards |
24
+ | `order` | `0` | Position in the group; lower numbers come first |
25
+ | `slug` | None | A URL path that replaces the file path |
26
+ | `navigationLabel` | `title` | A shorter label for the navigation |
27
+ | `navigationHidden` | `false` | Leave the page out of the navigation |
28
+ | `searchHidden` | `false` | Leave the page out of search and agent files |
29
+ | `toc` | `true` | Show the table of contents |
30
+ | `layout` | `docs` | `wide` for a page without a table of contents |
31
+ | `updatedAt` | None | Date of the last change, e.g. `2026-10-04` |
32
+
33
+ Unknown fields and invalid values stop the build. Two pages with the same URL stop
34
+ the build too.
35
+
36
+ ## Content
37
+
38
+ - Start the body with the first paragraph; the layout shows the title. Use `##` and
39
+ `###` headings; they make the table of contents.
40
+ - Link to other pages with relative links, e.g. `../configuration/`.
41
+ - Give code blocks a language, and a `title` when they show a file:
42
+ ` ```ts title="andesine.config.ts" `.
43
+
44
+ ## Components
45
+
46
+ MDX pages use these components without imports. `src/components/content/index.ts`
47
+ lists them; add a component there before you use it.
48
+
49
+ | Component | Use |
50
+ | ------------------ | ---------------------------------------------------------- |
51
+ | `Callout` | `type`: `note` (default), `tip`, `warning`, or `danger` |
52
+ | `Tabs`, `Tab` | Alternatives; tabs with the same `syncKey` share selection |
53
+ | `CodeGroup` | Code blocks in tabs, from their `title`s |
54
+ | `Steps` | An ordered list of steps |
55
+ | `FileTree` | A nested list of files and folders |
56
+ | `CardGrid`, `Card` | Links with `title`, `icon` (an Iconify class), and `href` |
57
+ | `Disclosure` | Content that opens on click, with a `title` |
58
+ | `Figure` | An image (as content) with a `caption` |
59
+ | `Operation` | An API operation: `source` and `id` of an OpenAPI source |
60
+ | `Visibility` | Content for one audience; see below |
61
+
62
+ Leave an empty line around Markdown content inside `Steps`, `CodeGroup`, and
63
+ `FileTree`.
64
+
65
+ ## Visibility
66
+
67
+ The site has two versions of each page: the web page, and a Markdown version that AI
68
+ agents read (the page URL with `index.md`, and `llms-full.txt`).
69
+
70
+ - `<Visibility for="humans">` content is only on the web page. Use it for UI
71
+ directions, e.g. "Select **Copy page**".
72
+ - `<Visibility for="agents">` content is only in the Markdown version. Use it for
73
+ directions that an agent can follow, e.g. a file to edit or a URL to fetch.
74
+ - Use one block for each audience, side by side. Do not nest `Visibility` blocks.
75
+
76
+ ## Checks
77
+
78
+ Run `npm run check` and `npm run build` after changes. The build checks the
79
+ frontmatter, the URLs, and the API operations that pages embed.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Vrite, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,72 @@
1
+ # Andesine Pages template
2
+
3
+ A copyable Astro + Solid.js documentation site. You own the layouts, styles,
4
+ components, and configuration. `@andesine/pages` supplies the data layer and the
5
+ Astro integration. `@andesine/ui/solid` supplies headless components.
6
+
7
+ ## Structure
8
+
9
+ | Path | Contents |
10
+ | ------------------------ | ---------------------------------------------- |
11
+ | `andesine.config.ts` | Site name, logo, brand colors, links, sources. |
12
+ | `astro.config.ts` | Astro integrations. |
13
+ | `uno.config.ts` | UnoCSS theme, layers, and transformers. |
14
+ | `src/content.config.ts` | Content collections for the sources. |
15
+ | `src/content/docs/` | The pages of the `docs` files source. |
16
+ | `src/api/openapi.yaml` | The example spec of the `api` OpenAPI source. |
17
+ | `src/layouts/page.astro` | The page layout. It receives one `page` prop. |
18
+ | `.env.example` | The Andesine API key variable. |
19
+ | `src/styles/global.css` | Fonts, base styles, and scrollbars. |
20
+ | `src/components/` | Styled primitives, layout, and API reference. |
21
+
22
+ ## Styles
23
+
24
+ The template uses the design language of the Andesine app:
25
+
26
+ - Component default classes start with `:base:` (or `:base-2:` for a component
27
+ that wraps another one). UnoCSS compiles them into low-priority layers, so a
28
+ `class` prop overrides them.
29
+ - `<html>` sets the brand gradient stops. Use `bg-gradient-to-tr` for a brand
30
+ gradient on fills and icons (`i-*` classes). Add `bg-clip-text` and
31
+ `text-transparent` for gradient text.
32
+ - The brand colors come from `brand` in `andesine.config.ts`.
33
+ - Hover styles use `@hover:` and are repeated with `focus-visible:`. There are no
34
+ focus rings.
35
+ - UnoCSS also scans the files in `src/` directly. Astro and Solid escape `&`,
36
+ `>`, and `'` in compiled class strings, so the compiled code alone can hide
37
+ classes such as `[&[open]>summary]:rotate-90`.
38
+ - Headless behavior comes from `@andesine/ui/solid`. Visual effects, such as the
39
+ outline guide, the tab indicator, and the page scroll shadows, are in
40
+ `src/components/effects/`.
41
+
42
+ ## Andesine content
43
+
44
+ Set `ANDESINE_COLLECTION_ID` and `ANDESINE_PUBLIC_KEY`, a publishable key, to show a
45
+ published Andesine collection in place of the included guide, as a fully static site.
46
+ `andesine.config.ts` reads them from `process.env`, so export them in the shell or load them
47
+ with a tool such as `dotenv-cli`. With a secret `ANDESINE_API_KEY` in place of the publishable
48
+ key, Andesine sources need a Node.js server or a serverless platform such as Vercel or
49
+ Netlify. See the Deployment page of the guide.
50
+
51
+ ## New sites
52
+
53
+ Create a new site from this template with the Andesine CLI:
54
+
55
+ ```sh
56
+ npx andesine pages init docs
57
+ cd docs
58
+ npm install
59
+ ```
60
+
61
+ The CLI copies the template of its release, with `@andesine/pages` and
62
+ `@andesine/ui` pinned to the same version. The `overrides` field fixes an npm peer
63
+ conflict of `solid-devtools`, an optional dependency of `@astrojs/solid-js`.
64
+
65
+ ## Commands
66
+
67
+ Use Node.js 24 or later.
68
+
69
+ ```sh
70
+ npm run check
71
+ npm run build
72
+ ```
@@ -0,0 +1,39 @@
1
+ import { defineConfig } from "@andesine/pages";
2
+
3
+ const hasKey = process.env.ANDESINE_PUBLIC_KEY || process.env.ANDESINE_API_KEY;
4
+ const collection = hasKey && process.env.ANDESINE_COLLECTION_ID;
5
+
6
+ export default defineConfig({
7
+ name: "Pages",
8
+ description: "Documentation that you own.",
9
+ site: "https://docs.example.com",
10
+ logo: { src: "./src/assets/andesine.svg", format: "full", alt: "Andesine" },
11
+ favicon: "./src/assets/favicon.svg",
12
+ brand: { primary: "#ff3617", secondary: "#f88f52", tertiary: "#fc6335" },
13
+ links: [
14
+ {
15
+ label: "Changelog",
16
+ href: "https://github.com/vriteio/vrite/releases",
17
+ icon: "i-lucide:scroll-text"
18
+ },
19
+ {
20
+ label: "Community",
21
+ href: "https://github.com/vriteio/vrite/discussions",
22
+ icon: "i-lucide:messages-square"
23
+ }
24
+ ],
25
+ cta: { label: "Andesine", href: "https://andesine.app", icon: "i-lucide:arrow-up-right" },
26
+ socialLinks: [
27
+ { label: "GitHub", href: "https://github.com/vriteio/vrite", icon: "i-mdi:github" }
28
+ ],
29
+ sections: [
30
+ { id: "guides", label: "Guides", icon: "i-lucide:book-open", sources: ["docs"] },
31
+ { id: "reference", label: "API reference", icon: "i-lucide:braces", sources: ["api"] }
32
+ ],
33
+ sources: [
34
+ collection
35
+ ? { id: "docs", type: "andesine", collection, publicKey: process.env.ANDESINE_PUBLIC_KEY }
36
+ : { id: "docs", type: "files", directory: "src/content/docs" },
37
+ { id: "api", type: "openapi", spec: "src/api/openapi.yaml", mount: "/api/" }
38
+ ]
39
+ });
@@ -0,0 +1,23 @@
1
+ import { defineConfig } from "astro/config";
2
+ import mdx from "@astrojs/mdx";
3
+ import node from "@astrojs/node";
4
+ import solid from "@astrojs/solid-js";
5
+ import unoCSS from "@unocss/astro";
6
+ import { andesine } from "@andesine/pages/integration";
7
+ import config from "./andesine.config";
8
+
9
+ export default defineConfig({
10
+ // Andesine sources without a publishable key need a server for search and AI answers.
11
+ adapter: config.sources.some((source) => source.type === "andesine" && !source.publicKey)
12
+ ? node({ mode: "standalone" })
13
+ : undefined,
14
+ server: { host: true, allowedHosts: [".local"] },
15
+ markdown: { shikiConfig: { theme: "github-light" } },
16
+ integrations: [
17
+ mdx(),
18
+ solid(),
19
+ // The reset loads just before the UnoCSS rules; utilities then override it in every build.
20
+ unoCSS({ injectReset: "@unocss/reset/tailwind.css" }),
21
+ andesine()
22
+ ]
23
+ });
@@ -0,0 +1,13 @@
1
+ # Dependencies and build output
2
+ node_modules
3
+ dist
4
+ .astro
5
+
6
+ # Environment variables with the API key
7
+ .env
8
+ .env.*
9
+ !.env.example
10
+
11
+ # Platform folders
12
+ .vercel
13
+ .netlify
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "andesine-pages-site",
3
+ "version": "0.4.0",
4
+ "type": "module",
5
+ "license": "MIT",
6
+ "scripts": {
7
+ "dev": "astro dev",
8
+ "build": "astro build",
9
+ "check": "astro check",
10
+ "preview": "astro preview"
11
+ },
12
+ "engines": {
13
+ "node": ">=24"
14
+ },
15
+ "dependencies": {
16
+ "@andesine/pages": "0.4.0",
17
+ "@andesine/ui": "0.4.0",
18
+ "@ark-ui/solid": "5.38.0",
19
+ "@astrojs/mdx": "8.0.1",
20
+ "@astrojs/node": "11.1.6",
21
+ "@astrojs/solid-js": "7.0.2",
22
+ "@fontsource-variable/jetbrains-mono": "5.3.0",
23
+ "@fontsource-variable/nunito": "5.3.0",
24
+ "@fontsource/nunito": "^5.3.0",
25
+ "@resvg/resvg-js": "^2.6.2",
26
+ "astro": "7.3.1",
27
+ "clsx": "^2.1.1",
28
+ "satori": "^0.33.5",
29
+ "solid-js": "^1.9.14"
30
+ },
31
+ "devDependencies": {
32
+ "@astrojs/check": "0.9.10",
33
+ "@iconify/json": "^2.2.509",
34
+ "@types/node": "26.1.2",
35
+ "@unocss/astro": "66.7.5",
36
+ "@unocss/reset": "66.7.5",
37
+ "typescript": "6.0.3",
38
+ "unocss": "66.7.5"
39
+ },
40
+ "overrides": {
41
+ "solid-devtools": {
42
+ "vite": "^8.0.13"
43
+ }
44
+ }
45
+ }
@@ -0,0 +1,246 @@
1
+ openapi: 3.1.0
2
+ info:
3
+ title: Tasks API
4
+ version: 1.0.0
5
+ description: |
6
+ An example API for the reference pages of this template. It manages projects and
7
+ their tasks.
8
+
9
+ Replace this file with your own OpenAPI 3.0 or 3.1 spec, or set `spec` in
10
+ `andesine.config.ts` to its URL.
11
+ servers:
12
+ - url: https://api.example.com/v1
13
+ description: Production
14
+ security:
15
+ - bearer: []
16
+ tags:
17
+ - name: projects
18
+ x-displayName: Projects
19
+ description: A project holds tasks and has one owner.
20
+ - name: tasks
21
+ x-displayName: Tasks
22
+ description: Tasks can have subtasks, and one assignee.
23
+ components:
24
+ securitySchemes:
25
+ bearer:
26
+ type: http
27
+ scheme: bearer
28
+ description: Send an API token from the account settings.
29
+ parameters:
30
+ ProjectID:
31
+ name: projectID
32
+ in: path
33
+ required: true
34
+ description: ID of the project.
35
+ schema: { type: string, pattern: "^prj_[A-Za-z0-9]+$" }
36
+ example: prj_4f8a
37
+ headers:
38
+ RateLimitRemaining:
39
+ description: Requests left in the current minute.
40
+ schema: { type: integer }
41
+ schemas:
42
+ Project:
43
+ type: object
44
+ required: [id, name, createdAt]
45
+ properties:
46
+ id: { type: string, description: ID of the project., examples: [prj_4f8a] }
47
+ name: { type: string, minLength: 1, maxLength: 100, examples: [Website launch] }
48
+ description: { type: [string, "null"], description: Optional notes. }
49
+ createdAt: { type: string, format: date-time, readOnly: true }
50
+ ProjectInput:
51
+ type: object
52
+ required: [name]
53
+ properties:
54
+ name: { type: string, minLength: 1, maxLength: 100, examples: [Website launch] }
55
+ description: { type: [string, "null"] }
56
+ Task:
57
+ type: object
58
+ required: [id, title, status]
59
+ properties:
60
+ id: { type: string, examples: [tsk_91c2] }
61
+ title: { type: string, examples: [Write the launch post] }
62
+ status:
63
+ type: string
64
+ enum: [todo, in_progress, done]
65
+ default: todo
66
+ assignee:
67
+ description: A person or a team.
68
+ oneOf:
69
+ - $ref: "#/components/schemas/Person"
70
+ - $ref: "#/components/schemas/Team"
71
+ subtasks:
72
+ type: array
73
+ description: Tasks that belong to this task.
74
+ items: { $ref: "#/components/schemas/Task" }
75
+ Person:
76
+ type: object
77
+ required: [type, email]
78
+ properties:
79
+ type: { const: person }
80
+ email: { type: string, format: email }
81
+ Team:
82
+ type: object
83
+ required: [type, name]
84
+ properties:
85
+ type: { const: team }
86
+ name: { type: string, examples: [Marketing] }
87
+ Error:
88
+ type: object
89
+ required: [code, message]
90
+ properties:
91
+ code: { type: string, examples: [NOT_FOUND] }
92
+ message: { type: string, examples: [The project does not exist.] }
93
+ responses:
94
+ NotFound:
95
+ description: The resource does not exist.
96
+ content:
97
+ application/json:
98
+ schema: { $ref: "#/components/schemas/Error" }
99
+ paths:
100
+ /projects:
101
+ get:
102
+ operationId: projects.list
103
+ tags: [projects]
104
+ summary: List projects
105
+ description: Returns the projects of the account, newest first.
106
+ parameters:
107
+ - name: limit
108
+ in: query
109
+ description: Largest number of projects to return.
110
+ schema: { type: integer, minimum: 1, maximum: 100, default: 20 }
111
+ - name: cursor
112
+ in: query
113
+ description: The `nextCursor` of the previous page.
114
+ schema: { type: string }
115
+ responses:
116
+ "200":
117
+ description: A page of projects.
118
+ headers:
119
+ X-RateLimit-Remaining: { $ref: "#/components/headers/RateLimitRemaining" }
120
+ content:
121
+ application/json:
122
+ schema:
123
+ type: object
124
+ required: [data]
125
+ properties:
126
+ data:
127
+ type: array
128
+ items: { $ref: "#/components/schemas/Project" }
129
+ nextCursor: { type: [string, "null"] }
130
+ post:
131
+ operationId: projects.create
132
+ tags: [projects]
133
+ summary: Create a project
134
+ requestBody:
135
+ required: true
136
+ content:
137
+ application/json:
138
+ schema: { $ref: "#/components/schemas/ProjectInput" }
139
+ responses:
140
+ "201":
141
+ description: The new project.
142
+ content:
143
+ application/json:
144
+ schema: { $ref: "#/components/schemas/Project" }
145
+ x-codeSamples:
146
+ - lang: javascript
147
+ label: JavaScript
148
+ source: |
149
+ const response = await fetch("https://api.example.com/v1/projects", {
150
+ method: "POST",
151
+ headers: {
152
+ "Authorization": `Bearer ${process.env.TASKS_TOKEN}`,
153
+ "Content-Type": "application/json"
154
+ },
155
+ body: JSON.stringify({ name: "Website launch" })
156
+ });
157
+
158
+ const project = await response.json();
159
+ /projects/{projectID}:
160
+ parameters:
161
+ - $ref: "#/components/parameters/ProjectID"
162
+ get:
163
+ operationId: projects.get
164
+ tags: [projects]
165
+ summary: Get a project
166
+ responses:
167
+ "200":
168
+ description: The project.
169
+ content:
170
+ application/json:
171
+ schema: { $ref: "#/components/schemas/Project" }
172
+ "404": { $ref: "#/components/responses/NotFound" }
173
+ delete:
174
+ operationId: projects.delete
175
+ tags: [projects]
176
+ summary: Delete a project
177
+ description: Deletes the project and all of its tasks. You cannot undo this.
178
+ responses:
179
+ "204": { description: The project is deleted. }
180
+ "404": { $ref: "#/components/responses/NotFound" }
181
+ /projects/{projectID}/tasks:
182
+ parameters:
183
+ - $ref: "#/components/parameters/ProjectID"
184
+ get:
185
+ operationId: tasks.list
186
+ tags: [tasks]
187
+ summary: List tasks
188
+ parameters:
189
+ - name: status
190
+ in: query
191
+ schema: { type: string, enum: [todo, in_progress, done] }
192
+ responses:
193
+ "200":
194
+ description: The tasks of the project.
195
+ content:
196
+ application/json:
197
+ schema:
198
+ type: array
199
+ items: { $ref: "#/components/schemas/Task" }
200
+ post:
201
+ operationId: tasks.create
202
+ tags: [tasks]
203
+ summary: Create a task
204
+ requestBody:
205
+ required: true
206
+ content:
207
+ application/json:
208
+ schema:
209
+ type: object
210
+ required: [title]
211
+ properties:
212
+ title: { type: string, examples: [Write the launch post] }
213
+ status: { type: string, enum: [todo, in_progress, done], default: todo }
214
+ responses:
215
+ "201":
216
+ description: The new task.
217
+ content:
218
+ application/json:
219
+ schema: { $ref: "#/components/schemas/Task" }
220
+ /projects/{projectID}/tasks/{taskID}/complete:
221
+ parameters:
222
+ - $ref: "#/components/parameters/ProjectID"
223
+ - name: taskID
224
+ in: path
225
+ required: true
226
+ schema: { type: string }
227
+ example: tsk_91c2
228
+ post:
229
+ operationId: tasks.complete
230
+ tags: [tasks]
231
+ summary: Complete a task
232
+ deprecated: true
233
+ description: Use `PATCH /projects/{projectID}/tasks/{taskID}` with `status` set to `done`.
234
+ responses:
235
+ "200":
236
+ description: The completed task.
237
+ content:
238
+ application/json:
239
+ schema: { $ref: "#/components/schemas/Task" }
240
+ /health:
241
+ get:
242
+ operationId: health
243
+ summary: Check the service
244
+ security: []
245
+ responses:
246
+ "204": { description: The service works. }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="1.76 7 220.24 51" width="220.24" height="51" role="img" aria-label="Andesine"><defs><linearGradient id="brand" x1="0" y1="1" x2="1" y2="0"><stop offset="0" stop-color="#f88f52"/><stop offset="0.5" stop-color="#ff3617"/><stop offset="1" stop-color="#f88f52"/></linearGradient></defs><mask id="satori_om-id"><rect x="0" y="0" width="224" height="65" fill="#fff"/></mask><mask id="satori_om-id-0"><rect x="0" y="7" width="51" height="51" fill="#fff"/></mask><svg x="0" y="7" width="51" height="51" viewBox="0 0 24 24"><path fill="url(#brand)" d="M11.9069231,0 C13.0018372,0 13.9483357,0.635443279 14.397751,1.55766239 L18.5217192,9.80587694 C18.7187228,10.1865349 18.83,10.6187339 18.83,11.0769231 C18.83,12.606327 17.5901732,13.8461538 16.0607692,13.8461538 C14.9658551,13.8461538 14.0193566,13.2107106 13.5699414,12.2884915 L12.0384615,9.22476923 L6.15084166,22.3086788 C5.73044955,23.3025974 4.74628371,24 3.59923077,24 C2.06982685,24 0.83,22.7601732 0.83,21.2307692 C0.83,20.8083537 0.924579355,20.4080284 1.09371684,20.0498145 L9.35966608,1.68108512 C9.78247025,0.692617692 10.7638119,0 11.9069231,0 Z M18.3684615,14.7692308 C19.8978655,14.7692308 21.1376923,16.0090576 21.1376923,17.5384615 C21.1376923,19.0678655 19.8978655,20.3076923 18.3684615,20.3076923 C18.2141372,20.3076923 18.0627613,20.2950686 17.9153101,20.2707976 L12.83,19.8461538 L12.7298971,19.8440218 C11.5018339,19.7916084 10.5223077,18.7794252 10.5223077,17.5384615 C10.5223077,16.2639583 11.5554967,15.2307692 12.83,15.2307692 L17.9097768,14.8070421 C18.0589734,14.7821723 18.2122062,14.7692308 18.3684615,14.7692308 Z"/></svg><mask id="satori_om-id-1"><rect x="51" y="0" width="173" height="65" fill="#fff"/></mask><g><path fill="#111827" d="M57.1 49.4L57.1 49.4Q55.7 49.4 54.9 48.6Q54.1 47.8 54.1 46.3L54.1 46.3L54.1 28.2Q54.1 26.7 54.9 25.9Q55.7 25.1 57.0 25.1Q58.4 25.1 59.2 25.9Q60.0 26.7 60.0 28.2L60.0 28.2L60.0 29.2Q61.0 27.4 62.8 26.3L62.8 26.3Q65.0 25.0 67.8 25.0Q70.6 25.0 72.5 26.1Q74.3 27.2 75.2 29.3Q76.1 31.4 76.1 34.7L76.1 34.7L76.1 46.3Q76.1 47.8 75.3 48.6Q74.6 49.4 73.1 49.4Q71.7 49.4 70.9 48.6Q70.1 47.8 70.1 46.3L70.1 46.3L70.1 35.0Q70.1 32.2 69.1 31Q68.0 29.8 65.9 29.8L65.9 29.8Q63.2 29.8 61.7 31.4Q60.1 33.1 60.1 35.8L60.1 35.8L60.1 46.3Q60.1 49.4 57.1 49.4ZM91.2 49.5L91.2 49.5Q88.2 49.5 85.8 48.0Q83.5 46.5 82.2 43.7Q80.9 41.0 80.9 37.2L80.9 37.2Q80.9 33.4 82.2 30.7Q83.5 28.0 85.8 26.5Q88.2 25.0 91.2 25.0L91.2 25.0Q94.2 25.0 96.4 26.5L96.4 26.5Q97.9 27.5 98.8 29.1L98.8 29.1L98.8 17.8Q98.8 16.3 99.5 15.5Q100.3 14.8 101.7 14.8Q103.2 14.8 104.0 15.5Q104.8 16.3 104.8 17.8L104.8 17.8L104.8 46.3Q104.8 47.8 104.0 48.6Q103.2 49.4 101.8 49.4Q100.3 49.4 99.6 48.6Q98.8 47.8 98.8 46.3L98.8 46.3L98.8 45.4Q98.0 46.9 96.4 48.0L96.4 48.0Q94.2 49.5 91.2 49.5ZM92.9 44.9L92.9 44.9Q94.7 44.9 96.0 44.1Q97.4 43.2 98.1 41.5Q98.9 39.8 98.9 37.2L98.9 37.2Q98.9 33.4 97.2 31.5Q95.6 29.6 92.9 29.6L92.9 29.6Q91.1 29.6 89.8 30.4Q88.4 31.3 87.7 33.0Q87.0 34.7 87.0 37.2L87.0 37.2Q87.0 41.0 88.6 43.0Q90.2 44.9 92.9 44.9ZM122.6 49.5L122.6 49.5Q118.6 49.5 115.7 48.0Q112.8 46.5 111.3 43.8Q109.7 41.0 109.7 37.3L109.7 37.3Q109.7 33.6 111.2 30.9Q112.7 28.2 115.4 26.6Q118.1 25.0 121.5 25.0L121.5 25.0Q124.0 25.0 126.0 25.9Q127.9 26.7 129.4 28.2Q130.8 29.8 131.5 31.9Q132.3 34.1 132.3 36.9L132.3 36.9Q132.3 37.7 131.7 38.2Q131.1 38.6 130.0 38.6L130.0 38.6L115.5 38.6Q115.8 41.4 117.2 43.0L117.2 43.0Q119.1 44.9 122.7 44.9L122.7 44.9Q123.9 44.9 125.5 44.6Q127.0 44.3 128.4 43.5L128.4 43.5Q129.4 43.0 130.2 43.0Q131.0 43.1 131.4 43.6Q131.9 44.1 132.0 44.8Q132.1 45.4 131.7 46.2Q131.4 46.9 130.5 47.4L130.5 47.4Q128.8 48.5 126.6 49.0Q124.4 49.5 122.6 49.5ZM115.5 35.2L115.5 35.2L127.3 35.2Q127.2 33.4 126.6 32.2L126.6 32.2Q126.0 30.7 124.8 29.9Q123.5 29.1 121.7 29.1L121.7 29.1Q119.7 29.1 118.3 30.1Q116.9 31 116.1 32.7L116.1 32.7Q115.6 33.8 115.5 35.2ZM145.6 49.5L145.6 49.5Q143.5 49.5 141.2 49.0Q138.9 48.6 137.1 47.6L137.1 47.6Q136.3 47.1 136.0 46.4Q135.7 45.8 135.8 45.1Q135.9 44.5 136.3 44.0Q136.7 43.5 137.3 43.4Q138.0 43.2 138.7 43.6L138.7 43.6Q140.7 44.5 142.3 44.9Q144.0 45.3 145.7 45.3L145.7 45.3Q148.0 45.3 149.1 44.5Q150.2 43.7 150.2 42.4L150.2 42.4Q150.2 41.3 149.5 40.7Q148.7 40.1 147.2 39.8L147.2 39.8L142.4 38.9Q139.5 38.3 137.9 36.7Q136.3 35.1 136.3 32.5L136.3 32.5Q136.3 30.2 137.6 28.6Q138.9 26.9 141.1 26.0Q143.4 25.0 146.3 25.0L146.3 25.0Q148.4 25.0 150.3 25.5Q152.1 26.0 153.9 26.9L153.9 26.9Q154.6 27.3 154.8 27.9Q155.1 28.6 155.0 29.2Q154.8 29.8 154.4 30.4Q154.0 30.9 153.3 31.0Q152.7 31.1 151.8 30.7L151.8 30.7Q150.4 29.9 149.0 29.6Q147.6 29.3 146.4 29.3L146.4 29.3Q144.0 29.3 142.9 30.1Q141.8 30.9 141.8 32.2L141.8 32.2Q141.8 33.3 142.4 33.9Q143.1 34.6 144.5 34.8L144.5 34.8L149.3 35.8Q152.4 36.3 154.0 37.9Q155.6 39.4 155.6 42.0L155.6 42.0Q155.6 45.5 152.9 47.5Q150.2 49.5 145.6 49.5ZM163.4 49.3L163.4 49.3Q162.0 49.3 161.2 48.5Q160.4 47.6 160.4 46.1L160.4 46.1L160.4 28.5Q160.4 26.9 161.2 26.0Q162.0 25.2 163.4 25.2L163.4 25.2Q164.9 25.2 165.6 26.0Q166.4 26.9 166.4 28.5L166.4 28.5L166.4 46.1Q166.4 47.6 165.7 48.5Q164.9 49.3 163.4 49.3ZM163.4 20.7L163.4 20.7Q161.7 20.7 160.8 19.9Q159.9 19.0 159.9 17.6L159.9 17.6Q159.9 16.0 160.8 15.2Q161.7 14.4 163.4 14.4L163.4 14.4Q165.1 14.4 166.1 15.2Q167.0 16.0 167.0 17.6L167.0 17.6Q167.0 19.0 166.1 19.9Q165.1 20.7 163.4 20.7ZM175.7 49.4L175.7 49.4Q174.2 49.4 173.4 48.6Q172.7 47.8 172.7 46.3L172.7 46.3L172.7 28.2Q172.7 26.7 173.4 25.9Q174.2 25.1 175.6 25.1Q177 25.1 177.8 25.9Q178.5 26.7 178.5 28.2L178.5 28.2L178.5 29.2Q179.5 27.4 181.3 26.3L181.3 26.3Q183.5 25.0 186.4 25.0Q189.2 25.0 191.0 26.1Q192.8 27.2 193.8 29.3Q194.7 31.4 194.7 34.7L194.7 34.7L194.7 46.3Q194.7 47.8 193.9 48.6Q193.1 49.4 191.7 49.4Q190.2 49.4 189.5 48.6Q188.7 47.8 188.7 46.3L188.7 46.3L188.7 35.0Q188.7 32.2 187.6 31Q186.6 29.8 184.4 29.8L184.4 29.8Q181.8 29.8 180.2 31.4Q178.7 33.1 178.7 35.8L178.7 35.8L178.7 46.3Q178.7 49.4 175.7 49.4ZM212.3 49.5L212.3 49.5Q208.3 49.5 205.5 48.0Q202.6 46.5 201.0 43.8Q199.5 41.0 199.5 37.3L199.5 37.3Q199.5 33.6 201.0 30.9Q202.5 28.2 205.2 26.6Q207.8 25.0 211.2 25.0L211.2 25.0Q213.7 25.0 215.7 25.9Q217.7 26.7 219.1 28.2Q220.5 29.8 221.3 31.9Q222.0 34.1 222.0 36.9L222.0 36.9Q222.0 37.7 221.4 38.2Q220.8 38.6 219.7 38.6L219.7 38.6L205.2 38.6Q205.5 41.4 207 43.0L207 43.0Q208.8 44.9 212.4 44.9L212.4 44.9Q213.7 44.9 215.2 44.6Q216.8 44.3 218.2 43.5L218.2 43.5Q219.2 43.0 220.0 43.0Q220.7 43.1 221.2 43.6Q221.6 44.1 221.7 44.8Q221.8 45.4 221.5 46.2Q221.1 46.9 220.2 47.4L220.2 47.4Q218.6 48.5 216.4 49.0Q214.2 49.5 212.3 49.5ZM205.2 35.2L205.2 35.2L217.0 35.2Q216.9 33.4 216.4 32.2L216.4 32.2Q215.7 30.7 214.5 29.9Q213.3 29.1 211.5 29.1L211.5 29.1Q209.4 29.1 208.0 30.1Q206.6 31 205.9 32.7L205.9 32.7Q205.4 33.8 205.2 35.2Z "/></g></svg>
@@ -0,0 +1,6 @@
1
+ /** The Andesine logo mark, for the `i-andesine:logo` icon. */
2
+ const logoPath =
3
+ "M11.9069231,0 C13.0018372,0 13.9483357,0.635443279 14.397751,1.55766239 L18.5217192,9.80587694 C18.7187228,10.1865349 18.83,10.6187339 18.83,11.0769231 C18.83,12.606327 17.5901732,13.8461538 16.0607692,13.8461538 C14.9658551,13.8461538 14.0193566,13.2107106 13.5699414,12.2884915 L12.0384615,9.22476923 L6.15084166,22.3086788 C5.73044955,23.3025974 4.74628371,24 3.59923077,24 C2.06982685,24 0.83,22.7601732 0.83,21.2307692 C0.83,20.8083537 0.924579355,20.4080284 1.09371684,20.0498145 L9.35966608,1.68108512 C9.78247025,0.692617692 10.7638119,0 11.9069231,0 Z M18.3684615,14.7692308 C19.8978655,14.7692308 21.1376923,16.0090576 21.1376923,17.5384615 C21.1376923,19.0678655 19.8978655,20.3076923 18.3684615,20.3076923 C18.2141372,20.3076923 18.0627613,20.2950686 17.9153101,20.2707976 L12.83,19.8461538 L12.7298971,19.8440218 C11.5018339,19.7916084 10.5223077,18.7794252 10.5223077,17.5384615 C10.5223077,16.2639583 11.5554967,15.2307692 12.83,15.2307692 L17.9097768,14.8070421 C18.0589734,14.7821723 18.2122062,14.7692308 18.3684615,14.7692308 Z";
4
+ const logoSVG = `<svg viewBox="0 0 24 24" fill="currentColor"><path d="${logoPath}"></path></svg>`;
5
+
6
+ export { logoPath, logoSVG };
@@ -0,0 +1,13 @@
1
+ <svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg"
2
+ xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <defs>
4
+ <linearGradient x1="0%" y1="100%" x2="100%" y2="0%" id="gradient">
5
+ <stop stop-color="#f88f52" offset="0%"></stop>
6
+ <stop stop-color="#ff3617" offset="50%"></stop>
7
+ <stop stop-color="#f88f52" offset="100%"></stop>
8
+ </linearGradient>
9
+ </defs>
10
+ <path
11
+ d="M31.75,6 C34.122314,6 36.1730607,7.37679377 37.1467937,9.37493517 L46.0820582,27.2460667 C46.5088993,28.0708256 46.75,29.0072568 46.75,30 C46.75,33.3137085 44.0637085,36 40.75,36 C38.377686,36 36.3269393,34.6232062 35.3532063,32.6250648 L32.035,25.987 L19.2784903,54.3354708 C18.3676407,56.488961 16.2352814,58 13.75,58 C10.4362915,58 7.75,55.3137085 7.75,52 C7.75,51.0847664 7.95492194,50.2173949 8.32138648,49.4412648 L26.2309432,9.64235109 C27.1470189,7.50067167 29.2732591,6 31.75,6 Z M45.75,38 C49.0637085,38 51.75,40.6862915 51.75,44 C51.75,47.3137085 49.0637085,50 45.75,50 C45.4156306,50 45.0876495,49.9726487 44.7681719,49.9200615 L33.75,49 L33.5331104,48.9953805 C30.8723067,48.8818181 28.75,46.6887547 28.75,44 C28.75,41.2385763 30.9885763,39 33.75,39 L44.756183,38.0819245 C45.0794424,38.02804 45.4114467,38 45.75,38 Z"
12
+ fill="url(#gradient)"></path>
13
+ </svg>
@@ -0,0 +1,14 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="630">
2
+ <!-- The app's dotted background, 1.5 times larger, fading out from the top-right corner. -->
3
+ <defs>
4
+ <pattern id="dots" width="24" height="24" patternUnits="userSpaceOnUse">
5
+ <circle cx="12" cy="12" r="3" fill="rgb(229, 231, 235)" fill-opacity="0.8" />
6
+ </pattern>
7
+ <radialGradient id="fade" cx="1200" cy="0" r="900" gradientUnits="userSpaceOnUse">
8
+ <stop offset="0" stop-color="white" />
9
+ <stop offset="1" stop-color="white" stop-opacity="0" />
10
+ </radialGradient>
11
+ <mask id="mask"><rect width="1200" height="630" fill="url(#fade)" /></mask>
12
+ </defs>
13
+ <rect width="1200" height="630" fill="url(#dots)" mask="url(#mask)" />
14
+ </svg>
@@ -0,0 +1,26 @@
1
+ ---
2
+ interface Props {
3
+ type?: "note" | "tip" | "warning" | "danger";
4
+ title?: string;
5
+ }
6
+
7
+ const { type = "note", title } = Astro.props;
8
+ const icons = {
9
+ note: "i-lucide:info text-gray-500",
10
+ tip: "i-lucide:lightbulb bg-gradient-to-tr",
11
+ warning: "i-lucide:triangle-alert text-amber-500",
12
+ danger: "i-lucide:octagon-alert text-red-500"
13
+ };
14
+ ---
15
+
16
+ <aside
17
+ role="note"
18
+ data-type={type}
19
+ class="my-2 flex gap-3 rounded-xl border border-gray-200 bg-white px-4 py-3 shadow-[0_0_12px_0px] shadow-gray-200"
20
+ >
21
+ <span aria-hidden="true" class:list={["mt-1 h-5 w-5 shrink-0", icons[type]]}></span>
22
+ <div class="min-w-0 flex-1">
23
+ {title && <p class="not-prose font-semibold text-gray-900">{title}</p>}
24
+ <div class="[&>*:first-child]:mt-0 [&>*:last-child]:mb-0"><slot /></div>
25
+ </div>
26
+ </aside>