@tanstack/create 0.67.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.
Files changed (121) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/frameworks/react/add-ons/ai/assets/src/components/demo-AIAssistant.tsx +15 -15
  3. package/dist/frameworks/react/add-ons/ai/assets/src/components/demo-GuitarRecommendation.tsx +8 -6
  4. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.css +21 -21
  5. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.tsx +14 -18
  6. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-image.tsx +20 -26
  7. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-structured.tsx +56 -67
  8. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/$guitarId.tsx +17 -22
  9. package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/index.tsx +21 -27
  10. package/dist/frameworks/react/add-ons/apollo-client/assets/src/routes/demo.apollo-client.tsx +35 -38
  11. package/dist/frameworks/react/add-ons/better-auth/assets/src/routes/demo/better-auth.tsx +64 -64
  12. package/dist/frameworks/react/add-ons/clerk/assets/src/routes/demo/clerk.tsx +17 -25
  13. package/dist/frameworks/react/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -45
  14. package/dist/frameworks/react/add-ons/db/assets/src/components/demo.chat-area.tsx +5 -5
  15. package/dist/frameworks/react/add-ons/db/assets/src/components/demo.messages.tsx +7 -11
  16. package/dist/frameworks/react/add-ons/db/assets/src/routes/demo/db-chat.tsx +5 -3
  17. package/dist/frameworks/react/add-ons/drizzle/assets/src/routes/demo/drizzle.tsx.ejs +29 -79
  18. package/dist/frameworks/react/add-ons/form/assets/src/components/demo.FormComponents.tsx.ejs +12 -12
  19. package/dist/frameworks/react/add-ons/form/assets/src/routes/demo/form.address.tsx.ejs +11 -10
  20. package/dist/frameworks/react/add-ons/form/assets/src/routes/demo/form.simple.tsx.ejs +11 -10
  21. package/dist/frameworks/react/add-ons/mcp/assets/src/routes/demo/mcp-todos.tsx +10 -18
  22. package/dist/frameworks/react/add-ons/neon/assets/src/routes/demo/neon.tsx +38 -57
  23. package/dist/frameworks/react/add-ons/oRPC/assets/src/routes/demo/orpc-todo.tsx +10 -18
  24. package/dist/frameworks/react/add-ons/paraglide/assets/src/routes/demo.i18n.tsx.ejs +6 -7
  25. package/dist/frameworks/react/add-ons/posthog/assets/src/routes/demo/posthog.tsx +19 -22
  26. package/dist/frameworks/react/add-ons/powersync/assets/src/routes/demo/powersync.tsx +19 -18
  27. package/dist/frameworks/react/add-ons/prisma/assets/src/routes/demo/prisma.tsx.ejs +29 -79
  28. package/dist/frameworks/react/add-ons/sentry/assets/src/routes/demo/sentry.testing.tsx +71 -102
  29. package/dist/frameworks/react/add-ons/store/assets/src/lib/demo-store-devtools.tsx +3 -3
  30. package/dist/frameworks/react/add-ons/store/assets/src/routes/demo/store.tsx.ejs +9 -14
  31. package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/button.tsx +23 -26
  32. package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/dialog.tsx +12 -16
  33. package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/input.tsx +14 -17
  34. package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/radio-group.tsx +15 -15
  35. package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/slider.tsx +17 -17
  36. package/dist/frameworks/react/add-ons/storybook/assets/src/routes/demo/storybook.tsx +25 -25
  37. package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/media.tsx +9 -9
  38. package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/quote.tsx +8 -8
  39. package/dist/frameworks/react/add-ons/strapi/assets/src/components/markdown-content.tsx +52 -35
  40. package/dist/frameworks/react/add-ons/strapi/assets/src/components/pagination.tsx +8 -14
  41. package/dist/frameworks/react/add-ons/strapi/assets/src/components/search.tsx +12 -12
  42. package/dist/frameworks/react/add-ons/strapi/assets/src/components/strapi-image.tsx +15 -15
  43. package/dist/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.$articleId.tsx +52 -63
  44. package/dist/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.tsx +46 -61
  45. package/dist/frameworks/react/add-ons/tRPC/assets/src/routes/demo/trpc-todo.tsx +10 -18
  46. package/dist/frameworks/react/add-ons/table/assets/src/routes/demo/table.tsx.ejs +23 -22
  47. package/dist/frameworks/react/add-ons/tanstack-query/assets/src/routes/demo/tanstack-query.tsx.ejs +21 -35
  48. package/dist/frameworks/react/add-ons/workos/assets/src/components/workos-user.tsx +1 -1
  49. package/dist/frameworks/react/add-ons/workos/assets/src/routes/demo/workos.tsx +33 -43
  50. package/dist/frameworks/react/project/base/_dot_gitignore +1 -0
  51. package/dist/frameworks/react/project/base/src/styles.css.ejs +203 -0
  52. package/dist/frameworks/solid/add-ons/better-auth/assets/src/routes/demo.better-auth.tsx +62 -64
  53. package/dist/frameworks/solid/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -43
  54. package/dist/frameworks/solid/add-ons/form/assets/src/routes/demo.form.tsx.ejs +22 -22
  55. package/dist/frameworks/solid/add-ons/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +15 -10
  56. package/dist/frameworks/solid/add-ons/store/assets/src/routes/demo.store.tsx.ejs +9 -14
  57. package/dist/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi.tsx +11 -15
  58. package/dist/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi_.$articleId.tsx +11 -18
  59. package/dist/frameworks/solid/project/base/_dot_gitignore +1 -0
  60. package/dist/frameworks/solid/project/base/src/styles.css.ejs +203 -0
  61. package/package.json +1 -1
  62. package/src/frameworks/react/add-ons/ai/assets/src/components/demo-AIAssistant.tsx +15 -15
  63. package/src/frameworks/react/add-ons/ai/assets/src/components/demo-GuitarRecommendation.tsx +8 -6
  64. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.css +21 -21
  65. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-chat.tsx +14 -18
  66. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-image.tsx +20 -26
  67. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/ai-structured.tsx +56 -67
  68. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/$guitarId.tsx +17 -22
  69. package/src/frameworks/react/add-ons/ai/assets/src/routes/demo/guitars/index.tsx +21 -27
  70. package/src/frameworks/react/add-ons/apollo-client/assets/src/routes/demo.apollo-client.tsx +35 -38
  71. package/src/frameworks/react/add-ons/better-auth/assets/src/routes/demo/better-auth.tsx +64 -64
  72. package/src/frameworks/react/add-ons/clerk/assets/src/routes/demo/clerk.tsx +17 -25
  73. package/src/frameworks/react/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -45
  74. package/src/frameworks/react/add-ons/db/assets/src/components/demo.chat-area.tsx +5 -5
  75. package/src/frameworks/react/add-ons/db/assets/src/components/demo.messages.tsx +7 -11
  76. package/src/frameworks/react/add-ons/db/assets/src/routes/demo/db-chat.tsx +5 -3
  77. package/src/frameworks/react/add-ons/drizzle/assets/src/routes/demo/drizzle.tsx.ejs +29 -79
  78. package/src/frameworks/react/add-ons/form/assets/src/components/demo.FormComponents.tsx.ejs +12 -12
  79. package/src/frameworks/react/add-ons/form/assets/src/routes/demo/form.address.tsx.ejs +11 -10
  80. package/src/frameworks/react/add-ons/form/assets/src/routes/demo/form.simple.tsx.ejs +11 -10
  81. package/src/frameworks/react/add-ons/mcp/assets/src/routes/demo/mcp-todos.tsx +10 -18
  82. package/src/frameworks/react/add-ons/neon/assets/src/routes/demo/neon.tsx +38 -57
  83. package/src/frameworks/react/add-ons/oRPC/assets/src/routes/demo/orpc-todo.tsx +10 -18
  84. package/src/frameworks/react/add-ons/paraglide/assets/src/routes/demo.i18n.tsx.ejs +6 -7
  85. package/src/frameworks/react/add-ons/posthog/assets/src/routes/demo/posthog.tsx +19 -22
  86. package/src/frameworks/react/add-ons/powersync/assets/src/routes/demo/powersync.tsx +19 -18
  87. package/src/frameworks/react/add-ons/prisma/assets/src/routes/demo/prisma.tsx.ejs +29 -79
  88. package/src/frameworks/react/add-ons/sentry/assets/src/routes/demo/sentry.testing.tsx +71 -102
  89. package/src/frameworks/react/add-ons/store/assets/src/lib/demo-store-devtools.tsx +3 -3
  90. package/src/frameworks/react/add-ons/store/assets/src/routes/demo/store.tsx.ejs +9 -14
  91. package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/button.tsx +23 -26
  92. package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/dialog.tsx +12 -16
  93. package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/input.tsx +14 -17
  94. package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/radio-group.tsx +15 -15
  95. package/src/frameworks/react/add-ons/storybook/assets/src/components/storybook/slider.tsx +17 -17
  96. package/src/frameworks/react/add-ons/storybook/assets/src/routes/demo/storybook.tsx +25 -25
  97. package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/media.tsx +9 -9
  98. package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/quote.tsx +8 -8
  99. package/src/frameworks/react/add-ons/strapi/assets/src/components/markdown-content.tsx +52 -35
  100. package/src/frameworks/react/add-ons/strapi/assets/src/components/pagination.tsx +8 -14
  101. package/src/frameworks/react/add-ons/strapi/assets/src/components/search.tsx +12 -12
  102. package/src/frameworks/react/add-ons/strapi/assets/src/components/strapi-image.tsx +15 -15
  103. package/src/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.$articleId.tsx +52 -63
  104. package/src/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.tsx +46 -61
  105. package/src/frameworks/react/add-ons/tRPC/assets/src/routes/demo/trpc-todo.tsx +10 -18
  106. package/src/frameworks/react/add-ons/table/assets/src/routes/demo/table.tsx.ejs +23 -22
  107. package/src/frameworks/react/add-ons/tanstack-query/assets/src/routes/demo/tanstack-query.tsx.ejs +21 -35
  108. package/src/frameworks/react/add-ons/workos/assets/src/components/workos-user.tsx +1 -1
  109. package/src/frameworks/react/add-ons/workos/assets/src/routes/demo/workos.tsx +33 -43
  110. package/src/frameworks/react/project/base/_dot_gitignore +1 -0
  111. package/src/frameworks/react/project/base/src/styles.css.ejs +203 -0
  112. package/src/frameworks/solid/add-ons/better-auth/assets/src/routes/demo.better-auth.tsx +62 -64
  113. package/src/frameworks/solid/add-ons/convex/assets/src/routes/demo/convex.tsx +30 -43
  114. package/src/frameworks/solid/add-ons/form/assets/src/routes/demo.form.tsx.ejs +22 -22
  115. package/src/frameworks/solid/add-ons/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +15 -10
  116. package/src/frameworks/solid/add-ons/store/assets/src/routes/demo.store.tsx.ejs +9 -14
  117. package/src/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi.tsx +11 -15
  118. package/src/frameworks/solid/add-ons/strapi/assets/src/routes/demo/strapi_.$articleId.tsx +11 -18
  119. package/src/frameworks/solid/project/base/_dot_gitignore +1 -0
  120. package/src/frameworks/solid/project/base/src/styles.css.ejs +203 -0
  121. package/tests/framework-template.test.ts +15 -0
@@ -1,15 +1,15 @@
1
- import React from "react";
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-gray-700 dark:text-gray-200"
31
+ className="text-sm font-medium text-[var(--sea-ink)]"
32
32
  >
33
33
  {label}
34
34
  </label>
35
35
  {showValue && (
36
- <span className="text-sm font-semibold text-blue-600 dark:text-blue-400 min-w-12 text-right">
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="w-full h-2 bg-gray-200 dark:bg-gray-700 rounded-lg appearance-none cursor-pointer accent-blue-600 dark:accent-blue-500"
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 text-gray-500 dark:text-gray-400">
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 "@tanstack/react-router";
2
- import { useState } from "react";
1
+ import { createFileRoute } from '@tanstack/react-router'
2
+ import { useState } from 'react'
3
3
 
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";
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("/demo/storybook")({
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("full-time");
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("full-time");
26
- setCoffeeCups(3);
27
- };
23
+ setFirstName('')
24
+ setLastName('')
25
+ setEmploymentType('full-time')
26
+ setCoffeeCups(3)
27
+ }
28
28
 
29
29
  return (
30
- <div className="min-h-screen bg-gradient-to-br from-gray-50 to-gray-100 dark:from-gray-900 dark:to-gray-800 py-12 px-4">
31
- <div className="max-w-2xl mx-auto">
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: "full-time", label: "Full Time" },
74
- { value: "part-time", label: "Part Time" },
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
- </div>
92
- );
91
+ </main>
92
+ )
93
93
  }
@@ -1,27 +1,27 @@
1
- import { StrapiImage } from "@/components/strapi-image";
2
- import type { TImage } from "@/types/strapi";
1
+ import { StrapiImage } from '@/components/strapi-image'
2
+ import type { TImage } from '@/types/strapi'
3
3
 
4
4
  export interface IMedia {
5
- __component: "shared.media";
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 text-gray-500">
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: "shared.quote";
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-cyan-400 pl-6 py-4 my-6 bg-slate-800/30 rounded-r-lg">
11
- <p className="text-xl italic text-gray-300 leading-relaxed">{body}</p>
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="block mt-4 text-cyan-400 not-italic font-medium">
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 "react-markdown";
2
- import remarkGfm from "remark-gfm";
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: "text-3xl font-bold mb-6 text-white",
11
- h2: "text-2xl font-bold mb-4 text-white",
12
- h3: "text-xl font-bold mb-3 text-white",
13
- p: "mb-4 leading-relaxed text-gray-300",
14
- a: "text-cyan-400 hover:underline",
15
- ul: "list-disc pl-6 mb-4 space-y-2 text-gray-300",
16
- ol: "list-decimal pl-6 mb-4 space-y-2 text-gray-300",
17
- li: "leading-relaxed",
18
- blockquote: "border-l-4 border-cyan-400 pl-4 italic text-gray-400 my-4",
19
- code: "bg-slate-800 px-2 py-1 rounded text-cyan-400 text-sm font-mono",
20
- pre: "bg-slate-800 p-4 rounded-lg overflow-x-auto mb-4",
21
- table: "w-full border-collapse mb-4",
22
- th: "border border-slate-700 p-2 bg-slate-800 text-left text-white",
23
- td: "border border-slate-700 p-2 text-gray-300",
24
- img: "max-w-full h-auto rounded-lg my-4",
25
- hr: "border-slate-700 my-8",
26
- strong: "text-white font-semibold",
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({ content, className = "" }: MarkdownContentProps) {
30
- if (!content) return null;
30
+ export function MarkdownContent({
31
+ content,
32
+ className = '',
33
+ }: MarkdownContentProps) {
34
+ if (!content) return null
31
35
 
32
36
  return (
33
- <div className={`prose prose-invert max-w-none ${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 href={href} className={styles.a} target="_blank" rel="noopener noreferrer">
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 }) => <blockquote className={styles.blockquote}>{children}</blockquote>,
58
+ blockquote: ({ children }) => (
59
+ <blockquote className={styles.blockquote}>{children}</blockquote>
60
+ ),
50
61
  code: ({ className, children }) => {
51
- const isCodeBlock = className?.includes("language-");
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 text-gray-300">{children}</code>
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 }) => <table className={styles.table}>{children}</table>,
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 }) => <img src={src} alt={alt || ""} className={styles.img} />,
78
+ img: ({ src, alt }) => (
79
+ <img src={src} alt={alt || ''} className={styles.img} />
80
+ ),
66
81
  hr: () => <hr className={styles.hr} />,
67
- strong: ({ children }) => <strong className={styles.strong}>{children}</strong>,
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={`flex items-center gap-1 px-3 py-2 rounded-lg text-sm font-medium transition-colors ${
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 text-gray-500 hidden md:block"
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] px-3 py-2 rounded-lg text-sm font-medium transition-colors ${
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={`flex items-center gap-1 px-3 py-2 rounded-lg text-sm font-medium transition-colors ${
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 "@tanstack/react-router";
2
- import { useDebouncedCallback } from "use-debounce";
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 = "" }: SearchProps) {
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={`w-full px-4 py-3 bg-slate-800 border border-slate-700 rounded-lg text-white placeholder-gray-500 focus:outline-none focus:border-cyan-500 focus:ring-1 focus:ring-cyan-500 transition-colors ${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 "react";
2
- import { getStrapiMedia } from "@/lib/strapi-utils";
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={`bg-slate-700 flex items-center justify-center text-slate-400 text-sm ${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
  }