@tanstack/create 0.68.0 → 0.68.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/frameworks/react/add-ons/ai/assets/src/components/demo-AIAssistant.tsx +15 -15
- package/dist/frameworks/react/add-ons/ai/assets/src/components/demo-GuitarRecommendation.tsx +8 -6
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.css +21 -21
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.tsx +14 -18
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-image.tsx +20 -26
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-structured.tsx +56 -67
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/$guitarId.tsx +17 -22
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/index.tsx +21 -27
- package/dist/frameworks/react/add-ons/apollo-client/assets/src/routes/demo.apollo-client.tsx +35 -38
- package/dist/frameworks/react/add-ons/better-auth/assets/src/routes/demo/better-auth.tsx +64 -64
- package/dist/frameworks/react/add-ons/clerk/assets/src/routes/demo/clerk.tsx +17 -25
- package/dist/frameworks/react/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -45
- package/dist/frameworks/react/add-ons/db/assets/src/components/demo.chat-area.tsx +5 -5
- package/dist/frameworks/react/add-ons/db/assets/src/components/demo.messages.tsx +7 -11
- package/dist/frameworks/react/add-ons/db/assets/src/routes/demo/db-chat.tsx +5 -3
- package/dist/frameworks/react/add-ons/drizzle/assets/src/routes/demo/drizzle.tsx.ejs +29 -79
- package/dist/frameworks/react/add-ons/form/assets/src/components/demo.FormComponents.tsx.ejs +12 -12
- package/dist/frameworks/react/add-ons/form/assets/src/routes/demo/form.address.tsx.ejs +11 -10
- package/dist/frameworks/react/add-ons/form/assets/src/routes/demo/form.simple.tsx.ejs +11 -10
- package/dist/frameworks/react/add-ons/mcp/assets/src/routes/demo/mcp-todos.tsx +10 -18
- package/dist/frameworks/react/add-ons/neon/assets/src/routes/demo/neon.tsx +38 -57
- package/dist/frameworks/react/add-ons/oRPC/assets/src/routes/demo/orpc-todo.tsx +10 -18
- package/dist/frameworks/react/add-ons/paraglide/assets/src/routes/demo.i18n.tsx.ejs +6 -7
- package/dist/frameworks/react/add-ons/posthog/assets/src/routes/demo/posthog.tsx +19 -22
- package/dist/frameworks/react/add-ons/powersync/assets/src/routes/demo/powersync.tsx +19 -18
- package/dist/frameworks/react/add-ons/prisma/assets/src/routes/demo/prisma.tsx.ejs +29 -79
- package/dist/frameworks/react/add-ons/sentry/assets/src/routes/demo/sentry.testing.tsx +71 -102
- package/dist/frameworks/react/add-ons/store/assets/src/lib/demo-store-devtools.tsx +3 -3
- package/dist/frameworks/react/add-ons/store/assets/src/routes/demo/store.tsx.ejs +9 -14
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/button.tsx +23 -26
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/dialog.tsx +12 -16
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/input.tsx +14 -17
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/radio-group.tsx +15 -15
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/slider.tsx +17 -17
- package/dist/frameworks/react/add-ons/storybook/assets/src/routes/demo/storybook.tsx +25 -25
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/media.tsx +9 -9
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/quote.tsx +8 -8
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/markdown-content.tsx +52 -35
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/pagination.tsx +8 -14
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/search.tsx +12 -12
- package/dist/frameworks/react/add-ons/strapi/assets/src/components/strapi-image.tsx +15 -15
- package/dist/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.$articleId.tsx +52 -63
- package/dist/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.tsx +46 -61
- package/dist/frameworks/react/add-ons/tRPC/assets/src/routes/demo/trpc-todo.tsx +10 -18
- package/dist/frameworks/react/add-ons/table/assets/src/routes/demo/table.tsx.ejs +23 -22
- package/dist/frameworks/react/add-ons/tanstack-query/assets/src/routes/demo/tanstack-query.tsx.ejs +21 -35
- package/dist/frameworks/react/add-ons/workos/assets/src/components/workos-user.tsx +1 -1
- package/dist/frameworks/react/add-ons/workos/assets/src/routes/demo/workos.tsx +33 -43
- package/dist/frameworks/react/project/base/_dot_gitignore +1 -0
- package/dist/frameworks/react/project/base/src/styles.css.ejs +203 -0
- package/dist/frameworks/solid/add-ons/better-auth/assets/src/routes/demo.better-auth.tsx +62 -64
- package/dist/frameworks/solid/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -43
- package/dist/frameworks/solid/add-ons/form/assets/src/routes/demo.form.tsx.ejs +22 -22
- package/dist/frameworks/solid/add-ons/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +15 -10
- package/dist/frameworks/solid/add-ons/store/assets/src/routes/demo.store.tsx.ejs +9 -14
- package/dist/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi.tsx +11 -15
- package/dist/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi_.$articleId.tsx +11 -18
- package/dist/frameworks/solid/project/base/_dot_gitignore +1 -0
- package/dist/frameworks/solid/project/base/src/styles.css.ejs +203 -0
- package/package.json +1 -1
- package/src/frameworks/react/add-ons/ai/assets/src/components/demo-AIAssistant.tsx +15 -15
- package/src/frameworks/react/add-ons/ai/assets/src/components/demo-GuitarRecommendation.tsx +8 -6
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.css +21 -21
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.tsx +14 -18
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-image.tsx +20 -26
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-structured.tsx +56 -67
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/$guitarId.tsx +17 -22
- package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/index.tsx +21 -27
- package/src/frameworks/react/add-ons/apollo-client/assets/src/routes/demo.apollo-client.tsx +35 -38
- package/src/frameworks/react/add-ons/better-auth/assets/src/routes/demo/better-auth.tsx +64 -64
- package/src/frameworks/react/add-ons/clerk/assets/src/routes/demo/clerk.tsx +17 -25
- package/src/frameworks/react/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -45
- package/src/frameworks/react/add-ons/db/assets/src/components/demo.chat-area.tsx +5 -5
- package/src/frameworks/react/add-ons/db/assets/src/components/demo.messages.tsx +7 -11
- package/src/frameworks/react/add-ons/db/assets/src/routes/demo/db-chat.tsx +5 -3
- package/src/frameworks/react/add-ons/drizzle/assets/src/routes/demo/drizzle.tsx.ejs +29 -79
- package/src/frameworks/react/add-ons/form/assets/src/components/demo.FormComponents.tsx.ejs +12 -12
- package/src/frameworks/react/add-ons/form/assets/src/routes/demo/form.address.tsx.ejs +11 -10
- package/src/frameworks/react/add-ons/form/assets/src/routes/demo/form.simple.tsx.ejs +11 -10
- package/src/frameworks/react/add-ons/mcp/assets/src/routes/demo/mcp-todos.tsx +10 -18
- package/src/frameworks/react/add-ons/neon/assets/src/routes/demo/neon.tsx +38 -57
- package/src/frameworks/react/add-ons/oRPC/assets/src/routes/demo/orpc-todo.tsx +10 -18
- package/src/frameworks/react/add-ons/paraglide/assets/src/routes/demo.i18n.tsx.ejs +6 -7
- package/src/frameworks/react/add-ons/posthog/assets/src/routes/demo/posthog.tsx +19 -22
- package/src/frameworks/react/add-ons/powersync/assets/src/routes/demo/powersync.tsx +19 -18
- package/src/frameworks/react/add-ons/prisma/assets/src/routes/demo/prisma.tsx.ejs +29 -79
- package/src/frameworks/react/add-ons/sentry/assets/src/routes/demo/sentry.testing.tsx +71 -102
- package/src/frameworks/react/add-ons/store/assets/src/lib/demo-store-devtools.tsx +3 -3
- package/src/frameworks/react/add-ons/store/assets/src/routes/demo/store.tsx.ejs +9 -14
- package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/button.tsx +23 -26
- package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/dialog.tsx +12 -16
- package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/input.tsx +14 -17
- package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/radio-group.tsx +15 -15
- package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/slider.tsx +17 -17
- package/src/frameworks/react/add-ons/storybook/assets/src/routes/demo/storybook.tsx +25 -25
- package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/media.tsx +9 -9
- package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/quote.tsx +8 -8
- package/src/frameworks/react/add-ons/strapi/assets/src/components/markdown-content.tsx +52 -35
- package/src/frameworks/react/add-ons/strapi/assets/src/components/pagination.tsx +8 -14
- package/src/frameworks/react/add-ons/strapi/assets/src/components/search.tsx +12 -12
- package/src/frameworks/react/add-ons/strapi/assets/src/components/strapi-image.tsx +15 -15
- package/src/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.$articleId.tsx +52 -63
- package/src/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.tsx +46 -61
- package/src/frameworks/react/add-ons/tRPC/assets/src/routes/demo/trpc-todo.tsx +10 -18
- package/src/frameworks/react/add-ons/table/assets/src/routes/demo/table.tsx.ejs +23 -22
- package/src/frameworks/react/add-ons/tanstack-query/assets/src/routes/demo/tanstack-query.tsx.ejs +21 -35
- package/src/frameworks/react/add-ons/workos/assets/src/components/workos-user.tsx +1 -1
- package/src/frameworks/react/add-ons/workos/assets/src/routes/demo/workos.tsx +33 -43
- package/src/frameworks/react/project/base/_dot_gitignore +1 -0
- package/src/frameworks/react/project/base/src/styles.css.ejs +203 -0
- package/src/frameworks/solid/add-ons/better-auth/assets/src/routes/demo.better-auth.tsx +62 -64
- package/src/frameworks/solid/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -43
- package/src/frameworks/solid/add-ons/form/assets/src/routes/demo.form.tsx.ejs +22 -22
- package/src/frameworks/solid/add-ons/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +15 -10
- package/src/frameworks/solid/add-ons/store/assets/src/routes/demo.store.tsx.ejs +9 -14
- package/src/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi.tsx +11 -15
- package/src/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi_.$articleId.tsx +11 -18
- package/src/frameworks/solid/project/base/_dot_gitignore +1 -0
- package/src/frameworks/solid/project/base/src/styles.css.ejs +203 -0
- package/tests/framework-template.test.ts +15 -0
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import React from
|
|
1
|
+
import React from 'react'
|
|
2
2
|
|
|
3
3
|
export interface SliderProps {
|
|
4
|
-
label: string
|
|
5
|
-
id: string
|
|
6
|
-
value?: number
|
|
7
|
-
onChange?: (value: number) => void
|
|
8
|
-
min?: number
|
|
9
|
-
max?: number
|
|
10
|
-
step?: number
|
|
11
|
-
showValue?: boolean
|
|
12
|
-
className?: string
|
|
4
|
+
label: string
|
|
5
|
+
id: string
|
|
6
|
+
value?: number
|
|
7
|
+
onChange?: (value: number) => void
|
|
8
|
+
min?: number
|
|
9
|
+
max?: number
|
|
10
|
+
step?: number
|
|
11
|
+
showValue?: boolean
|
|
12
|
+
className?: string
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export const Slider: React.FC<SliderProps> = ({
|
|
@@ -21,19 +21,19 @@ export const Slider: React.FC<SliderProps> = ({
|
|
|
21
21
|
max = 100,
|
|
22
22
|
step = 1,
|
|
23
23
|
showValue = true,
|
|
24
|
-
className =
|
|
24
|
+
className = '',
|
|
25
25
|
}) => {
|
|
26
26
|
return (
|
|
27
27
|
<div className={`flex flex-col gap-2 ${className}`}>
|
|
28
28
|
<div className="flex justify-between items-center">
|
|
29
29
|
<label
|
|
30
30
|
htmlFor={id}
|
|
31
|
-
className="text-sm font-medium text-
|
|
31
|
+
className="text-sm font-medium text-[var(--sea-ink)]"
|
|
32
32
|
>
|
|
33
33
|
{label}
|
|
34
34
|
</label>
|
|
35
35
|
{showValue && (
|
|
36
|
-
<span className="
|
|
36
|
+
<span className="min-w-12 text-right text-sm font-semibold text-[var(--lagoon-deep)]">
|
|
37
37
|
{value}
|
|
38
38
|
</span>
|
|
39
39
|
)}
|
|
@@ -46,12 +46,12 @@ export const Slider: React.FC<SliderProps> = ({
|
|
|
46
46
|
min={min}
|
|
47
47
|
max={max}
|
|
48
48
|
step={step}
|
|
49
|
-
className="
|
|
49
|
+
className="h-2 w-full cursor-pointer appearance-none rounded-lg bg-[var(--chip-bg)] accent-[var(--lagoon-deep)]"
|
|
50
50
|
/>
|
|
51
|
-
<div className="flex justify-between text-xs
|
|
51
|
+
<div className="demo-muted flex justify-between text-xs">
|
|
52
52
|
<span>{min}</span>
|
|
53
53
|
<span>{max}</span>
|
|
54
54
|
</div>
|
|
55
55
|
</div>
|
|
56
|
-
)
|
|
57
|
-
}
|
|
56
|
+
)
|
|
57
|
+
}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import { createFileRoute } from
|
|
2
|
-
import { useState } from
|
|
1
|
+
import { createFileRoute } from '@tanstack/react-router'
|
|
2
|
+
import { useState } from 'react'
|
|
3
3
|
|
|
4
|
-
import { Dialog } from
|
|
5
|
-
import { Input } from
|
|
6
|
-
import { RadioGroup } from
|
|
7
|
-
import { Slider } from
|
|
8
|
-
import { Button } from
|
|
4
|
+
import { Dialog } from '#/components/storybook/dialog'
|
|
5
|
+
import { Input } from '#/components/storybook/input'
|
|
6
|
+
import { RadioGroup } from '#/components/storybook/radio-group'
|
|
7
|
+
import { Slider } from '#/components/storybook/slider'
|
|
8
|
+
import { Button } from '#/components/storybook/button'
|
|
9
9
|
|
|
10
|
-
export const Route = createFileRoute(
|
|
10
|
+
export const Route = createFileRoute('/demo/storybook')({
|
|
11
11
|
component: StorybookDemo,
|
|
12
|
-
})
|
|
12
|
+
})
|
|
13
13
|
|
|
14
14
|
function StorybookDemo() {
|
|
15
|
-
const [firstName, setFirstName] = useState(
|
|
16
|
-
const [lastName, setLastName] = useState(
|
|
17
|
-
const [employmentType, setEmploymentType] = useState(
|
|
18
|
-
const [coffeeCups, setCoffeeCups] = useState(3)
|
|
15
|
+
const [firstName, setFirstName] = useState('')
|
|
16
|
+
const [lastName, setLastName] = useState('')
|
|
17
|
+
const [employmentType, setEmploymentType] = useState('full-time')
|
|
18
|
+
const [coffeeCups, setCoffeeCups] = useState(3)
|
|
19
19
|
|
|
20
|
-
const handleSubmit = () => {}
|
|
20
|
+
const handleSubmit = () => {}
|
|
21
21
|
|
|
22
22
|
const handleReset = () => {
|
|
23
|
-
setFirstName(
|
|
24
|
-
setLastName(
|
|
25
|
-
setEmploymentType(
|
|
26
|
-
setCoffeeCups(3)
|
|
27
|
-
}
|
|
23
|
+
setFirstName('')
|
|
24
|
+
setLastName('')
|
|
25
|
+
setEmploymentType('full-time')
|
|
26
|
+
setCoffeeCups(3)
|
|
27
|
+
}
|
|
28
28
|
|
|
29
29
|
return (
|
|
30
|
-
<
|
|
31
|
-
<div className="max-w-2xl
|
|
30
|
+
<main className="demo-page demo-center">
|
|
31
|
+
<div className="w-full max-w-2xl">
|
|
32
32
|
<Dialog
|
|
33
33
|
title="Employee Information Form"
|
|
34
34
|
footer={
|
|
@@ -70,8 +70,8 @@ function StorybookDemo() {
|
|
|
70
70
|
label="Employment Type"
|
|
71
71
|
name="employmentType"
|
|
72
72
|
options={[
|
|
73
|
-
{ value:
|
|
74
|
-
{ value:
|
|
73
|
+
{ value: 'full-time', label: 'Full Time' },
|
|
74
|
+
{ value: 'part-time', label: 'Part Time' },
|
|
75
75
|
]}
|
|
76
76
|
value={employmentType}
|
|
77
77
|
onChange={setEmploymentType}
|
|
@@ -88,6 +88,6 @@ function StorybookDemo() {
|
|
|
88
88
|
</form>
|
|
89
89
|
</Dialog>
|
|
90
90
|
</div>
|
|
91
|
-
</
|
|
92
|
-
)
|
|
91
|
+
</main>
|
|
92
|
+
)
|
|
93
93
|
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import { StrapiImage } from
|
|
2
|
-
import type { TImage } from
|
|
1
|
+
import { StrapiImage } from '@/components/strapi-image'
|
|
2
|
+
import type { TImage } from '@/types/strapi'
|
|
3
3
|
|
|
4
4
|
export interface IMedia {
|
|
5
|
-
__component:
|
|
6
|
-
id: number
|
|
7
|
-
file?: TImage
|
|
5
|
+
__component: 'shared.media'
|
|
6
|
+
id: number
|
|
7
|
+
file?: TImage
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export function Media({ file }: Readonly<IMedia>) {
|
|
11
|
-
if (!file) return null
|
|
11
|
+
if (!file) return null
|
|
12
12
|
|
|
13
13
|
return (
|
|
14
14
|
<figure className="my-8">
|
|
15
15
|
<StrapiImage
|
|
16
16
|
src={file.url}
|
|
17
|
-
alt={file.alternativeText ||
|
|
17
|
+
alt={file.alternativeText || ''}
|
|
18
18
|
className="rounded-lg w-full"
|
|
19
19
|
/>
|
|
20
20
|
{file.alternativeText && (
|
|
21
|
-
<figcaption className="mt-2 text-center text-sm
|
|
21
|
+
<figcaption className="demo-muted mt-2 text-center text-sm">
|
|
22
22
|
{file.alternativeText}
|
|
23
23
|
</figcaption>
|
|
24
24
|
)}
|
|
25
25
|
</figure>
|
|
26
|
-
)
|
|
26
|
+
)
|
|
27
27
|
}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
export interface IQuote {
|
|
2
|
-
__component:
|
|
3
|
-
id: number
|
|
4
|
-
body: string
|
|
5
|
-
title?: string
|
|
2
|
+
__component: 'shared.quote'
|
|
3
|
+
id: number
|
|
4
|
+
body: string
|
|
5
|
+
title?: string
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
export function Quote({ body, title }: Readonly<IQuote>) {
|
|
9
9
|
return (
|
|
10
|
-
<blockquote className="border-l-4 border-
|
|
11
|
-
<p className="text-xl italic
|
|
10
|
+
<blockquote className="demo-card my-6 border-l-4 border-l-[var(--lagoon-deep)] py-4 pl-6">
|
|
11
|
+
<p className="demo-muted text-xl italic leading-relaxed">{body}</p>
|
|
12
12
|
{title && (
|
|
13
|
-
<cite className="
|
|
13
|
+
<cite className="mt-4 block font-medium not-italic text-[var(--sea-ink)]">
|
|
14
14
|
— {title}
|
|
15
15
|
</cite>
|
|
16
16
|
)}
|
|
17
17
|
</blockquote>
|
|
18
|
-
)
|
|
18
|
+
)
|
|
19
19
|
}
|
|
@@ -1,36 +1,40 @@
|
|
|
1
|
-
import Markdown from
|
|
2
|
-
import remarkGfm from
|
|
1
|
+
import Markdown from 'react-markdown'
|
|
2
|
+
import remarkGfm from 'remark-gfm'
|
|
3
3
|
|
|
4
4
|
interface MarkdownContentProps {
|
|
5
|
-
content: string | undefined | null
|
|
6
|
-
className?: string
|
|
5
|
+
content: string | undefined | null
|
|
6
|
+
className?: string
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
const styles = {
|
|
10
|
-
h1:
|
|
11
|
-
h2:
|
|
12
|
-
h3:
|
|
13
|
-
p:
|
|
14
|
-
a:
|
|
15
|
-
ul:
|
|
16
|
-
ol:
|
|
17
|
-
li:
|
|
18
|
-
blockquote:
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
10
|
+
h1: 'mb-6 text-3xl font-bold text-[var(--sea-ink)]',
|
|
11
|
+
h2: 'mb-4 text-2xl font-bold text-[var(--sea-ink)]',
|
|
12
|
+
h3: 'mb-3 text-xl font-bold text-[var(--sea-ink)]',
|
|
13
|
+
p: 'demo-muted mb-4 leading-relaxed',
|
|
14
|
+
a: 'hover:underline',
|
|
15
|
+
ul: 'demo-muted mb-4 list-disc space-y-2 pl-6',
|
|
16
|
+
ol: 'demo-muted mb-4 list-decimal space-y-2 pl-6',
|
|
17
|
+
li: 'leading-relaxed',
|
|
18
|
+
blockquote:
|
|
19
|
+
'demo-card my-4 border-l-4 border-l-[var(--lagoon-deep)] pl-4 italic',
|
|
20
|
+
code: 'text-sm font-mono',
|
|
21
|
+
pre: 'demo-code-block mb-4 overflow-x-auto',
|
|
22
|
+
table: 'w-full border-collapse mb-4',
|
|
23
|
+
th: 'border border-[var(--line)] bg-[var(--chip-bg)] p-2 text-left text-[var(--sea-ink)]',
|
|
24
|
+
td: 'demo-muted border border-[var(--line)] p-2',
|
|
25
|
+
img: 'max-w-full h-auto rounded-lg my-4',
|
|
26
|
+
hr: 'my-8 border-[var(--line)]',
|
|
27
|
+
strong: 'font-semibold text-[var(--sea-ink)]',
|
|
28
|
+
}
|
|
28
29
|
|
|
29
|
-
export function MarkdownContent({
|
|
30
|
-
|
|
30
|
+
export function MarkdownContent({
|
|
31
|
+
content,
|
|
32
|
+
className = '',
|
|
33
|
+
}: MarkdownContentProps) {
|
|
34
|
+
if (!content) return null
|
|
31
35
|
|
|
32
36
|
return (
|
|
33
|
-
<div className={`
|
|
37
|
+
<div className={`max-w-none ${className}`}>
|
|
34
38
|
<Markdown
|
|
35
39
|
remarkPlugins={[remarkGfm]}
|
|
36
40
|
components={{
|
|
@@ -39,36 +43,49 @@ export function MarkdownContent({ content, className = "" }: MarkdownContentProp
|
|
|
39
43
|
h3: ({ children }) => <h3 className={styles.h3}>{children}</h3>,
|
|
40
44
|
p: ({ children }) => <p className={styles.p}>{children}</p>,
|
|
41
45
|
a: ({ href, children }) => (
|
|
42
|
-
<a
|
|
46
|
+
<a
|
|
47
|
+
href={href}
|
|
48
|
+
className={styles.a}
|
|
49
|
+
target="_blank"
|
|
50
|
+
rel="noopener noreferrer"
|
|
51
|
+
>
|
|
43
52
|
{children}
|
|
44
53
|
</a>
|
|
45
54
|
),
|
|
46
55
|
ul: ({ children }) => <ul className={styles.ul}>{children}</ul>,
|
|
47
56
|
ol: ({ children }) => <ol className={styles.ol}>{children}</ol>,
|
|
48
57
|
li: ({ children }) => <li className={styles.li}>{children}</li>,
|
|
49
|
-
blockquote: ({ children }) =>
|
|
58
|
+
blockquote: ({ children }) => (
|
|
59
|
+
<blockquote className={styles.blockquote}>{children}</blockquote>
|
|
60
|
+
),
|
|
50
61
|
code: ({ className, children }) => {
|
|
51
|
-
const isCodeBlock = className?.includes(
|
|
62
|
+
const isCodeBlock = className?.includes('language-')
|
|
52
63
|
if (isCodeBlock) {
|
|
53
64
|
return (
|
|
54
65
|
<pre className={styles.pre}>
|
|
55
|
-
<code className="text-sm font-mono
|
|
66
|
+
<code className="text-sm font-mono">{children}</code>
|
|
56
67
|
</pre>
|
|
57
|
-
)
|
|
68
|
+
)
|
|
58
69
|
}
|
|
59
|
-
return <code className={styles.code}>{children}</code
|
|
70
|
+
return <code className={styles.code}>{children}</code>
|
|
60
71
|
},
|
|
61
72
|
pre: ({ children }) => <>{children}</>,
|
|
62
|
-
table: ({ children }) =>
|
|
73
|
+
table: ({ children }) => (
|
|
74
|
+
<table className={styles.table}>{children}</table>
|
|
75
|
+
),
|
|
63
76
|
th: ({ children }) => <th className={styles.th}>{children}</th>,
|
|
64
77
|
td: ({ children }) => <td className={styles.td}>{children}</td>,
|
|
65
|
-
img: ({ src, alt }) =>
|
|
78
|
+
img: ({ src, alt }) => (
|
|
79
|
+
<img src={src} alt={alt || ''} className={styles.img} />
|
|
80
|
+
),
|
|
66
81
|
hr: () => <hr className={styles.hr} />,
|
|
67
|
-
strong: ({ children }) =>
|
|
82
|
+
strong: ({ children }) => (
|
|
83
|
+
<strong className={styles.strong}>{children}</strong>
|
|
84
|
+
),
|
|
68
85
|
}}
|
|
69
86
|
>
|
|
70
87
|
{content}
|
|
71
88
|
</Markdown>
|
|
72
89
|
</div>
|
|
73
|
-
)
|
|
90
|
+
)
|
|
74
91
|
}
|
|
@@ -64,10 +64,8 @@ export function Pagination({ pageCount, className = '' }: PaginationProps) {
|
|
|
64
64
|
<button
|
|
65
65
|
onClick={() => currentPage > 1 && handlePageChange(currentPage - 1)}
|
|
66
66
|
disabled={currentPage <= 1}
|
|
67
|
-
className={`
|
|
68
|
-
currentPage <= 1
|
|
69
|
-
? 'text-gray-600 cursor-not-allowed'
|
|
70
|
-
: 'text-gray-300 hover:bg-slate-700 hover:text-white'
|
|
67
|
+
className={`demo-button demo-button-secondary ${
|
|
68
|
+
currentPage <= 1 ? 'cursor-not-allowed opacity-50' : ''
|
|
71
69
|
}`}
|
|
72
70
|
>
|
|
73
71
|
<ChevronLeft className="w-4 h-4" />
|
|
@@ -80,7 +78,7 @@ export function Pagination({ pageCount, className = '' }: PaginationProps) {
|
|
|
80
78
|
page === 'ellipsis' ? (
|
|
81
79
|
<span
|
|
82
80
|
key={`ellipsis-${index}`}
|
|
83
|
-
className="px-2 py-2
|
|
81
|
+
className="demo-muted hidden px-2 py-2 md:block"
|
|
84
82
|
>
|
|
85
83
|
...
|
|
86
84
|
</span>
|
|
@@ -88,15 +86,13 @@ export function Pagination({ pageCount, className = '' }: PaginationProps) {
|
|
|
88
86
|
<button
|
|
89
87
|
key={page}
|
|
90
88
|
onClick={() => handlePageChange(page)}
|
|
91
|
-
className={`min-w-[40px]
|
|
92
|
-
currentPage === page
|
|
93
|
-
? 'bg-cyan-500 text-white'
|
|
94
|
-
: 'text-gray-300 hover:bg-slate-700 hover:text-white'
|
|
89
|
+
className={`demo-button min-w-[40px] ${
|
|
90
|
+
currentPage === page ? '' : 'demo-button-secondary'
|
|
95
91
|
}`}
|
|
96
92
|
>
|
|
97
93
|
{page}
|
|
98
94
|
</button>
|
|
99
|
-
)
|
|
95
|
+
),
|
|
100
96
|
)}
|
|
101
97
|
</div>
|
|
102
98
|
|
|
@@ -106,10 +102,8 @@ export function Pagination({ pageCount, className = '' }: PaginationProps) {
|
|
|
106
102
|
currentPage < pageCount && handlePageChange(currentPage + 1)
|
|
107
103
|
}
|
|
108
104
|
disabled={currentPage >= pageCount}
|
|
109
|
-
className={`
|
|
110
|
-
currentPage >= pageCount
|
|
111
|
-
? 'text-gray-600 cursor-not-allowed'
|
|
112
|
-
: 'text-gray-300 hover:bg-slate-700 hover:text-white'
|
|
105
|
+
className={`demo-button demo-button-secondary ${
|
|
106
|
+
currentPage >= pageCount ? 'cursor-not-allowed opacity-50' : ''
|
|
113
107
|
}`}
|
|
114
108
|
>
|
|
115
109
|
<span className="hidden sm:inline">Next</span>
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import { useRouter, useSearch } from
|
|
2
|
-
import { useDebouncedCallback } from
|
|
1
|
+
import { useRouter, useSearch } from '@tanstack/react-router'
|
|
2
|
+
import { useDebouncedCallback } from 'use-debounce'
|
|
3
3
|
|
|
4
4
|
interface SearchProps {
|
|
5
|
-
readonly className?: string
|
|
5
|
+
readonly className?: string
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
export function Search({ className =
|
|
9
|
-
const search = useSearch({ strict: false })
|
|
10
|
-
const router = useRouter()
|
|
8
|
+
export function Search({ className = '' }: SearchProps) {
|
|
9
|
+
const search = useSearch({ strict: false })
|
|
10
|
+
const router = useRouter()
|
|
11
11
|
|
|
12
12
|
const handleSearch = useDebouncedCallback((term: string) => {
|
|
13
13
|
router.navigate({
|
|
14
|
-
to:
|
|
14
|
+
to: '.',
|
|
15
15
|
search: (prev) => ({
|
|
16
16
|
...prev,
|
|
17
17
|
page: 1,
|
|
18
18
|
query: term || undefined,
|
|
19
19
|
}),
|
|
20
20
|
replace: true,
|
|
21
|
-
})
|
|
22
|
-
}, 300)
|
|
21
|
+
})
|
|
22
|
+
}, 300)
|
|
23
23
|
|
|
24
24
|
return (
|
|
25
25
|
<input
|
|
@@ -28,8 +28,8 @@ export function Search({ className = "" }: SearchProps) {
|
|
|
28
28
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
|
|
29
29
|
handleSearch(e.target.value)
|
|
30
30
|
}
|
|
31
|
-
defaultValue={(search as any)?.query ||
|
|
32
|
-
className={`
|
|
31
|
+
defaultValue={(search as any)?.query || ''}
|
|
32
|
+
className={`demo-input ${className}`}
|
|
33
33
|
/>
|
|
34
|
-
)
|
|
34
|
+
)
|
|
35
35
|
}
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
import { useState } from
|
|
2
|
-
import { getStrapiMedia } from
|
|
1
|
+
import { useState } from 'react'
|
|
2
|
+
import { getStrapiMedia } from '@/lib/strapi-utils'
|
|
3
3
|
|
|
4
4
|
interface StrapiImageProps {
|
|
5
|
-
src: string | undefined | null
|
|
6
|
-
alt?: string | null
|
|
7
|
-
className?: string
|
|
8
|
-
width?: number | string
|
|
9
|
-
height?: number | string
|
|
5
|
+
src: string | undefined | null
|
|
6
|
+
alt?: string | null
|
|
7
|
+
className?: string
|
|
8
|
+
width?: number | string
|
|
9
|
+
height?: number | string
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
export function StrapiImage({
|
|
13
13
|
src,
|
|
14
14
|
alt,
|
|
15
|
-
className =
|
|
15
|
+
className = '',
|
|
16
16
|
width,
|
|
17
17
|
height,
|
|
18
18
|
}: StrapiImageProps) {
|
|
19
|
-
const [hasError, setHasError] = useState(false)
|
|
19
|
+
const [hasError, setHasError] = useState(false)
|
|
20
20
|
|
|
21
|
-
if (!src) return null
|
|
21
|
+
if (!src) return null
|
|
22
22
|
|
|
23
|
-
const imageUrl = getStrapiMedia(src)
|
|
23
|
+
const imageUrl = getStrapiMedia(src)
|
|
24
24
|
|
|
25
25
|
if (hasError) {
|
|
26
26
|
return (
|
|
27
27
|
<div
|
|
28
|
-
className={`
|
|
28
|
+
className={`flex items-center justify-center bg-[var(--chip-bg)] text-sm text-[var(--sea-ink-soft)] ${className}`}
|
|
29
29
|
style={{ width, height }}
|
|
30
30
|
>
|
|
31
31
|
<span>Image not available</span>
|
|
32
32
|
</div>
|
|
33
|
-
)
|
|
33
|
+
)
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
return (
|
|
37
37
|
<img
|
|
38
38
|
src={imageUrl}
|
|
39
|
-
alt={alt ||
|
|
39
|
+
alt={alt || ''}
|
|
40
40
|
width={width}
|
|
41
41
|
height={height}
|
|
42
42
|
loading="lazy"
|
|
43
43
|
className={`object-cover ${className}`}
|
|
44
44
|
onError={() => setHasError(true)}
|
|
45
45
|
/>
|
|
46
|
-
)
|
|
46
|
+
)
|
|
47
47
|
}
|