@shipfox/client-triggers 14.0.0 → 14.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  $ shipfox-swc
2
- Successfully compiled: 18 files with swc (321.68ms)
2
+ Successfully compiled: 18 files with swc (314.63ms)
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @shipfox/client-triggers
2
2
 
3
+ ## 14.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 6aa6c7a: Migrates the integrations, triggers, runners, and projects client surfaces to semantic spacing roles and enables `no-raw-spacing` for them. Adds the `gap-x-*` and `gap-y-*` axis roles and the `-mx-inline` bleed role so grids with differing column and row rhythm, and rows that cancel their own `px-tight`, stay on the density-aware scale.
8
+ - Updated dependencies [88bf8e8]
9
+ - Updated dependencies [6aa6c7a]
10
+ - Updated dependencies [5c56ba6]
11
+ - @shipfox/react-ui@1.0.0
12
+ - @shipfox/client-shell@14.0.1
13
+ - @shipfox/client-projects@14.0.1
14
+ - @shipfox/client-ui@14.0.1
15
+ - @shipfox/integration-icons@0.3.1
16
+
3
17
  ## 14.0.0
4
18
 
5
19
  ### Patch Changes
@@ -77,7 +77,7 @@ export function EventsFilterBar({ filters, onFiltersChange, sources, events, has
77
77
  onOpenChange: setOpen,
78
78
  children: [
79
79
  /*#__PURE__*/ _jsxs("div", {
80
- className: "flex items-center justify-between gap-8 border-b border-border-neutral-base px-12 py-8",
80
+ className: "flex items-center justify-between gap-inline border-b border-border-neutral-base px-row py-row",
81
81
  children: [
82
82
  /*#__PURE__*/ _jsx(CollapsibleTrigger, {
83
83
  asChild: true,
@@ -101,7 +101,7 @@ export function EventsFilterBar({ filters, onFiltersChange, sources, events, has
101
101
  }),
102
102
  /*#__PURE__*/ _jsx(CollapsibleContent, {
103
103
  children: /*#__PURE__*/ _jsxs("div", {
104
- className: "grid grid-cols-1 gap-x-12 gap-y-10 border-b border-border-neutral-base px-12 py-12 min-[520px]:grid-cols-2",
104
+ className: "grid grid-cols-1 gap-x-cluster gap-y-inline border-b border-border-neutral-base px-row py-row min-[520px]:grid-cols-2",
105
105
  children: [
106
106
  /*#__PURE__*/ _jsx(FilterField, {
107
107
  label: "Date",
@@ -175,7 +175,7 @@ export function EventsFilterBar({ filters, onFiltersChange, sources, events, has
175
175
  }
176
176
  function FilterField({ label, className, children }) {
177
177
  return /*#__PURE__*/ _jsxs("div", {
178
- className: cn('flex min-w-0 flex-col gap-4', className),
178
+ className: cn('flex min-w-0 flex-col gap-tight', className),
179
179
  children: [
180
180
  /*#__PURE__*/ _jsx(Text, {
181
181
  size: "xs",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/events-filter-bar.tsx"],"sourcesContent":["import {Button} from '@shipfox/react-ui/button';\nimport {Collapsible, CollapsibleContent, CollapsibleTrigger} from '@shipfox/react-ui/collapsible';\nimport {Combobox, type ComboboxOption} from '@shipfox/react-ui/combobox';\nimport {type DateRange, DateRangePicker} from '@shipfox/react-ui/date-range-picker';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {type ReactNode, useState} from 'react';\nimport {\n type TriggerEventFacetItem,\n type TriggerEventFilters,\n type TriggerEventOutcome,\n type TriggerEventResultKind,\n triggerEventResultFilterOutcomes,\n} from '#core/trigger-event.js';\n\n// Filters expose the same plain-language results shown in the table. `failed`\n// includes `errored` so the Failed filter does not hide rows rendered as failed.\nconst RESULT_FILTERS: {\n value: TriggerEventResultKind;\n selects: readonly TriggerEventOutcome[];\n label: string;\n}[] = [\n {value: 'triggered', selects: triggerEventResultFilterOutcomes.triggered, label: 'Triggered'},\n {value: 'no-match', selects: triggerEventResultFilterOutcomes['no-match'], label: 'No match'},\n {value: 'failed', selects: triggerEventResultFilterOutcomes.failed, label: 'Failed'},\n {value: 'evaluating', selects: triggerEventResultFilterOutcomes.evaluating, label: 'Evaluating'},\n];\n\nconst RESULT_OPTIONS: ComboboxOption[] = RESULT_FILTERS.map(({value, label}) => ({value, label}));\n\nfunction toOptions(facets: TriggerEventFacetItem[] | undefined): ComboboxOption[] {\n return (facets ?? []).map((facet) => ({\n value: facet.value,\n label: `${facet.value} (${facet.count})`,\n }));\n}\n\ninterface EventsFilterBarProps {\n filters: TriggerEventFilters;\n onFiltersChange: (patch: Partial<TriggerEventFilters>) => void;\n sources: TriggerEventFacetItem[] | undefined;\n events: TriggerEventFacetItem[] | undefined;\n hasActiveFilters: boolean;\n onClear: () => void;\n}\n\nexport function EventsFilterBar({\n filters,\n onFiltersChange,\n sources,\n events,\n hasActiveFilters,\n onClear,\n}: EventsFilterBarProps) {\n const [open, setOpen] = useState(false);\n\n const dateRange: DateRange | undefined =\n filters.from || filters.to\n ? {\n start: filters.from ? new Date(filters.from) : undefined,\n end: filters.to ? new Date(filters.to) : undefined,\n }\n : undefined;\n\n const selectedOutcomes = new Set(filters.outcome ?? []);\n const resultValue = RESULT_FILTERS.filter(({selects}) =>\n selects.some((outcome) => selectedOutcomes.has(outcome)),\n ).map(({value}) => value);\n\n // Count active dimensions, not selected options, so the badge stays stable as chips grow.\n const activeCount =\n (dateRange ? 1 : 0) +\n (filters.source?.length ? 1 : 0) +\n (filters.event?.length ? 1 : 0) +\n (resultValue.length > 0 ? 1 : 0);\n\n function handleResultValue(values: string[]) {\n const next = RESULT_FILTERS.filter(({value}) => values.includes(value)).flatMap(\n ({selects}) => selects,\n );\n onFiltersChange({outcome: next.length > 0 ? next : undefined});\n }\n\n function handleDateRange(range: DateRange | undefined) {\n const from = range?.start ? new Date(range.start).toISOString() : undefined;\n let to: string | undefined;\n if (range?.end) {\n // The backend filters received_at <= to; extend to end-of-day so the picked end\n // date is inclusive rather than cutting off at its midnight.\n const end = new Date(range.end);\n end.setHours(23, 59, 59, 999);\n to = end.toISOString();\n }\n onFiltersChange({from, to});\n }\n\n return (\n <Collapsible open={open} onOpenChange={setOpen}>\n <div className=\"flex items-center justify-between gap-8 border-b border-border-neutral-base px-12 py-8\">\n <CollapsibleTrigger asChild>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n iconLeft=\"filter3Line\"\n iconRight={open ? 'arrowUpSLine' : 'arrowDownSLine'}\n >\n {activeCount > 0 ? `Filters (${activeCount})` : 'Filters'}\n </Button>\n </CollapsibleTrigger>\n {hasActiveFilters ? (\n <Button type=\"button\" size=\"2xs\" variant=\"transparentMuted\" onClick={onClear}>\n Clear filters\n </Button>\n ) : null}\n </div>\n <CollapsibleContent>\n <div className=\"grid grid-cols-1 gap-x-12 gap-y-10 border-b border-border-neutral-base px-12 py-12 min-[520px]:grid-cols-2\">\n <FilterField label=\"Date\" className=\"col-span-full\">\n <DateRangePicker\n size=\"small\"\n className=\"w-full\"\n {...(dateRange ? {dateRange} : {})}\n onDateRangeSelect={handleDateRange}\n onClear={() => onFiltersChange({from: undefined, to: undefined})}\n placeholder=\"Any date\"\n />\n </FilterField>\n <FilterField label=\"Result\">\n <Combobox\n multiple\n size=\"small\"\n aria-label=\"Filter by result\"\n options={RESULT_OPTIONS}\n value={resultValue}\n onValueChange={handleResultValue}\n placeholder=\"All results\"\n emptyState=\"No results\"\n className=\"w-full\"\n maxVisibleChips={2}\n />\n </FilterField>\n <FilterField label=\"Source\">\n <Combobox\n multiple\n size=\"small\"\n options={toOptions(sources)}\n value={filters.source ?? []}\n onValueChange={(value) =>\n onFiltersChange({source: value.length > 0 ? value : undefined})\n }\n placeholder=\"All sources\"\n emptyState=\"No sources yet\"\n className=\"w-full\"\n maxVisibleChips={2}\n />\n </FilterField>\n <FilterField label=\"Event\">\n <Combobox\n multiple\n size=\"small\"\n options={toOptions(events)}\n value={filters.event ?? []}\n onValueChange={(value) =>\n onFiltersChange({event: value.length > 0 ? value : undefined})\n }\n placeholder=\"All events\"\n emptyState=\"No events yet\"\n className=\"w-full\"\n maxVisibleChips={2}\n />\n </FilterField>\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nfunction FilterField({\n label,\n className,\n children,\n}: {\n label: string;\n className?: string;\n children: ReactNode;\n}) {\n return (\n <div className={cn('flex min-w-0 flex-col gap-4', className)}>\n <Text size=\"xs\" className=\"font-medium text-foreground-neutral-muted\">\n {label}\n </Text>\n {children}\n </div>\n );\n}\n"],"names":["Button","Collapsible","CollapsibleContent","CollapsibleTrigger","Combobox","DateRangePicker","Text","cn","useState","triggerEventResultFilterOutcomes","RESULT_FILTERS","value","selects","triggered","label","failed","evaluating","RESULT_OPTIONS","map","toOptions","facets","facet","count","EventsFilterBar","filters","onFiltersChange","sources","events","hasActiveFilters","onClear","open","setOpen","dateRange","from","to","start","Date","undefined","end","selectedOutcomes","Set","outcome","resultValue","filter","some","has","activeCount","source","length","event","handleResultValue","values","next","includes","flatMap","handleDateRange","range","toISOString","setHours","onOpenChange","div","className","asChild","type","variant","size","iconLeft","iconRight","onClick","FilterField","onDateRangeSelect","placeholder","multiple","aria-label","options","onValueChange","emptyState","maxVisibleChips","children"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/components/events-filter-bar.tsx"],"sourcesContent":["import {Button} from '@shipfox/react-ui/button';\nimport {Collapsible, CollapsibleContent, CollapsibleTrigger} from '@shipfox/react-ui/collapsible';\nimport {Combobox, type ComboboxOption} from '@shipfox/react-ui/combobox';\nimport {type DateRange, DateRangePicker} from '@shipfox/react-ui/date-range-picker';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {type ReactNode, useState} from 'react';\nimport {\n type TriggerEventFacetItem,\n type TriggerEventFilters,\n type TriggerEventOutcome,\n type TriggerEventResultKind,\n triggerEventResultFilterOutcomes,\n} from '#core/trigger-event.js';\n\n// Filters expose the same plain-language results shown in the table. `failed`\n// includes `errored` so the Failed filter does not hide rows rendered as failed.\nconst RESULT_FILTERS: {\n value: TriggerEventResultKind;\n selects: readonly TriggerEventOutcome[];\n label: string;\n}[] = [\n {value: 'triggered', selects: triggerEventResultFilterOutcomes.triggered, label: 'Triggered'},\n {value: 'no-match', selects: triggerEventResultFilterOutcomes['no-match'], label: 'No match'},\n {value: 'failed', selects: triggerEventResultFilterOutcomes.failed, label: 'Failed'},\n {value: 'evaluating', selects: triggerEventResultFilterOutcomes.evaluating, label: 'Evaluating'},\n];\n\nconst RESULT_OPTIONS: ComboboxOption[] = RESULT_FILTERS.map(({value, label}) => ({value, label}));\n\nfunction toOptions(facets: TriggerEventFacetItem[] | undefined): ComboboxOption[] {\n return (facets ?? []).map((facet) => ({\n value: facet.value,\n label: `${facet.value} (${facet.count})`,\n }));\n}\n\ninterface EventsFilterBarProps {\n filters: TriggerEventFilters;\n onFiltersChange: (patch: Partial<TriggerEventFilters>) => void;\n sources: TriggerEventFacetItem[] | undefined;\n events: TriggerEventFacetItem[] | undefined;\n hasActiveFilters: boolean;\n onClear: () => void;\n}\n\nexport function EventsFilterBar({\n filters,\n onFiltersChange,\n sources,\n events,\n hasActiveFilters,\n onClear,\n}: EventsFilterBarProps) {\n const [open, setOpen] = useState(false);\n\n const dateRange: DateRange | undefined =\n filters.from || filters.to\n ? {\n start: filters.from ? new Date(filters.from) : undefined,\n end: filters.to ? new Date(filters.to) : undefined,\n }\n : undefined;\n\n const selectedOutcomes = new Set(filters.outcome ?? []);\n const resultValue = RESULT_FILTERS.filter(({selects}) =>\n selects.some((outcome) => selectedOutcomes.has(outcome)),\n ).map(({value}) => value);\n\n // Count active dimensions, not selected options, so the badge stays stable as chips grow.\n const activeCount =\n (dateRange ? 1 : 0) +\n (filters.source?.length ? 1 : 0) +\n (filters.event?.length ? 1 : 0) +\n (resultValue.length > 0 ? 1 : 0);\n\n function handleResultValue(values: string[]) {\n const next = RESULT_FILTERS.filter(({value}) => values.includes(value)).flatMap(\n ({selects}) => selects,\n );\n onFiltersChange({outcome: next.length > 0 ? next : undefined});\n }\n\n function handleDateRange(range: DateRange | undefined) {\n const from = range?.start ? new Date(range.start).toISOString() : undefined;\n let to: string | undefined;\n if (range?.end) {\n // The backend filters received_at <= to; extend to end-of-day so the picked end\n // date is inclusive rather than cutting off at its midnight.\n const end = new Date(range.end);\n end.setHours(23, 59, 59, 999);\n to = end.toISOString();\n }\n onFiltersChange({from, to});\n }\n\n return (\n <Collapsible open={open} onOpenChange={setOpen}>\n <div className=\"flex items-center justify-between gap-inline border-b border-border-neutral-base px-row py-row\">\n <CollapsibleTrigger asChild>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n iconLeft=\"filter3Line\"\n iconRight={open ? 'arrowUpSLine' : 'arrowDownSLine'}\n >\n {activeCount > 0 ? `Filters (${activeCount})` : 'Filters'}\n </Button>\n </CollapsibleTrigger>\n {hasActiveFilters ? (\n <Button type=\"button\" size=\"2xs\" variant=\"transparentMuted\" onClick={onClear}>\n Clear filters\n </Button>\n ) : null}\n </div>\n <CollapsibleContent>\n <div className=\"grid grid-cols-1 gap-x-cluster gap-y-inline border-b border-border-neutral-base px-row py-row min-[520px]:grid-cols-2\">\n <FilterField label=\"Date\" className=\"col-span-full\">\n <DateRangePicker\n size=\"small\"\n className=\"w-full\"\n {...(dateRange ? {dateRange} : {})}\n onDateRangeSelect={handleDateRange}\n onClear={() => onFiltersChange({from: undefined, to: undefined})}\n placeholder=\"Any date\"\n />\n </FilterField>\n <FilterField label=\"Result\">\n <Combobox\n multiple\n size=\"small\"\n aria-label=\"Filter by result\"\n options={RESULT_OPTIONS}\n value={resultValue}\n onValueChange={handleResultValue}\n placeholder=\"All results\"\n emptyState=\"No results\"\n className=\"w-full\"\n maxVisibleChips={2}\n />\n </FilterField>\n <FilterField label=\"Source\">\n <Combobox\n multiple\n size=\"small\"\n options={toOptions(sources)}\n value={filters.source ?? []}\n onValueChange={(value) =>\n onFiltersChange({source: value.length > 0 ? value : undefined})\n }\n placeholder=\"All sources\"\n emptyState=\"No sources yet\"\n className=\"w-full\"\n maxVisibleChips={2}\n />\n </FilterField>\n <FilterField label=\"Event\">\n <Combobox\n multiple\n size=\"small\"\n options={toOptions(events)}\n value={filters.event ?? []}\n onValueChange={(value) =>\n onFiltersChange({event: value.length > 0 ? value : undefined})\n }\n placeholder=\"All events\"\n emptyState=\"No events yet\"\n className=\"w-full\"\n maxVisibleChips={2}\n />\n </FilterField>\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nfunction FilterField({\n label,\n className,\n children,\n}: {\n label: string;\n className?: string;\n children: ReactNode;\n}) {\n return (\n <div className={cn('flex min-w-0 flex-col gap-tight', className)}>\n <Text size=\"xs\" className=\"font-medium text-foreground-neutral-muted\">\n {label}\n </Text>\n {children}\n </div>\n );\n}\n"],"names":["Button","Collapsible","CollapsibleContent","CollapsibleTrigger","Combobox","DateRangePicker","Text","cn","useState","triggerEventResultFilterOutcomes","RESULT_FILTERS","value","selects","triggered","label","failed","evaluating","RESULT_OPTIONS","map","toOptions","facets","facet","count","EventsFilterBar","filters","onFiltersChange","sources","events","hasActiveFilters","onClear","open","setOpen","dateRange","from","to","start","Date","undefined","end","selectedOutcomes","Set","outcome","resultValue","filter","some","has","activeCount","source","length","event","handleResultValue","values","next","includes","flatMap","handleDateRange","range","toISOString","setHours","onOpenChange","div","className","asChild","type","variant","size","iconLeft","iconRight","onClick","FilterField","onDateRangeSelect","placeholder","multiple","aria-label","options","onValueChange","emptyState","maxVisibleChips","children"],"mappings":"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"}
@@ -7,13 +7,13 @@ import { Text } from '@shipfox/react-ui/typography';
7
7
  import { Link } from '@tanstack/react-router';
8
8
  export function EventsListSkeleton() {
9
9
  return /*#__PURE__*/ _jsx("div", {
10
- className: "flex flex-col gap-8 p-8",
10
+ className: "flex flex-col gap-inline p-tight",
11
11
  role: "status",
12
12
  "aria-label": "Loading events",
13
13
  children: Array.from({
14
14
  length: 8
15
15
  }).map((_, index)=>/*#__PURE__*/ _jsxs("div", {
16
- className: "flex h-20 items-center gap-12",
16
+ className: "flex h-20 items-center gap-cluster",
17
17
  children: [
18
18
  /*#__PURE__*/ _jsx(Skeleton, {
19
19
  className: "size-6 shrink-0 rounded-full"
@@ -33,7 +33,7 @@ export function EventsListSkeleton() {
33
33
  }
34
34
  export function EventsListEmpty({ workspaceSlug }) {
35
35
  return /*#__PURE__*/ _jsx("div", {
36
- className: "p-16",
36
+ className: "p-panel-compact",
37
37
  children: /*#__PURE__*/ _jsx(EmptyState, {
38
38
  icon: "pulseLine",
39
39
  title: "No events yet",
@@ -55,7 +55,7 @@ export function EventsListEmpty({ workspaceSlug }) {
55
55
  }
56
56
  export function EventsListNoMatches({ onClear }) {
57
57
  return /*#__PURE__*/ _jsx("div", {
58
- className: "p-16",
58
+ className: "p-panel-compact",
59
59
  children: /*#__PURE__*/ _jsx(EmptyState, {
60
60
  icon: "filterOffLine",
61
61
  title: "No matching events",
@@ -75,12 +75,12 @@ export function EventsListNoMatches({ onClear }) {
75
75
  * rows stay on screen with the retry inline rather than being wiped by a full placeholder.
76
76
  */ export function EventsListStaleError({ query }) {
77
77
  return /*#__PURE__*/ _jsx("div", {
78
- className: "p-8",
78
+ className: "p-tight",
79
79
  children: /*#__PURE__*/ _jsx(Callout, {
80
80
  role: "alert",
81
81
  type: "error",
82
82
  children: /*#__PURE__*/ _jsxs("div", {
83
- className: "flex items-center justify-between gap-8",
83
+ className: "flex items-center justify-between gap-inline",
84
84
  children: [
85
85
  /*#__PURE__*/ _jsx(Text, {
86
86
  size: "xs",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/events-list-states.tsx"],"sourcesContent":["import type {QueryLoadErrorQuery} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {Link} from '@tanstack/react-router';\n\nexport function EventsListSkeleton() {\n return (\n <div className=\"flex flex-col gap-8 p-8\" role=\"status\" aria-label=\"Loading events\">\n {Array.from({length: 8}).map((_, index) => (\n <div\n // biome-ignore lint/suspicious/noArrayIndexKey: skeleton row, stable position\n key={index}\n className=\"flex h-20 items-center gap-12\"\n >\n <Skeleton className=\"size-6 shrink-0 rounded-full\" />\n <Skeleton className=\"h-12 w-1/4\" />\n <Skeleton className=\"h-12 w-20\" />\n <Skeleton className=\"ml-auto h-12 w-40\" />\n </div>\n ))}\n </div>\n );\n}\n\nexport function EventsListEmpty({workspaceSlug}: {workspaceSlug?: string | undefined}) {\n return (\n <div className=\"p-16\">\n <EmptyState\n icon=\"pulseLine\"\n title=\"No events yet\"\n description=\"Events appear here once a connected integration delivers one or you fire a trigger.\"\n action={\n workspaceSlug ? (\n <Button asChild size=\"sm\" variant=\"secondary\">\n <Link to=\"/w/$workspaceSlug/settings/integrations\" params={{workspaceSlug}}>\n Configure integrations\n </Link>\n </Button>\n ) : undefined\n }\n />\n </div>\n );\n}\n\nexport function EventsListNoMatches({onClear}: {onClear: () => void}) {\n return (\n <div className=\"p-16\">\n <EmptyState\n icon=\"filterOffLine\"\n title=\"No matching events\"\n description=\"No events match your current filters.\"\n action={\n <Button type=\"button\" size=\"sm\" variant=\"secondary\" onClick={onClear}>\n Clear filters\n </Button>\n }\n />\n </div>\n );\n}\n\n/**\n * Slim banner shown when a background refetch fails after a prior success, so the loaded\n * rows stay on screen with the retry inline rather than being wiped by a full placeholder.\n */\nexport function EventsListStaleError({query}: {query: QueryLoadErrorQuery}) {\n return (\n <div className=\"p-8\">\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex items-center justify-between gap-8\">\n <Text size=\"xs\">Could not refresh events.</Text>\n <Button\n type=\"button\"\n size=\"2xs\"\n variant=\"secondary\"\n isLoading={query.isFetching}\n onClick={() => {\n void query.refetch();\n }}\n >\n Retry\n </Button>\n </div>\n </Callout>\n </div>\n );\n}\n"],"names":["Button","Callout","EmptyState","Skeleton","Text","Link","EventsListSkeleton","div","className","role","aria-label","Array","from","length","map","_","index","EventsListEmpty","workspaceSlug","icon","title","description","action","asChild","size","variant","to","params","undefined","EventsListNoMatches","onClear","type","onClick","EventsListStaleError","query","isLoading","isFetching","refetch"],"mappings":";AACA,SAAQA,MAAM,QAAO,2BAA2B;AAChD,SAAQC,OAAO,QAAO,4BAA4B;AAClD,SAAQC,UAAU,QAAO,gCAAgC;AACzD,SAAQC,QAAQ,QAAO,6BAA6B;AACpD,SAAQC,IAAI,QAAO,+BAA+B;AAClD,SAAQC,IAAI,QAAO,yBAAyB;AAE5C,OAAO,SAASC;IACd,qBACE,KAACC;QAAIC,WAAU;QAA0BC,MAAK;QAASC,cAAW;kBAC/DC,MAAMC,IAAI,CAAC;YAACC,QAAQ;QAAC,GAAGC,GAAG,CAAC,CAACC,GAAGC,sBAC/B,MAACT;gBAGCC,WAAU;;kCAEV,KAACL;wBAASK,WAAU;;kCACpB,KAACL;wBAASK,WAAU;;kCACpB,KAACL;wBAASK,WAAU;;kCACpB,KAACL;wBAASK,WAAU;;;eANfQ;;AAWf;AAEA,OAAO,SAASC,gBAAgB,EAACC,aAAa,EAAuC;IACnF,qBACE,KAACX;QAAIC,WAAU;kBACb,cAAA,KAACN;YACCiB,MAAK;YACLC,OAAM;YACNC,aAAY;YACZC,QACEJ,8BACE,KAAClB;gBAAOuB,OAAO;gBAACC,MAAK;gBAAKC,SAAQ;0BAChC,cAAA,KAACpB;oBAAKqB,IAAG;oBAA0CC,QAAQ;wBAACT;oBAAa;8BAAG;;iBAI5EU;;;AAKd;AAEA,OAAO,SAASC,oBAAoB,EAACC,OAAO,EAAwB;IAClE,qBACE,KAACvB;QAAIC,WAAU;kBACb,cAAA,KAACN;YACCiB,MAAK;YACLC,OAAM;YACNC,aAAY;YACZC,sBACE,KAACtB;gBAAO+B,MAAK;gBAASP,MAAK;gBAAKC,SAAQ;gBAAYO,SAASF;0BAAS;;;;AAOhF;AAEA;;;CAGC,GACD,OAAO,SAASG,qBAAqB,EAACC,KAAK,EAA+B;IACxE,qBACE,KAAC3B;QAAIC,WAAU;kBACb,cAAA,KAACP;YAAQQ,MAAK;YAAQsB,MAAK;sBACzB,cAAA,MAACxB;gBAAIC,WAAU;;kCACb,KAACJ;wBAAKoB,MAAK;kCAAK;;kCAChB,KAACxB;wBACC+B,MAAK;wBACLP,MAAK;wBACLC,SAAQ;wBACRU,WAAWD,MAAME,UAAU;wBAC3BJ,SAAS;4BACP,KAAKE,MAAMG,OAAO;wBACpB;kCACD;;;;;;AAOX"}
1
+ {"version":3,"sources":["../../src/components/events-list-states.tsx"],"sourcesContent":["import type {QueryLoadErrorQuery} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {Link} from '@tanstack/react-router';\n\nexport function EventsListSkeleton() {\n return (\n <div className=\"flex flex-col gap-inline p-tight\" role=\"status\" aria-label=\"Loading events\">\n {Array.from({length: 8}).map((_, index) => (\n <div\n // biome-ignore lint/suspicious/noArrayIndexKey: skeleton row, stable position\n key={index}\n className=\"flex h-20 items-center gap-cluster\"\n >\n <Skeleton className=\"size-6 shrink-0 rounded-full\" />\n <Skeleton className=\"h-12 w-1/4\" />\n <Skeleton className=\"h-12 w-20\" />\n <Skeleton className=\"ml-auto h-12 w-40\" />\n </div>\n ))}\n </div>\n );\n}\n\nexport function EventsListEmpty({workspaceSlug}: {workspaceSlug?: string | undefined}) {\n return (\n <div className=\"p-panel-compact\">\n <EmptyState\n icon=\"pulseLine\"\n title=\"No events yet\"\n description=\"Events appear here once a connected integration delivers one or you fire a trigger.\"\n action={\n workspaceSlug ? (\n <Button asChild size=\"sm\" variant=\"secondary\">\n <Link to=\"/w/$workspaceSlug/settings/integrations\" params={{workspaceSlug}}>\n Configure integrations\n </Link>\n </Button>\n ) : undefined\n }\n />\n </div>\n );\n}\n\nexport function EventsListNoMatches({onClear}: {onClear: () => void}) {\n return (\n <div className=\"p-panel-compact\">\n <EmptyState\n icon=\"filterOffLine\"\n title=\"No matching events\"\n description=\"No events match your current filters.\"\n action={\n <Button type=\"button\" size=\"sm\" variant=\"secondary\" onClick={onClear}>\n Clear filters\n </Button>\n }\n />\n </div>\n );\n}\n\n/**\n * Slim banner shown when a background refetch fails after a prior success, so the loaded\n * rows stay on screen with the retry inline rather than being wiped by a full placeholder.\n */\nexport function EventsListStaleError({query}: {query: QueryLoadErrorQuery}) {\n return (\n <div className=\"p-tight\">\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex items-center justify-between gap-inline\">\n <Text size=\"xs\">Could not refresh events.</Text>\n <Button\n type=\"button\"\n size=\"2xs\"\n variant=\"secondary\"\n isLoading={query.isFetching}\n onClick={() => {\n void query.refetch();\n }}\n >\n Retry\n </Button>\n </div>\n </Callout>\n </div>\n );\n}\n"],"names":["Button","Callout","EmptyState","Skeleton","Text","Link","EventsListSkeleton","div","className","role","aria-label","Array","from","length","map","_","index","EventsListEmpty","workspaceSlug","icon","title","description","action","asChild","size","variant","to","params","undefined","EventsListNoMatches","onClear","type","onClick","EventsListStaleError","query","isLoading","isFetching","refetch"],"mappings":";AACA,SAAQA,MAAM,QAAO,2BAA2B;AAChD,SAAQC,OAAO,QAAO,4BAA4B;AAClD,SAAQC,UAAU,QAAO,gCAAgC;AACzD,SAAQC,QAAQ,QAAO,6BAA6B;AACpD,SAAQC,IAAI,QAAO,+BAA+B;AAClD,SAAQC,IAAI,QAAO,yBAAyB;AAE5C,OAAO,SAASC;IACd,qBACE,KAACC;QAAIC,WAAU;QAAmCC,MAAK;QAASC,cAAW;kBACxEC,MAAMC,IAAI,CAAC;YAACC,QAAQ;QAAC,GAAGC,GAAG,CAAC,CAACC,GAAGC,sBAC/B,MAACT;gBAGCC,WAAU;;kCAEV,KAACL;wBAASK,WAAU;;kCACpB,KAACL;wBAASK,WAAU;;kCACpB,KAACL;wBAASK,WAAU;;kCACpB,KAACL;wBAASK,WAAU;;;eANfQ;;AAWf;AAEA,OAAO,SAASC,gBAAgB,EAACC,aAAa,EAAuC;IACnF,qBACE,KAACX;QAAIC,WAAU;kBACb,cAAA,KAACN;YACCiB,MAAK;YACLC,OAAM;YACNC,aAAY;YACZC,QACEJ,8BACE,KAAClB;gBAAOuB,OAAO;gBAACC,MAAK;gBAAKC,SAAQ;0BAChC,cAAA,KAACpB;oBAAKqB,IAAG;oBAA0CC,QAAQ;wBAACT;oBAAa;8BAAG;;iBAI5EU;;;AAKd;AAEA,OAAO,SAASC,oBAAoB,EAACC,OAAO,EAAwB;IAClE,qBACE,KAACvB;QAAIC,WAAU;kBACb,cAAA,KAACN;YACCiB,MAAK;YACLC,OAAM;YACNC,aAAY;YACZC,sBACE,KAACtB;gBAAO+B,MAAK;gBAASP,MAAK;gBAAKC,SAAQ;gBAAYO,SAASF;0BAAS;;;;AAOhF;AAEA;;;CAGC,GACD,OAAO,SAASG,qBAAqB,EAACC,KAAK,EAA+B;IACxE,qBACE,KAAC3B;QAAIC,WAAU;kBACb,cAAA,KAACP;YAAQQ,MAAK;YAAQsB,MAAK;sBACzB,cAAA,MAACxB;gBAAIC,WAAU;;kCACb,KAACJ;wBAAKoB,MAAK;kCAAK;;kCAChB,KAACxB;wBACC+B,MAAK;wBACLP,MAAK;wBACLC,SAAQ;wBACRU,WAAWD,MAAME,UAAU;wBAC3BJ,SAAS;4BACP,KAAKE,MAAMG,OAAO;wBACpB;kCACD;;;;;;AAOX"}
@@ -76,7 +76,7 @@ export function EventsList({ events, query, facets, filters, onFiltersChange, wo
76
76
  ]
77
77
  }),
78
78
  hasNextPage ? /*#__PURE__*/ _jsx("div", {
79
- className: "flex justify-center p-16",
79
+ className: "flex justify-center p-panel-compact",
80
80
  children: /*#__PURE__*/ _jsx(Button, {
81
81
  type: "button",
82
82
  variant: "secondary",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/events-list.tsx"],"sourcesContent":["import {QueryLoadError} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Table, TableBody, TableHead, TableHeader, TableRow} from '@shipfox/react-ui/table';\nimport {hasTriggerEventFilters} from '#core/trigger-event.js';\nimport {EventsFilterBar} from './events-filter-bar.js';\nimport {\n EventsListEmpty,\n EventsListNoMatches,\n EventsListSkeleton,\n EventsListStaleError,\n} from './events-list-states.js';\nimport {TriggerEventRow} from './trigger-event-row.js';\nimport type {EventsListProps} from './types.js';\n\nexport function EventsList({\n events,\n query,\n facets,\n filters,\n onFiltersChange,\n workspaceSlug,\n hasNextPage,\n isFetchingNextPage,\n onLoadMore,\n selectedEventId,\n onSelectEvent,\n}: EventsListProps) {\n const activeFilters = hasTriggerEventFilters(filters);\n const refreshFailed = query.isError && query.data !== undefined;\n const showEmptyState = !query.isPending && !query.isError && events.length === 0;\n\n function clearFilters() {\n onFiltersChange({\n source: undefined,\n event: undefined,\n outcome: undefined,\n from: undefined,\n to: undefined,\n });\n }\n\n return (\n <div className=\"flex min-h-0 flex-col overflow-hidden rounded-8 border border-border-neutral-base bg-background-neutral-base\">\n <EventsFilterBar\n filters={filters}\n onFiltersChange={onFiltersChange}\n sources={facets?.sources}\n events={facets?.events}\n hasActiveFilters={activeFilters}\n onClear={clearFilters}\n />\n\n {query.isPending ? <EventsListSkeleton /> : null}\n {!query.isPending ? <QueryLoadError query={query} subject=\"events\" icon=\"pulseLine\" /> : null}\n {!query.isPending && refreshFailed ? <EventsListStaleError query={query} /> : null}\n {showEmptyState && !activeFilters ? <EventsListEmpty workspaceSlug={workspaceSlug} /> : null}\n {showEmptyState && activeFilters ? <EventsListNoMatches onClear={clearFilters} /> : null}\n\n {events.length > 0 ? (\n <>\n <Table>\n <TableHeader className=\"sticky top-0 z-10\">\n <TableRow>\n <TableHead>Event</TableHead>\n <TableHead>Result</TableHead>\n <TableHead className=\"text-right\">Received</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {events.map((event) => (\n <TriggerEventRow\n key={event.id}\n event={event}\n selected={event.id === selectedEventId}\n onSelect={onSelectEvent}\n />\n ))}\n </TableBody>\n </Table>\n {hasNextPage ? (\n <div className=\"flex justify-center p-16\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n isLoading={isFetchingNextPage}\n onClick={onLoadMore}\n >\n Load more\n </Button>\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n );\n}\n"],"names":["QueryLoadError","Button","Table","TableBody","TableHead","TableHeader","TableRow","hasTriggerEventFilters","EventsFilterBar","EventsListEmpty","EventsListNoMatches","EventsListSkeleton","EventsListStaleError","TriggerEventRow","EventsList","events","query","facets","filters","onFiltersChange","workspaceSlug","hasNextPage","isFetchingNextPage","onLoadMore","selectedEventId","onSelectEvent","activeFilters","refreshFailed","isError","data","undefined","showEmptyState","isPending","length","clearFilters","source","event","outcome","from","to","div","className","sources","hasActiveFilters","onClear","subject","icon","map","selected","id","onSelect","type","variant","size","isLoading","onClick"],"mappings":";AAAA,SAAQA,cAAc,QAAO,qBAAqB;AAClD,SAAQC,MAAM,QAAO,2BAA2B;AAChD,SAAQC,KAAK,EAAEC,SAAS,EAAEC,SAAS,EAAEC,WAAW,EAAEC,QAAQ,QAAO,0BAA0B;AAC3F,SAAQC,sBAAsB,QAAO,yBAAyB;AAC9D,SAAQC,eAAe,QAAO,yBAAyB;AACvD,SACEC,eAAe,EACfC,mBAAmB,EACnBC,kBAAkB,EAClBC,oBAAoB,QACf,0BAA0B;AACjC,SAAQC,eAAe,QAAO,yBAAyB;AAGvD,OAAO,SAASC,WAAW,EACzBC,MAAM,EACNC,KAAK,EACLC,MAAM,EACNC,OAAO,EACPC,eAAe,EACfC,aAAa,EACbC,WAAW,EACXC,kBAAkB,EAClBC,UAAU,EACVC,eAAe,EACfC,aAAa,EACG;IAChB,MAAMC,gBAAgBnB,uBAAuBW;IAC7C,MAAMS,gBAAgBX,MAAMY,OAAO,IAAIZ,MAAMa,IAAI,KAAKC;IACtD,MAAMC,iBAAiB,CAACf,MAAMgB,SAAS,IAAI,CAAChB,MAAMY,OAAO,IAAIb,OAAOkB,MAAM,KAAK;IAE/E,SAASC;QACPf,gBAAgB;YACdgB,QAAQL;YACRM,OAAON;YACPO,SAASP;YACTQ,MAAMR;YACNS,IAAIT;QACN;IACF;IAEA,qBACE,MAACU;QAAIC,WAAU;;0BACb,KAACjC;gBACCU,SAASA;gBACTC,iBAAiBA;gBACjBuB,SAASzB,QAAQyB;gBACjB3B,QAAQE,QAAQF;gBAChB4B,kBAAkBjB;gBAClBkB,SAASV;;YAGVlB,MAAMgB,SAAS,iBAAG,KAACrB,0BAAwB;YAC3C,CAACK,MAAMgB,SAAS,iBAAG,KAAChC;gBAAegB,OAAOA;gBAAO6B,SAAQ;gBAASC,MAAK;iBAAiB;YACxF,CAAC9B,MAAMgB,SAAS,IAAIL,8BAAgB,KAACf;gBAAqBI,OAAOA;iBAAY;YAC7Ee,kBAAkB,CAACL,8BAAgB,KAACjB;gBAAgBW,eAAeA;iBAAoB;YACvFW,kBAAkBL,8BAAgB,KAAChB;gBAAoBkC,SAASV;iBAAmB;YAEnFnB,OAAOkB,MAAM,GAAG,kBACf;;kCACE,MAAC/B;;0CACC,KAACG;gCAAYoC,WAAU;0CACrB,cAAA,MAACnC;;sDACC,KAACF;sDAAU;;sDACX,KAACA;sDAAU;;sDACX,KAACA;4CAAUqC,WAAU;sDAAa;;;;;0CAGtC,KAACtC;0CACEY,OAAOgC,GAAG,CAAC,CAACX,sBACX,KAACvB;wCAECuB,OAAOA;wCACPY,UAAUZ,MAAMa,EAAE,KAAKzB;wCACvB0B,UAAUzB;uCAHLW,MAAMa,EAAE;;;;oBAQpB5B,4BACC,KAACmB;wBAAIC,WAAU;kCACb,cAAA,KAACxC;4BACCkD,MAAK;4BACLC,SAAQ;4BACRC,MAAK;4BACLC,WAAWhC;4BACXiC,SAAShC;sCACV;;yBAID;;iBAEJ;;;AAGV"}
1
+ {"version":3,"sources":["../../src/components/events-list.tsx"],"sourcesContent":["import {QueryLoadError} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Table, TableBody, TableHead, TableHeader, TableRow} from '@shipfox/react-ui/table';\nimport {hasTriggerEventFilters} from '#core/trigger-event.js';\nimport {EventsFilterBar} from './events-filter-bar.js';\nimport {\n EventsListEmpty,\n EventsListNoMatches,\n EventsListSkeleton,\n EventsListStaleError,\n} from './events-list-states.js';\nimport {TriggerEventRow} from './trigger-event-row.js';\nimport type {EventsListProps} from './types.js';\n\nexport function EventsList({\n events,\n query,\n facets,\n filters,\n onFiltersChange,\n workspaceSlug,\n hasNextPage,\n isFetchingNextPage,\n onLoadMore,\n selectedEventId,\n onSelectEvent,\n}: EventsListProps) {\n const activeFilters = hasTriggerEventFilters(filters);\n const refreshFailed = query.isError && query.data !== undefined;\n const showEmptyState = !query.isPending && !query.isError && events.length === 0;\n\n function clearFilters() {\n onFiltersChange({\n source: undefined,\n event: undefined,\n outcome: undefined,\n from: undefined,\n to: undefined,\n });\n }\n\n return (\n <div className=\"flex min-h-0 flex-col overflow-hidden rounded-8 border border-border-neutral-base bg-background-neutral-base\">\n <EventsFilterBar\n filters={filters}\n onFiltersChange={onFiltersChange}\n sources={facets?.sources}\n events={facets?.events}\n hasActiveFilters={activeFilters}\n onClear={clearFilters}\n />\n\n {query.isPending ? <EventsListSkeleton /> : null}\n {!query.isPending ? <QueryLoadError query={query} subject=\"events\" icon=\"pulseLine\" /> : null}\n {!query.isPending && refreshFailed ? <EventsListStaleError query={query} /> : null}\n {showEmptyState && !activeFilters ? <EventsListEmpty workspaceSlug={workspaceSlug} /> : null}\n {showEmptyState && activeFilters ? <EventsListNoMatches onClear={clearFilters} /> : null}\n\n {events.length > 0 ? (\n <>\n <Table>\n <TableHeader className=\"sticky top-0 z-10\">\n <TableRow>\n <TableHead>Event</TableHead>\n <TableHead>Result</TableHead>\n <TableHead className=\"text-right\">Received</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {events.map((event) => (\n <TriggerEventRow\n key={event.id}\n event={event}\n selected={event.id === selectedEventId}\n onSelect={onSelectEvent}\n />\n ))}\n </TableBody>\n </Table>\n {hasNextPage ? (\n <div className=\"flex justify-center p-panel-compact\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n isLoading={isFetchingNextPage}\n onClick={onLoadMore}\n >\n Load more\n </Button>\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n );\n}\n"],"names":["QueryLoadError","Button","Table","TableBody","TableHead","TableHeader","TableRow","hasTriggerEventFilters","EventsFilterBar","EventsListEmpty","EventsListNoMatches","EventsListSkeleton","EventsListStaleError","TriggerEventRow","EventsList","events","query","facets","filters","onFiltersChange","workspaceSlug","hasNextPage","isFetchingNextPage","onLoadMore","selectedEventId","onSelectEvent","activeFilters","refreshFailed","isError","data","undefined","showEmptyState","isPending","length","clearFilters","source","event","outcome","from","to","div","className","sources","hasActiveFilters","onClear","subject","icon","map","selected","id","onSelect","type","variant","size","isLoading","onClick"],"mappings":";AAAA,SAAQA,cAAc,QAAO,qBAAqB;AAClD,SAAQC,MAAM,QAAO,2BAA2B;AAChD,SAAQC,KAAK,EAAEC,SAAS,EAAEC,SAAS,EAAEC,WAAW,EAAEC,QAAQ,QAAO,0BAA0B;AAC3F,SAAQC,sBAAsB,QAAO,yBAAyB;AAC9D,SAAQC,eAAe,QAAO,yBAAyB;AACvD,SACEC,eAAe,EACfC,mBAAmB,EACnBC,kBAAkB,EAClBC,oBAAoB,QACf,0BAA0B;AACjC,SAAQC,eAAe,QAAO,yBAAyB;AAGvD,OAAO,SAASC,WAAW,EACzBC,MAAM,EACNC,KAAK,EACLC,MAAM,EACNC,OAAO,EACPC,eAAe,EACfC,aAAa,EACbC,WAAW,EACXC,kBAAkB,EAClBC,UAAU,EACVC,eAAe,EACfC,aAAa,EACG;IAChB,MAAMC,gBAAgBnB,uBAAuBW;IAC7C,MAAMS,gBAAgBX,MAAMY,OAAO,IAAIZ,MAAMa,IAAI,KAAKC;IACtD,MAAMC,iBAAiB,CAACf,MAAMgB,SAAS,IAAI,CAAChB,MAAMY,OAAO,IAAIb,OAAOkB,MAAM,KAAK;IAE/E,SAASC;QACPf,gBAAgB;YACdgB,QAAQL;YACRM,OAAON;YACPO,SAASP;YACTQ,MAAMR;YACNS,IAAIT;QACN;IACF;IAEA,qBACE,MAACU;QAAIC,WAAU;;0BACb,KAACjC;gBACCU,SAASA;gBACTC,iBAAiBA;gBACjBuB,SAASzB,QAAQyB;gBACjB3B,QAAQE,QAAQF;gBAChB4B,kBAAkBjB;gBAClBkB,SAASV;;YAGVlB,MAAMgB,SAAS,iBAAG,KAACrB,0BAAwB;YAC3C,CAACK,MAAMgB,SAAS,iBAAG,KAAChC;gBAAegB,OAAOA;gBAAO6B,SAAQ;gBAASC,MAAK;iBAAiB;YACxF,CAAC9B,MAAMgB,SAAS,IAAIL,8BAAgB,KAACf;gBAAqBI,OAAOA;iBAAY;YAC7Ee,kBAAkB,CAACL,8BAAgB,KAACjB;gBAAgBW,eAAeA;iBAAoB;YACvFW,kBAAkBL,8BAAgB,KAAChB;gBAAoBkC,SAASV;iBAAmB;YAEnFnB,OAAOkB,MAAM,GAAG,kBACf;;kCACE,MAAC/B;;0CACC,KAACG;gCAAYoC,WAAU;0CACrB,cAAA,MAACnC;;sDACC,KAACF;sDAAU;;sDACX,KAACA;sDAAU;;sDACX,KAACA;4CAAUqC,WAAU;sDAAa;;;;;0CAGtC,KAACtC;0CACEY,OAAOgC,GAAG,CAAC,CAACX,sBACX,KAACvB;wCAECuB,OAAOA;wCACPY,UAAUZ,MAAMa,EAAE,KAAKzB;wCACvB0B,UAAUzB;uCAHLW,MAAMa,EAAE;;;;oBAQpB5B,4BACC,KAACmB;wBAAIC,WAAU;kCACb,cAAA,KAACxC;4BACCkD,MAAK;4BACLC,SAAQ;4BACRC,MAAK;4BACLC,WAAWhC;4BACXiC,SAAShC;sCACV;;yBAID;;iBAEJ;;;AAGV"}
@@ -49,7 +49,7 @@ export function TriggerEventDetailView({ workspaceId, workspaceSlug, event, onBa
49
49
  className: cn(PANEL_CLASS, DETAIL_RAIL_CLASS, 'flex min-h-0 flex-col overflow-hidden'),
50
50
  children: [
51
51
  /*#__PURE__*/ _jsxs("div", {
52
- className: "flex shrink-0 flex-col gap-12 border-b border-border-neutral-base p-16",
52
+ className: "flex shrink-0 flex-col gap-cluster border-b border-border-neutral-base p-panel-compact",
53
53
  children: [
54
54
  /*#__PURE__*/ _jsx(Button, {
55
55
  type: "button",
@@ -61,10 +61,10 @@ export function TriggerEventDetailView({ workspaceId, workspaceSlug, event, onBa
61
61
  children: "Back to events"
62
62
  }),
63
63
  /*#__PURE__*/ _jsxs("div", {
64
- className: "flex min-w-0 items-start justify-between gap-12",
64
+ className: "flex min-w-0 items-start justify-between gap-cluster",
65
65
  children: [
66
66
  /*#__PURE__*/ _jsxs("div", {
67
- className: "flex min-w-0 flex-col gap-4",
67
+ className: "flex min-w-0 flex-col gap-tight",
68
68
  children: [
69
69
  /*#__PURE__*/ _jsxs(Tooltip, {
70
70
  children: [
@@ -73,7 +73,7 @@ export function TriggerEventDetailView({ workspaceId, workspaceSlug, event, onBa
73
73
  children: /*#__PURE__*/ _jsxs("button", {
74
74
  type: "button",
75
75
  "aria-label": fullEventLabel,
76
- className: "flex min-w-0 items-center gap-6 rounded-6 border-0 bg-transparent p-0 text-left outline-none focus-visible:shadow-button-neutral-focus",
76
+ className: "flex min-w-0 items-center gap-inline rounded-6 border-0 bg-transparent p-0 text-left outline-none focus-visible:shadow-button-neutral-focus",
77
77
  children: [
78
78
  /*#__PURE__*/ _jsx(TriggerSourceIcon, {
79
79
  provider: event.provider,
@@ -119,7 +119,7 @@ export function TriggerEventDetailView({ workspaceId, workspaceSlug, event, onBa
119
119
  ]
120
120
  }),
121
121
  /*#__PURE__*/ _jsxs("div", {
122
- className: "flex min-h-0 flex-1 flex-col gap-20 overflow-y-auto p-16 scrollbar",
122
+ className: "flex min-h-0 flex-1 flex-col gap-section overflow-y-auto p-panel-compact scrollbar",
123
123
  children: [
124
124
  /*#__PURE__*/ _jsx(EventRuns, {
125
125
  workspaceId: workspaceId,
@@ -146,7 +146,7 @@ function triggerEventFullLabel(event) {
146
146
  function TriggerEventDetailPlaceholder() {
147
147
  return /*#__PURE__*/ _jsx("aside", {
148
148
  "aria-label": "Event details",
149
- className: cn(PANEL_CLASS, 'hidden min-h-[240px] items-center justify-center p-24 @min-[820px]:flex'),
149
+ className: cn(PANEL_CLASS, 'hidden min-h-[240px] items-center justify-center p-panel @min-[820px]:flex'),
150
150
  children: /*#__PURE__*/ _jsx(EmptyState, {
151
151
  icon: "pulseLine",
152
152
  variant: "compact",
@@ -157,7 +157,7 @@ function TriggerEventDetailPlaceholder() {
157
157
  function TriggerEventDetailLoading({ onBack }) {
158
158
  return /*#__PURE__*/ _jsxs("aside", {
159
159
  "aria-label": "Event details",
160
- className: cn(PANEL_CLASS, DETAIL_RAIL_CLASS, 'flex min-h-[320px] flex-col gap-16 p-16'),
160
+ className: cn(PANEL_CLASS, DETAIL_RAIL_CLASS, 'flex min-h-[320px] flex-col gap-group p-panel-compact'),
161
161
  children: [
162
162
  /*#__PURE__*/ _jsx(Button, {
163
163
  type: "button",
@@ -169,7 +169,7 @@ function TriggerEventDetailLoading({ onBack }) {
169
169
  children: "Back to events"
170
170
  }),
171
171
  /*#__PURE__*/ _jsxs("div", {
172
- className: "flex flex-col gap-8",
172
+ className: "flex flex-col gap-inline",
173
173
  children: [
174
174
  /*#__PURE__*/ _jsx(Skeleton, {
175
175
  className: "h-16 w-160"
@@ -191,7 +191,7 @@ function TriggerEventDetailLoading({ onBack }) {
191
191
  function TriggerEventDetailError({ onBack, onRetry }) {
192
192
  return /*#__PURE__*/ _jsxs("aside", {
193
193
  "aria-label": "Event details",
194
- className: cn(PANEL_CLASS, DETAIL_RAIL_CLASS, 'flex min-h-[320px] flex-col gap-16 p-16'),
194
+ className: cn(PANEL_CLASS, DETAIL_RAIL_CLASS, 'flex min-h-[320px] flex-col gap-group p-panel-compact'),
195
195
  children: [
196
196
  /*#__PURE__*/ _jsx(Button, {
197
197
  type: "button",
@@ -206,7 +206,7 @@ function TriggerEventDetailError({ onBack, onRetry }) {
206
206
  role: "alert",
207
207
  type: "error",
208
208
  children: /*#__PURE__*/ _jsxs("div", {
209
- className: "flex items-center justify-between gap-12",
209
+ className: "flex items-center justify-between gap-cluster",
210
210
  children: [
211
211
  /*#__PURE__*/ _jsx(Text, {
212
212
  size: "sm",
@@ -267,7 +267,7 @@ function EventRunsWithProjects({ workspaceId, workspaceSlug, event }) {
267
267
  function EventRunsList({ workspaceSlug, projectSlugs, projectDetailLookupEnabled = false, event }) {
268
268
  return /*#__PURE__*/ _jsxs("section", {
269
269
  "aria-labelledby": "trigger-event-runs-heading",
270
- className: "flex flex-col gap-6",
270
+ className: "flex flex-col gap-inline",
271
271
  children: [
272
272
  /*#__PURE__*/ _jsx(Text, {
273
273
  id: "trigger-event-runs-heading",
@@ -276,7 +276,7 @@ function EventRunsList({ workspaceSlug, projectSlugs, projectDetailLookupEnabled
276
276
  children: "Matched workflows"
277
277
  }),
278
278
  /*#__PURE__*/ _jsx("ul", {
279
- className: "-mx-8 flex flex-col gap-1",
279
+ className: "-mx-inline flex flex-col gap-tight",
280
280
  children: event.decisions.map((decision)=>/*#__PURE__*/ _jsx(DecisionRow, {
281
281
  workspaceSlug: workspaceSlug,
282
282
  projectId: decision.projectId ?? undefined,
@@ -294,15 +294,15 @@ function DecisionRow({ projectId, projectSlug, workspaceSlug, projectDetailLooku
294
294
  const resolvedProjectSlug = projectSlug ?? projectQuery.data?.slug;
295
295
  if (decision.decision !== 'triggered' || !decision.runId || !decision.runName) {
296
296
  return /*#__PURE__*/ _jsxs("li", {
297
- className: "flex min-w-0 items-start gap-8 rounded-6 px-8 py-6",
297
+ className: "flex min-w-0 items-start gap-inline rounded-6 p-tight",
298
298
  children: [
299
299
  /*#__PURE__*/ _jsx(Icon, {
300
300
  name: "cornerDownRightLine",
301
- className: "mt-2 size-14 shrink-0 text-foreground-neutral-disabled",
301
+ className: "size-14 shrink-0 text-foreground-neutral-disabled",
302
302
  "aria-hidden": "true"
303
303
  }),
304
304
  /*#__PURE__*/ _jsxs("div", {
305
- className: "flex min-w-0 flex-col gap-1",
305
+ className: "flex min-w-0 flex-col gap-tight",
306
306
  children: [
307
307
  /*#__PURE__*/ _jsx(Text, {
308
308
  size: "sm",
@@ -327,11 +327,11 @@ function DecisionRow({ projectId, projectSlug, workspaceSlug, projectDetailLooku
327
327
  children: [
328
328
  /*#__PURE__*/ _jsx(Icon, {
329
329
  name: "cornerDownRightLine",
330
- className: "mt-3 size-14 shrink-0 text-foreground-neutral-muted",
330
+ className: "size-14 shrink-0 text-foreground-neutral-muted",
331
331
  "aria-hidden": "true"
332
332
  }),
333
333
  /*#__PURE__*/ _jsxs("span", {
334
- className: "flex min-w-0 flex-col gap-1",
334
+ className: "flex min-w-0 flex-col gap-tight",
335
335
  children: [
336
336
  /*#__PURE__*/ _jsx(Text, {
337
337
  as: "span",
@@ -349,7 +349,7 @@ function DecisionRow({ projectId, projectSlug, workspaceSlug, projectDetailLooku
349
349
  })
350
350
  ]
351
351
  });
352
- const rowClassName = 'flex min-w-0 items-start gap-8 rounded-6 px-8 py-6 hover:bg-background-components-hover focus-visible:outline-none focus-visible:shadow-button-neutral-focus';
352
+ const rowClassName = 'flex min-w-0 items-start gap-inline rounded-6 p-tight hover:bg-background-components-hover focus-visible:outline-none focus-visible:shadow-button-neutral-focus';
353
353
  return /*#__PURE__*/ _jsx("li", {
354
354
  children: workspaceSlug && resolvedProjectSlug ? /*#__PURE__*/ _jsx(Link, {
355
355
  to: "/w/$workspaceSlug/p/$projectSlug/runs/$workflowRunId",
@@ -376,7 +376,7 @@ function EventPayload({ payload }) {
376
376
  ];
377
377
  return /*#__PURE__*/ _jsxs("section", {
378
378
  "aria-labelledby": "trigger-event-payload-heading",
379
- className: "flex flex-col gap-6",
379
+ className: "flex flex-col gap-inline",
380
380
  children: [
381
381
  /*#__PURE__*/ _jsx(Text, {
382
382
  id: "trigger-event-payload-heading",
@@ -389,7 +389,7 @@ function EventPayload({ payload }) {
389
389
  className: "flex h-auto flex-col overflow-visible rounded-8 bg-background-contrast-base shadow-none",
390
390
  children: [
391
391
  /*#__PURE__*/ _jsxs(CodeBlockHeader, {
392
- className: "sticky top-0 z-10 shrink-0 border-b border-border-contrast-base bg-background-contrast-base px-10 py-6",
392
+ className: "sticky top-0 z-10 shrink-0 border-b border-border-contrast-base bg-background-contrast-base p-tight",
393
393
  children: [
394
394
  /*#__PURE__*/ _jsx(CodeBlockFiles, {
395
395
  children: (item)=>/*#__PURE__*/ _jsx(CodeBlockFilename, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/trigger-event-detail.tsx"],"sourcesContent":["import {useProjectQuery, useProjectsInfiniteQuery} from '@shipfox/client-projects';\nimport {Badge} from '@shipfox/react-ui/badge';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {\n CodeBlock,\n CodeBlockBody,\n CodeBlockContent,\n CodeBlockCopyButton,\n CodeBlockFilename,\n CodeBlockFiles,\n CodeBlockHeader,\n CodeBlockItem,\n} from '@shipfox/react-ui/code-block';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {RelativeTime} from '@shipfox/react-ui/relative-time';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Tooltip, TooltipContent, TooltipTrigger} from '@shipfox/react-ui/tooltip';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {Link} from '@tanstack/react-router';\nimport {useMemo} from 'react';\nimport type {\n TriggerEventDetail as TriggerEventDetailModel,\n TriggerEventMatchedWorkflowResult,\n} from '#core/trigger-event.js';\nimport {useTriggerEventQuery} from '#hooks/api/trigger-events.js';\nimport {triggerEventResult} from './trigger-event-result.js';\nimport {TriggerSourceIcon} from './trigger-source-icon.js';\n\nconst PANEL_CLASS =\n 'min-h-0 rounded-8 border border-border-neutral-base bg-background-neutral-base';\nconst DETAIL_RAIL_CLASS =\n '@min-[820px]:sticky @min-[820px]:top-16 @min-[820px]:max-h-[calc(var(--app-content-h,100dvh_-_96px)_-_32px)] @min-[820px]:min-h-[min(320px,calc(var(--app-content-h,100dvh_-_96px)_-_32px))]';\n\nexport interface TriggerEventDetailProps {\n workspaceId?: string | undefined;\n workspaceSlug?: string | undefined;\n eventId?: string | undefined;\n onBack: () => void;\n}\n\nexport function TriggerEventDetail({\n workspaceId,\n workspaceSlug,\n eventId,\n onBack,\n}: TriggerEventDetailProps) {\n const query = useTriggerEventQuery(eventId);\n\n if (!eventId) return <TriggerEventDetailPlaceholder />;\n if (query.data) {\n return (\n <TriggerEventDetailView\n workspaceId={workspaceId}\n workspaceSlug={workspaceSlug}\n event={query.data}\n onBack={onBack}\n />\n );\n }\n if (query.isError)\n return <TriggerEventDetailError onBack={onBack} onRetry={() => query.refetch()} />;\n return <TriggerEventDetailLoading onBack={onBack} />;\n}\n\nexport function TriggerEventDetailView({\n workspaceId,\n workspaceSlug,\n event,\n onBack,\n}: {\n workspaceId?: string | undefined;\n workspaceSlug?: string | undefined;\n event: TriggerEventDetailModel;\n onBack: () => void;\n}) {\n const result = triggerEventResult(event);\n const eventLabel = triggerEventDisplayLabel(event);\n const fullEventLabel = triggerEventFullLabel(event);\n const formattedPayload = useMemo(\n () => JSON.stringify(event.payload ?? null, null, 2) ?? 'null',\n [event.payload],\n );\n\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(PANEL_CLASS, DETAIL_RAIL_CLASS, 'flex min-h-0 flex-col overflow-hidden')}\n >\n <div className=\"flex shrink-0 flex-col gap-12 border-b border-border-neutral-base p-16\">\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start @min-[820px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <div className=\"flex min-w-0 items-start justify-between gap-12\">\n <div className=\"flex min-w-0 flex-col gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={fullEventLabel}\n className=\"flex min-w-0 items-center gap-6 rounded-6 border-0 bg-transparent p-0 text-left outline-none focus-visible:shadow-button-neutral-focus\"\n >\n <TriggerSourceIcon\n provider={event.provider}\n source={event.source}\n aria-hidden=\"true\"\n className=\"size-16 shrink-0 text-foreground-neutral-muted\"\n />\n <Code as=\"span\" variant=\"label\" className=\"truncate text-foreground-neutral-base\">\n {eventLabel}\n </Code>\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <Code as=\"span\" variant=\"label\" className=\"block max-w-[360px] break-words\">\n {fullEventLabel}\n </Code>\n </TooltipContent>\n </Tooltip>\n <Text size=\"xs\" className=\"truncate text-foreground-neutral-muted\">\n <RelativeTime value={event.receivedAt} />\n </Text>\n </div>\n <Badge variant={result.badge} size=\"xs\">\n {result.label}\n </Badge>\n </div>\n </div>\n\n <div\n key={event.id}\n className=\"flex min-h-0 flex-1 flex-col gap-20 overflow-y-auto p-16 scrollbar\"\n >\n <EventRuns workspaceId={workspaceId} workspaceSlug={workspaceSlug} event={event} />\n <EventPayload payload={formattedPayload} />\n </div>\n </aside>\n );\n}\n\nfunction triggerEventDisplayLabel(event: Pick<TriggerEventDetailModel, 'event' | 'source'>) {\n return event.event || event.source;\n}\n\nfunction triggerEventFullLabel(event: Pick<TriggerEventDetailModel, 'event' | 'source'>) {\n return [event.source, event.event].filter(Boolean).join(' · ');\n}\n\nfunction TriggerEventDetailPlaceholder() {\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(\n PANEL_CLASS,\n 'hidden min-h-[240px] items-center justify-center p-24 @min-[820px]:flex',\n )}\n >\n <EmptyState icon=\"pulseLine\" variant=\"compact\" title=\"No event selected\" />\n </aside>\n );\n}\n\nfunction TriggerEventDetailLoading({onBack}: {onBack: () => void}) {\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(PANEL_CLASS, DETAIL_RAIL_CLASS, 'flex min-h-[320px] flex-col gap-16 p-16')}\n >\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start @min-[820px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <div className=\"flex flex-col gap-8\">\n <Skeleton className=\"h-16 w-160\" />\n <Skeleton className=\"h-12 w-120\" />\n </div>\n <Skeleton className=\"h-96\" />\n <Skeleton className=\"h-160\" />\n </aside>\n );\n}\n\nfunction TriggerEventDetailError({onBack, onRetry}: {onBack: () => void; onRetry: () => void}) {\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(PANEL_CLASS, DETAIL_RAIL_CLASS, 'flex min-h-[320px] flex-col gap-16 p-16')}\n >\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start @min-[820px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex items-center justify-between gap-12\">\n <Text size=\"sm\">Event detail could not be loaded.</Text>\n <Button type=\"button\" variant=\"secondary\" size=\"xs\" onClick={onRetry}>\n Retry\n </Button>\n </div>\n </Callout>\n </aside>\n );\n}\n\nfunction EventRuns({\n workspaceId,\n workspaceSlug,\n event,\n}: {\n workspaceId?: string | undefined;\n workspaceSlug?: string | undefined;\n event: TriggerEventDetailModel;\n}) {\n if (event.decisions.length === 0) {\n if (event.outcome === 'discarded') {\n return (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n No workflows are subscribed to this event.\n </Text>\n );\n }\n return null;\n }\n\n if (!workspaceId) {\n return <EventRunsList workspaceSlug={workspaceSlug} projectSlugs={new Map()} event={event} />;\n }\n\n return (\n <EventRunsWithProjects workspaceId={workspaceId} workspaceSlug={workspaceSlug} event={event} />\n );\n}\n\nfunction EventRunsWithProjects({\n workspaceId,\n workspaceSlug,\n event,\n}: {\n workspaceId: string;\n workspaceSlug?: string | undefined;\n event: TriggerEventDetailModel;\n}) {\n const projectsQuery = useProjectsInfiniteQuery(workspaceId);\n const projectSlugs = useMemo(\n () =>\n new Map(\n projectsQuery.data?.pages\n .flatMap((page) => page.projects)\n .map((project) => [project.id, project.slug] as const),\n ),\n [projectsQuery.data],\n );\n return (\n <EventRunsList\n workspaceSlug={workspaceSlug}\n projectSlugs={projectSlugs}\n projectDetailLookupEnabled={!projectsQuery.isPending}\n event={event}\n />\n );\n}\n\nfunction EventRunsList({\n workspaceSlug,\n projectSlugs,\n projectDetailLookupEnabled = false,\n event,\n}: {\n workspaceSlug?: string | undefined;\n projectSlugs: ReadonlyMap<string, string>;\n projectDetailLookupEnabled?: boolean;\n event: TriggerEventDetailModel;\n}) {\n return (\n <section aria-labelledby=\"trigger-event-runs-heading\" className=\"flex flex-col gap-6\">\n <Text id=\"trigger-event-runs-heading\" size=\"sm\" bold>\n Matched workflows\n </Text>\n <ul className=\"-mx-8 flex flex-col gap-1\">\n {event.decisions.map((decision) => (\n <DecisionRow\n key={decision.id}\n workspaceSlug={workspaceSlug}\n projectId={decision.projectId ?? undefined}\n projectSlug={decision.projectId ? projectSlugs.get(decision.projectId) : undefined}\n projectDetailLookupEnabled={projectDetailLookupEnabled}\n decision={decision}\n />\n ))}\n </ul>\n </section>\n );\n}\n\nfunction DecisionRow({\n projectId,\n projectSlug,\n workspaceSlug,\n projectDetailLookupEnabled,\n decision,\n}: {\n projectId?: string | undefined;\n projectSlug?: string | undefined;\n workspaceSlug?: string | undefined;\n projectDetailLookupEnabled: boolean;\n decision: TriggerEventMatchedWorkflowResult;\n}) {\n const canRenderRunLink =\n decision.decision === 'triggered' && Boolean(decision.runId && decision.runName);\n const projectQuery = useProjectQuery(\n canRenderRunLink && projectDetailLookupEnabled && !projectSlug ? projectId : undefined,\n );\n const resolvedProjectSlug = projectSlug ?? projectQuery.data?.slug;\n\n if (decision.decision !== 'triggered' || !decision.runId || !decision.runName) {\n return (\n <li className=\"flex min-w-0 items-start gap-8 rounded-6 px-8 py-6\">\n <Icon\n name=\"cornerDownRightLine\"\n className=\"mt-2 size-14 shrink-0 text-foreground-neutral-disabled\"\n aria-hidden=\"true\"\n />\n <div className=\"flex min-w-0 flex-col gap-1\">\n <Text size=\"sm\" className=\"min-w-0 truncate text-foreground-neutral-base\">\n {decision.subscriptionName}\n </Text>\n {decision.reason ? (\n <Text size=\"xs\" className=\"text-foreground-highlight-error\">\n {decision.reason}\n </Text>\n ) : (\n <Text size=\"xs\" className=\"text-foreground-neutral-disabled\">\n No run created\n </Text>\n )}\n </div>\n </li>\n );\n }\n\n const row = (\n <>\n <Icon\n name=\"cornerDownRightLine\"\n className=\"mt-3 size-14 shrink-0 text-foreground-neutral-muted\"\n aria-hidden=\"true\"\n />\n <span className=\"flex min-w-0 flex-col gap-1\">\n <Text as=\"span\" size=\"sm\" className=\"min-w-0 truncate text-foreground-neutral-base\">\n {decision.subscriptionName}\n </Text>\n <Code as=\"span\" variant=\"label\" className=\"truncate text-foreground-neutral-muted\">\n {decision.runName}\n </Code>\n </span>\n </>\n );\n const rowClassName =\n 'flex min-w-0 items-start gap-8 rounded-6 px-8 py-6 hover:bg-background-components-hover focus-visible:outline-none focus-visible:shadow-button-neutral-focus';\n\n return (\n <li>\n {workspaceSlug && resolvedProjectSlug ? (\n <Link\n to=\"/w/$workspaceSlug/p/$projectSlug/runs/$workflowRunId\"\n params={{\n workspaceSlug,\n projectSlug: resolvedProjectSlug,\n workflowRunId: decision.runId,\n }}\n className={rowClassName}\n >\n {row}\n </Link>\n ) : (\n <div className={rowClassName}>{row}</div>\n )}\n </li>\n );\n}\n\nfunction EventPayload({payload}: {payload: string}) {\n const data = [{language: 'json', filename: 'payload.json', code: payload}];\n\n return (\n <section aria-labelledby=\"trigger-event-payload-heading\" className=\"flex flex-col gap-6\">\n <Text id=\"trigger-event-payload-heading\" size=\"sm\" bold>\n Payload\n </Text>\n <CodeBlock\n data={data}\n className=\"flex h-auto flex-col overflow-visible rounded-8 bg-background-contrast-base shadow-none\"\n >\n <CodeBlockHeader className=\"sticky top-0 z-10 shrink-0 border-b border-border-contrast-base bg-background-contrast-base px-10 py-6\">\n <CodeBlockFiles>\n {(item) => <CodeBlockFilename value={item.filename}>{item.filename}</CodeBlockFilename>}\n </CodeBlockFiles>\n <CodeBlockCopyButton />\n </CodeBlockHeader>\n <CodeBlockBody className=\"min-h-0 scrollbar\">\n {(item) => (\n <CodeBlockItem\n value={item.filename}\n lineNumbers={false}\n className=\"px-0 pb-0 [&>div]:rounded-none [&>div]:border-0 [&>div]:bg-background-contrast-base [&>div]:dark:bg-background-contrast-base [&_code]:!text-foreground-neutral-on-color\"\n >\n <CodeBlockContent language=\"json\" syntaxHighlighting={false}>\n {item.code}\n </CodeBlockContent>\n </CodeBlockItem>\n )}\n </CodeBlockBody>\n </CodeBlock>\n </section>\n );\n}\n"],"names":["useProjectQuery","useProjectsInfiniteQuery","Badge","Button","Callout","CodeBlock","CodeBlockBody","CodeBlockContent","CodeBlockCopyButton","CodeBlockFilename","CodeBlockFiles","CodeBlockHeader","CodeBlockItem","EmptyState","Icon","RelativeTime","Skeleton","Tooltip","TooltipContent","TooltipTrigger","Code","Text","cn","Link","useMemo","useTriggerEventQuery","triggerEventResult","TriggerSourceIcon","PANEL_CLASS","DETAIL_RAIL_CLASS","TriggerEventDetail","workspaceId","workspaceSlug","eventId","onBack","query","TriggerEventDetailPlaceholder","data","TriggerEventDetailView","event","isError","TriggerEventDetailError","onRetry","refetch","TriggerEventDetailLoading","result","eventLabel","triggerEventDisplayLabel","fullEventLabel","triggerEventFullLabel","formattedPayload","JSON","stringify","payload","aside","aria-label","className","div","type","variant","size","iconLeft","onClick","asChild","button","provider","source","aria-hidden","as","value","receivedAt","badge","label","EventRuns","EventPayload","id","filter","Boolean","join","icon","title","role","decisions","length","outcome","EventRunsList","projectSlugs","Map","EventRunsWithProjects","projectsQuery","pages","flatMap","page","projects","map","project","slug","projectDetailLookupEnabled","isPending","section","aria-labelledby","bold","ul","decision","DecisionRow","projectId","undefined","projectSlug","get","canRenderRunLink","runId","runName","projectQuery","resolvedProjectSlug","li","name","subscriptionName","reason","row","span","rowClassName","to","params","workflowRunId","language","filename","code","item","lineNumbers","syntaxHighlighting"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/components/trigger-event-detail.tsx"],"sourcesContent":["import {useProjectQuery, useProjectsInfiniteQuery} from '@shipfox/client-projects';\nimport {Badge} from '@shipfox/react-ui/badge';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {\n CodeBlock,\n CodeBlockBody,\n CodeBlockContent,\n CodeBlockCopyButton,\n CodeBlockFilename,\n CodeBlockFiles,\n CodeBlockHeader,\n CodeBlockItem,\n} from '@shipfox/react-ui/code-block';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {RelativeTime} from '@shipfox/react-ui/relative-time';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Tooltip, TooltipContent, TooltipTrigger} from '@shipfox/react-ui/tooltip';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {Link} from '@tanstack/react-router';\nimport {useMemo} from 'react';\nimport type {\n TriggerEventDetail as TriggerEventDetailModel,\n TriggerEventMatchedWorkflowResult,\n} from '#core/trigger-event.js';\nimport {useTriggerEventQuery} from '#hooks/api/trigger-events.js';\nimport {triggerEventResult} from './trigger-event-result.js';\nimport {TriggerSourceIcon} from './trigger-source-icon.js';\n\nconst PANEL_CLASS =\n 'min-h-0 rounded-8 border border-border-neutral-base bg-background-neutral-base';\nconst DETAIL_RAIL_CLASS =\n '@min-[820px]:sticky @min-[820px]:top-16 @min-[820px]:max-h-[calc(var(--app-content-h,100dvh_-_96px)_-_32px)] @min-[820px]:min-h-[min(320px,calc(var(--app-content-h,100dvh_-_96px)_-_32px))]';\n\nexport interface TriggerEventDetailProps {\n workspaceId?: string | undefined;\n workspaceSlug?: string | undefined;\n eventId?: string | undefined;\n onBack: () => void;\n}\n\nexport function TriggerEventDetail({\n workspaceId,\n workspaceSlug,\n eventId,\n onBack,\n}: TriggerEventDetailProps) {\n const query = useTriggerEventQuery(eventId);\n\n if (!eventId) return <TriggerEventDetailPlaceholder />;\n if (query.data) {\n return (\n <TriggerEventDetailView\n workspaceId={workspaceId}\n workspaceSlug={workspaceSlug}\n event={query.data}\n onBack={onBack}\n />\n );\n }\n if (query.isError)\n return <TriggerEventDetailError onBack={onBack} onRetry={() => query.refetch()} />;\n return <TriggerEventDetailLoading onBack={onBack} />;\n}\n\nexport function TriggerEventDetailView({\n workspaceId,\n workspaceSlug,\n event,\n onBack,\n}: {\n workspaceId?: string | undefined;\n workspaceSlug?: string | undefined;\n event: TriggerEventDetailModel;\n onBack: () => void;\n}) {\n const result = triggerEventResult(event);\n const eventLabel = triggerEventDisplayLabel(event);\n const fullEventLabel = triggerEventFullLabel(event);\n const formattedPayload = useMemo(\n () => JSON.stringify(event.payload ?? null, null, 2) ?? 'null',\n [event.payload],\n );\n\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(PANEL_CLASS, DETAIL_RAIL_CLASS, 'flex min-h-0 flex-col overflow-hidden')}\n >\n <div className=\"flex shrink-0 flex-col gap-cluster border-b border-border-neutral-base p-panel-compact\">\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start @min-[820px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <div className=\"flex min-w-0 items-start justify-between gap-cluster\">\n <div className=\"flex min-w-0 flex-col gap-tight\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={fullEventLabel}\n className=\"flex min-w-0 items-center gap-inline rounded-6 border-0 bg-transparent p-0 text-left outline-none focus-visible:shadow-button-neutral-focus\"\n >\n <TriggerSourceIcon\n provider={event.provider}\n source={event.source}\n aria-hidden=\"true\"\n className=\"size-16 shrink-0 text-foreground-neutral-muted\"\n />\n <Code as=\"span\" variant=\"label\" className=\"truncate text-foreground-neutral-base\">\n {eventLabel}\n </Code>\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <Code as=\"span\" variant=\"label\" className=\"block max-w-[360px] break-words\">\n {fullEventLabel}\n </Code>\n </TooltipContent>\n </Tooltip>\n <Text size=\"xs\" className=\"truncate text-foreground-neutral-muted\">\n <RelativeTime value={event.receivedAt} />\n </Text>\n </div>\n <Badge variant={result.badge} size=\"xs\">\n {result.label}\n </Badge>\n </div>\n </div>\n\n <div\n key={event.id}\n className=\"flex min-h-0 flex-1 flex-col gap-section overflow-y-auto p-panel-compact scrollbar\"\n >\n <EventRuns workspaceId={workspaceId} workspaceSlug={workspaceSlug} event={event} />\n <EventPayload payload={formattedPayload} />\n </div>\n </aside>\n );\n}\n\nfunction triggerEventDisplayLabel(event: Pick<TriggerEventDetailModel, 'event' | 'source'>) {\n return event.event || event.source;\n}\n\nfunction triggerEventFullLabel(event: Pick<TriggerEventDetailModel, 'event' | 'source'>) {\n return [event.source, event.event].filter(Boolean).join(' · ');\n}\n\nfunction TriggerEventDetailPlaceholder() {\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(\n PANEL_CLASS,\n 'hidden min-h-[240px] items-center justify-center p-panel @min-[820px]:flex',\n )}\n >\n <EmptyState icon=\"pulseLine\" variant=\"compact\" title=\"No event selected\" />\n </aside>\n );\n}\n\nfunction TriggerEventDetailLoading({onBack}: {onBack: () => void}) {\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(\n PANEL_CLASS,\n DETAIL_RAIL_CLASS,\n 'flex min-h-[320px] flex-col gap-group p-panel-compact',\n )}\n >\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start @min-[820px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <div className=\"flex flex-col gap-inline\">\n <Skeleton className=\"h-16 w-160\" />\n <Skeleton className=\"h-12 w-120\" />\n </div>\n <Skeleton className=\"h-96\" />\n <Skeleton className=\"h-160\" />\n </aside>\n );\n}\n\nfunction TriggerEventDetailError({onBack, onRetry}: {onBack: () => void; onRetry: () => void}) {\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(\n PANEL_CLASS,\n DETAIL_RAIL_CLASS,\n 'flex min-h-[320px] flex-col gap-group p-panel-compact',\n )}\n >\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start @min-[820px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex items-center justify-between gap-cluster\">\n <Text size=\"sm\">Event detail could not be loaded.</Text>\n <Button type=\"button\" variant=\"secondary\" size=\"xs\" onClick={onRetry}>\n Retry\n </Button>\n </div>\n </Callout>\n </aside>\n );\n}\n\nfunction EventRuns({\n workspaceId,\n workspaceSlug,\n event,\n}: {\n workspaceId?: string | undefined;\n workspaceSlug?: string | undefined;\n event: TriggerEventDetailModel;\n}) {\n if (event.decisions.length === 0) {\n if (event.outcome === 'discarded') {\n return (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n No workflows are subscribed to this event.\n </Text>\n );\n }\n return null;\n }\n\n if (!workspaceId) {\n return <EventRunsList workspaceSlug={workspaceSlug} projectSlugs={new Map()} event={event} />;\n }\n\n return (\n <EventRunsWithProjects workspaceId={workspaceId} workspaceSlug={workspaceSlug} event={event} />\n );\n}\n\nfunction EventRunsWithProjects({\n workspaceId,\n workspaceSlug,\n event,\n}: {\n workspaceId: string;\n workspaceSlug?: string | undefined;\n event: TriggerEventDetailModel;\n}) {\n const projectsQuery = useProjectsInfiniteQuery(workspaceId);\n const projectSlugs = useMemo(\n () =>\n new Map(\n projectsQuery.data?.pages\n .flatMap((page) => page.projects)\n .map((project) => [project.id, project.slug] as const),\n ),\n [projectsQuery.data],\n );\n return (\n <EventRunsList\n workspaceSlug={workspaceSlug}\n projectSlugs={projectSlugs}\n projectDetailLookupEnabled={!projectsQuery.isPending}\n event={event}\n />\n );\n}\n\nfunction EventRunsList({\n workspaceSlug,\n projectSlugs,\n projectDetailLookupEnabled = false,\n event,\n}: {\n workspaceSlug?: string | undefined;\n projectSlugs: ReadonlyMap<string, string>;\n projectDetailLookupEnabled?: boolean;\n event: TriggerEventDetailModel;\n}) {\n return (\n <section aria-labelledby=\"trigger-event-runs-heading\" className=\"flex flex-col gap-inline\">\n <Text id=\"trigger-event-runs-heading\" size=\"sm\" bold>\n Matched workflows\n </Text>\n <ul className=\"-mx-inline flex flex-col gap-tight\">\n {event.decisions.map((decision) => (\n <DecisionRow\n key={decision.id}\n workspaceSlug={workspaceSlug}\n projectId={decision.projectId ?? undefined}\n projectSlug={decision.projectId ? projectSlugs.get(decision.projectId) : undefined}\n projectDetailLookupEnabled={projectDetailLookupEnabled}\n decision={decision}\n />\n ))}\n </ul>\n </section>\n );\n}\n\nfunction DecisionRow({\n projectId,\n projectSlug,\n workspaceSlug,\n projectDetailLookupEnabled,\n decision,\n}: {\n projectId?: string | undefined;\n projectSlug?: string | undefined;\n workspaceSlug?: string | undefined;\n projectDetailLookupEnabled: boolean;\n decision: TriggerEventMatchedWorkflowResult;\n}) {\n const canRenderRunLink =\n decision.decision === 'triggered' && Boolean(decision.runId && decision.runName);\n const projectQuery = useProjectQuery(\n canRenderRunLink && projectDetailLookupEnabled && !projectSlug ? projectId : undefined,\n );\n const resolvedProjectSlug = projectSlug ?? projectQuery.data?.slug;\n\n if (decision.decision !== 'triggered' || !decision.runId || !decision.runName) {\n return (\n <li className=\"flex min-w-0 items-start gap-inline rounded-6 p-tight\">\n <Icon\n name=\"cornerDownRightLine\"\n className=\"size-14 shrink-0 text-foreground-neutral-disabled\"\n aria-hidden=\"true\"\n />\n <div className=\"flex min-w-0 flex-col gap-tight\">\n <Text size=\"sm\" className=\"min-w-0 truncate text-foreground-neutral-base\">\n {decision.subscriptionName}\n </Text>\n {decision.reason ? (\n <Text size=\"xs\" className=\"text-foreground-highlight-error\">\n {decision.reason}\n </Text>\n ) : (\n <Text size=\"xs\" className=\"text-foreground-neutral-disabled\">\n No run created\n </Text>\n )}\n </div>\n </li>\n );\n }\n\n const row = (\n <>\n <Icon\n name=\"cornerDownRightLine\"\n className=\"size-14 shrink-0 text-foreground-neutral-muted\"\n aria-hidden=\"true\"\n />\n <span className=\"flex min-w-0 flex-col gap-tight\">\n <Text as=\"span\" size=\"sm\" className=\"min-w-0 truncate text-foreground-neutral-base\">\n {decision.subscriptionName}\n </Text>\n <Code as=\"span\" variant=\"label\" className=\"truncate text-foreground-neutral-muted\">\n {decision.runName}\n </Code>\n </span>\n </>\n );\n const rowClassName =\n 'flex min-w-0 items-start gap-inline rounded-6 p-tight hover:bg-background-components-hover focus-visible:outline-none focus-visible:shadow-button-neutral-focus';\n\n return (\n <li>\n {workspaceSlug && resolvedProjectSlug ? (\n <Link\n to=\"/w/$workspaceSlug/p/$projectSlug/runs/$workflowRunId\"\n params={{\n workspaceSlug,\n projectSlug: resolvedProjectSlug,\n workflowRunId: decision.runId,\n }}\n className={rowClassName}\n >\n {row}\n </Link>\n ) : (\n <div className={rowClassName}>{row}</div>\n )}\n </li>\n );\n}\n\nfunction EventPayload({payload}: {payload: string}) {\n const data = [{language: 'json', filename: 'payload.json', code: payload}];\n\n return (\n <section aria-labelledby=\"trigger-event-payload-heading\" className=\"flex flex-col gap-inline\">\n <Text id=\"trigger-event-payload-heading\" size=\"sm\" bold>\n Payload\n </Text>\n <CodeBlock\n data={data}\n className=\"flex h-auto flex-col overflow-visible rounded-8 bg-background-contrast-base shadow-none\"\n >\n <CodeBlockHeader className=\"sticky top-0 z-10 shrink-0 border-b border-border-contrast-base bg-background-contrast-base p-tight\">\n <CodeBlockFiles>\n {(item) => <CodeBlockFilename value={item.filename}>{item.filename}</CodeBlockFilename>}\n </CodeBlockFiles>\n <CodeBlockCopyButton />\n </CodeBlockHeader>\n <CodeBlockBody className=\"min-h-0 scrollbar\">\n {(item) => (\n <CodeBlockItem\n value={item.filename}\n lineNumbers={false}\n className=\"px-0 pb-0 [&>div]:rounded-none [&>div]:border-0 [&>div]:bg-background-contrast-base [&>div]:dark:bg-background-contrast-base [&_code]:!text-foreground-neutral-on-color\"\n >\n <CodeBlockContent language=\"json\" syntaxHighlighting={false}>\n {item.code}\n </CodeBlockContent>\n </CodeBlockItem>\n )}\n </CodeBlockBody>\n </CodeBlock>\n </section>\n );\n}\n"],"names":["useProjectQuery","useProjectsInfiniteQuery","Badge","Button","Callout","CodeBlock","CodeBlockBody","CodeBlockContent","CodeBlockCopyButton","CodeBlockFilename","CodeBlockFiles","CodeBlockHeader","CodeBlockItem","EmptyState","Icon","RelativeTime","Skeleton","Tooltip","TooltipContent","TooltipTrigger","Code","Text","cn","Link","useMemo","useTriggerEventQuery","triggerEventResult","TriggerSourceIcon","PANEL_CLASS","DETAIL_RAIL_CLASS","TriggerEventDetail","workspaceId","workspaceSlug","eventId","onBack","query","TriggerEventDetailPlaceholder","data","TriggerEventDetailView","event","isError","TriggerEventDetailError","onRetry","refetch","TriggerEventDetailLoading","result","eventLabel","triggerEventDisplayLabel","fullEventLabel","triggerEventFullLabel","formattedPayload","JSON","stringify","payload","aside","aria-label","className","div","type","variant","size","iconLeft","onClick","asChild","button","provider","source","aria-hidden","as","value","receivedAt","badge","label","EventRuns","EventPayload","id","filter","Boolean","join","icon","title","role","decisions","length","outcome","EventRunsList","projectSlugs","Map","EventRunsWithProjects","projectsQuery","pages","flatMap","page","projects","map","project","slug","projectDetailLookupEnabled","isPending","section","aria-labelledby","bold","ul","decision","DecisionRow","projectId","undefined","projectSlug","get","canRenderRunLink","runId","runName","projectQuery","resolvedProjectSlug","li","name","subscriptionName","reason","row","span","rowClassName","to","params","workflowRunId","language","filename","code","item","lineNumbers","syntaxHighlighting"],"mappings":"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"}
@@ -27,7 +27,7 @@ export function TriggerEventRow({ event, selected, onSelect }) {
27
27
  asChild: true,
28
28
  children: /*#__PURE__*/ _jsxs("button", {
29
29
  type: "button",
30
- className: "flex min-w-0 items-center gap-6 rounded-6 text-left outline-none focus-visible:shadow-button-neutral-focus",
30
+ className: "flex min-w-0 items-center gap-inline rounded-6 text-left outline-none focus-visible:shadow-button-neutral-focus",
31
31
  onClick: ()=>onSelect(event.id),
32
32
  "aria-label": `Open details for ${fullEventLabel}`,
33
33
  children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/trigger-event-row.tsx"],"sourcesContent":["import {RelativeTime} from '@shipfox/react-ui/relative-time';\nimport {TableCell, TableRow} from '@shipfox/react-ui/table';\nimport {Tooltip, TooltipContent, TooltipTrigger} from '@shipfox/react-ui/tooltip';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport type {MouseEvent} from 'react';\nimport type {TriggerEventSummary} from '#core/trigger-event.js';\nimport {triggerEventResult} from './trigger-event-result.js';\nimport {TriggerSourceIcon} from './trigger-source-icon.js';\n\ninterface TriggerEventRowProps {\n event: TriggerEventSummary;\n selected: boolean;\n onSelect: (eventId: string) => void;\n}\n\nexport function TriggerEventRow({event, selected, onSelect}: TriggerEventRowProps) {\n const result = triggerEventResult(event);\n const eventLabel = triggerEventDisplayLabel(event);\n const fullEventLabel = triggerEventFullLabel(event);\n\n function handleRowClick(clickEvent: MouseEvent<HTMLTableRowElement>) {\n const target = clickEvent.target;\n if (target instanceof HTMLElement && target.closest('button,a')) return;\n onSelect(event.id);\n }\n\n return (\n <TableRow\n data-selected={selected ? 'true' : undefined}\n className=\"cursor-pointer\"\n onClick={handleRowClick}\n >\n <TableCell>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className=\"flex min-w-0 items-center gap-6 rounded-6 text-left outline-none focus-visible:shadow-button-neutral-focus\"\n onClick={() => onSelect(event.id)}\n aria-label={`Open details for ${fullEventLabel}`}\n >\n <TriggerSourceIcon\n provider={event.provider}\n source={event.source}\n aria-hidden=\"true\"\n className=\"size-16 shrink-0 text-foreground-neutral-muted\"\n />\n <Code as=\"span\" variant=\"label\" className=\"truncate text-foreground-neutral-base\">\n {eventLabel}\n </Code>\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <Code as=\"span\" variant=\"label\" className=\"block max-w-[360px] break-words\">\n {fullEventLabel}\n </Code>\n </TooltipContent>\n </Tooltip>\n </TableCell>\n <TableCell>\n <Text\n size=\"sm\"\n className={cn(\n result.isFailure ? 'text-foreground-highlight-error' : 'text-foreground-neutral-subtle',\n )}\n >\n {result.label}\n </Text>\n </TableCell>\n <TableCell className=\"text-right\">\n <Code as=\"span\" variant=\"label\" className=\"text-foreground-neutral-muted\">\n <RelativeTime value={event.receivedAt} />\n </Code>\n </TableCell>\n </TableRow>\n );\n}\n\nfunction triggerEventDisplayLabel(event: Pick<TriggerEventSummary, 'event' | 'source'>) {\n return event.event || event.source;\n}\n\nfunction triggerEventFullLabel(event: Pick<TriggerEventSummary, 'event' | 'source'>) {\n return [event.source, event.event].filter(Boolean).join(' · ');\n}\n"],"names":["RelativeTime","TableCell","TableRow","Tooltip","TooltipContent","TooltipTrigger","Code","Text","cn","triggerEventResult","TriggerSourceIcon","TriggerEventRow","event","selected","onSelect","result","eventLabel","triggerEventDisplayLabel","fullEventLabel","triggerEventFullLabel","handleRowClick","clickEvent","target","HTMLElement","closest","id","data-selected","undefined","className","onClick","asChild","button","type","aria-label","provider","source","aria-hidden","as","variant","size","isFailure","label","value","receivedAt","filter","Boolean","join"],"mappings":";AAAA,SAAQA,YAAY,QAAO,kCAAkC;AAC7D,SAAQC,SAAS,EAAEC,QAAQ,QAAO,0BAA0B;AAC5D,SAAQC,OAAO,EAAEC,cAAc,EAAEC,cAAc,QAAO,4BAA4B;AAClF,SAAQC,IAAI,EAAEC,IAAI,QAAO,+BAA+B;AACxD,SAAQC,EAAE,QAAO,0BAA0B;AAG3C,SAAQC,kBAAkB,QAAO,4BAA4B;AAC7D,SAAQC,iBAAiB,QAAO,2BAA2B;AAQ3D,OAAO,SAASC,gBAAgB,EAACC,KAAK,EAAEC,QAAQ,EAAEC,QAAQ,EAAuB;IAC/E,MAAMC,SAASN,mBAAmBG;IAClC,MAAMI,aAAaC,yBAAyBL;IAC5C,MAAMM,iBAAiBC,sBAAsBP;IAE7C,SAASQ,eAAeC,UAA2C;QACjE,MAAMC,SAASD,WAAWC,MAAM;QAChC,IAAIA,kBAAkBC,eAAeD,OAAOE,OAAO,CAAC,aAAa;QACjEV,SAASF,MAAMa,EAAE;IACnB;IAEA,qBACE,MAACvB;QACCwB,iBAAeb,WAAW,SAASc;QACnCC,WAAU;QACVC,SAAST;;0BAET,KAACnB;0BACC,cAAA,MAACE;;sCACC,KAACE;4BAAeyB,OAAO;sCACrB,cAAA,MAACC;gCACCC,MAAK;gCACLJ,WAAU;gCACVC,SAAS,IAAMf,SAASF,MAAMa,EAAE;gCAChCQ,cAAY,CAAC,iBAAiB,EAAEf,gBAAgB;;kDAEhD,KAACR;wCACCwB,UAAUtB,MAAMsB,QAAQ;wCACxBC,QAAQvB,MAAMuB,MAAM;wCACpBC,eAAY;wCACZR,WAAU;;kDAEZ,KAACtB;wCAAK+B,IAAG;wCAAOC,SAAQ;wCAAQV,WAAU;kDACvCZ;;;;;sCAIP,KAACZ;sCACC,cAAA,KAACE;gCAAK+B,IAAG;gCAAOC,SAAQ;gCAAQV,WAAU;0CACvCV;;;;;;0BAKT,KAACjB;0BACC,cAAA,KAACM;oBACCgC,MAAK;oBACLX,WAAWpB,GACTO,OAAOyB,SAAS,GAAG,oCAAoC;8BAGxDzB,OAAO0B,KAAK;;;0BAGjB,KAACxC;gBAAU2B,WAAU;0BACnB,cAAA,KAACtB;oBAAK+B,IAAG;oBAAOC,SAAQ;oBAAQV,WAAU;8BACxC,cAAA,KAAC5B;wBAAa0C,OAAO9B,MAAM+B,UAAU;;;;;;AAK/C;AAEA,SAAS1B,yBAAyBL,KAAoD;IACpF,OAAOA,MAAMA,KAAK,IAAIA,MAAMuB,MAAM;AACpC;AAEA,SAAShB,sBAAsBP,KAAoD;IACjF,OAAO;QAACA,MAAMuB,MAAM;QAAEvB,MAAMA,KAAK;KAAC,CAACgC,MAAM,CAACC,SAASC,IAAI,CAAC;AAC1D"}
1
+ {"version":3,"sources":["../../src/components/trigger-event-row.tsx"],"sourcesContent":["import {RelativeTime} from '@shipfox/react-ui/relative-time';\nimport {TableCell, TableRow} from '@shipfox/react-ui/table';\nimport {Tooltip, TooltipContent, TooltipTrigger} from '@shipfox/react-ui/tooltip';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport type {MouseEvent} from 'react';\nimport type {TriggerEventSummary} from '#core/trigger-event.js';\nimport {triggerEventResult} from './trigger-event-result.js';\nimport {TriggerSourceIcon} from './trigger-source-icon.js';\n\ninterface TriggerEventRowProps {\n event: TriggerEventSummary;\n selected: boolean;\n onSelect: (eventId: string) => void;\n}\n\nexport function TriggerEventRow({event, selected, onSelect}: TriggerEventRowProps) {\n const result = triggerEventResult(event);\n const eventLabel = triggerEventDisplayLabel(event);\n const fullEventLabel = triggerEventFullLabel(event);\n\n function handleRowClick(clickEvent: MouseEvent<HTMLTableRowElement>) {\n const target = clickEvent.target;\n if (target instanceof HTMLElement && target.closest('button,a')) return;\n onSelect(event.id);\n }\n\n return (\n <TableRow\n data-selected={selected ? 'true' : undefined}\n className=\"cursor-pointer\"\n onClick={handleRowClick}\n >\n <TableCell>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className=\"flex min-w-0 items-center gap-inline rounded-6 text-left outline-none focus-visible:shadow-button-neutral-focus\"\n onClick={() => onSelect(event.id)}\n aria-label={`Open details for ${fullEventLabel}`}\n >\n <TriggerSourceIcon\n provider={event.provider}\n source={event.source}\n aria-hidden=\"true\"\n className=\"size-16 shrink-0 text-foreground-neutral-muted\"\n />\n <Code as=\"span\" variant=\"label\" className=\"truncate text-foreground-neutral-base\">\n {eventLabel}\n </Code>\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <Code as=\"span\" variant=\"label\" className=\"block max-w-[360px] break-words\">\n {fullEventLabel}\n </Code>\n </TooltipContent>\n </Tooltip>\n </TableCell>\n <TableCell>\n <Text\n size=\"sm\"\n className={cn(\n result.isFailure ? 'text-foreground-highlight-error' : 'text-foreground-neutral-subtle',\n )}\n >\n {result.label}\n </Text>\n </TableCell>\n <TableCell className=\"text-right\">\n <Code as=\"span\" variant=\"label\" className=\"text-foreground-neutral-muted\">\n <RelativeTime value={event.receivedAt} />\n </Code>\n </TableCell>\n </TableRow>\n );\n}\n\nfunction triggerEventDisplayLabel(event: Pick<TriggerEventSummary, 'event' | 'source'>) {\n return event.event || event.source;\n}\n\nfunction triggerEventFullLabel(event: Pick<TriggerEventSummary, 'event' | 'source'>) {\n return [event.source, event.event].filter(Boolean).join(' · ');\n}\n"],"names":["RelativeTime","TableCell","TableRow","Tooltip","TooltipContent","TooltipTrigger","Code","Text","cn","triggerEventResult","TriggerSourceIcon","TriggerEventRow","event","selected","onSelect","result","eventLabel","triggerEventDisplayLabel","fullEventLabel","triggerEventFullLabel","handleRowClick","clickEvent","target","HTMLElement","closest","id","data-selected","undefined","className","onClick","asChild","button","type","aria-label","provider","source","aria-hidden","as","variant","size","isFailure","label","value","receivedAt","filter","Boolean","join"],"mappings":";AAAA,SAAQA,YAAY,QAAO,kCAAkC;AAC7D,SAAQC,SAAS,EAAEC,QAAQ,QAAO,0BAA0B;AAC5D,SAAQC,OAAO,EAAEC,cAAc,EAAEC,cAAc,QAAO,4BAA4B;AAClF,SAAQC,IAAI,EAAEC,IAAI,QAAO,+BAA+B;AACxD,SAAQC,EAAE,QAAO,0BAA0B;AAG3C,SAAQC,kBAAkB,QAAO,4BAA4B;AAC7D,SAAQC,iBAAiB,QAAO,2BAA2B;AAQ3D,OAAO,SAASC,gBAAgB,EAACC,KAAK,EAAEC,QAAQ,EAAEC,QAAQ,EAAuB;IAC/E,MAAMC,SAASN,mBAAmBG;IAClC,MAAMI,aAAaC,yBAAyBL;IAC5C,MAAMM,iBAAiBC,sBAAsBP;IAE7C,SAASQ,eAAeC,UAA2C;QACjE,MAAMC,SAASD,WAAWC,MAAM;QAChC,IAAIA,kBAAkBC,eAAeD,OAAOE,OAAO,CAAC,aAAa;QACjEV,SAASF,MAAMa,EAAE;IACnB;IAEA,qBACE,MAACvB;QACCwB,iBAAeb,WAAW,SAASc;QACnCC,WAAU;QACVC,SAAST;;0BAET,KAACnB;0BACC,cAAA,MAACE;;sCACC,KAACE;4BAAeyB,OAAO;sCACrB,cAAA,MAACC;gCACCC,MAAK;gCACLJ,WAAU;gCACVC,SAAS,IAAMf,SAASF,MAAMa,EAAE;gCAChCQ,cAAY,CAAC,iBAAiB,EAAEf,gBAAgB;;kDAEhD,KAACR;wCACCwB,UAAUtB,MAAMsB,QAAQ;wCACxBC,QAAQvB,MAAMuB,MAAM;wCACpBC,eAAY;wCACZR,WAAU;;kDAEZ,KAACtB;wCAAK+B,IAAG;wCAAOC,SAAQ;wCAAQV,WAAU;kDACvCZ;;;;;sCAIP,KAACZ;sCACC,cAAA,KAACE;gCAAK+B,IAAG;gCAAOC,SAAQ;gCAAQV,WAAU;0CACvCV;;;;;;0BAKT,KAACjB;0BACC,cAAA,KAACM;oBACCgC,MAAK;oBACLX,WAAWpB,GACTO,OAAOyB,SAAS,GAAG,oCAAoC;8BAGxDzB,OAAO0B,KAAK;;;0BAGjB,KAACxC;gBAAU2B,WAAU;0BACnB,cAAA,KAACtB;oBAAK+B,IAAG;oBAAOC,SAAQ;oBAAQV,WAAU;8BACxC,cAAA,KAAC5B;wBAAa0C,OAAO9B,MAAM+B,UAAU;;;;;;AAK/C;AAEA,SAAS1B,yBAAyBL,KAAoD;IACpF,OAAOA,MAAMA,KAAK,IAAIA,MAAMuB,MAAM;AACpC;AAEA,SAAShB,sBAAsBP,KAAoD;IACjF,OAAO;QAACA,MAAMuB,MAAM;QAAEvB,MAAMA,KAAK;KAAC,CAACgC,MAAM,CAACC,SAASC,IAAI,CAAC;AAC1D"}
@@ -28,11 +28,11 @@ import { useTriggerEventFacetsQuery, useTriggerEventsInfiniteQuery } from '#hook
28
28
  ]);
29
29
  return /*#__PURE__*/ _jsx(RelativeTimeProvider, {
30
30
  children: /*#__PURE__*/ _jsxs("section", {
31
- className: "@container flex min-w-0 flex-col gap-16",
31
+ className: "@container flex min-w-0 flex-col gap-group",
32
32
  "aria-labelledby": "trigger-events-heading",
33
33
  children: [
34
34
  /*#__PURE__*/ _jsxs("div", {
35
- className: "flex flex-col gap-4",
35
+ className: "flex flex-col gap-tight",
36
36
  children: [
37
37
  /*#__PURE__*/ _jsx(Header, {
38
38
  id: "trigger-events-heading",
@@ -47,7 +47,7 @@ import { useTriggerEventFacetsQuery, useTriggerEventsInfiniteQuery } from '#hook
47
47
  ]
48
48
  }),
49
49
  /*#__PURE__*/ _jsxs("div", {
50
- className: "grid min-h-0 items-start gap-16 @min-[820px]:grid-cols-[minmax(0,1fr)_minmax(360px,420px)]",
50
+ className: "grid min-h-0 items-start gap-group @min-[820px]:grid-cols-[minmax(0,1fr)_minmax(360px,420px)]",
51
51
  children: [
52
52
  /*#__PURE__*/ _jsx("div", {
53
53
  className: cn('min-w-0', selectedEventId && '@max-[820px]:hidden'),