@btst/stack 2.11.7 → 2.12.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 (77) hide show
  1. package/dist/packages/stack/src/plugins/blog/client/components/pages/post-page.internal.cjs +2 -6
  2. package/dist/packages/stack/src/plugins/blog/client/components/pages/post-page.internal.mjs +5 -9
  3. package/dist/packages/stack/src/plugins/blog/client/components/shared/collapsible-tag-list.cjs +44 -0
  4. package/dist/packages/stack/src/plugins/blog/client/components/shared/collapsible-tag-list.mjs +42 -0
  5. package/dist/packages/stack/src/plugins/blog/client/components/shared/tags-list.cjs +2 -8
  6. package/dist/packages/stack/src/plugins/blog/client/components/shared/tags-list.mjs +2 -8
  7. package/dist/packages/stack/src/plugins/blog/client/localization/blog-common.cjs +3 -1
  8. package/dist/packages/stack/src/plugins/blog/client/localization/blog-common.mjs +3 -1
  9. package/dist/packages/stack/src/plugins/comments/api/query-key-defs.cjs +2 -1
  10. package/dist/packages/stack/src/plugins/comments/api/query-key-defs.mjs +2 -1
  11. package/dist/packages/stack/src/plugins/comments/client/components/comment-thread.cjs +6 -2
  12. package/dist/packages/stack/src/plugins/comments/client/components/comment-thread.mjs +6 -2
  13. package/dist/packages/stack/src/plugins/comments/client/hooks/use-comments.cjs +5 -3
  14. package/dist/packages/stack/src/plugins/comments/client/hooks/use-comments.mjs +5 -3
  15. package/dist/plugins/blog/api/index.d.cts +2 -2
  16. package/dist/plugins/blog/api/index.d.mts +2 -2
  17. package/dist/plugins/blog/api/index.d.ts +2 -2
  18. package/dist/plugins/blog/client/hooks/index.d.cts +2 -2
  19. package/dist/plugins/blog/client/hooks/index.d.mts +2 -2
  20. package/dist/plugins/blog/client/hooks/index.d.ts +2 -2
  21. package/dist/plugins/blog/client/index.d.cts +4 -2
  22. package/dist/plugins/blog/client/index.d.mts +4 -2
  23. package/dist/plugins/blog/client/index.d.ts +4 -2
  24. package/dist/plugins/blog/query-keys.d.cts +2 -2
  25. package/dist/plugins/blog/query-keys.d.mts +2 -2
  26. package/dist/plugins/blog/query-keys.d.ts +2 -2
  27. package/dist/plugins/comments/api/index.d.cts +4 -4
  28. package/dist/plugins/comments/api/index.d.mts +4 -4
  29. package/dist/plugins/comments/api/index.d.ts +4 -4
  30. package/dist/plugins/comments/client/components/index.d.cts +11 -0
  31. package/dist/plugins/comments/client/components/index.d.mts +11 -0
  32. package/dist/plugins/comments/client/components/index.d.ts +11 -0
  33. package/dist/plugins/comments/client/hooks/index.d.cts +17 -1
  34. package/dist/plugins/comments/client/hooks/index.d.mts +17 -1
  35. package/dist/plugins/comments/client/hooks/index.d.ts +17 -1
  36. package/dist/plugins/comments/client/index.d.cts +9 -0
  37. package/dist/plugins/comments/client/index.d.mts +9 -0
  38. package/dist/plugins/comments/client/index.d.ts +9 -0
  39. package/dist/plugins/comments/query-keys.cjs +1 -0
  40. package/dist/plugins/comments/query-keys.d.cts +3 -2
  41. package/dist/plugins/comments/query-keys.d.mts +3 -2
  42. package/dist/plugins/comments/query-keys.d.ts +3 -2
  43. package/dist/plugins/comments/query-keys.mjs +1 -0
  44. package/dist/plugins/kanban/api/index.d.cts +1 -1
  45. package/dist/plugins/kanban/api/index.d.mts +1 -1
  46. package/dist/plugins/kanban/api/index.d.ts +1 -1
  47. package/dist/plugins/kanban/query-keys.d.cts +1 -1
  48. package/dist/plugins/kanban/query-keys.d.mts +1 -1
  49. package/dist/plugins/kanban/query-keys.d.ts +1 -1
  50. package/dist/shared/{stack.CLWhMntf.d.cts → stack.04aMRz_W.d.cts} +5 -5
  51. package/dist/shared/{stack.CJE9sAjV.d.ts → stack.Bq3kiUaM.d.ts} +1 -1
  52. package/dist/shared/{stack.DNLuzDb3.d.cts → stack.BvuqACtA.d.cts} +3 -3
  53. package/dist/shared/{stack.C-b3Sn8j.d.cts → stack.C7KNNiJm.d.cts} +3 -1
  54. package/dist/shared/{stack.C-b3Sn8j.d.mts → stack.C7KNNiJm.d.mts} +3 -1
  55. package/dist/shared/{stack.C-b3Sn8j.d.ts → stack.C7KNNiJm.d.ts} +3 -1
  56. package/dist/shared/{stack.Dcz6636A.d.mts → stack.CCncwK6g.d.cts} +1 -1
  57. package/dist/shared/{stack.CmHRdhl8.d.cts → stack.CO1g47IS.d.mts} +1 -1
  58. package/dist/shared/{stack.Dfc44JiE.d.mts → stack.Cs8R5HxD.d.mts} +3 -3
  59. package/dist/shared/{stack.ufcExQIR.d.ts → stack.CxWEN62M.d.ts} +5 -5
  60. package/dist/shared/{stack.BnSAhKJi.d.ts → stack.DPTRuLUH.d.ts} +3 -3
  61. package/dist/shared/{stack.DiodAFAa.d.mts → stack.ueI-K4xy.d.mts} +5 -5
  62. package/package.json +1 -1
  63. package/src/plugins/blog/client/components/pages/post-page.internal.tsx +4 -21
  64. package/src/plugins/blog/client/components/shared/collapsible-tag-list.tsx +76 -0
  65. package/src/plugins/blog/client/components/shared/tags-list.tsx +2 -18
  66. package/src/plugins/blog/client/localization/blog-common.ts +2 -0
  67. package/src/plugins/comments/api/query-key-defs.ts +5 -1
  68. package/src/plugins/comments/client/components/comment-thread.tsx +15 -0
  69. package/src/plugins/comments/client/hooks/use-comments.tsx +26 -3
  70. package/src/plugins/comments/client/overrides.ts +10 -0
  71. package/src/plugins/comments/query-keys.ts +2 -0
  72. package/dist/shared/{stack.Rtcvl8sS.d.cts → stack.B6S3cgwN.d.cts} +13 -13
  73. package/dist/shared/{stack.HE_IvqV5.d.mts → stack.Bzfx-_lq.d.mts} +13 -13
  74. package/dist/shared/{stack.CuhcFsAx.d.cts → stack.DuQOcInS.d.cts} +3 -3
  75. package/dist/shared/{stack.CuhcFsAx.d.mts → stack.DuQOcInS.d.mts} +3 -3
  76. package/dist/shared/{stack.CuhcFsAx.d.ts → stack.DuQOcInS.d.ts} +3 -3
  77. package/dist/shared/{stack.D4Cea8II.d.ts → stack.j5SFLC1d.d.ts} +13 -13
@@ -13,13 +13,13 @@ const defaults = require('../shared/defaults.cjs');
13
13
  const index = require('../../localization/index.cjs');
14
14
  const postNavigation = require('../shared/post-navigation.cjs');
15
15
  const recentPostsCarousel = require('../shared/recent-posts-carousel.cjs');
16
- const badge = require('../../../../../../../ui/src/components/badge.cjs');
17
16
  const useRouteLifecycle = require('../../../../../../../ui/src/hooks/use-route-lifecycle.cjs');
18
17
  const onThisPage = require('../shared/on-this-page.cjs');
19
18
  const context$1 = require('@btst/stack/plugins/ai-chat/client/context');
20
19
  const whenVisible = require('../../../../../../../ui/src/components/when-visible.cjs');
21
20
  const postNavigationSkeleton = require('../loading/post-navigation-skeleton.cjs');
22
21
  const recentPostsCarouselSkeleton = require('../loading/recent-posts-carousel-skeleton.cjs');
22
+ const collapsibleTagList = require('../shared/collapsible-tag-list.cjs');
23
23
 
24
24
  function PostPage({ slug }) {
25
25
  const overrides = context.usePluginOverrides("blog", {
@@ -119,13 +119,9 @@ ${post.content ?? ""}`.slice(
119
119
  ] }) });
120
120
  }
121
121
  function PostHeaderTop({ post }) {
122
- const { Link } = context.usePluginOverrides("blog", {
123
- Link: defaults.DefaultLink
124
- });
125
- const basePath = context.useBasePath();
126
122
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-row items-center justify-center gap-2 flex-wrap mt-8", children: [
127
123
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-light text-muted-foreground text-sm", children: dateFns.formatDate(post.createdAt, "MMMM d, yyyy") }),
128
- post.tags && post.tags.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: post.tags.map((tag) => /* @__PURE__ */ jsxRuntime.jsx(Link, { href: `${basePath}/blog/tag/${tag.slug}`, children: /* @__PURE__ */ jsxRuntime.jsx(badge.Badge, { variant: "secondary", className: "text-xs", children: tag.name }) }, tag.id)) })
124
+ /* @__PURE__ */ jsxRuntime.jsx(collapsibleTagList.CollapsibleTagList, { tags: post.tags ?? [] })
129
125
  ] });
130
126
  }
131
127
 
@@ -1,23 +1,23 @@
1
1
  "use client";
2
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
- import { usePluginOverrides, useBasePath } from '@btst/stack/context';
2
+ import { jsx, jsxs } from 'react/jsx-runtime';
3
+ import { usePluginOverrides } from '@btst/stack/context';
4
4
  import { formatDate } from 'date-fns';
5
5
  import { useSuspensePost, useNextPreviousPosts, useRecentPosts } from '../../hooks/blog-hooks.mjs';
6
6
  import { EmptyList } from '../shared/empty-list.mjs';
7
7
  import { MarkdownContent } from '../shared/markdown-content.mjs';
8
8
  import { PageHeader } from '../shared/page-header.mjs';
9
9
  import { PageWrapper } from '../shared/page-wrapper.mjs';
10
- import { DefaultImage, DefaultLink } from '../shared/defaults.mjs';
10
+ import { DefaultImage } from '../shared/defaults.mjs';
11
11
  import { BLOG_LOCALIZATION } from '../../localization/index.mjs';
12
12
  import { PostNavigation } from '../shared/post-navigation.mjs';
13
13
  import { RecentPostsCarousel } from '../shared/recent-posts-carousel.mjs';
14
- import { Badge } from '../../../../../../../ui/src/components/badge.mjs';
15
14
  import { useRouteLifecycle } from '../../../../../../../ui/src/hooks/use-route-lifecycle.mjs';
16
15
  import { OnThisPageSelect, OnThisPage } from '../shared/on-this-page.mjs';
17
16
  import { useRegisterPageAIContext } from '@btst/stack/plugins/ai-chat/client/context';
18
17
  import { WhenVisible } from '../../../../../../../ui/src/components/when-visible.mjs';
19
18
  import { PostNavigationSkeleton } from '../loading/post-navigation-skeleton.mjs';
20
19
  import { RecentPostsCarouselSkeleton } from '../loading/recent-posts-carousel-skeleton.mjs';
20
+ import { CollapsibleTagList } from '../shared/collapsible-tag-list.mjs';
21
21
 
22
22
  function PostPage({ slug }) {
23
23
  const overrides = usePluginOverrides("blog", {
@@ -117,13 +117,9 @@ ${post.content ?? ""}`.slice(
117
117
  ] }) });
118
118
  }
119
119
  function PostHeaderTop({ post }) {
120
- const { Link } = usePluginOverrides("blog", {
121
- Link: DefaultLink
122
- });
123
- const basePath = useBasePath();
124
120
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-row items-center justify-center gap-2 flex-wrap mt-8", children: [
125
121
  /* @__PURE__ */ jsx("span", { className: "font-light text-muted-foreground text-sm", children: formatDate(post.createdAt, "MMMM d, yyyy") }),
126
- post.tags && post.tags.length > 0 && /* @__PURE__ */ jsx(Fragment, { children: post.tags.map((tag) => /* @__PURE__ */ jsx(Link, { href: `${basePath}/blog/tag/${tag.slug}`, children: /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "text-xs", children: tag.name }) }, tag.id)) })
122
+ /* @__PURE__ */ jsx(CollapsibleTagList, { tags: post.tags ?? [] })
127
123
  ] });
128
124
  }
129
125
 
@@ -0,0 +1,44 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ const jsxRuntime = require('react/jsx-runtime');
5
+ const context = require('@btst/stack/context');
6
+ const defaults = require('./defaults.cjs');
7
+ const badge = require('../../../../../../../ui/src/components/badge.cjs');
8
+ const index = require('../../localization/index.cjs');
9
+ const LucideIcons = require('lucide-react');
10
+ const React = require('react');
11
+
12
+ const MAX_VISIBLE_TAGS = 15;
13
+ function CollapsibleTagList({
14
+ tags,
15
+ maxVisible = MAX_VISIBLE_TAGS
16
+ }) {
17
+ const { Link, localization } = context.usePluginOverrides("blog", {
18
+ Link: defaults.DefaultLink,
19
+ localization: index.BLOG_LOCALIZATION
20
+ });
21
+ const basePath = context.useBasePath();
22
+ const [showAll, setShowAll] = React.useState(false);
23
+ if (!tags || tags.length === 0) {
24
+ return null;
25
+ }
26
+ const hasMore = tags.length > maxVisible;
27
+ const visibleTags = showAll || !hasMore ? tags : tags.slice(0, maxVisible);
28
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
29
+ visibleTags.map((tag) => /* @__PURE__ */ jsxRuntime.jsx(Link, { href: `${basePath}/blog/tag/${tag.slug}`, children: /* @__PURE__ */ jsxRuntime.jsx(badge.Badge, { variant: "secondary", className: "text-xs", children: tag.name }) }, tag.id)),
30
+ hasMore && /* @__PURE__ */ jsxRuntime.jsx(badge.Badge, { asChild: true, variant: "secondary", className: "text-xs cursor-pointer", children: /* @__PURE__ */ jsxRuntime.jsx(
31
+ "button",
32
+ {
33
+ type: "button",
34
+ onClick: () => setShowAll((prev) => !prev),
35
+ "aria-expanded": showAll,
36
+ "aria-label": showAll ? localization.BLOG_TAGS_SHOW_LESS : localization.BLOG_TAGS_SHOW_ALL,
37
+ title: showAll ? localization.BLOG_TAGS_SHOW_LESS : localization.BLOG_TAGS_SHOW_ALL,
38
+ children: showAll ? /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.ChevronUp, { "aria-hidden": "true" }) : /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.ChevronDown, { "aria-hidden": "true" })
39
+ }
40
+ ) })
41
+ ] });
42
+ }
43
+
44
+ exports.CollapsibleTagList = CollapsibleTagList;
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
3
+ import { usePluginOverrides, useBasePath } from '@btst/stack/context';
4
+ import { DefaultLink } from './defaults.mjs';
5
+ import { Badge } from '../../../../../../../ui/src/components/badge.mjs';
6
+ import { BLOG_LOCALIZATION } from '../../localization/index.mjs';
7
+ import { ChevronUp, ChevronDown } from 'lucide-react';
8
+ import { useState } from 'react';
9
+
10
+ const MAX_VISIBLE_TAGS = 15;
11
+ function CollapsibleTagList({
12
+ tags,
13
+ maxVisible = MAX_VISIBLE_TAGS
14
+ }) {
15
+ const { Link, localization } = usePluginOverrides("blog", {
16
+ Link: DefaultLink,
17
+ localization: BLOG_LOCALIZATION
18
+ });
19
+ const basePath = useBasePath();
20
+ const [showAll, setShowAll] = useState(false);
21
+ if (!tags || tags.length === 0) {
22
+ return null;
23
+ }
24
+ const hasMore = tags.length > maxVisible;
25
+ const visibleTags = showAll || !hasMore ? tags : tags.slice(0, maxVisible);
26
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
27
+ visibleTags.map((tag) => /* @__PURE__ */ jsx(Link, { href: `${basePath}/blog/tag/${tag.slug}`, children: /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "text-xs", children: tag.name }) }, tag.id)),
28
+ hasMore && /* @__PURE__ */ jsx(Badge, { asChild: true, variant: "secondary", className: "text-xs cursor-pointer", children: /* @__PURE__ */ jsx(
29
+ "button",
30
+ {
31
+ type: "button",
32
+ onClick: () => setShowAll((prev) => !prev),
33
+ "aria-expanded": showAll,
34
+ "aria-label": showAll ? localization.BLOG_TAGS_SHOW_LESS : localization.BLOG_TAGS_SHOW_ALL,
35
+ title: showAll ? localization.BLOG_TAGS_SHOW_LESS : localization.BLOG_TAGS_SHOW_ALL,
36
+ children: showAll ? /* @__PURE__ */ jsx(ChevronUp, { "aria-hidden": "true" }) : /* @__PURE__ */ jsx(ChevronDown, { "aria-hidden": "true" })
37
+ }
38
+ ) })
39
+ ] });
40
+ }
41
+
42
+ export { CollapsibleTagList };
@@ -2,21 +2,15 @@
2
2
  'use strict';
3
3
 
4
4
  const jsxRuntime = require('react/jsx-runtime');
5
- const context = require('@btst/stack/context');
6
- const defaults = require('./defaults.cjs');
7
- const badge = require('../../../../../../../ui/src/components/badge.cjs');
8
5
  const blogHooks = require('../../hooks/blog-hooks.cjs');
6
+ const collapsibleTagList = require('./collapsible-tag-list.cjs');
9
7
 
10
8
  function TagsList() {
11
9
  const { tags } = blogHooks.useSuspenseTags();
12
- const { Link } = context.usePluginOverrides("blog", {
13
- Link: defaults.DefaultLink
14
- });
15
- const basePath = context.useBasePath();
16
10
  if (!tags || tags.length === 0) {
17
11
  return null;
18
12
  }
19
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2 justify-center", children: tags.map((tag) => /* @__PURE__ */ jsxRuntime.jsx(Link, { href: `${basePath}/blog/tag/${tag.slug}`, children: /* @__PURE__ */ jsxRuntime.jsx(badge.Badge, { variant: "secondary", className: "text-xs", children: tag.name }) }, tag.id)) });
13
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2 justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(collapsibleTagList.CollapsibleTagList, { tags }) });
20
14
  }
21
15
 
22
16
  exports.TagsList = TagsList;
@@ -1,20 +1,14 @@
1
1
  "use client";
2
2
  import { jsx } from 'react/jsx-runtime';
3
- import { usePluginOverrides, useBasePath } from '@btst/stack/context';
4
- import { DefaultLink } from './defaults.mjs';
5
- import { Badge } from '../../../../../../../ui/src/components/badge.mjs';
6
3
  import { useSuspenseTags } from '../../hooks/blog-hooks.mjs';
4
+ import { CollapsibleTagList } from './collapsible-tag-list.mjs';
7
5
 
8
6
  function TagsList() {
9
7
  const { tags } = useSuspenseTags();
10
- const { Link } = usePluginOverrides("blog", {
11
- Link: DefaultLink
12
- });
13
- const basePath = useBasePath();
14
8
  if (!tags || tags.length === 0) {
15
9
  return null;
16
10
  }
17
- return /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2 justify-center", children: tags.map((tag) => /* @__PURE__ */ jsx(Link, { href: `${basePath}/blog/tag/${tag.slug}`, children: /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "text-xs", children: tag.name }) }, tag.id)) });
11
+ return /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2 justify-center", children: /* @__PURE__ */ jsx(CollapsibleTagList, { tags }) });
18
12
  }
19
13
 
20
14
  export { TagsList };
@@ -4,7 +4,9 @@ const BLOG_COMMON = {
4
4
  BLOG_GENERIC_ERROR_TITLE: "Something went wrong",
5
5
  BLOG_GENERIC_ERROR_MESSAGE: "An unexpected error occurred.",
6
6
  BLOG_PAGE_NOT_FOUND_TITLE: "Not Found",
7
- BLOG_PAGE_NOT_FOUND_DESCRIPTION: "The page you are looking for does not exist."
7
+ BLOG_PAGE_NOT_FOUND_DESCRIPTION: "The page you are looking for does not exist.",
8
+ BLOG_TAGS_SHOW_ALL: "Show all tags",
9
+ BLOG_TAGS_SHOW_LESS: "Show fewer tags"
8
10
  };
9
11
 
10
12
  exports.BLOG_COMMON = BLOG_COMMON;
@@ -2,7 +2,9 @@ const BLOG_COMMON = {
2
2
  BLOG_GENERIC_ERROR_TITLE: "Something went wrong",
3
3
  BLOG_GENERIC_ERROR_MESSAGE: "An unexpected error occurred.",
4
4
  BLOG_PAGE_NOT_FOUND_TITLE: "Not Found",
5
- BLOG_PAGE_NOT_FOUND_DESCRIPTION: "The page you are looking for does not exist."
5
+ BLOG_PAGE_NOT_FOUND_DESCRIPTION: "The page you are looking for does not exist.",
6
+ BLOG_TAGS_SHOW_ALL: "Show all tags",
7
+ BLOG_TAGS_SHOW_LESS: "Show fewer tags"
6
8
  };
7
9
 
8
10
  export { BLOG_COMMON };
@@ -27,6 +27,7 @@ function commentsThreadDiscriminator(params) {
27
27
  parentId: params?.parentId,
28
28
  status: params?.status,
29
29
  currentUserId: params?.currentUserId,
30
+ sort: params?.sort,
30
31
  limit: params?.limit ?? 20
31
32
  };
32
33
  }
@@ -48,7 +49,7 @@ const COMMENTS_QUERY_KEYS = {
48
49
  commentCount: (params) => ["comments", "count", commentCountDiscriminator(params)],
49
50
  /**
50
51
  * Key for the infinite thread query (top-level comments, load-more).
51
- * Full key: ["commentsThread", "list", { resourceId, resourceType, parentId, status, currentUserId, limit }]
52
+ * Full key: ["commentsThread", "list", { resourceId, resourceType, parentId, status, currentUserId, sort, limit }]
52
53
  * Offset is excluded — it is driven by `pageParam`, not baked into the key.
53
54
  */
54
55
  commentsThread: (params) => ["commentsThread", "list", commentsThreadDiscriminator(params)]
@@ -25,6 +25,7 @@ function commentsThreadDiscriminator(params) {
25
25
  parentId: params?.parentId,
26
26
  status: params?.status,
27
27
  currentUserId: params?.currentUserId,
28
+ sort: params?.sort,
28
29
  limit: params?.limit ?? 20
29
30
  };
30
31
  }
@@ -46,7 +47,7 @@ const COMMENTS_QUERY_KEYS = {
46
47
  commentCount: (params) => ["comments", "count", commentCountDiscriminator(params)],
47
48
  /**
48
49
  * Key for the infinite thread query (top-level comments, load-more).
49
- * Full key: ["commentsThread", "list", { resourceId, resourceType, parentId, status, currentUserId, limit }]
50
+ * Full key: ["commentsThread", "list", { resourceId, resourceType, parentId, status, currentUserId, sort, limit }]
50
51
  * Offset is excluded — it is driven by `pageParam`, not baked into the key.
51
52
  */
52
53
  commentsThread: (params) => ["commentsThread", "list", commentsThreadDiscriminator(params)]
@@ -195,12 +195,14 @@ function CommentThreadInner({
195
195
  localization: localizationProp,
196
196
  pageSize: pageSizeProp,
197
197
  allowPosting: allowPostingProp,
198
- allowEditing: allowEditingProp
198
+ allowEditing: allowEditingProp,
199
+ sort: sortProp
199
200
  }) {
200
201
  const overrides = context.usePluginOverrides("comments", {});
201
202
  const pageSize = pageSizeProp ?? overrides.defaultCommentPageSize ?? DEFAULT_PAGE_SIZE;
202
203
  const allowPosting = allowPostingProp ?? overrides.allowPosting ?? true;
203
204
  const allowEditing = allowEditingProp ?? overrides.allowEditing ?? true;
205
+ const sort = sortProp ?? overrides.defaultCommentSort ?? "desc";
204
206
  const loc = { ...index.COMMENTS_LOCALIZATION, ...localizationProp };
205
207
  const [replyingTo, setReplyingTo] = React.useState(null);
206
208
  const [expandedReplies, setExpandedReplies] = React.useState(
@@ -222,6 +224,7 @@ function CommentThreadInner({
222
224
  status: "approved",
223
225
  parentId: null,
224
226
  currentUserId,
227
+ sort,
225
228
  pageSize
226
229
  });
227
230
  const postMutation = useComments.usePostComment(config, {
@@ -229,7 +232,8 @@ function CommentThreadInner({
229
232
  resourceType,
230
233
  currentUserId,
231
234
  infiniteKey: threadQueryKey,
232
- pageSize
235
+ pageSize,
236
+ sort
233
237
  });
234
238
  const handlePost = async (body) => {
235
239
  if (!currentUserId) return;
@@ -193,12 +193,14 @@ function CommentThreadInner({
193
193
  localization: localizationProp,
194
194
  pageSize: pageSizeProp,
195
195
  allowPosting: allowPostingProp,
196
- allowEditing: allowEditingProp
196
+ allowEditing: allowEditingProp,
197
+ sort: sortProp
197
198
  }) {
198
199
  const overrides = usePluginOverrides("comments", {});
199
200
  const pageSize = pageSizeProp ?? overrides.defaultCommentPageSize ?? DEFAULT_PAGE_SIZE;
200
201
  const allowPosting = allowPostingProp ?? overrides.allowPosting ?? true;
201
202
  const allowEditing = allowEditingProp ?? overrides.allowEditing ?? true;
203
+ const sort = sortProp ?? overrides.defaultCommentSort ?? "desc";
202
204
  const loc = { ...COMMENTS_LOCALIZATION, ...localizationProp };
203
205
  const [replyingTo, setReplyingTo] = useState(null);
204
206
  const [expandedReplies, setExpandedReplies] = useState(
@@ -220,6 +222,7 @@ function CommentThreadInner({
220
222
  status: "approved",
221
223
  parentId: null,
222
224
  currentUserId,
225
+ sort,
223
226
  pageSize
224
227
  });
225
228
  const postMutation = usePostComment(config, {
@@ -227,7 +230,8 @@ function CommentThreadInner({
227
230
  resourceType,
228
231
  currentUserId,
229
232
  infiniteKey: threadQueryKey,
230
- pageSize
233
+ pageSize,
234
+ sort
231
235
  });
232
236
  const handlePost = async (body) => {
233
237
  if (!currentUserId) return;
@@ -84,6 +84,7 @@ function useInfiniteComments(config, params, options) {
84
84
  parentId: params.parentId ?? null,
85
85
  status: params.status,
86
86
  currentUserId: params.currentUserId,
87
+ sort: params.sort,
87
88
  limit: pageSize
88
89
  });
89
90
  const query = reactQuery.useInfiniteQuery({
@@ -183,6 +184,7 @@ function usePostComment(config, params) {
183
184
  };
184
185
  if (isInfinitePost(input.parentId)) {
185
186
  const previous2 = queryClient.getQueryData(listKey);
187
+ const isDesc = params.sort === "desc";
186
188
  queryClient.setQueryData(
187
189
  listKey,
188
190
  (old) => {
@@ -199,15 +201,15 @@ function usePostComment(config, params) {
199
201
  pageParams: [0]
200
202
  };
201
203
  }
202
- const lastIdx = old.pages.length - 1;
204
+ const targetIdx = isDesc ? 0 : old.pages.length - 1;
203
205
  return {
204
206
  ...old,
205
207
  // Increment `total` on every page so the header count (which reads
206
208
  // pages[0].total) stays in sync even after multiple pages are loaded.
207
209
  pages: old.pages.map(
208
- (page, idx) => idx === lastIdx ? {
210
+ (page, idx) => idx === targetIdx ? {
209
211
  ...page,
210
- items: [...page.items, optimistic],
212
+ items: isDesc ? [optimistic, ...page.items] : [...page.items, optimistic],
211
213
  total: page.total + 1
212
214
  } : { ...page, total: page.total + 1 }
213
215
  )
@@ -82,6 +82,7 @@ function useInfiniteComments(config, params, options) {
82
82
  parentId: params.parentId ?? null,
83
83
  status: params.status,
84
84
  currentUserId: params.currentUserId,
85
+ sort: params.sort,
85
86
  limit: pageSize
86
87
  });
87
88
  const query = useInfiniteQuery({
@@ -181,6 +182,7 @@ function usePostComment(config, params) {
181
182
  };
182
183
  if (isInfinitePost(input.parentId)) {
183
184
  const previous2 = queryClient.getQueryData(listKey);
185
+ const isDesc = params.sort === "desc";
184
186
  queryClient.setQueryData(
185
187
  listKey,
186
188
  (old) => {
@@ -197,15 +199,15 @@ function usePostComment(config, params) {
197
199
  pageParams: [0]
198
200
  };
199
201
  }
200
- const lastIdx = old.pages.length - 1;
202
+ const targetIdx = isDesc ? 0 : old.pages.length - 1;
201
203
  return {
202
204
  ...old,
203
205
  // Increment `total` on every page so the header count (which reads
204
206
  // pages[0].total) stays in sync even after multiple pages are loaded.
205
207
  pages: old.pages.map(
206
- (page, idx) => idx === lastIdx ? {
208
+ (page, idx) => idx === targetIdx ? {
207
209
  ...page,
208
- items: [...page.items, optimistic],
210
+ items: isDesc ? [optimistic, ...page.items] : [...page.items, optimistic],
209
211
  total: page.total + 1
210
212
  } : { ...page, total: page.total + 1 }
211
213
  )
@@ -1,4 +1,4 @@
1
- export { B as BLOG_QUERY_KEYS, j as BlogApiContext, m as BlogApiRouter, k as BlogBackendHooks, h as BlogRouteKey, C as CreatePostInput, N as NextPreviousPostsQuerySchema, P as PostListParams, i as PostListQuerySchema, c as PostListResult, U as UpdatePostInput, l as blogBackendPlugin, f as createBlogQueryKeys, d as createPost, e as deletePost, g as getAllPosts, b as getAllTags, a as getPostBySlug, u as updatePost } from '../../../shared/stack.CLWhMntf.cjs';
1
+ export { B as BLOG_QUERY_KEYS, j as BlogApiContext, m as BlogApiRouter, k as BlogBackendHooks, h as BlogRouteKey, C as CreatePostInput, N as NextPreviousPostsQuerySchema, P as PostListParams, i as PostListQuerySchema, c as PostListResult, U as UpdatePostInput, l as blogBackendPlugin, f as createBlogQueryKeys, d as createPost, e as deletePost, g as getAllPosts, b as getAllTags, a as getPostBySlug, u as updatePost } from '../../../shared/stack.04aMRz_W.cjs';
2
2
  import { P as Post, T as Tag, S as SerializedPost, a as SerializedTag } from '../../../shared/stack.Dsatjh0B.cjs';
3
3
  import '@tanstack/react-query';
4
4
  import '@btst/stack/plugins/client';
@@ -6,7 +6,7 @@ import '@btst/stack/plugins/api';
6
6
  import '@btst/db';
7
7
  import 'better-call';
8
8
  import 'zod';
9
- import '../../../shared/stack.CuhcFsAx.cjs';
9
+ import '../../../shared/stack.DuQOcInS.cjs';
10
10
 
11
11
  /**
12
12
  * Serialize a Tag for SSR/SSG use (convert dates to strings).
@@ -1,4 +1,4 @@
1
- export { B as BLOG_QUERY_KEYS, j as BlogApiContext, m as BlogApiRouter, k as BlogBackendHooks, h as BlogRouteKey, C as CreatePostInput, N as NextPreviousPostsQuerySchema, P as PostListParams, i as PostListQuerySchema, c as PostListResult, U as UpdatePostInput, l as blogBackendPlugin, f as createBlogQueryKeys, d as createPost, e as deletePost, g as getAllPosts, b as getAllTags, a as getPostBySlug, u as updatePost } from '../../../shared/stack.DiodAFAa.mjs';
1
+ export { B as BLOG_QUERY_KEYS, j as BlogApiContext, m as BlogApiRouter, k as BlogBackendHooks, h as BlogRouteKey, C as CreatePostInput, N as NextPreviousPostsQuerySchema, P as PostListParams, i as PostListQuerySchema, c as PostListResult, U as UpdatePostInput, l as blogBackendPlugin, f as createBlogQueryKeys, d as createPost, e as deletePost, g as getAllPosts, b as getAllTags, a as getPostBySlug, u as updatePost } from '../../../shared/stack.ueI-K4xy.mjs';
2
2
  import { P as Post, T as Tag, S as SerializedPost, a as SerializedTag } from '../../../shared/stack.Dsatjh0B.mjs';
3
3
  import '@tanstack/react-query';
4
4
  import '@btst/stack/plugins/client';
@@ -6,7 +6,7 @@ import '@btst/stack/plugins/api';
6
6
  import '@btst/db';
7
7
  import 'better-call';
8
8
  import 'zod';
9
- import '../../../shared/stack.CuhcFsAx.mjs';
9
+ import '../../../shared/stack.DuQOcInS.mjs';
10
10
 
11
11
  /**
12
12
  * Serialize a Tag for SSR/SSG use (convert dates to strings).
@@ -1,4 +1,4 @@
1
- export { B as BLOG_QUERY_KEYS, j as BlogApiContext, m as BlogApiRouter, k as BlogBackendHooks, h as BlogRouteKey, C as CreatePostInput, N as NextPreviousPostsQuerySchema, P as PostListParams, i as PostListQuerySchema, c as PostListResult, U as UpdatePostInput, l as blogBackendPlugin, f as createBlogQueryKeys, d as createPost, e as deletePost, g as getAllPosts, b as getAllTags, a as getPostBySlug, u as updatePost } from '../../../shared/stack.ufcExQIR.js';
1
+ export { B as BLOG_QUERY_KEYS, j as BlogApiContext, m as BlogApiRouter, k as BlogBackendHooks, h as BlogRouteKey, C as CreatePostInput, N as NextPreviousPostsQuerySchema, P as PostListParams, i as PostListQuerySchema, c as PostListResult, U as UpdatePostInput, l as blogBackendPlugin, f as createBlogQueryKeys, d as createPost, e as deletePost, g as getAllPosts, b as getAllTags, a as getPostBySlug, u as updatePost } from '../../../shared/stack.CxWEN62M.js';
2
2
  import { P as Post, T as Tag, S as SerializedPost, a as SerializedTag } from '../../../shared/stack.Dsatjh0B.js';
3
3
  import '@tanstack/react-query';
4
4
  import '@btst/stack/plugins/client';
@@ -6,7 +6,7 @@ import '@btst/stack/plugins/api';
6
6
  import '@btst/db';
7
7
  import 'better-call';
8
8
  import 'zod';
9
- import '../../../shared/stack.CuhcFsAx.js';
9
+ import '../../../shared/stack.DuQOcInS.js';
10
10
 
11
11
  /**
12
12
  * Serialize a Tag for SSR/SSG use (convert dates to strings).
@@ -1,8 +1,8 @@
1
- export { P as PostCreateInput, e as PostUpdateInput, o as UseNextPreviousPostsOptions, p as UseNextPreviousPostsResult, d as UsePostResult, b as UsePostSearchOptions, c as UsePostSearchResult, U as UsePostsOptions, a as UsePostsResult, r as UseRecentPostsOptions, s as UseRecentPostsResult, k as useCreatePost, m as useDeletePost, q as useNextPreviousPosts, g as usePost, n as usePostSearch, u as usePosts, t as useRecentPosts, h as useSuspensePost, f as useSuspensePosts, j as useSuspenseTags, i as useTags, l as useUpdatePost } from '../../../../shared/stack.DNLuzDb3.cjs';
1
+ export { P as PostCreateInput, e as PostUpdateInput, o as UseNextPreviousPostsOptions, p as UseNextPreviousPostsResult, d as UsePostResult, b as UsePostSearchOptions, c as UsePostSearchResult, U as UsePostsOptions, a as UsePostsResult, r as UseRecentPostsOptions, s as UseRecentPostsResult, k as useCreatePost, m as useDeletePost, q as useNextPreviousPosts, g as usePost, n as usePostSearch, u as usePosts, t as useRecentPosts, h as useSuspensePost, f as useSuspensePosts, j as useSuspenseTags, i as useTags, l as useUpdatePost } from '../../../../shared/stack.BvuqACtA.cjs';
2
2
  import '@tanstack/react-query';
3
3
  import '../../../../shared/stack.Dsatjh0B.cjs';
4
4
  import 'zod';
5
- import '../../../../shared/stack.CuhcFsAx.cjs';
5
+ import '../../../../shared/stack.DuQOcInS.cjs';
6
6
 
7
7
  declare function useDebounce<T>(value: T, delay?: number): T;
8
8
  declare function useThrottle<T>(value: T, wait?: number): T;
@@ -1,8 +1,8 @@
1
- export { P as PostCreateInput, e as PostUpdateInput, o as UseNextPreviousPostsOptions, p as UseNextPreviousPostsResult, d as UsePostResult, b as UsePostSearchOptions, c as UsePostSearchResult, U as UsePostsOptions, a as UsePostsResult, r as UseRecentPostsOptions, s as UseRecentPostsResult, k as useCreatePost, m as useDeletePost, q as useNextPreviousPosts, g as usePost, n as usePostSearch, u as usePosts, t as useRecentPosts, h as useSuspensePost, f as useSuspensePosts, j as useSuspenseTags, i as useTags, l as useUpdatePost } from '../../../../shared/stack.Dfc44JiE.mjs';
1
+ export { P as PostCreateInput, e as PostUpdateInput, o as UseNextPreviousPostsOptions, p as UseNextPreviousPostsResult, d as UsePostResult, b as UsePostSearchOptions, c as UsePostSearchResult, U as UsePostsOptions, a as UsePostsResult, r as UseRecentPostsOptions, s as UseRecentPostsResult, k as useCreatePost, m as useDeletePost, q as useNextPreviousPosts, g as usePost, n as usePostSearch, u as usePosts, t as useRecentPosts, h as useSuspensePost, f as useSuspensePosts, j as useSuspenseTags, i as useTags, l as useUpdatePost } from '../../../../shared/stack.Cs8R5HxD.mjs';
2
2
  import '@tanstack/react-query';
3
3
  import '../../../../shared/stack.Dsatjh0B.mjs';
4
4
  import 'zod';
5
- import '../../../../shared/stack.CuhcFsAx.mjs';
5
+ import '../../../../shared/stack.DuQOcInS.mjs';
6
6
 
7
7
  declare function useDebounce<T>(value: T, delay?: number): T;
8
8
  declare function useThrottle<T>(value: T, wait?: number): T;
@@ -1,8 +1,8 @@
1
- export { P as PostCreateInput, e as PostUpdateInput, o as UseNextPreviousPostsOptions, p as UseNextPreviousPostsResult, d as UsePostResult, b as UsePostSearchOptions, c as UsePostSearchResult, U as UsePostsOptions, a as UsePostsResult, r as UseRecentPostsOptions, s as UseRecentPostsResult, k as useCreatePost, m as useDeletePost, q as useNextPreviousPosts, g as usePost, n as usePostSearch, u as usePosts, t as useRecentPosts, h as useSuspensePost, f as useSuspensePosts, j as useSuspenseTags, i as useTags, l as useUpdatePost } from '../../../../shared/stack.BnSAhKJi.js';
1
+ export { P as PostCreateInput, e as PostUpdateInput, o as UseNextPreviousPostsOptions, p as UseNextPreviousPostsResult, d as UsePostResult, b as UsePostSearchOptions, c as UsePostSearchResult, U as UsePostsOptions, a as UsePostsResult, r as UseRecentPostsOptions, s as UseRecentPostsResult, k as useCreatePost, m as useDeletePost, q as useNextPreviousPosts, g as usePost, n as usePostSearch, u as usePosts, t as useRecentPosts, h as useSuspensePost, f as useSuspensePosts, j as useSuspenseTags, i as useTags, l as useUpdatePost } from '../../../../shared/stack.DPTRuLUH.js';
2
2
  import '@tanstack/react-query';
3
3
  import '../../../../shared/stack.Dsatjh0B.js';
4
4
  import 'zod';
5
- import '../../../../shared/stack.CuhcFsAx.js';
5
+ import '../../../../shared/stack.DuQOcInS.js';
6
6
 
7
7
  declare function useDebounce<T>(value: T, delay?: number): T;
8
8
  declare function useThrottle<T>(value: T, wait?: number): T;
@@ -3,9 +3,9 @@ import * as _btst_yar from '@btst/yar';
3
3
  import { ComponentType, ReactNode } from 'react';
4
4
  import { QueryClient } from '@tanstack/react-query';
5
5
  import { P as Post, S as SerializedPost } from '../../../shared/stack.Dsatjh0B.cjs';
6
- export { U as UsePostsOptions, a as UsePostsResult } from '../../../shared/stack.DNLuzDb3.cjs';
6
+ export { U as UsePostsOptions, a as UsePostsResult } from '../../../shared/stack.BvuqACtA.cjs';
7
7
  import 'zod';
8
- import '../../../shared/stack.CuhcFsAx.cjs';
8
+ import '../../../shared/stack.DuQOcInS.cjs';
9
9
 
10
10
  /**
11
11
  * Context passed to route hooks
@@ -390,6 +390,8 @@ declare const BLOG_LOCALIZATION: {
390
390
  BLOG_GENERIC_ERROR_MESSAGE: string;
391
391
  BLOG_PAGE_NOT_FOUND_TITLE: string;
392
392
  BLOG_PAGE_NOT_FOUND_DESCRIPTION: string;
393
+ BLOG_TAGS_SHOW_ALL: string;
394
+ BLOG_TAGS_SHOW_LESS: string;
393
395
  };
394
396
  type BlogLocalization = typeof BLOG_LOCALIZATION;
395
397
 
@@ -3,9 +3,9 @@ import * as _btst_yar from '@btst/yar';
3
3
  import { ComponentType, ReactNode } from 'react';
4
4
  import { QueryClient } from '@tanstack/react-query';
5
5
  import { P as Post, S as SerializedPost } from '../../../shared/stack.Dsatjh0B.mjs';
6
- export { U as UsePostsOptions, a as UsePostsResult } from '../../../shared/stack.Dfc44JiE.mjs';
6
+ export { U as UsePostsOptions, a as UsePostsResult } from '../../../shared/stack.Cs8R5HxD.mjs';
7
7
  import 'zod';
8
- import '../../../shared/stack.CuhcFsAx.mjs';
8
+ import '../../../shared/stack.DuQOcInS.mjs';
9
9
 
10
10
  /**
11
11
  * Context passed to route hooks
@@ -390,6 +390,8 @@ declare const BLOG_LOCALIZATION: {
390
390
  BLOG_GENERIC_ERROR_MESSAGE: string;
391
391
  BLOG_PAGE_NOT_FOUND_TITLE: string;
392
392
  BLOG_PAGE_NOT_FOUND_DESCRIPTION: string;
393
+ BLOG_TAGS_SHOW_ALL: string;
394
+ BLOG_TAGS_SHOW_LESS: string;
393
395
  };
394
396
  type BlogLocalization = typeof BLOG_LOCALIZATION;
395
397
 
@@ -3,9 +3,9 @@ import * as _btst_yar from '@btst/yar';
3
3
  import { ComponentType, ReactNode } from 'react';
4
4
  import { QueryClient } from '@tanstack/react-query';
5
5
  import { P as Post, S as SerializedPost } from '../../../shared/stack.Dsatjh0B.js';
6
- export { U as UsePostsOptions, a as UsePostsResult } from '../../../shared/stack.BnSAhKJi.js';
6
+ export { U as UsePostsOptions, a as UsePostsResult } from '../../../shared/stack.DPTRuLUH.js';
7
7
  import 'zod';
8
- import '../../../shared/stack.CuhcFsAx.js';
8
+ import '../../../shared/stack.DuQOcInS.js';
9
9
 
10
10
  /**
11
11
  * Context passed to route hooks
@@ -390,6 +390,8 @@ declare const BLOG_LOCALIZATION: {
390
390
  BLOG_GENERIC_ERROR_MESSAGE: string;
391
391
  BLOG_PAGE_NOT_FOUND_TITLE: string;
392
392
  BLOG_PAGE_NOT_FOUND_DESCRIPTION: string;
393
+ BLOG_TAGS_SHOW_ALL: string;
394
+ BLOG_TAGS_SHOW_LESS: string;
393
395
  };
394
396
  type BlogLocalization = typeof BLOG_LOCALIZATION;
395
397
 
@@ -1,9 +1,9 @@
1
1
  import '@tanstack/react-query';
2
- export { f as createBlogQueryKeys } from '../../shared/stack.CLWhMntf.cjs';
2
+ export { f as createBlogQueryKeys } from '../../shared/stack.04aMRz_W.cjs';
3
3
  import '@btst/stack/plugins/client';
4
4
  import '../../shared/stack.Dsatjh0B.cjs';
5
5
  import '@btst/stack/plugins/api';
6
6
  import '@btst/db';
7
7
  import 'better-call';
8
8
  import 'zod';
9
- import '../../shared/stack.CuhcFsAx.cjs';
9
+ import '../../shared/stack.DuQOcInS.cjs';
@@ -1,9 +1,9 @@
1
1
  import '@tanstack/react-query';
2
- export { f as createBlogQueryKeys } from '../../shared/stack.DiodAFAa.mjs';
2
+ export { f as createBlogQueryKeys } from '../../shared/stack.ueI-K4xy.mjs';
3
3
  import '@btst/stack/plugins/client';
4
4
  import '../../shared/stack.Dsatjh0B.mjs';
5
5
  import '@btst/stack/plugins/api';
6
6
  import '@btst/db';
7
7
  import 'better-call';
8
8
  import 'zod';
9
- import '../../shared/stack.CuhcFsAx.mjs';
9
+ import '../../shared/stack.DuQOcInS.mjs';
@@ -1,9 +1,9 @@
1
1
  import '@tanstack/react-query';
2
- export { f as createBlogQueryKeys } from '../../shared/stack.ufcExQIR.js';
2
+ export { f as createBlogQueryKeys } from '../../shared/stack.CxWEN62M.js';
3
3
  import '@btst/stack/plugins/client';
4
4
  import '../../shared/stack.Dsatjh0B.js';
5
5
  import '@btst/stack/plugins/api';
6
6
  import '@btst/db';
7
7
  import 'better-call';
8
8
  import 'zod';
9
- import '../../shared/stack.CuhcFsAx.js';
9
+ import '../../shared/stack.DuQOcInS.js';
@@ -1,8 +1,8 @@
1
- import { a as CommentListParamsSchema, b as CommentCountQuerySchema } from '../../../shared/stack.CmHRdhl8.cjs';
2
- export { d as CommentsApiContext, C as CommentsApiRouter, e as CommentsBackendOptions, c as commentsBackendPlugin } from '../../../shared/stack.CmHRdhl8.cjs';
1
+ import { a as CommentListParamsSchema, b as CommentCountQuerySchema } from '../../../shared/stack.CCncwK6g.cjs';
2
+ export { d as CommentsApiContext, C as CommentsApiRouter, e as CommentsBackendOptions, c as commentsBackendPlugin } from '../../../shared/stack.CCncwK6g.cjs';
3
3
  import { DBAdapter } from '@btst/db';
4
- import { C as CommentListResult, S as SerializedComment, d as Comment } from '../../../shared/stack.C-b3Sn8j.cjs';
5
- export { e as COMMENTS_QUERY_KEYS } from '../../../shared/stack.C-b3Sn8j.cjs';
4
+ import { C as CommentListResult, S as SerializedComment, d as Comment } from '../../../shared/stack.C7KNNiJm.cjs';
5
+ export { e as COMMENTS_QUERY_KEYS } from '../../../shared/stack.C7KNNiJm.cjs';
6
6
  import { z } from 'zod';
7
7
  import '@btst/stack/plugins/api';
8
8
  import 'better-call';