@mastra/playground-ui 64.0.1-alpha.0 → 65.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +10 -2
  2. package/components.css +340 -0
  3. package/dist/code-DJReJPSX.cjs.map +1 -1
  4. package/dist/code-DLuATvYu.js.map +1 -1
  5. package/dist/components/Breadcrumb.cjs.js +4 -2
  6. package/dist/components/Breadcrumb.cjs.js.map +1 -1
  7. package/dist/components/Breadcrumb.es.js +5 -3
  8. package/dist/components/Breadcrumb.es.js.map +1 -1
  9. package/dist/components/ChatShell.cjs.js +2 -2
  10. package/dist/components/ChatShell.cjs.js.map +1 -1
  11. package/dist/components/ChatShell.es.js +2 -2
  12. package/dist/components/ChatShell.es.js.map +1 -1
  13. package/dist/components/Composer.cjs.js +1 -1
  14. package/dist/components/Composer.cjs.js.map +1 -1
  15. package/dist/components/Composer.es.js +1 -1
  16. package/dist/components/Composer.es.js.map +1 -1
  17. package/dist/components/DataList.cjs.js +5 -5
  18. package/dist/components/DataList.es.js +5 -5
  19. package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
  20. package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
  21. package/dist/components/LogsDataList.cjs.js +2 -2
  22. package/dist/components/LogsDataList.es.js +2 -2
  23. package/dist/components/MessageScroller.cjs.js +1 -1
  24. package/dist/components/MessageScroller.es.js +1 -1
  25. package/dist/components/SavedViews.cjs.js +0 -1
  26. package/dist/components/SavedViews.cjs.js.map +1 -1
  27. package/dist/components/SavedViews.es.js +0 -1
  28. package/dist/components/SavedViews.es.js.map +1 -1
  29. package/dist/components/fluid-hover-highlight.cjs.js +7 -1
  30. package/dist/components/fluid-hover-highlight.cjs.js.map +1 -1
  31. package/dist/components/fluid-hover-highlight.es.js +7 -1
  32. package/dist/components/fluid-hover-highlight.es.js.map +1 -1
  33. package/dist/{data-list-DUfXIhyC.cjs → data-list-CmjTe8xE.cjs} +3 -3
  34. package/dist/{data-list-DUfXIhyC.cjs.map → data-list-CmjTe8xE.cjs.map} +1 -1
  35. package/dist/{data-list-DXQY_iQW.js → data-list-DT1LVR29.js} +3 -3
  36. package/dist/{data-list-DXQY_iQW.js.map → data-list-DT1LVR29.js.map} +1 -1
  37. package/dist/{data-list-skeleton-B_SXAeE0.js → data-list-skeleton-bNfITSHs.js} +2 -2
  38. package/dist/{data-list-skeleton-B_SXAeE0.js.map → data-list-skeleton-bNfITSHs.js.map} +1 -1
  39. package/dist/{data-list-skeleton-BqC9Gggi.cjs → data-list-skeleton-sdcaabdX.cjs} +2 -2
  40. package/dist/{data-list-skeleton-BqC9Gggi.cjs.map → data-list-skeleton-sdcaabdX.cjs.map} +1 -1
  41. package/dist/{data-list-spacer-tQaBaum4.cjs → data-list-spacer-CdlT6bDd.cjs} +2 -2
  42. package/dist/{data-list-spacer-tQaBaum4.cjs.map → data-list-spacer-CdlT6bDd.cjs.map} +1 -1
  43. package/dist/{data-list-spacer-ByA4ce2a.js → data-list-spacer-D--gDmOm.js} +2 -2
  44. package/dist/{data-list-spacer-ByA4ce2a.js.map → data-list-spacer-D--gDmOm.js.map} +1 -1
  45. package/dist/{data-list-top-ByT2Mo77.cjs → data-list-top-DJh08vFA.cjs} +2 -9
  46. package/dist/data-list-top-DJh08vFA.cjs.map +1 -0
  47. package/dist/{data-list-top-DSr_ocKA.js → data-list-top-T-mtdIUp.js} +2 -9
  48. package/dist/data-list-top-T-mtdIUp.js.map +1 -0
  49. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +104 -92
  50. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js.map +1 -1
  51. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +105 -93
  52. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js.map +1 -1
  53. package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
  54. package/dist/domains/logs/components/logs-list-view.es.js +2 -2
  55. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.cjs.js +3 -3
  56. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.es.js +3 -3
  57. package/dist/domains/observability/components/trace-as-item-dialog.cjs.js +6 -10
  58. package/dist/domains/observability/components/trace-as-item-dialog.cjs.js.map +1 -1
  59. package/dist/domains/observability/components/trace-as-item-dialog.es.js +7 -11
  60. package/dist/domains/observability/components/trace-as-item-dialog.es.js.map +1 -1
  61. package/dist/domains/scores/components/score-as-item-dialog.cjs.js +3 -9
  62. package/dist/domains/scores/components/score-as-item-dialog.cjs.js.map +1 -1
  63. package/dist/domains/scores/components/score-as-item-dialog.es.js +4 -10
  64. package/dist/domains/scores/components/score-as-item-dialog.es.js.map +1 -1
  65. package/dist/domains/scores/components/score-data-panel.cjs.js +9 -1
  66. package/dist/domains/scores/components/score-data-panel.cjs.js.map +1 -1
  67. package/dist/domains/scores/components/score-data-panel.es.js +9 -1
  68. package/dist/domains/scores/components/score-data-panel.es.js.map +1 -1
  69. package/dist/domains/scores/components/trace-scores-tab.cjs.js +1 -1
  70. package/dist/domains/scores/components/trace-scores-tab.es.js +1 -1
  71. package/dist/domains/traces/components/format-hierarchical-spans.cjs.js +12 -13
  72. package/dist/domains/traces/components/format-hierarchical-spans.cjs.js.map +1 -1
  73. package/dist/domains/traces/components/format-hierarchical-spans.es.js +12 -13
  74. package/dist/domains/traces/components/format-hierarchical-spans.es.js.map +1 -1
  75. package/dist/domains/traces/components/span-rows.cjs.js +2 -1
  76. package/dist/domains/traces/components/span-rows.cjs.js.map +1 -1
  77. package/dist/domains/traces/components/span-rows.es.js +2 -1
  78. package/dist/domains/traces/components/span-rows.es.js.map +1 -1
  79. package/dist/domains/traces/components/thread-trace/thread-trace-list.cjs.js +1 -1
  80. package/dist/domains/traces/components/thread-trace/thread-trace-list.es.js +1 -1
  81. package/dist/domains/traces/components/thread-trace/thread-trace-root.cjs.js +1 -1
  82. package/dist/domains/traces/components/thread-trace/thread-trace-root.es.js +1 -1
  83. package/dist/domains/traces/components/thread-trace/thread-trace-row.cjs.js +1 -1
  84. package/dist/domains/traces/components/thread-trace/thread-trace-row.es.js +1 -1
  85. package/dist/domains/traces/components/trace-span-timeline.cjs.js +2 -1
  86. package/dist/domains/traces/components/trace-span-timeline.cjs.js.map +1 -1
  87. package/dist/domains/traces/components/trace-span-timeline.es.js +2 -1
  88. package/dist/domains/traces/components/trace-span-timeline.es.js.map +1 -1
  89. package/dist/domains/traces/components/traces-list-view.cjs.js +4 -4
  90. package/dist/domains/traces/components/traces-list-view.es.js +4 -4
  91. package/dist/domains/traces/components/traces-page-skeleton.cjs.js +1 -1
  92. package/dist/domains/traces/components/traces-page-skeleton.es.js +1 -1
  93. package/dist/domains/traces/utils/span-timing.cjs.js +10 -0
  94. package/dist/domains/traces/utils/span-timing.cjs.js.map +1 -1
  95. package/dist/domains/traces/utils/span-timing.es.js +10 -1
  96. package/dist/domains/traces/utils/span-timing.es.js.map +1 -1
  97. package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +2 -2
  98. package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +2 -2
  99. package/dist/ee/signals/components/entity-index-list.cjs.js +1 -1
  100. package/dist/ee/signals/components/entity-index-list.es.js +1 -1
  101. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +1 -1
  102. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +1 -1
  103. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
  104. package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
  105. package/dist/hooks/use-fluid-hover.cjs.js +3 -2
  106. package/dist/hooks/use-fluid-hover.cjs.js.map +1 -1
  107. package/dist/hooks/use-fluid-hover.es.js +3 -2
  108. package/dist/hooks/use-fluid-hover.es.js.map +1 -1
  109. package/dist/layout/tabbed-container.cjs.js +1 -1
  110. package/dist/layout/tabbed-container.es.js +1 -1
  111. package/dist/{logs-data-list-CoER2Hst.js → logs-data-list-Cb85LPcT.js} +3 -3
  112. package/dist/{logs-data-list-CoER2Hst.js.map → logs-data-list-Cb85LPcT.js.map} +1 -1
  113. package/dist/{logs-data-list-DRR6cMgl.cjs → logs-data-list-DlQxxrNw.cjs} +3 -3
  114. package/dist/{logs-data-list-DRR6cMgl.cjs.map → logs-data-list-DlQxxrNw.cjs.map} +1 -1
  115. package/dist/{message-scroller-CS1KxKn6.js → message-scroller-C6gXU5d5.js} +2 -2
  116. package/dist/{message-scroller-CS1KxKn6.js.map → message-scroller-C6gXU5d5.js.map} +1 -1
  117. package/dist/{message-scroller-C4fH6uJg.cjs → message-scroller-fjucuCuw.cjs} +2 -2
  118. package/dist/{message-scroller-C4fH6uJg.cjs.map → message-scroller-fjucuCuw.cjs.map} +1 -1
  119. package/dist/primitives/raised-surface.cjs.js.map +1 -1
  120. package/dist/primitives/raised-surface.es.js.map +1 -1
  121. package/dist/scroll-area-CAY0DNQj.cjs.map +1 -1
  122. package/dist/scroll-area-MaMqo4l8.js.map +1 -1
  123. package/dist/src/domains/datasets/components/index.d.ts +1 -1
  124. package/dist/src/domains/datasets/components/save-as-dataset-item-dialog.d.ts +14 -3
  125. package/dist/src/domains/observability/components/trace-as-item-dialog.d.ts +5 -3
  126. package/dist/src/domains/scores/components/score-as-item-dialog.d.ts +3 -3
  127. package/dist/src/domains/traces/utils/span-timing.d.ts +2 -0
  128. package/dist/src/ds/components/Breadcrumb/Breadcrumb.d.ts +2 -2
  129. package/dist/src/ds/components/ChatShell/chat-shell.d.ts +3 -2
  130. package/dist/src/ds/components/Code/code.d.ts +1 -1
  131. package/dist/src/ds/components/ScrollArea/scroll-area.d.ts +4 -0
  132. package/dist/src/ds/primitives/raised-surface.d.ts +1 -1
  133. package/dist/src/hooks/use-fluid-hover.d.ts +1 -0
  134. package/dist/style.css +32 -31
  135. package/dist/toast.css +1 -1
  136. package/dist/tokens.cjs.js.map +1 -1
  137. package/dist/tokens.es.js.map +1 -1
  138. package/dist/{traces-data-list-BgjeB-BF.cjs → traces-data-list-Bhhg9drs.cjs} +4 -4
  139. package/dist/{traces-data-list-BgjeB-BF.cjs.map → traces-data-list-Bhhg9drs.cjs.map} +1 -1
  140. package/dist/{traces-data-list-Zoai0OW_.js → traces-data-list-DMWPJFBc.js} +4 -4
  141. package/dist/{traces-data-list-Zoai0OW_.js.map → traces-data-list-DMWPJFBc.js.map} +1 -1
  142. package/dist/use-text-highlight.css +4 -4
  143. package/package.json +15 -11
  144. package/sources.css +1 -0
  145. package/theme/code.css +17 -0
  146. package/theme/surfaces.css +2 -2
  147. package/theme.css +2 -0
  148. package/dist/data-list-top-ByT2Mo77.cjs.map +0 -1
  149. package/dist/data-list-top-DSr_ocKA.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SavedViews.cjs.js","sources":["../../src/ds/components/SavedViews/saved-view-schema.ts","../../src/ds/components/SavedViews/saved-view-name-input.tsx","../../src/ds/components/SavedViews/saved-view-summary.tsx","../../src/ds/components/SavedViews/saved-view-tabs.tsx","../../src/ds/components/SavedViews/saved-view-editor.tsx","../../src/ds/components/SavedViews/saved-views-storage.ts","../../src/ds/components/SavedViews/use-saved-views.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport type { FilterBarItem } from '@/ds/components/FilterBar/types';\n\nexport const MAX_SAVED_VIEW_NAME_CHARS = 80;\n\nconst SAVED_VIEWS_STORAGE_VERSION = 1;\n\nconst filterBarScalarSchema = z.union([z.string(), z.number(), z.boolean()]);\n\nconst savedViewFilterSchema = z.object({\n id: z.string().min(1),\n fieldId: z.string().min(1),\n operatorId: z.string().min(1),\n value: z.union([filterBarScalarSchema, z.array(filterBarScalarSchema)]),\n}) satisfies z.ZodType<FilterBarItem>;\n\nexport const savedViewNameSchema = z.string().trim().min(1).max(MAX_SAVED_VIEW_NAME_CHARS);\n\nconst storedSavedViewSchema = z.object({\n id: z.string().min(1),\n name: savedViewNameSchema,\n filters: z.array(savedViewFilterSchema),\n settings: z.unknown(),\n});\n\n// Views stay `unknown` so one malformed view is dropped on its own, not the whole list.\nconst savedViewsDocumentSchema = z.object({\n version: z.literal(SAVED_VIEWS_STORAGE_VERSION),\n views: z.array(z.unknown()),\n});\n\n// Only `safeParse` is used, so the consumer's Zod version never has to match this package's.\nexport type SavedViewSettingsSchema<TSettings> = {\n safeParse: (value: unknown) => { success: true; data: TSettings } | { success: false };\n};\n\nexport type SavedView<TSettings> = {\n id: string;\n name: string;\n filters: FilterBarItem[];\n settings: TSettings;\n};\n\nexport function parseSavedViews<TSettings>(\n raw: string | null,\n settingsSchema: SavedViewSettingsSchema<TSettings>,\n): SavedView<TSettings>[] {\n if (!raw) return [];\n let json: unknown;\n try {\n json = JSON.parse(raw);\n } catch {\n return [];\n }\n const document = savedViewsDocumentSchema.safeParse(json);\n if (!document.success) return [];\n return document.data.views.flatMap(candidate => {\n const view = storedSavedViewSchema.safeParse(candidate);\n if (!view.success) return [];\n const settings = settingsSchema.safeParse(view.data.settings);\n if (!settings.success) return [];\n return [{ ...view.data, settings: settings.data }];\n });\n}\n\nexport function serializeSavedViews<TSettings>(views: readonly SavedView<TSettings>[]): string {\n return JSON.stringify({ version: SAVED_VIEWS_STORAGE_VERSION, views });\n}\n","import { MAX_SAVED_VIEW_NAME_CHARS } from './saved-view-schema';\nimport { passwordManagerOptOutProps } from '@/ds/primitives/password-manager-autofill';\n\n// Uncontrolled so blur is the one exit: Enter blurs, Escape restores the name first, blur commits.\nexport function SavedViewNameInput({ name, onCommit }: { name: string; onCommit: (name: string) => void }) {\n return (\n <input\n autoFocus\n aria-label=\"View name\"\n defaultValue={name}\n maxLength={MAX_SAVED_VIEW_NAME_CHARS}\n {...passwordManagerOptOutProps}\n onFocus={event => event.currentTarget.select()}\n onBlur={event => onCommit(event.currentTarget.value)}\n onKeyDown={event => {\n if (event.key === 'Escape') event.currentTarget.value = name;\n if (event.key === 'Enter' || event.key === 'Escape') {\n event.preventDefault();\n event.currentTarget.blur();\n }\n }}\n className=\"field-sizing-content min-w-12 bg-transparent text-foreground outline-hidden\"\n />\n );\n}\n","import type { ReactNode } from 'react';\nimport { FilterBarFieldLabel, formatValue } from '@/ds/components/FilterBar/filter-bar-chip';\nimport type { FilterBarField, FilterBarItem, FilterBarOperator } from '@/ds/components/FilterBar/types';\nimport { Txt } from '@/ds/components/Txt';\n\ntype SavedViewSummaryProps = {\n filters: readonly FilterBarItem[];\n fields: readonly FilterBarField[];\n operators: readonly FilterBarOperator[];\n settings?: ReactNode;\n};\n\nexport function SavedViewSummary({ filters, fields, operators, settings }: SavedViewSummaryProps) {\n return (\n <div className=\"flex min-w-48 flex-col gap-2\">\n {filters.length === 0 ? (\n <Txt variant=\"caption\" tone=\"muted\">\n No filters\n </Txt>\n ) : (\n <ul aria-label=\"Filters\" className=\"flex flex-col gap-1.5\">\n {filters.map(filter => {\n const field = fields.find(candidate => candidate.id === filter.fieldId);\n const operatorStated = (field?.operators?.length ?? operators.length) > 1;\n const operator = operators.find(candidate => candidate.id === filter.operatorId);\n return (\n <li key={filter.id} className=\"min-w-0\">\n <Txt as=\"span\" variant=\"body-sm\" className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"flex min-w-0 shrink-0 items-center gap-1 text-muted-foreground\">\n <FilterBarFieldLabel field={field} label={field?.label ?? filter.fieldId} />\n </span>\n {operatorStated && <span className=\"shrink-0 text-muted-foreground\">{operator?.label}</span>}\n <span className=\"min-w-0 truncate\">{formatValue(filter.value, field)}</span>\n </Txt>\n </li>\n );\n })}\n </ul>\n )}\n {settings}\n </div>\n );\n}\n","import {\n ChevronDownIcon,\n CopyIcon,\n LayersIcon,\n LayersPlusIcon,\n PencilIcon,\n TextCursorInputIcon,\n Trash2Icon,\n} from 'lucide-react';\nimport { Fragment, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { SavedViewNameInput } from './saved-view-name-input';\nimport type { SavedView } from './saved-view-schema';\nimport { SavedViewSummary } from './saved-view-summary';\nimport type { SavedViewsController } from './use-saved-views';\nimport { Button, buttonVariants } from '@/ds/components/Button/Button';\nimport { ContextMenu } from '@/ds/components/ContextMenu';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport type { FilterBarField, FilterBarOperator } from '@/ds/components/FilterBar/types';\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from '@/ds/components/HoverCard';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { controlHeight } from '@/ds/primitives/control-size';\nimport { VisuallyHidden } from '@/ds/primitives/visually-hidden';\nimport { cn } from '@/lib/utils';\n\nconst restingTabClass = buttonVariants({ variant: 'default', size: 'sm' });\nconst selectedTabClass = cn(\n buttonVariants({ variant: 'ghost', size: 'sm' }),\n 'bg-fill-hover text-foreground not-disabled:hover:bg-fill-hover',\n);\nconst editingTabClass = cn(\n controlHeight.sm,\n 'inline-flex items-center gap-1.5 rounded-full border border-dashed border-border-strong bg-fill-hover px-[.9em] text-label text-foreground',\n '[&_svg]:size-3.5 [&_svg]:shrink-0',\n);\n\nexport type SavedViewTabsProps<TSettings> = {\n views: SavedViewsController<TSettings>;\n fields: readonly FilterBarField[];\n operators: readonly FilterBarOperator[];\n defaultLabel: string;\n newViewSettings: NoInfer<TSettings>;\n describeSettings?: (settings: TSettings) => ReactNode;\n 'aria-label'?: string;\n className?: string;\n};\n\nexport function SavedViewTabs<TSettings>({\n views,\n fields,\n operators,\n defaultLabel,\n newViewSettings,\n describeSettings,\n 'aria-label': ariaLabel = 'Views',\n className,\n}: SavedViewTabsProps<TSettings>) {\n const [renamingViewId, setRenamingViewId] = useState<string>();\n const { draft } = views;\n const creating = draft !== undefined && draft.viewId === undefined;\n const defaultSelected = views.activeView === undefined && !creating;\n\n return (\n <div role=\"group\" aria-label={ariaLabel} className={cn('flex flex-wrap items-center gap-1.5', className)}>\n <button\n type=\"button\"\n aria-pressed={defaultSelected}\n className={defaultSelected ? selectedTabClass : restingTabClass}\n onClick={() => views.select(undefined)}\n >\n {defaultLabel}\n </button>\n {views.views.map(view => {\n if (renamingViewId === view.id) {\n return (\n <RenamingViewTab\n key={view.id}\n name={view.name}\n onCommit={name => {\n setRenamingViewId(undefined);\n views.rename(view.id, name);\n }}\n />\n );\n }\n return (\n <SavedViewTab\n key={view.id}\n view={view}\n selected={views.activeView?.id === view.id && !creating}\n unsaved={draft?.viewId === view.id && views.unsaved}\n fields={fields}\n operators={operators}\n settings={describeSettings?.(view.settings)}\n onSelect={() => views.select(view.id)}\n onEdit={() => views.edit(view.id)}\n onRename={() => setRenamingViewId(view.id)}\n onDuplicate={() => views.duplicate(view.id)}\n onDelete={() => views.remove(view.id)}\n />\n );\n })}\n {views.storageError && (\n <Txt role=\"alert\" variant=\"caption\" className=\"w-full text-destructive-foreground\">\n {views.storageError}\n </Txt>\n )}\n {creating ? (\n <EditingViewTab name={draft.name} unsaved onRename={name => views.change({ name })} />\n ) : (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n tooltip=\"New view\"\n disabled={draft !== undefined}\n onClick={() => views.create(newViewSettings)}\n >\n <LayersPlusIcon />\n </Button>\n )}\n </div>\n );\n}\n\nfunction EditingViewTab({\n name,\n unsaved,\n onRename,\n}: {\n name: string;\n unsaved: boolean;\n onRename: (name: string) => void;\n}) {\n const [renaming, setRenaming] = useState(false);\n return (\n <span aria-current=\"true\" className={editingTabClass}>\n <LayersIcon aria-hidden />\n {renaming ? (\n <SavedViewNameInput\n name={name}\n onCommit={next => {\n setRenaming(false);\n if (next.trim()) onRename(next);\n }}\n />\n ) : (\n <>\n <span className=\"max-w-48 truncate\">{name}</span>\n {unsaved && (\n <>\n <span className=\"size-1.5 shrink-0 rounded-full bg-warning-indicator\" aria-hidden />\n <VisuallyHidden>Unsaved changes</VisuallyHidden>\n </>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n tooltip=\"Rename view\"\n className=\"-mr-2 size-6\"\n onClick={() => setRenaming(true)}\n >\n <PencilIcon />\n </Button>\n </>\n )}\n </span>\n );\n}\n\nfunction RenamingViewTab({ name, onCommit }: { name: string; onCommit: (name: string) => void }) {\n return (\n <span className={cn(restingTabClass, 'gap-1.5')}>\n <SavedViewTabIcon />\n <SavedViewNameInput name={name} onCommit={onCommit} />\n </span>\n );\n}\n\nfunction SavedViewTabIcon() {\n return (\n <Icon data-slot=\"button-icon\" size=\"sm\">\n <LayersIcon aria-hidden />\n </Icon>\n );\n}\n\nfunction SavedViewTab<TSettings>({\n view,\n selected,\n unsaved,\n fields,\n operators,\n settings,\n onSelect,\n onEdit,\n onRename,\n onDuplicate,\n onDelete,\n}: {\n view: SavedView<TSettings>;\n selected: boolean;\n unsaved: boolean;\n fields: readonly FilterBarField[];\n operators: readonly FilterBarOperator[];\n settings: ReactNode;\n onSelect: () => void;\n onEdit: () => void;\n onRename: () => void;\n onDuplicate: () => void;\n onDelete: () => void;\n}) {\n const actions: ViewAction[] = [\n { label: 'Edit view', icon: <PencilIcon aria-hidden />, onClick: onEdit },\n { label: 'Rename', icon: <TextCursorInputIcon aria-hidden />, onClick: onRename },\n { label: 'Duplicate', icon: <CopyIcon aria-hidden />, onClick: onDuplicate },\n { label: 'Delete view', icon: <Trash2Icon aria-hidden />, onClick: onDelete, destructive: true },\n ];\n const [menuOpen, setMenuOpen] = useState(false);\n const [previewOpen, setPreviewOpen] = useState(false);\n const changeMenuOpen = (open: boolean) => {\n setMenuOpen(selected && open);\n if (open) setPreviewOpen(false);\n };\n\n return (\n <ContextMenu>\n <DropdownMenu open={selected && menuOpen} onOpenChange={changeMenuOpen}>\n <HoverCard open={!selected && previewOpen} onOpenChange={setPreviewOpen}>\n <ContextMenu.Trigger\n render={\n <HoverCardTrigger\n delay={400}\n render={\n <DropdownMenu.Trigger\n render={\n <button\n type=\"button\"\n aria-pressed={selected}\n aria-haspopup={selected ? 'menu' : undefined}\n onClick={() => {\n if (selected) return;\n setPreviewOpen(false);\n onSelect();\n }}\n className={cn(selected ? selectedTabClass : restingTabClass, 'gap-1.5')}\n />\n }\n />\n }\n />\n }\n >\n <SavedViewTabIcon />\n <span className=\"max-w-48 truncate\">{view.name}</span>\n {unsaved && <span className=\"size-1.5 shrink-0 rounded-full bg-warning-indicator\" aria-hidden />}\n {selected && <ChevronDownIcon aria-hidden className=\"size-3\" />}\n </ContextMenu.Trigger>\n <HoverCardContent side=\"bottom\" align=\"start\" showArrow={false}>\n <SavedViewSummary filters={view.filters} fields={fields} operators={operators} settings={settings} />\n </HoverCardContent>\n </HoverCard>\n <DropdownMenu.Content align=\"start\">\n {actions.map(action => (\n <Fragment key={action.label}>\n {action.destructive && <DropdownMenu.Separator />}\n <DropdownMenu.Item variant={action.destructive ? 'destructive' : 'default'} onClick={action.onClick}>\n {action.icon}\n {action.label}\n </DropdownMenu.Item>\n </Fragment>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu>\n <ContextMenu.Content>\n {actions.map(action => (\n <Fragment key={action.label}>\n {action.destructive && <ContextMenu.Separator />}\n <ContextMenu.Item variant={action.destructive ? 'destructive' : 'default'} onClick={action.onClick}>\n {action.icon}\n {action.label}\n </ContextMenu.Item>\n </Fragment>\n ))}\n </ContextMenu.Content>\n </ContextMenu>\n );\n}\n\ntype ViewAction = { label: string; icon: ReactNode; onClick: () => void; destructive?: boolean };\n","import type { ReactNode } from 'react';\nimport type { SavedViewsController } from './use-saved-views';\nimport { Button } from '@/ds/components/Button/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport type SavedViewEditorProps<TSettings> = {\n views: SavedViewsController<TSettings>;\n children: ReactNode;\n className?: string;\n};\n\nexport function SavedViewEditor<TSettings>({ views, children, className }: SavedViewEditorProps<TSettings>) {\n const { draft } = views;\n const creating = draft?.viewId === undefined;\n return (\n <div\n role={draft ? 'group' : undefined}\n aria-label={draft ? `Edit view ${draft.name}` : undefined}\n className={cn('flex min-w-0 flex-wrap items-center gap-2', className)}\n >\n {children}\n {draft && (\n <>\n {!creating && views.unsaved && (\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n Unsaved changes\n </Txt>\n )}\n <div className=\"ml-auto flex shrink-0 items-center gap-3\">\n {creating && (\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" className=\"max-sm:hidden\">\n Saved in this browser\n </Txt>\n )}\n <div className=\"flex items-center gap-1\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={views.discard}>\n {creating ? 'Cancel' : 'Reset'}\n </Button>\n <Button type=\"button\" variant=\"primary\" size=\"sm\" disabled={!views.unsaved} onClick={views.save}>\n {creating ? 'Save view' : 'Save changes'}\n </Button>\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n","type SavedViewsSubscribe = (listener: () => void) => () => void;\n\nconst listenersByKey = new Map<string, Set<() => void>>();\nconst subscribeByKey = new Map<string, SavedViewsSubscribe>();\n\nexport function readSavedViewsRaw(key: string): string | null {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nexport function writeSavedViewsRaw(key: string, raw: string): boolean {\n try {\n window.localStorage.setItem(key, raw);\n } catch {\n return false;\n }\n listenersByKey.get(key)?.forEach(listener => listener());\n return true;\n}\n\nexport function savedViewsSubscriber(key: string): SavedViewsSubscribe {\n const cached = subscribeByKey.get(key);\n if (cached) return cached;\n const subscribe: SavedViewsSubscribe = listener => subscribeSavedViews(key, listener);\n subscribeByKey.set(key, subscribe);\n return subscribe;\n}\n\nfunction subscribeSavedViews(key: string, listener: () => void): () => void {\n const listeners = listenersByKey.get(key) ?? new Set<() => void>();\n listenersByKey.set(key, listeners);\n listeners.add(listener);\n const onStorage = (event: StorageEvent) => {\n if (event.key === key || event.key === null) listener();\n };\n window.addEventListener('storage', onStorage);\n return () => {\n listeners.delete(listener);\n window.removeEventListener('storage', onStorage);\n };\n}\n","import { useState, useSyncExternalStore } from 'react';\nimport { parseSavedViews, savedViewNameSchema, serializeSavedViews } from './saved-view-schema';\nimport type { SavedView, SavedViewSettingsSchema } from './saved-view-schema';\nimport { readSavedViewsRaw, savedViewsSubscriber, writeSavedViewsRaw } from './saved-views-storage';\nimport type { FilterBarItem } from '@/ds/components/FilterBar/types';\n\nconst NEW_SAVED_VIEW_NAME = 'Untitled view';\n\nexport type SavedViewContent<TSettings> = {\n filters: FilterBarItem[];\n settings: TSettings;\n};\n\nexport type SavedViewDraft<TSettings> = SavedViewContent<TSettings> & {\n viewId?: string;\n name: string;\n};\n\nexport type SavedViewDraftChange<TSettings> = Partial<Omit<SavedViewDraft<TSettings>, 'viewId'>>;\n\nexport type UseSavedViewsOptions<TSettings> = {\n storageKey: string;\n settingsSchema: SavedViewSettingsSchema<TSettings>;\n activeViewId: string | undefined;\n onActiveViewChange: (viewId: string | undefined) => void;\n};\n\nexport type SavedViewsController<TSettings> = {\n views: SavedView<TSettings>[];\n activeView: SavedView<TSettings> | undefined;\n draft: SavedViewDraft<TSettings> | undefined;\n unsaved: boolean;\n storageError: string | undefined;\n applied: SavedViewContent<TSettings> | undefined;\n select: (viewId: string | undefined) => void;\n create: (settings: TSettings, filters?: FilterBarItem[]) => void;\n edit: (viewId: string) => void;\n change: (patch: SavedViewDraftChange<TSettings>) => void;\n save: () => void;\n discard: () => void;\n rename: (viewId: string, name: string) => void;\n duplicate: (viewId: string) => void;\n remove: (viewId: string) => void;\n};\n\nfunction createSavedViewId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n return `view-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nfunction validViewName(name: string): string | undefined {\n const parsed = savedViewNameSchema.safeParse(name);\n return parsed.success ? parsed.data : undefined;\n}\n\nfunction sameViewContent<TSettings>(draft: SavedViewDraft<TSettings>, view: SavedView<TSettings>): boolean {\n return (\n JSON.stringify([draft.name, draft.filters, draft.settings]) ===\n JSON.stringify([view.name, view.filters, view.settings])\n );\n}\n\nexport function useSavedViews<TSettings>({\n storageKey,\n settingsSchema,\n activeViewId,\n onActiveViewChange,\n}: UseSavedViewsOptions<TSettings>): SavedViewsController<TSettings> {\n const raw = useSyncExternalStore(\n savedViewsSubscriber(storageKey),\n () => readSavedViewsRaw(storageKey),\n () => null,\n );\n const views = parseSavedViews(raw, settingsSchema);\n const [failedStorageKey, setFailedStorageKey] = useState<string>();\n const [pendingDraft, setDraft] = useState<SavedViewDraft<TSettings>>();\n const [draftScope, setDraftScope] = useState({ storageKey, activeViewId });\n const draftView = views.find(view => view.id === pendingDraft?.viewId);\n const draftViewDeleted = pendingDraft?.viewId !== undefined && !draftView;\n const storageKeyChanged = draftScope.storageKey !== storageKey;\n if (storageKeyChanged || draftScope.activeViewId !== activeViewId || draftViewDeleted) {\n setDraftScope({ storageKey, activeViewId });\n if (storageKeyChanged || draftViewDeleted || pendingDraft?.viewId !== activeViewId) setDraft(undefined);\n }\n const draft = pendingDraft?.viewId === undefined || pendingDraft.viewId === activeViewId ? pendingDraft : undefined;\n const unsaved = draft !== undefined && (!draftView || !sameViewContent(draft, draftView));\n\n const activeView = views.find(view => view.id === activeViewId);\n const write = (next: SavedView<TSettings>[]) => {\n const saved = writeSavedViewsRaw(storageKey, serializeSavedViews(next));\n setFailedStorageKey(saved ? undefined : storageKey);\n return saved;\n };\n\n return {\n views,\n activeView,\n draft,\n unsaved,\n storageError:\n failedStorageKey === storageKey\n ? 'Could not save changes. Check your browser storage settings and try again.'\n : undefined,\n applied: draft ?? activeView,\n select: viewId => {\n setFailedStorageKey(undefined);\n setDraft(undefined);\n onActiveViewChange(viewId);\n },\n create: (settings, filters = []) => setDraft({ name: NEW_SAVED_VIEW_NAME, filters, settings }),\n edit: viewId => {\n if (draft?.viewId === viewId) return;\n const view = views.find(candidate => candidate.id === viewId);\n if (!view) return;\n const { id, ...content } = view;\n setDraft({ ...content, viewId: id });\n if (viewId !== activeViewId) onActiveViewChange(viewId);\n },\n change: patch => {\n if (draft) {\n setDraft({ ...draft, ...patch });\n return;\n }\n if (!activeView) return;\n const { id, ...content } = activeView;\n setDraft({ ...content, ...patch, viewId: id });\n },\n save: () => {\n if (!draft) return;\n const { viewId, ...content } = draft;\n const saved: SavedView<TSettings> = {\n ...content,\n id: viewId ?? createSavedViewId(),\n name: validViewName(content.name) ?? views.find(view => view.id === viewId)?.name ?? NEW_SAVED_VIEW_NAME,\n };\n if (!write(viewId ? views.map(view => (view.id === viewId ? saved : view)) : [...views, saved])) return;\n setDraft(undefined);\n if (saved.id !== activeViewId) onActiveViewChange(saved.id);\n },\n discard: () => {\n setFailedStorageKey(undefined);\n setDraft(undefined);\n },\n rename: (viewId, name) => {\n const nextName = validViewName(name);\n if (!nextName) return;\n if (!write(views.map(view => (view.id === viewId ? { ...view, name: nextName } : view)))) return;\n if (draft?.viewId === viewId) setDraft({ ...draft, name: nextName });\n },\n duplicate: viewId => {\n const index = views.findIndex(view => view.id === viewId);\n const original = views[index];\n if (!original) return;\n const copy: SavedView<TSettings> = {\n ...original,\n id: createSavedViewId(),\n name: validViewName(`${original.name} copy`) ?? original.name,\n };\n if (!write(views.toSpliced(index + 1, 0, copy))) return;\n setDraft(undefined);\n onActiveViewChange(copy.id);\n },\n remove: viewId => {\n if (!write(views.filter(view => view.id !== viewId))) return;\n if (draft?.viewId === viewId) setDraft(undefined);\n if (activeViewId === viewId) onActiveViewChange(undefined);\n },\n };\n}\n"],"names":["z","jsx","passwordManagerOptOutProps","jsxs","Txt","FilterBarFieldLabel","buttonVariants","cn","controlHeight","useState","Button","LayersPlusIcon","LayersIcon","Fragment","VisuallyHidden","PencilIcon","Icon","TextCursorInputIcon","CopyIcon","Trash2Icon","ContextMenu","DropdownMenu","HoverCard","HoverCardTrigger","ChevronDownIcon","HoverCardContent","useSyncExternalStore"],"mappings":"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"}
1
+ {"version":3,"file":"SavedViews.cjs.js","sources":["../../src/ds/components/SavedViews/saved-view-schema.ts","../../src/ds/components/SavedViews/saved-view-name-input.tsx","../../src/ds/components/SavedViews/saved-view-summary.tsx","../../src/ds/components/SavedViews/saved-view-tabs.tsx","../../src/ds/components/SavedViews/saved-view-editor.tsx","../../src/ds/components/SavedViews/saved-views-storage.ts","../../src/ds/components/SavedViews/use-saved-views.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport type { FilterBarItem } from '@/ds/components/FilterBar/types';\n\nexport const MAX_SAVED_VIEW_NAME_CHARS = 80;\n\nconst SAVED_VIEWS_STORAGE_VERSION = 1;\n\nconst filterBarScalarSchema = z.union([z.string(), z.number(), z.boolean()]);\n\nconst savedViewFilterSchema = z.object({\n id: z.string().min(1),\n fieldId: z.string().min(1),\n operatorId: z.string().min(1),\n value: z.union([filterBarScalarSchema, z.array(filterBarScalarSchema)]),\n}) satisfies z.ZodType<FilterBarItem>;\n\nexport const savedViewNameSchema = z.string().trim().min(1).max(MAX_SAVED_VIEW_NAME_CHARS);\n\nconst storedSavedViewSchema = z.object({\n id: z.string().min(1),\n name: savedViewNameSchema,\n filters: z.array(savedViewFilterSchema),\n settings: z.unknown(),\n});\n\n// Views stay `unknown` so one malformed view is dropped on its own, not the whole list.\nconst savedViewsDocumentSchema = z.object({\n version: z.literal(SAVED_VIEWS_STORAGE_VERSION),\n views: z.array(z.unknown()),\n});\n\n// Only `safeParse` is used, so the consumer's Zod version never has to match this package's.\nexport type SavedViewSettingsSchema<TSettings> = {\n safeParse: (value: unknown) => { success: true; data: TSettings } | { success: false };\n};\n\nexport type SavedView<TSettings> = {\n id: string;\n name: string;\n filters: FilterBarItem[];\n settings: TSettings;\n};\n\nexport function parseSavedViews<TSettings>(\n raw: string | null,\n settingsSchema: SavedViewSettingsSchema<TSettings>,\n): SavedView<TSettings>[] {\n if (!raw) return [];\n let json: unknown;\n try {\n json = JSON.parse(raw);\n } catch {\n return [];\n }\n const document = savedViewsDocumentSchema.safeParse(json);\n if (!document.success) return [];\n return document.data.views.flatMap(candidate => {\n const view = storedSavedViewSchema.safeParse(candidate);\n if (!view.success) return [];\n const settings = settingsSchema.safeParse(view.data.settings);\n if (!settings.success) return [];\n return [{ ...view.data, settings: settings.data }];\n });\n}\n\nexport function serializeSavedViews<TSettings>(views: readonly SavedView<TSettings>[]): string {\n return JSON.stringify({ version: SAVED_VIEWS_STORAGE_VERSION, views });\n}\n","import { MAX_SAVED_VIEW_NAME_CHARS } from './saved-view-schema';\nimport { passwordManagerOptOutProps } from '@/ds/primitives/password-manager-autofill';\n\n// Uncontrolled so blur is the one exit: Enter blurs, Escape restores the name first, blur commits.\nexport function SavedViewNameInput({ name, onCommit }: { name: string; onCommit: (name: string) => void }) {\n return (\n <input\n autoFocus\n aria-label=\"View name\"\n defaultValue={name}\n maxLength={MAX_SAVED_VIEW_NAME_CHARS}\n {...passwordManagerOptOutProps}\n onFocus={event => event.currentTarget.select()}\n onBlur={event => onCommit(event.currentTarget.value)}\n onKeyDown={event => {\n if (event.key === 'Escape') event.currentTarget.value = name;\n if (event.key === 'Enter' || event.key === 'Escape') {\n event.preventDefault();\n event.currentTarget.blur();\n }\n }}\n className=\"field-sizing-content min-w-12 bg-transparent text-foreground outline-hidden\"\n />\n );\n}\n","import type { ReactNode } from 'react';\nimport { FilterBarFieldLabel, formatValue } from '@/ds/components/FilterBar/filter-bar-chip';\nimport type { FilterBarField, FilterBarItem, FilterBarOperator } from '@/ds/components/FilterBar/types';\nimport { Txt } from '@/ds/components/Txt';\n\ntype SavedViewSummaryProps = {\n filters: readonly FilterBarItem[];\n fields: readonly FilterBarField[];\n operators: readonly FilterBarOperator[];\n settings?: ReactNode;\n};\n\nexport function SavedViewSummary({ filters, fields, operators, settings }: SavedViewSummaryProps) {\n return (\n <div className=\"flex min-w-48 flex-col gap-2\">\n {filters.length === 0 ? (\n <Txt variant=\"caption\" tone=\"muted\">\n No filters\n </Txt>\n ) : (\n <ul aria-label=\"Filters\" className=\"flex flex-col gap-1.5\">\n {filters.map(filter => {\n const field = fields.find(candidate => candidate.id === filter.fieldId);\n const operatorStated = (field?.operators?.length ?? operators.length) > 1;\n const operator = operators.find(candidate => candidate.id === filter.operatorId);\n return (\n <li key={filter.id} className=\"min-w-0\">\n <Txt as=\"span\" variant=\"body-sm\" className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"flex min-w-0 shrink-0 items-center gap-1 text-muted-foreground\">\n <FilterBarFieldLabel field={field} label={field?.label ?? filter.fieldId} />\n </span>\n {operatorStated && <span className=\"shrink-0 text-muted-foreground\">{operator?.label}</span>}\n <span className=\"min-w-0 truncate\">{formatValue(filter.value, field)}</span>\n </Txt>\n </li>\n );\n })}\n </ul>\n )}\n {settings}\n </div>\n );\n}\n","import {\n ChevronDownIcon,\n CopyIcon,\n LayersIcon,\n LayersPlusIcon,\n PencilIcon,\n TextCursorInputIcon,\n Trash2Icon,\n} from 'lucide-react';\nimport { Fragment, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { SavedViewNameInput } from './saved-view-name-input';\nimport type { SavedView } from './saved-view-schema';\nimport { SavedViewSummary } from './saved-view-summary';\nimport type { SavedViewsController } from './use-saved-views';\nimport { Button, buttonVariants } from '@/ds/components/Button/Button';\nimport { ContextMenu } from '@/ds/components/ContextMenu';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport type { FilterBarField, FilterBarOperator } from '@/ds/components/FilterBar/types';\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from '@/ds/components/HoverCard';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { controlHeight } from '@/ds/primitives/control-size';\nimport { VisuallyHidden } from '@/ds/primitives/visually-hidden';\nimport { cn } from '@/lib/utils';\n\nconst restingTabClass = buttonVariants({ variant: 'default', size: 'sm' });\nconst selectedTabClass = cn(\n buttonVariants({ variant: 'ghost', size: 'sm' }),\n 'bg-fill-hover text-foreground not-disabled:hover:bg-fill-hover',\n);\nconst editingTabClass = cn(\n controlHeight.sm,\n 'inline-flex items-center gap-1.5 rounded-full border border-dashed border-border-strong bg-fill-hover px-[.9em] text-label text-foreground',\n '[&_svg]:size-3.5 [&_svg]:shrink-0',\n);\n\nexport type SavedViewTabsProps<TSettings> = {\n views: SavedViewsController<TSettings>;\n fields: readonly FilterBarField[];\n operators: readonly FilterBarOperator[];\n defaultLabel: string;\n newViewSettings: NoInfer<TSettings>;\n describeSettings?: (settings: TSettings) => ReactNode;\n 'aria-label'?: string;\n className?: string;\n};\n\nexport function SavedViewTabs<TSettings>({\n views,\n fields,\n operators,\n defaultLabel,\n newViewSettings,\n describeSettings,\n 'aria-label': ariaLabel = 'Views',\n className,\n}: SavedViewTabsProps<TSettings>) {\n const [renamingViewId, setRenamingViewId] = useState<string>();\n const { draft } = views;\n const creating = draft !== undefined && draft.viewId === undefined;\n const defaultSelected = views.activeView === undefined && !creating;\n\n return (\n <div role=\"group\" aria-label={ariaLabel} className={cn('flex flex-wrap items-center gap-1.5', className)}>\n <button\n type=\"button\"\n aria-pressed={defaultSelected}\n className={defaultSelected ? selectedTabClass : restingTabClass}\n onClick={() => views.select(undefined)}\n >\n {defaultLabel}\n </button>\n {views.views.map(view => {\n if (renamingViewId === view.id) {\n return (\n <RenamingViewTab\n key={view.id}\n name={view.name}\n onCommit={name => {\n setRenamingViewId(undefined);\n views.rename(view.id, name);\n }}\n />\n );\n }\n return (\n <SavedViewTab\n key={view.id}\n view={view}\n selected={views.activeView?.id === view.id && !creating}\n unsaved={draft?.viewId === view.id && views.unsaved}\n fields={fields}\n operators={operators}\n settings={describeSettings?.(view.settings)}\n onSelect={() => views.select(view.id)}\n onEdit={() => views.edit(view.id)}\n onRename={() => setRenamingViewId(view.id)}\n onDuplicate={() => views.duplicate(view.id)}\n onDelete={() => views.remove(view.id)}\n />\n );\n })}\n {views.storageError && (\n <Txt role=\"alert\" variant=\"caption\" className=\"w-full text-destructive-foreground\">\n {views.storageError}\n </Txt>\n )}\n {creating ? (\n <EditingViewTab name={draft.name} unsaved onRename={name => views.change({ name })} />\n ) : (\n <Button\n type=\"button\"\n size=\"icon-sm\"\n tooltip=\"New view\"\n disabled={draft !== undefined}\n onClick={() => views.create(newViewSettings)}\n >\n <LayersPlusIcon />\n </Button>\n )}\n </div>\n );\n}\n\nfunction EditingViewTab({\n name,\n unsaved,\n onRename,\n}: {\n name: string;\n unsaved: boolean;\n onRename: (name: string) => void;\n}) {\n const [renaming, setRenaming] = useState(false);\n return (\n <span aria-current=\"true\" className={editingTabClass}>\n <LayersIcon aria-hidden />\n {renaming ? (\n <SavedViewNameInput\n name={name}\n onCommit={next => {\n setRenaming(false);\n if (next.trim()) onRename(next);\n }}\n />\n ) : (\n <>\n <span className=\"max-w-48 truncate\">{name}</span>\n {unsaved && (\n <>\n <span className=\"size-1.5 shrink-0 rounded-full bg-warning-indicator\" aria-hidden />\n <VisuallyHidden>Unsaved changes</VisuallyHidden>\n </>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n tooltip=\"Rename view\"\n className=\"-mr-2 size-6\"\n onClick={() => setRenaming(true)}\n >\n <PencilIcon />\n </Button>\n </>\n )}\n </span>\n );\n}\n\nfunction RenamingViewTab({ name, onCommit }: { name: string; onCommit: (name: string) => void }) {\n return (\n <span className={cn(restingTabClass, 'gap-1.5')}>\n <SavedViewTabIcon />\n <SavedViewNameInput name={name} onCommit={onCommit} />\n </span>\n );\n}\n\nfunction SavedViewTabIcon() {\n return (\n <Icon data-slot=\"button-icon\" size=\"sm\">\n <LayersIcon aria-hidden />\n </Icon>\n );\n}\n\nfunction SavedViewTab<TSettings>({\n view,\n selected,\n unsaved,\n fields,\n operators,\n settings,\n onSelect,\n onEdit,\n onRename,\n onDuplicate,\n onDelete,\n}: {\n view: SavedView<TSettings>;\n selected: boolean;\n unsaved: boolean;\n fields: readonly FilterBarField[];\n operators: readonly FilterBarOperator[];\n settings: ReactNode;\n onSelect: () => void;\n onEdit: () => void;\n onRename: () => void;\n onDuplicate: () => void;\n onDelete: () => void;\n}) {\n const actions: ViewAction[] = [\n { label: 'Edit view', icon: <PencilIcon aria-hidden />, onClick: onEdit },\n { label: 'Rename', icon: <TextCursorInputIcon aria-hidden />, onClick: onRename },\n { label: 'Duplicate', icon: <CopyIcon aria-hidden />, onClick: onDuplicate },\n { label: 'Delete view', icon: <Trash2Icon aria-hidden />, onClick: onDelete, destructive: true },\n ];\n const [menuOpen, setMenuOpen] = useState(false);\n const [previewOpen, setPreviewOpen] = useState(false);\n const changeMenuOpen = (open: boolean) => {\n setMenuOpen(selected && open);\n if (open) setPreviewOpen(false);\n };\n\n return (\n <ContextMenu>\n <DropdownMenu open={selected && menuOpen} onOpenChange={changeMenuOpen}>\n <HoverCard open={!selected && previewOpen} onOpenChange={setPreviewOpen}>\n <ContextMenu.Trigger\n render={\n <HoverCardTrigger\n delay={400}\n render={\n <DropdownMenu.Trigger\n render={\n <button\n type=\"button\"\n aria-pressed={selected}\n aria-haspopup={selected ? 'menu' : undefined}\n onClick={() => {\n if (selected) return;\n setPreviewOpen(false);\n onSelect();\n }}\n className={cn(selected ? selectedTabClass : restingTabClass, 'gap-1.5')}\n />\n }\n />\n }\n />\n }\n >\n <SavedViewTabIcon />\n <span className=\"max-w-48 truncate\">{view.name}</span>\n {unsaved && <span className=\"size-1.5 shrink-0 rounded-full bg-warning-indicator\" aria-hidden />}\n {selected && <ChevronDownIcon aria-hidden className=\"size-3\" />}\n </ContextMenu.Trigger>\n <HoverCardContent side=\"bottom\" align=\"start\" showArrow={false}>\n <SavedViewSummary filters={view.filters} fields={fields} operators={operators} settings={settings} />\n </HoverCardContent>\n </HoverCard>\n <DropdownMenu.Content align=\"start\">\n {actions.map(action => (\n <Fragment key={action.label}>\n {action.destructive && <DropdownMenu.Separator />}\n <DropdownMenu.Item variant={action.destructive ? 'destructive' : 'default'} onClick={action.onClick}>\n {action.icon}\n {action.label}\n </DropdownMenu.Item>\n </Fragment>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu>\n <ContextMenu.Content>\n {actions.map(action => (\n <Fragment key={action.label}>\n {action.destructive && <ContextMenu.Separator />}\n <ContextMenu.Item variant={action.destructive ? 'destructive' : 'default'} onClick={action.onClick}>\n {action.icon}\n {action.label}\n </ContextMenu.Item>\n </Fragment>\n ))}\n </ContextMenu.Content>\n </ContextMenu>\n );\n}\n\ntype ViewAction = { label: string; icon: ReactNode; onClick: () => void; destructive?: boolean };\n","import type { ReactNode } from 'react';\nimport type { SavedViewsController } from './use-saved-views';\nimport { Button } from '@/ds/components/Button/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport type SavedViewEditorProps<TSettings> = {\n views: SavedViewsController<TSettings>;\n children: ReactNode;\n className?: string;\n};\n\nexport function SavedViewEditor<TSettings>({ views, children, className }: SavedViewEditorProps<TSettings>) {\n const { draft } = views;\n const creating = draft?.viewId === undefined;\n return (\n <div\n role={draft ? 'group' : undefined}\n aria-label={draft ? `Edit view ${draft.name}` : undefined}\n className={cn('flex min-w-0 flex-wrap items-center gap-2', className)}\n >\n {children}\n {draft && (\n <>\n {!creating && views.unsaved && (\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n Unsaved changes\n </Txt>\n )}\n <div className=\"ml-auto flex shrink-0 items-center gap-3\">\n {creating && (\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" className=\"max-sm:hidden\">\n Saved in this browser\n </Txt>\n )}\n <div className=\"flex items-center gap-1\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={views.discard}>\n {creating ? 'Cancel' : 'Reset'}\n </Button>\n <Button type=\"button\" variant=\"primary\" size=\"sm\" disabled={!views.unsaved} onClick={views.save}>\n {creating ? 'Save view' : 'Save changes'}\n </Button>\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n","type SavedViewsSubscribe = (listener: () => void) => () => void;\n\nconst listenersByKey = new Map<string, Set<() => void>>();\nconst subscribeByKey = new Map<string, SavedViewsSubscribe>();\n\nexport function readSavedViewsRaw(key: string): string | null {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nexport function writeSavedViewsRaw(key: string, raw: string): boolean {\n try {\n window.localStorage.setItem(key, raw);\n } catch {\n return false;\n }\n listenersByKey.get(key)?.forEach(listener => listener());\n return true;\n}\n\nexport function savedViewsSubscriber(key: string): SavedViewsSubscribe {\n const cached = subscribeByKey.get(key);\n if (cached) return cached;\n const subscribe: SavedViewsSubscribe = listener => subscribeSavedViews(key, listener);\n subscribeByKey.set(key, subscribe);\n return subscribe;\n}\n\nfunction subscribeSavedViews(key: string, listener: () => void): () => void {\n const listeners = listenersByKey.get(key) ?? new Set<() => void>();\n listenersByKey.set(key, listeners);\n listeners.add(listener);\n const onStorage = (event: StorageEvent) => {\n if (event.key === key || event.key === null) listener();\n };\n window.addEventListener('storage', onStorage);\n return () => {\n listeners.delete(listener);\n window.removeEventListener('storage', onStorage);\n };\n}\n","import { useState, useSyncExternalStore } from 'react';\nimport { parseSavedViews, savedViewNameSchema, serializeSavedViews } from './saved-view-schema';\nimport type { SavedView, SavedViewSettingsSchema } from './saved-view-schema';\nimport { readSavedViewsRaw, savedViewsSubscriber, writeSavedViewsRaw } from './saved-views-storage';\nimport type { FilterBarItem } from '@/ds/components/FilterBar/types';\n\nconst NEW_SAVED_VIEW_NAME = 'Untitled view';\n\nexport type SavedViewContent<TSettings> = {\n filters: FilterBarItem[];\n settings: TSettings;\n};\n\nexport type SavedViewDraft<TSettings> = SavedViewContent<TSettings> & {\n viewId?: string;\n name: string;\n};\n\nexport type SavedViewDraftChange<TSettings> = Partial<Omit<SavedViewDraft<TSettings>, 'viewId'>>;\n\nexport type UseSavedViewsOptions<TSettings> = {\n storageKey: string;\n settingsSchema: SavedViewSettingsSchema<TSettings>;\n activeViewId: string | undefined;\n onActiveViewChange: (viewId: string | undefined) => void;\n};\n\nexport type SavedViewsController<TSettings> = {\n views: SavedView<TSettings>[];\n activeView: SavedView<TSettings> | undefined;\n draft: SavedViewDraft<TSettings> | undefined;\n unsaved: boolean;\n storageError: string | undefined;\n applied: SavedViewContent<TSettings> | undefined;\n select: (viewId: string | undefined) => void;\n create: (settings: TSettings, filters?: FilterBarItem[]) => void;\n edit: (viewId: string) => void;\n change: (patch: SavedViewDraftChange<TSettings>) => void;\n save: () => void;\n discard: () => void;\n rename: (viewId: string, name: string) => void;\n duplicate: (viewId: string) => void;\n remove: (viewId: string) => void;\n};\n\nfunction createSavedViewId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n return `view-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nfunction validViewName(name: string): string | undefined {\n const parsed = savedViewNameSchema.safeParse(name);\n return parsed.success ? parsed.data : undefined;\n}\n\nfunction sameViewContent<TSettings>(draft: SavedViewDraft<TSettings>, view: SavedView<TSettings>): boolean {\n return (\n JSON.stringify([draft.name, draft.filters, draft.settings]) ===\n JSON.stringify([view.name, view.filters, view.settings])\n );\n}\n\nexport function useSavedViews<TSettings>({\n storageKey,\n settingsSchema,\n activeViewId,\n onActiveViewChange,\n}: UseSavedViewsOptions<TSettings>): SavedViewsController<TSettings> {\n const raw = useSyncExternalStore(\n savedViewsSubscriber(storageKey),\n () => readSavedViewsRaw(storageKey),\n () => null,\n );\n const views = parseSavedViews(raw, settingsSchema);\n const [failedStorageKey, setFailedStorageKey] = useState<string>();\n const [pendingDraft, setDraft] = useState<SavedViewDraft<TSettings>>();\n const [draftScope, setDraftScope] = useState({ storageKey, activeViewId });\n const draftView = views.find(view => view.id === pendingDraft?.viewId);\n const draftViewDeleted = pendingDraft?.viewId !== undefined && !draftView;\n const storageKeyChanged = draftScope.storageKey !== storageKey;\n if (storageKeyChanged || draftScope.activeViewId !== activeViewId || draftViewDeleted) {\n setDraftScope({ storageKey, activeViewId });\n if (storageKeyChanged || draftViewDeleted || pendingDraft?.viewId !== activeViewId) setDraft(undefined);\n }\n const draft = pendingDraft?.viewId === undefined || pendingDraft.viewId === activeViewId ? pendingDraft : undefined;\n const unsaved = draft !== undefined && (!draftView || !sameViewContent(draft, draftView));\n\n const activeView = views.find(view => view.id === activeViewId);\n const write = (next: SavedView<TSettings>[]) => {\n const saved = writeSavedViewsRaw(storageKey, serializeSavedViews(next));\n setFailedStorageKey(saved ? undefined : storageKey);\n return saved;\n };\n\n return {\n views,\n activeView,\n draft,\n unsaved,\n storageError:\n failedStorageKey === storageKey\n ? 'Could not save changes. Check your browser storage settings and try again.'\n : undefined,\n applied: draft ?? activeView,\n select: viewId => {\n setFailedStorageKey(undefined);\n setDraft(undefined);\n onActiveViewChange(viewId);\n },\n create: (settings, filters = []) => setDraft({ name: NEW_SAVED_VIEW_NAME, filters, settings }),\n edit: viewId => {\n if (draft?.viewId === viewId) return;\n const view = views.find(candidate => candidate.id === viewId);\n if (!view) return;\n const { id, ...content } = view;\n setDraft({ ...content, viewId: id });\n if (viewId !== activeViewId) onActiveViewChange(viewId);\n },\n change: patch => {\n if (draft) {\n setDraft({ ...draft, ...patch });\n return;\n }\n if (!activeView) return;\n const { id, ...content } = activeView;\n setDraft({ ...content, ...patch, viewId: id });\n },\n save: () => {\n if (!draft) return;\n const { viewId, ...content } = draft;\n const saved: SavedView<TSettings> = {\n ...content,\n id: viewId ?? createSavedViewId(),\n name: validViewName(content.name) ?? views.find(view => view.id === viewId)?.name ?? NEW_SAVED_VIEW_NAME,\n };\n if (!write(viewId ? views.map(view => (view.id === viewId ? saved : view)) : [...views, saved])) return;\n setDraft(undefined);\n if (saved.id !== activeViewId) onActiveViewChange(saved.id);\n },\n discard: () => {\n setFailedStorageKey(undefined);\n setDraft(undefined);\n },\n rename: (viewId, name) => {\n const nextName = validViewName(name);\n if (!nextName) return;\n if (!write(views.map(view => (view.id === viewId ? { ...view, name: nextName } : view)))) return;\n if (draft?.viewId === viewId) setDraft({ ...draft, name: nextName });\n },\n duplicate: viewId => {\n const index = views.findIndex(view => view.id === viewId);\n const original = views[index];\n if (!original) return;\n const copy: SavedView<TSettings> = {\n ...original,\n id: createSavedViewId(),\n name: validViewName(`${original.name} copy`) ?? original.name,\n };\n if (!write(views.toSpliced(index + 1, 0, copy))) return;\n setDraft(undefined);\n onActiveViewChange(copy.id);\n },\n remove: viewId => {\n if (!write(views.filter(view => view.id !== viewId))) return;\n if (draft?.viewId === viewId) setDraft(undefined);\n if (activeViewId === viewId) onActiveViewChange(undefined);\n },\n };\n}\n"],"names":["z","jsx","passwordManagerOptOutProps","jsxs","Txt","FilterBarFieldLabel","buttonVariants","cn","controlHeight","useState","Button","LayersPlusIcon","LayersIcon","Fragment","VisuallyHidden","PencilIcon","Icon","TextCursorInputIcon","CopyIcon","Trash2Icon","ContextMenu","DropdownMenu","HoverCard","HoverCardTrigger","ChevronDownIcon","HoverCardContent","useSyncExternalStore"],"mappings":"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"}
@@ -167,7 +167,6 @@ function SavedViewTabs({
167
167
  Button,
168
168
  {
169
169
  type: "button",
170
- variant: "ghost",
171
170
  size: "icon-sm",
172
171
  tooltip: "New view",
173
172
  disabled: draft !== void 0,
@@ -1 +1 @@
1
- {"version":3,"file":"SavedViews.es.js","sources":["../../src/ds/components/SavedViews/saved-view-schema.ts","../../src/ds/components/SavedViews/saved-view-name-input.tsx","../../src/ds/components/SavedViews/saved-view-summary.tsx","../../src/ds/components/SavedViews/saved-view-tabs.tsx","../../src/ds/components/SavedViews/saved-view-editor.tsx","../../src/ds/components/SavedViews/saved-views-storage.ts","../../src/ds/components/SavedViews/use-saved-views.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport type { FilterBarItem } from '@/ds/components/FilterBar/types';\n\nexport const MAX_SAVED_VIEW_NAME_CHARS = 80;\n\nconst SAVED_VIEWS_STORAGE_VERSION = 1;\n\nconst filterBarScalarSchema = z.union([z.string(), z.number(), z.boolean()]);\n\nconst savedViewFilterSchema = z.object({\n id: z.string().min(1),\n fieldId: z.string().min(1),\n operatorId: z.string().min(1),\n value: z.union([filterBarScalarSchema, z.array(filterBarScalarSchema)]),\n}) satisfies z.ZodType<FilterBarItem>;\n\nexport const savedViewNameSchema = z.string().trim().min(1).max(MAX_SAVED_VIEW_NAME_CHARS);\n\nconst storedSavedViewSchema = z.object({\n id: z.string().min(1),\n name: savedViewNameSchema,\n filters: z.array(savedViewFilterSchema),\n settings: z.unknown(),\n});\n\n// Views stay `unknown` so one malformed view is dropped on its own, not the whole list.\nconst savedViewsDocumentSchema = z.object({\n version: z.literal(SAVED_VIEWS_STORAGE_VERSION),\n views: z.array(z.unknown()),\n});\n\n// Only `safeParse` is used, so the consumer's Zod version never has to match this package's.\nexport type SavedViewSettingsSchema<TSettings> = {\n safeParse: (value: unknown) => { success: true; data: TSettings } | { success: false };\n};\n\nexport type SavedView<TSettings> = {\n id: string;\n name: string;\n filters: FilterBarItem[];\n settings: TSettings;\n};\n\nexport function parseSavedViews<TSettings>(\n raw: string | null,\n settingsSchema: SavedViewSettingsSchema<TSettings>,\n): SavedView<TSettings>[] {\n if (!raw) return [];\n let json: unknown;\n try {\n json = JSON.parse(raw);\n } catch {\n return [];\n }\n const document = savedViewsDocumentSchema.safeParse(json);\n if (!document.success) return [];\n return document.data.views.flatMap(candidate => {\n const view = storedSavedViewSchema.safeParse(candidate);\n if (!view.success) return [];\n const settings = settingsSchema.safeParse(view.data.settings);\n if (!settings.success) return [];\n return [{ ...view.data, settings: settings.data }];\n });\n}\n\nexport function serializeSavedViews<TSettings>(views: readonly SavedView<TSettings>[]): string {\n return JSON.stringify({ version: SAVED_VIEWS_STORAGE_VERSION, views });\n}\n","import { MAX_SAVED_VIEW_NAME_CHARS } from './saved-view-schema';\nimport { passwordManagerOptOutProps } from '@/ds/primitives/password-manager-autofill';\n\n// Uncontrolled so blur is the one exit: Enter blurs, Escape restores the name first, blur commits.\nexport function SavedViewNameInput({ name, onCommit }: { name: string; onCommit: (name: string) => void }) {\n return (\n <input\n autoFocus\n aria-label=\"View name\"\n defaultValue={name}\n maxLength={MAX_SAVED_VIEW_NAME_CHARS}\n {...passwordManagerOptOutProps}\n onFocus={event => event.currentTarget.select()}\n onBlur={event => onCommit(event.currentTarget.value)}\n onKeyDown={event => {\n if (event.key === 'Escape') event.currentTarget.value = name;\n if (event.key === 'Enter' || event.key === 'Escape') {\n event.preventDefault();\n event.currentTarget.blur();\n }\n }}\n className=\"field-sizing-content min-w-12 bg-transparent text-foreground outline-hidden\"\n />\n );\n}\n","import type { ReactNode } from 'react';\nimport { FilterBarFieldLabel, formatValue } from '@/ds/components/FilterBar/filter-bar-chip';\nimport type { FilterBarField, FilterBarItem, FilterBarOperator } from '@/ds/components/FilterBar/types';\nimport { Txt } from '@/ds/components/Txt';\n\ntype SavedViewSummaryProps = {\n filters: readonly FilterBarItem[];\n fields: readonly FilterBarField[];\n operators: readonly FilterBarOperator[];\n settings?: ReactNode;\n};\n\nexport function SavedViewSummary({ filters, fields, operators, settings }: SavedViewSummaryProps) {\n return (\n <div className=\"flex min-w-48 flex-col gap-2\">\n {filters.length === 0 ? (\n <Txt variant=\"caption\" tone=\"muted\">\n No filters\n </Txt>\n ) : (\n <ul aria-label=\"Filters\" className=\"flex flex-col gap-1.5\">\n {filters.map(filter => {\n const field = fields.find(candidate => candidate.id === filter.fieldId);\n const operatorStated = (field?.operators?.length ?? operators.length) > 1;\n const operator = operators.find(candidate => candidate.id === filter.operatorId);\n return (\n <li key={filter.id} className=\"min-w-0\">\n <Txt as=\"span\" variant=\"body-sm\" className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"flex min-w-0 shrink-0 items-center gap-1 text-muted-foreground\">\n <FilterBarFieldLabel field={field} label={field?.label ?? filter.fieldId} />\n </span>\n {operatorStated && <span className=\"shrink-0 text-muted-foreground\">{operator?.label}</span>}\n <span className=\"min-w-0 truncate\">{formatValue(filter.value, field)}</span>\n </Txt>\n </li>\n );\n })}\n </ul>\n )}\n {settings}\n </div>\n );\n}\n","import {\n ChevronDownIcon,\n CopyIcon,\n LayersIcon,\n LayersPlusIcon,\n PencilIcon,\n TextCursorInputIcon,\n Trash2Icon,\n} from 'lucide-react';\nimport { Fragment, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { SavedViewNameInput } from './saved-view-name-input';\nimport type { SavedView } from './saved-view-schema';\nimport { SavedViewSummary } from './saved-view-summary';\nimport type { SavedViewsController } from './use-saved-views';\nimport { Button, buttonVariants } from '@/ds/components/Button/Button';\nimport { ContextMenu } from '@/ds/components/ContextMenu';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport type { FilterBarField, FilterBarOperator } from '@/ds/components/FilterBar/types';\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from '@/ds/components/HoverCard';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { controlHeight } from '@/ds/primitives/control-size';\nimport { VisuallyHidden } from '@/ds/primitives/visually-hidden';\nimport { cn } from '@/lib/utils';\n\nconst restingTabClass = buttonVariants({ variant: 'default', size: 'sm' });\nconst selectedTabClass = cn(\n buttonVariants({ variant: 'ghost', size: 'sm' }),\n 'bg-fill-hover text-foreground not-disabled:hover:bg-fill-hover',\n);\nconst editingTabClass = cn(\n controlHeight.sm,\n 'inline-flex items-center gap-1.5 rounded-full border border-dashed border-border-strong bg-fill-hover px-[.9em] text-label text-foreground',\n '[&_svg]:size-3.5 [&_svg]:shrink-0',\n);\n\nexport type SavedViewTabsProps<TSettings> = {\n views: SavedViewsController<TSettings>;\n fields: readonly FilterBarField[];\n operators: readonly FilterBarOperator[];\n defaultLabel: string;\n newViewSettings: NoInfer<TSettings>;\n describeSettings?: (settings: TSettings) => ReactNode;\n 'aria-label'?: string;\n className?: string;\n};\n\nexport function SavedViewTabs<TSettings>({\n views,\n fields,\n operators,\n defaultLabel,\n newViewSettings,\n describeSettings,\n 'aria-label': ariaLabel = 'Views',\n className,\n}: SavedViewTabsProps<TSettings>) {\n const [renamingViewId, setRenamingViewId] = useState<string>();\n const { draft } = views;\n const creating = draft !== undefined && draft.viewId === undefined;\n const defaultSelected = views.activeView === undefined && !creating;\n\n return (\n <div role=\"group\" aria-label={ariaLabel} className={cn('flex flex-wrap items-center gap-1.5', className)}>\n <button\n type=\"button\"\n aria-pressed={defaultSelected}\n className={defaultSelected ? selectedTabClass : restingTabClass}\n onClick={() => views.select(undefined)}\n >\n {defaultLabel}\n </button>\n {views.views.map(view => {\n if (renamingViewId === view.id) {\n return (\n <RenamingViewTab\n key={view.id}\n name={view.name}\n onCommit={name => {\n setRenamingViewId(undefined);\n views.rename(view.id, name);\n }}\n />\n );\n }\n return (\n <SavedViewTab\n key={view.id}\n view={view}\n selected={views.activeView?.id === view.id && !creating}\n unsaved={draft?.viewId === view.id && views.unsaved}\n fields={fields}\n operators={operators}\n settings={describeSettings?.(view.settings)}\n onSelect={() => views.select(view.id)}\n onEdit={() => views.edit(view.id)}\n onRename={() => setRenamingViewId(view.id)}\n onDuplicate={() => views.duplicate(view.id)}\n onDelete={() => views.remove(view.id)}\n />\n );\n })}\n {views.storageError && (\n <Txt role=\"alert\" variant=\"caption\" className=\"w-full text-destructive-foreground\">\n {views.storageError}\n </Txt>\n )}\n {creating ? (\n <EditingViewTab name={draft.name} unsaved onRename={name => views.change({ name })} />\n ) : (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n tooltip=\"New view\"\n disabled={draft !== undefined}\n onClick={() => views.create(newViewSettings)}\n >\n <LayersPlusIcon />\n </Button>\n )}\n </div>\n );\n}\n\nfunction EditingViewTab({\n name,\n unsaved,\n onRename,\n}: {\n name: string;\n unsaved: boolean;\n onRename: (name: string) => void;\n}) {\n const [renaming, setRenaming] = useState(false);\n return (\n <span aria-current=\"true\" className={editingTabClass}>\n <LayersIcon aria-hidden />\n {renaming ? (\n <SavedViewNameInput\n name={name}\n onCommit={next => {\n setRenaming(false);\n if (next.trim()) onRename(next);\n }}\n />\n ) : (\n <>\n <span className=\"max-w-48 truncate\">{name}</span>\n {unsaved && (\n <>\n <span className=\"size-1.5 shrink-0 rounded-full bg-warning-indicator\" aria-hidden />\n <VisuallyHidden>Unsaved changes</VisuallyHidden>\n </>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n tooltip=\"Rename view\"\n className=\"-mr-2 size-6\"\n onClick={() => setRenaming(true)}\n >\n <PencilIcon />\n </Button>\n </>\n )}\n </span>\n );\n}\n\nfunction RenamingViewTab({ name, onCommit }: { name: string; onCommit: (name: string) => void }) {\n return (\n <span className={cn(restingTabClass, 'gap-1.5')}>\n <SavedViewTabIcon />\n <SavedViewNameInput name={name} onCommit={onCommit} />\n </span>\n );\n}\n\nfunction SavedViewTabIcon() {\n return (\n <Icon data-slot=\"button-icon\" size=\"sm\">\n <LayersIcon aria-hidden />\n </Icon>\n );\n}\n\nfunction SavedViewTab<TSettings>({\n view,\n selected,\n unsaved,\n fields,\n operators,\n settings,\n onSelect,\n onEdit,\n onRename,\n onDuplicate,\n onDelete,\n}: {\n view: SavedView<TSettings>;\n selected: boolean;\n unsaved: boolean;\n fields: readonly FilterBarField[];\n operators: readonly FilterBarOperator[];\n settings: ReactNode;\n onSelect: () => void;\n onEdit: () => void;\n onRename: () => void;\n onDuplicate: () => void;\n onDelete: () => void;\n}) {\n const actions: ViewAction[] = [\n { label: 'Edit view', icon: <PencilIcon aria-hidden />, onClick: onEdit },\n { label: 'Rename', icon: <TextCursorInputIcon aria-hidden />, onClick: onRename },\n { label: 'Duplicate', icon: <CopyIcon aria-hidden />, onClick: onDuplicate },\n { label: 'Delete view', icon: <Trash2Icon aria-hidden />, onClick: onDelete, destructive: true },\n ];\n const [menuOpen, setMenuOpen] = useState(false);\n const [previewOpen, setPreviewOpen] = useState(false);\n const changeMenuOpen = (open: boolean) => {\n setMenuOpen(selected && open);\n if (open) setPreviewOpen(false);\n };\n\n return (\n <ContextMenu>\n <DropdownMenu open={selected && menuOpen} onOpenChange={changeMenuOpen}>\n <HoverCard open={!selected && previewOpen} onOpenChange={setPreviewOpen}>\n <ContextMenu.Trigger\n render={\n <HoverCardTrigger\n delay={400}\n render={\n <DropdownMenu.Trigger\n render={\n <button\n type=\"button\"\n aria-pressed={selected}\n aria-haspopup={selected ? 'menu' : undefined}\n onClick={() => {\n if (selected) return;\n setPreviewOpen(false);\n onSelect();\n }}\n className={cn(selected ? selectedTabClass : restingTabClass, 'gap-1.5')}\n />\n }\n />\n }\n />\n }\n >\n <SavedViewTabIcon />\n <span className=\"max-w-48 truncate\">{view.name}</span>\n {unsaved && <span className=\"size-1.5 shrink-0 rounded-full bg-warning-indicator\" aria-hidden />}\n {selected && <ChevronDownIcon aria-hidden className=\"size-3\" />}\n </ContextMenu.Trigger>\n <HoverCardContent side=\"bottom\" align=\"start\" showArrow={false}>\n <SavedViewSummary filters={view.filters} fields={fields} operators={operators} settings={settings} />\n </HoverCardContent>\n </HoverCard>\n <DropdownMenu.Content align=\"start\">\n {actions.map(action => (\n <Fragment key={action.label}>\n {action.destructive && <DropdownMenu.Separator />}\n <DropdownMenu.Item variant={action.destructive ? 'destructive' : 'default'} onClick={action.onClick}>\n {action.icon}\n {action.label}\n </DropdownMenu.Item>\n </Fragment>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu>\n <ContextMenu.Content>\n {actions.map(action => (\n <Fragment key={action.label}>\n {action.destructive && <ContextMenu.Separator />}\n <ContextMenu.Item variant={action.destructive ? 'destructive' : 'default'} onClick={action.onClick}>\n {action.icon}\n {action.label}\n </ContextMenu.Item>\n </Fragment>\n ))}\n </ContextMenu.Content>\n </ContextMenu>\n );\n}\n\ntype ViewAction = { label: string; icon: ReactNode; onClick: () => void; destructive?: boolean };\n","import type { ReactNode } from 'react';\nimport type { SavedViewsController } from './use-saved-views';\nimport { Button } from '@/ds/components/Button/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport type SavedViewEditorProps<TSettings> = {\n views: SavedViewsController<TSettings>;\n children: ReactNode;\n className?: string;\n};\n\nexport function SavedViewEditor<TSettings>({ views, children, className }: SavedViewEditorProps<TSettings>) {\n const { draft } = views;\n const creating = draft?.viewId === undefined;\n return (\n <div\n role={draft ? 'group' : undefined}\n aria-label={draft ? `Edit view ${draft.name}` : undefined}\n className={cn('flex min-w-0 flex-wrap items-center gap-2', className)}\n >\n {children}\n {draft && (\n <>\n {!creating && views.unsaved && (\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n Unsaved changes\n </Txt>\n )}\n <div className=\"ml-auto flex shrink-0 items-center gap-3\">\n {creating && (\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" className=\"max-sm:hidden\">\n Saved in this browser\n </Txt>\n )}\n <div className=\"flex items-center gap-1\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={views.discard}>\n {creating ? 'Cancel' : 'Reset'}\n </Button>\n <Button type=\"button\" variant=\"primary\" size=\"sm\" disabled={!views.unsaved} onClick={views.save}>\n {creating ? 'Save view' : 'Save changes'}\n </Button>\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n","type SavedViewsSubscribe = (listener: () => void) => () => void;\n\nconst listenersByKey = new Map<string, Set<() => void>>();\nconst subscribeByKey = new Map<string, SavedViewsSubscribe>();\n\nexport function readSavedViewsRaw(key: string): string | null {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nexport function writeSavedViewsRaw(key: string, raw: string): boolean {\n try {\n window.localStorage.setItem(key, raw);\n } catch {\n return false;\n }\n listenersByKey.get(key)?.forEach(listener => listener());\n return true;\n}\n\nexport function savedViewsSubscriber(key: string): SavedViewsSubscribe {\n const cached = subscribeByKey.get(key);\n if (cached) return cached;\n const subscribe: SavedViewsSubscribe = listener => subscribeSavedViews(key, listener);\n subscribeByKey.set(key, subscribe);\n return subscribe;\n}\n\nfunction subscribeSavedViews(key: string, listener: () => void): () => void {\n const listeners = listenersByKey.get(key) ?? new Set<() => void>();\n listenersByKey.set(key, listeners);\n listeners.add(listener);\n const onStorage = (event: StorageEvent) => {\n if (event.key === key || event.key === null) listener();\n };\n window.addEventListener('storage', onStorage);\n return () => {\n listeners.delete(listener);\n window.removeEventListener('storage', onStorage);\n };\n}\n","import { useState, useSyncExternalStore } from 'react';\nimport { parseSavedViews, savedViewNameSchema, serializeSavedViews } from './saved-view-schema';\nimport type { SavedView, SavedViewSettingsSchema } from './saved-view-schema';\nimport { readSavedViewsRaw, savedViewsSubscriber, writeSavedViewsRaw } from './saved-views-storage';\nimport type { FilterBarItem } from '@/ds/components/FilterBar/types';\n\nconst NEW_SAVED_VIEW_NAME = 'Untitled view';\n\nexport type SavedViewContent<TSettings> = {\n filters: FilterBarItem[];\n settings: TSettings;\n};\n\nexport type SavedViewDraft<TSettings> = SavedViewContent<TSettings> & {\n viewId?: string;\n name: string;\n};\n\nexport type SavedViewDraftChange<TSettings> = Partial<Omit<SavedViewDraft<TSettings>, 'viewId'>>;\n\nexport type UseSavedViewsOptions<TSettings> = {\n storageKey: string;\n settingsSchema: SavedViewSettingsSchema<TSettings>;\n activeViewId: string | undefined;\n onActiveViewChange: (viewId: string | undefined) => void;\n};\n\nexport type SavedViewsController<TSettings> = {\n views: SavedView<TSettings>[];\n activeView: SavedView<TSettings> | undefined;\n draft: SavedViewDraft<TSettings> | undefined;\n unsaved: boolean;\n storageError: string | undefined;\n applied: SavedViewContent<TSettings> | undefined;\n select: (viewId: string | undefined) => void;\n create: (settings: TSettings, filters?: FilterBarItem[]) => void;\n edit: (viewId: string) => void;\n change: (patch: SavedViewDraftChange<TSettings>) => void;\n save: () => void;\n discard: () => void;\n rename: (viewId: string, name: string) => void;\n duplicate: (viewId: string) => void;\n remove: (viewId: string) => void;\n};\n\nfunction createSavedViewId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n return `view-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nfunction validViewName(name: string): string | undefined {\n const parsed = savedViewNameSchema.safeParse(name);\n return parsed.success ? parsed.data : undefined;\n}\n\nfunction sameViewContent<TSettings>(draft: SavedViewDraft<TSettings>, view: SavedView<TSettings>): boolean {\n return (\n JSON.stringify([draft.name, draft.filters, draft.settings]) ===\n JSON.stringify([view.name, view.filters, view.settings])\n );\n}\n\nexport function useSavedViews<TSettings>({\n storageKey,\n settingsSchema,\n activeViewId,\n onActiveViewChange,\n}: UseSavedViewsOptions<TSettings>): SavedViewsController<TSettings> {\n const raw = useSyncExternalStore(\n savedViewsSubscriber(storageKey),\n () => readSavedViewsRaw(storageKey),\n () => null,\n );\n const views = parseSavedViews(raw, settingsSchema);\n const [failedStorageKey, setFailedStorageKey] = useState<string>();\n const [pendingDraft, setDraft] = useState<SavedViewDraft<TSettings>>();\n const [draftScope, setDraftScope] = useState({ storageKey, activeViewId });\n const draftView = views.find(view => view.id === pendingDraft?.viewId);\n const draftViewDeleted = pendingDraft?.viewId !== undefined && !draftView;\n const storageKeyChanged = draftScope.storageKey !== storageKey;\n if (storageKeyChanged || draftScope.activeViewId !== activeViewId || draftViewDeleted) {\n setDraftScope({ storageKey, activeViewId });\n if (storageKeyChanged || draftViewDeleted || pendingDraft?.viewId !== activeViewId) setDraft(undefined);\n }\n const draft = pendingDraft?.viewId === undefined || pendingDraft.viewId === activeViewId ? pendingDraft : undefined;\n const unsaved = draft !== undefined && (!draftView || !sameViewContent(draft, draftView));\n\n const activeView = views.find(view => view.id === activeViewId);\n const write = (next: SavedView<TSettings>[]) => {\n const saved = writeSavedViewsRaw(storageKey, serializeSavedViews(next));\n setFailedStorageKey(saved ? undefined : storageKey);\n return saved;\n };\n\n return {\n views,\n activeView,\n draft,\n unsaved,\n storageError:\n failedStorageKey === storageKey\n ? 'Could not save changes. Check your browser storage settings and try again.'\n : undefined,\n applied: draft ?? activeView,\n select: viewId => {\n setFailedStorageKey(undefined);\n setDraft(undefined);\n onActiveViewChange(viewId);\n },\n create: (settings, filters = []) => setDraft({ name: NEW_SAVED_VIEW_NAME, filters, settings }),\n edit: viewId => {\n if (draft?.viewId === viewId) return;\n const view = views.find(candidate => candidate.id === viewId);\n if (!view) return;\n const { id, ...content } = view;\n setDraft({ ...content, viewId: id });\n if (viewId !== activeViewId) onActiveViewChange(viewId);\n },\n change: patch => {\n if (draft) {\n setDraft({ ...draft, ...patch });\n return;\n }\n if (!activeView) return;\n const { id, ...content } = activeView;\n setDraft({ ...content, ...patch, viewId: id });\n },\n save: () => {\n if (!draft) return;\n const { viewId, ...content } = draft;\n const saved: SavedView<TSettings> = {\n ...content,\n id: viewId ?? createSavedViewId(),\n name: validViewName(content.name) ?? views.find(view => view.id === viewId)?.name ?? NEW_SAVED_VIEW_NAME,\n };\n if (!write(viewId ? views.map(view => (view.id === viewId ? saved : view)) : [...views, saved])) return;\n setDraft(undefined);\n if (saved.id !== activeViewId) onActiveViewChange(saved.id);\n },\n discard: () => {\n setFailedStorageKey(undefined);\n setDraft(undefined);\n },\n rename: (viewId, name) => {\n const nextName = validViewName(name);\n if (!nextName) return;\n if (!write(views.map(view => (view.id === viewId ? { ...view, name: nextName } : view)))) return;\n if (draft?.viewId === viewId) setDraft({ ...draft, name: nextName });\n },\n duplicate: viewId => {\n const index = views.findIndex(view => view.id === viewId);\n const original = views[index];\n if (!original) return;\n const copy: SavedView<TSettings> = {\n ...original,\n id: createSavedViewId(),\n name: validViewName(`${original.name} copy`) ?? original.name,\n };\n if (!write(views.toSpliced(index + 1, 0, copy))) return;\n setDraft(undefined);\n onActiveViewChange(copy.id);\n },\n remove: viewId => {\n if (!write(views.filter(view => view.id !== viewId))) return;\n if (draft?.viewId === viewId) setDraft(undefined);\n if (activeViewId === viewId) onActiveViewChange(undefined);\n },\n };\n}\n"],"names":["Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"SavedViews.es.js","sources":["../../src/ds/components/SavedViews/saved-view-schema.ts","../../src/ds/components/SavedViews/saved-view-name-input.tsx","../../src/ds/components/SavedViews/saved-view-summary.tsx","../../src/ds/components/SavedViews/saved-view-tabs.tsx","../../src/ds/components/SavedViews/saved-view-editor.tsx","../../src/ds/components/SavedViews/saved-views-storage.ts","../../src/ds/components/SavedViews/use-saved-views.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport type { FilterBarItem } from '@/ds/components/FilterBar/types';\n\nexport const MAX_SAVED_VIEW_NAME_CHARS = 80;\n\nconst SAVED_VIEWS_STORAGE_VERSION = 1;\n\nconst filterBarScalarSchema = z.union([z.string(), z.number(), z.boolean()]);\n\nconst savedViewFilterSchema = z.object({\n id: z.string().min(1),\n fieldId: z.string().min(1),\n operatorId: z.string().min(1),\n value: z.union([filterBarScalarSchema, z.array(filterBarScalarSchema)]),\n}) satisfies z.ZodType<FilterBarItem>;\n\nexport const savedViewNameSchema = z.string().trim().min(1).max(MAX_SAVED_VIEW_NAME_CHARS);\n\nconst storedSavedViewSchema = z.object({\n id: z.string().min(1),\n name: savedViewNameSchema,\n filters: z.array(savedViewFilterSchema),\n settings: z.unknown(),\n});\n\n// Views stay `unknown` so one malformed view is dropped on its own, not the whole list.\nconst savedViewsDocumentSchema = z.object({\n version: z.literal(SAVED_VIEWS_STORAGE_VERSION),\n views: z.array(z.unknown()),\n});\n\n// Only `safeParse` is used, so the consumer's Zod version never has to match this package's.\nexport type SavedViewSettingsSchema<TSettings> = {\n safeParse: (value: unknown) => { success: true; data: TSettings } | { success: false };\n};\n\nexport type SavedView<TSettings> = {\n id: string;\n name: string;\n filters: FilterBarItem[];\n settings: TSettings;\n};\n\nexport function parseSavedViews<TSettings>(\n raw: string | null,\n settingsSchema: SavedViewSettingsSchema<TSettings>,\n): SavedView<TSettings>[] {\n if (!raw) return [];\n let json: unknown;\n try {\n json = JSON.parse(raw);\n } catch {\n return [];\n }\n const document = savedViewsDocumentSchema.safeParse(json);\n if (!document.success) return [];\n return document.data.views.flatMap(candidate => {\n const view = storedSavedViewSchema.safeParse(candidate);\n if (!view.success) return [];\n const settings = settingsSchema.safeParse(view.data.settings);\n if (!settings.success) return [];\n return [{ ...view.data, settings: settings.data }];\n });\n}\n\nexport function serializeSavedViews<TSettings>(views: readonly SavedView<TSettings>[]): string {\n return JSON.stringify({ version: SAVED_VIEWS_STORAGE_VERSION, views });\n}\n","import { MAX_SAVED_VIEW_NAME_CHARS } from './saved-view-schema';\nimport { passwordManagerOptOutProps } from '@/ds/primitives/password-manager-autofill';\n\n// Uncontrolled so blur is the one exit: Enter blurs, Escape restores the name first, blur commits.\nexport function SavedViewNameInput({ name, onCommit }: { name: string; onCommit: (name: string) => void }) {\n return (\n <input\n autoFocus\n aria-label=\"View name\"\n defaultValue={name}\n maxLength={MAX_SAVED_VIEW_NAME_CHARS}\n {...passwordManagerOptOutProps}\n onFocus={event => event.currentTarget.select()}\n onBlur={event => onCommit(event.currentTarget.value)}\n onKeyDown={event => {\n if (event.key === 'Escape') event.currentTarget.value = name;\n if (event.key === 'Enter' || event.key === 'Escape') {\n event.preventDefault();\n event.currentTarget.blur();\n }\n }}\n className=\"field-sizing-content min-w-12 bg-transparent text-foreground outline-hidden\"\n />\n );\n}\n","import type { ReactNode } from 'react';\nimport { FilterBarFieldLabel, formatValue } from '@/ds/components/FilterBar/filter-bar-chip';\nimport type { FilterBarField, FilterBarItem, FilterBarOperator } from '@/ds/components/FilterBar/types';\nimport { Txt } from '@/ds/components/Txt';\n\ntype SavedViewSummaryProps = {\n filters: readonly FilterBarItem[];\n fields: readonly FilterBarField[];\n operators: readonly FilterBarOperator[];\n settings?: ReactNode;\n};\n\nexport function SavedViewSummary({ filters, fields, operators, settings }: SavedViewSummaryProps) {\n return (\n <div className=\"flex min-w-48 flex-col gap-2\">\n {filters.length === 0 ? (\n <Txt variant=\"caption\" tone=\"muted\">\n No filters\n </Txt>\n ) : (\n <ul aria-label=\"Filters\" className=\"flex flex-col gap-1.5\">\n {filters.map(filter => {\n const field = fields.find(candidate => candidate.id === filter.fieldId);\n const operatorStated = (field?.operators?.length ?? operators.length) > 1;\n const operator = operators.find(candidate => candidate.id === filter.operatorId);\n return (\n <li key={filter.id} className=\"min-w-0\">\n <Txt as=\"span\" variant=\"body-sm\" className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"flex min-w-0 shrink-0 items-center gap-1 text-muted-foreground\">\n <FilterBarFieldLabel field={field} label={field?.label ?? filter.fieldId} />\n </span>\n {operatorStated && <span className=\"shrink-0 text-muted-foreground\">{operator?.label}</span>}\n <span className=\"min-w-0 truncate\">{formatValue(filter.value, field)}</span>\n </Txt>\n </li>\n );\n })}\n </ul>\n )}\n {settings}\n </div>\n );\n}\n","import {\n ChevronDownIcon,\n CopyIcon,\n LayersIcon,\n LayersPlusIcon,\n PencilIcon,\n TextCursorInputIcon,\n Trash2Icon,\n} from 'lucide-react';\nimport { Fragment, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { SavedViewNameInput } from './saved-view-name-input';\nimport type { SavedView } from './saved-view-schema';\nimport { SavedViewSummary } from './saved-view-summary';\nimport type { SavedViewsController } from './use-saved-views';\nimport { Button, buttonVariants } from '@/ds/components/Button/Button';\nimport { ContextMenu } from '@/ds/components/ContextMenu';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport type { FilterBarField, FilterBarOperator } from '@/ds/components/FilterBar/types';\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from '@/ds/components/HoverCard';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { controlHeight } from '@/ds/primitives/control-size';\nimport { VisuallyHidden } from '@/ds/primitives/visually-hidden';\nimport { cn } from '@/lib/utils';\n\nconst restingTabClass = buttonVariants({ variant: 'default', size: 'sm' });\nconst selectedTabClass = cn(\n buttonVariants({ variant: 'ghost', size: 'sm' }),\n 'bg-fill-hover text-foreground not-disabled:hover:bg-fill-hover',\n);\nconst editingTabClass = cn(\n controlHeight.sm,\n 'inline-flex items-center gap-1.5 rounded-full border border-dashed border-border-strong bg-fill-hover px-[.9em] text-label text-foreground',\n '[&_svg]:size-3.5 [&_svg]:shrink-0',\n);\n\nexport type SavedViewTabsProps<TSettings> = {\n views: SavedViewsController<TSettings>;\n fields: readonly FilterBarField[];\n operators: readonly FilterBarOperator[];\n defaultLabel: string;\n newViewSettings: NoInfer<TSettings>;\n describeSettings?: (settings: TSettings) => ReactNode;\n 'aria-label'?: string;\n className?: string;\n};\n\nexport function SavedViewTabs<TSettings>({\n views,\n fields,\n operators,\n defaultLabel,\n newViewSettings,\n describeSettings,\n 'aria-label': ariaLabel = 'Views',\n className,\n}: SavedViewTabsProps<TSettings>) {\n const [renamingViewId, setRenamingViewId] = useState<string>();\n const { draft } = views;\n const creating = draft !== undefined && draft.viewId === undefined;\n const defaultSelected = views.activeView === undefined && !creating;\n\n return (\n <div role=\"group\" aria-label={ariaLabel} className={cn('flex flex-wrap items-center gap-1.5', className)}>\n <button\n type=\"button\"\n aria-pressed={defaultSelected}\n className={defaultSelected ? selectedTabClass : restingTabClass}\n onClick={() => views.select(undefined)}\n >\n {defaultLabel}\n </button>\n {views.views.map(view => {\n if (renamingViewId === view.id) {\n return (\n <RenamingViewTab\n key={view.id}\n name={view.name}\n onCommit={name => {\n setRenamingViewId(undefined);\n views.rename(view.id, name);\n }}\n />\n );\n }\n return (\n <SavedViewTab\n key={view.id}\n view={view}\n selected={views.activeView?.id === view.id && !creating}\n unsaved={draft?.viewId === view.id && views.unsaved}\n fields={fields}\n operators={operators}\n settings={describeSettings?.(view.settings)}\n onSelect={() => views.select(view.id)}\n onEdit={() => views.edit(view.id)}\n onRename={() => setRenamingViewId(view.id)}\n onDuplicate={() => views.duplicate(view.id)}\n onDelete={() => views.remove(view.id)}\n />\n );\n })}\n {views.storageError && (\n <Txt role=\"alert\" variant=\"caption\" className=\"w-full text-destructive-foreground\">\n {views.storageError}\n </Txt>\n )}\n {creating ? (\n <EditingViewTab name={draft.name} unsaved onRename={name => views.change({ name })} />\n ) : (\n <Button\n type=\"button\"\n size=\"icon-sm\"\n tooltip=\"New view\"\n disabled={draft !== undefined}\n onClick={() => views.create(newViewSettings)}\n >\n <LayersPlusIcon />\n </Button>\n )}\n </div>\n );\n}\n\nfunction EditingViewTab({\n name,\n unsaved,\n onRename,\n}: {\n name: string;\n unsaved: boolean;\n onRename: (name: string) => void;\n}) {\n const [renaming, setRenaming] = useState(false);\n return (\n <span aria-current=\"true\" className={editingTabClass}>\n <LayersIcon aria-hidden />\n {renaming ? (\n <SavedViewNameInput\n name={name}\n onCommit={next => {\n setRenaming(false);\n if (next.trim()) onRename(next);\n }}\n />\n ) : (\n <>\n <span className=\"max-w-48 truncate\">{name}</span>\n {unsaved && (\n <>\n <span className=\"size-1.5 shrink-0 rounded-full bg-warning-indicator\" aria-hidden />\n <VisuallyHidden>Unsaved changes</VisuallyHidden>\n </>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n tooltip=\"Rename view\"\n className=\"-mr-2 size-6\"\n onClick={() => setRenaming(true)}\n >\n <PencilIcon />\n </Button>\n </>\n )}\n </span>\n );\n}\n\nfunction RenamingViewTab({ name, onCommit }: { name: string; onCommit: (name: string) => void }) {\n return (\n <span className={cn(restingTabClass, 'gap-1.5')}>\n <SavedViewTabIcon />\n <SavedViewNameInput name={name} onCommit={onCommit} />\n </span>\n );\n}\n\nfunction SavedViewTabIcon() {\n return (\n <Icon data-slot=\"button-icon\" size=\"sm\">\n <LayersIcon aria-hidden />\n </Icon>\n );\n}\n\nfunction SavedViewTab<TSettings>({\n view,\n selected,\n unsaved,\n fields,\n operators,\n settings,\n onSelect,\n onEdit,\n onRename,\n onDuplicate,\n onDelete,\n}: {\n view: SavedView<TSettings>;\n selected: boolean;\n unsaved: boolean;\n fields: readonly FilterBarField[];\n operators: readonly FilterBarOperator[];\n settings: ReactNode;\n onSelect: () => void;\n onEdit: () => void;\n onRename: () => void;\n onDuplicate: () => void;\n onDelete: () => void;\n}) {\n const actions: ViewAction[] = [\n { label: 'Edit view', icon: <PencilIcon aria-hidden />, onClick: onEdit },\n { label: 'Rename', icon: <TextCursorInputIcon aria-hidden />, onClick: onRename },\n { label: 'Duplicate', icon: <CopyIcon aria-hidden />, onClick: onDuplicate },\n { label: 'Delete view', icon: <Trash2Icon aria-hidden />, onClick: onDelete, destructive: true },\n ];\n const [menuOpen, setMenuOpen] = useState(false);\n const [previewOpen, setPreviewOpen] = useState(false);\n const changeMenuOpen = (open: boolean) => {\n setMenuOpen(selected && open);\n if (open) setPreviewOpen(false);\n };\n\n return (\n <ContextMenu>\n <DropdownMenu open={selected && menuOpen} onOpenChange={changeMenuOpen}>\n <HoverCard open={!selected && previewOpen} onOpenChange={setPreviewOpen}>\n <ContextMenu.Trigger\n render={\n <HoverCardTrigger\n delay={400}\n render={\n <DropdownMenu.Trigger\n render={\n <button\n type=\"button\"\n aria-pressed={selected}\n aria-haspopup={selected ? 'menu' : undefined}\n onClick={() => {\n if (selected) return;\n setPreviewOpen(false);\n onSelect();\n }}\n className={cn(selected ? selectedTabClass : restingTabClass, 'gap-1.5')}\n />\n }\n />\n }\n />\n }\n >\n <SavedViewTabIcon />\n <span className=\"max-w-48 truncate\">{view.name}</span>\n {unsaved && <span className=\"size-1.5 shrink-0 rounded-full bg-warning-indicator\" aria-hidden />}\n {selected && <ChevronDownIcon aria-hidden className=\"size-3\" />}\n </ContextMenu.Trigger>\n <HoverCardContent side=\"bottom\" align=\"start\" showArrow={false}>\n <SavedViewSummary filters={view.filters} fields={fields} operators={operators} settings={settings} />\n </HoverCardContent>\n </HoverCard>\n <DropdownMenu.Content align=\"start\">\n {actions.map(action => (\n <Fragment key={action.label}>\n {action.destructive && <DropdownMenu.Separator />}\n <DropdownMenu.Item variant={action.destructive ? 'destructive' : 'default'} onClick={action.onClick}>\n {action.icon}\n {action.label}\n </DropdownMenu.Item>\n </Fragment>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu>\n <ContextMenu.Content>\n {actions.map(action => (\n <Fragment key={action.label}>\n {action.destructive && <ContextMenu.Separator />}\n <ContextMenu.Item variant={action.destructive ? 'destructive' : 'default'} onClick={action.onClick}>\n {action.icon}\n {action.label}\n </ContextMenu.Item>\n </Fragment>\n ))}\n </ContextMenu.Content>\n </ContextMenu>\n );\n}\n\ntype ViewAction = { label: string; icon: ReactNode; onClick: () => void; destructive?: boolean };\n","import type { ReactNode } from 'react';\nimport type { SavedViewsController } from './use-saved-views';\nimport { Button } from '@/ds/components/Button/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport type SavedViewEditorProps<TSettings> = {\n views: SavedViewsController<TSettings>;\n children: ReactNode;\n className?: string;\n};\n\nexport function SavedViewEditor<TSettings>({ views, children, className }: SavedViewEditorProps<TSettings>) {\n const { draft } = views;\n const creating = draft?.viewId === undefined;\n return (\n <div\n role={draft ? 'group' : undefined}\n aria-label={draft ? `Edit view ${draft.name}` : undefined}\n className={cn('flex min-w-0 flex-wrap items-center gap-2', className)}\n >\n {children}\n {draft && (\n <>\n {!creating && views.unsaved && (\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\">\n Unsaved changes\n </Txt>\n )}\n <div className=\"ml-auto flex shrink-0 items-center gap-3\">\n {creating && (\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" className=\"max-sm:hidden\">\n Saved in this browser\n </Txt>\n )}\n <div className=\"flex items-center gap-1\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={views.discard}>\n {creating ? 'Cancel' : 'Reset'}\n </Button>\n <Button type=\"button\" variant=\"primary\" size=\"sm\" disabled={!views.unsaved} onClick={views.save}>\n {creating ? 'Save view' : 'Save changes'}\n </Button>\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n","type SavedViewsSubscribe = (listener: () => void) => () => void;\n\nconst listenersByKey = new Map<string, Set<() => void>>();\nconst subscribeByKey = new Map<string, SavedViewsSubscribe>();\n\nexport function readSavedViewsRaw(key: string): string | null {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nexport function writeSavedViewsRaw(key: string, raw: string): boolean {\n try {\n window.localStorage.setItem(key, raw);\n } catch {\n return false;\n }\n listenersByKey.get(key)?.forEach(listener => listener());\n return true;\n}\n\nexport function savedViewsSubscriber(key: string): SavedViewsSubscribe {\n const cached = subscribeByKey.get(key);\n if (cached) return cached;\n const subscribe: SavedViewsSubscribe = listener => subscribeSavedViews(key, listener);\n subscribeByKey.set(key, subscribe);\n return subscribe;\n}\n\nfunction subscribeSavedViews(key: string, listener: () => void): () => void {\n const listeners = listenersByKey.get(key) ?? new Set<() => void>();\n listenersByKey.set(key, listeners);\n listeners.add(listener);\n const onStorage = (event: StorageEvent) => {\n if (event.key === key || event.key === null) listener();\n };\n window.addEventListener('storage', onStorage);\n return () => {\n listeners.delete(listener);\n window.removeEventListener('storage', onStorage);\n };\n}\n","import { useState, useSyncExternalStore } from 'react';\nimport { parseSavedViews, savedViewNameSchema, serializeSavedViews } from './saved-view-schema';\nimport type { SavedView, SavedViewSettingsSchema } from './saved-view-schema';\nimport { readSavedViewsRaw, savedViewsSubscriber, writeSavedViewsRaw } from './saved-views-storage';\nimport type { FilterBarItem } from '@/ds/components/FilterBar/types';\n\nconst NEW_SAVED_VIEW_NAME = 'Untitled view';\n\nexport type SavedViewContent<TSettings> = {\n filters: FilterBarItem[];\n settings: TSettings;\n};\n\nexport type SavedViewDraft<TSettings> = SavedViewContent<TSettings> & {\n viewId?: string;\n name: string;\n};\n\nexport type SavedViewDraftChange<TSettings> = Partial<Omit<SavedViewDraft<TSettings>, 'viewId'>>;\n\nexport type UseSavedViewsOptions<TSettings> = {\n storageKey: string;\n settingsSchema: SavedViewSettingsSchema<TSettings>;\n activeViewId: string | undefined;\n onActiveViewChange: (viewId: string | undefined) => void;\n};\n\nexport type SavedViewsController<TSettings> = {\n views: SavedView<TSettings>[];\n activeView: SavedView<TSettings> | undefined;\n draft: SavedViewDraft<TSettings> | undefined;\n unsaved: boolean;\n storageError: string | undefined;\n applied: SavedViewContent<TSettings> | undefined;\n select: (viewId: string | undefined) => void;\n create: (settings: TSettings, filters?: FilterBarItem[]) => void;\n edit: (viewId: string) => void;\n change: (patch: SavedViewDraftChange<TSettings>) => void;\n save: () => void;\n discard: () => void;\n rename: (viewId: string, name: string) => void;\n duplicate: (viewId: string) => void;\n remove: (viewId: string) => void;\n};\n\nfunction createSavedViewId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n return `view-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nfunction validViewName(name: string): string | undefined {\n const parsed = savedViewNameSchema.safeParse(name);\n return parsed.success ? parsed.data : undefined;\n}\n\nfunction sameViewContent<TSettings>(draft: SavedViewDraft<TSettings>, view: SavedView<TSettings>): boolean {\n return (\n JSON.stringify([draft.name, draft.filters, draft.settings]) ===\n JSON.stringify([view.name, view.filters, view.settings])\n );\n}\n\nexport function useSavedViews<TSettings>({\n storageKey,\n settingsSchema,\n activeViewId,\n onActiveViewChange,\n}: UseSavedViewsOptions<TSettings>): SavedViewsController<TSettings> {\n const raw = useSyncExternalStore(\n savedViewsSubscriber(storageKey),\n () => readSavedViewsRaw(storageKey),\n () => null,\n );\n const views = parseSavedViews(raw, settingsSchema);\n const [failedStorageKey, setFailedStorageKey] = useState<string>();\n const [pendingDraft, setDraft] = useState<SavedViewDraft<TSettings>>();\n const [draftScope, setDraftScope] = useState({ storageKey, activeViewId });\n const draftView = views.find(view => view.id === pendingDraft?.viewId);\n const draftViewDeleted = pendingDraft?.viewId !== undefined && !draftView;\n const storageKeyChanged = draftScope.storageKey !== storageKey;\n if (storageKeyChanged || draftScope.activeViewId !== activeViewId || draftViewDeleted) {\n setDraftScope({ storageKey, activeViewId });\n if (storageKeyChanged || draftViewDeleted || pendingDraft?.viewId !== activeViewId) setDraft(undefined);\n }\n const draft = pendingDraft?.viewId === undefined || pendingDraft.viewId === activeViewId ? pendingDraft : undefined;\n const unsaved = draft !== undefined && (!draftView || !sameViewContent(draft, draftView));\n\n const activeView = views.find(view => view.id === activeViewId);\n const write = (next: SavedView<TSettings>[]) => {\n const saved = writeSavedViewsRaw(storageKey, serializeSavedViews(next));\n setFailedStorageKey(saved ? undefined : storageKey);\n return saved;\n };\n\n return {\n views,\n activeView,\n draft,\n unsaved,\n storageError:\n failedStorageKey === storageKey\n ? 'Could not save changes. Check your browser storage settings and try again.'\n : undefined,\n applied: draft ?? activeView,\n select: viewId => {\n setFailedStorageKey(undefined);\n setDraft(undefined);\n onActiveViewChange(viewId);\n },\n create: (settings, filters = []) => setDraft({ name: NEW_SAVED_VIEW_NAME, filters, settings }),\n edit: viewId => {\n if (draft?.viewId === viewId) return;\n const view = views.find(candidate => candidate.id === viewId);\n if (!view) return;\n const { id, ...content } = view;\n setDraft({ ...content, viewId: id });\n if (viewId !== activeViewId) onActiveViewChange(viewId);\n },\n change: patch => {\n if (draft) {\n setDraft({ ...draft, ...patch });\n return;\n }\n if (!activeView) return;\n const { id, ...content } = activeView;\n setDraft({ ...content, ...patch, viewId: id });\n },\n save: () => {\n if (!draft) return;\n const { viewId, ...content } = draft;\n const saved: SavedView<TSettings> = {\n ...content,\n id: viewId ?? createSavedViewId(),\n name: validViewName(content.name) ?? views.find(view => view.id === viewId)?.name ?? NEW_SAVED_VIEW_NAME,\n };\n if (!write(viewId ? views.map(view => (view.id === viewId ? saved : view)) : [...views, saved])) return;\n setDraft(undefined);\n if (saved.id !== activeViewId) onActiveViewChange(saved.id);\n },\n discard: () => {\n setFailedStorageKey(undefined);\n setDraft(undefined);\n },\n rename: (viewId, name) => {\n const nextName = validViewName(name);\n if (!nextName) return;\n if (!write(views.map(view => (view.id === viewId ? { ...view, name: nextName } : view)))) return;\n if (draft?.viewId === viewId) setDraft({ ...draft, name: nextName });\n },\n duplicate: viewId => {\n const index = views.findIndex(view => view.id === viewId);\n const original = views[index];\n if (!original) return;\n const copy: SavedView<TSettings> = {\n ...original,\n id: createSavedViewId(),\n name: validViewName(`${original.name} copy`) ?? original.name,\n };\n if (!write(views.toSpliced(index + 1, 0, copy))) return;\n setDraft(undefined);\n onActiveViewChange(copy.id);\n },\n remove: viewId => {\n if (!write(views.filter(view => view.id !== viewId))) return;\n if (draft?.viewId === viewId) setDraft(undefined);\n if (activeViewId === viewId) onActiveViewChange(undefined);\n },\n };\n}\n"],"names":["Fragment"],"mappings":"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"}
@@ -9,6 +9,12 @@ function FluidHoverHighlight({ hover, className }) {
9
9
  const { activeIndex, itemRects, isMeasured } = hover;
10
10
  const rect = isMeasured && activeIndex !== null ? itemRects[activeIndex] : void 0;
11
11
  if (!rect) return null;
12
+ const style = {
13
+ translate: `${rect.left}px ${rect.top}px`,
14
+ width: rect.width,
15
+ height: rect.height,
16
+ "--fluid-hover-item-radius": rect.radius
17
+ };
12
18
  return /* @__PURE__ */ jsxRuntime.jsx(
13
19
  "div",
14
20
  {
@@ -17,7 +23,7 @@ function FluidHoverHighlight({ hover, className }) {
17
23
  "pointer-events-none absolute top-0 left-0 bg-fill-hover transition-[translate,width,height,opacity] duration-100 ease-out-custom motion-reduce:transition-opacity starting:opacity-0",
18
24
  className
19
25
  ),
20
- style: { translate: `${rect.left}px ${rect.top}px`, width: rect.width, height: rect.height }
26
+ style
21
27
  }
22
28
  );
23
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fluid-hover-highlight.cjs.js","sources":["../../src/components/fluid-hover-highlight.tsx"],"sourcesContent":["'use client';\n\nimport type { UseFluidHoverReturn } from '@/hooks/use-fluid-hover';\nimport { cn } from '@/lib/utils';\n\nexport type FluidHoverHighlightProps = {\n hover: Pick<UseFluidHoverReturn, 'activeIndex' | 'itemRects' | 'isMeasured'>;\n className?: string;\n};\n\nexport function FluidHoverHighlight({ hover, className }: FluidHoverHighlightProps) {\n const { activeIndex, itemRects, isMeasured } = hover;\n const rect = isMeasured && activeIndex !== null ? itemRects[activeIndex] : undefined;\n if (!rect) return null;\n\n return (\n <div\n data-slot=\"fluid-hover-highlight\"\n className={cn(\n 'pointer-events-none absolute top-0 left-0 bg-fill-hover transition-[translate,width,height,opacity] duration-100 ease-out-custom motion-reduce:transition-opacity starting:opacity-0',\n className,\n )}\n style={{ translate: `${rect.left}px ${rect.top}px`, width: rect.width, height: rect.height }}\n />\n );\n}\n"],"names":["jsx","cn"],"mappings":";;;;;;;AAUO,SAAS,mBAAA,CAAoB,EAAE,KAAA,EAAO,SAAA,EAAU,EAA6B;AAClF,EAAA,MAAM,EAAE,WAAA,EAAa,SAAA,EAAW,UAAA,EAAW,GAAI,KAAA;AAC/C,EAAA,MAAM,OAAO,UAAA,IAAc,WAAA,KAAgB,IAAA,GAAO,SAAA,CAAU,WAAW,CAAA,GAAI,MAAA;AAC3E,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,SAAA,EAAWC,WAAA;AAAA,QACT,sLAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAG,KAAK,IAAI,CAAA,GAAA,EAAM,IAAA,CAAK,GAAG,MAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA;AAAO;AAAA,GAC7F;AAEJ;;;;"}
1
+ {"version":3,"file":"fluid-hover-highlight.cjs.js","sources":["../../src/components/fluid-hover-highlight.tsx"],"sourcesContent":["'use client';\n\nimport type { CSSProperties } from 'react';\nimport type { UseFluidHoverReturn } from '@/hooks/use-fluid-hover';\nimport { cn } from '@/lib/utils';\n\nexport type FluidHoverHighlightProps = {\n hover: Pick<UseFluidHoverReturn, 'activeIndex' | 'itemRects' | 'isMeasured'>;\n className?: string;\n};\n\ntype HighlightStyle = CSSProperties & { '--fluid-hover-item-radius': string };\n\nexport function FluidHoverHighlight({ hover, className }: FluidHoverHighlightProps) {\n const { activeIndex, itemRects, isMeasured } = hover;\n const rect = isMeasured && activeIndex !== null ? itemRects[activeIndex] : undefined;\n if (!rect) return null;\n\n const style: HighlightStyle = {\n translate: `${rect.left}px ${rect.top}px`,\n width: rect.width,\n height: rect.height,\n '--fluid-hover-item-radius': rect.radius,\n };\n\n return (\n <div\n data-slot=\"fluid-hover-highlight\"\n className={cn(\n 'pointer-events-none absolute top-0 left-0 bg-fill-hover transition-[translate,width,height,opacity] duration-100 ease-out-custom motion-reduce:transition-opacity starting:opacity-0',\n className,\n )}\n style={style}\n />\n );\n}\n"],"names":["jsx","cn"],"mappings":";;;;;;;AAaO,SAAS,mBAAA,CAAoB,EAAE,KAAA,EAAO,SAAA,EAAU,EAA6B;AAClF,EAAA,MAAM,EAAE,WAAA,EAAa,SAAA,EAAW,UAAA,EAAW,GAAI,KAAA;AAC/C,EAAA,MAAM,OAAO,UAAA,IAAc,WAAA,KAAgB,IAAA,GAAO,SAAA,CAAU,WAAW,CAAA,GAAI,MAAA;AAC3E,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,KAAA,GAAwB;AAAA,IAC5B,WAAW,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,GAAA,EAAM,KAAK,GAAG,CAAA,EAAA,CAAA;AAAA,IACrC,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,6BAA6B,IAAA,CAAK;AAAA,GACpC;AAEA,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,SAAA,EAAWC,WAAA;AAAA,QACT,sLAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;;;;"}
@@ -5,6 +5,12 @@ function FluidHoverHighlight({ hover, className }) {
5
5
  const { activeIndex, itemRects, isMeasured } = hover;
6
6
  const rect = isMeasured && activeIndex !== null ? itemRects[activeIndex] : void 0;
7
7
  if (!rect) return null;
8
+ const style = {
9
+ translate: `${rect.left}px ${rect.top}px`,
10
+ width: rect.width,
11
+ height: rect.height,
12
+ "--fluid-hover-item-radius": rect.radius
13
+ };
8
14
  return /* @__PURE__ */ jsx(
9
15
  "div",
10
16
  {
@@ -13,7 +19,7 @@ function FluidHoverHighlight({ hover, className }) {
13
19
  "pointer-events-none absolute top-0 left-0 bg-fill-hover transition-[translate,width,height,opacity] duration-100 ease-out-custom motion-reduce:transition-opacity starting:opacity-0",
14
20
  className
15
21
  ),
16
- style: { translate: `${rect.left}px ${rect.top}px`, width: rect.width, height: rect.height }
22
+ style
17
23
  }
18
24
  );
19
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fluid-hover-highlight.es.js","sources":["../../src/components/fluid-hover-highlight.tsx"],"sourcesContent":["'use client';\n\nimport type { UseFluidHoverReturn } from '@/hooks/use-fluid-hover';\nimport { cn } from '@/lib/utils';\n\nexport type FluidHoverHighlightProps = {\n hover: Pick<UseFluidHoverReturn, 'activeIndex' | 'itemRects' | 'isMeasured'>;\n className?: string;\n};\n\nexport function FluidHoverHighlight({ hover, className }: FluidHoverHighlightProps) {\n const { activeIndex, itemRects, isMeasured } = hover;\n const rect = isMeasured && activeIndex !== null ? itemRects[activeIndex] : undefined;\n if (!rect) return null;\n\n return (\n <div\n data-slot=\"fluid-hover-highlight\"\n className={cn(\n 'pointer-events-none absolute top-0 left-0 bg-fill-hover transition-[translate,width,height,opacity] duration-100 ease-out-custom motion-reduce:transition-opacity starting:opacity-0',\n className,\n )}\n style={{ translate: `${rect.left}px ${rect.top}px`, width: rect.width, height: rect.height }}\n />\n );\n}\n"],"names":[],"mappings":";;;AAUO,SAAS,mBAAA,CAAoB,EAAE,KAAA,EAAO,SAAA,EAAU,EAA6B;AAClF,EAAA,MAAM,EAAE,WAAA,EAAa,SAAA,EAAW,UAAA,EAAW,GAAI,KAAA;AAC/C,EAAA,MAAM,OAAO,UAAA,IAAc,WAAA,KAAgB,IAAA,GAAO,SAAA,CAAU,WAAW,CAAA,GAAI,MAAA;AAC3E,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,sLAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAG,KAAK,IAAI,CAAA,GAAA,EAAM,IAAA,CAAK,GAAG,MAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA;AAAO;AAAA,GAC7F;AAEJ;;;;"}
1
+ {"version":3,"file":"fluid-hover-highlight.es.js","sources":["../../src/components/fluid-hover-highlight.tsx"],"sourcesContent":["'use client';\n\nimport type { CSSProperties } from 'react';\nimport type { UseFluidHoverReturn } from '@/hooks/use-fluid-hover';\nimport { cn } from '@/lib/utils';\n\nexport type FluidHoverHighlightProps = {\n hover: Pick<UseFluidHoverReturn, 'activeIndex' | 'itemRects' | 'isMeasured'>;\n className?: string;\n};\n\ntype HighlightStyle = CSSProperties & { '--fluid-hover-item-radius': string };\n\nexport function FluidHoverHighlight({ hover, className }: FluidHoverHighlightProps) {\n const { activeIndex, itemRects, isMeasured } = hover;\n const rect = isMeasured && activeIndex !== null ? itemRects[activeIndex] : undefined;\n if (!rect) return null;\n\n const style: HighlightStyle = {\n translate: `${rect.left}px ${rect.top}px`,\n width: rect.width,\n height: rect.height,\n '--fluid-hover-item-radius': rect.radius,\n };\n\n return (\n <div\n data-slot=\"fluid-hover-highlight\"\n className={cn(\n 'pointer-events-none absolute top-0 left-0 bg-fill-hover transition-[translate,width,height,opacity] duration-100 ease-out-custom motion-reduce:transition-opacity starting:opacity-0',\n className,\n )}\n style={style}\n />\n );\n}\n"],"names":[],"mappings":";;;AAaO,SAAS,mBAAA,CAAoB,EAAE,KAAA,EAAO,SAAA,EAAU,EAA6B;AAClF,EAAA,MAAM,EAAE,WAAA,EAAa,SAAA,EAAW,UAAA,EAAW,GAAI,KAAA;AAC/C,EAAA,MAAM,OAAO,UAAA,IAAc,WAAA,KAAgB,IAAA,GAAO,SAAA,CAAU,WAAW,CAAA,GAAI,MAAA;AAC3E,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,KAAA,GAAwB;AAAA,IAC5B,WAAW,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,GAAA,EAAM,KAAK,GAAG,CAAA,EAAA,CAAA;AAAA,IACrC,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,6BAA6B,IAAA,CAAK;AAAA,GACpC;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,sLAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;;;;"}
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- const dataListTop = require('./data-list-top-ByT2Mo77.cjs');
3
+ const dataListTop = require('./data-list-top-DJh08vFA.cjs');
4
4
  const jsxRuntime = require('react/jsx-runtime');
5
5
  const React = require('react');
6
6
  const hooks_useFluidHover = require('./hooks/use-fluid-hover.cjs.js');
7
7
  const utils_cn = require('./cn-DlOJCxrS.cjs');
8
- const dataListSpacer = require('./data-list-spacer-tQaBaum4.cjs');
8
+ const dataListSpacer = require('./data-list-spacer-CdlT6bDd.cjs');
9
9
  const lucideReact = require('lucide-react');
10
10
  const Button = require('./Button-DH1aTzbs.cjs');
11
11
  const Txt = require('./Txt-CIS2G5Jx.cjs');
@@ -139,4 +139,4 @@ const DataList = Object.assign(dataListTop.DataListRoot, {
139
139
  exports.DataList = DataList;
140
140
  exports.DataListSubHeading = DataListSubHeading;
141
141
  exports.DataListSubheader = DataListSubheader;
142
- //# sourceMappingURL=data-list-DUfXIhyC.cjs.map
142
+ //# sourceMappingURL=data-list-CmjTe8xE.cjs.map