@mastra/playground-ui 51.3.1 → 51.4.0-alpha.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.
- package/CHANGELOG.md +57 -0
- package/dist/Badge-DcllBqFg.cjs +125 -0
- package/dist/Badge-DcllBqFg.cjs.map +1 -0
- package/dist/Badge-uGehUtus.js +123 -0
- package/dist/Badge-uGehUtus.js.map +1 -0
- package/dist/components/Badge.cjs.js +1 -1
- package/dist/components/Badge.es.js +1 -1
- package/dist/components/DataList.cjs.js +4 -4
- package/dist/components/DataList.es.js +4 -4
- package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
- package/dist/components/ItemList.cjs.js +59 -40
- package/dist/components/ItemList.cjs.js.map +1 -1
- package/dist/components/ItemList.es.js +58 -41
- package/dist/components/ItemList.es.js.map +1 -1
- package/dist/components/LogsDataList.cjs.js +2 -3
- package/dist/components/LogsDataList.cjs.js.map +1 -1
- package/dist/components/LogsDataList.es.js +2 -3
- package/dist/components/LogsDataList.es.js.map +1 -1
- package/dist/components/ai/ask-user.cjs.js +3 -3
- package/dist/components/ai/ask-user.cjs.js.map +1 -1
- package/dist/components/ai/ask-user.es.js +3 -3
- package/dist/components/ai/ask-user.es.js.map +1 -1
- package/dist/components/ai/plan.cjs.js +3 -3
- package/dist/components/ai/plan.cjs.js.map +1 -1
- package/dist/components/ai/plan.es.js +3 -3
- package/dist/components/ai/plan.es.js.map +1 -1
- package/dist/{data-list-BOI8fRuk.js → data-list-C3tjx5Vb.js} +2 -2
- package/dist/{data-list-BOI8fRuk.js.map → data-list-C3tjx5Vb.js.map} +1 -1
- package/dist/{data-list-CCacNODd.cjs → data-list-CRDewYj9.cjs} +2 -2
- package/dist/{data-list-CCacNODd.cjs.map → data-list-CRDewYj9.cjs.map} +1 -1
- package/dist/{data-list-skeleton-DDO_OE14.js → data-list-skeleton-BCrkk6wG.js} +2 -2
- package/dist/{data-list-skeleton-DDO_OE14.js.map → data-list-skeleton-BCrkk6wG.js.map} +1 -1
- package/dist/{data-list-skeleton-BHBSIQHN.cjs → data-list-skeleton-CONfqzH2.cjs} +2 -2
- package/dist/{data-list-skeleton-BHBSIQHN.cjs.map → data-list-skeleton-CONfqzH2.cjs.map} +1 -1
- package/dist/{data-list-top-cell-BOXO5s7I.cjs → data-list-top-cell-DAztx3m8.cjs} +6 -1
- package/dist/data-list-top-cell-DAztx3m8.cjs.map +1 -0
- package/dist/{data-list-top-cell-CC5jjv5s.js → data-list-top-cell-hNkk6S-Q.js} +6 -2
- package/dist/data-list-top-cell-hNkk6S-Q.js.map +1 -0
- package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
- package/dist/domains/logs/components/logs-list-view.es.js +2 -2
- package/dist/domains/metrics/components/memory-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/memory-card-view.es.js +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.es.js +1 -1
- package/dist/domains/traces/components/format-hierarchical-spans.cjs.js +2 -1
- package/dist/domains/traces/components/format-hierarchical-spans.cjs.js.map +1 -1
- package/dist/domains/traces/components/format-hierarchical-spans.es.js +2 -1
- package/dist/domains/traces/components/format-hierarchical-spans.es.js.map +1 -1
- package/dist/domains/traces/components/timeline-name-col.cjs.js +10 -1
- package/dist/domains/traces/components/timeline-name-col.cjs.js.map +1 -1
- package/dist/domains/traces/components/timeline-name-col.es.js +10 -1
- package/dist/domains/traces/components/timeline-name-col.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +12 -4
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +12 -4
- package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +7 -9
- package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.es.js +7 -9
- package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-search.cjs.js +10 -4
- package/dist/domains/traces/hooks/use-trace-search.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-search.es.js +10 -4
- package/dist/domains/traces/hooks/use-trace-search.es.js.map +1 -1
- package/dist/domains/traces/trace-list-columns.cjs.js +1 -1
- package/dist/domains/traces/trace-list-columns.cjs.js.map +1 -1
- package/dist/domains/traces/trace-list-columns.es.js +1 -1
- package/dist/domains/traces/trace-list-columns.es.js.map +1 -1
- package/dist/domains/traces/types.cjs.js.map +1 -1
- package/dist/domains/traces/types.es.js.map +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
- package/dist/hooks/use-text-highlight.cjs.js +28 -2
- package/dist/hooks/use-text-highlight.cjs.js.map +1 -1
- package/dist/hooks/use-text-highlight.es.js +28 -2
- package/dist/hooks/use-text-highlight.es.js.map +1 -1
- package/dist/{logs-data-list-Xayqbjw4.cjs → logs-data-list-D88JF2lo.cjs} +2 -2
- package/dist/{logs-data-list-Xayqbjw4.cjs.map → logs-data-list-D88JF2lo.cjs.map} +1 -1
- package/dist/{logs-data-list-DRXJ89IZ.js → logs-data-list-DnAXTwr7.js} +2 -2
- package/dist/{logs-data-list-DRXJ89IZ.js.map → logs-data-list-DnAXTwr7.js.map} +1 -1
- package/dist/src/domains/metrics/hooks/use-active-resources-kpi-metrics.d.ts +2 -2
- package/dist/src/domains/metrics/hooks/use-active-threads-kpi-metrics.d.ts +2 -2
- package/dist/src/domains/metrics/hooks/use-agent-runs-kpi-metrics.d.ts +2 -2
- package/dist/src/domains/traces/components/format-hierarchical-spans.d.ts +1 -0
- package/dist/src/domains/traces/components/trace-data-panel-view.d.ts +1 -1
- package/dist/src/domains/traces/hooks/use-trace-search.d.ts +7 -0
- package/dist/src/domains/traces/types.d.ts +5 -0
- package/dist/src/ds/components/Badge/Badge.d.ts +86 -12
- package/dist/src/ds/components/Badge/badge.stories.d.ts +3 -0
- package/dist/src/ds/components/DataList/TracesDataList/traces-data-list.d.ts +2 -3
- package/dist/src/ds/components/DataList/data-list-cells.d.ts +5 -0
- package/dist/src/ds/components/ItemList/helpers.d.ts +8 -0
- package/dist/src/ds/components/ItemList/item-list-link-cell.d.ts +2 -1
- package/dist/src/ds/components/ItemList/item-list-row-button.d.ts +2 -1
- package/dist/src/ds/components/ai/plan/plan.d.ts +1 -1
- package/dist/src/hooks/use-text-highlight.d.ts +5 -0
- package/dist/src/test/highlight-api.d.ts +6 -4
- package/dist/style.css +364 -219
- package/dist/{traces-data-list-BLZgf-Es.cjs → traces-data-list-COksp2d4.cjs} +12 -13
- package/dist/traces-data-list-COksp2d4.cjs.map +1 -0
- package/dist/{traces-data-list-DmXGwe4Q.js → traces-data-list-c5I-8hwt.js} +12 -13
- package/dist/traces-data-list-c5I-8hwt.js.map +1 -0
- package/dist/use-text-highlight.css +8 -0
- package/package.json +7 -7
- package/theme.css +53 -0
- package/dist/Badge-BlJpI3fY.cjs +0 -57
- package/dist/Badge-BlJpI3fY.cjs.map +0 -1
- package/dist/Badge-woV6OD8k.js +0 -55
- package/dist/Badge-woV6OD8k.js.map +0 -1
- package/dist/chip-9P9t0dvN.cjs +0 -68
- package/dist/chip-9P9t0dvN.cjs.map +0 -1
- package/dist/chip-Bg0-95sX.js +0 -66
- package/dist/chip-Bg0-95sX.js.map +0 -1
- package/dist/components/Chip.cjs.js +0 -27
- package/dist/components/Chip.cjs.js.map +0 -1
- package/dist/components/Chip.d.ts +0 -2
- package/dist/components/Chip.es.js +0 -22
- package/dist/components/Chip.es.js.map +0 -1
- package/dist/components/StatusBadge.cjs.js +0 -76
- package/dist/components/StatusBadge.cjs.js.map +0 -1
- package/dist/components/StatusBadge.d.ts +0 -2
- package/dist/components/StatusBadge.es.js +0 -72
- package/dist/components/StatusBadge.es.js.map +0 -1
- package/dist/data-list-top-cell-BOXO5s7I.cjs.map +0 -1
- package/dist/data-list-top-cell-CC5jjv5s.js.map +0 -1
- package/dist/src/ds/components/Chip/chip.d.ts +0 -8
- package/dist/src/ds/components/Chip/chip.stories.d.ts +0 -11
- package/dist/src/ds/components/Chip/chips-group.d.ts +0 -2
- package/dist/src/ds/components/Chip/index.d.ts +0 -2
- package/dist/src/ds/components/StatusBadge/StatusBadge.d.ts +0 -13
- package/dist/src/ds/components/StatusBadge/index.d.ts +0 -2
- package/dist/src/ds/components/StatusBadge/status-badge.stories.d.ts +0 -8
- package/dist/traces-data-list-BLZgf-Es.cjs.map +0 -1
- package/dist/traces-data-list-DmXGwe4Q.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-user.cjs.js","sources":["../../../src/ds/components/ai/ask-user/ask-user.tsx"],"sourcesContent":["import { useId, useState } from 'react';\nimport type { ComponentProps, KeyboardEvent, ReactNode } from 'react';\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { Input } from '@/ds/components/Input';\nimport { cn } from '@/lib/utils';\n\nexport type AskUserSelectionMode = 'single_select' | 'multi_select';\nexport type AskUserAnswer = string | string[];\n\nexport interface AskUserOption {\n label: string;\n description?: string;\n}\n\nexport interface AskUserPayload {\n question: string;\n options?: AskUserOption[];\n selectionMode?: AskUserSelectionMode;\n}\n\nexport interface AskUserResult {\n content: string;\n isError?: boolean;\n}\n\nexport const AskUserContainer = ({ className, ...props }: ComponentProps<'div'>) => (\n <div className={cn('rounded-lg border border-border1 bg-surface2 p-3 text-sm', className)} {...props} />\n);\n\nexport const AskUserQuestion = ({ className, ...props }: ComponentProps<'legend'>) => (\n <legend className={cn('mb-3 font-medium text-neutral6', className)} {...props} />\n);\n\nexport const AskUserOptionDescription = ({ className, ...props }: ComponentProps<'span'>) => (\n <span className={cn('block text-ui-xs font-normal text-neutral3', className)} {...props} />\n);\n\ninterface AskUserOptionControlProps extends Omit<ComponentProps<'input'>, 'type'> {\n type: 'radio' | 'checkbox';\n label: string;\n description?: string;\n}\n\nexport const AskUserOptionControl = ({ type, label, description, className, ...props }: AskUserOptionControlProps) => (\n <label\n className={cn(\n 'flex cursor-pointer items-start gap-2 rounded-md border border-border1 bg-surface3 px-3 py-2 text-neutral5 transition-colors hover:bg-surface4 has-[:checked]:border-border2 has-[:checked]:bg-surface4 has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-50',\n className,\n )}\n >\n <input type={type} className=\"mt-0.5 accent-current\" {...props} />\n <span>\n <span className=\"block\">{label}</span>\n {description ? <AskUserOptionDescription>{description}</AskUserOptionDescription> : null}\n </span>\n </label>\n);\n\nexport const AskUserSubmit = ({ children = 'Submit answer', ...props }: ComponentProps<typeof Button>) => (\n <Button type=\"button\" size=\"sm\" variant=\"primary\" {...props}>\n {children}\n </Button>\n);\n\nexport const AskUserPending = ({ children = 'Submitting…', className, ...props }: ComponentProps<'span'>) => (\n <span role=\"status\" className={cn('text-ui-xs text-neutral3', className)} {...props}>\n {children}\n </span>\n);\n\nexport interface AskUserOutputProps extends ComponentProps<'div'> {\n result: AskUserResult;\n}\n\nexport const AskUserOutput = ({ result, className, ...props }: AskUserOutputProps) => (\n <div\n role={result.isError ? 'alert' : 'status'}\n className={cn('space-y-2 rounded-md bg-surface3 p-3 text-neutral5', result.isError && 'text-error', className)}\n {...props}\n >\n <Badge size=\"xs\" variant={result.isError ? 'error' : 'success'}>\n {result.isError ? 'Error' : 'Answered'}\n </Badge>\n <p>{result.content}</p>\n </div>\n);\n\nexport interface AskUserProps extends Omit<ComponentProps<typeof AskUserContainer>, 'children' | 'onSubmit'> {\n payload: AskUserPayload;\n result?: AskUserResult;\n isAnswered?: boolean;\n isSubmitting?: boolean;\n onSubmit: (answer: AskUserAnswer) => void;\n footer?: ReactNode;\n}\n\nconst validOptions = (options: AskUserPayload['options']): AskUserOption[] =>\n options?.filter((option): option is AskUserOption =>\n Boolean(option && typeof option.label === 'string' && option.label),\n ) ?? [];\n\ninterface AskUserInputProps extends AskUserProps {\n options: AskUserOption[];\n}\n\nconst AskUserInput = ({\n payload,\n options,\n result,\n isAnswered = false,\n isSubmitting = false,\n onSubmit,\n footer,\n ...props\n}: AskUserInputProps) => {\n const inputId = useId();\n const [text, setText] = useState('');\n const [selected, setSelected] = useState<string[]>([]);\n\n if (result || isAnswered) {\n return (\n <AskUserContainer data-testid=\"ask-user\" {...props}>\n <p className=\"text-neutral6 mb-2 font-medium\">{payload.question}</p>\n {result ? <AskUserOutput result={result} /> : <Badge variant=\"success\">Answered</Badge>}\n </AskUserContainer>\n );\n }\n\n const submitText = () => {\n const answer = text.trim();\n if (answer && !isSubmitting) onSubmit(answer);\n };\n\n const handleTextKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n submitText();\n }\n };\n\n if (options.length === 0) {\n return (\n <AskUserContainer data-testid=\"ask-user\" {...props}>\n <label className=\"text-neutral6 mb-2 block font-medium\" htmlFor={inputId}>\n {payload.question}\n </label>\n <div className=\"flex items-center gap-2\">\n <Input\n id={inputId}\n value={text}\n onChange={event => setText(event.target.value)}\n onKeyDown={handleTextKeyDown}\n placeholder=\"Type your answer...\"\n disabled={isSubmitting}\n size=\"sm\"\n />\n <AskUserSubmit aria-label=\"Submit answer\" disabled={isSubmitting || !text.trim()} onClick={submitText}>\n Submit\n </AskUserSubmit>\n </div>\n {isSubmitting ? <AskUserPending className=\"mt-2 block\" /> : null}\n {footer}\n </AskUserContainer>\n );\n }\n\n const isMulti = payload.selectionMode === 'multi_select';\n return (\n <AskUserContainer data-testid=\"ask-user\" {...props}>\n <fieldset disabled={isSubmitting} className=\"space-y-2\">\n <AskUserQuestion>{payload.question}</AskUserQuestion>\n {options.map(option => {\n const checked = selected.includes(option.label);\n return (\n <AskUserOptionControl\n key={option.label}\n type={isMulti ? 'checkbox' : 'radio'}\n name={inputId}\n label={option.label}\n description={option.description}\n disabled={isSubmitting}\n checked={checked}\n onChange={() => {\n if (isSubmitting) return;\n if (!isMulti) {\n setSelected([option.label]);\n onSubmit(option.label);\n return;\n }\n setSelected(current =>\n current.includes(option.label)\n ? current.filter(selectedLabel => selectedLabel !== option.label)\n : [...current, option.label],\n );\n }}\n />\n );\n })}\n {isMulti ? (\n <AskUserSubmit disabled={isSubmitting || selected.length === 0} onClick={() => onSubmit(selected)}>\n Submit answer\n </AskUserSubmit>\n ) : null}\n {isSubmitting ? <AskUserPending /> : null}\n {footer}\n </fieldset>\n </AskUserContainer>\n );\n};\n\nexport const AskUser = ({ payload, ...props }: AskUserProps) => {\n const options = validOptions(payload.options);\n const payloadKey = JSON.stringify([payload.question, options.map(option => option.label), payload.selectionMode]);\n\n return <AskUserInput key={payloadKey} payload={payload} options={options} {...props} />;\n};\n"],"names":["jsx","cn","jsxs","Button","Badge","useId","useState","Input"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ask-user.cjs.js","sources":["../../../src/ds/components/ai/ask-user/ask-user.tsx"],"sourcesContent":["import { useId, useState } from 'react';\nimport type { ComponentProps, KeyboardEvent, ReactNode } from 'react';\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { Input } from '@/ds/components/Input';\nimport { cn } from '@/lib/utils';\n\nexport type AskUserSelectionMode = 'single_select' | 'multi_select';\nexport type AskUserAnswer = string | string[];\n\nexport interface AskUserOption {\n label: string;\n description?: string;\n}\n\nexport interface AskUserPayload {\n question: string;\n options?: AskUserOption[];\n selectionMode?: AskUserSelectionMode;\n}\n\nexport interface AskUserResult {\n content: string;\n isError?: boolean;\n}\n\nexport const AskUserContainer = ({ className, ...props }: ComponentProps<'div'>) => (\n <div className={cn('rounded-lg border border-border1 bg-surface2 p-3 text-sm', className)} {...props} />\n);\n\nexport const AskUserQuestion = ({ className, ...props }: ComponentProps<'legend'>) => (\n <legend className={cn('mb-3 font-medium text-neutral6', className)} {...props} />\n);\n\nexport const AskUserOptionDescription = ({ className, ...props }: ComponentProps<'span'>) => (\n <span className={cn('block text-ui-xs font-normal text-neutral3', className)} {...props} />\n);\n\ninterface AskUserOptionControlProps extends Omit<ComponentProps<'input'>, 'type'> {\n type: 'radio' | 'checkbox';\n label: string;\n description?: string;\n}\n\nexport const AskUserOptionControl = ({ type, label, description, className, ...props }: AskUserOptionControlProps) => (\n <label\n className={cn(\n 'flex cursor-pointer items-start gap-2 rounded-md border border-border1 bg-surface3 px-3 py-2 text-neutral5 transition-colors hover:bg-surface4 has-[:checked]:border-border2 has-[:checked]:bg-surface4 has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-50',\n className,\n )}\n >\n <input type={type} className=\"mt-0.5 accent-current\" {...props} />\n <span>\n <span className=\"block\">{label}</span>\n {description ? <AskUserOptionDescription>{description}</AskUserOptionDescription> : null}\n </span>\n </label>\n);\n\nexport const AskUserSubmit = ({ children = 'Submit answer', ...props }: ComponentProps<typeof Button>) => (\n <Button type=\"button\" size=\"sm\" variant=\"primary\" {...props}>\n {children}\n </Button>\n);\n\nexport const AskUserPending = ({ children = 'Submitting…', className, ...props }: ComponentProps<'span'>) => (\n <span role=\"status\" className={cn('text-ui-xs text-neutral3', className)} {...props}>\n {children}\n </span>\n);\n\nexport interface AskUserOutputProps extends ComponentProps<'div'> {\n result: AskUserResult;\n}\n\nexport const AskUserOutput = ({ result, className, ...props }: AskUserOutputProps) => (\n <div\n role={result.isError ? 'alert' : 'status'}\n className={cn('space-y-2 rounded-md bg-surface3 p-3 text-neutral5', result.isError && 'text-error', className)}\n {...props}\n >\n <Badge size=\"xs\" variant={result.isError ? 'red' : 'green'}>\n {result.isError ? 'Error' : 'Answered'}\n </Badge>\n <p>{result.content}</p>\n </div>\n);\n\nexport interface AskUserProps extends Omit<ComponentProps<typeof AskUserContainer>, 'children' | 'onSubmit'> {\n payload: AskUserPayload;\n result?: AskUserResult;\n isAnswered?: boolean;\n isSubmitting?: boolean;\n onSubmit: (answer: AskUserAnswer) => void;\n footer?: ReactNode;\n}\n\nconst validOptions = (options: AskUserPayload['options']): AskUserOption[] =>\n options?.filter((option): option is AskUserOption =>\n Boolean(option && typeof option.label === 'string' && option.label),\n ) ?? [];\n\ninterface AskUserInputProps extends AskUserProps {\n options: AskUserOption[];\n}\n\nconst AskUserInput = ({\n payload,\n options,\n result,\n isAnswered = false,\n isSubmitting = false,\n onSubmit,\n footer,\n ...props\n}: AskUserInputProps) => {\n const inputId = useId();\n const [text, setText] = useState('');\n const [selected, setSelected] = useState<string[]>([]);\n\n if (result || isAnswered) {\n return (\n <AskUserContainer data-testid=\"ask-user\" {...props}>\n <p className=\"text-neutral6 mb-2 font-medium\">{payload.question}</p>\n {result ? <AskUserOutput result={result} /> : <Badge variant=\"green\">Answered</Badge>}\n </AskUserContainer>\n );\n }\n\n const submitText = () => {\n const answer = text.trim();\n if (answer && !isSubmitting) onSubmit(answer);\n };\n\n const handleTextKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n submitText();\n }\n };\n\n if (options.length === 0) {\n return (\n <AskUserContainer data-testid=\"ask-user\" {...props}>\n <label className=\"text-neutral6 mb-2 block font-medium\" htmlFor={inputId}>\n {payload.question}\n </label>\n <div className=\"flex items-center gap-2\">\n <Input\n id={inputId}\n value={text}\n onChange={event => setText(event.target.value)}\n onKeyDown={handleTextKeyDown}\n placeholder=\"Type your answer...\"\n disabled={isSubmitting}\n size=\"sm\"\n />\n <AskUserSubmit aria-label=\"Submit answer\" disabled={isSubmitting || !text.trim()} onClick={submitText}>\n Submit\n </AskUserSubmit>\n </div>\n {isSubmitting ? <AskUserPending className=\"mt-2 block\" /> : null}\n {footer}\n </AskUserContainer>\n );\n }\n\n const isMulti = payload.selectionMode === 'multi_select';\n return (\n <AskUserContainer data-testid=\"ask-user\" {...props}>\n <fieldset disabled={isSubmitting} className=\"space-y-2\">\n <AskUserQuestion>{payload.question}</AskUserQuestion>\n {options.map(option => {\n const checked = selected.includes(option.label);\n return (\n <AskUserOptionControl\n key={option.label}\n type={isMulti ? 'checkbox' : 'radio'}\n name={inputId}\n label={option.label}\n description={option.description}\n disabled={isSubmitting}\n checked={checked}\n onChange={() => {\n if (isSubmitting) return;\n if (!isMulti) {\n setSelected([option.label]);\n onSubmit(option.label);\n return;\n }\n setSelected(current =>\n current.includes(option.label)\n ? current.filter(selectedLabel => selectedLabel !== option.label)\n : [...current, option.label],\n );\n }}\n />\n );\n })}\n {isMulti ? (\n <AskUserSubmit disabled={isSubmitting || selected.length === 0} onClick={() => onSubmit(selected)}>\n Submit answer\n </AskUserSubmit>\n ) : null}\n {isSubmitting ? <AskUserPending /> : null}\n {footer}\n </fieldset>\n </AskUserContainer>\n );\n};\n\nexport const AskUser = ({ payload, ...props }: AskUserProps) => {\n const options = validOptions(payload.options);\n const payloadKey = JSON.stringify([payload.question, options.map(option => option.label), payload.selectionMode]);\n\n return <AskUserInput key={payloadKey} payload={payload} options={options} {...props} />;\n};\n"],"names":["jsx","cn","jsxs","Button","Badge","useId","useState","Input"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { useId, useState } from 'react';
|
|
3
|
-
import { B as Badge } from '../../Badge-
|
|
3
|
+
import { B as Badge } from '../../Badge-uGehUtus.js';
|
|
4
4
|
import { B as Button } from '../../Button-vr_I4iME.js';
|
|
5
5
|
import { I as Input } from '../../input-DVZ0-3KP.js';
|
|
6
6
|
import { c as cn } from '../../cn-BakJzhuv.js';
|
|
@@ -33,7 +33,7 @@ const AskUserOutput = ({ result, className, ...props }) => /* @__PURE__ */ jsxs(
|
|
|
33
33
|
className: cn("space-y-2 rounded-md bg-surface3 p-3 text-neutral5", result.isError && "text-error", className),
|
|
34
34
|
...props,
|
|
35
35
|
children: [
|
|
36
|
-
/* @__PURE__ */ jsx(Badge, { size: "xs", variant: result.isError ? "
|
|
36
|
+
/* @__PURE__ */ jsx(Badge, { size: "xs", variant: result.isError ? "red" : "green", children: result.isError ? "Error" : "Answered" }),
|
|
37
37
|
/* @__PURE__ */ jsx("p", { children: result.content })
|
|
38
38
|
]
|
|
39
39
|
}
|
|
@@ -57,7 +57,7 @@ const AskUserInput = ({
|
|
|
57
57
|
if (result || isAnswered) {
|
|
58
58
|
return /* @__PURE__ */ jsxs(AskUserContainer, { "data-testid": "ask-user", ...props, children: [
|
|
59
59
|
/* @__PURE__ */ jsx("p", { className: "text-neutral6 mb-2 font-medium", children: payload.question }),
|
|
60
|
-
result ? /* @__PURE__ */ jsx(AskUserOutput, { result }) : /* @__PURE__ */ jsx(Badge, { variant: "
|
|
60
|
+
result ? /* @__PURE__ */ jsx(AskUserOutput, { result }) : /* @__PURE__ */ jsx(Badge, { variant: "green", children: "Answered" })
|
|
61
61
|
] });
|
|
62
62
|
}
|
|
63
63
|
const submitText = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-user.es.js","sources":["../../../src/ds/components/ai/ask-user/ask-user.tsx"],"sourcesContent":["import { useId, useState } from 'react';\nimport type { ComponentProps, KeyboardEvent, ReactNode } from 'react';\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { Input } from '@/ds/components/Input';\nimport { cn } from '@/lib/utils';\n\nexport type AskUserSelectionMode = 'single_select' | 'multi_select';\nexport type AskUserAnswer = string | string[];\n\nexport interface AskUserOption {\n label: string;\n description?: string;\n}\n\nexport interface AskUserPayload {\n question: string;\n options?: AskUserOption[];\n selectionMode?: AskUserSelectionMode;\n}\n\nexport interface AskUserResult {\n content: string;\n isError?: boolean;\n}\n\nexport const AskUserContainer = ({ className, ...props }: ComponentProps<'div'>) => (\n <div className={cn('rounded-lg border border-border1 bg-surface2 p-3 text-sm', className)} {...props} />\n);\n\nexport const AskUserQuestion = ({ className, ...props }: ComponentProps<'legend'>) => (\n <legend className={cn('mb-3 font-medium text-neutral6', className)} {...props} />\n);\n\nexport const AskUserOptionDescription = ({ className, ...props }: ComponentProps<'span'>) => (\n <span className={cn('block text-ui-xs font-normal text-neutral3', className)} {...props} />\n);\n\ninterface AskUserOptionControlProps extends Omit<ComponentProps<'input'>, 'type'> {\n type: 'radio' | 'checkbox';\n label: string;\n description?: string;\n}\n\nexport const AskUserOptionControl = ({ type, label, description, className, ...props }: AskUserOptionControlProps) => (\n <label\n className={cn(\n 'flex cursor-pointer items-start gap-2 rounded-md border border-border1 bg-surface3 px-3 py-2 text-neutral5 transition-colors hover:bg-surface4 has-[:checked]:border-border2 has-[:checked]:bg-surface4 has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-50',\n className,\n )}\n >\n <input type={type} className=\"mt-0.5 accent-current\" {...props} />\n <span>\n <span className=\"block\">{label}</span>\n {description ? <AskUserOptionDescription>{description}</AskUserOptionDescription> : null}\n </span>\n </label>\n);\n\nexport const AskUserSubmit = ({ children = 'Submit answer', ...props }: ComponentProps<typeof Button>) => (\n <Button type=\"button\" size=\"sm\" variant=\"primary\" {...props}>\n {children}\n </Button>\n);\n\nexport const AskUserPending = ({ children = 'Submitting…', className, ...props }: ComponentProps<'span'>) => (\n <span role=\"status\" className={cn('text-ui-xs text-neutral3', className)} {...props}>\n {children}\n </span>\n);\n\nexport interface AskUserOutputProps extends ComponentProps<'div'> {\n result: AskUserResult;\n}\n\nexport const AskUserOutput = ({ result, className, ...props }: AskUserOutputProps) => (\n <div\n role={result.isError ? 'alert' : 'status'}\n className={cn('space-y-2 rounded-md bg-surface3 p-3 text-neutral5', result.isError && 'text-error', className)}\n {...props}\n >\n <Badge size=\"xs\" variant={result.isError ? 'error' : 'success'}>\n {result.isError ? 'Error' : 'Answered'}\n </Badge>\n <p>{result.content}</p>\n </div>\n);\n\nexport interface AskUserProps extends Omit<ComponentProps<typeof AskUserContainer>, 'children' | 'onSubmit'> {\n payload: AskUserPayload;\n result?: AskUserResult;\n isAnswered?: boolean;\n isSubmitting?: boolean;\n onSubmit: (answer: AskUserAnswer) => void;\n footer?: ReactNode;\n}\n\nconst validOptions = (options: AskUserPayload['options']): AskUserOption[] =>\n options?.filter((option): option is AskUserOption =>\n Boolean(option && typeof option.label === 'string' && option.label),\n ) ?? [];\n\ninterface AskUserInputProps extends AskUserProps {\n options: AskUserOption[];\n}\n\nconst AskUserInput = ({\n payload,\n options,\n result,\n isAnswered = false,\n isSubmitting = false,\n onSubmit,\n footer,\n ...props\n}: AskUserInputProps) => {\n const inputId = useId();\n const [text, setText] = useState('');\n const [selected, setSelected] = useState<string[]>([]);\n\n if (result || isAnswered) {\n return (\n <AskUserContainer data-testid=\"ask-user\" {...props}>\n <p className=\"text-neutral6 mb-2 font-medium\">{payload.question}</p>\n {result ? <AskUserOutput result={result} /> : <Badge variant=\"success\">Answered</Badge>}\n </AskUserContainer>\n );\n }\n\n const submitText = () => {\n const answer = text.trim();\n if (answer && !isSubmitting) onSubmit(answer);\n };\n\n const handleTextKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n submitText();\n }\n };\n\n if (options.length === 0) {\n return (\n <AskUserContainer data-testid=\"ask-user\" {...props}>\n <label className=\"text-neutral6 mb-2 block font-medium\" htmlFor={inputId}>\n {payload.question}\n </label>\n <div className=\"flex items-center gap-2\">\n <Input\n id={inputId}\n value={text}\n onChange={event => setText(event.target.value)}\n onKeyDown={handleTextKeyDown}\n placeholder=\"Type your answer...\"\n disabled={isSubmitting}\n size=\"sm\"\n />\n <AskUserSubmit aria-label=\"Submit answer\" disabled={isSubmitting || !text.trim()} onClick={submitText}>\n Submit\n </AskUserSubmit>\n </div>\n {isSubmitting ? <AskUserPending className=\"mt-2 block\" /> : null}\n {footer}\n </AskUserContainer>\n );\n }\n\n const isMulti = payload.selectionMode === 'multi_select';\n return (\n <AskUserContainer data-testid=\"ask-user\" {...props}>\n <fieldset disabled={isSubmitting} className=\"space-y-2\">\n <AskUserQuestion>{payload.question}</AskUserQuestion>\n {options.map(option => {\n const checked = selected.includes(option.label);\n return (\n <AskUserOptionControl\n key={option.label}\n type={isMulti ? 'checkbox' : 'radio'}\n name={inputId}\n label={option.label}\n description={option.description}\n disabled={isSubmitting}\n checked={checked}\n onChange={() => {\n if (isSubmitting) return;\n if (!isMulti) {\n setSelected([option.label]);\n onSubmit(option.label);\n return;\n }\n setSelected(current =>\n current.includes(option.label)\n ? current.filter(selectedLabel => selectedLabel !== option.label)\n : [...current, option.label],\n );\n }}\n />\n );\n })}\n {isMulti ? (\n <AskUserSubmit disabled={isSubmitting || selected.length === 0} onClick={() => onSubmit(selected)}>\n Submit answer\n </AskUserSubmit>\n ) : null}\n {isSubmitting ? <AskUserPending /> : null}\n {footer}\n </fieldset>\n </AskUserContainer>\n );\n};\n\nexport const AskUser = ({ payload, ...props }: AskUserProps) => {\n const options = validOptions(payload.options);\n const payloadKey = JSON.stringify([payload.question, options.map(option => option.label), payload.selectionMode]);\n\n return <AskUserInput key={payloadKey} payload={payload} options={options} {...props} />;\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ask-user.es.js","sources":["../../../src/ds/components/ai/ask-user/ask-user.tsx"],"sourcesContent":["import { useId, useState } from 'react';\nimport type { ComponentProps, KeyboardEvent, ReactNode } from 'react';\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { Input } from '@/ds/components/Input';\nimport { cn } from '@/lib/utils';\n\nexport type AskUserSelectionMode = 'single_select' | 'multi_select';\nexport type AskUserAnswer = string | string[];\n\nexport interface AskUserOption {\n label: string;\n description?: string;\n}\n\nexport interface AskUserPayload {\n question: string;\n options?: AskUserOption[];\n selectionMode?: AskUserSelectionMode;\n}\n\nexport interface AskUserResult {\n content: string;\n isError?: boolean;\n}\n\nexport const AskUserContainer = ({ className, ...props }: ComponentProps<'div'>) => (\n <div className={cn('rounded-lg border border-border1 bg-surface2 p-3 text-sm', className)} {...props} />\n);\n\nexport const AskUserQuestion = ({ className, ...props }: ComponentProps<'legend'>) => (\n <legend className={cn('mb-3 font-medium text-neutral6', className)} {...props} />\n);\n\nexport const AskUserOptionDescription = ({ className, ...props }: ComponentProps<'span'>) => (\n <span className={cn('block text-ui-xs font-normal text-neutral3', className)} {...props} />\n);\n\ninterface AskUserOptionControlProps extends Omit<ComponentProps<'input'>, 'type'> {\n type: 'radio' | 'checkbox';\n label: string;\n description?: string;\n}\n\nexport const AskUserOptionControl = ({ type, label, description, className, ...props }: AskUserOptionControlProps) => (\n <label\n className={cn(\n 'flex cursor-pointer items-start gap-2 rounded-md border border-border1 bg-surface3 px-3 py-2 text-neutral5 transition-colors hover:bg-surface4 has-[:checked]:border-border2 has-[:checked]:bg-surface4 has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-50',\n className,\n )}\n >\n <input type={type} className=\"mt-0.5 accent-current\" {...props} />\n <span>\n <span className=\"block\">{label}</span>\n {description ? <AskUserOptionDescription>{description}</AskUserOptionDescription> : null}\n </span>\n </label>\n);\n\nexport const AskUserSubmit = ({ children = 'Submit answer', ...props }: ComponentProps<typeof Button>) => (\n <Button type=\"button\" size=\"sm\" variant=\"primary\" {...props}>\n {children}\n </Button>\n);\n\nexport const AskUserPending = ({ children = 'Submitting…', className, ...props }: ComponentProps<'span'>) => (\n <span role=\"status\" className={cn('text-ui-xs text-neutral3', className)} {...props}>\n {children}\n </span>\n);\n\nexport interface AskUserOutputProps extends ComponentProps<'div'> {\n result: AskUserResult;\n}\n\nexport const AskUserOutput = ({ result, className, ...props }: AskUserOutputProps) => (\n <div\n role={result.isError ? 'alert' : 'status'}\n className={cn('space-y-2 rounded-md bg-surface3 p-3 text-neutral5', result.isError && 'text-error', className)}\n {...props}\n >\n <Badge size=\"xs\" variant={result.isError ? 'red' : 'green'}>\n {result.isError ? 'Error' : 'Answered'}\n </Badge>\n <p>{result.content}</p>\n </div>\n);\n\nexport interface AskUserProps extends Omit<ComponentProps<typeof AskUserContainer>, 'children' | 'onSubmit'> {\n payload: AskUserPayload;\n result?: AskUserResult;\n isAnswered?: boolean;\n isSubmitting?: boolean;\n onSubmit: (answer: AskUserAnswer) => void;\n footer?: ReactNode;\n}\n\nconst validOptions = (options: AskUserPayload['options']): AskUserOption[] =>\n options?.filter((option): option is AskUserOption =>\n Boolean(option && typeof option.label === 'string' && option.label),\n ) ?? [];\n\ninterface AskUserInputProps extends AskUserProps {\n options: AskUserOption[];\n}\n\nconst AskUserInput = ({\n payload,\n options,\n result,\n isAnswered = false,\n isSubmitting = false,\n onSubmit,\n footer,\n ...props\n}: AskUserInputProps) => {\n const inputId = useId();\n const [text, setText] = useState('');\n const [selected, setSelected] = useState<string[]>([]);\n\n if (result || isAnswered) {\n return (\n <AskUserContainer data-testid=\"ask-user\" {...props}>\n <p className=\"text-neutral6 mb-2 font-medium\">{payload.question}</p>\n {result ? <AskUserOutput result={result} /> : <Badge variant=\"green\">Answered</Badge>}\n </AskUserContainer>\n );\n }\n\n const submitText = () => {\n const answer = text.trim();\n if (answer && !isSubmitting) onSubmit(answer);\n };\n\n const handleTextKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n submitText();\n }\n };\n\n if (options.length === 0) {\n return (\n <AskUserContainer data-testid=\"ask-user\" {...props}>\n <label className=\"text-neutral6 mb-2 block font-medium\" htmlFor={inputId}>\n {payload.question}\n </label>\n <div className=\"flex items-center gap-2\">\n <Input\n id={inputId}\n value={text}\n onChange={event => setText(event.target.value)}\n onKeyDown={handleTextKeyDown}\n placeholder=\"Type your answer...\"\n disabled={isSubmitting}\n size=\"sm\"\n />\n <AskUserSubmit aria-label=\"Submit answer\" disabled={isSubmitting || !text.trim()} onClick={submitText}>\n Submit\n </AskUserSubmit>\n </div>\n {isSubmitting ? <AskUserPending className=\"mt-2 block\" /> : null}\n {footer}\n </AskUserContainer>\n );\n }\n\n const isMulti = payload.selectionMode === 'multi_select';\n return (\n <AskUserContainer data-testid=\"ask-user\" {...props}>\n <fieldset disabled={isSubmitting} className=\"space-y-2\">\n <AskUserQuestion>{payload.question}</AskUserQuestion>\n {options.map(option => {\n const checked = selected.includes(option.label);\n return (\n <AskUserOptionControl\n key={option.label}\n type={isMulti ? 'checkbox' : 'radio'}\n name={inputId}\n label={option.label}\n description={option.description}\n disabled={isSubmitting}\n checked={checked}\n onChange={() => {\n if (isSubmitting) return;\n if (!isMulti) {\n setSelected([option.label]);\n onSubmit(option.label);\n return;\n }\n setSelected(current =>\n current.includes(option.label)\n ? current.filter(selectedLabel => selectedLabel !== option.label)\n : [...current, option.label],\n );\n }}\n />\n );\n })}\n {isMulti ? (\n <AskUserSubmit disabled={isSubmitting || selected.length === 0} onClick={() => onSubmit(selected)}>\n Submit answer\n </AskUserSubmit>\n ) : null}\n {isSubmitting ? <AskUserPending /> : null}\n {footer}\n </fieldset>\n </AskUserContainer>\n );\n};\n\nexport const AskUser = ({ payload, ...props }: AskUserProps) => {\n const options = validOptions(payload.options);\n const payloadKey = JSON.stringify([payload.question, options.map(option => option.label), payload.selectionMode]);\n\n return <AskUserInput key={payloadKey} payload={payload} options={options} {...props} />;\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
const lucideReact = require('lucide-react');
|
|
7
7
|
const React = require('react');
|
|
8
|
-
const Badge = require('../../Badge-
|
|
8
|
+
const Badge = require('../../Badge-DcllBqFg.cjs');
|
|
9
9
|
const Button = require('../../Button-DA5XLUon.cjs');
|
|
10
10
|
const markdownRenderer = require('../../markdown-renderer-BQugZq4m.cjs');
|
|
11
11
|
const Txt = require('../../Txt-I5lK8zy7.cjs');
|
|
@@ -57,8 +57,8 @@ function PlanLabel({ children = "Plan", className, ...props }) {
|
|
|
57
57
|
function PlanHeaderActions({ children, className, ...props }) {
|
|
58
58
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "plan-header-actions", className: utils_cn.cn("flex shrink-0 items-center gap-1", className), ...props, children });
|
|
59
59
|
}
|
|
60
|
-
function PlanStatus({ children, variant = "
|
|
61
|
-
return /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { ...props, variant, size: "xs",
|
|
60
|
+
function PlanStatus({ children, variant = "neutral", ...props }) {
|
|
61
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { ...props, variant, size: "xs", indicator: "dot", children });
|
|
62
62
|
}
|
|
63
63
|
function PlanCopyButton({ content, ...props }) {
|
|
64
64
|
const { isCopied, handleCopy } = hooks_useCopyToClipboard.useCopyToClipboard({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.cjs.js","sources":["../../../src/ds/components/ai/plan/plan.tsx"],"sourcesContent":["import { CheckIcon, ClipboardList, CopyIcon, Maximize2, Minimize2 } from 'lucide-react';\nimport { createContext, useContext, useLayoutEffect, useRef, useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { MarkdownRenderer } from '@/ds/components/MarkdownRenderer';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard';\nimport { cn } from '@/lib/utils';\n\nconst DEFAULT_COLLAPSED_HEIGHT = 220;\n\ninterface PlanContextValue {\n collapsedHeight: number;\n isExpanded: boolean;\n /** Whether the rendered content overflows the collapsed height (measured, not estimated). */\n isClipped: boolean;\n setClipped: (clipped: boolean) => void;\n toggleExpanded: () => void;\n}\n\nconst PlanContext = createContext<PlanContextValue | null>(null);\n\nconst usePlanContext = () => {\n const context = useContext(PlanContext);\n\n if (!context) {\n throw new Error('Plan compound components must be rendered inside <Plan>.');\n }\n\n return context;\n};\n\nexport interface PlanProps extends ComponentProps<'div'> {\n collapsedHeight?: number;\n}\n\nexport function Plan({ children, collapsedHeight = DEFAULT_COLLAPSED_HEIGHT, className, ...props }: PlanProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n const [isClipped, setClipped] = useState(false);\n\n const toggleExpanded = () => {\n setIsExpanded(current => !current);\n };\n\n const contextValue = {\n collapsedHeight,\n isExpanded,\n isClipped,\n setClipped,\n toggleExpanded,\n };\n\n return (\n <PlanContext.Provider value={contextValue}>\n <div data-slot=\"plan\" className={cn('w-full overflow-hidden rounded-xl bg-surface3', className)} {...props}>\n {children}\n </div>\n </PlanContext.Provider>\n );\n}\n\nexport type PlanHeaderProps = ComponentProps<'div'>;\n\nexport function PlanHeader({ children, className, ...props }: PlanHeaderProps) {\n return (\n <div\n data-slot=\"plan-header\"\n className={cn('flex min-h-10 items-center justify-between gap-3 px-4 pt-3', className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport type PlanLabelProps = ComponentProps<'div'>;\n\nexport function PlanLabel({ children = 'Plan', className, ...props }: PlanLabelProps) {\n return (\n <div data-slot=\"plan-label\" className={cn('flex min-w-0 items-center gap-2', className)} {...props}>\n <Icon size=\"sm\" className=\"text-icon3\">\n <ClipboardList />\n </Icon>\n <Txt as=\"span\" variant=\"ui-sm\" className=\"text-neutral4\">\n {children}\n </Txt>\n </div>\n );\n}\n\nexport type PlanHeaderActionsProps = ComponentProps<'div'>;\n\nexport function PlanHeaderActions({ children, className, ...props }: PlanHeaderActionsProps) {\n return (\n <div data-slot=\"plan-header-actions\" className={cn('flex shrink-0 items-center gap-1', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport type PlanStatusProps = Omit<ComponentProps<typeof Badge>, 'icon' | 'size'>;\n\nexport function PlanStatus({ children, variant = 'default', ...props }: PlanStatusProps) {\n return (\n <Badge {...props} variant={variant} size=\"xs\" icon={<span className=\"size-1 rounded-full bg-current\" />}>\n {children}\n </Badge>\n );\n}\n\nexport interface PlanCopyButtonProps extends Omit<\n ComponentProps<typeof Button>,\n 'aria-label' | 'children' | 'onClick' | 'size' | 'tooltip' | 'type' | 'variant'\n> {\n content: string;\n}\n\nexport function PlanCopyButton({ content, ...props }: PlanCopyButtonProps) {\n const { isCopied, handleCopy } = useCopyToClipboard({\n text: content,\n copiedDuration: 1500,\n showToast: false,\n });\n\n return (\n <Button\n {...props}\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n tooltip=\"Copy plan\"\n aria-label=\"Copy plan\"\n onClick={handleCopy}\n >\n {isCopied ? <CheckIcon /> : <CopyIcon />}\n </Button>\n );\n}\n\nexport type PlanBodyProps = ComponentProps<'div'>;\n\nexport function PlanBody({ children, className, ...props }: PlanBodyProps) {\n return (\n <div data-slot=\"plan-body\" className={cn('px-5 pt-4 pb-5', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport type PlanIntroProps = ComponentProps<'div'>;\n\nexport function PlanIntro({ children, className, ...props }: PlanIntroProps) {\n return (\n <div data-slot=\"plan-intro\" className={cn('mb-5 space-y-1', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface PlanTitleProps extends Omit<ComponentProps<typeof Txt>, 'as' | 'children' | 'variant'> {\n children: ReactNode;\n}\n\nexport function PlanTitle({ children, className, ...props }: PlanTitleProps) {\n return (\n <Txt {...props} as=\"h3\" variant=\"header-sm\" className={cn('text-neutral7 font-semibold', className)}>\n {children}\n </Txt>\n );\n}\n\nexport interface PlanPathProps extends Omit<\n ComponentProps<typeof Txt>,\n 'as' | 'children' | 'font' | 'title' | 'variant'\n> {\n children: string;\n}\n\nconst getFileName = (path: string) => {\n const segments = path.split(/[\\\\/]/).filter(Boolean);\n return segments[segments.length - 1] ?? path;\n};\n\nexport function PlanPath({ children, className, ...props }: PlanPathProps) {\n return (\n <Txt\n {...props}\n as=\"p\"\n variant=\"ui-xs\"\n font=\"mono\"\n title={children}\n className={cn('max-w-full truncate overflow-hidden text-neutral3', className)}\n >\n {getFileName(children)}\n </Txt>\n );\n}\n\nexport type PlanMainProps = ComponentProps<'div'>;\n\nexport function PlanMain({ children, className, ...props }: PlanMainProps) {\n return (\n <div data-slot=\"plan-main\" className={cn('relative', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface PlanContentProps extends Omit<ComponentProps<'div'>, 'children'> {\n children: string;\n}\n\nexport function PlanContent({ children, className, style, ...props }: PlanContentProps) {\n const { collapsedHeight, isExpanded, isClipped, setClipped } = usePlanContext();\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Measure the rendered content against the collapsed height so the clip hint\n // and expand control track actual overflow — not an estimate of it.\n useLayoutEffect(() => {\n const element = contentRef.current;\n if (!element) return;\n\n const measure = () => setClipped(element.scrollHeight > collapsedHeight);\n measure();\n\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [children, collapsedHeight, setClipped]);\n\n const showClipHint = !isExpanded && isClipped;\n\n return (\n <div\n data-slot=\"plan-content\"\n // The clip hint masks the content itself, so it reads correctly on any card background.\n {...(showClipHint ? { 'data-clipped': '' } : {})}\n className={cn(\n 'relative',\n !isExpanded && 'overflow-hidden',\n showClipHint && 'mask-b-from-60% mask-b-to-100%',\n className,\n )}\n style={!isExpanded ? { ...style, maxHeight: collapsedHeight } : style}\n {...props}\n >\n <div\n ref={contentRef}\n className=\"[&_code]:bg-surface4 [&_h1]:text-header-md [&_h1]:leading-header-md [&_h2]:text-header-sm [&_h2]:leading-header-sm [&_h3]:text-ui-lg [&_h3]:leading-ui-lg [&_p]:text-ui-md [&_p]:leading-6\"\n >\n <MarkdownRenderer className=\"text-neutral6\">{children}</MarkdownRenderer>\n </div>\n </div>\n );\n}\n\nexport interface PlanFileProps extends Omit<ComponentProps<'div'>, 'children'> {\n children: string;\n}\n\nexport function PlanFile({ children, className, ...props }: PlanFileProps) {\n return (\n <div data-slot=\"plan-file\" className={className} {...props}>\n <Txt as=\"p\" variant=\"ui-xs\" className=\"text-neutral3 mb-2\">\n Plan file\n </Txt>\n <Txt as=\"p\" variant=\"ui-sm\" className=\"text-neutral6 font-mono break-all\">\n {children}\n </Txt>\n </div>\n );\n}\n\nexport type PlanControlsProps = ComponentProps<'div'>;\n\nexport function PlanControls({ children, className, ...props }: PlanControlsProps) {\n const hasActions = Boolean(children);\n\n return (\n <div\n data-slot=\"plan-controls\"\n className={cn('relative z-10 mt-4 flex justify-center empty:hidden', className)}\n {...props}\n >\n {hasActions ? (\n <div className=\"grid w-full max-w-sm grid-cols-[1fr_auto_1fr] items-center gap-2 px-10\">{children}</div>\n ) : (\n <PlanExpandButton />\n )}\n </div>\n );\n}\n\nexport type PlanActionGroupProps = ComponentProps<'div'>;\n\nexport function PlanActionGroup({ children, className, ...props }: PlanActionGroupProps) {\n return (\n <div data-slot=\"plan-action-group\" className={cn('flex justify-start gap-2 empty:hidden', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport type PlanExpandButtonProps = Omit<\n ComponentProps<typeof Button>,\n 'aria-label' | 'children' | 'onClick' | 'size' | 'type' | 'variant'\n>;\n\nexport function PlanExpandButton({ className, ...props }: PlanExpandButtonProps) {\n const { isExpanded, isClipped, toggleExpanded } = usePlanContext();\n\n // Nothing to expand: the collapsed card already shows the whole plan.\n if (!isClipped && !isExpanded) return null;\n\n return (\n <Button\n {...props}\n className={cn('shrink-0 whitespace-nowrap', className)}\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n aria-label={isExpanded ? 'Collapse plan' : 'Expand plan'}\n onClick={toggleExpanded}\n >\n {isExpanded ? <Minimize2 /> : <Maximize2 />}\n {isExpanded ? 'Collapse plan' : 'Expand plan'}\n </Button>\n );\n}\n"],"names":["createContext","useContext","useState","cn","jsx","jsxs","Icon","ClipboardList","Txt","Badge","useCopyToClipboard","Button","CheckIcon","CopyIcon","useRef","useLayoutEffect","MarkdownRenderer","Minimize2","Maximize2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plan.cjs.js","sources":["../../../src/ds/components/ai/plan/plan.tsx"],"sourcesContent":["import { CheckIcon, ClipboardList, CopyIcon, Maximize2, Minimize2 } from 'lucide-react';\nimport { createContext, useContext, useLayoutEffect, useRef, useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { MarkdownRenderer } from '@/ds/components/MarkdownRenderer';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard';\nimport { cn } from '@/lib/utils';\n\nconst DEFAULT_COLLAPSED_HEIGHT = 220;\n\ninterface PlanContextValue {\n collapsedHeight: number;\n isExpanded: boolean;\n /** Whether the rendered content overflows the collapsed height (measured, not estimated). */\n isClipped: boolean;\n setClipped: (clipped: boolean) => void;\n toggleExpanded: () => void;\n}\n\nconst PlanContext = createContext<PlanContextValue | null>(null);\n\nconst usePlanContext = () => {\n const context = useContext(PlanContext);\n\n if (!context) {\n throw new Error('Plan compound components must be rendered inside <Plan>.');\n }\n\n return context;\n};\n\nexport interface PlanProps extends ComponentProps<'div'> {\n collapsedHeight?: number;\n}\n\nexport function Plan({ children, collapsedHeight = DEFAULT_COLLAPSED_HEIGHT, className, ...props }: PlanProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n const [isClipped, setClipped] = useState(false);\n\n const toggleExpanded = () => {\n setIsExpanded(current => !current);\n };\n\n const contextValue = {\n collapsedHeight,\n isExpanded,\n isClipped,\n setClipped,\n toggleExpanded,\n };\n\n return (\n <PlanContext.Provider value={contextValue}>\n <div data-slot=\"plan\" className={cn('w-full overflow-hidden rounded-xl bg-surface3', className)} {...props}>\n {children}\n </div>\n </PlanContext.Provider>\n );\n}\n\nexport type PlanHeaderProps = ComponentProps<'div'>;\n\nexport function PlanHeader({ children, className, ...props }: PlanHeaderProps) {\n return (\n <div\n data-slot=\"plan-header\"\n className={cn('flex min-h-10 items-center justify-between gap-3 px-4 pt-3', className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport type PlanLabelProps = ComponentProps<'div'>;\n\nexport function PlanLabel({ children = 'Plan', className, ...props }: PlanLabelProps) {\n return (\n <div data-slot=\"plan-label\" className={cn('flex min-w-0 items-center gap-2', className)} {...props}>\n <Icon size=\"sm\" className=\"text-icon3\">\n <ClipboardList />\n </Icon>\n <Txt as=\"span\" variant=\"ui-sm\" className=\"text-neutral4\">\n {children}\n </Txt>\n </div>\n );\n}\n\nexport type PlanHeaderActionsProps = ComponentProps<'div'>;\n\nexport function PlanHeaderActions({ children, className, ...props }: PlanHeaderActionsProps) {\n return (\n <div data-slot=\"plan-header-actions\" className={cn('flex shrink-0 items-center gap-1', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport type PlanStatusProps = Omit<ComponentProps<typeof Badge>, 'icon' | 'indicator' | 'size'>;\n\nexport function PlanStatus({ children, variant = 'neutral', ...props }: PlanStatusProps) {\n return (\n <Badge {...props} variant={variant} size=\"xs\" indicator=\"dot\">\n {children}\n </Badge>\n );\n}\n\nexport interface PlanCopyButtonProps extends Omit<\n ComponentProps<typeof Button>,\n 'aria-label' | 'children' | 'onClick' | 'size' | 'tooltip' | 'type' | 'variant'\n> {\n content: string;\n}\n\nexport function PlanCopyButton({ content, ...props }: PlanCopyButtonProps) {\n const { isCopied, handleCopy } = useCopyToClipboard({\n text: content,\n copiedDuration: 1500,\n showToast: false,\n });\n\n return (\n <Button\n {...props}\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n tooltip=\"Copy plan\"\n aria-label=\"Copy plan\"\n onClick={handleCopy}\n >\n {isCopied ? <CheckIcon /> : <CopyIcon />}\n </Button>\n );\n}\n\nexport type PlanBodyProps = ComponentProps<'div'>;\n\nexport function PlanBody({ children, className, ...props }: PlanBodyProps) {\n return (\n <div data-slot=\"plan-body\" className={cn('px-5 pt-4 pb-5', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport type PlanIntroProps = ComponentProps<'div'>;\n\nexport function PlanIntro({ children, className, ...props }: PlanIntroProps) {\n return (\n <div data-slot=\"plan-intro\" className={cn('mb-5 space-y-1', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface PlanTitleProps extends Omit<ComponentProps<typeof Txt>, 'as' | 'children' | 'variant'> {\n children: ReactNode;\n}\n\nexport function PlanTitle({ children, className, ...props }: PlanTitleProps) {\n return (\n <Txt {...props} as=\"h3\" variant=\"header-sm\" className={cn('text-neutral7 font-semibold', className)}>\n {children}\n </Txt>\n );\n}\n\nexport interface PlanPathProps extends Omit<\n ComponentProps<typeof Txt>,\n 'as' | 'children' | 'font' | 'title' | 'variant'\n> {\n children: string;\n}\n\nconst getFileName = (path: string) => {\n const segments = path.split(/[\\\\/]/).filter(Boolean);\n return segments[segments.length - 1] ?? path;\n};\n\nexport function PlanPath({ children, className, ...props }: PlanPathProps) {\n return (\n <Txt\n {...props}\n as=\"p\"\n variant=\"ui-xs\"\n font=\"mono\"\n title={children}\n className={cn('max-w-full truncate overflow-hidden text-neutral3', className)}\n >\n {getFileName(children)}\n </Txt>\n );\n}\n\nexport type PlanMainProps = ComponentProps<'div'>;\n\nexport function PlanMain({ children, className, ...props }: PlanMainProps) {\n return (\n <div data-slot=\"plan-main\" className={cn('relative', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface PlanContentProps extends Omit<ComponentProps<'div'>, 'children'> {\n children: string;\n}\n\nexport function PlanContent({ children, className, style, ...props }: PlanContentProps) {\n const { collapsedHeight, isExpanded, isClipped, setClipped } = usePlanContext();\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Measure the rendered content against the collapsed height so the clip hint\n // and expand control track actual overflow — not an estimate of it.\n useLayoutEffect(() => {\n const element = contentRef.current;\n if (!element) return;\n\n const measure = () => setClipped(element.scrollHeight > collapsedHeight);\n measure();\n\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [children, collapsedHeight, setClipped]);\n\n const showClipHint = !isExpanded && isClipped;\n\n return (\n <div\n data-slot=\"plan-content\"\n // The clip hint masks the content itself, so it reads correctly on any card background.\n {...(showClipHint ? { 'data-clipped': '' } : {})}\n className={cn(\n 'relative',\n !isExpanded && 'overflow-hidden',\n showClipHint && 'mask-b-from-60% mask-b-to-100%',\n className,\n )}\n style={!isExpanded ? { ...style, maxHeight: collapsedHeight } : style}\n {...props}\n >\n <div\n ref={contentRef}\n className=\"[&_code]:bg-surface4 [&_h1]:text-header-md [&_h1]:leading-header-md [&_h2]:text-header-sm [&_h2]:leading-header-sm [&_h3]:text-ui-lg [&_h3]:leading-ui-lg [&_p]:text-ui-md [&_p]:leading-6\"\n >\n <MarkdownRenderer className=\"text-neutral6\">{children}</MarkdownRenderer>\n </div>\n </div>\n );\n}\n\nexport interface PlanFileProps extends Omit<ComponentProps<'div'>, 'children'> {\n children: string;\n}\n\nexport function PlanFile({ children, className, ...props }: PlanFileProps) {\n return (\n <div data-slot=\"plan-file\" className={className} {...props}>\n <Txt as=\"p\" variant=\"ui-xs\" className=\"text-neutral3 mb-2\">\n Plan file\n </Txt>\n <Txt as=\"p\" variant=\"ui-sm\" className=\"text-neutral6 font-mono break-all\">\n {children}\n </Txt>\n </div>\n );\n}\n\nexport type PlanControlsProps = ComponentProps<'div'>;\n\nexport function PlanControls({ children, className, ...props }: PlanControlsProps) {\n const hasActions = Boolean(children);\n\n return (\n <div\n data-slot=\"plan-controls\"\n className={cn('relative z-10 mt-4 flex justify-center empty:hidden', className)}\n {...props}\n >\n {hasActions ? (\n <div className=\"grid w-full max-w-sm grid-cols-[1fr_auto_1fr] items-center gap-2 px-10\">{children}</div>\n ) : (\n <PlanExpandButton />\n )}\n </div>\n );\n}\n\nexport type PlanActionGroupProps = ComponentProps<'div'>;\n\nexport function PlanActionGroup({ children, className, ...props }: PlanActionGroupProps) {\n return (\n <div data-slot=\"plan-action-group\" className={cn('flex justify-start gap-2 empty:hidden', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport type PlanExpandButtonProps = Omit<\n ComponentProps<typeof Button>,\n 'aria-label' | 'children' | 'onClick' | 'size' | 'type' | 'variant'\n>;\n\nexport function PlanExpandButton({ className, ...props }: PlanExpandButtonProps) {\n const { isExpanded, isClipped, toggleExpanded } = usePlanContext();\n\n // Nothing to expand: the collapsed card already shows the whole plan.\n if (!isClipped && !isExpanded) return null;\n\n return (\n <Button\n {...props}\n className={cn('shrink-0 whitespace-nowrap', className)}\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n aria-label={isExpanded ? 'Collapse plan' : 'Expand plan'}\n onClick={toggleExpanded}\n >\n {isExpanded ? <Minimize2 /> : <Maximize2 />}\n {isExpanded ? 'Collapse plan' : 'Expand plan'}\n </Button>\n );\n}\n"],"names":["createContext","useContext","useState","cn","jsx","jsxs","Icon","ClipboardList","Txt","Badge","useCopyToClipboard","Button","CheckIcon","CopyIcon","useRef","useLayoutEffect","MarkdownRenderer","Minimize2","Maximize2"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { CheckIcon, CopyIcon, Minimize2, Maximize2, ClipboardList } from 'lucide-react';
|
|
3
3
|
import { useState, useRef, useLayoutEffect, createContext, useContext } from 'react';
|
|
4
|
-
import { B as Badge } from '../../Badge-
|
|
4
|
+
import { B as Badge } from '../../Badge-uGehUtus.js';
|
|
5
5
|
import { B as Button } from '../../Button-vr_I4iME.js';
|
|
6
6
|
import { M as MarkdownRenderer } from '../../markdown-renderer-LOqipQki.js';
|
|
7
7
|
import { T as Txt } from '../../Txt-Df42XG5p.js';
|
|
@@ -53,8 +53,8 @@ function PlanLabel({ children = "Plan", className, ...props }) {
|
|
|
53
53
|
function PlanHeaderActions({ children, className, ...props }) {
|
|
54
54
|
return /* @__PURE__ */ jsx("div", { "data-slot": "plan-header-actions", className: cn("flex shrink-0 items-center gap-1", className), ...props, children });
|
|
55
55
|
}
|
|
56
|
-
function PlanStatus({ children, variant = "
|
|
57
|
-
return /* @__PURE__ */ jsx(Badge, { ...props, variant, size: "xs",
|
|
56
|
+
function PlanStatus({ children, variant = "neutral", ...props }) {
|
|
57
|
+
return /* @__PURE__ */ jsx(Badge, { ...props, variant, size: "xs", indicator: "dot", children });
|
|
58
58
|
}
|
|
59
59
|
function PlanCopyButton({ content, ...props }) {
|
|
60
60
|
const { isCopied, handleCopy } = useCopyToClipboard({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.es.js","sources":["../../../src/ds/components/ai/plan/plan.tsx"],"sourcesContent":["import { CheckIcon, ClipboardList, CopyIcon, Maximize2, Minimize2 } from 'lucide-react';\nimport { createContext, useContext, useLayoutEffect, useRef, useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { MarkdownRenderer } from '@/ds/components/MarkdownRenderer';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard';\nimport { cn } from '@/lib/utils';\n\nconst DEFAULT_COLLAPSED_HEIGHT = 220;\n\ninterface PlanContextValue {\n collapsedHeight: number;\n isExpanded: boolean;\n /** Whether the rendered content overflows the collapsed height (measured, not estimated). */\n isClipped: boolean;\n setClipped: (clipped: boolean) => void;\n toggleExpanded: () => void;\n}\n\nconst PlanContext = createContext<PlanContextValue | null>(null);\n\nconst usePlanContext = () => {\n const context = useContext(PlanContext);\n\n if (!context) {\n throw new Error('Plan compound components must be rendered inside <Plan>.');\n }\n\n return context;\n};\n\nexport interface PlanProps extends ComponentProps<'div'> {\n collapsedHeight?: number;\n}\n\nexport function Plan({ children, collapsedHeight = DEFAULT_COLLAPSED_HEIGHT, className, ...props }: PlanProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n const [isClipped, setClipped] = useState(false);\n\n const toggleExpanded = () => {\n setIsExpanded(current => !current);\n };\n\n const contextValue = {\n collapsedHeight,\n isExpanded,\n isClipped,\n setClipped,\n toggleExpanded,\n };\n\n return (\n <PlanContext.Provider value={contextValue}>\n <div data-slot=\"plan\" className={cn('w-full overflow-hidden rounded-xl bg-surface3', className)} {...props}>\n {children}\n </div>\n </PlanContext.Provider>\n );\n}\n\nexport type PlanHeaderProps = ComponentProps<'div'>;\n\nexport function PlanHeader({ children, className, ...props }: PlanHeaderProps) {\n return (\n <div\n data-slot=\"plan-header\"\n className={cn('flex min-h-10 items-center justify-between gap-3 px-4 pt-3', className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport type PlanLabelProps = ComponentProps<'div'>;\n\nexport function PlanLabel({ children = 'Plan', className, ...props }: PlanLabelProps) {\n return (\n <div data-slot=\"plan-label\" className={cn('flex min-w-0 items-center gap-2', className)} {...props}>\n <Icon size=\"sm\" className=\"text-icon3\">\n <ClipboardList />\n </Icon>\n <Txt as=\"span\" variant=\"ui-sm\" className=\"text-neutral4\">\n {children}\n </Txt>\n </div>\n );\n}\n\nexport type PlanHeaderActionsProps = ComponentProps<'div'>;\n\nexport function PlanHeaderActions({ children, className, ...props }: PlanHeaderActionsProps) {\n return (\n <div data-slot=\"plan-header-actions\" className={cn('flex shrink-0 items-center gap-1', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport type PlanStatusProps = Omit<ComponentProps<typeof Badge>, 'icon' | 'size'>;\n\nexport function PlanStatus({ children, variant = 'default', ...props }: PlanStatusProps) {\n return (\n <Badge {...props} variant={variant} size=\"xs\" icon={<span className=\"size-1 rounded-full bg-current\" />}>\n {children}\n </Badge>\n );\n}\n\nexport interface PlanCopyButtonProps extends Omit<\n ComponentProps<typeof Button>,\n 'aria-label' | 'children' | 'onClick' | 'size' | 'tooltip' | 'type' | 'variant'\n> {\n content: string;\n}\n\nexport function PlanCopyButton({ content, ...props }: PlanCopyButtonProps) {\n const { isCopied, handleCopy } = useCopyToClipboard({\n text: content,\n copiedDuration: 1500,\n showToast: false,\n });\n\n return (\n <Button\n {...props}\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n tooltip=\"Copy plan\"\n aria-label=\"Copy plan\"\n onClick={handleCopy}\n >\n {isCopied ? <CheckIcon /> : <CopyIcon />}\n </Button>\n );\n}\n\nexport type PlanBodyProps = ComponentProps<'div'>;\n\nexport function PlanBody({ children, className, ...props }: PlanBodyProps) {\n return (\n <div data-slot=\"plan-body\" className={cn('px-5 pt-4 pb-5', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport type PlanIntroProps = ComponentProps<'div'>;\n\nexport function PlanIntro({ children, className, ...props }: PlanIntroProps) {\n return (\n <div data-slot=\"plan-intro\" className={cn('mb-5 space-y-1', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface PlanTitleProps extends Omit<ComponentProps<typeof Txt>, 'as' | 'children' | 'variant'> {\n children: ReactNode;\n}\n\nexport function PlanTitle({ children, className, ...props }: PlanTitleProps) {\n return (\n <Txt {...props} as=\"h3\" variant=\"header-sm\" className={cn('text-neutral7 font-semibold', className)}>\n {children}\n </Txt>\n );\n}\n\nexport interface PlanPathProps extends Omit<\n ComponentProps<typeof Txt>,\n 'as' | 'children' | 'font' | 'title' | 'variant'\n> {\n children: string;\n}\n\nconst getFileName = (path: string) => {\n const segments = path.split(/[\\\\/]/).filter(Boolean);\n return segments[segments.length - 1] ?? path;\n};\n\nexport function PlanPath({ children, className, ...props }: PlanPathProps) {\n return (\n <Txt\n {...props}\n as=\"p\"\n variant=\"ui-xs\"\n font=\"mono\"\n title={children}\n className={cn('max-w-full truncate overflow-hidden text-neutral3', className)}\n >\n {getFileName(children)}\n </Txt>\n );\n}\n\nexport type PlanMainProps = ComponentProps<'div'>;\n\nexport function PlanMain({ children, className, ...props }: PlanMainProps) {\n return (\n <div data-slot=\"plan-main\" className={cn('relative', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface PlanContentProps extends Omit<ComponentProps<'div'>, 'children'> {\n children: string;\n}\n\nexport function PlanContent({ children, className, style, ...props }: PlanContentProps) {\n const { collapsedHeight, isExpanded, isClipped, setClipped } = usePlanContext();\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Measure the rendered content against the collapsed height so the clip hint\n // and expand control track actual overflow — not an estimate of it.\n useLayoutEffect(() => {\n const element = contentRef.current;\n if (!element) return;\n\n const measure = () => setClipped(element.scrollHeight > collapsedHeight);\n measure();\n\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [children, collapsedHeight, setClipped]);\n\n const showClipHint = !isExpanded && isClipped;\n\n return (\n <div\n data-slot=\"plan-content\"\n // The clip hint masks the content itself, so it reads correctly on any card background.\n {...(showClipHint ? { 'data-clipped': '' } : {})}\n className={cn(\n 'relative',\n !isExpanded && 'overflow-hidden',\n showClipHint && 'mask-b-from-60% mask-b-to-100%',\n className,\n )}\n style={!isExpanded ? { ...style, maxHeight: collapsedHeight } : style}\n {...props}\n >\n <div\n ref={contentRef}\n className=\"[&_code]:bg-surface4 [&_h1]:text-header-md [&_h1]:leading-header-md [&_h2]:text-header-sm [&_h2]:leading-header-sm [&_h3]:text-ui-lg [&_h3]:leading-ui-lg [&_p]:text-ui-md [&_p]:leading-6\"\n >\n <MarkdownRenderer className=\"text-neutral6\">{children}</MarkdownRenderer>\n </div>\n </div>\n );\n}\n\nexport interface PlanFileProps extends Omit<ComponentProps<'div'>, 'children'> {\n children: string;\n}\n\nexport function PlanFile({ children, className, ...props }: PlanFileProps) {\n return (\n <div data-slot=\"plan-file\" className={className} {...props}>\n <Txt as=\"p\" variant=\"ui-xs\" className=\"text-neutral3 mb-2\">\n Plan file\n </Txt>\n <Txt as=\"p\" variant=\"ui-sm\" className=\"text-neutral6 font-mono break-all\">\n {children}\n </Txt>\n </div>\n );\n}\n\nexport type PlanControlsProps = ComponentProps<'div'>;\n\nexport function PlanControls({ children, className, ...props }: PlanControlsProps) {\n const hasActions = Boolean(children);\n\n return (\n <div\n data-slot=\"plan-controls\"\n className={cn('relative z-10 mt-4 flex justify-center empty:hidden', className)}\n {...props}\n >\n {hasActions ? (\n <div className=\"grid w-full max-w-sm grid-cols-[1fr_auto_1fr] items-center gap-2 px-10\">{children}</div>\n ) : (\n <PlanExpandButton />\n )}\n </div>\n );\n}\n\nexport type PlanActionGroupProps = ComponentProps<'div'>;\n\nexport function PlanActionGroup({ children, className, ...props }: PlanActionGroupProps) {\n return (\n <div data-slot=\"plan-action-group\" className={cn('flex justify-start gap-2 empty:hidden', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport type PlanExpandButtonProps = Omit<\n ComponentProps<typeof Button>,\n 'aria-label' | 'children' | 'onClick' | 'size' | 'type' | 'variant'\n>;\n\nexport function PlanExpandButton({ className, ...props }: PlanExpandButtonProps) {\n const { isExpanded, isClipped, toggleExpanded } = usePlanContext();\n\n // Nothing to expand: the collapsed card already shows the whole plan.\n if (!isClipped && !isExpanded) return null;\n\n return (\n <Button\n {...props}\n className={cn('shrink-0 whitespace-nowrap', className)}\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n aria-label={isExpanded ? 'Collapse plan' : 'Expand plan'}\n onClick={toggleExpanded}\n >\n {isExpanded ? <Minimize2 /> : <Maximize2 />}\n {isExpanded ? 'Collapse plan' : 'Expand plan'}\n </Button>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plan.es.js","sources":["../../../src/ds/components/ai/plan/plan.tsx"],"sourcesContent":["import { CheckIcon, ClipboardList, CopyIcon, Maximize2, Minimize2 } from 'lucide-react';\nimport { createContext, useContext, useLayoutEffect, useRef, useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { MarkdownRenderer } from '@/ds/components/MarkdownRenderer';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard';\nimport { cn } from '@/lib/utils';\n\nconst DEFAULT_COLLAPSED_HEIGHT = 220;\n\ninterface PlanContextValue {\n collapsedHeight: number;\n isExpanded: boolean;\n /** Whether the rendered content overflows the collapsed height (measured, not estimated). */\n isClipped: boolean;\n setClipped: (clipped: boolean) => void;\n toggleExpanded: () => void;\n}\n\nconst PlanContext = createContext<PlanContextValue | null>(null);\n\nconst usePlanContext = () => {\n const context = useContext(PlanContext);\n\n if (!context) {\n throw new Error('Plan compound components must be rendered inside <Plan>.');\n }\n\n return context;\n};\n\nexport interface PlanProps extends ComponentProps<'div'> {\n collapsedHeight?: number;\n}\n\nexport function Plan({ children, collapsedHeight = DEFAULT_COLLAPSED_HEIGHT, className, ...props }: PlanProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n const [isClipped, setClipped] = useState(false);\n\n const toggleExpanded = () => {\n setIsExpanded(current => !current);\n };\n\n const contextValue = {\n collapsedHeight,\n isExpanded,\n isClipped,\n setClipped,\n toggleExpanded,\n };\n\n return (\n <PlanContext.Provider value={contextValue}>\n <div data-slot=\"plan\" className={cn('w-full overflow-hidden rounded-xl bg-surface3', className)} {...props}>\n {children}\n </div>\n </PlanContext.Provider>\n );\n}\n\nexport type PlanHeaderProps = ComponentProps<'div'>;\n\nexport function PlanHeader({ children, className, ...props }: PlanHeaderProps) {\n return (\n <div\n data-slot=\"plan-header\"\n className={cn('flex min-h-10 items-center justify-between gap-3 px-4 pt-3', className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport type PlanLabelProps = ComponentProps<'div'>;\n\nexport function PlanLabel({ children = 'Plan', className, ...props }: PlanLabelProps) {\n return (\n <div data-slot=\"plan-label\" className={cn('flex min-w-0 items-center gap-2', className)} {...props}>\n <Icon size=\"sm\" className=\"text-icon3\">\n <ClipboardList />\n </Icon>\n <Txt as=\"span\" variant=\"ui-sm\" className=\"text-neutral4\">\n {children}\n </Txt>\n </div>\n );\n}\n\nexport type PlanHeaderActionsProps = ComponentProps<'div'>;\n\nexport function PlanHeaderActions({ children, className, ...props }: PlanHeaderActionsProps) {\n return (\n <div data-slot=\"plan-header-actions\" className={cn('flex shrink-0 items-center gap-1', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport type PlanStatusProps = Omit<ComponentProps<typeof Badge>, 'icon' | 'indicator' | 'size'>;\n\nexport function PlanStatus({ children, variant = 'neutral', ...props }: PlanStatusProps) {\n return (\n <Badge {...props} variant={variant} size=\"xs\" indicator=\"dot\">\n {children}\n </Badge>\n );\n}\n\nexport interface PlanCopyButtonProps extends Omit<\n ComponentProps<typeof Button>,\n 'aria-label' | 'children' | 'onClick' | 'size' | 'tooltip' | 'type' | 'variant'\n> {\n content: string;\n}\n\nexport function PlanCopyButton({ content, ...props }: PlanCopyButtonProps) {\n const { isCopied, handleCopy } = useCopyToClipboard({\n text: content,\n copiedDuration: 1500,\n showToast: false,\n });\n\n return (\n <Button\n {...props}\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n tooltip=\"Copy plan\"\n aria-label=\"Copy plan\"\n onClick={handleCopy}\n >\n {isCopied ? <CheckIcon /> : <CopyIcon />}\n </Button>\n );\n}\n\nexport type PlanBodyProps = ComponentProps<'div'>;\n\nexport function PlanBody({ children, className, ...props }: PlanBodyProps) {\n return (\n <div data-slot=\"plan-body\" className={cn('px-5 pt-4 pb-5', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport type PlanIntroProps = ComponentProps<'div'>;\n\nexport function PlanIntro({ children, className, ...props }: PlanIntroProps) {\n return (\n <div data-slot=\"plan-intro\" className={cn('mb-5 space-y-1', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface PlanTitleProps extends Omit<ComponentProps<typeof Txt>, 'as' | 'children' | 'variant'> {\n children: ReactNode;\n}\n\nexport function PlanTitle({ children, className, ...props }: PlanTitleProps) {\n return (\n <Txt {...props} as=\"h3\" variant=\"header-sm\" className={cn('text-neutral7 font-semibold', className)}>\n {children}\n </Txt>\n );\n}\n\nexport interface PlanPathProps extends Omit<\n ComponentProps<typeof Txt>,\n 'as' | 'children' | 'font' | 'title' | 'variant'\n> {\n children: string;\n}\n\nconst getFileName = (path: string) => {\n const segments = path.split(/[\\\\/]/).filter(Boolean);\n return segments[segments.length - 1] ?? path;\n};\n\nexport function PlanPath({ children, className, ...props }: PlanPathProps) {\n return (\n <Txt\n {...props}\n as=\"p\"\n variant=\"ui-xs\"\n font=\"mono\"\n title={children}\n className={cn('max-w-full truncate overflow-hidden text-neutral3', className)}\n >\n {getFileName(children)}\n </Txt>\n );\n}\n\nexport type PlanMainProps = ComponentProps<'div'>;\n\nexport function PlanMain({ children, className, ...props }: PlanMainProps) {\n return (\n <div data-slot=\"plan-main\" className={cn('relative', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface PlanContentProps extends Omit<ComponentProps<'div'>, 'children'> {\n children: string;\n}\n\nexport function PlanContent({ children, className, style, ...props }: PlanContentProps) {\n const { collapsedHeight, isExpanded, isClipped, setClipped } = usePlanContext();\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Measure the rendered content against the collapsed height so the clip hint\n // and expand control track actual overflow — not an estimate of it.\n useLayoutEffect(() => {\n const element = contentRef.current;\n if (!element) return;\n\n const measure = () => setClipped(element.scrollHeight > collapsedHeight);\n measure();\n\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [children, collapsedHeight, setClipped]);\n\n const showClipHint = !isExpanded && isClipped;\n\n return (\n <div\n data-slot=\"plan-content\"\n // The clip hint masks the content itself, so it reads correctly on any card background.\n {...(showClipHint ? { 'data-clipped': '' } : {})}\n className={cn(\n 'relative',\n !isExpanded && 'overflow-hidden',\n showClipHint && 'mask-b-from-60% mask-b-to-100%',\n className,\n )}\n style={!isExpanded ? { ...style, maxHeight: collapsedHeight } : style}\n {...props}\n >\n <div\n ref={contentRef}\n className=\"[&_code]:bg-surface4 [&_h1]:text-header-md [&_h1]:leading-header-md [&_h2]:text-header-sm [&_h2]:leading-header-sm [&_h3]:text-ui-lg [&_h3]:leading-ui-lg [&_p]:text-ui-md [&_p]:leading-6\"\n >\n <MarkdownRenderer className=\"text-neutral6\">{children}</MarkdownRenderer>\n </div>\n </div>\n );\n}\n\nexport interface PlanFileProps extends Omit<ComponentProps<'div'>, 'children'> {\n children: string;\n}\n\nexport function PlanFile({ children, className, ...props }: PlanFileProps) {\n return (\n <div data-slot=\"plan-file\" className={className} {...props}>\n <Txt as=\"p\" variant=\"ui-xs\" className=\"text-neutral3 mb-2\">\n Plan file\n </Txt>\n <Txt as=\"p\" variant=\"ui-sm\" className=\"text-neutral6 font-mono break-all\">\n {children}\n </Txt>\n </div>\n );\n}\n\nexport type PlanControlsProps = ComponentProps<'div'>;\n\nexport function PlanControls({ children, className, ...props }: PlanControlsProps) {\n const hasActions = Boolean(children);\n\n return (\n <div\n data-slot=\"plan-controls\"\n className={cn('relative z-10 mt-4 flex justify-center empty:hidden', className)}\n {...props}\n >\n {hasActions ? (\n <div className=\"grid w-full max-w-sm grid-cols-[1fr_auto_1fr] items-center gap-2 px-10\">{children}</div>\n ) : (\n <PlanExpandButton />\n )}\n </div>\n );\n}\n\nexport type PlanActionGroupProps = ComponentProps<'div'>;\n\nexport function PlanActionGroup({ children, className, ...props }: PlanActionGroupProps) {\n return (\n <div data-slot=\"plan-action-group\" className={cn('flex justify-start gap-2 empty:hidden', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport type PlanExpandButtonProps = Omit<\n ComponentProps<typeof Button>,\n 'aria-label' | 'children' | 'onClick' | 'size' | 'type' | 'variant'\n>;\n\nexport function PlanExpandButton({ className, ...props }: PlanExpandButtonProps) {\n const { isExpanded, isClipped, toggleExpanded } = usePlanContext();\n\n // Nothing to expand: the collapsed card already shows the whole plan.\n if (!isClipped && !isExpanded) return null;\n\n return (\n <Button\n {...props}\n className={cn('shrink-0 whitespace-nowrap', className)}\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n aria-label={isExpanded ? 'Collapse plan' : 'Expand plan'}\n onClick={toggleExpanded}\n >\n {isExpanded ? <Minimize2 /> : <Maximize2 />}\n {isExpanded ? 'Collapse plan' : 'Expand plan'}\n </Button>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { u as useDataListRowWrapperContext,
|
|
1
|
+
import { u as useDataListRowWrapperContext, r as dataListRowVariants, s as dataListRowStaticStyles, D as DataListRoot, c as DataListNextPageLoading, h as DataListSpacer, g as DataListNoMatch, t as DataListTopSelectCell, v as DataListSelectCell, e as DataListTimeCell, f as DataListDateCell, w as DataListNumberCell, x as DataListRowHeaderCell, q as DataListIdCell, y as DataListDescriptionCell, z as DataListNameCell, b as DataListTextCell, A as DataListActionsCell, a as DataListCell, i as DataListRowLink, j as DataListRowButton, k as DataListRowWrapper, l as DataListTopCellSmart, m as DataListTopCellWithTooltip, n as DataListTopCell, o as DataListTop } from './data-list-top-cell-hNkk6S-Q.js';
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
3
|
import { ArrowLeftIcon, ArrowRightIcon } from 'lucide-react';
|
|
4
4
|
import { B as Button } from './Button-vr_I4iME.js';
|
|
@@ -126,4 +126,4 @@ const DataList = Object.assign(DataListRoot, {
|
|
|
126
126
|
});
|
|
127
127
|
|
|
128
128
|
export { DataList as D, DataListSubHeading as a, DataListSubheader as b };
|
|
129
|
-
//# sourceMappingURL=data-list-
|
|
129
|
+
//# sourceMappingURL=data-list-C3tjx5Vb.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-list-BOI8fRuk.js","sources":["../src/ds/components/DataList/data-list-pagination.tsx","../src/ds/components/DataList/data-list-row-static.tsx","../src/ds/components/DataList/data-list-subheader.tsx","../src/ds/components/DataList/data-list-subheading.tsx","../src/ds/components/DataList/data-list-top-cells.tsx","../src/ds/components/DataList/data-list.tsx"],"sourcesContent":["import { ArrowLeftIcon, ArrowRightIcon } from 'lucide-react';\nimport { Button } from '@/ds/components/Button';\n\nexport type DataListPaginationProps = {\n currentPage?: number;\n hasMore?: boolean;\n onNextPage?: () => void;\n onPrevPage?: () => void;\n};\n\nexport function DataListPagination({ currentPage, hasMore, onNextPage, onPrevPage }: DataListPaginationProps) {\n const showNavigation = (typeof currentPage === 'number' && currentPage > 0) || hasMore;\n\n return (\n <div className=\"text-ui-md text-neutral3 col-span-full flex items-center justify-center gap-8 py-4\">\n <span>\n Page <b>{currentPage ? currentPage + 1 : '1'}</b>\n </span>\n {showNavigation && (\n <div className=\"flex gap-4\">\n {typeof currentPage === 'number' && currentPage > 0 && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onPrevPage}>\n <ArrowLeftIcon />\n Previous\n </Button>\n )}\n {hasMore && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onNextPage}>\n Next\n <ArrowRightIcon />\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { useDataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowStaticStyles, dataListRowVariants } from './shared';\nimport type { DataListRowSharedProps } from './shared';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowStaticProps = ComponentPropsWithoutRef<'div'> & DataListRowSharedProps;\n\n/**\n * Non-interactive row. Use when a row should *display* like a regular row but\n * has no link target or click handler\n */\nexport const DataListRowStatic = forwardRef<HTMLDivElement, DataListRowStaticProps>(\n ({ children, className, colStart, colEnd, featured, variant, style, ...rest }, ref) => {\n const isWrapped = useDataListRowWrapperContext();\n const hasColumnOverride = colStart !== undefined || colEnd !== undefined;\n const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;\n return (\n <div\n ref={ref}\n className={cn(\n isWrapped\n ? 'grid grid-cols-subgrid gap-8 rounded-lg px-5 transition-colors duration-200'\n : dataListRowStaticStyles,\n // `!` so the selection fill wins over borderless table root styling\n // (higher-specificity descendant rules); same color in `default`.\n featured && 'bg-surface-row-featured!',\n dataListRowVariants({ variant }),\n className,\n )}\n style={resolvedStyle}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n\nDataListRowStatic.displayName = 'DataListRowStatic';\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListSubheaderProps = ComponentPropsWithoutRef<'div'>;\n\nexport const DataListSubheader = forwardRef<HTMLDivElement, DataListSubheaderProps>(\n ({ children, className, ...rest }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'relative isolate col-span-full mt-2 border-none px-5 py-3 text-ui-md font-medium text-neutral4',\n 'before:absolute before:inset-0 before:-z-1 before:rounded-lg before:bg-[var(--data-list-sticky-header-background)]',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n\nDataListSubheader.displayName = 'DataListSubheader';\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListSubHeadingProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport function DataListSubHeading({ children, className }: DataListSubHeadingProps) {\n return <span className={cn('text-ui-sm font-normal text-neutral2', className)}>{children}</span>;\n}\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListTopCellsProps = ComponentPropsWithoutRef<'div'> & {\n /**\n * Drop the group's default left margin. Use when this sits as the second\n * child of a gap-0 `DataList.Top`, beside a `DataList.TopSelectCell` that\n * owns the leading column.\n */\n flushLeft?: boolean;\n /**\n * Place the group starting at this column line, spanning through to the\n * last column. Defaults to the full grid (`col-span-full`). Use when this\n * sits beside a leading cell that owns column 1.\n */\n colStart?: number;\n};\n\n/**\n * Non-interactive header equivalent of `DataList.RowButton`. Groups a set of\n * `DataList.TopCell`s with the same horizontal layout (gap, mx, px) as\n * `RowButton`, so columns inside a wrapped `Top` line up cell-for-cell with the\n * columns inside a wrapped `Row`.\n */\nexport const DataListTopCells = forwardRef<HTMLDivElement, DataListTopCellsProps>(\n ({ children, className, flushLeft, colStart, style, ...rest }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'pointer-events-none grid grid-cols-subgrid gap-8 px-5 [&>*]:pointer-events-auto',\n !colStart && 'col-span-full',\n flushLeft && 'pl-0!',\n className,\n )}\n style={colStart ? { ...style, gridColumn: `${colStart} / -1` } : style}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n\nDataListTopCells.displayName = 'DataListTopCells';\n","import {\n DataListActionsCell,\n DataListCell,\n DataListTextCell,\n DataListNameCell,\n DataListDescriptionCell,\n DataListIdCell,\n DataListRowHeaderCell,\n DataListNumberCell,\n DataListSelectCell,\n DataListDateCell,\n DataListTimeCell,\n} from './data-list-cells';\nimport { DataListNextPageLoading } from './data-list-next-page-loading';\nimport { DataListNoMatch } from './data-list-no-match';\nimport { DataListPagination } from './data-list-pagination';\nimport { DataListRoot } from './data-list-root';\nimport { DataListRowButton } from './data-list-row-button';\nimport { DataListRowLink } from './data-list-row-link';\nimport { DataListRowStatic } from './data-list-row-static';\nimport { DataListRowWrapper } from './data-list-row-wrapper';\nimport { DataListSpacer } from './data-list-spacer';\nimport { DataListSubheader } from './data-list-subheader';\nimport { DataListSubHeading } from './data-list-subheading';\nimport { DataListTop } from './data-list-top';\nimport {\n DataListTopCell,\n DataListTopCellWithTooltip,\n DataListTopCellSmart,\n DataListTopSelectCell,\n} from './data-list-top-cell';\nimport { DataListTopCells } from './data-list-top-cells';\n\nexport type { DataListRootProps, DataListStickyHeaderBackground, DataListVariant } from './data-list-root';\n\nexport const DataList = Object.assign(DataListRoot, {\n Top: DataListTop,\n TopCells: DataListTopCells,\n TopCell: DataListTopCell,\n TopCellWithTooltip: DataListTopCellWithTooltip,\n TopCellSmart: DataListTopCellSmart,\n RowWrapper: DataListRowWrapper,\n RowButton: DataListRowButton,\n RowLink: DataListRowLink,\n RowStatic: DataListRowStatic,\n Cell: DataListCell,\n ActionsCell: DataListActionsCell,\n TextCell: DataListTextCell,\n NameCell: DataListNameCell,\n DescriptionCell: DataListDescriptionCell,\n IdCell: DataListIdCell,\n RowHeaderCell: DataListRowHeaderCell,\n NumberCell: DataListNumberCell,\n DateCell: DataListDateCell,\n TimeCell: DataListTimeCell,\n SelectCell: DataListSelectCell,\n TopSelectCell: DataListTopSelectCell,\n NoMatch: DataListNoMatch,\n Subheader: DataListSubheader,\n SubHeading: DataListSubHeading,\n Spacer: DataListSpacer,\n NextPageLoading: DataListNextPageLoading,\n Pagination: DataListPagination,\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-list-C3tjx5Vb.js","sources":["../src/ds/components/DataList/data-list-pagination.tsx","../src/ds/components/DataList/data-list-row-static.tsx","../src/ds/components/DataList/data-list-subheader.tsx","../src/ds/components/DataList/data-list-subheading.tsx","../src/ds/components/DataList/data-list-top-cells.tsx","../src/ds/components/DataList/data-list.tsx"],"sourcesContent":["import { ArrowLeftIcon, ArrowRightIcon } from 'lucide-react';\nimport { Button } from '@/ds/components/Button';\n\nexport type DataListPaginationProps = {\n currentPage?: number;\n hasMore?: boolean;\n onNextPage?: () => void;\n onPrevPage?: () => void;\n};\n\nexport function DataListPagination({ currentPage, hasMore, onNextPage, onPrevPage }: DataListPaginationProps) {\n const showNavigation = (typeof currentPage === 'number' && currentPage > 0) || hasMore;\n\n return (\n <div className=\"text-ui-md text-neutral3 col-span-full flex items-center justify-center gap-8 py-4\">\n <span>\n Page <b>{currentPage ? currentPage + 1 : '1'}</b>\n </span>\n {showNavigation && (\n <div className=\"flex gap-4\">\n {typeof currentPage === 'number' && currentPage > 0 && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onPrevPage}>\n <ArrowLeftIcon />\n Previous\n </Button>\n )}\n {hasMore && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onNextPage}>\n Next\n <ArrowRightIcon />\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { useDataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowStaticStyles, dataListRowVariants } from './shared';\nimport type { DataListRowSharedProps } from './shared';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowStaticProps = ComponentPropsWithoutRef<'div'> & DataListRowSharedProps;\n\n/**\n * Non-interactive row. Use when a row should *display* like a regular row but\n * has no link target or click handler\n */\nexport const DataListRowStatic = forwardRef<HTMLDivElement, DataListRowStaticProps>(\n ({ children, className, colStart, colEnd, featured, variant, style, ...rest }, ref) => {\n const isWrapped = useDataListRowWrapperContext();\n const hasColumnOverride = colStart !== undefined || colEnd !== undefined;\n const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;\n return (\n <div\n ref={ref}\n className={cn(\n isWrapped\n ? 'grid grid-cols-subgrid gap-8 rounded-lg px-5 transition-colors duration-200'\n : dataListRowStaticStyles,\n // `!` so the selection fill wins over borderless table root styling\n // (higher-specificity descendant rules); same color in `default`.\n featured && 'bg-surface-row-featured!',\n dataListRowVariants({ variant }),\n className,\n )}\n style={resolvedStyle}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n\nDataListRowStatic.displayName = 'DataListRowStatic';\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListSubheaderProps = ComponentPropsWithoutRef<'div'>;\n\nexport const DataListSubheader = forwardRef<HTMLDivElement, DataListSubheaderProps>(\n ({ children, className, ...rest }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'relative isolate col-span-full mt-2 border-none px-5 py-3 text-ui-md font-medium text-neutral4',\n 'before:absolute before:inset-0 before:-z-1 before:rounded-lg before:bg-[var(--data-list-sticky-header-background)]',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n\nDataListSubheader.displayName = 'DataListSubheader';\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListSubHeadingProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport function DataListSubHeading({ children, className }: DataListSubHeadingProps) {\n return <span className={cn('text-ui-sm font-normal text-neutral2', className)}>{children}</span>;\n}\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListTopCellsProps = ComponentPropsWithoutRef<'div'> & {\n /**\n * Drop the group's default left margin. Use when this sits as the second\n * child of a gap-0 `DataList.Top`, beside a `DataList.TopSelectCell` that\n * owns the leading column.\n */\n flushLeft?: boolean;\n /**\n * Place the group starting at this column line, spanning through to the\n * last column. Defaults to the full grid (`col-span-full`). Use when this\n * sits beside a leading cell that owns column 1.\n */\n colStart?: number;\n};\n\n/**\n * Non-interactive header equivalent of `DataList.RowButton`. Groups a set of\n * `DataList.TopCell`s with the same horizontal layout (gap, mx, px) as\n * `RowButton`, so columns inside a wrapped `Top` line up cell-for-cell with the\n * columns inside a wrapped `Row`.\n */\nexport const DataListTopCells = forwardRef<HTMLDivElement, DataListTopCellsProps>(\n ({ children, className, flushLeft, colStart, style, ...rest }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'pointer-events-none grid grid-cols-subgrid gap-8 px-5 [&>*]:pointer-events-auto',\n !colStart && 'col-span-full',\n flushLeft && 'pl-0!',\n className,\n )}\n style={colStart ? { ...style, gridColumn: `${colStart} / -1` } : style}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n\nDataListTopCells.displayName = 'DataListTopCells';\n","import {\n DataListActionsCell,\n DataListCell,\n DataListTextCell,\n DataListNameCell,\n DataListDescriptionCell,\n DataListIdCell,\n DataListRowHeaderCell,\n DataListNumberCell,\n DataListSelectCell,\n DataListDateCell,\n DataListTimeCell,\n} from './data-list-cells';\nimport { DataListNextPageLoading } from './data-list-next-page-loading';\nimport { DataListNoMatch } from './data-list-no-match';\nimport { DataListPagination } from './data-list-pagination';\nimport { DataListRoot } from './data-list-root';\nimport { DataListRowButton } from './data-list-row-button';\nimport { DataListRowLink } from './data-list-row-link';\nimport { DataListRowStatic } from './data-list-row-static';\nimport { DataListRowWrapper } from './data-list-row-wrapper';\nimport { DataListSpacer } from './data-list-spacer';\nimport { DataListSubheader } from './data-list-subheader';\nimport { DataListSubHeading } from './data-list-subheading';\nimport { DataListTop } from './data-list-top';\nimport {\n DataListTopCell,\n DataListTopCellWithTooltip,\n DataListTopCellSmart,\n DataListTopSelectCell,\n} from './data-list-top-cell';\nimport { DataListTopCells } from './data-list-top-cells';\n\nexport type { DataListRootProps, DataListStickyHeaderBackground, DataListVariant } from './data-list-root';\n\nexport const DataList = Object.assign(DataListRoot, {\n Top: DataListTop,\n TopCells: DataListTopCells,\n TopCell: DataListTopCell,\n TopCellWithTooltip: DataListTopCellWithTooltip,\n TopCellSmart: DataListTopCellSmart,\n RowWrapper: DataListRowWrapper,\n RowButton: DataListRowButton,\n RowLink: DataListRowLink,\n RowStatic: DataListRowStatic,\n Cell: DataListCell,\n ActionsCell: DataListActionsCell,\n TextCell: DataListTextCell,\n NameCell: DataListNameCell,\n DescriptionCell: DataListDescriptionCell,\n IdCell: DataListIdCell,\n RowHeaderCell: DataListRowHeaderCell,\n NumberCell: DataListNumberCell,\n DateCell: DataListDateCell,\n TimeCell: DataListTimeCell,\n SelectCell: DataListSelectCell,\n TopSelectCell: DataListTopSelectCell,\n NoMatch: DataListNoMatch,\n Subheader: DataListSubheader,\n SubHeading: DataListSubHeading,\n Spacer: DataListSpacer,\n NextPageLoading: DataListNextPageLoading,\n Pagination: DataListPagination,\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const dataListTopCell = require('./data-list-top-cell-
|
|
3
|
+
const dataListTopCell = require('./data-list-top-cell-DAztx3m8.cjs');
|
|
4
4
|
const jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
const lucideReact = require('lucide-react');
|
|
6
6
|
const Button = require('./Button-DA5XLUon.cjs');
|
|
@@ -130,4 +130,4 @@ const DataList = Object.assign(dataListTopCell.DataListRoot, {
|
|
|
130
130
|
exports.DataList = DataList;
|
|
131
131
|
exports.DataListSubHeading = DataListSubHeading;
|
|
132
132
|
exports.DataListSubheader = DataListSubheader;
|
|
133
|
-
//# sourceMappingURL=data-list-
|
|
133
|
+
//# sourceMappingURL=data-list-CRDewYj9.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-list-CCacNODd.cjs","sources":["../src/ds/components/DataList/data-list-pagination.tsx","../src/ds/components/DataList/data-list-row-static.tsx","../src/ds/components/DataList/data-list-subheader.tsx","../src/ds/components/DataList/data-list-subheading.tsx","../src/ds/components/DataList/data-list-top-cells.tsx","../src/ds/components/DataList/data-list.tsx"],"sourcesContent":["import { ArrowLeftIcon, ArrowRightIcon } from 'lucide-react';\nimport { Button } from '@/ds/components/Button';\n\nexport type DataListPaginationProps = {\n currentPage?: number;\n hasMore?: boolean;\n onNextPage?: () => void;\n onPrevPage?: () => void;\n};\n\nexport function DataListPagination({ currentPage, hasMore, onNextPage, onPrevPage }: DataListPaginationProps) {\n const showNavigation = (typeof currentPage === 'number' && currentPage > 0) || hasMore;\n\n return (\n <div className=\"text-ui-md text-neutral3 col-span-full flex items-center justify-center gap-8 py-4\">\n <span>\n Page <b>{currentPage ? currentPage + 1 : '1'}</b>\n </span>\n {showNavigation && (\n <div className=\"flex gap-4\">\n {typeof currentPage === 'number' && currentPage > 0 && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onPrevPage}>\n <ArrowLeftIcon />\n Previous\n </Button>\n )}\n {hasMore && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onNextPage}>\n Next\n <ArrowRightIcon />\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { useDataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowStaticStyles, dataListRowVariants } from './shared';\nimport type { DataListRowSharedProps } from './shared';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowStaticProps = ComponentPropsWithoutRef<'div'> & DataListRowSharedProps;\n\n/**\n * Non-interactive row. Use when a row should *display* like a regular row but\n * has no link target or click handler\n */\nexport const DataListRowStatic = forwardRef<HTMLDivElement, DataListRowStaticProps>(\n ({ children, className, colStart, colEnd, featured, variant, style, ...rest }, ref) => {\n const isWrapped = useDataListRowWrapperContext();\n const hasColumnOverride = colStart !== undefined || colEnd !== undefined;\n const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;\n return (\n <div\n ref={ref}\n className={cn(\n isWrapped\n ? 'grid grid-cols-subgrid gap-8 rounded-lg px-5 transition-colors duration-200'\n : dataListRowStaticStyles,\n // `!` so the selection fill wins over borderless table root styling\n // (higher-specificity descendant rules); same color in `default`.\n featured && 'bg-surface-row-featured!',\n dataListRowVariants({ variant }),\n className,\n )}\n style={resolvedStyle}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n\nDataListRowStatic.displayName = 'DataListRowStatic';\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListSubheaderProps = ComponentPropsWithoutRef<'div'>;\n\nexport const DataListSubheader = forwardRef<HTMLDivElement, DataListSubheaderProps>(\n ({ children, className, ...rest }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'relative isolate col-span-full mt-2 border-none px-5 py-3 text-ui-md font-medium text-neutral4',\n 'before:absolute before:inset-0 before:-z-1 before:rounded-lg before:bg-[var(--data-list-sticky-header-background)]',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n\nDataListSubheader.displayName = 'DataListSubheader';\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListSubHeadingProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport function DataListSubHeading({ children, className }: DataListSubHeadingProps) {\n return <span className={cn('text-ui-sm font-normal text-neutral2', className)}>{children}</span>;\n}\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListTopCellsProps = ComponentPropsWithoutRef<'div'> & {\n /**\n * Drop the group's default left margin. Use when this sits as the second\n * child of a gap-0 `DataList.Top`, beside a `DataList.TopSelectCell` that\n * owns the leading column.\n */\n flushLeft?: boolean;\n /**\n * Place the group starting at this column line, spanning through to the\n * last column. Defaults to the full grid (`col-span-full`). Use when this\n * sits beside a leading cell that owns column 1.\n */\n colStart?: number;\n};\n\n/**\n * Non-interactive header equivalent of `DataList.RowButton`. Groups a set of\n * `DataList.TopCell`s with the same horizontal layout (gap, mx, px) as\n * `RowButton`, so columns inside a wrapped `Top` line up cell-for-cell with the\n * columns inside a wrapped `Row`.\n */\nexport const DataListTopCells = forwardRef<HTMLDivElement, DataListTopCellsProps>(\n ({ children, className, flushLeft, colStart, style, ...rest }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'pointer-events-none grid grid-cols-subgrid gap-8 px-5 [&>*]:pointer-events-auto',\n !colStart && 'col-span-full',\n flushLeft && 'pl-0!',\n className,\n )}\n style={colStart ? { ...style, gridColumn: `${colStart} / -1` } : style}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n\nDataListTopCells.displayName = 'DataListTopCells';\n","import {\n DataListActionsCell,\n DataListCell,\n DataListTextCell,\n DataListNameCell,\n DataListDescriptionCell,\n DataListIdCell,\n DataListRowHeaderCell,\n DataListNumberCell,\n DataListSelectCell,\n DataListDateCell,\n DataListTimeCell,\n} from './data-list-cells';\nimport { DataListNextPageLoading } from './data-list-next-page-loading';\nimport { DataListNoMatch } from './data-list-no-match';\nimport { DataListPagination } from './data-list-pagination';\nimport { DataListRoot } from './data-list-root';\nimport { DataListRowButton } from './data-list-row-button';\nimport { DataListRowLink } from './data-list-row-link';\nimport { DataListRowStatic } from './data-list-row-static';\nimport { DataListRowWrapper } from './data-list-row-wrapper';\nimport { DataListSpacer } from './data-list-spacer';\nimport { DataListSubheader } from './data-list-subheader';\nimport { DataListSubHeading } from './data-list-subheading';\nimport { DataListTop } from './data-list-top';\nimport {\n DataListTopCell,\n DataListTopCellWithTooltip,\n DataListTopCellSmart,\n DataListTopSelectCell,\n} from './data-list-top-cell';\nimport { DataListTopCells } from './data-list-top-cells';\n\nexport type { DataListRootProps, DataListStickyHeaderBackground, DataListVariant } from './data-list-root';\n\nexport const DataList = Object.assign(DataListRoot, {\n Top: DataListTop,\n TopCells: DataListTopCells,\n TopCell: DataListTopCell,\n TopCellWithTooltip: DataListTopCellWithTooltip,\n TopCellSmart: DataListTopCellSmart,\n RowWrapper: DataListRowWrapper,\n RowButton: DataListRowButton,\n RowLink: DataListRowLink,\n RowStatic: DataListRowStatic,\n Cell: DataListCell,\n ActionsCell: DataListActionsCell,\n TextCell: DataListTextCell,\n NameCell: DataListNameCell,\n DescriptionCell: DataListDescriptionCell,\n IdCell: DataListIdCell,\n RowHeaderCell: DataListRowHeaderCell,\n NumberCell: DataListNumberCell,\n DateCell: DataListDateCell,\n TimeCell: DataListTimeCell,\n SelectCell: DataListSelectCell,\n TopSelectCell: DataListTopSelectCell,\n NoMatch: DataListNoMatch,\n Subheader: DataListSubheader,\n SubHeading: DataListSubHeading,\n Spacer: DataListSpacer,\n NextPageLoading: DataListNextPageLoading,\n Pagination: DataListPagination,\n});\n"],"names":["jsxs","jsx","Button","ArrowLeftIcon","ArrowRightIcon","forwardRef","useDataListRowWrapperContext","cn","dataListRowStaticStyles","dataListRowVariants","DataListRoot","DataListTop","DataListTopCell","DataListTopCellWithTooltip","DataListTopCellSmart","DataListRowWrapper","DataListRowButton","DataListRowLink","DataListCell","DataListActionsCell","DataListTextCell","DataListNameCell","DataListDescriptionCell","DataListIdCell","DataListRowHeaderCell","DataListNumberCell","DataListDateCell","DataListTimeCell","DataListSelectCell","DataListTopSelectCell","DataListNoMatch","DataListSpacer","DataListNextPageLoading"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-list-CRDewYj9.cjs","sources":["../src/ds/components/DataList/data-list-pagination.tsx","../src/ds/components/DataList/data-list-row-static.tsx","../src/ds/components/DataList/data-list-subheader.tsx","../src/ds/components/DataList/data-list-subheading.tsx","../src/ds/components/DataList/data-list-top-cells.tsx","../src/ds/components/DataList/data-list.tsx"],"sourcesContent":["import { ArrowLeftIcon, ArrowRightIcon } from 'lucide-react';\nimport { Button } from '@/ds/components/Button';\n\nexport type DataListPaginationProps = {\n currentPage?: number;\n hasMore?: boolean;\n onNextPage?: () => void;\n onPrevPage?: () => void;\n};\n\nexport function DataListPagination({ currentPage, hasMore, onNextPage, onPrevPage }: DataListPaginationProps) {\n const showNavigation = (typeof currentPage === 'number' && currentPage > 0) || hasMore;\n\n return (\n <div className=\"text-ui-md text-neutral3 col-span-full flex items-center justify-center gap-8 py-4\">\n <span>\n Page <b>{currentPage ? currentPage + 1 : '1'}</b>\n </span>\n {showNavigation && (\n <div className=\"flex gap-4\">\n {typeof currentPage === 'number' && currentPage > 0 && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onPrevPage}>\n <ArrowLeftIcon />\n Previous\n </Button>\n )}\n {hasMore && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onNextPage}>\n Next\n <ArrowRightIcon />\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { useDataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowStaticStyles, dataListRowVariants } from './shared';\nimport type { DataListRowSharedProps } from './shared';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowStaticProps = ComponentPropsWithoutRef<'div'> & DataListRowSharedProps;\n\n/**\n * Non-interactive row. Use when a row should *display* like a regular row but\n * has no link target or click handler\n */\nexport const DataListRowStatic = forwardRef<HTMLDivElement, DataListRowStaticProps>(\n ({ children, className, colStart, colEnd, featured, variant, style, ...rest }, ref) => {\n const isWrapped = useDataListRowWrapperContext();\n const hasColumnOverride = colStart !== undefined || colEnd !== undefined;\n const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;\n return (\n <div\n ref={ref}\n className={cn(\n isWrapped\n ? 'grid grid-cols-subgrid gap-8 rounded-lg px-5 transition-colors duration-200'\n : dataListRowStaticStyles,\n // `!` so the selection fill wins over borderless table root styling\n // (higher-specificity descendant rules); same color in `default`.\n featured && 'bg-surface-row-featured!',\n dataListRowVariants({ variant }),\n className,\n )}\n style={resolvedStyle}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n\nDataListRowStatic.displayName = 'DataListRowStatic';\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListSubheaderProps = ComponentPropsWithoutRef<'div'>;\n\nexport const DataListSubheader = forwardRef<HTMLDivElement, DataListSubheaderProps>(\n ({ children, className, ...rest }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'relative isolate col-span-full mt-2 border-none px-5 py-3 text-ui-md font-medium text-neutral4',\n 'before:absolute before:inset-0 before:-z-1 before:rounded-lg before:bg-[var(--data-list-sticky-header-background)]',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n\nDataListSubheader.displayName = 'DataListSubheader';\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListSubHeadingProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport function DataListSubHeading({ children, className }: DataListSubHeadingProps) {\n return <span className={cn('text-ui-sm font-normal text-neutral2', className)}>{children}</span>;\n}\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListTopCellsProps = ComponentPropsWithoutRef<'div'> & {\n /**\n * Drop the group's default left margin. Use when this sits as the second\n * child of a gap-0 `DataList.Top`, beside a `DataList.TopSelectCell` that\n * owns the leading column.\n */\n flushLeft?: boolean;\n /**\n * Place the group starting at this column line, spanning through to the\n * last column. Defaults to the full grid (`col-span-full`). Use when this\n * sits beside a leading cell that owns column 1.\n */\n colStart?: number;\n};\n\n/**\n * Non-interactive header equivalent of `DataList.RowButton`. Groups a set of\n * `DataList.TopCell`s with the same horizontal layout (gap, mx, px) as\n * `RowButton`, so columns inside a wrapped `Top` line up cell-for-cell with the\n * columns inside a wrapped `Row`.\n */\nexport const DataListTopCells = forwardRef<HTMLDivElement, DataListTopCellsProps>(\n ({ children, className, flushLeft, colStart, style, ...rest }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'pointer-events-none grid grid-cols-subgrid gap-8 px-5 [&>*]:pointer-events-auto',\n !colStart && 'col-span-full',\n flushLeft && 'pl-0!',\n className,\n )}\n style={colStart ? { ...style, gridColumn: `${colStart} / -1` } : style}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n\nDataListTopCells.displayName = 'DataListTopCells';\n","import {\n DataListActionsCell,\n DataListCell,\n DataListTextCell,\n DataListNameCell,\n DataListDescriptionCell,\n DataListIdCell,\n DataListRowHeaderCell,\n DataListNumberCell,\n DataListSelectCell,\n DataListDateCell,\n DataListTimeCell,\n} from './data-list-cells';\nimport { DataListNextPageLoading } from './data-list-next-page-loading';\nimport { DataListNoMatch } from './data-list-no-match';\nimport { DataListPagination } from './data-list-pagination';\nimport { DataListRoot } from './data-list-root';\nimport { DataListRowButton } from './data-list-row-button';\nimport { DataListRowLink } from './data-list-row-link';\nimport { DataListRowStatic } from './data-list-row-static';\nimport { DataListRowWrapper } from './data-list-row-wrapper';\nimport { DataListSpacer } from './data-list-spacer';\nimport { DataListSubheader } from './data-list-subheader';\nimport { DataListSubHeading } from './data-list-subheading';\nimport { DataListTop } from './data-list-top';\nimport {\n DataListTopCell,\n DataListTopCellWithTooltip,\n DataListTopCellSmart,\n DataListTopSelectCell,\n} from './data-list-top-cell';\nimport { DataListTopCells } from './data-list-top-cells';\n\nexport type { DataListRootProps, DataListStickyHeaderBackground, DataListVariant } from './data-list-root';\n\nexport const DataList = Object.assign(DataListRoot, {\n Top: DataListTop,\n TopCells: DataListTopCells,\n TopCell: DataListTopCell,\n TopCellWithTooltip: DataListTopCellWithTooltip,\n TopCellSmart: DataListTopCellSmart,\n RowWrapper: DataListRowWrapper,\n RowButton: DataListRowButton,\n RowLink: DataListRowLink,\n RowStatic: DataListRowStatic,\n Cell: DataListCell,\n ActionsCell: DataListActionsCell,\n TextCell: DataListTextCell,\n NameCell: DataListNameCell,\n DescriptionCell: DataListDescriptionCell,\n IdCell: DataListIdCell,\n RowHeaderCell: DataListRowHeaderCell,\n NumberCell: DataListNumberCell,\n DateCell: DataListDateCell,\n TimeCell: DataListTimeCell,\n SelectCell: DataListSelectCell,\n TopSelectCell: DataListTopSelectCell,\n NoMatch: DataListNoMatch,\n Subheader: DataListSubheader,\n SubHeading: DataListSubHeading,\n Spacer: DataListSpacer,\n NextPageLoading: DataListNextPageLoading,\n Pagination: DataListPagination,\n});\n"],"names":["jsxs","jsx","Button","ArrowLeftIcon","ArrowRightIcon","forwardRef","useDataListRowWrapperContext","cn","dataListRowStaticStyles","dataListRowVariants","DataListRoot","DataListTop","DataListTopCell","DataListTopCellWithTooltip","DataListTopCellSmart","DataListRowWrapper","DataListRowButton","DataListRowLink","DataListCell","DataListActionsCell","DataListTextCell","DataListNameCell","DataListDescriptionCell","DataListIdCell","DataListRowHeaderCell","DataListNumberCell","DataListDateCell","DataListTimeCell","DataListSelectCell","DataListTopSelectCell","DataListNoMatch","DataListSpacer","DataListNextPageLoading"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { D as DataListRoot, a as DataListCell, d as dataListRowOuterStyles } from './data-list-top-cell-
|
|
2
|
+
import { D as DataListRoot, a as DataListCell, d as dataListRowOuterStyles } from './data-list-top-cell-hNkk6S-Q.js';
|
|
3
3
|
import { c as cn } from './cn-BakJzhuv.js';
|
|
4
4
|
|
|
5
5
|
const widths = ["75%", "50%", "65%", "90%", "60%", "80%"];
|
|
@@ -31,4 +31,4 @@ function DataListSkeleton({ columns = "auto 1fr auto auto", numberOfRows = 3, fi
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export { DataListSkeleton as D };
|
|
34
|
-
//# sourceMappingURL=data-list-skeleton-
|
|
34
|
+
//# sourceMappingURL=data-list-skeleton-BCrkk6wG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-list-skeleton-
|
|
1
|
+
{"version":3,"file":"data-list-skeleton-BCrkk6wG.js","sources":["../src/ds/components/DataList/data-list-skeleton.tsx"],"sourcesContent":["import { DataListCell } from './data-list-cells';\nimport { DataListRoot } from './data-list-root';\nimport type { DataListFit } from './data-list-root';\nimport { dataListRowOuterStyles } from './shared';\nimport { cn } from '@/lib/utils';\n\nconst widths = ['75%', '50%', '65%', '90%', '60%', '80%'];\n\nexport type DataListSkeletonProps = {\n columns?: string;\n numberOfRows?: number;\n fit?: DataListFit;\n};\n\nexport function DataListSkeleton({ columns = 'auto 1fr auto auto', numberOfRows = 3, fit }: DataListSkeletonProps) {\n const columnParts = columns.trim().split(/\\s+/);\n const columnCount = columnParts.length;\n const skeletonColumns = columnParts.map(col => (col === 'auto' ? 'minmax(6rem, auto)' : col)).join(' ');\n\n const getPseudoRandomWidth = (rowIdx: number, colIdx: number) => {\n const index = (rowIdx + colIdx + columnCount + numberOfRows) % widths.length;\n return widths[index];\n };\n\n return (\n <DataListRoot columns={skeletonColumns} fit={fit}>\n {Array.from({ length: numberOfRows }).map((_, rowIdx) => (\n <div\n key={rowIdx}\n className={cn(\n 'grid grid-cols-subgrid gap-6 px-5 2xl:gap-12 3xl:gap-14 lg:gap-8 xl:gap-10',\n ...dataListRowOuterStyles,\n )}\n >\n {Array.from({ length: columnCount }).map((_, colIdx) => (\n <DataListCell key={colIdx}>\n <div\n className=\"bg-surface6 h-4 animate-pulse rounded-lg text-transparent select-none\"\n style={{ width: getPseudoRandomWidth(rowIdx, colIdx) }}\n />\n </DataListCell>\n ))}\n </div>\n ))}\n </DataListRoot>\n );\n}\n"],"names":["_"],"mappings":";;;;AAMA,MAAM,SAAS,CAAC,KAAA,EAAO,OAAO,KAAA,EAAO,KAAA,EAAO,OAAO,KAAK,CAAA;AAQjD,SAAS,iBAAiB,EAAE,OAAA,GAAU,sBAAsB,YAAA,GAAe,CAAA,EAAG,KAAI,EAA0B;AACjH,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AAC9C,EAAA,MAAM,cAAc,WAAA,CAAY,MAAA;AAChC,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,GAAA,CAAI,CAAA,GAAA,KAAQ,GAAA,KAAQ,SAAS,oBAAA,GAAuB,GAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAEtG,EAAA,MAAM,oBAAA,GAAuB,CAAC,MAAA,EAAgB,MAAA,KAAmB;AAC/D,IAAA,MAAM,KAAA,GAAA,CAAS,MAAA,GAAS,MAAA,GAAS,WAAA,GAAc,gBAAgB,MAAA,CAAO,MAAA;AACtE,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,uBACE,GAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,eAAA,EAAiB,KACrC,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,cAAc,CAAA,CAAE,GAAA,CAAI,CAAC,GAAG,MAAA,qBAC5C,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAEC,SAAA,EAAW,EAAA;AAAA,QACT,4EAAA;AAAA,QACA,GAAG;AAAA,OACL;AAAA,MAEC,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,WAAA,EAAa,CAAA,CAAE,GAAA,CAAI,CAACA,EAAAA,EAAG,MAAA,qBAC3C,GAAA,CAAC,YAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,uEAAA;AAAA,UACV,OAAO,EAAE,KAAA,EAAO,oBAAA,CAAqB,MAAA,EAAQ,MAAM,CAAA;AAAE;AAAA,OACvD,EAAA,EAJiB,MAKnB,CACD;AAAA,KAAA;AAAA,IAbI;AAAA,GAeR,CAAA,EACH,CAAA;AAEJ;;;;"}
|