@allbluecn/web-app 0.4.11 → 0.4.15

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allbluecn/web-app",
3
- "version": "0.4.11",
3
+ "version": "0.4.15",
4
4
  "license": "AGPL-3.0-or-later",
5
5
  "type": "module",
6
6
  "files": [
@@ -141,8 +141,8 @@
141
141
  "@allbluecn/plugins-core": "0.4.11",
142
142
  "@allbluecn/prototype": "0.1.1",
143
143
  "@allbluecn/tiptap": "0.4.11",
144
- "@allbluecn/shared": "0.4.11",
145
- "@allbluecn/ui": "0.4.11"
144
+ "@allbluecn/ui": "0.4.11",
145
+ "@allbluecn/shared": "0.4.11"
146
146
  },
147
147
  "devDependencies": {
148
148
  "@babel/parser": "^8.0.4",
@@ -16,10 +16,15 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  import { cn } from '@/lib/utils'
19
- import { ScrollText, AlertTriangle, ArrowLeft } from 'lucide-react'
19
+ import { ScrollText, AlertTriangle, ArrowLeft, ChevronDown } from 'lucide-react'
20
20
  import ReactMarkdown from 'react-markdown'
21
21
  import { useTranslation } from 'react-i18next'
22
22
  import { useMemo, useState } from 'react'
23
+ import {
24
+ Collapsible,
25
+ CollapsibleContent,
26
+ CollapsibleTrigger,
27
+ } from '@/components/ui/collapsible'
23
28
  import { Route } from '@/routes/_nav/changelog/route'
24
29
  import type { DeveloperLogEntry } from '@allbluecn/shared'
25
30
  import { SDK_GROUPS } from '@/lib/changelog/sdk-versions'
@@ -31,12 +36,23 @@ const REQUIRES_ACTION_TAGS = new Set(['breaking'])
31
36
 
32
37
  function ChangelogSidebar() {
33
38
  const { t } = useTranslation('common')
39
+ const [openGroups, setOpenGroups] = useState<Set<string>>(
40
+ new Set(SDK_GROUPS.map((g) => g.id))
41
+ )
42
+
43
+ const toggleGroup = (id: string) => {
44
+ setOpenGroups((prev) => {
45
+ const next = new Set(prev)
46
+ next.has(id) ? next.delete(id) : next.add(id)
47
+ return next
48
+ })
49
+ }
34
50
 
35
51
  return (
36
- <aside className="shrink-0 w-150 h-full flex flex-col py-6 pr-12 pl-10 border-r border-border bg-muted/50">
37
- <div className="flex-1 flex flex-col gap-8 justify-center">
52
+ <aside className="shrink-0 w-1/2 max-w-130 h-full flex flex-col py-6 pr-12 pl-10 border-r border-border bg-muted/50">
53
+ <div className="flex-1 flex flex-col gap-6 justify-between min-h-0">
38
54
  <div>
39
- <h1 className="text-4xl font-medium tracking-tight">
55
+ <h1 className="text-4xl font-medium tracking-tight">
40
56
  {t('changelog.title')}
41
57
  </h1>
42
58
  <p className="text-sm text-muted-foreground mt-3 leading-relaxed">
@@ -44,13 +60,21 @@ function ChangelogSidebar() {
44
60
  </p>
45
61
  </div>
46
62
 
47
- <div className="flex flex-col gap-4">
48
- <h2 className="text-sm font-semibold tracking-tight">
63
+ <div className="flex flex-col gap-3 min-h-0 flex-1">
64
+ <h2 className="text-sm font-semibold tracking-tight shrink-0">
49
65
  {t('changelog.sdkVersions')}
50
66
  </h2>
51
- {SDK_GROUPS.map((group) => (
52
- <SdkGroupSection key={group.id} group={group} t={t} />
53
- ))}
67
+ <div className="flex flex-col gap-3 min-h-0 flex-1">
68
+ {SDK_GROUPS.map((group) => (
69
+ <SdkGroupSection
70
+ key={group.id}
71
+ group={group}
72
+ t={t}
73
+ open={openGroups.has(group.id)}
74
+ onToggle={() => toggleGroup(group.id)}
75
+ />
76
+ ))}
77
+ </div>
54
78
  </div>
55
79
 
56
80
  <div>
@@ -249,54 +273,73 @@ function ChangelogDetail({
249
273
  )
250
274
  }
251
275
 
252
- function SdkGroupSection({ group, t }: { group: (typeof SDK_GROUPS)[0]; t: (key: string) => string }) {
276
+ function SdkGroupSection({
277
+ group,
278
+ t,
279
+ open,
280
+ onToggle,
281
+ }: {
282
+ group: (typeof SDK_GROUPS)[0]
283
+ t: (key: string) => string
284
+ open: boolean
285
+ onToggle: () => void
286
+ }) {
253
287
  const isTanstack = group.id === 'tanstack'
254
288
 
255
289
  return (
256
- <div>
257
- <div
258
- className="flex items-center gap-1.5 w-full py-1"
259
- >
260
- {isTanstack ? (
261
- <span className="shrink-0">
262
- <img
263
- src="/tanstack-landscape-black.svg"
264
- alt="TanStack"
265
- className="h-4 dark:hidden"
266
- />
267
- <img
268
- src="/tanstack-landscape-white.svg"
269
- alt="TanStack"
270
- className="hidden h-4 dark:block"
271
- />
290
+ <Collapsible
291
+ open={open}
292
+ onOpenChange={() => onToggle()}
293
+ className="flex flex-col min-h-0 flex-1 overflow-hidden"
294
+ >
295
+ <CollapsibleTrigger className="flex items-center gap-1.5 w-full py-1 group shrink-0">
296
+ <span className="flex-1 min-w-0 flex items-center gap-1.5">
297
+ {isTanstack ? (
298
+ <span className="shrink-0">
299
+ <img
300
+ src="/tanstack-landscape-black.svg"
301
+ alt="TanStack"
302
+ className="h-4 dark:hidden"
303
+ />
304
+ <img
305
+ src="/tanstack-landscape-white.svg"
306
+ alt="TanStack"
307
+ className="hidden h-4 dark:block"
308
+ />
309
+ </span>
310
+ ) : (
311
+ <span className="text-base">{group.icon}</span>
312
+ )}
313
+ <span className="text-xs mt-1 font-semibold text-foreground/80">
314
+ {t(`changelog.sdkGroups.${group.label}`)}
272
315
  </span>
273
- ) : (
274
- <span className="text-base">{group.icon}</span>
275
- )}
276
- <span className="text-xs mt-1 font-semibold text-foreground/80">
277
- {t(`changelog.sdkGroups.${group.label}`)}
278
316
  </span>
279
- </div>
280
- <ul className="mt-1 flex flex-col">
281
- {group.items.map((sdk) => (
282
- <li key={sdk.name}>
283
- <a
284
- href={sdk.docsUrl || undefined}
285
- target={sdk.docsUrl ? '_blank' : undefined}
286
- rel={sdk.docsUrl ? 'noopener noreferrer' : undefined}
287
- className="flex items-center justify-between gap-2 py-1.5 group"
288
- >
289
- <span className="text-xs font-medium text-muted-foreground group-hover:text-primary transition-colors truncate">
290
- {sdk.name}
291
- </span>
292
- <code className="text-[10px] font-mono text-muted-foreground bg-muted/50 px-1.5 py-0.5 rounded shrink-0 group-hover:text-primary transition-colors">
293
- {sdk.version}
294
- </code>
295
- </a>
296
- </li>
297
- ))}
298
- </ul>
299
- </div>
317
+ <ChevronDown
318
+ className="size-3.5 shrink-0 text-muted-foreground transition-transform group-hover:text-foreground"
319
+ />
320
+ </CollapsibleTrigger>
321
+ <CollapsibleContent>
322
+ <ul className="mt-1 flex flex-col min-h-0 overflow-y-auto pr-1 [&::-webkit-scrollbar]:w-1 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-border">
323
+ {group.items.map((sdk) => (
324
+ <li key={sdk.name}>
325
+ <a
326
+ href={sdk.docsUrl || undefined}
327
+ target={sdk.docsUrl ? '_blank' : undefined}
328
+ rel={sdk.docsUrl ? 'noopener noreferrer' : undefined}
329
+ className="flex items-center justify-between gap-2 py-1.5 group"
330
+ >
331
+ <span className="text-xs font-medium text-muted-foreground group-hover:text-primary transition-colors truncate">
332
+ {sdk.name}
333
+ </span>
334
+ <code className="text-[10px] font-mono text-muted-foreground bg-muted/50 px-1.5 py-0.5 rounded shrink-0 group-hover:text-primary transition-colors">
335
+ {sdk.version}
336
+ </code>
337
+ </a>
338
+ </li>
339
+ ))}
340
+ </ul>
341
+ </CollapsibleContent>
342
+ </Collapsible>
300
343
  )
301
344
  }
302
345
 
@@ -7,73 +7,73 @@ export const SDK_GROUPS: SdkGroup[] = [
7
7
  "icon": "⚡",
8
8
  "items": [
9
9
  {
10
- "name": "TanStack Start",
10
+ "name": "@tanstack/react-start",
11
11
  "version": "v1.168.46",
12
12
  "lastUpdate": "Aug 23, 2026",
13
- "source": "apps/web/package.json#dependencies (@tanstack/react-start)",
13
+ "source": "apps/web/package.json#dependencies",
14
14
  "docsUrl": "https://tanstack.com/start/latest"
15
15
  },
16
16
  {
17
- "name": "TanStack Router",
17
+ "name": "@tanstack/react-router",
18
18
  "version": "v1.170.29",
19
19
  "lastUpdate": "Aug 23, 2026",
20
- "source": "apps/web/package.json#dependencies (@tanstack/react-router)",
20
+ "source": "apps/web/package.json#dependencies",
21
21
  "docsUrl": "https://tanstack.com/router/latest"
22
22
  },
23
23
  {
24
- "name": "TanStack Query",
24
+ "name": "@tanstack/react-query",
25
25
  "version": "v5.101.2",
26
26
  "lastUpdate": "Aug 23, 2026",
27
- "source": "apps/web/package.json#dependencies (@tanstack/react-query)",
27
+ "source": "apps/web/package.json#dependencies",
28
28
  "docsUrl": "https://tanstack.com/query/latest"
29
29
  },
30
30
  {
31
- "name": "TanStack AI",
31
+ "name": "@tanstack/ai",
32
32
  "version": "v0.43.0",
33
33
  "lastUpdate": "Aug 23, 2026",
34
- "source": "apps/web/package.json#dependencies (@tanstack/ai)",
34
+ "source": "apps/web/package.json#dependencies",
35
35
  "docsUrl": "https://tanstack.com/ai/latest"
36
36
  },
37
37
  {
38
- "name": "TanStack Table",
38
+ "name": "@tanstack/react-table",
39
39
  "version": "v9.1.0",
40
40
  "lastUpdate": "Aug 23, 2026",
41
- "source": "apps/web/package.json#dependencies (@tanstack/react-table)",
41
+ "source": "apps/web/package.json#dependencies",
42
42
  "docsUrl": "https://tanstack.com/table/latest"
43
43
  },
44
44
  {
45
- "name": "TanStack Form",
45
+ "name": "@tanstack/react-form",
46
46
  "version": "v2.0.0-alpha.0",
47
47
  "lastUpdate": "Aug 23, 2026",
48
- "source": "apps/web/package.json#dependencies (@tanstack/react-form)",
48
+ "source": "apps/web/package.json#dependencies",
49
49
  "docsUrl": "https://tanstack.com/form/latest"
50
50
  },
51
51
  {
52
- "name": "TanStack Charts",
53
- "version": "v4.0.0-beta.1",
52
+ "name": "@tanstack/charts",
53
+ "version": "v0.9.0",
54
54
  "lastUpdate": "Aug 23, 2026",
55
- "source": "apps/web/package.json#dependencies (@tanstack/react-charts)",
55
+ "source": "apps/admin/package.json#dependencies",
56
56
  "docsUrl": "https://tanstack.com/charts/latest"
57
57
  },
58
58
  {
59
- "name": "TanStack Pacer",
59
+ "name": "@tanstack/react-pacer",
60
60
  "version": "v0.22.1",
61
61
  "lastUpdate": "Aug 23, 2026",
62
- "source": "apps/web/package.json#dependencies (@tanstack/react-pacer)",
62
+ "source": "apps/web/package.json#dependencies",
63
63
  "docsUrl": "https://tanstack.com/pacer/latest"
64
64
  },
65
65
  {
66
- "name": "TanStack Hotkeys",
66
+ "name": "@tanstack/react-hotkeys",
67
67
  "version": "v0.10.0",
68
68
  "lastUpdate": "Aug 23, 2026",
69
- "source": "apps/web/package.json#dependencies (@tanstack/react-hotkeys)",
69
+ "source": "apps/web/package.json#dependencies",
70
70
  "docsUrl": "https://tanstack.com/hotkeys/latest"
71
71
  },
72
72
  {
73
- "name": "TanStack Virtual",
73
+ "name": "@tanstack/react-virtual",
74
74
  "version": "v3.14.9",
75
75
  "lastUpdate": "Aug 23, 2026",
76
- "source": "apps/admin/package.json#dependencies (@tanstack/react-virtual)",
76
+ "source": "apps/admin/package.json#dependencies",
77
77
  "docsUrl": "https://tanstack.com/virtual/latest"
78
78
  }
79
79
  ]
@@ -81,11 +81,11 @@ export const SDK_GROUPS: SdkGroup[] = [
81
81
  {
82
82
  "id": "allblue",
83
83
  "label": "allblue-sdk",
84
- "icon": "🎉",
84
+ "icon": "🔷",
85
85
  "items": [
86
86
  {
87
87
  "name": "@allbluecn/web-app",
88
- "version": "v0.4.10",
88
+ "version": "v0.4.15",
89
89
  "lastUpdate": "Aug 23, 2026",
90
90
  "source": "apps/web/package.json",
91
91
  "docsUrl": "https://github.com/allbluecn/allblue"