@clidey/dory 0.22.0 → 0.24.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 (188) hide show
  1. package/bin/dist/dory.d.ts +3 -0
  2. package/bin/dist/dory.d.ts.map +1 -0
  3. package/bin/dist/dory.js +337 -0
  4. package/bin/dist/dory.js.map +1 -0
  5. package/bin/dory.ts +287 -121
  6. package/dist/dory.json +5 -0
  7. package/dist/favicon.svg +1 -1
  8. package/dist/index.html +6 -6
  9. package/dist/introduction.mdx +2 -2
  10. package/dist/llms.txt +2 -2
  11. package/docs/dory.json +5 -0
  12. package/docs/favicon.svg +1 -1
  13. package/docs/introduction.mdx +2 -2
  14. package/package.json +16 -11
  15. package/src/app.css +2 -0
  16. package/src/components/dropdown.tsx +30 -26
  17. package/src/components/loading.tsx +6 -8
  18. package/src/components/navigation.tsx +8 -6
  19. package/src/components/notification.tsx +9 -93
  20. package/src/components/routes.tsx +1 -1
  21. package/src/components/search.tsx +31 -104
  22. package/src/components/store.ts +4 -1
  23. package/src/main.tsx +9 -5
  24. package/src/mdx/accordion.tsx +21 -28
  25. package/src/mdx/api-playground.tsx +68 -83
  26. package/src/mdx/api.tsx +21 -21
  27. package/src/mdx/async-api.tsx +15 -31
  28. package/src/mdx/callout.tsx +27 -43
  29. package/src/mdx/card.tsx +20 -14
  30. package/src/mdx/code.tsx +26 -26
  31. package/src/mdx/expandable.tsx +21 -25
  32. package/src/mdx/fence.tsx +2 -2
  33. package/src/mdx/list.tsx +2 -2
  34. package/src/mdx/open-api.tsx +31 -45
  35. package/src/mdx/table.tsx +8 -3
  36. package/src/mdx/tag.tsx +27 -40
  37. package/src/mdx/text.tsx +3 -2
  38. package/src/mdx/websocket-playground.tsx +150 -81
  39. package/src/theme.scss +50 -106
  40. package/src/types/config.ts +47 -0
  41. package/src/ui/header.tsx +12 -9
  42. package/src/ui/layout.tsx +5 -4
  43. package/src/ui/mobile-navigation.tsx +36 -63
  44. package/src/ui/table-of-content.tsx +3 -3
  45. package/src/utils/colors.ts +54 -0
  46. package/src/utils/fonts.ts +4 -1
  47. package/tsconfig.app.json +2 -1
  48. package/tsconfig.bin.json +11 -7
  49. package/tsconfig.node.json +2 -1
  50. package/vite.config.ts +2 -0
  51. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  52. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  53. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  54. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  55. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  56. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  57. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  58. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  59. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  60. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  61. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  62. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  63. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  64. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  65. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  66. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  67. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  68. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  69. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  70. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  71. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  72. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  73. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  74. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  75. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  76. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  77. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  78. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  79. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  80. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  81. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  82. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  83. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  84. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  85. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  86. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  87. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  88. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  89. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  90. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  91. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  92. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  93. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  94. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  95. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  96. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  97. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  98. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  99. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  100. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  101. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  102. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  103. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  104. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  105. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  106. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  107. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  108. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  109. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  110. package/dist/assets/__vite-browser-external-BIHI7g3E.js +0 -1
  111. package/dist/assets/_basePickBy-CsnA5_xx.js +0 -1
  112. package/dist/assets/_baseUniq-COwFna6s.js +0 -1
  113. package/dist/assets/api-playground-demo-Ct5XK2u1.js +0 -45
  114. package/dist/assets/api-playground-demo-vBae5R-d.js +0 -119
  115. package/dist/assets/arc-Dy4kITED.js +0 -1
  116. package/dist/assets/architectureDiagram-IEHRJDOE-BiaWQpzt.js +0 -36
  117. package/dist/assets/blockDiagram-JOT3LUYC-7LfUOsM7.js +0 -121
  118. package/dist/assets/c4Diagram-VJAJSXHY-Ca-3deDF.js +0 -10
  119. package/dist/assets/channel-j6jMzwSu.js +0 -1
  120. package/dist/assets/chunk-4BMEZGHF-Cln31Q_z.js +0 -1
  121. package/dist/assets/chunk-A2AXSNBT-Cj4U7K4I.js +0 -164
  122. package/dist/assets/chunk-AEK57VVT-1kn9120k.js +0 -220
  123. package/dist/assets/chunk-D6G4REZN-DMgQaOLS.js +0 -1
  124. package/dist/assets/chunk-RZ5BOZE2-DDd-DrSb.js +0 -1
  125. package/dist/assets/chunk-XZIHB7SX-sVdgMrEr.js +0 -1
  126. package/dist/assets/classDiagram-GIVACNV2-B9ObtIrc.js +0 -1
  127. package/dist/assets/classDiagram-v2-COTLJTTW-B9ObtIrc.js +0 -1
  128. package/dist/assets/clone-UOttdbrS.js +0 -1
  129. package/dist/assets/create-D-Wjvs-T.js +0 -6
  130. package/dist/assets/create-DpzlgYHc.js +0 -4
  131. package/dist/assets/cytoscape.esm-BY7v1xhs.js +0 -331
  132. package/dist/assets/dagre-OKDRZEBW-C4q12sCc.js +0 -4
  133. package/dist/assets/delete-DwAmDeAN.js +0 -4
  134. package/dist/assets/delete-cbziNMWs.js +0 -5
  135. package/dist/assets/diagram-SSKATNLV-BxNC6sGs.js +0 -43
  136. package/dist/assets/diagram-VNBRO52H-CukGDk3b.js +0 -24
  137. package/dist/assets/dory.jpeg +0 -0
  138. package/dist/assets/erDiagram-Q7BY3M3F-TiiVq0dv.js +0 -60
  139. package/dist/assets/favicon-Z67lNtJu.svg +0 -75
  140. package/dist/assets/features-6EEoDloV.js +0 -269
  141. package/dist/assets/features-EZwrzTnN.js +0 -441
  142. package/dist/assets/flowDiagram-4HSFHLVR-DykkGbol.js +0 -161
  143. package/dist/assets/ganttDiagram-APWFNJXF-Bqp95-S3.js +0 -257
  144. package/dist/assets/get-BeAg4Qrr.js +0 -5
  145. package/dist/assets/get-Dj1eDs2i.js +0 -4
  146. package/dist/assets/gitGraphDiagram-7IBYFJ6S-BiYVs9VI.js +0 -65
  147. package/dist/assets/graph-LkKKMaDZ.js +0 -1
  148. package/dist/assets/index-CGd7uPvh.css +0 -1
  149. package/dist/assets/index-vOROtq-e.js +0 -9596
  150. package/dist/assets/infoDiagram-PH2N3AL5-EA7h3wZa.js +0 -2
  151. package/dist/assets/init-Gi6I4Gst.js +0 -1
  152. package/dist/assets/introduction-CzXlzjWa.js +0 -38
  153. package/dist/assets/introduction-ylYJcPz3.js +0 -45
  154. package/dist/assets/journeyDiagram-U35MCT3I-BZiVuCZu.js +0 -138
  155. package/dist/assets/kanban-definition-NDS4AKOZ-SCdQ8OjR.js +0 -88
  156. package/dist/assets/layout-C9-9-M2q.js +0 -1
  157. package/dist/assets/linear-CTbdhYd1.js +0 -1
  158. package/dist/assets/mermaid.core-DUFqLK_I.js +0 -213
  159. package/dist/assets/mindmap-definition-ALO5MXBD-BPbKEbjk.js +0 -95
  160. package/dist/assets/ordinal-Cboi1Yqb.js +0 -1
  161. package/dist/assets/pieDiagram-IB7DONF6-DPg1sNm8.js +0 -30
  162. package/dist/assets/quadrantDiagram-7GDLP6J5-DmtJM50d.js +0 -7
  163. package/dist/assets/radar-MK3ICKWK-DnO5LA4B.js +0 -128
  164. package/dist/assets/receive-chat-message-B2jsY1P6.js +0 -4
  165. package/dist/assets/receive-chat-message-BeaC4eqS.js +0 -5
  166. package/dist/assets/receive-notifications-BouRLPFj.js +0 -4
  167. package/dist/assets/receive-notifications-DYnXRRBz.js +0 -5
  168. package/dist/assets/receive-presence-update-CRgeSUpk.js +0 -5
  169. package/dist/assets/receive-presence-update-UEm47KAG.js +0 -4
  170. package/dist/assets/requirementDiagram-KVF5MWMF-iNwUJLq2.js +0 -64
  171. package/dist/assets/sankeyDiagram-QLVOVGJD-DWLyAD59.js +0 -10
  172. package/dist/assets/send-chat-message-Bvf2XJiv.js +0 -5
  173. package/dist/assets/send-chat-message-FDmVETeD.js +0 -4
  174. package/dist/assets/send-presence-update-26clGQ0z.js +0 -5
  175. package/dist/assets/send-presence-update-DeywSKYu.js +0 -4
  176. package/dist/assets/sequenceDiagram-X6HHIX6F-HyRN2_g-.js +0 -122
  177. package/dist/assets/stateDiagram-DGXRK772-DdMr0V93.js +0 -1
  178. package/dist/assets/stateDiagram-v2-YXO3MK2T-D6kpXRiR.js +0 -1
  179. package/dist/assets/timeline-definition-BDJGKUSR-CDf8nWgC.js +0 -61
  180. package/dist/assets/update-BEeNDeXY.js +0 -4
  181. package/dist/assets/update-CykJMYvN.js +0 -5
  182. package/dist/assets/websocket-playground-demo-4pj7mj19.js +0 -135
  183. package/dist/assets/websocket-playground-demo-F71LN60e.js +0 -61
  184. package/dist/assets/xychartDiagram-VJFVF3MP-BY_uTq9r.js +0 -7
  185. package/docs/assets/dory.jpeg +0 -0
  186. package/src/components/dark-mode-toggle.tsx +0 -25
  187. package/src/index.css +0 -24
  188. package/src/utils/hooks.ts +0 -46
@@ -1,40 +1,28 @@
1
- import classNames from "classnames"
1
+ import { Alert, AlertTitle, AlertDescription } from '@clidey/ux'
2
2
  import { Icon } from "./icon"
3
3
 
4
- const styles = {
5
- note: {
6
- container: 'my-6 flex gap-2.5 rounded-2xl border border-emerald-500/20 bg-emerald-50/50 p-4 text-sm/6 text-emerald-900 dark:border-emerald-500/30 dark:bg-emerald-500/5 dark:text-emerald-200 dark:[--tw-prose-links-hover:var(--color-emerald-300)] dark:[--tw-prose-links:var(--color-white)]',
7
- title: 'text-emerald-900 dark:text-emerald-200',
8
- body: 'text-emerald-900 dark:text-emerald-200',
9
- },
10
- warning: {
11
- container: 'my-6 flex gap-2.5 rounded-2xl border border-amber-500/20 bg-amber-50/50 p-4 text-sm/6 text-amber-900 dark:border-amber-500/30 dark:bg-amber-500/5 dark:text-amber-200 dark:[--tw-prose-links-hover:var(--color-amber-300)] dark:[--tw-prose-links:var(--color-white)]',
12
- title: 'text-amber-900 dark:text-amber-200',
13
- body: 'text-amber-900 dark:text-amber-200',
14
- },
15
- info: {
16
- container: 'my-6 flex gap-2.5 rounded-2xl border border-blue-500/20 bg-blue-50/50 p-4 text-sm/6 text-blue-900 dark:border-blue-500/30 dark:bg-blue-500/5 dark:text-blue-200 dark:[--tw-prose-links-hover:var(--color-blue-300)] dark:[--tw-prose-links:var(--color-white)]',
17
- title: 'text-blue-900 dark:text-blue-200',
18
- body: 'text-blue-900 dark:text-blue-200',
19
- },
20
- tip: {
21
- container: 'my-6 flex gap-2.5 rounded-2xl border border-green-500/20 bg-green-50/50 p-4 text-sm/6 text-green-900 dark:border-green-500/30 dark:bg-green-500/5 dark:text-green-200 dark:[--tw-prose-links-hover:var(--color-green-300)] dark:[--tw-prose-links:var(--color-white)]',
22
- title: 'text-green-900 dark:text-green-200',
23
- body: 'text-green-900 dark:text-green-200',
24
- },
25
- check: {
26
- container: 'my-6 flex gap-2.5 rounded-2xl border border-purple-500/20 bg-purple-50/50 p-4 text-sm/6 text-purple-900 dark:border-purple-500/30 dark:bg-purple-500/5 dark:text-purple-200 dark:[--tw-prose-links-hover:var(--color-purple-300)] dark:[--tw-prose-links:var(--color-white)]',
27
- title: 'text-purple-900 dark:text-purple-200',
28
- body: 'text-purple-900 dark:text-purple-200',
29
- },
30
- }
4
+ const typeToVariant = {
5
+ note: 'default',
6
+ warning: 'destructive',
7
+ info: 'default',
8
+ tip: 'default',
9
+ check: 'default',
10
+ } as const
31
11
 
32
12
  const icons = {
33
- note: (props: { className?: string }) => <Icon icon="InfoCircle" {...props} />,
34
- warning: (props: { className?: string }) => <Icon icon="AlertTriangle" {...props} />,
35
- info: (props: { className?: string }) => <Icon icon="InfoCircle" {...props} />,
36
- tip: (props: { className?: string }) => <Icon icon="Lightbulb" {...props} />,
37
- check: (props: { className?: string }) => <Icon icon="CheckCircle" {...props} />,
13
+ note: 'InfoCircle',
14
+ warning: 'AlertTriangle',
15
+ info: 'InfoCircle',
16
+ tip: 'Lightbulb',
17
+ check: 'CheckCircle',
18
+ } as const
19
+
20
+ const typeColors = {
21
+ note: 'border-emerald-500/30 bg-emerald-500/10 text-emerald-900 dark:text-emerald-200',
22
+ warning: 'border-amber-500/30 bg-amber-500/10 text-amber-900 dark:text-amber-200 *:data-[slot=alert-description]:text-inherit dark:data-[slot=alert-description]:text-inherit',
23
+ info: 'border-blue-500/30 bg-blue-500/10 text-blue-900 dark:text-blue-200',
24
+ tip: 'border-green-500/30 bg-green-500/10 text-green-900 dark:text-green-200',
25
+ check: 'border-purple-500/30 bg-purple-500/10 text-purple-900 dark:text-purple-200',
38
26
  }
39
27
 
40
28
  export function Callout({
@@ -44,18 +32,14 @@ export function Callout({
44
32
  }: {
45
33
  title: string
46
34
  children: React.ReactNode
47
- type?: keyof typeof styles
35
+ type?: keyof typeof icons
48
36
  }) {
49
- const IconComponent = icons[type]
50
-
51
37
  return (
52
- <div className={classNames(styles[type].container)}>
53
- <IconComponent className="mt-1 h-4 w-4 flex-none" />
54
- <div className="[&>:first-child]:mt-0 [&>:last-child]:mb-0">
55
- <div className={styles[type].title}>{title}</div>
56
- <div className={styles[type].body}>{children}</div>
57
- </div>
58
- </div>
38
+ <Alert variant={typeToVariant[type]} className={`my-6 ${typeColors[type]}`}>
39
+ <Icon icon={icons[type]} className="h-4 w-4" />
40
+ <AlertTitle>{title}</AlertTitle>
41
+ <AlertDescription>{children}</AlertDescription>
42
+ </Alert>
59
43
  )
60
44
  }
61
45
 
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
  )