@clidey/dory 0.22.0 → 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 (181) hide show
  1. package/bin/dory.ts +18 -4
  2. package/dist/dory.json +5 -0
  3. package/dist/favicon.svg +1 -1
  4. package/dist/index.html +6 -6
  5. package/dist/introduction.mdx +2 -2
  6. package/dist/llms.txt +2 -2
  7. package/docs/dory.json +5 -0
  8. package/docs/favicon.svg +1 -1
  9. package/docs/introduction.mdx +2 -2
  10. package/package.json +13 -10
  11. package/src/app.css +2 -0
  12. package/src/components/dropdown.tsx +30 -26
  13. package/src/components/loading.tsx +6 -8
  14. package/src/components/navigation.tsx +8 -6
  15. package/src/components/notification.tsx +9 -93
  16. package/src/components/routes.tsx +1 -1
  17. package/src/components/search.tsx +31 -104
  18. package/src/components/store.ts +4 -1
  19. package/src/main.tsx +9 -5
  20. package/src/mdx/accordion.tsx +21 -28
  21. package/src/mdx/api-playground.tsx +68 -83
  22. package/src/mdx/api.tsx +21 -21
  23. package/src/mdx/async-api.tsx +15 -31
  24. package/src/mdx/callout.tsx +27 -43
  25. package/src/mdx/card.tsx +20 -14
  26. package/src/mdx/code.tsx +26 -26
  27. package/src/mdx/expandable.tsx +21 -25
  28. package/src/mdx/fence.tsx +2 -2
  29. package/src/mdx/list.tsx +2 -2
  30. package/src/mdx/open-api.tsx +31 -45
  31. package/src/mdx/table.tsx +8 -3
  32. package/src/mdx/tag.tsx +27 -40
  33. package/src/mdx/text.tsx +3 -2
  34. package/src/mdx/websocket-playground.tsx +150 -81
  35. package/src/theme.scss +50 -106
  36. package/src/types/config.ts +47 -0
  37. package/src/ui/header.tsx +12 -9
  38. package/src/ui/layout.tsx +5 -4
  39. package/src/ui/mobile-navigation.tsx +36 -63
  40. package/src/ui/table-of-content.tsx +3 -3
  41. package/src/utils/colors.ts +54 -0
  42. package/src/utils/fonts.ts +4 -1
  43. package/vite.config.ts +2 -0
  44. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  45. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  46. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  47. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  48. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  49. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  50. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  51. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  52. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  53. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  54. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  55. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  56. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  57. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  58. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  59. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  60. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  61. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  62. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  63. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  64. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  65. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  66. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  67. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  68. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  69. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  70. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  71. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  72. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  73. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  74. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  75. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  76. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  77. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  78. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  79. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  80. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  81. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  82. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  83. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  84. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  85. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  86. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  87. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  88. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  89. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  90. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  91. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  92. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  93. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  94. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  95. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  96. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  97. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  98. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  99. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  100. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  101. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  102. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  103. package/dist/assets/__vite-browser-external-BIHI7g3E.js +0 -1
  104. package/dist/assets/_basePickBy-CsnA5_xx.js +0 -1
  105. package/dist/assets/_baseUniq-COwFna6s.js +0 -1
  106. package/dist/assets/api-playground-demo-Ct5XK2u1.js +0 -45
  107. package/dist/assets/api-playground-demo-vBae5R-d.js +0 -119
  108. package/dist/assets/arc-Dy4kITED.js +0 -1
  109. package/dist/assets/architectureDiagram-IEHRJDOE-BiaWQpzt.js +0 -36
  110. package/dist/assets/blockDiagram-JOT3LUYC-7LfUOsM7.js +0 -121
  111. package/dist/assets/c4Diagram-VJAJSXHY-Ca-3deDF.js +0 -10
  112. package/dist/assets/channel-j6jMzwSu.js +0 -1
  113. package/dist/assets/chunk-4BMEZGHF-Cln31Q_z.js +0 -1
  114. package/dist/assets/chunk-A2AXSNBT-Cj4U7K4I.js +0 -164
  115. package/dist/assets/chunk-AEK57VVT-1kn9120k.js +0 -220
  116. package/dist/assets/chunk-D6G4REZN-DMgQaOLS.js +0 -1
  117. package/dist/assets/chunk-RZ5BOZE2-DDd-DrSb.js +0 -1
  118. package/dist/assets/chunk-XZIHB7SX-sVdgMrEr.js +0 -1
  119. package/dist/assets/classDiagram-GIVACNV2-B9ObtIrc.js +0 -1
  120. package/dist/assets/classDiagram-v2-COTLJTTW-B9ObtIrc.js +0 -1
  121. package/dist/assets/clone-UOttdbrS.js +0 -1
  122. package/dist/assets/create-D-Wjvs-T.js +0 -6
  123. package/dist/assets/create-DpzlgYHc.js +0 -4
  124. package/dist/assets/cytoscape.esm-BY7v1xhs.js +0 -331
  125. package/dist/assets/dagre-OKDRZEBW-C4q12sCc.js +0 -4
  126. package/dist/assets/delete-DwAmDeAN.js +0 -4
  127. package/dist/assets/delete-cbziNMWs.js +0 -5
  128. package/dist/assets/diagram-SSKATNLV-BxNC6sGs.js +0 -43
  129. package/dist/assets/diagram-VNBRO52H-CukGDk3b.js +0 -24
  130. package/dist/assets/dory.jpeg +0 -0
  131. package/dist/assets/erDiagram-Q7BY3M3F-TiiVq0dv.js +0 -60
  132. package/dist/assets/favicon-Z67lNtJu.svg +0 -75
  133. package/dist/assets/features-6EEoDloV.js +0 -269
  134. package/dist/assets/features-EZwrzTnN.js +0 -441
  135. package/dist/assets/flowDiagram-4HSFHLVR-DykkGbol.js +0 -161
  136. package/dist/assets/ganttDiagram-APWFNJXF-Bqp95-S3.js +0 -257
  137. package/dist/assets/get-BeAg4Qrr.js +0 -5
  138. package/dist/assets/get-Dj1eDs2i.js +0 -4
  139. package/dist/assets/gitGraphDiagram-7IBYFJ6S-BiYVs9VI.js +0 -65
  140. package/dist/assets/graph-LkKKMaDZ.js +0 -1
  141. package/dist/assets/index-CGd7uPvh.css +0 -1
  142. package/dist/assets/index-vOROtq-e.js +0 -9596
  143. package/dist/assets/infoDiagram-PH2N3AL5-EA7h3wZa.js +0 -2
  144. package/dist/assets/init-Gi6I4Gst.js +0 -1
  145. package/dist/assets/introduction-CzXlzjWa.js +0 -38
  146. package/dist/assets/introduction-ylYJcPz3.js +0 -45
  147. package/dist/assets/journeyDiagram-U35MCT3I-BZiVuCZu.js +0 -138
  148. package/dist/assets/kanban-definition-NDS4AKOZ-SCdQ8OjR.js +0 -88
  149. package/dist/assets/layout-C9-9-M2q.js +0 -1
  150. package/dist/assets/linear-CTbdhYd1.js +0 -1
  151. package/dist/assets/mermaid.core-DUFqLK_I.js +0 -213
  152. package/dist/assets/mindmap-definition-ALO5MXBD-BPbKEbjk.js +0 -95
  153. package/dist/assets/ordinal-Cboi1Yqb.js +0 -1
  154. package/dist/assets/pieDiagram-IB7DONF6-DPg1sNm8.js +0 -30
  155. package/dist/assets/quadrantDiagram-7GDLP6J5-DmtJM50d.js +0 -7
  156. package/dist/assets/radar-MK3ICKWK-DnO5LA4B.js +0 -128
  157. package/dist/assets/receive-chat-message-B2jsY1P6.js +0 -4
  158. package/dist/assets/receive-chat-message-BeaC4eqS.js +0 -5
  159. package/dist/assets/receive-notifications-BouRLPFj.js +0 -4
  160. package/dist/assets/receive-notifications-DYnXRRBz.js +0 -5
  161. package/dist/assets/receive-presence-update-CRgeSUpk.js +0 -5
  162. package/dist/assets/receive-presence-update-UEm47KAG.js +0 -4
  163. package/dist/assets/requirementDiagram-KVF5MWMF-iNwUJLq2.js +0 -64
  164. package/dist/assets/sankeyDiagram-QLVOVGJD-DWLyAD59.js +0 -10
  165. package/dist/assets/send-chat-message-Bvf2XJiv.js +0 -5
  166. package/dist/assets/send-chat-message-FDmVETeD.js +0 -4
  167. package/dist/assets/send-presence-update-26clGQ0z.js +0 -5
  168. package/dist/assets/send-presence-update-DeywSKYu.js +0 -4
  169. package/dist/assets/sequenceDiagram-X6HHIX6F-HyRN2_g-.js +0 -122
  170. package/dist/assets/stateDiagram-DGXRK772-DdMr0V93.js +0 -1
  171. package/dist/assets/stateDiagram-v2-YXO3MK2T-D6kpXRiR.js +0 -1
  172. package/dist/assets/timeline-definition-BDJGKUSR-CDf8nWgC.js +0 -61
  173. package/dist/assets/update-BEeNDeXY.js +0 -4
  174. package/dist/assets/update-CykJMYvN.js +0 -5
  175. package/dist/assets/websocket-playground-demo-4pj7mj19.js +0 -135
  176. package/dist/assets/websocket-playground-demo-F71LN60e.js +0 -61
  177. package/dist/assets/xychartDiagram-VJFVF3MP-BY_uTq9r.js +0 -7
  178. package/docs/assets/dory.jpeg +0 -0
  179. package/src/components/dark-mode-toggle.tsx +0 -25
  180. package/src/index.css +0 -24
  181. package/src/utils/hooks.ts +0 -46
package/src/mdx/card.tsx CHANGED
@@ -1,4 +1,11 @@
1
1
  import classNames from "classnames";
2
+ import {
3
+ Card as UXCard,
4
+ CardHeader,
5
+ CardTitle,
6
+ CardDescription,
7
+ CardContent
8
+ } from '@clidey/ux'
2
9
  import { Icon } from "./icon";
3
10
  import type { ComponentChildren } from "preact";
4
11
 
@@ -29,20 +36,19 @@ export function Card({
29
36
  children?: ComponentChildren
30
37
  }) {
31
38
  return (
32
- <div className="group relative rounded-xl border border-slate-200 dark:border-slate-700">
33
- <div className="absolute -inset-px rounded-xl border-2 border-transparent opacity-0 [background:linear-gradient(var(--quick-links-hover-bg,var(--color-sky-50)),var(--quick-links-hover-bg,var(--color-sky-50)))_padding-box,linear-gradient(to_top,var(--color-indigo-400),var(--color-cyan-400),var(--color-sky-500))_border-box] group-hover:opacity-100 dark:[--quick-links-hover-bg:var(--color-slate-800)]" />
34
- <div className="relative overflow-hidden rounded-xl p-6 flex gap-2 items-center">
35
- <Icon icon={icon} className="h-8 w-8" />
36
- <h2 className="mt-4 font-display text-base text-slate-900 dark:text-white">
37
- <a href={href}>
38
- <span className="absolute -inset-px rounded-xl" />
39
- {title}
40
- </a>
41
- </h2>
42
- <div className="text-sm text-slate-700 dark:text-slate-400 leading-tight [&>p]:mb-0">
43
- {description ?? children}
39
+ <UXCard className="group relative">
40
+ <a href={href} className="absolute inset-0 z-10" aria-label={title} />
41
+ <CardHeader>
42
+ <div className="flex items-center gap-3">
43
+ <Icon icon={icon} className="h-8 w-8" />
44
+ <CardTitle className="text-base">{title}</CardTitle>
44
45
  </div>
45
- </div>
46
- </div>
46
+ </CardHeader>
47
+ <CardContent>
48
+ <CardDescription className="text-sm leading-tight">
49
+ {description ?? children}
50
+ </CardDescription>
51
+ </CardContent>
52
+ </UXCard>
47
53
  )
48
54
  }
package/src/mdx/code.tsx CHANGED
@@ -10,6 +10,8 @@ import {
10
10
  } from 'react'
11
11
  import { Tag } from './tag'
12
12
  import { toTitleCase } from '../utils/functions'
13
+ import { Button, Card } from '@clidey/ux'
14
+ import { CheckIcon } from 'lucide-react'
13
15
 
14
16
  export const supportedLanguages = {
15
17
  'python': 'Python',
@@ -73,10 +75,9 @@ function CopyButton({ code }: { code: string }) {
73
75
  }, [copied])
74
76
 
75
77
  return (
76
- <button
77
- type="button"
78
+ <Button
78
79
  className={classNames(
79
- 'group/button absolute top-2 right-4 overflow-hidden rounded-full py-1 pr-3 pl-2 text-2xs font-medium opacity-0 backdrop-blur-sm transition group-hover:opacity-100 focus:opacity-100',
80
+ 'group/button absolute top-1 right-2 overflow-hidden rounded-full py-1 pr-3 pl-2 text-2xs font-medium opacity-0 backdrop-blur-sm transition group-hover:opacity-100 focus:opacity-100',
80
81
  {
81
82
  'bg-emerald-400/10 ring-1 ring-emerald-400/20 ring-inset': copied,
82
83
  'bg-white/5 hover:bg-white/7.5 dark:bg-white/2.5 dark:hover:bg-white/5': !copied,
@@ -95,8 +96,7 @@ function CopyButton({ code }: { code: string }) {
95
96
  copied && '-translate-y-1.5 opacity-0',
96
97
  )}
97
98
  >
98
- <ClipboardIcon className="h-5 w-5 fill-zinc-500/20 stroke-zinc-500 transition-colors group-hover/button:stroke-zinc-400" />
99
- Copy
99
+ <ClipboardIcon className="h-4 w-4 fill-zinc-500/20 stroke-zinc-500 transition-colors group-hover/button:stroke-zinc-400" />
100
100
  </span>
101
101
  <span
102
102
  aria-hidden={!copied}
@@ -105,9 +105,9 @@ function CopyButton({ code }: { code: string }) {
105
105
  !copied && 'translate-y-1.5 opacity-0',
106
106
  )}
107
107
  >
108
- Copied!
108
+ <CheckIcon className="h-4 w-4" />
109
109
  </span>
110
- </button>
110
+ </Button>
111
111
  )
112
112
  }
113
113
 
@@ -158,7 +158,7 @@ function CodePanel({
158
158
  <div className="group dark:bg-white/2.5">
159
159
  <CodePanelHeader tag={tag} label={label} />
160
160
  <div className="relative">
161
- <pre className="overflow-x-auto p-4 text-xs text-white">{children}</pre>
161
+ <pre className="overflow-x-auto p-4 text-xs">{children}</pre>
162
162
  <CopyButton code={code ?? ''} />
163
163
  </div>
164
164
  </div>
@@ -179,9 +179,9 @@ function CodeGroupHeader({
179
179
  if (!title && !hasTabs) return null
180
180
 
181
181
  return (
182
- <div className="flex min-h-[calc(--spacing(12)+1px)] flex-wrap items-start gap-x-4 bg-black/5 px-4 dark:border-zinc-800 dark:bg-transparent">
182
+ <div className="flex flex-wrap items-start gap-x-4 px-4 pb-2">
183
183
  {title && (
184
- <p className="mr-auto pt-3 text-xs font-semibold text-white">
184
+ <p className="mr-auto pt-3 text-xs font-semibold">
185
185
  {title}
186
186
  </p>
187
187
  )}
@@ -197,7 +197,7 @@ function CodeGroupHeader({
197
197
  <Tab
198
198
  key={index}
199
199
  className={classNames(
200
- 'border-b py-3 transition data-selected:not-data-focus:outline-hidden',
200
+ 'pt-2 transition data-selected:not-data-focus:outline-hidden',
201
201
  index === selectedIndex
202
202
  ? 'border-emerald-500 text-emerald-400'
203
203
  : 'border-transparent text-zinc-400 hover:text-zinc-300',
@@ -247,7 +247,6 @@ export function CodeGroup({
247
247
 
248
248
  const hasTabs = childrenArray.length > 1
249
249
 
250
- const containerClassName = 'docucod-mdx-code-group my-6 overflow-hidden rounded-2xl shadow-md dark:ring-1 dark:ring-white/10'
251
250
  const header = (
252
251
  <CodeGroupHeader title={title} selectedIndex={selectedIndex}>
253
252
  {children}
@@ -258,24 +257,25 @@ export function CodeGroup({
258
257
  return (
259
258
  <CodeGroupContext.Provider value={true}>
260
259
  {hasTabs ? (
261
- <TabGroup
262
- as="div"
263
- selectedIndex={selectedIndex}
264
- onChange={setSelectedIndex}
265
- className={containerClassName}
266
- >
267
- <div className="not-prose">
268
- {header}
269
- {panels}
270
- </div>
271
- </TabGroup>
260
+ <Card className="py-0 border-black/10 bg-none overflow-hidden mb-4">
261
+ <TabGroup
262
+ as="div"
263
+ selectedIndex={selectedIndex}
264
+ onChange={setSelectedIndex}
265
+ >
266
+ <div className="not-prose">
267
+ {header}
268
+ {panels}
269
+ </div>
270
+ </TabGroup>
271
+ </Card>
272
272
  ) : (
273
- <div className={containerClassName}>
273
+ <Card className="py-0 border-black/10 bg-none overflow-hidden mb-4">
274
274
  <div className="not-prose">
275
275
  {header}
276
276
  {panels}
277
277
  </div>
278
- </div>
278
+ </Card>
279
279
  )}
280
280
  </CodeGroupContext.Provider>
281
281
  )
@@ -285,5 +285,5 @@ export function Code({
285
285
  children,
286
286
  ...props
287
287
  }: React.ComponentPropsWithoutRef<'code'>) {
288
- return <code className={classNames('docucod-mdx-code rounded-md py-1 text-sm px-2', props.className)} {...props}>{children}</code>
288
+ return <code className={classNames('dory-mdx-code rounded-md py-1 text-sm px-2', props.className)} {...props}>{children}</code>
289
289
  }
@@ -1,6 +1,5 @@
1
- import { Disclosure, DisclosureButton, DisclosurePanel } from '@headlessui/react'
2
- import { MinusIcon, PlusIcon } from '@heroicons/react/24/outline'
3
- import { Icon } from './icon'
1
+ import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from "@clidey/ux";
2
+ import { Icon } from './icon';
4
3
 
5
4
  export function Expandable({
6
5
  title,
@@ -12,29 +11,26 @@ export function Expandable({
12
11
  icon?: React.ComponentProps<typeof Icon>['icon']
13
12
  }) {
14
13
  return (
15
- <Disclosure as="div" className="my-6 rounded-xl border border-slate-200 dark:border-slate-700">
16
- {({ open }) => (
17
- <>
18
- <DisclosureButton className="group flex w-full items-start justify-between text-left text-slate-900 dark:text-white p-6">
19
- <div className="flex items-center gap-2">
20
- {icon && <Icon icon={icon} className="h-8 w-8" />}
21
- <span className="text-base font-display text-slate-900 dark:text-white">{title}</span>
22
- </div>
23
- <span className="ml-6 flex h-7 items-center">
24
- {open ? (
25
- <MinusIcon className="h-6 w-6 text-slate-700 dark:text-slate-400" />
26
- ) : (
27
- <PlusIcon className="h-6 w-6 text-slate-700 dark:text-slate-400" />
28
- )}
29
- </span>
30
- </DisclosureButton>
31
- <DisclosurePanel as="dd" className="px-6 pb-6">
14
+ <Accordion
15
+ type="single"
16
+ collapsible
17
+ className="my-6 rounded-xl border border-slate-200 dark:border-slate-700"
18
+ >
19
+ <AccordionItem value="expandable">
20
+ <AccordionTrigger className="group flex w-full items-start justify-between text-left text-slate-900 dark:text-white p-6">
21
+ <div className="flex items-center gap-2">
22
+ {icon && <Icon icon={icon} className="h-8 w-8" />}
23
+ <span className="text-base font-display text-slate-900 dark:text-white">{title}</span>
24
+ </div>
25
+ </AccordionTrigger>
26
+ <AccordionContent asChild>
27
+ <dd className="px-6 pb-6">
32
28
  <div className="text-sm text-slate-700 dark:text-slate-400 leading-tight [&>p]:mb-0">
33
29
  {children}
34
30
  </div>
35
- </DisclosurePanel>
36
- </>
37
- )}
38
- </Disclosure>
39
- )
31
+ </dd>
32
+ </AccordionContent>
33
+ </AccordionItem>
34
+ </Accordion>
35
+ );
40
36
  }
package/src/mdx/fence.tsx CHANGED
@@ -3,7 +3,7 @@ import { Highlight, themes } from 'prism-react-renderer'
3
3
  import { Code, CodeGroup, CodeGroupContext, supportedLanguages } from './code'
4
4
  import { MermaidRenderer } from './mermaid'
5
5
  import { Loading } from '../components/loading'
6
- import { useDarkMode } from '../utils/hooks'
6
+ import { useTheme } from '@clidey/ux'
7
7
  import classNames from 'classnames'
8
8
 
9
9
 
@@ -14,7 +14,7 @@ export function Fence({
14
14
  children: string
15
15
  language: string
16
16
  }) {
17
- const { isDark } = useDarkMode();
17
+ const isDark = useTheme().theme === 'dark';
18
18
 
19
19
  if (language === 'mermaid') {
20
20
  return (
package/src/mdx/list.tsx CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { JSX } from 'preact/jsx-runtime';
2
2
 
3
- export const UnorderedList = (props: JSX.IntrinsicElements['ul']) => <ul className="list-disc list-inside" {...props} />;
3
+ export const UnorderedList = (props: JSX.IntrinsicElements['ul']) => <ul className="list-disc list-inside my-2" {...props} />;
4
4
 
5
- export const OrderedList = (props: JSX.IntrinsicElements['ol']) => <ol className="list-decimal list-inside" {...props} />;
5
+ export const OrderedList = (props: JSX.IntrinsicElements['ol']) => <ol className="list-decimal list-inside my-2" {...props} />;
6
6
 
7
7
  export const ListItem = (props: JSX.IntrinsicElements['li']) => <li className="ml-4 mt-2" {...props} />;
@@ -4,7 +4,7 @@ import { APIPlayground, PlayButton, type Server } from "./api-playground"
4
4
  import { Fence } from "./fence"
5
5
  import { Tag } from "./tag"
6
6
  import { Col, Row } from "./text"
7
- import { motion } from "motion/react"
7
+ import { Sheet, SheetContent, SheetHeader, SheetTitle, Button } from "@clidey/ux"
8
8
 
9
9
  export function Properties({ children }: { children: React.ReactNode }) {
10
10
  return (
@@ -33,12 +33,16 @@ export function Property({
33
33
  return (
34
34
  <div className="m-0 px-0 first:pt-0 last:pb-0">
35
35
  <div className="my-4 flex flex-wrap items-center gap-x-3 gap-2">
36
- <Tag className="px-4 py-1">{name}</Tag>
37
- <p className="font-mono text-xs text-zinc-400 dark:text-zinc-500">
38
- {type}
39
- </p>
40
- {required && <span className="text-rose-400 ml-1 text-xs">Required</span>}
41
- <p className="w-full flex-none [&>:first-child]:mt-0 [&>:last-child]:mb-0 text-sm">
36
+ <div className="flex gap-2 items-center grow">
37
+ <Tag className="px-4 py-1">{name}</Tag>
38
+ <p className="font-mono text-xs text-zinc-400 dark:text-zinc-500">
39
+ {type}
40
+ </p>
41
+ <div className="flex grow justify-end ">
42
+ {required && <span className="text-rose-400 ml-1 text-xs">Required</span>}
43
+ </div>
44
+ </div>
45
+ <p className="w-full flex-none [&>:first-child]:mt-0 [&>:last-child]:mb-0 text-xs text-muted-foreground">
42
46
  {children}
43
47
  </p>
44
48
  </div>
@@ -170,36 +174,18 @@ export function OpenAPI({ openAPIJson, method: selectedMethod, path: selectedPat
170
174
 
171
175
  return (
172
176
  <div className="max-w-none w-full">
173
- {
174
- showPlayground &&
175
- <motion.div
176
- initial={{ x: "100%" }}
177
- animate={{ x: 0 }}
178
- exit={{ x: "100%" }}
179
- transition={{ type: "spring", damping: 20 }}
180
- className="fixed inset-y-0 right-0 w-full max-w-3xl bg-white dark:bg-[#1e1e1e] shadow-xl z-50 overflow-y-auto border-l border-zinc-200 dark:border-zinc-800"
181
- >
182
- <div className="p-6">
183
- <div className="flex justify-between items-center mb-6">
184
- <h2 className="text-xl font-semibold">API Playground</h2>
185
- <button
186
- onClick={() => setShowPlayground(false)}
187
- className="text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200"
188
- >
189
- <svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
190
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
191
- </svg>
192
- </button>
193
- </div>
194
- <APIPlayground
195
- method={selectedMethod}
196
- url={selectedPath}
197
- servers={openAPIJson.servers}
198
- />
199
- </div>
200
- </motion.div>
201
- }
202
-
177
+ <Sheet open={showPlayground} onOpenChange={setShowPlayground} modal={true}>
178
+ <SheetContent side="bottom" className="h-[90vh] w-full overflow-y-auto p-8">
179
+ <SheetHeader className="p-0">
180
+ <SheetTitle>API Playground</SheetTitle>
181
+ </SheetHeader>
182
+ <APIPlayground
183
+ method={selectedMethod}
184
+ url={selectedPath}
185
+ servers={openAPIJson.servers}
186
+ />
187
+ </SheetContent>
188
+ </Sheet>
203
189
  {Object.entries(paths).map(([path, methods]) => {
204
190
  if (path !== selectedPath) {
205
191
  return null;
@@ -216,7 +202,7 @@ export function OpenAPI({ openAPIJson, method: selectedMethod, path: selectedPat
216
202
  }
217
203
 
218
204
  return (
219
- <Row key={`${method}-${path}`} cols={2}>
205
+ <Row key={`${method}-${path}`} cols={2} className="gap-0">
220
206
  <Col>
221
207
  <h2 className="flex items-center mt-4">
222
208
  <Tag variant="medium" className="mr-2 py-1 px-4 rounded-lg">{methodUpper}</Tag>
@@ -227,7 +213,7 @@ export function OpenAPI({ openAPIJson, method: selectedMethod, path: selectedPat
227
213
 
228
214
  {parameters && parameters.length > 0 && (
229
215
  <div className="mt-4">
230
- <h3>Parameters</h3>
216
+ <h3 className="font-bold">Parameters</h3>
231
217
  <Properties>
232
218
  {parameters.map((param) => (
233
219
  <ParamField
@@ -245,7 +231,7 @@ export function OpenAPI({ openAPIJson, method: selectedMethod, path: selectedPat
245
231
  )}
246
232
  {requestBody && (
247
233
  <div className="mt-4">
248
- <h3>Request Body</h3>
234
+ <h3 className="font-bold">Request Body</h3>
249
235
  <p>{requestBody.description}</p>
250
236
  {requestBody.content?.['application/json']?.schema && (
251
237
  (() => {
@@ -271,9 +257,9 @@ export function OpenAPI({ openAPIJson, method: selectedMethod, path: selectedPat
271
257
  )}
272
258
  {components?.schemas && (
273
259
  <div>
274
- <h3>Schemas</h3>
260
+ <h3 className="font-bold">Schemas</h3>
275
261
  {Object.entries(components.schemas).filter(([, schema]) => schema.properties).map(([name, schema]) => (
276
- <div key={name} className="mt-4">
262
+ <div key={name} className="mt-8">
277
263
  <h4>{name}</h4>
278
264
  <Properties>
279
265
  {Object.entries(schema.properties || {}).map(([propName, prop]) => (
@@ -293,12 +279,12 @@ export function OpenAPI({ openAPIJson, method: selectedMethod, path: selectedPat
293
279
  )}
294
280
  </Col>
295
281
  <Col sticky>
296
- <button
282
+ <Button
297
283
  onClick={handleShowPlayground}
298
- className='ml-auto mt-3 flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition bg-sky-600 text-white hover:bg-sky-700'>
284
+ className='ml-auto mt-3 flex items-center gap-2'>
299
285
  Try
300
286
  <PlayButton className="h-4 w-4" />
301
- </button>
287
+ </Button>
302
288
  <APIGroup title="Request" tag={methodUpper} label={path}>
303
289
  {Object.entries(responses).map(([code, response]) => (
304
290
  <div key={code} title={code}>
package/src/mdx/table.tsx CHANGED
@@ -1,15 +1,20 @@
1
1
  import type { JSX } from 'preact/jsx-runtime';
2
+ import {
3
+ Table as UXTable,
4
+ TableHead,
5
+ TableCell
6
+ } from '@clidey/ux'
2
7
 
3
8
  export const Table = (props: JSX.IntrinsicElements['table']) => (
4
9
  <div className="overflow-x-auto rounded-lg my-8">
5
- <table className="border-collapse w-full border border-gray-300/10 rounded-lg" {...props} />
10
+ <UXTable {...props} />
6
11
  </div>
7
12
  );
8
13
 
9
14
  export const Th = (props: JSX.IntrinsicElements['th']) => (
10
- <th className="border border-gray-300/10 p-2 bg-gray-100/25 text-left first:rounded-tl-lg last:rounded-tr-lg" {...props} />
15
+ <TableHead {...props} />
11
16
  );
12
17
 
13
18
  export const Td = (props: JSX.IntrinsicElements['td']) => (
14
- <td className="border border-gray-300/10 p-2 text-left last-row:first:rounded-bl-lg last-row:last:rounded-br-lg" {...props} />
19
+ <TableCell {...props} />
15
20
  );
package/src/mdx/tag.tsx CHANGED
@@ -1,66 +1,53 @@
1
+ import { Badge } from '@clidey/ux'
1
2
  import classNames from 'classnames'
2
3
 
3
- const variantStyles = {
4
- small: '',
5
- medium: 'rounded-lg px-1.5 ring-1 ring-inset',
6
- }
4
+ const valueColorMap = {
5
+ GET: 'default',
6
+ POST: 'secondary',
7
+ PUT: 'outline',
8
+ DELETE: 'destructive',
9
+ } as const
7
10
 
8
- const colorStyles = {
9
- emerald: {
10
- small: 'text-emerald-500 dark:text-emerald-400',
11
- medium:
12
- 'ring-emerald-300 dark:ring-emerald-400/30 bg-emerald-400/10 text-emerald-500 dark:text-emerald-400',
13
- },
14
- sky: {
15
- small: 'text-sky-500',
16
- medium:
17
- 'ring-sky-300 bg-sky-400/10 text-sky-500 dark:ring-sky-400/30 dark:bg-sky-400/10 dark:text-sky-400',
18
- },
19
- amber: {
20
- small: 'text-amber-500',
21
- medium:
22
- 'ring-amber-300 bg-amber-400/10 text-amber-500 dark:ring-amber-400/30 dark:bg-amber-400/10 dark:text-amber-400',
23
- },
24
- rose: {
25
- small: 'text-red-500 dark:text-rose-500',
26
- medium:
27
- 'ring-rose-200 bg-rose-50 text-red-500 dark:ring-rose-500/20 dark:bg-rose-400/10 dark:text-rose-400',
28
- },
29
- zinc: {
30
- small: 'text-zinc-400 dark:text-zinc-500',
31
- medium:
32
- 'ring-zinc-200 bg-zinc-50 text-zinc-500 dark:ring-zinc-500/20 dark:bg-zinc-400/10 dark:text-zinc-400',
33
- },
11
+ const customColorClasses = {
12
+ emerald: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 border-emerald-300 dark:border-emerald-400/30',
13
+ sky: 'bg-sky-400/10 text-sky-500 dark:text-sky-400 border-sky-300 dark:border-sky-400/30',
14
+ amber: 'bg-amber-400/10 text-amber-500 dark:text-amber-400 border-amber-300 dark:border-amber-400/30',
15
+ rose: 'bg-rose-50 text-red-500 dark:bg-rose-400/10 dark:text-rose-400 border-rose-200 dark:border-rose-500/20',
16
+ zinc: 'bg-zinc-50 text-zinc-500 dark:bg-zinc-400/10 dark:text-zinc-400 border-zinc-200 dark:border-zinc-500/20',
34
17
  }
35
18
 
36
- const valueColorMap = {
19
+ const methodColors: Record<string, keyof typeof customColorClasses> = {
37
20
  GET: 'emerald',
38
21
  POST: 'sky',
39
22
  PUT: 'amber',
40
23
  DELETE: 'rose',
41
- } as Record<string, keyof typeof colorStyles>
24
+ }
42
25
 
43
26
  export function Tag({
44
27
  children,
45
28
  variant = 'medium',
46
- color = valueColorMap[children] ?? 'zinc',
29
+ color,
47
30
  className,
48
31
  }: {
49
- children: keyof typeof valueColorMap & (string)
50
- variant?: keyof typeof variantStyles
51
- color?: keyof typeof colorStyles
32
+ children: string
33
+ variant?: 'small' | 'medium'
34
+ color?: keyof typeof customColorClasses
52
35
  className?: string
53
36
  }) {
37
+ const colorKey = color || methodColors[children] || 'zinc'
38
+ const badgeVariant = valueColorMap[children as keyof typeof valueColorMap] || 'outline'
39
+
54
40
  return (
55
- <span
41
+ <Badge
42
+ variant={badgeVariant}
56
43
  className={classNames(
57
44
  'font-mono text-[0.625rem]/6 font-semibold',
58
- variantStyles[variant],
59
- colorStyles[color][variant],
45
+ customColorClasses[colorKey],
46
+ variant === 'small' && 'px-1 py-0',
60
47
  className,
61
48
  )}
62
49
  >
63
50
  {children}
64
- </span>
51
+ </Badge>
65
52
  )
66
53
  }
package/src/mdx/text.tsx CHANGED
@@ -1,3 +1,4 @@
1
+ import { cn } from "@clidey/ux"
1
2
  import classNames from "classnames"
2
3
  import { useState } from "preact/hooks"
3
4
 
@@ -30,9 +31,9 @@ export const p = function P(props: preact.JSX.HTMLAttributes<HTMLParagraphElemen
30
31
  return <p className="mb-2 inline-block" {...props} />
31
32
  }
32
33
 
33
- export function Row({ children, cols = 1 }: { children: preact.ComponentChildren, cols?: number }) {
34
+ export function Row({ children, cols = 1, className }: { children: preact.ComponentChildren, cols?: number, className?: string }) {
34
35
  return (
35
- <div className={`grid grid-cols-1 items-start gap-x-16 gap-y-10 xl:max-w-none`} style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}>
36
+ <div className={cn(`py-6 grid grid-cols-1 items-start gap-x-16 gap-y-10 xl:max-w-none`, className)} style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}>
36
37
  {children}
37
38
  </div>
38
39
  )