@clidey/dory 0.21.4 → 0.23.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 (75) hide show
  1. package/bin/dory.ts +18 -4
  2. package/dist/api-playground-demo.mdx +119 -0
  3. package/dist/api-reference/asyncapi.json +324 -0
  4. package/dist/api-reference/openapi.json +366 -0
  5. package/dist/api-reference/operations/create.mdx +5 -0
  6. package/dist/api-reference/operations/delete.mdx +5 -0
  7. package/dist/api-reference/operations/get.mdx +5 -0
  8. package/dist/api-reference/operations/update.mdx +5 -0
  9. package/dist/api-reference/websocket-operations/receive-chat-message.mdx +5 -0
  10. package/dist/api-reference/websocket-operations/receive-notifications.mdx +5 -0
  11. package/dist/api-reference/websocket-operations/receive-presence-update.mdx +5 -0
  12. package/dist/api-reference/websocket-operations/send-chat-message.mdx +5 -0
  13. package/dist/api-reference/websocket-operations/send-presence-update.mdx +5 -0
  14. package/dist/dory.json +64 -0
  15. package/dist/favicon.svg +75 -0
  16. package/dist/features.mdx +440 -0
  17. package/dist/frontmatter.json +77 -0
  18. package/dist/index.html +55 -0
  19. package/dist/introduction.mdx +44 -0
  20. package/dist/llms.txt +561 -0
  21. package/dist/websocket-playground-demo.mdx +135 -0
  22. package/docs/dory.json +5 -0
  23. package/docs/favicon.svg +1 -1
  24. package/docs/introduction.mdx +2 -2
  25. package/package.json +13 -10
  26. package/src/app.css +2 -0
  27. package/src/components/dropdown.tsx +30 -26
  28. package/src/components/loading.tsx +6 -8
  29. package/src/components/navigation.tsx +8 -6
  30. package/src/components/notification.tsx +9 -93
  31. package/src/components/routes.tsx +1 -1
  32. package/src/components/search.tsx +31 -104
  33. package/src/components/store.ts +4 -1
  34. package/src/main.tsx +9 -5
  35. package/src/mdx/accordion.tsx +21 -28
  36. package/src/mdx/api-playground.tsx +68 -83
  37. package/src/mdx/api.tsx +21 -21
  38. package/src/mdx/async-api.tsx +15 -31
  39. package/src/mdx/callout.tsx +27 -43
  40. package/src/mdx/card.tsx +20 -14
  41. package/src/mdx/code.tsx +26 -26
  42. package/src/mdx/expandable.tsx +21 -25
  43. package/src/mdx/fence.tsx +2 -2
  44. package/src/mdx/list.tsx +2 -2
  45. package/src/mdx/open-api.tsx +31 -45
  46. package/src/mdx/table.tsx +8 -3
  47. package/src/mdx/tag.tsx +27 -40
  48. package/src/mdx/text.tsx +3 -2
  49. package/src/mdx/websocket-playground.tsx +150 -81
  50. package/src/theme.scss +50 -106
  51. package/src/types/config.ts +47 -0
  52. package/src/ui/header.tsx +12 -9
  53. package/src/ui/layout.tsx +5 -4
  54. package/src/ui/mobile-navigation.tsx +36 -63
  55. package/src/ui/table-of-content.tsx +3 -3
  56. package/src/utils/colors.ts +54 -0
  57. package/src/utils/fonts.ts +4 -1
  58. package/vite.config.ts +2 -0
  59. package/.claude/settings.json +0 -29
  60. package/.claude/settings.local.json +0 -12
  61. package/.github/ISSUE_TEMPLATE/anything-else.md +0 -10
  62. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -39
  63. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  64. package/.github/dependabot.yml +0 -11
  65. package/.github/workflows/claude.yml +0 -37
  66. package/docs/assets/dory.jpeg +0 -0
  67. package/k8s/Dockerfile +0 -14
  68. package/k8s/config/nginx-default.conf +0 -22
  69. package/k8s/dev.Dockerfile +0 -16
  70. package/k8s/docs.Dockerfile +0 -15
  71. package/public/demo.mov +0 -0
  72. package/src/components/dark-mode-toggle.tsx +0 -25
  73. package/src/index.css +0 -24
  74. package/src/utils/hooks.ts +0 -46
  75. /package/{assets → dist/logo}/logo.svg +0 -0
package/src/ui/header.tsx CHANGED
@@ -3,10 +3,13 @@ import { useEffect, useMemo, useState } from 'preact/hooks';
3
3
  import { Link } from 'wouter-preact';
4
4
  import { usePathname } from 'wouter-preact/use-browser-location';
5
5
  import docsConfig from '../../docs/dory.json';
6
- import { DarkModeToggle } from '../components/dark-mode-toggle';
6
+ import type { DoryConfig } from '../types/config';
7
7
  import { MobileSearch, Search } from '../components/search';
8
8
  import { ALL_NAVIGATION } from '../components/store';
9
9
  import { MobileNavigation } from './mobile-navigation';
10
+ import { ModeToggle } from '@clidey/ux';
11
+
12
+ const config = docsConfig as DoryConfig;
10
13
 
11
14
  function TopLevelNavItem({ href, children, isActive }: { href: string; children: string; isActive?: boolean }) {
12
15
  return (
@@ -14,10 +17,10 @@ function TopLevelNavItem({ href, children, isActive }: { href: string; children:
14
17
  <Link
15
18
  to={href}
16
19
  className={classNames(
17
- "text-sm/5 transition",
18
- isActive
19
- ? "text-sky-500"
20
- : "text-zinc-600 hover:text-zinc-900 dark:text-zinc-400 dark:hover:text-white"
20
+ "text-xs transition hover:opacity-80",
21
+ {
22
+ "text-brand-foreground": isActive,
23
+ },
21
24
  )}
22
25
  >
23
26
  {children}
@@ -31,7 +34,7 @@ export function Header({ className }: { className?: string }) {
31
34
  const pathname = usePathname();
32
35
 
33
36
  const { light, dark } = useMemo(() => {
34
- return { light: docsConfig.logo.light, dark: docsConfig.logo.dark };
37
+ return { light: config.logo.light, dark: config.logo.dark };
35
38
  }, []);
36
39
 
37
40
  useEffect(() => {
@@ -60,7 +63,7 @@ export function Header({ className }: { className?: string }) {
60
63
  <div className="flex items-center grow gap-2">
61
64
  <img src={`/${light}`} alt="logo" className="w-8 hidden dark:block" />
62
65
  <img src={`/${dark}`} alt="logo" className="w-8 block dark:hidden" />
63
- <h1 className="text-base lg:text-2xl font-bold">{docsConfig.name}</h1>
66
+ <h1 className="text-base lg:text-2xl font-bold">{config.name}</h1>
64
67
  </div>
65
68
  <nav className="hidden md:block">
66
69
  <ul role="list" className="flex items-center gap-8">
@@ -76,10 +79,10 @@ export function Header({ className }: { className?: string }) {
76
79
  </ul>
77
80
  </nav>
78
81
  <div className="hidden md:block md:h-5 md:w-px md:bg-zinc-900/10 md:dark:bg-white/15" />
79
- <div className="flex items-center gap-3">
82
+ <div className="flex items-center gap-3" data-testid="header-actions">
80
83
  <MobileSearch />
81
84
  <Search />
82
- <DarkModeToggle />
85
+ <ModeToggle data-testid="mode-toggle" />
83
86
  <MobileNavigation />
84
87
  </div>
85
88
  </div>
package/src/ui/layout.tsx CHANGED
@@ -11,6 +11,7 @@ import { TableOfContents } from './table-of-content';
11
11
  import { Loading } from '../components/loading';
12
12
  import Dropdown from '../components/dropdown';
13
13
  import { useNotification } from '../components/notification';
14
+ import { SparkleIcon } from 'lucide-react';
14
15
 
15
16
  interface LayoutProps {
16
17
  children: ComponentChildren;
@@ -144,16 +145,16 @@ export default function Layout({ children }: LayoutProps) {
144
145
  return (
145
146
  <div className="flex w-full flex-col">
146
147
  <Header />
147
- <div id="container" className="relative mx-auto flex w-full max-w-8xl flex-auto justify-center sm:px-2 lg:px-8 xl:px-32">
148
+ <div id="container" className="relative flex w-full max-w-8xl sm:px-2 lg:px-8">
148
149
  <div className="hidden lg:relative lg:block lg:flex-none">
149
150
  <div className="sticky top-[4.75rem] -ml-0.5 h-[calc(100vh-4.75rem)] w-64 overflow-x-hidden overflow-y-auto py-16 pr-8 pl-0.5 xl:w-72 xl:pr-16">
150
151
  <Navigation />
151
152
  </div>
152
153
  </div>
153
154
  <main className="flex px-4 py-16 sm:px-6 lg:px-8 grow">
154
- <div className="max-w-[calc(100vw-16px)] xl:max-w-[70vw] min-w-0 px-4 lg:pr-0 lg:pl-8 xl:px-16 w-full">
155
+ <div className="min-w-0 w-full">
155
156
  <article className="h-full flex flex-1 flex-col">
156
- <div className="flex justify-between items-center">
157
+ <div className="flex justify-between items-start">
157
158
  <header className="mb-8">
158
159
  {title && (
159
160
  <h1 className="font-display text-lg tracking-tight">
@@ -168,7 +169,7 @@ export default function Layout({ children }: LayoutProps) {
168
169
  </header>
169
170
  {
170
171
  openAPIJSON == null && asyncAPIJSON == null &&
171
- <Dropdown className='min-w-[120px]' buttonLabel="AI Actions" items={dropdownItems} />
172
+ <Dropdown className="gap-0" buttonLabel={<SparkleIcon className="w-4 h-4" />} items={dropdownItems} />
172
173
  }
173
174
  </div>
174
175
  <div className="flex-1 min-h-[calc(100vh-2rem)]">
@@ -1,91 +1,64 @@
1
1
  'use client'
2
2
 
3
- import {
4
- Dialog,
5
- DialogBackdrop,
6
- DialogPanel,
7
- TransitionChild,
8
- } from '@headlessui/react'
9
- import { motion } from 'motion/react'
10
- import { createContext, Suspense, useContext, useState } from 'react'
3
+ import { Sheet, SheetContent, Button } from '@clidey/ux'
4
+ import { createContext, Suspense, useCallback, useContext, useRef, useState } from 'react'
11
5
 
12
6
  import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline'
13
7
  import { Navigation } from '../components/navigation'
14
8
 
15
9
  const IsInsideMobileNavigationContext = createContext(false)
16
10
 
17
- function MobileNavigationDialog({
18
- isOpen,
19
- close,
20
- }: {
21
- isOpen: boolean
22
- close: () => void
23
- }) {
24
- return (
25
- <Dialog
26
- transition
27
- open={isOpen}
28
- onClose={close}
29
- className="fixed inset-0 z-50 lg:hidden"
30
- >
31
- <DialogBackdrop
32
- transition
33
- className="fixed inset-0 top-0 pt-8 bg-zinc-400/20 backdrop-blur-xs data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in dark:bg-black/40"
34
- />
35
-
36
- <DialogPanel>
37
- <TransitionChild>
38
- <motion.div
39
- layoutScroll
40
- className="fixed top-0 bottom-0 left-0 w-full overflow-y-auto bg-white px-4 pt-8 pb-4 shadow-lg ring-1 shadow-zinc-900/10 ring-zinc-900/7.5 duration-500 ease-in-out data-closed:-translate-x-full min-[416px]:max-w-sm sm:px-6 sm:pb-10 dark:bg-zinc-900 dark:ring-zinc-800 flex flex-col justify-between"
41
- >
42
- <Navigation />
43
- <div class="flex flex-col justify-end items-end mb-4 mr-2" onClick={close}>
44
- <XMarkIcon className="w-8 stroke-zinc-900 dark:stroke-white" />
45
- </div>
46
- </motion.div>
47
- </TransitionChild>
48
- </DialogPanel>
49
- </Dialog>
50
- )
51
- }
52
-
53
11
  export function useIsInsideMobileNavigation() {
54
12
  return useContext(IsInsideMobileNavigationContext)
55
13
  }
56
14
 
57
15
  export function useMobileNavigation() {
58
16
  const [isOpen, setIsOpen] = useState(false)
59
-
17
+ const isOpenRef = useRef(isOpen)
18
+ isOpenRef.current = isOpen
19
+
20
+ const open = useCallback(() => setIsOpen(true), [])
21
+ const close = useCallback(() => setIsOpen(false), [])
22
+ const toggle = useCallback(() => setIsOpen(prev => !prev), [])
23
+
60
24
  return {
61
25
  isOpen,
62
- open: () => setIsOpen(true),
63
- close: () => setIsOpen(false),
64
- toggle: () => setIsOpen(prev => !prev)
26
+ isOpenRef,
27
+ open,
28
+ close,
29
+ toggle,
65
30
  }
66
31
  }
67
32
 
68
33
  export function MobileNavigation() {
69
34
  const isInsideMobileNavigation = useIsInsideMobileNavigation()
70
- const { isOpen, toggle, close } = useMobileNavigation()
35
+ const { isOpen, open, close } = useMobileNavigation()
71
36
  const ToggleIcon = isOpen ? XMarkIcon : Bars3Icon;
72
37
 
73
38
  return (
74
39
  <IsInsideMobileNavigationContext.Provider value={true}>
75
- <button
76
- type="button"
77
- className="relative flex size-6 items-center justify-center rounded-md transition hover:bg-zinc-900/5 dark:hover:bg-white/5 lg:hidden"
78
- aria-label="Toggle navigation"
79
- onClick={toggle}
80
- >
81
- <span className="absolute size-12 [@media(pointer:fine)]:hidden" />
82
- <ToggleIcon className="w-8 stroke-zinc-900 dark:stroke-white" />
83
- </button>
84
- {!isInsideMobileNavigation && (
85
- <Suspense fallback={null}>
86
- <MobileNavigationDialog isOpen={isOpen} close={close} />
87
- </Suspense>
88
- )}
40
+ <Sheet open={isOpen} onOpenChange={(status) => {
41
+ if (!status) {
42
+ close();
43
+ }
44
+ }}>
45
+ <Button
46
+ variant="outline"
47
+ size="icon"
48
+ className="relative flex size-6 lg:hidden p-4"
49
+ aria-label="Toggle navigation"
50
+ onClick={open}
51
+ >
52
+ <ToggleIcon className="w-8 stroke-zinc-900 dark:stroke-white" />
53
+ </Button>
54
+ {!isInsideMobileNavigation && (
55
+ <Suspense fallback={null}>
56
+ <SheetContent side="left" className="w-full sm:max-w-sm p-8 overflow-y-auto flex flex-col justify-between">
57
+ <Navigation />
58
+ </SheetContent>
59
+ </Suspense>
60
+ )}
61
+ </Sheet>
89
62
  </IsInsideMobileNavigationContext.Provider>
90
63
  )
91
64
  }
@@ -114,7 +114,7 @@ export function TableOfContents() {
114
114
  }
115
115
 
116
116
  return (
117
- <div className="hidden xl:sticky xl:top-[4.75rem] xl:-mr-6 xl:block xl:h-[calc(100vh-4.75rem)] xl:flex-none xl:overflow-y-auto xl:py-16 xl:pr-6">
117
+ <div className="hidden xl:sticky xl:top-[4.75rem] xl:-mr-6 xl:block xl:h-[calc(100vh-4.75rem)] xl:flex-none xl:overflow-y-auto xl:py-16 xl:pr-6 pl-4">
118
118
  <nav aria-labelledby="on-this-page-title" className="w-56">
119
119
  {sections.length > 0 && (
120
120
  <>
@@ -131,7 +131,7 @@ export function TableOfContents() {
131
131
  <a
132
132
  href={`#${section.id}`}
133
133
  className={classNames({
134
- "text-sky-500": isActive(section),
134
+ "text-brand-foreground": isActive(section),
135
135
  "font-normal text-slate-500 hover:text-slate-700 dark:text-slate-400 dark:hover:text-slate-300": !isActive(section),
136
136
  })}>
137
137
  {section.title}
@@ -145,7 +145,7 @@ export function TableOfContents() {
145
145
  href={`#${subSection.id}`}
146
146
  className={
147
147
  isActive(subSection)
148
- ? 'text-sky-500'
148
+ ? 'text-brand-foreground'
149
149
  : 'hover:text-slate-600 dark:hover:text-slate-300'
150
150
  }
151
151
  >
@@ -0,0 +1,54 @@
1
+ import docsConfig from '../../docs/dory.json';
2
+ import type { DoryConfig } from '../types/config';
3
+
4
+ const config = docsConfig as DoryConfig;
5
+
6
+ /**
7
+ * Converts hex color to RGB values for CSS variable usage
8
+ */
9
+ function hexToRgb(hex: string): string {
10
+ // Remove # if present
11
+ const cleanHex = hex.replace('#', '');
12
+
13
+ // Parse hex values
14
+ const r = parseInt(cleanHex.substring(0, 2), 16);
15
+ const g = parseInt(cleanHex.substring(2, 4), 16);
16
+ const b = parseInt(cleanHex.substring(4, 6), 16);
17
+
18
+ return `${r} ${g} ${b}`;
19
+ }
20
+
21
+ /**
22
+ * Load and apply brand colors from dory.json configuration
23
+ * Sets CSS variables for use throughout the application
24
+ */
25
+ export function loadColors() {
26
+ const { colors } = config;
27
+ if (!colors) return;
28
+
29
+ // Set CSS variables on the root element for both light and dark modes
30
+ const root = document.documentElement;
31
+
32
+ // Set primary color (used in both light and dark mode)
33
+ if (colors.primary) {
34
+ root.style.setProperty('--brand-primary', colors.primary);
35
+ root.style.setProperty('--brand-primary-rgb', hexToRgb(colors.primary));
36
+ }
37
+
38
+ // Set light mode brand color
39
+ if (colors.light) {
40
+ root.style.setProperty('--brand-light', colors.light);
41
+ root.style.setProperty('--brand-light-rgb', hexToRgb(colors.light));
42
+ }
43
+
44
+ // Set dark mode brand color
45
+ if (colors.dark) {
46
+ root.style.setProperty('--brand-dark', colors.dark);
47
+ root.style.setProperty('--brand-dark-rgb', hexToRgb(colors.dark));
48
+ }
49
+
50
+ // Set the legacy variable for backward compatibility
51
+ if (colors.primary) {
52
+ root.style.setProperty('--brand-foreground', colors.primary);
53
+ }
54
+ }
@@ -1,7 +1,10 @@
1
1
  import docsConfig from '../../docs/dory.json';
2
+ import type { DoryConfig } from '../types/config';
3
+
4
+ const config = docsConfig as DoryConfig;
2
5
 
3
6
  export function loadFonts() {
4
- const { fonts } = docsConfig;
7
+ const { fonts } = config;
5
8
  if (!fonts) return;
6
9
 
7
10
  // Create a style element for the font face
package/vite.config.ts CHANGED
@@ -30,5 +30,7 @@ export default defineConfig(({ command }) => ({
30
30
  publicDir: "docs",
31
31
  server: {
32
32
  allowedHosts: true,
33
+ port: 3000,
34
+ strictPort: false,
33
35
  },
34
36
  }));
@@ -1,29 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(find:*)",
5
- "Bash(grep:*)",
6
- "Bash(rg:*)",
7
- "Bash(npm run generate:*)",
8
- "Bash(ls:*)",
9
- "Bash(rm:*)",
10
- "Bash(npm run build:*)",
11
- "Bash(npx tsc:*)",
12
- "Bash(npx typescript:*)",
13
- "Bash(npm install:*)",
14
- "Bash(pnpm install:*)",
15
- "Bash(pnpm run:*)",
16
- "Bash(node*)",
17
- "Bash(git config*)",
18
- "Bash(git checkout -b*)",
19
- "Bash(git add*)",
20
- "Bash(git commit -m*)",
21
- "Bash(git push*)",
22
- "Bash(gh pr create*)",
23
- "Bash(git status*)",
24
- "Bash(git diff*)",
25
- "Bash(git log*)"
26
- ]
27
- },
28
- "enableAllProjectMcpServers": false
29
- }
@@ -1,12 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(pnpm add:*)",
5
- "Bash(mv:*)",
6
- "Bash(pnpm exec tsx:*)",
7
- "Bash(npx tsx:*)"
8
- ],
9
- "deny": [],
10
- "ask": []
11
- }
12
- }
@@ -1,10 +0,0 @@
1
- ---
2
- name: Anything else
3
- about: Use this for anything that doesn't fall under the categories above.
4
- title: "[QUESTION/MISC] - {your title here}"
5
- labels: question
6
- assignees: ''
7
-
8
- ---
9
-
10
-
@@ -1,39 +0,0 @@
1
- ---
2
- name: Bug report
3
- about: Create a report to help us improve Dory.
4
- title: "[BUG] - {your title here}"
5
- labels: bug
6
- assignees: ''
7
-
8
- ---
9
-
10
- **Describe the bug**
11
- A clear and concise description of what the bug is.
12
-
13
- **To Reproduce**
14
- Steps to reproduce the behavior:
15
- 1. Go to '...'
16
- 2. Click on '....'
17
- 3. Scroll down to '....'
18
- 4. See error
19
-
20
- **Expected behavior**
21
- A clear and concise description of what you expected to happen.
22
-
23
- **Screenshots**
24
- If applicable, add screenshots to help explain your problem.
25
-
26
- **Desktop (please complete the following information):**
27
- - OS that Dory is running on: [e.g. Ubuntu]
28
- - How you're running Dory: [e.g, Docker, exe, manually]
29
- - Browser: [e.g. chrome, safari]
30
- - Version: [e.g. 22]
31
-
32
- **Smartphone (please complete the following information):**
33
- - Device: [e.g. iPhone6]
34
- - OS: [e.g. iOS8.1]
35
- - Browser: [e.g. stock browser, safari]
36
- - Version: [e.g. 22]
37
-
38
- **Additional context**
39
- Add any other context about the problem here.
@@ -1,20 +0,0 @@
1
- ---
2
- name: Feature request
3
- about: Suggest an idea for this project.
4
- title: "[FR] - {your title here}"
5
- labels: enhancement
6
- assignees: ''
7
-
8
- ---
9
-
10
- **Is your feature request related to a problem? Please describe.**
11
- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
-
13
- **Describe the solution you'd like**
14
- A clear and concise description of what you want to happen.
15
-
16
- **Describe alternatives you've considered**
17
- A clear and concise description of any alternative solutions or features you've considered.
18
-
19
- **Additional context**
20
- Add any other context or screenshots about the feature request here.
@@ -1,11 +0,0 @@
1
- # To get started with Dependabot version updates, you'll need to specify which
2
- # package ecosystems to update and where the package manifests are located.
3
- # Please see the documentation for all configuration options:
4
- # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
5
-
6
- version: 2
7
- updates:
8
- - package-ecosystem: "npm"
9
- directory: "/"
10
- schedule:
11
- interval: "daily"
@@ -1,37 +0,0 @@
1
- name: Claude Code
2
-
3
- on:
4
- issue_comment:
5
- types: [created]
6
- pull_request_review_comment:
7
- types: [created]
8
- issues:
9
- types: [opened, assigned]
10
- pull_request_review:
11
- types: [submitted]
12
-
13
- jobs:
14
- claude:
15
- if: |
16
- (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
17
- (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
18
- (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
19
- (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
20
- runs-on: ubuntu-latest
21
- permissions:
22
- contents: read
23
- pull-requests: read
24
- issues: read
25
- id-token: write
26
- steps:
27
- - name: Checkout repository
28
- uses: actions/checkout@v4
29
- with:
30
- fetch-depth: 1
31
-
32
- - name: Run Claude Code
33
- id: claude
34
- uses: anthropics/claude-code-action@beta
35
- with:
36
- anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
37
-
Binary file
package/k8s/Dockerfile DELETED
@@ -1,14 +0,0 @@
1
- FROM node:22.16-alpine
2
-
3
- WORKDIR /app
4
-
5
- # Install git
6
- RUN apk add --no-cache git
7
-
8
- COPY ./docs/logo/logo.svg /app/docs/logo/logo.svg
9
- COPY ./k8s/config/nginx-default.conf /app/k8s/config/nginx-default.conf
10
-
11
- RUN npm install -g @clidey/dory@0.21.1
12
- EXPOSE 3000
13
-
14
- CMD ["dory", "preview"]
@@ -1,22 +0,0 @@
1
- server {
2
- listen 80;
3
- listen [::]:80;
4
- server_name localhost;
5
-
6
- location ^~ /docs {
7
- alias /usr/share/docs;
8
- index index.html index.htm;
9
- try_files $uri $uri/ /index.html;
10
- }
11
-
12
- location / {
13
- root /usr/share/nginx/html;
14
- index index.html index.htm;
15
- try_files $uri /index.html;
16
- }
17
-
18
- error_page 500 502 503 504 /50x.html;
19
- location = /50x.html {
20
- root /usr/share/nginx/html;
21
- }
22
- }
@@ -1,16 +0,0 @@
1
- FROM node:22.16-alpine
2
-
3
- WORKDIR /app
4
- RUN corepack enable && corepack prepare pnpm@latest --activate
5
- RUN apk add --no-cache git
6
-
7
- COPY package.json pnpm-lock.yaml ./
8
- RUN pnpm i
9
-
10
- COPY . .
11
-
12
- RUN rm -rf /app/src/data
13
-
14
- EXPOSE 3000
15
-
16
- CMD ["pnpm", "dev", "--host", "0.0.0.0", "--port", "3000"]
@@ -1,15 +0,0 @@
1
- FROM node:20-alpine AS builder
2
-
3
- RUN corepack enable && corepack prepare pnpm@10.10.0 --activate
4
- WORKDIR /app
5
- COPY package.json pnpm-lock.yaml ./
6
- RUN pnpm install --frozen-lockfile
7
- COPY . .
8
- RUN pnpm build
9
-
10
- FROM nginx:alpine
11
- COPY --from=builder /app/dist /usr/share/nginx/html
12
- COPY --from=builder /app/k8s/config/nginx-default.conf /etc/nginx/conf.d/default.conf
13
- EXPOSE 80
14
-
15
- CMD ["nginx", "-g", "daemon off;"]
package/public/demo.mov DELETED
Binary file
@@ -1,25 +0,0 @@
1
- import { SunIcon, MoonIcon } from '@heroicons/react/24/outline';
2
- import { useDarkMode } from '../utils/hooks';
3
- import classNames from 'classnames';
4
-
5
- export function DarkModeToggle() {
6
- const { isDark, toggleDarkMode } = useDarkMode();
7
-
8
- return (
9
- <button
10
- onClick={toggleDarkMode}
11
- className={classNames(
12
- 'rounded-lg p-2 transition-colors duration-200',
13
- 'hover:bg-gray-100 dark:hover:bg-gray-800',
14
- 'focus:outline-none focus:ring-2 focus:ring-sky-500 focus:ring-offset-2 dark:focus:ring-offset-gray-900'
15
- )}
16
- aria-label={isDark ? 'Switch to light mode' : 'Switch to dark mode'}
17
- title={isDark ? 'Switch to light mode' : 'Switch to dark mode'}>
18
- {isDark ? (
19
- <SunIcon className="h-5 w-5 text-yellow-500" />
20
- ) : (
21
- <MoonIcon className="h-5 w-5 text-gray-600 dark:text-gray-400" />
22
- )}
23
- </button>
24
- );
25
- }
package/src/index.css DELETED
@@ -1,24 +0,0 @@
1
- :root {
2
- font-family: var(--font-family, system-ui, Avenir, Helvetica, Arial, sans-serif);
3
- line-height: 1.5;
4
- font-weight: 400;
5
-
6
- font-synthesis: none;
7
- text-rendering: optimizeLegibility;
8
- -webkit-font-smoothing: antialiased;
9
- -moz-osx-font-smoothing: grayscale;
10
- }
11
-
12
-
13
- article h2:first-of-type {
14
- display: none;
15
- }
16
-
17
- article hr:first-of-type {
18
- display: none;
19
- }
20
-
21
- article img {
22
- margin-top: 1rem;
23
- margin-bottom: 1rem;
24
- }