@epicbagel/saas-kit 1.26.0 → 1.28.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.
package/README.md CHANGED
@@ -567,6 +567,32 @@ turn. The thread draws the avatar and name above the first of each run of
567
567
  turns by the same person on the same side, and again after a time marker, so
568
568
  a conversation with several people in it says who said what.
569
569
 
570
+ ### Next steps in the empty state (1.27.0)
571
+
572
+ `Chat` takes `emptyActions`, an array of `ChatEmptyAction`: what a returning
573
+ user can pick up, shown under the empty-state composer and before any
574
+ `examplePrompts`.
575
+
576
+ ```tsx
577
+ <Chat
578
+ messages={[]}
579
+ onSend={send}
580
+ emptyActions={[
581
+ { id: "review", icon: Users, label: "Review 3 new people", detail: "Head of Sales · Northwind", onSelect: openReview },
582
+ { id: "answer", icon: MessageCircleQuestion, label: "London", detail: "Where is the role based? · VP Finance", onSelect: answer },
583
+ ]}
584
+ />
585
+ ```
586
+
587
+ - **A row** is a button: the icon, the `label` and the muted `detail`, on one
588
+ line where there is room.
589
+ - **A pick** calls `onSelect` and sends nothing. Return a promise to show the
590
+ row's spinner and disable every row until it settles; a rejection
591
+ re-enables them and goes to `onSendError` (else `reportError`).
592
+ - **The heading** is `emptyActionsLabel`, default "Pick up where you left
593
+ off". `""` hides it and keeps the default as the list's accessible name.
594
+ - It hides while `pending` and once the conversation has started.
595
+
570
596
  ## Notes
571
597
 
572
598
  `primitives/notes` provides a reusable `Notes` area and `NoteComposer` for any
@@ -0,0 +1,198 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
+
3
+
4
+ var _chunkNQK5ZWC7cjs = require('./chunk-NQK5ZWC7.cjs');
5
+
6
+
7
+ var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
8
+
9
+ // src/primitives/item.tsx
10
+ var _classvarianceauthority = require('class-variance-authority');
11
+ var _radixui = require('radix-ui');
12
+ var _jsxruntime = require('react/jsx-runtime');
13
+ function ItemGroup({ className, ...props }) {
14
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
15
+ "div",
16
+ {
17
+ role: "list",
18
+ "data-slot": "item-group",
19
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
20
+ "group/item-group flex w-full flex-col gap-4 has-data-[size=sm]:gap-2.5 has-data-[size=xs]:gap-2",
21
+ className
22
+ ),
23
+ ...props
24
+ }
25
+ );
26
+ }
27
+ function ItemSeparator({
28
+ className,
29
+ ...props
30
+ }) {
31
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
32
+ _chunkNQK5ZWC7cjs.Separator,
33
+ {
34
+ "data-slot": "item-separator",
35
+ orientation: "horizontal",
36
+ className: _chunkKWLSBTB2cjs.cn.call(void 0, "my-2", className),
37
+ ...props
38
+ }
39
+ );
40
+ }
41
+ var itemVariants = _classvarianceauthority.cva.call(void 0,
42
+ "group/item flex w-full flex-wrap items-center rounded-md border text-sm transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors [a]:hover:bg-muted",
43
+ {
44
+ variants: {
45
+ variant: {
46
+ default: "border-transparent",
47
+ outline: "border-border",
48
+ muted: "border-transparent bg-muted/50"
49
+ },
50
+ size: {
51
+ default: "gap-3.5 px-4 py-3.5",
52
+ sm: "gap-2.5 px-3 py-2.5",
53
+ xs: "gap-2 px-2.5 py-2 in-data-[slot=dropdown-menu-content]:p-0"
54
+ }
55
+ },
56
+ defaultVariants: {
57
+ variant: "default",
58
+ size: "default"
59
+ }
60
+ }
61
+ );
62
+ function Item({
63
+ className,
64
+ variant = "default",
65
+ size = "default",
66
+ asChild = false,
67
+ ...props
68
+ }) {
69
+ const Comp = asChild ? _radixui.Slot.Root : "div";
70
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
71
+ Comp,
72
+ {
73
+ "data-slot": "item",
74
+ "data-variant": variant,
75
+ "data-size": size,
76
+ className: _chunkKWLSBTB2cjs.cn.call(void 0, itemVariants({ variant, size, className })),
77
+ ...props
78
+ }
79
+ );
80
+ }
81
+ var itemMediaVariants = _classvarianceauthority.cva.call(void 0,
82
+ "flex shrink-0 items-center justify-center gap-2 group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start [&_svg]:pointer-events-none",
83
+ {
84
+ variants: {
85
+ variant: {
86
+ default: "bg-transparent",
87
+ icon: "[&_svg:not([class*='size-'])]:size-4",
88
+ image: "size-10 overflow-hidden rounded-sm group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 [&_img]:size-full [&_img]:object-cover"
89
+ }
90
+ },
91
+ defaultVariants: {
92
+ variant: "default"
93
+ }
94
+ }
95
+ );
96
+ function ItemMedia({
97
+ className,
98
+ variant = "default",
99
+ ...props
100
+ }) {
101
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
102
+ "div",
103
+ {
104
+ "data-slot": "item-media",
105
+ "data-variant": variant,
106
+ className: _chunkKWLSBTB2cjs.cn.call(void 0, itemMediaVariants({ variant, className })),
107
+ ...props
108
+ }
109
+ );
110
+ }
111
+ function ItemContent({ className, ...props }) {
112
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
113
+ "div",
114
+ {
115
+ "data-slot": "item-content",
116
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
117
+ "flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0 [&+[data-slot=item-content]]:flex-none",
118
+ className
119
+ ),
120
+ ...props
121
+ }
122
+ );
123
+ }
124
+ function ItemTitle({ className, ...props }) {
125
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
126
+ "div",
127
+ {
128
+ "data-slot": "item-title",
129
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
130
+ "line-clamp-1 flex w-fit items-center gap-2 text-sm leading-snug font-medium underline-offset-4",
131
+ className
132
+ ),
133
+ ...props
134
+ }
135
+ );
136
+ }
137
+ function ItemDescription({ className, ...props }) {
138
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
139
+ "p",
140
+ {
141
+ "data-slot": "item-description",
142
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
143
+ "line-clamp-2 text-left text-sm leading-normal font-normal text-muted-foreground group-data-[size=xs]/item:text-xs [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",
144
+ className
145
+ ),
146
+ ...props
147
+ }
148
+ );
149
+ }
150
+ function ItemActions({ className, ...props }) {
151
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
152
+ "div",
153
+ {
154
+ "data-slot": "item-actions",
155
+ className: _chunkKWLSBTB2cjs.cn.call(void 0, "flex items-center gap-2", className),
156
+ ...props
157
+ }
158
+ );
159
+ }
160
+ function ItemHeader({ className, ...props }) {
161
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
162
+ "div",
163
+ {
164
+ "data-slot": "item-header",
165
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
166
+ "flex basis-full items-center justify-between gap-2",
167
+ className
168
+ ),
169
+ ...props
170
+ }
171
+ );
172
+ }
173
+ function ItemFooter({ className, ...props }) {
174
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
175
+ "div",
176
+ {
177
+ "data-slot": "item-footer",
178
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
179
+ "flex basis-full items-center justify-between gap-2",
180
+ className
181
+ ),
182
+ ...props
183
+ }
184
+ );
185
+ }
186
+
187
+
188
+
189
+
190
+
191
+
192
+
193
+
194
+
195
+
196
+
197
+
198
+ exports.ItemGroup = ItemGroup; exports.ItemSeparator = ItemSeparator; exports.Item = Item; exports.ItemMedia = ItemMedia; exports.ItemContent = ItemContent; exports.ItemTitle = ItemTitle; exports.ItemDescription = ItemDescription; exports.ItemActions = ItemActions; exports.ItemHeader = ItemHeader; exports.ItemFooter = ItemFooter;
@@ -0,0 +1,72 @@
1
+ "use client";
2
+ import {
3
+ CountBadge
4
+ } from "./chunk-H7TETFLB.js";
5
+ import {
6
+ cn
7
+ } from "./chunk-G6SRSWXB.js";
8
+
9
+ // src/primitives/chip-tabs.tsx
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ function ChipTabs({
12
+ items,
13
+ value,
14
+ onChange,
15
+ size = "sm",
16
+ variant = "soft",
17
+ trailing,
18
+ className,
19
+ marginBottom = "none",
20
+ placement = "inline",
21
+ disabled = false,
22
+ guidedValue,
23
+ label,
24
+ labelledBy
25
+ }) {
26
+ const padClass = size === "xs" ? "px-1.5 py-0.5" : size === "md" ? "px-3.5 py-2" : "px-2 py-1";
27
+ const textClass = size === "xs" ? "text-[11px]" : size === "md" ? "text-sm" : "text-xs";
28
+ const gapClass = size === "md" ? "gap-2" : "gap-1";
29
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center", gapClass, marginBottom === "lg" && "mb-6", placement === "panel" && "border-b px-3 py-2", className), children: [
30
+ /* @__PURE__ */ jsx(
31
+ "div",
32
+ {
33
+ className: cn("flex min-w-0 flex-wrap", gapClass),
34
+ ...label || labelledBy ? { role: "group", "aria-label": labelledBy ? void 0 : label, "aria-labelledby": labelledBy } : {},
35
+ children: items.map((item) => {
36
+ const active = item.id === value;
37
+ return /* @__PURE__ */ jsxs(
38
+ "button",
39
+ {
40
+ type: "button",
41
+ "aria-pressed": active,
42
+ disabled,
43
+ onClick: () => onChange(item.id),
44
+ className: cn(
45
+ "rounded-md transition-colors inline-flex items-center gap-1 disabled:pointer-events-none disabled:opacity-60",
46
+ textClass,
47
+ padClass,
48
+ variant === "outline" && "border",
49
+ item.id === guidedValue && "ring-2 ring-destructive/60 ring-offset-2 ring-offset-background animate-pulse-once motion-reduce:animate-none",
50
+ active && variant === "soft" && "bg-accent text-accent-foreground font-medium",
51
+ !active && variant === "soft" && "text-muted-foreground hover:bg-accent/50",
52
+ active && variant === "outline" && "border-primary bg-primary/10 text-foreground font-medium",
53
+ !active && variant === "outline" && "border-muted-foreground/50 bg-background text-muted-foreground hover:border-foreground/60 hover:text-foreground"
54
+ ),
55
+ children: [
56
+ item.icon != null && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "contents", children: item.icon }),
57
+ item.label,
58
+ item.count != null && item.count > 0 && /* @__PURE__ */ jsx(CountBadge, { value: item.count, variant: "secondary" })
59
+ ]
60
+ },
61
+ item.id
62
+ );
63
+ })
64
+ }
65
+ ),
66
+ trailing && /* @__PURE__ */ jsx("div", { className: "ml-auto flex items-center gap-1", children: trailing })
67
+ ] });
68
+ }
69
+
70
+ export {
71
+ ChipTabs
72
+ };
@@ -0,0 +1,72 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
+
3
+
4
+ var _chunkVGTINL5Qcjs = require('./chunk-VGTINL5Q.cjs');
5
+
6
+
7
+ var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
8
+
9
+ // src/primitives/chip-tabs.tsx
10
+ var _jsxruntime = require('react/jsx-runtime');
11
+ function ChipTabs({
12
+ items,
13
+ value,
14
+ onChange,
15
+ size = "sm",
16
+ variant = "soft",
17
+ trailing,
18
+ className,
19
+ marginBottom = "none",
20
+ placement = "inline",
21
+ disabled = false,
22
+ guidedValue,
23
+ label,
24
+ labelledBy
25
+ }) {
26
+ const padClass = size === "xs" ? "px-1.5 py-0.5" : size === "md" ? "px-3.5 py-2" : "px-2 py-1";
27
+ const textClass = size === "xs" ? "text-[11px]" : size === "md" ? "text-sm" : "text-xs";
28
+ const gapClass = size === "md" ? "gap-2" : "gap-1";
29
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "flex items-center", gapClass, marginBottom === "lg" && "mb-6", placement === "panel" && "border-b px-3 py-2", className), children: [
30
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
31
+ "div",
32
+ {
33
+ className: _chunkKWLSBTB2cjs.cn.call(void 0, "flex min-w-0 flex-wrap", gapClass),
34
+ ...label || labelledBy ? { role: "group", "aria-label": labelledBy ? void 0 : label, "aria-labelledby": labelledBy } : {},
35
+ children: items.map((item) => {
36
+ const active = item.id === value;
37
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
38
+ "button",
39
+ {
40
+ type: "button",
41
+ "aria-pressed": active,
42
+ disabled,
43
+ onClick: () => onChange(item.id),
44
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
45
+ "rounded-md transition-colors inline-flex items-center gap-1 disabled:pointer-events-none disabled:opacity-60",
46
+ textClass,
47
+ padClass,
48
+ variant === "outline" && "border",
49
+ item.id === guidedValue && "ring-2 ring-destructive/60 ring-offset-2 ring-offset-background animate-pulse-once motion-reduce:animate-none",
50
+ active && variant === "soft" && "bg-accent text-accent-foreground font-medium",
51
+ !active && variant === "soft" && "text-muted-foreground hover:bg-accent/50",
52
+ active && variant === "outline" && "border-primary bg-primary/10 text-foreground font-medium",
53
+ !active && variant === "outline" && "border-muted-foreground/50 bg-background text-muted-foreground hover:border-foreground/60 hover:text-foreground"
54
+ ),
55
+ children: [
56
+ item.icon != null && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { "aria-hidden": "true", className: "contents", children: item.icon }),
57
+ item.label,
58
+ item.count != null && item.count > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVGTINL5Qcjs.CountBadge, { value: item.count, variant: "secondary" })
59
+ ]
60
+ },
61
+ item.id
62
+ );
63
+ })
64
+ }
65
+ ),
66
+ trailing && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "ml-auto flex items-center gap-1", children: trailing })
67
+ ] });
68
+ }
69
+
70
+
71
+
72
+ exports.ChipTabs = ChipTabs;
@@ -0,0 +1,198 @@
1
+ "use client";
2
+ import {
3
+ Separator
4
+ } from "./chunk-HYTILYE5.js";
5
+ import {
6
+ cn
7
+ } from "./chunk-G6SRSWXB.js";
8
+
9
+ // src/primitives/item.tsx
10
+ import { cva } from "class-variance-authority";
11
+ import { Slot } from "radix-ui";
12
+ import { jsx } from "react/jsx-runtime";
13
+ function ItemGroup({ className, ...props }) {
14
+ return /* @__PURE__ */ jsx(
15
+ "div",
16
+ {
17
+ role: "list",
18
+ "data-slot": "item-group",
19
+ className: cn(
20
+ "group/item-group flex w-full flex-col gap-4 has-data-[size=sm]:gap-2.5 has-data-[size=xs]:gap-2",
21
+ className
22
+ ),
23
+ ...props
24
+ }
25
+ );
26
+ }
27
+ function ItemSeparator({
28
+ className,
29
+ ...props
30
+ }) {
31
+ return /* @__PURE__ */ jsx(
32
+ Separator,
33
+ {
34
+ "data-slot": "item-separator",
35
+ orientation: "horizontal",
36
+ className: cn("my-2", className),
37
+ ...props
38
+ }
39
+ );
40
+ }
41
+ var itemVariants = cva(
42
+ "group/item flex w-full flex-wrap items-center rounded-md border text-sm transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors [a]:hover:bg-muted",
43
+ {
44
+ variants: {
45
+ variant: {
46
+ default: "border-transparent",
47
+ outline: "border-border",
48
+ muted: "border-transparent bg-muted/50"
49
+ },
50
+ size: {
51
+ default: "gap-3.5 px-4 py-3.5",
52
+ sm: "gap-2.5 px-3 py-2.5",
53
+ xs: "gap-2 px-2.5 py-2 in-data-[slot=dropdown-menu-content]:p-0"
54
+ }
55
+ },
56
+ defaultVariants: {
57
+ variant: "default",
58
+ size: "default"
59
+ }
60
+ }
61
+ );
62
+ function Item({
63
+ className,
64
+ variant = "default",
65
+ size = "default",
66
+ asChild = false,
67
+ ...props
68
+ }) {
69
+ const Comp = asChild ? Slot.Root : "div";
70
+ return /* @__PURE__ */ jsx(
71
+ Comp,
72
+ {
73
+ "data-slot": "item",
74
+ "data-variant": variant,
75
+ "data-size": size,
76
+ className: cn(itemVariants({ variant, size, className })),
77
+ ...props
78
+ }
79
+ );
80
+ }
81
+ var itemMediaVariants = cva(
82
+ "flex shrink-0 items-center justify-center gap-2 group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start [&_svg]:pointer-events-none",
83
+ {
84
+ variants: {
85
+ variant: {
86
+ default: "bg-transparent",
87
+ icon: "[&_svg:not([class*='size-'])]:size-4",
88
+ image: "size-10 overflow-hidden rounded-sm group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 [&_img]:size-full [&_img]:object-cover"
89
+ }
90
+ },
91
+ defaultVariants: {
92
+ variant: "default"
93
+ }
94
+ }
95
+ );
96
+ function ItemMedia({
97
+ className,
98
+ variant = "default",
99
+ ...props
100
+ }) {
101
+ return /* @__PURE__ */ jsx(
102
+ "div",
103
+ {
104
+ "data-slot": "item-media",
105
+ "data-variant": variant,
106
+ className: cn(itemMediaVariants({ variant, className })),
107
+ ...props
108
+ }
109
+ );
110
+ }
111
+ function ItemContent({ className, ...props }) {
112
+ return /* @__PURE__ */ jsx(
113
+ "div",
114
+ {
115
+ "data-slot": "item-content",
116
+ className: cn(
117
+ "flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0 [&+[data-slot=item-content]]:flex-none",
118
+ className
119
+ ),
120
+ ...props
121
+ }
122
+ );
123
+ }
124
+ function ItemTitle({ className, ...props }) {
125
+ return /* @__PURE__ */ jsx(
126
+ "div",
127
+ {
128
+ "data-slot": "item-title",
129
+ className: cn(
130
+ "line-clamp-1 flex w-fit items-center gap-2 text-sm leading-snug font-medium underline-offset-4",
131
+ className
132
+ ),
133
+ ...props
134
+ }
135
+ );
136
+ }
137
+ function ItemDescription({ className, ...props }) {
138
+ return /* @__PURE__ */ jsx(
139
+ "p",
140
+ {
141
+ "data-slot": "item-description",
142
+ className: cn(
143
+ "line-clamp-2 text-left text-sm leading-normal font-normal text-muted-foreground group-data-[size=xs]/item:text-xs [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",
144
+ className
145
+ ),
146
+ ...props
147
+ }
148
+ );
149
+ }
150
+ function ItemActions({ className, ...props }) {
151
+ return /* @__PURE__ */ jsx(
152
+ "div",
153
+ {
154
+ "data-slot": "item-actions",
155
+ className: cn("flex items-center gap-2", className),
156
+ ...props
157
+ }
158
+ );
159
+ }
160
+ function ItemHeader({ className, ...props }) {
161
+ return /* @__PURE__ */ jsx(
162
+ "div",
163
+ {
164
+ "data-slot": "item-header",
165
+ className: cn(
166
+ "flex basis-full items-center justify-between gap-2",
167
+ className
168
+ ),
169
+ ...props
170
+ }
171
+ );
172
+ }
173
+ function ItemFooter({ className, ...props }) {
174
+ return /* @__PURE__ */ jsx(
175
+ "div",
176
+ {
177
+ "data-slot": "item-footer",
178
+ className: cn(
179
+ "flex basis-full items-center justify-between gap-2",
180
+ className
181
+ ),
182
+ ...props
183
+ }
184
+ );
185
+ }
186
+
187
+ export {
188
+ ItemGroup,
189
+ ItemSeparator,
190
+ Item,
191
+ ItemMedia,
192
+ ItemContent,
193
+ ItemTitle,
194
+ ItemDescription,
195
+ ItemActions,
196
+ ItemHeader,
197
+ ItemFooter
198
+ };
@@ -24,19 +24,21 @@ function PersonAvatar({
24
24
  size,
25
25
  className,
26
26
  fallbackClassName,
27
- fallbackSize = "default"
27
+ fallbackSize = "default",
28
+ decorative = false
28
29
  }) {
29
30
  return /* @__PURE__ */ jsxs(
30
31
  Avatar,
31
32
  {
32
33
  className: cn("shrink-0 overflow-hidden rounded-full bg-muted", className),
33
34
  style: size != null ? { width: size, height: size } : void 0,
35
+ ...decorative ? { "aria-hidden": true } : {},
34
36
  children: [
35
37
  photoUrl ? /* @__PURE__ */ jsx(
36
38
  AvatarImage,
37
39
  {
38
40
  src: photoUrl,
39
- alt: name,
41
+ alt: decorative ? "" : name,
40
42
  className: "h-full w-full object-cover"
41
43
  }
42
44
  ) : null,
@@ -24,19 +24,21 @@ function PersonAvatar({
24
24
  size,
25
25
  className,
26
26
  fallbackClassName,
27
- fallbackSize = "default"
27
+ fallbackSize = "default",
28
+ decorative = false
28
29
  }) {
29
30
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
30
31
  _chunkWABCLRBRcjs.Avatar,
31
32
  {
32
33
  className: _chunkKWLSBTB2cjs.cn.call(void 0, "shrink-0 overflow-hidden rounded-full bg-muted", className),
33
34
  style: size != null ? { width: size, height: size } : void 0,
35
+ ...decorative ? { "aria-hidden": true } : {},
34
36
  children: [
35
37
  photoUrl ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
36
38
  _chunkWABCLRBRcjs.AvatarImage,
37
39
  {
38
40
  src: photoUrl,
39
- alt: name,
41
+ alt: decorative ? "" : name,
40
42
  className: "h-full w-full object-cover"
41
43
  }
42
44
  ) : null,
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }"use client";
2
2
 
3
3
 
4
- var _chunkKGFL3VWYcjs = require('../chunk-KGFL3VWY.cjs');
4
+ var _chunkPPYHNJMVcjs = require('../chunk-PPYHNJMV.cjs');
5
5
 
6
6
 
7
7
  var _chunkPQUSJEXLcjs = require('../chunk-PQUSJEXL.cjs');
@@ -40,7 +40,7 @@ function ActivityFeedToolbar({
40
40
  }) {
41
41
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "flex flex-col gap-2 rounded-lg border bg-card p-2 lg:flex-row lg:items-center", className), children: [
42
42
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
43
- _chunkKGFL3VWYcjs.ChipTabs,
43
+ _chunkPPYHNJMVcjs.ChipTabs,
44
44
  {
45
45
  items: categories,
46
46
  value: category,
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  ChipTabs
4
- } from "../chunk-QD63LB2F.js";
4
+ } from "../chunk-MP64UGRF.js";
5
5
  import {
6
6
  Input
7
7
  } from "../chunk-QMA3WVB7.js";