@ship-it-ui/shipit 0.0.4 → 0.0.5

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/dist/index.d.cts CHANGED
@@ -29,6 +29,12 @@ interface AskBarProps extends Omit<HTMLAttributes<HTMLFormElement>, 'onSubmit' |
29
29
  disabled?: boolean;
30
30
  /** Pixel max-width. Default 620. */
31
31
  maxWidth?: number | string;
32
+ /**
33
+ * `'comfortable'` (default) renders the desktop ask bar. `'touch'` swaps to
34
+ * the mobile composer: larger text, 44pt send button, ⌘↵ hint hidden (no
35
+ * hardware keyboard), and scope chips wrap to a second row.
36
+ */
37
+ density?: 'comfortable' | 'touch';
32
38
  }
33
39
  declare const AskBar: react.ForwardRefExoticComponent<AskBarProps & react.RefAttributes<HTMLFormElement>>;
34
40
 
@@ -77,6 +83,13 @@ interface CopilotMessageProps extends HTMLAttributes<HTMLDivElement> {
77
83
  avatar?: ReactNode;
78
84
  /** Streaming caret at the end of the body. */
79
85
  streaming?: boolean;
86
+ /**
87
+ * `'comfortable'` (default) renders the desktop bubble. `'touch'` switches
88
+ * to the mobile chat layout: user bubbles right-aligned on `bg-accent`,
89
+ * assistant bubbles left-aligned on `bg-panel`, larger 15px text, and a
90
+ * max-width that keeps bubbles within 85% of the viewport.
91
+ */
92
+ density?: 'comfortable' | 'touch';
80
93
  }
81
94
  declare const CopilotMessage: react.ForwardRefExoticComponent<CopilotMessageProps & react.RefAttributes<HTMLDivElement>>;
82
95
 
@@ -638,4 +651,40 @@ declare function entityTypeColumn<T extends MinimalEntity>(options?: {
638
651
  header?: string;
639
652
  }): DataTableColumn<T>;
640
653
 
641
- export { AskBar, type AskBarProps, CTAStrip, type CTAStripProps, Citation, type CitationProps, ConfidenceIndicator, type ConfidenceIndicatorProps, type ConfidenceTier, ConnectorCard, type ConnectorCardProps, type ConnectorStatus, CopilotMessage, type CopilotMessageProps, type CopilotRole, ENTITY_GLYPH, ENTITY_LABEL, ENTITY_TONE_BG, ENTITY_TONE_CLASS, EntityBadge, type EntityBadgeProps, type EntityBadgeVariant, EntityCard, type EntityCardProps, EntityListRow, EntityListRowButton, type EntityListRowButtonProps, EntityListRowDiv, type EntityListRowDivProps, type EntityListRowProps, type EntityStat, EntityTable, type EntityTableProps, type EntityType, type EntityTypeMeta, type Feature, FeatureGrid, type FeatureGridProps, Footer, type FooterColumn, type FooterLink, type FooterProps, GraphEdge, type GraphEdgeProps, type GraphEdgeStyle, GraphInspector, type GraphInspectorProps, GraphLegend, type GraphLegendEntry, type GraphLegendProps, GraphMinimap, type GraphMinimapProps, GraphNode, type GraphNodeProps, type GraphNodeState, Hero, type HeroProps, type InspectorProperty, type InspectorRelation, type KnownEntityType, type MinimapPoint, type MinimapViewport, PathOverlay, type PathOverlayProps, type PathPoint, PricingCard, type PricingCardProps, ReasoningBlock, type ReasoningBlockProps, ReasoningStep, type ReasoningStepProps, SuggestionChip, type SuggestionChipProps, Testimonial, type TestimonialProps, ToolCallCard, type ToolCallCardProps, entityColumn, entityTypeColumn, getEntityTypeMeta, listEntityTypes, registerEntityType, registerEntityTypes, resetEntityTypeRegistry };
654
+ /**
655
+ * NotifRow — single row in the mobile Inbox / notification list. Shows an
656
+ * unread dot (tone-colored), a tight title + body block, and a right-aligned
657
+ * relative time. Pair with `isFirst` / `isLast` props from a parent list
658
+ * wrapper to round the corners of the group like an iOS grouped list.
659
+ *
660
+ * No desktop sibling — desktop uses the standard `Notifications` flyout
661
+ * inside CommandPalette. This composite is mobile-only and lives under
662
+ * `packages/shipit/src/notifications/`.
663
+ */
664
+ type NotifTone = 'ok' | 'warn' | 'err' | 'neutral';
665
+ interface NotifRowProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
666
+ /** Bold first-line summary. */
667
+ title: ReactNode;
668
+ /** One-line body underneath. Truncates to a single line for now. */
669
+ body?: ReactNode;
670
+ /** Right-aligned relative time string (e.g. `9:32`, `Mon`). */
671
+ time?: ReactNode;
672
+ /** Coloring of the unread dot. */
673
+ tone?: NotifTone;
674
+ /** When true, render the unread dot. */
675
+ unread?: boolean;
676
+ /** Round the top corners — set when this is the first row in a group. */
677
+ isFirst?: boolean;
678
+ /** Round the bottom corners — set when this is the last row in a group. */
679
+ isLast?: boolean;
680
+ /**
681
+ * Navigate when the row is tapped. Renders the row as an `<a>` and wins
682
+ * over `onClick` for the render shape — but any `onClick` you pass is
683
+ * still forwarded onto the anchor, which is the right place for
684
+ * analytics callbacks (the link still navigates).
685
+ */
686
+ href?: string;
687
+ }
688
+ declare const NotifRow: react.ForwardRefExoticComponent<NotifRowProps & react.RefAttributes<HTMLDivElement>>;
689
+
690
+ export { AskBar, type AskBarProps, CTAStrip, type CTAStripProps, Citation, type CitationProps, ConfidenceIndicator, type ConfidenceIndicatorProps, type ConfidenceTier, ConnectorCard, type ConnectorCardProps, type ConnectorStatus, CopilotMessage, type CopilotMessageProps, type CopilotRole, ENTITY_GLYPH, ENTITY_LABEL, ENTITY_TONE_BG, ENTITY_TONE_CLASS, EntityBadge, type EntityBadgeProps, type EntityBadgeVariant, EntityCard, type EntityCardProps, EntityListRow, EntityListRowButton, type EntityListRowButtonProps, EntityListRowDiv, type EntityListRowDivProps, type EntityListRowProps, type EntityStat, EntityTable, type EntityTableProps, type EntityType, type EntityTypeMeta, type Feature, FeatureGrid, type FeatureGridProps, Footer, type FooterColumn, type FooterLink, type FooterProps, GraphEdge, type GraphEdgeProps, type GraphEdgeStyle, GraphInspector, type GraphInspectorProps, GraphLegend, type GraphLegendEntry, type GraphLegendProps, GraphMinimap, type GraphMinimapProps, GraphNode, type GraphNodeProps, type GraphNodeState, Hero, type HeroProps, type InspectorProperty, type InspectorRelation, type KnownEntityType, type MinimapPoint, type MinimapViewport, NotifRow, type NotifRowProps, type NotifTone, PathOverlay, type PathOverlayProps, type PathPoint, PricingCard, type PricingCardProps, ReasoningBlock, type ReasoningBlockProps, ReasoningStep, type ReasoningStepProps, SuggestionChip, type SuggestionChipProps, Testimonial, type TestimonialProps, ToolCallCard, type ToolCallCardProps, entityColumn, entityTypeColumn, getEntityTypeMeta, listEntityTypes, registerEntityType, registerEntityTypes, resetEntityTypeRegistry };
package/dist/index.d.ts CHANGED
@@ -29,6 +29,12 @@ interface AskBarProps extends Omit<HTMLAttributes<HTMLFormElement>, 'onSubmit' |
29
29
  disabled?: boolean;
30
30
  /** Pixel max-width. Default 620. */
31
31
  maxWidth?: number | string;
32
+ /**
33
+ * `'comfortable'` (default) renders the desktop ask bar. `'touch'` swaps to
34
+ * the mobile composer: larger text, 44pt send button, ⌘↵ hint hidden (no
35
+ * hardware keyboard), and scope chips wrap to a second row.
36
+ */
37
+ density?: 'comfortable' | 'touch';
32
38
  }
33
39
  declare const AskBar: react.ForwardRefExoticComponent<AskBarProps & react.RefAttributes<HTMLFormElement>>;
34
40
 
@@ -77,6 +83,13 @@ interface CopilotMessageProps extends HTMLAttributes<HTMLDivElement> {
77
83
  avatar?: ReactNode;
78
84
  /** Streaming caret at the end of the body. */
79
85
  streaming?: boolean;
86
+ /**
87
+ * `'comfortable'` (default) renders the desktop bubble. `'touch'` switches
88
+ * to the mobile chat layout: user bubbles right-aligned on `bg-accent`,
89
+ * assistant bubbles left-aligned on `bg-panel`, larger 15px text, and a
90
+ * max-width that keeps bubbles within 85% of the viewport.
91
+ */
92
+ density?: 'comfortable' | 'touch';
80
93
  }
81
94
  declare const CopilotMessage: react.ForwardRefExoticComponent<CopilotMessageProps & react.RefAttributes<HTMLDivElement>>;
82
95
 
@@ -638,4 +651,40 @@ declare function entityTypeColumn<T extends MinimalEntity>(options?: {
638
651
  header?: string;
639
652
  }): DataTableColumn<T>;
640
653
 
641
- export { AskBar, type AskBarProps, CTAStrip, type CTAStripProps, Citation, type CitationProps, ConfidenceIndicator, type ConfidenceIndicatorProps, type ConfidenceTier, ConnectorCard, type ConnectorCardProps, type ConnectorStatus, CopilotMessage, type CopilotMessageProps, type CopilotRole, ENTITY_GLYPH, ENTITY_LABEL, ENTITY_TONE_BG, ENTITY_TONE_CLASS, EntityBadge, type EntityBadgeProps, type EntityBadgeVariant, EntityCard, type EntityCardProps, EntityListRow, EntityListRowButton, type EntityListRowButtonProps, EntityListRowDiv, type EntityListRowDivProps, type EntityListRowProps, type EntityStat, EntityTable, type EntityTableProps, type EntityType, type EntityTypeMeta, type Feature, FeatureGrid, type FeatureGridProps, Footer, type FooterColumn, type FooterLink, type FooterProps, GraphEdge, type GraphEdgeProps, type GraphEdgeStyle, GraphInspector, type GraphInspectorProps, GraphLegend, type GraphLegendEntry, type GraphLegendProps, GraphMinimap, type GraphMinimapProps, GraphNode, type GraphNodeProps, type GraphNodeState, Hero, type HeroProps, type InspectorProperty, type InspectorRelation, type KnownEntityType, type MinimapPoint, type MinimapViewport, PathOverlay, type PathOverlayProps, type PathPoint, PricingCard, type PricingCardProps, ReasoningBlock, type ReasoningBlockProps, ReasoningStep, type ReasoningStepProps, SuggestionChip, type SuggestionChipProps, Testimonial, type TestimonialProps, ToolCallCard, type ToolCallCardProps, entityColumn, entityTypeColumn, getEntityTypeMeta, listEntityTypes, registerEntityType, registerEntityTypes, resetEntityTypeRegistry };
654
+ /**
655
+ * NotifRow — single row in the mobile Inbox / notification list. Shows an
656
+ * unread dot (tone-colored), a tight title + body block, and a right-aligned
657
+ * relative time. Pair with `isFirst` / `isLast` props from a parent list
658
+ * wrapper to round the corners of the group like an iOS grouped list.
659
+ *
660
+ * No desktop sibling — desktop uses the standard `Notifications` flyout
661
+ * inside CommandPalette. This composite is mobile-only and lives under
662
+ * `packages/shipit/src/notifications/`.
663
+ */
664
+ type NotifTone = 'ok' | 'warn' | 'err' | 'neutral';
665
+ interface NotifRowProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
666
+ /** Bold first-line summary. */
667
+ title: ReactNode;
668
+ /** One-line body underneath. Truncates to a single line for now. */
669
+ body?: ReactNode;
670
+ /** Right-aligned relative time string (e.g. `9:32`, `Mon`). */
671
+ time?: ReactNode;
672
+ /** Coloring of the unread dot. */
673
+ tone?: NotifTone;
674
+ /** When true, render the unread dot. */
675
+ unread?: boolean;
676
+ /** Round the top corners — set when this is the first row in a group. */
677
+ isFirst?: boolean;
678
+ /** Round the bottom corners — set when this is the last row in a group. */
679
+ isLast?: boolean;
680
+ /**
681
+ * Navigate when the row is tapped. Renders the row as an `<a>` and wins
682
+ * over `onClick` for the render shape — but any `onClick` you pass is
683
+ * still forwarded onto the anchor, which is the right place for
684
+ * analytics callbacks (the link still navigates).
685
+ */
686
+ href?: string;
687
+ }
688
+ declare const NotifRow: react.ForwardRefExoticComponent<NotifRowProps & react.RefAttributes<HTMLDivElement>>;
689
+
690
+ export { AskBar, type AskBarProps, CTAStrip, type CTAStripProps, Citation, type CitationProps, ConfidenceIndicator, type ConfidenceIndicatorProps, type ConfidenceTier, ConnectorCard, type ConnectorCardProps, type ConnectorStatus, CopilotMessage, type CopilotMessageProps, type CopilotRole, ENTITY_GLYPH, ENTITY_LABEL, ENTITY_TONE_BG, ENTITY_TONE_CLASS, EntityBadge, type EntityBadgeProps, type EntityBadgeVariant, EntityCard, type EntityCardProps, EntityListRow, EntityListRowButton, type EntityListRowButtonProps, EntityListRowDiv, type EntityListRowDivProps, type EntityListRowProps, type EntityStat, EntityTable, type EntityTableProps, type EntityType, type EntityTypeMeta, type Feature, FeatureGrid, type FeatureGridProps, Footer, type FooterColumn, type FooterLink, type FooterProps, GraphEdge, type GraphEdgeProps, type GraphEdgeStyle, GraphInspector, type GraphInspectorProps, GraphLegend, type GraphLegendEntry, type GraphLegendProps, GraphMinimap, type GraphMinimapProps, GraphNode, type GraphNodeProps, type GraphNodeState, Hero, type HeroProps, type InspectorProperty, type InspectorRelation, type KnownEntityType, type MinimapPoint, type MinimapViewport, NotifRow, type NotifRowProps, type NotifTone, PathOverlay, type PathOverlayProps, type PathPoint, PricingCard, type PricingCardProps, ReasoningBlock, type ReasoningBlockProps, ReasoningStep, type ReasoningStepProps, SuggestionChip, type SuggestionChipProps, Testimonial, type TestimonialProps, ToolCallCard, type ToolCallCardProps, entityColumn, entityTypeColumn, getEntityTypeMeta, listEntityTypes, registerEntityType, registerEntityTypes, resetEntityTypeRegistry };
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  // src/index.ts
4
- import { cn as cn22 } from "@ship-it-ui/ui";
4
+ import { cn as cn23 } from "@ship-it-ui/ui";
5
5
 
6
6
  // src/ai/AskBar.tsx
7
7
  import { Button, useControllableState } from "@ship-it-ui/ui";
@@ -21,10 +21,12 @@ var AskBar = forwardRef(function AskBar2({
21
21
  submitLabel = "Ask",
22
22
  disabled,
23
23
  maxWidth = 620,
24
+ density = "comfortable",
24
25
  className,
25
26
  children,
26
27
  ...props
27
28
  }, ref) {
29
+ const isTouch = density === "touch";
28
30
  const [value, setValue] = useControllableState({
29
31
  value: valueProp,
30
32
  defaultValue: defaultValue ?? "",
@@ -52,16 +54,17 @@ var AskBar = forwardRef(function AskBar2({
52
54
  ref,
53
55
  role: "search",
54
56
  onSubmit: handleSubmit,
55
- style: { maxWidth },
57
+ style: { maxWidth: isTouch ? void 0 : maxWidth },
56
58
  className: cn(
57
- "border-border-strong bg-panel w-full rounded-xl border p-[14px] shadow",
59
+ "border-border-strong bg-panel w-full border",
60
+ isTouch ? "rounded-m-card p-3" : "rounded-xl p-[14px] shadow",
58
61
  "focus-within:border-accent focus-within:ring-accent-dim focus-within:ring-[3px]",
59
62
  className
60
63
  ),
61
64
  ...props,
62
65
  children: [
63
- /* @__PURE__ */ jsxs("div", { className: "mb-[10px] flex items-start gap-[10px]", children: [
64
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "text-accent text-[16px]", children: "\u2726" }),
66
+ /* @__PURE__ */ jsxs("div", { className: cn("flex items-start gap-[10px]", isTouch ? "mb-2" : "mb-[10px]"), children: [
67
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: cn("text-accent", isTouch ? "text-[18px]" : "text-[16px]"), children: "\u2726" }),
65
68
  /* @__PURE__ */ jsx(
66
69
  "textarea",
67
70
  {
@@ -73,8 +76,9 @@ var AskBar = forwardRef(function AskBar2({
73
76
  "aria-label": placeholder,
74
77
  rows: 1,
75
78
  className: cn(
76
- "text-text flex-1 resize-none border-0 bg-transparent text-[14px] leading-[1.5] outline-none",
77
- "placeholder:text-text-dim"
79
+ "text-text flex-1 resize-none border-0 bg-transparent leading-[1.5] outline-none",
80
+ "placeholder:text-text-dim",
81
+ isTouch ? "text-m-body" : "text-[14px]"
78
82
  )
79
83
  }
80
84
  ),
@@ -82,19 +86,23 @@ var AskBar = forwardRef(function AskBar2({
82
86
  "span",
83
87
  {
84
88
  "aria-hidden": true,
85
- className: "bg-accent mt-[3px] inline-block h-4 w-px animate-[ship-pulse_1s_infinite]"
89
+ className: cn(
90
+ "bg-accent mt-[3px] inline-block w-px animate-[ship-pulse_1s_infinite]",
91
+ isTouch ? "h-5" : "h-4"
92
+ )
86
93
  }
87
94
  )
88
95
  ] }),
89
96
  /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-[6px]", children: [
90
97
  children,
91
98
  /* @__PURE__ */ jsxs("div", { className: "ml-auto flex items-center gap-2", children: [
92
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "text-text-dim font-mono text-[11px]", children: "\u2318\u21B5" }),
99
+ !isTouch && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "text-text-dim font-mono text-[11px]", children: "\u2318\u21B5" }),
93
100
  /* @__PURE__ */ jsx(
94
101
  Button,
95
102
  {
96
103
  type: "submit",
97
- size: "sm",
104
+ size: isTouch ? "md" : "sm",
105
+ density: isTouch ? "touch" : void 0,
98
106
  variant: "primary",
99
107
  disabled: disabled || !(value ?? "").trim(),
100
108
  children: submitLabel
@@ -224,8 +232,49 @@ import { cn as cn4 } from "@ship-it-ui/ui";
224
232
  import { forwardRef as forwardRef4 } from "react";
225
233
  import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
226
234
  var CopilotMessage = forwardRef4(
227
- function CopilotMessage2({ role, avatar, streaming, className, children, ...props }, ref) {
235
+ function CopilotMessage2({ role, avatar, streaming, density = "comfortable", className, children, ...props }, ref) {
228
236
  const isAssistant = role === "assistant";
237
+ const isTouch = density === "touch";
238
+ if (isTouch) {
239
+ return /* @__PURE__ */ jsxs4(
240
+ "div",
241
+ {
242
+ ref,
243
+ className: cn4(
244
+ "flex flex-col gap-[6px]",
245
+ isAssistant ? "items-start" : "items-end",
246
+ className
247
+ ),
248
+ "data-role": role,
249
+ ...props,
250
+ children: [
251
+ isAssistant && /* @__PURE__ */ jsxs4("div", { className: "text-m-eyebrow text-accent inline-flex items-center gap-[6px] font-mono tracking-wide uppercase", children: [
252
+ /* @__PURE__ */ jsx4("span", { "aria-hidden": true, children: "\u2726" }),
253
+ streaming ? "thinking" : "ShipIt"
254
+ ] }),
255
+ /* @__PURE__ */ jsxs4(
256
+ "div",
257
+ {
258
+ className: cn4(
259
+ "rounded-m-card text-m-body max-w-[85%] px-[14px] py-3 leading-normal",
260
+ isAssistant ? "bg-panel border-border border" : "bg-accent text-on-accent"
261
+ ),
262
+ children: [
263
+ children,
264
+ streaming && /* @__PURE__ */ jsx4(
265
+ "span",
266
+ {
267
+ "aria-hidden": true,
268
+ className: "bg-accent ml-[2px] inline-block h-4 w-px animate-[ship-pulse_1s_infinite] align-middle"
269
+ }
270
+ )
271
+ ]
272
+ }
273
+ )
274
+ ]
275
+ }
276
+ );
277
+ }
229
278
  return /* @__PURE__ */ jsxs4(
230
279
  "div",
231
280
  {
@@ -1280,6 +1329,88 @@ function entityTypeColumn(options = {}) {
1280
1329
  cell: (row) => /* @__PURE__ */ jsx24(EntityBadge, { type: row.type, size: "sm" })
1281
1330
  };
1282
1331
  }
1332
+
1333
+ // src/notifications/NotifRow.tsx
1334
+ import { cn as cn22 } from "@ship-it-ui/ui";
1335
+ import { forwardRef as forwardRef24 } from "react";
1336
+ import { Fragment as Fragment5, jsx as jsx25, jsxs as jsxs24 } from "react/jsx-runtime";
1337
+ var toneClass = {
1338
+ ok: "bg-ok",
1339
+ warn: "bg-warn",
1340
+ err: "bg-err",
1341
+ neutral: "bg-accent-text"
1342
+ };
1343
+ var NotifRow = forwardRef24(function NotifRow2({
1344
+ title,
1345
+ body,
1346
+ time,
1347
+ tone = "neutral",
1348
+ unread,
1349
+ isFirst,
1350
+ isLast,
1351
+ href,
1352
+ className,
1353
+ onClick,
1354
+ ...props
1355
+ }, ref) {
1356
+ const content = /* @__PURE__ */ jsxs24(Fragment5, { children: [
1357
+ /* @__PURE__ */ jsx25("div", { className: "pt-1", "aria-hidden": true, children: /* @__PURE__ */ jsx25(
1358
+ "div",
1359
+ {
1360
+ className: cn22("h-2 w-2 rounded-full", unread ? toneClass[tone] : "bg-border-strong")
1361
+ }
1362
+ ) }),
1363
+ /* @__PURE__ */ jsxs24("div", { className: "min-w-0 flex-1", children: [
1364
+ /* @__PURE__ */ jsxs24("div", { className: "flex items-baseline justify-between gap-2", children: [
1365
+ /* @__PURE__ */ jsx25("div", { className: "truncate text-[14px] font-medium tracking-tight", children: title }),
1366
+ time != null && /* @__PURE__ */ jsx25("span", { className: "text-text-muted shrink-0 font-mono text-[11px] whitespace-nowrap", children: time })
1367
+ ] }),
1368
+ body && /* @__PURE__ */ jsx25("div", { className: "text-text-muted mt-[3px] text-[13px] leading-tight", children: body })
1369
+ ] })
1370
+ ] });
1371
+ const baseClass = cn22(
1372
+ "flex gap-3 p-[14px] bg-panel border-border border-l border-r",
1373
+ isFirst ? "border-t rounded-t-m-card" : "",
1374
+ "border-b",
1375
+ isLast ? "rounded-b-m-card" : "",
1376
+ href || onClick ? "cursor-pointer hover:bg-panel-2" : "",
1377
+ className
1378
+ );
1379
+ if (href) {
1380
+ return /* @__PURE__ */ jsx25(
1381
+ "a",
1382
+ {
1383
+ ref,
1384
+ href,
1385
+ onClick,
1386
+ className: cn22(
1387
+ baseClass,
1388
+ "text-text focus-visible:ring-accent-dim no-underline outline-none focus-visible:ring-[3px]"
1389
+ ),
1390
+ ...props,
1391
+ children: content
1392
+ }
1393
+ );
1394
+ }
1395
+ if (onClick) {
1396
+ return /* @__PURE__ */ jsx25(
1397
+ "button",
1398
+ {
1399
+ type: "button",
1400
+ ref,
1401
+ onClick,
1402
+ className: cn22(
1403
+ baseClass,
1404
+ "focus-visible:ring-accent-dim text-left outline-none focus-visible:ring-[3px]"
1405
+ ),
1406
+ ...props,
1407
+ children: content
1408
+ }
1409
+ );
1410
+ }
1411
+ return /* @__PURE__ */ jsx25("div", { ref, className: baseClass, ...props, children: content });
1412
+ });
1413
+ NotifRow.displayName = "NotifRow";
1283
1414
  export {
1284
1415
  AskBar,
1285
1416
  CTAStrip,
@@ -1305,6 +1436,7 @@ export {
1305
1436
  GraphMinimap,
1306
1437
  GraphNode,
1307
1438
  Hero,
1439
+ NotifRow,
1308
1440
  PathOverlay,
1309
1441
  PricingCard,
1310
1442
  ReasoningBlock,
@@ -1312,7 +1444,7 @@ export {
1312
1444
  SuggestionChip,
1313
1445
  Testimonial,
1314
1446
  ToolCallCard,
1315
- cn22 as cn,
1447
+ cn23 as cn,
1316
1448
  entityColumn,
1317
1449
  entityTypeColumn,
1318
1450
  getEntityTypeMeta,