@upbound/monarch-blocks 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,16 +6,22 @@ declare function CodeBlock({ className, variant, size, ...props }: React.Compone
6
6
  size?: 'default' | 'sm';
7
7
  }): react_jsx_runtime.JSX.Element;
8
8
  declare function CodeBlockHeader({ className, ...props }: React.ComponentProps<'div'>): react_jsx_runtime.JSX.Element;
9
- declare function CodeBlockBody({ className, code, html, lineNumbers, maxHeight, copyButton, ...props }: React.ComponentProps<'div'> & {
9
+ declare function CodeBlockBody({ className, code, html, lineNumbers, maxHeight, copyButton, downloadButton, ...props }: React.ComponentProps<'div'> & {
10
10
  code: string;
11
11
  html?: string;
12
12
  lineNumbers?: boolean;
13
13
  maxHeight?: string;
14
14
  copyButton?: React.ReactNode;
15
+ downloadButton?: React.ReactNode;
15
16
  }): react_jsx_runtime.JSX.Element;
16
17
  declare function CodeBlockFooter({ className, ...props }: React.ComponentProps<'div'>): react_jsx_runtime.JSX.Element;
17
18
  declare function CodeBlockCopyButton({ code, className, ...props }: Omit<React.ComponentProps<'button'>, 'children'> & {
18
19
  code: string;
19
20
  }): react_jsx_runtime.JSX.Element;
21
+ declare function CodeBlockDownloadButton({ code, fileName, mimeType, className, ...props }: Omit<React.ComponentProps<'button'>, 'children'> & {
22
+ code: string;
23
+ fileName: string;
24
+ mimeType?: string;
25
+ }): react_jsx_runtime.JSX.Element;
20
26
 
21
- export { CodeBlock, CodeBlockBody, CodeBlockCopyButton, CodeBlockFooter, CodeBlockHeader };
27
+ export { CodeBlock, CodeBlockBody, CodeBlockCopyButton, CodeBlockDownloadButton, CodeBlockFooter, CodeBlockHeader };
@@ -69,7 +69,15 @@ function cn(...inputs) {
69
69
  }
70
70
 
71
71
  // src/code-block.tsx
72
- import { Card, CardContent, CardFooter, CardHeader } from "@upbound/monarch-core";
72
+ import {
73
+ Card,
74
+ CardContent,
75
+ CardFooter,
76
+ CardHeader,
77
+ Tooltip,
78
+ TooltipContent,
79
+ TooltipTrigger
80
+ } from "@upbound/monarch-core";
73
81
  import { jsx, jsxs } from "react/jsx-runtime";
74
82
  function CodeBlock(_a) {
75
83
  var _b = _a, {
@@ -117,17 +125,22 @@ function CodeBlockBody(_a) {
117
125
  html,
118
126
  lineNumbers,
119
127
  maxHeight,
120
- copyButton
128
+ copyButton,
129
+ downloadButton
121
130
  } = _b, props = __objRest(_b, [
122
131
  "className",
123
132
  "code",
124
133
  "html",
125
134
  "lineNumbers",
126
135
  "maxHeight",
127
- "copyButton"
136
+ "copyButton",
137
+ "downloadButton"
128
138
  ]);
129
139
  return /* @__PURE__ */ jsxs(CardContent, __spreadProps(__spreadValues({ "data-line-numbers": lineNumbers || void 0, className: cn("relative p-0!", className) }, props), { children: [
130
- copyButton && /* @__PURE__ */ jsx("div", { className: "absolute top-2 right-2 z-10 opacity-0 transition-opacity group-hover/code-block:opacity-100", children: copyButton }),
140
+ (copyButton || downloadButton) && /* @__PURE__ */ jsxs("div", { className: "absolute top-2 right-2 z-10 flex items-center gap-1 opacity-0 transition-opacity group-hover/code-block:opacity-100", children: [
141
+ copyButton,
142
+ downloadButton
143
+ ] }),
131
144
  /* @__PURE__ */ jsx(
132
145
  "div",
133
146
  {
@@ -173,28 +186,79 @@ function CodeBlockCopyButton(_a) {
173
186
  setCopied(true);
174
187
  setTimeout(() => setCopied(false), 2e3);
175
188
  };
176
- return /* @__PURE__ */ jsx(
177
- "button",
178
- __spreadProps(__spreadValues({
179
- "data-slot": "code-block-copy-button",
180
- onClick: handleCopy,
181
- className: cn(
182
- "border-border bg-background inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded-md border motion-safe:transition-colors",
183
- "text-muted-foreground hover:bg-accent hover:text-foreground",
184
- "focus-visible:ring-ring/30 focus-visible:ring-2 focus-visible:outline-none",
185
- "group-data-[variant=terminal]/code-block:border-terminal-border group-data-[variant=terminal]/code-block:bg-terminal-bg group-data-[variant=terminal]/code-block:text-terminal-muted group-data-[variant=terminal]/code-block:hover:bg-terminal-muted-hover-bg group-data-[variant=terminal]/code-block:hover:text-terminal-muted-hover-fg",
186
- className
187
- ),
188
- "aria-label": copied ? "Copied" : "Copy code"
189
- }, props), {
190
- children: copied ? /* @__PURE__ */ jsx(Icon, { name: "check", size: "sm", className: "text-green-500" }) : /* @__PURE__ */ jsx(Icon, { name: "copy", size: "sm" })
191
- })
192
- );
189
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [
190
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
191
+ "button",
192
+ __spreadProps(__spreadValues({
193
+ "data-slot": "code-block-copy-button",
194
+ onClick: handleCopy,
195
+ className: cn(
196
+ "border-border bg-background inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded-md border motion-safe:transition-colors",
197
+ "text-muted-foreground hover:bg-accent hover:text-foreground",
198
+ "focus-visible:ring-ring/30 focus-visible:ring-2 focus-visible:outline-none",
199
+ "group-data-[variant=terminal]/code-block:border-terminal-border group-data-[variant=terminal]/code-block:bg-terminal-bg group-data-[variant=terminal]/code-block:text-terminal-muted group-data-[variant=terminal]/code-block:hover:bg-terminal-muted-hover-bg group-data-[variant=terminal]/code-block:hover:text-terminal-muted-hover-fg",
200
+ className
201
+ ),
202
+ "aria-label": copied ? "Copied" : "Copy code"
203
+ }, props), {
204
+ children: copied ? /* @__PURE__ */ jsx(Icon, { name: "check", size: "sm", className: "text-green-500" }) : /* @__PURE__ */ jsx(Icon, { name: "copy", size: "sm" })
205
+ })
206
+ ) }),
207
+ /* @__PURE__ */ jsx(TooltipContent, { children: copied ? "Copied" : "Copy" })
208
+ ] });
209
+ }
210
+ function CodeBlockDownloadButton(_a) {
211
+ var _b = _a, {
212
+ code,
213
+ fileName,
214
+ mimeType = "text/plain",
215
+ className
216
+ } = _b, props = __objRest(_b, [
217
+ "code",
218
+ "fileName",
219
+ "mimeType",
220
+ "className"
221
+ ]);
222
+ const [downloaded, setDownloaded] = useState(false);
223
+ const handleDownload = () => {
224
+ const blob = new Blob([code], { type: mimeType });
225
+ const url = URL.createObjectURL(blob);
226
+ const link = document.createElement("a");
227
+ link.href = url;
228
+ link.download = fileName;
229
+ document.body.appendChild(link);
230
+ link.click();
231
+ document.body.removeChild(link);
232
+ URL.revokeObjectURL(url);
233
+ setDownloaded(true);
234
+ setTimeout(() => setDownloaded(false), 2e3);
235
+ };
236
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [
237
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
238
+ "button",
239
+ __spreadProps(__spreadValues({
240
+ "data-slot": "code-block-download-button",
241
+ onClick: handleDownload,
242
+ className: cn(
243
+ "border-border bg-background inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded-md border motion-safe:transition-colors",
244
+ "text-muted-foreground hover:bg-accent hover:text-foreground",
245
+ "focus-visible:ring-ring/30 focus-visible:ring-2 focus-visible:outline-none",
246
+ "group-data-[variant=terminal]/code-block:border-terminal-border group-data-[variant=terminal]/code-block:bg-terminal-bg group-data-[variant=terminal]/code-block:text-terminal-muted group-data-[variant=terminal]/code-block:hover:bg-terminal-muted-hover-bg group-data-[variant=terminal]/code-block:hover:text-terminal-muted-hover-fg",
247
+ className
248
+ ),
249
+ "aria-label": downloaded ? "Downloaded" : "Download code"
250
+ }, props), {
251
+ children: downloaded ? /* @__PURE__ */ jsx(Icon, { name: "check", size: "sm", className: "text-green-500" }) : /* @__PURE__ */ jsx(Icon, { name: "download", size: "sm" })
252
+ })
253
+ ) }),
254
+ /* @__PURE__ */ jsx(TooltipContent, { children: downloaded ? "Downloaded" : "Download" })
255
+ ] });
193
256
  }
194
257
  export {
195
258
  CodeBlock,
196
259
  CodeBlockBody,
197
260
  CodeBlockCopyButton,
261
+ CodeBlockDownloadButton,
198
262
  CodeBlockFooter,
199
263
  CodeBlockHeader
200
264
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/code-block.tsx","../src/lib/utils.ts"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useState } from 'react';\nimport { Icon } from '@upbound/monarch-core';\n\nimport { cn } from '@/lib/utils';\nimport { Card, CardContent, CardFooter, CardHeader } from '@upbound/monarch-core';\n\nfunction CodeBlock({\n className,\n variant = 'default',\n size = 'default',\n ...props\n}: React.ComponentProps<'div'> & {\n variant?: 'default' | 'terminal';\n size?: 'default' | 'sm';\n}) {\n return (\n <Card\n data-slot=\"code-block\"\n data-variant={variant}\n data-size={size}\n role=\"region\"\n className={cn(\n 'group/code-block gap-0 overflow-hidden py-0',\n size === 'default' && 'text-[13px]',\n size === 'sm' && 'text-body-sm',\n variant === 'terminal' && 'border-terminal-border bg-terminal-bg text-terminal-fg ring-0',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CodeBlockHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <CardHeader\n className={cn(\n 'group-data-[variant=terminal]/code-block:border-terminal-border group-data-[variant=terminal]/code-block:bg-terminal-bg group-data-[variant=terminal]/code-block:text-terminal-muted flex flex-row items-center gap-2 border-b bg-[color-mix(in_oklch,var(--muted)_50%,var(--card))] py-4',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CodeBlockBody({\n className,\n code,\n html,\n lineNumbers,\n maxHeight,\n copyButton,\n ...props\n}: React.ComponentProps<'div'> & {\n code: string;\n html?: string;\n lineNumbers?: boolean;\n maxHeight?: string;\n copyButton?: React.ReactNode;\n}) {\n // Layout note: the copy button must stay anchored to the top-right of the\n // visible code area when the content scrolls horizontally. To make that\n // work the relative containing block (CardContent) must NOT be the\n // scrollable element — otherwise `right`-positioning is computed against\n // the scrolled content edge and the button moves with the scroll. So the\n // overflow lives on an inner wrapper and the absolute button is its\n // sibling under CardContent.\n return (\n <CardContent data-line-numbers={lineNumbers || undefined} className={cn('relative p-0!', className)} {...props}>\n {copyButton && (\n <div className=\"absolute top-2 right-2 z-10 opacity-0 transition-opacity group-hover/code-block:opacity-100\">\n {copyButton}\n </div>\n )}\n <div\n className={cn('overflow-x-auto', maxHeight && 'overflow-y-auto')}\n style={maxHeight ? { maxHeight } : undefined}\n >\n {html ? (\n <div\n className=\"[&_code]:font-mono [&_pre]:m-0 [&_pre]:bg-transparent! [&_pre]:p-4 group-data-[size=sm]/code-block:[&_pre]:p-3\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n ) : lineNumbers ? (\n <pre className=\"p-4 group-data-[size=sm]/code-block:p-3\">\n <code className=\"font-mono\">\n {code.split('\\n').map((line, i) => (\n <span key={i} className=\"line\">\n {line}\n {'\\n'}\n </span>\n ))}\n </code>\n </pre>\n ) : (\n <pre className=\"p-4 group-data-[size=sm]/code-block:p-3\">\n <code className=\"font-mono whitespace-pre\">{code}</code>\n </pre>\n )}\n </div>\n </CardContent>\n );\n}\n\nfunction CodeBlockFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <CardFooter\n className={cn(\n 'text-body-sm group-data-[variant=terminal]/code-block:border-terminal-border group-data-[variant=terminal]/code-block:bg-terminal-footer-bg group-data-[variant=terminal]/code-block:text-terminal-muted',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CodeBlockCopyButton({\n code,\n className,\n ...props\n}: Omit<React.ComponentProps<'button'>, 'children'> & {\n code: string;\n}) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n return (\n <button\n data-slot=\"code-block-copy-button\"\n onClick={handleCopy}\n className={cn(\n 'border-border bg-background inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded-md border motion-safe:transition-colors',\n 'text-muted-foreground hover:bg-accent hover:text-foreground',\n 'focus-visible:ring-ring/30 focus-visible:ring-2 focus-visible:outline-none',\n 'group-data-[variant=terminal]/code-block:border-terminal-border group-data-[variant=terminal]/code-block:bg-terminal-bg group-data-[variant=terminal]/code-block:text-terminal-muted group-data-[variant=terminal]/code-block:hover:bg-terminal-muted-hover-bg group-data-[variant=terminal]/code-block:hover:text-terminal-muted-hover-fg',\n className,\n )}\n aria-label={copied ? 'Copied' : 'Copy code'}\n {...props}\n >\n {copied ? <Icon name=\"check\" size=\"sm\" className=\"text-green-500\" /> : <Icon name=\"copy\" size=\"sm\" />}\n </button>\n );\n}\n\nexport { CodeBlock, CodeBlockHeader, CodeBlockBody, CodeBlockFooter, CodeBlockCopyButton };\n","import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n 'font-size': [\n {\n text: [\n 'display-hero',\n 'display-kpi-sm',\n 'display-kpi',\n 'display-kpi-lg',\n 'display-feature',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'body-lg',\n 'body',\n 'body-sm',\n 'caption',\n 'eyebrow',\n ],\n },\n ],\n },\n },\n});\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/code-block.tsx","../src/lib/utils.ts"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useState } from 'react';\nimport { Icon } from '@upbound/monarch-core';\n\nimport { cn } from '@/lib/utils';\nimport {\n Card,\n CardContent,\n CardFooter,\n CardHeader,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@upbound/monarch-core';\n\nfunction CodeBlock({\n className,\n variant = 'default',\n size = 'default',\n ...props\n}: React.ComponentProps<'div'> & {\n variant?: 'default' | 'terminal';\n size?: 'default' | 'sm';\n}) {\n return (\n <Card\n data-slot=\"code-block\"\n data-variant={variant}\n data-size={size}\n role=\"region\"\n className={cn(\n 'group/code-block gap-0 overflow-hidden py-0',\n size === 'default' && 'text-[13px]',\n size === 'sm' && 'text-body-sm',\n variant === 'terminal' && 'border-terminal-border bg-terminal-bg text-terminal-fg ring-0',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CodeBlockHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <CardHeader\n className={cn(\n 'group-data-[variant=terminal]/code-block:border-terminal-border group-data-[variant=terminal]/code-block:bg-terminal-bg group-data-[variant=terminal]/code-block:text-terminal-muted flex flex-row items-center gap-2 border-b bg-[color-mix(in_oklch,var(--muted)_50%,var(--card))] py-4',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CodeBlockBody({\n className,\n code,\n html,\n lineNumbers,\n maxHeight,\n copyButton,\n downloadButton,\n ...props\n}: React.ComponentProps<'div'> & {\n code: string;\n html?: string;\n lineNumbers?: boolean;\n maxHeight?: string;\n copyButton?: React.ReactNode;\n downloadButton?: React.ReactNode;\n}) {\n // Layout note: the copy/download buttons must stay anchored to the\n // top-right of the visible code area when the content scrolls\n // horizontally. To make that work the relative containing block\n // (CardContent) must NOT be the scrollable element — otherwise\n // `right`-positioning is computed against the scrolled content edge and\n // the buttons move with the scroll. So the overflow lives on an inner\n // wrapper and the absolute button group is its sibling under CardContent.\n return (\n <CardContent data-line-numbers={lineNumbers || undefined} className={cn('relative p-0!', className)} {...props}>\n {(copyButton || downloadButton) && (\n <div className=\"absolute top-2 right-2 z-10 flex items-center gap-1 opacity-0 transition-opacity group-hover/code-block:opacity-100\">\n {copyButton}\n {downloadButton}\n </div>\n )}\n <div\n className={cn('overflow-x-auto', maxHeight && 'overflow-y-auto')}\n style={maxHeight ? { maxHeight } : undefined}\n >\n {html ? (\n <div\n className=\"[&_code]:font-mono [&_pre]:m-0 [&_pre]:bg-transparent! [&_pre]:p-4 group-data-[size=sm]/code-block:[&_pre]:p-3\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n ) : lineNumbers ? (\n <pre className=\"p-4 group-data-[size=sm]/code-block:p-3\">\n <code className=\"font-mono\">\n {code.split('\\n').map((line, i) => (\n <span key={i} className=\"line\">\n {line}\n {'\\n'}\n </span>\n ))}\n </code>\n </pre>\n ) : (\n <pre className=\"p-4 group-data-[size=sm]/code-block:p-3\">\n <code className=\"font-mono whitespace-pre\">{code}</code>\n </pre>\n )}\n </div>\n </CardContent>\n );\n}\n\nfunction CodeBlockFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <CardFooter\n className={cn(\n 'text-body-sm group-data-[variant=terminal]/code-block:border-terminal-border group-data-[variant=terminal]/code-block:bg-terminal-footer-bg group-data-[variant=terminal]/code-block:text-terminal-muted',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CodeBlockCopyButton({\n code,\n className,\n ...props\n}: Omit<React.ComponentProps<'button'>, 'children'> & {\n code: string;\n}) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n data-slot=\"code-block-copy-button\"\n onClick={handleCopy}\n className={cn(\n 'border-border bg-background inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded-md border motion-safe:transition-colors',\n 'text-muted-foreground hover:bg-accent hover:text-foreground',\n 'focus-visible:ring-ring/30 focus-visible:ring-2 focus-visible:outline-none',\n 'group-data-[variant=terminal]/code-block:border-terminal-border group-data-[variant=terminal]/code-block:bg-terminal-bg group-data-[variant=terminal]/code-block:text-terminal-muted group-data-[variant=terminal]/code-block:hover:bg-terminal-muted-hover-bg group-data-[variant=terminal]/code-block:hover:text-terminal-muted-hover-fg',\n className,\n )}\n aria-label={copied ? 'Copied' : 'Copy code'}\n {...props}\n >\n {copied ? <Icon name=\"check\" size=\"sm\" className=\"text-green-500\" /> : <Icon name=\"copy\" size=\"sm\" />}\n </button>\n </TooltipTrigger>\n <TooltipContent>{copied ? 'Copied' : 'Copy'}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction CodeBlockDownloadButton({\n code,\n fileName,\n mimeType = 'text/plain',\n className,\n ...props\n}: Omit<React.ComponentProps<'button'>, 'children'> & {\n code: string;\n fileName: string;\n mimeType?: string;\n}) {\n const [downloaded, setDownloaded] = useState(false);\n\n const handleDownload = () => {\n const blob = new Blob([code], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n setDownloaded(true);\n setTimeout(() => setDownloaded(false), 2000);\n };\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n data-slot=\"code-block-download-button\"\n onClick={handleDownload}\n className={cn(\n 'border-border bg-background inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded-md border motion-safe:transition-colors',\n 'text-muted-foreground hover:bg-accent hover:text-foreground',\n 'focus-visible:ring-ring/30 focus-visible:ring-2 focus-visible:outline-none',\n 'group-data-[variant=terminal]/code-block:border-terminal-border group-data-[variant=terminal]/code-block:bg-terminal-bg group-data-[variant=terminal]/code-block:text-terminal-muted group-data-[variant=terminal]/code-block:hover:bg-terminal-muted-hover-bg group-data-[variant=terminal]/code-block:hover:text-terminal-muted-hover-fg',\n className,\n )}\n aria-label={downloaded ? 'Downloaded' : 'Download code'}\n {...props}\n >\n {downloaded ? <Icon name=\"check\" size=\"sm\" className=\"text-green-500\" /> : <Icon name=\"download\" size=\"sm\" />}\n </button>\n </TooltipTrigger>\n <TooltipContent>{downloaded ? 'Downloaded' : 'Download'}</TooltipContent>\n </Tooltip>\n );\n}\n\nexport { CodeBlock, CodeBlockHeader, CodeBlockBody, CodeBlockFooter, CodeBlockCopyButton, CodeBlockDownloadButton };\n","import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n 'font-size': [\n {\n text: [\n 'display-hero',\n 'display-kpi-sm',\n 'display-kpi',\n 'display-kpi-lg',\n 'display-feature',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'body-lg',\n 'body',\n 'body-sm',\n 'caption',\n 'eyebrow',\n ],\n },\n ],\n },\n },\n});\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":"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","names":[]}
@@ -2,8 +2,8 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { RowData, ColumnFilter, Cell, Column, ColumnOrderState, Row, ColumnDef, CellContext, HeaderGroup, TableOptions, TableState, InitialTableState, SortingFn, FilterFn, ExpandedState, ColumnFiltersState, PaginationState, SortingState, VisibilityState, ColumnPinningState, GroupingState, OnChangeFn, ColumnSizingState } from '@tanstack/react-table';
3
3
  import * as React$1 from 'react';
4
4
  import { ReactNode, Dispatch, SetStateAction, ComponentType } from 'react';
5
+ import { DropdownMenuItem, IconName } from '@upbound/monarch-core';
5
6
  import { f as CelFilterSchema, g as CelFilterTree, k as CompileResult, i as CelRestrictedOptionSelectPayload } from './types-BULiU2qC.js';
6
- import { IconName } from '@upbound/monarch-core';
7
7
 
8
8
  /** A single entry (or nested submenu) in a cell's contextual right-click menu, alongside the built-in "Filter by this value" item. */
9
9
  type ContextualMenuAction<TData extends RowData = RowData, TValue = unknown> = {
@@ -56,7 +56,7 @@ declare function RowActionItem({ disabled, className, tooltip, children, onClick
56
56
  className?: string;
57
57
  tooltip?: string;
58
58
  children: React$1.ReactNode;
59
- onClick?: () => void;
59
+ onClick?: React$1.ComponentProps<typeof DropdownMenuItem>['onClick'];
60
60
  }): react_jsx_runtime.JSX.Element;
61
61
  /** A ready-made right-pinned, non-sortable/filterable/hideable "Actions" column. */
62
62
  declare function getActionsColumnDefinition<TData extends RowData, TValue = unknown>({ cell, }: Pick<ColumnDef<TData, TValue>, 'cell'>): ColumnDef<TData, TValue>;
@@ -94,7 +94,7 @@ declare function TimestampCell({ timestamp }: {
94
94
  * Mirrors TableWrapper's `Filters/types.ts` shapes; `id` is omitted here since
95
95
  * it comes from the owning `ColumnDef.id`, not the filter definition itself.
96
96
  */
97
- type ColumnFilterType = 'checkbox' | 'radio' | 'dateRange' | 'scrollableCheckbox' | 'scrollableRadio' | 'text' | 'multiText';
97
+ type ColumnFilterType = 'checkbox' | 'radio' | 'dateRange' | 'text' | 'multiText';
98
98
  type ColumnFilterOption = {
99
99
  label: string;
100
100
  value: string;
@@ -117,19 +117,25 @@ type ColumnFilterBase = {
117
117
  order?: number;
118
118
  };
119
119
  type StaticCheckboxColumnFilter = ColumnFilterBase & {
120
- type: 'checkbox' | 'scrollableCheckbox';
120
+ type: 'checkbox';
121
121
  options: string[] | ColumnFilterOption[];
122
122
  fetchFilterOptions?: never;
123
+ /** Whether the chip's value popup is a searchable Combobox. Defaults to `true`. */
124
+ searchable?: boolean;
123
125
  };
124
126
  type AsyncCheckboxColumnFilter = ColumnFilterBase & {
125
- type: 'checkbox' | 'scrollableCheckbox';
127
+ type: 'checkbox';
126
128
  fetchFilterOptions: FetchColumnFilterOptions;
127
129
  options?: never;
130
+ /** Whether the chip's value popup is a searchable Combobox. Defaults to `true`. */
131
+ searchable?: boolean;
128
132
  };
129
133
  type CheckboxColumnFilter = StaticCheckboxColumnFilter | AsyncCheckboxColumnFilter;
130
134
  type RadioColumnFilter = ColumnFilterBase & {
131
- type: 'radio' | 'scrollableRadio';
135
+ type: 'radio';
132
136
  options: string[] | ColumnFilterOption[];
137
+ /** Whether the chip's value popup is a searchable Combobox. Defaults to `true`. */
138
+ searchable?: boolean;
133
139
  };
134
140
  type DateRangeColumnFilter = ColumnFilterBase & {
135
141
  type: 'dateRange';
@@ -495,10 +501,11 @@ type ViewFilterProps<TData extends RowData> = {
495
501
  * The plain (non-CEL) filter row — a thin state adapter over Monarch's
496
502
  * `FilterBar`, mirroring TableWrapper's own `ViewFilter` (itself just a
497
503
  * `FilterBar` adapter, not a hand-rolled UI). Every `meta.filter` shape
498
- * (checkbox/scrollableCheckbox, radio/scrollableRadio, dateRange, text,
499
- * multiText) gets a chip here, mapped onto the matching `FilterBar` chip
500
- * type. CEL-based filtering (`celFilterConfig`) is the richer, operator-driven
501
- * tier this is not meant to replace.
504
+ * (checkbox, radio, dateRange, text, multiText) gets a chip here, mapped onto
505
+ * the matching `FilterBar` chip type checkbox and radio chips are
506
+ * searchable by default (opt out per column via `meta.filter.searchable:
507
+ * false`). CEL-based filtering (`celFilterConfig`) is the richer,
508
+ * operator-driven tier this is not meant to replace.
502
509
  */
503
510
  declare function ViewFilter<TData extends RowData>({ columns, columnFilters, onColumnFiltersChange, className, }: ViewFilterProps<TData>): react_jsx_runtime.JSX.Element;
504
511
 
@@ -593,7 +593,7 @@ function RowActions({
593
593
  }) {
594
594
  return /* @__PURE__ */ jsxs3(DropdownMenu2, { children: [
595
595
  /* @__PURE__ */ jsx4(DropdownMenuTrigger2, { asChild: true, children: /* @__PURE__ */ jsx4(Button2, { variant: "ghost", size: "icon-xs", "aria-label": "Row actions", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx4(Icon2, { name: "ellipsis", size: "sm" }) }) }),
596
- /* @__PURE__ */ jsx4(DropdownMenuContent2, { align, className: contentClassName, children })
596
+ /* @__PURE__ */ jsx4(DropdownMenuContent2, { align, className: contentClassName, onClick: (event) => event.stopPropagation(), children })
597
597
  ] });
598
598
  }
599
599
  function RowActionItem({
@@ -2375,11 +2375,11 @@ function hasContextualFilterValue(value) {
2375
2375
  }
2376
2376
  function getDefaultContextualFilterValue(cell, filter) {
2377
2377
  const value = cell.getValue();
2378
- if (filter.type === "checkbox" || filter.type === "scrollableCheckbox" || filter.type === "multiText") {
2378
+ if (filter.type === "checkbox" || filter.type === "multiText") {
2379
2379
  const values = stringArrayFromValue(value);
2380
2380
  return values.length > 0 ? values : void 0;
2381
2381
  }
2382
- if (filter.type === "radio" || filter.type === "scrollableRadio" || filter.type === "text") {
2382
+ if (filter.type === "radio" || filter.type === "text") {
2383
2383
  return valueToString(value);
2384
2384
  }
2385
2385
  return void 0;
@@ -2399,7 +2399,7 @@ function getContextualGlobalSearch(cell) {
2399
2399
  return valueToString(globalSearchValue(cell));
2400
2400
  }
2401
2401
  function mergeColumnFilter(columnFilters, nextFilter, filterDefinition) {
2402
- const shouldMergeArrayValue = (filterDefinition == null ? void 0 : filterDefinition.type) === "checkbox" || (filterDefinition == null ? void 0 : filterDefinition.type) === "scrollableCheckbox" || (filterDefinition == null ? void 0 : filterDefinition.type) === "multiText";
2402
+ const shouldMergeArrayValue = (filterDefinition == null ? void 0 : filterDefinition.type) === "checkbox" || (filterDefinition == null ? void 0 : filterDefinition.type) === "multiText";
2403
2403
  if (!shouldMergeArrayValue) {
2404
2404
  return [...columnFilters.filter((filter) => filter.id !== nextFilter.id), nextFilter];
2405
2405
  }
@@ -2415,10 +2415,10 @@ function getColumnFilterCount(filterValue, filter) {
2415
2415
  const isCheckboxValue = (value) => value === void 0 || Array.isArray(value) && value.every((item) => typeof item === "string");
2416
2416
  const isRadioValue = (value) => value === void 0 || typeof value === "string";
2417
2417
  const isDateRangeValue = (value) => value === void 0 || typeof value === "object" && value !== null && "startDate" in value && "endDate" in value;
2418
- if ((filter == null ? void 0 : filter.type) === "checkbox" || (filter == null ? void 0 : filter.type) === "scrollableCheckbox") {
2418
+ if ((filter == null ? void 0 : filter.type) === "checkbox") {
2419
2419
  return isCheckboxValue(filterValue) ? (filterValue || []).length : 0;
2420
2420
  }
2421
- if ((filter == null ? void 0 : filter.type) === "radio" || (filter == null ? void 0 : filter.type) === "scrollableRadio") {
2421
+ if ((filter == null ? void 0 : filter.type) === "radio") {
2422
2422
  return isRadioValue(filterValue) && filterValue !== void 0 ? 1 : 0;
2423
2423
  }
2424
2424
  if ((filter == null ? void 0 : filter.type) === "dateRange") {
@@ -4187,8 +4187,8 @@ function DateFilterChip({
4187
4187
 
4188
4188
  // src/lib/data-table/filter-types.ts
4189
4189
  var isDateRangeColumnFilter = (definition) => definition.type === "dateRange";
4190
- var isRadioColumnFilter = (definition) => definition.type === "radio" || definition.type === "scrollableRadio";
4191
- var isCheckboxColumnFilter = (definition) => definition.type === "checkbox" || definition.type === "scrollableCheckbox";
4190
+ var isRadioColumnFilter = (definition) => definition.type === "radio";
4191
+ var isCheckboxColumnFilter = (definition) => definition.type === "checkbox";
4192
4192
  var isMultiTextColumnFilter = (definition) => definition.type === "multiText";
4193
4193
 
4194
4194
  // src/data-table/view-filter.tsx
@@ -4197,21 +4197,21 @@ function toFilterOption(opt) {
4197
4197
  return typeof opt === "string" ? { value: opt, label: opt } : { value: opt.value, label: opt.label };
4198
4198
  }
4199
4199
  function toFilterBarDefinition(key, filter) {
4200
- var _a;
4200
+ var _a, _b, _c;
4201
4201
  const base = { key, label: filter.title, order: (_a = filter.order) != null ? _a : 0 };
4202
4202
  if (isCheckboxColumnFilter(filter)) {
4203
4203
  const options = "options" in filter && filter.options ? filter.options : [];
4204
4204
  return __spreadProps(__spreadValues({}, base), {
4205
4205
  type: "checkbox",
4206
4206
  options: options.map(toFilterOption),
4207
- searchable: filter.type === "scrollableCheckbox"
4207
+ searchable: (_b = filter.searchable) != null ? _b : true
4208
4208
  });
4209
4209
  }
4210
4210
  if (isRadioColumnFilter(filter)) {
4211
4211
  return __spreadProps(__spreadValues({}, base), {
4212
4212
  type: "radio",
4213
4213
  options: filter.options.map(toFilterOption),
4214
- searchable: filter.type === "scrollableRadio"
4214
+ searchable: (_c = filter.searchable) != null ? _c : true
4215
4215
  });
4216
4216
  }
4217
4217
  if (isDateRangeColumnFilter(filter)) {