@lateralus-ai/shipping-ui 2.0.0-dev.20 → 2.0.0-dev.21

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 (71) hide show
  1. package/dist/domain/Filters/FilterDropdown.d.ts +93 -0
  2. package/dist/domain/Filters/FilterPill.d.ts +12 -5
  3. package/dist/domain/Filters/FilterPills.d.ts +21 -0
  4. package/dist/domain/Filters/FilteredPill.d.ts +15 -5
  5. package/dist/domain/Filters/formatActiveFilterChipLabel.d.ts +11 -0
  6. package/dist/domain/Filters/index.d.ts +8 -3
  7. package/dist/index.cjs +33 -33
  8. package/dist/index.esm.js +7299 -5989
  9. package/package.json +2 -1
  10. package/src/components/EmptyState.tsx +44 -44
  11. package/src/components/Modal.tsx +141 -141
  12. package/src/components/PageHeader.tsx +132 -132
  13. package/src/components/ScrollableList.tsx +61 -61
  14. package/src/components/Tabs.tsx +146 -146
  15. package/src/components/index.ts +56 -56
  16. package/src/domain/Filters/FilterDropdown.tsx +438 -0
  17. package/src/domain/Filters/FilterPill.tsx +54 -18
  18. package/src/domain/Filters/FilterPills.tsx +41 -0
  19. package/src/domain/Filters/FilteredPill.tsx +40 -23
  20. package/src/domain/Filters/FiltersBar.tsx +15 -19
  21. package/src/domain/Filters/formatActiveFilterChipLabel.ts +23 -0
  22. package/src/domain/Filters/index.ts +35 -3
  23. package/src/icons/arrow-paths.ts +8 -8
  24. package/src/icons/chevron-paths.ts +17 -17
  25. package/src/icons/icons-data.ts +656 -656
  26. package/src/index.ts +85 -85
  27. package/src/patterns/Search/ResultRow.tsx +44 -44
  28. package/src/patterns/Search/SearchModal.tsx +310 -310
  29. package/src/patterns/Search/index.ts +31 -31
  30. package/src/patterns/Sidebar/assets/logo-compliance-mark.png +5 -5
  31. package/src/patterns/Sidebar/assets/logo-compliance-mask.png +13 -13
  32. package/src/patterns/Sidebar/assets/logo-compliance.svg +17 -17
  33. package/src/patterns/Sidebar/assets/logo-technical-avatar.svg +17 -17
  34. package/src/patterns/Sidebar/assets/logo-technical-mark.png +5 -5
  35. package/src/patterns/Sidebar/assets/logo-technical.svg +16 -16
  36. package/src/patterns/Skeleton/Skeleton.tsx +56 -56
  37. package/src/primitives/button-styles.ts +92 -92
  38. package/src/stories/canvases/ButtonsCanvas.tsx +107 -107
  39. package/src/stories/canvases/ButtonsMatrixCanvas.tsx +65 -65
  40. package/src/stories/canvases/ContentCanvas.tsx +353 -353
  41. package/src/stories/canvases/FiltersCanvas.tsx +156 -30
  42. package/src/stories/canvases/SearchCanvas.tsx +150 -150
  43. package/src/stories/canvases/figma-buttons-layout.ts +83 -83
  44. package/src/stories/canvases/figma-widths.ts +28 -28
  45. package/src/stories/canvases/helpers.tsx +146 -146
  46. package/src/stories/components/Buttons.stories.tsx +11 -11
  47. package/src/stories/components/Chat.stories.tsx +11 -11
  48. package/src/stories/components/Content.stories.tsx +11 -11
  49. package/src/stories/components/Core.stories.tsx +11 -11
  50. package/src/stories/components/DomainForms.stories.tsx +11 -11
  51. package/src/stories/components/Filters.stories.tsx +11 -11
  52. package/src/stories/components/Forms.stories.tsx +11 -11
  53. package/src/stories/components/Icons.stories.tsx +11 -11
  54. package/src/stories/components/Illustrations.stories.tsx +11 -11
  55. package/src/stories/components/Library.stories.tsx +11 -11
  56. package/src/stories/components/Modals.stories.tsx +11 -11
  57. package/src/stories/components/Report.stories.tsx +11 -11
  58. package/src/stories/components/ReportLayout.stories.tsx +11 -11
  59. package/src/stories/components/Search.stories.tsx +11 -11
  60. package/src/stories/components/Settings.stories.tsx +11 -11
  61. package/src/stories/components/Ships.stories.tsx +11 -11
  62. package/src/stories/components/SidebarLayouts.stories.tsx +11 -11
  63. package/src/stories/components/Skeletons.stories.tsx +11 -11
  64. package/src/stories/components/Workflows.stories.tsx +11 -11
  65. package/src/stories/style-guide/Buttons.stories.tsx +11 -11
  66. package/src/stories/style-guide/ColorTokens.stories.tsx +11 -11
  67. package/src/stories/style-guide/Colors.stories.tsx +11 -11
  68. package/src/stories/style-guide/RaiseLevels.stories.tsx +11 -11
  69. package/src/stories/style-guide/Typography.stories.tsx +11 -11
  70. package/src/tailwind-theme.ts +186 -186
  71. package/src/theme-entry.ts +2 -2
@@ -1,353 +1,353 @@
1
- import { Badge, Button, IconButton, Avatar } from "../../primitives";
2
- import {
3
- EmptyState,
4
- Entry,
5
- Header,
6
- PageHeader,
7
- ScrollableList,
8
- Tab,
9
- Tabs,
10
- TabsContent,
11
- TabsList,
12
- TabsTrigger,
13
- } from "../../components";
14
- import { FormsIcon, MoreIcon, ShipIcon, TickIcon } from "../../icons";
15
- import { WorkflowsIllustration } from "../../illustrations";
16
- import {
17
- FigmaContent,
18
- FigmaGrid,
19
- FigmaPage,
20
- FigmaSection,
21
- FigmaVariant,
22
- } from "../_layout";
23
- import { FIGMA_WIDTHS } from "./figma-widths";
24
-
25
- const demoActions = (
26
- <>
27
- <Button hierarchy="secondary">Button</Button>
28
- <IconButton hierarchy="tertiary" size="small" aria-label="More">
29
- <MoreIcon size="small" />
30
- </IconButton>
31
- </>
32
- );
33
-
34
- type DemoRow = {
35
- title: string;
36
- assignee?: string;
37
- unassigned?: boolean;
38
- signatures?: number[];
39
- date: string;
40
- vessel: string;
41
- initials: string;
42
- avatarClassName: string;
43
- };
44
-
45
- const DEMO_ROWS: DemoRow[] = [
46
- {
47
- title: "Cargo Tank Cleaning for Grade Change",
48
- assignee: "Dimitris Konstantinou",
49
- signatures: [1, 2, 3],
50
- date: "23/04/2026",
51
- vessel: "The Coral Explorer",
52
- initials: "MS",
53
- avatarClassName: "bg-purple-500 text-white",
54
- },
55
- {
56
- title: "Hot Work in Engine Room",
57
- assignee: "Dimitris Konstantinou",
58
- signatures: [1, 2, 3],
59
- date: "23/04/2026",
60
- vessel: "Ocean Voyager",
61
- initials: "PO",
62
- avatarClassName: "bg-blue-700 text-white",
63
- },
64
- {
65
- title: "Enclosed Space Entry in Ballast Tank",
66
- assignee: "Yiannis Papadopoulos",
67
- signatures: [1],
68
- date: "23/04/2026",
69
- vessel: "Ocean Voyager",
70
- initials: "PO",
71
- avatarClassName: "bg-blue-700 text-white",
72
- },
73
- {
74
- title: "Working at Height on Deck Crane",
75
- assignee: "Yiannis Papadopoulos",
76
- date: "23/04/2026",
77
- vessel: "Albatross Wind",
78
- initials: "LD",
79
- avatarClassName: "bg-grey-700 text-white",
80
- },
81
- {
82
- title: "Electrical Isolation for Switchboard Maintenance",
83
- assignee: "Dimitris Konstantinou",
84
- signatures: [1, 2, 3],
85
- date: "23/04/2026",
86
- vessel: "The Coral Explorer",
87
- initials: "MS",
88
- avatarClassName: "bg-purple-500 text-white",
89
- },
90
- {
91
- title: "Pilot Ladder Rigging in High Swell",
92
- unassigned: true,
93
- date: "23/04/2026",
94
- vessel: "Albatross Wind",
95
- initials: "",
96
- avatarClassName: "",
97
- },
98
- ];
99
-
100
- function DemoListRow({ row }: { row: DemoRow }) {
101
- return (
102
- <div className="flex h-12 w-full shrink-0 items-center gap-2 rounded-lg p-2">
103
- <FormsIcon size="large" className="shrink-0 text-display-on-light-primary" />
104
- <div className="flex min-w-0 flex-1 items-center gap-8">
105
- <div className="flex min-w-0 flex-1 items-center gap-2">
106
- <p className="shrink-0 truncate text-body text-display-on-light-primary">
107
- {row.title}
108
- </p>
109
- <div className="flex shrink-0 items-start gap-1">
110
- {row.unassigned ? (
111
- <Badge color="red">Unassigned</Badge>
112
- ) : row.assignee ? (
113
- <Badge color="grey">{row.assignee}</Badge>
114
- ) : null}
115
- {row.signatures?.map((n) => (
116
- <Badge key={n} color="orange" type="icon">
117
- {n}
118
- </Badge>
119
- ))}
120
- </div>
121
- </div>
122
- <div className="w-[90px] shrink-0 text-caption-2 text-display-on-light-secondary">
123
- {row.date}
124
- </div>
125
- <div className="w-[150px] shrink-0 truncate text-caption-2 text-display-on-light-secondary">
126
- {row.vessel}
127
- </div>
128
- {row.initials ? (
129
- <Avatar
130
- chief="initials"
131
- size={24}
132
- initials={row.initials}
133
- className={row.avatarClassName}
134
- />
135
- ) : (
136
- <span className="size-6 shrink-0" aria-hidden />
137
- )}
138
- </div>
139
- </div>
140
- );
141
- }
142
-
143
-
144
- export const ContentCanvas = () => (
145
- <FigmaPage title="Content" width={FIGMA_WIDTHS.content}>
146
- <FigmaContent>
147
- <FigmaSection label="Tab">
148
- <FigmaGrid gap={16}>
149
- <Tab label="Overview" />
150
- <Tab label="Tasks" state="active" />
151
- <Tab label="Reports" className="bg-background-hover" />
152
- </FigmaGrid>
153
- </FigmaSection>
154
-
155
- <FigmaSection label="Tabs">
156
- <div className="max-w-xl space-y-8">
157
- <FigmaVariant label="Underline">
158
- <Tabs defaultValue="all" type="tabs">
159
- <TabsList>
160
- <TabsTrigger value="all">All</TabsTrigger>
161
- <TabsTrigger value="reports">Reports</TabsTrigger>
162
- <TabsTrigger value="issues">Issues</TabsTrigger>
163
- </TabsList>
164
- <TabsContent
165
- value="all"
166
- className="pt-3 text-caption-2 text-display-on-light-secondary"
167
- >
168
- All content
169
- </TabsContent>
170
- <TabsContent
171
- value="reports"
172
- className="pt-3 text-caption-2 text-display-on-light-secondary"
173
- >
174
- Reports content
175
- </TabsContent>
176
- <TabsContent
177
- value="issues"
178
- className="pt-3 text-caption-2 text-display-on-light-secondary"
179
- >
180
- Issues content
181
- </TabsContent>
182
- </Tabs>
183
- </FigmaVariant>
184
- <FigmaVariant label="Pills · soft">
185
- <Tabs defaultValue="active" type="pills" appearance="soft">
186
- <TabsList>
187
- <TabsTrigger value="active">Active</TabsTrigger>
188
- <TabsTrigger value="completed">
189
- Completed
190
- <Badge color="blue">3</Badge>
191
- </TabsTrigger>
192
- </TabsList>
193
- <TabsContent
194
- value="active"
195
- className="pt-3 text-caption-2 text-display-on-light-secondary"
196
- >
197
- Active content
198
- </TabsContent>
199
- <TabsContent
200
- value="completed"
201
- className="pt-3 text-caption-2 text-display-on-light-secondary"
202
- >
203
- Completed content
204
- </TabsContent>
205
- </Tabs>
206
- </FigmaVariant>
207
- <FigmaVariant label="Pills · solid">
208
- <Tabs defaultValue="chat" type="pills" appearance="solid">
209
- <TabsList>
210
- <TabsTrigger value="chat">Chat</TabsTrigger>
211
- <TabsTrigger value="questions">
212
- Questions
213
- <Badge color="grey">208</Badge>
214
- </TabsTrigger>
215
- <TabsTrigger value="review">
216
- Review
217
- <Badge color="green" type="icon">
218
- <TickIcon size="xs" />
219
- </Badge>
220
- </TabsTrigger>
221
- <TabsTrigger value="gaps">
222
- Gaps
223
- <Badge color="grey">47</Badge>
224
- </TabsTrigger>
225
- </TabsList>
226
- </Tabs>
227
- </FigmaVariant>
228
- </div>
229
- </FigmaSection>
230
-
231
- <FigmaSection label="PageHeader">
232
- <div className="max-w-[1120px] space-y-8">
233
- <FigmaVariant label="Standard">
234
- <PageHeader
235
- icon={<ShipIcon size="large" />}
236
- title="Title"
237
- actions={demoActions}
238
- />
239
- </FigmaVariant>
240
- <FigmaVariant label="Nested">
241
- <PageHeader
242
- icon={<ShipIcon size="large" />}
243
- title="Title"
244
- crumbs={[{ label: "Parent", href: "#parent" }]}
245
- actions={demoActions}
246
- />
247
- </FigmaVariant>
248
- <FigmaVariant label="Shell (pinned header)">
249
- <div className="h-64 overflow-hidden rounded-control border border-divider-primary">
250
- <PageHeader.Shell className="bg-background-primary p-4">
251
- <PageHeader
252
- icon={<ShipIcon size="large" />}
253
- title="Fleet"
254
- crumbs={[{ label: "Ships", href: "#ships" }]}
255
- actions={demoActions}
256
- />
257
- <PageHeader.Body className="mt-4 space-y-2 text-caption-2 text-display-on-light-secondary">
258
- {Array.from({ length: 20 }, (_, i) => (
259
- <p key={i}>Scrollable body line {i + 1}</p>
260
- ))}
261
- </PageHeader.Body>
262
- </PageHeader.Shell>
263
- </div>
264
- </FigmaVariant>
265
- </div>
266
- </FigmaSection>
267
-
268
- <FigmaSection label="ScrollableList (Table)">
269
- <FigmaVariant label="Column header + scrolling body">
270
- <div className="flex h-[420px] w-full max-w-[960px] flex-col">
271
- <ScrollableList>
272
- <ScrollableList.Header>
273
- <span className="min-w-0 flex-1">Title</span>
274
- <span className="w-[90px] shrink-0">Date</span>
275
- <span className="w-[210px] shrink-0">Vessel</span>
276
- </ScrollableList.Header>
277
- <ScrollableList.Body>
278
- {DEMO_ROWS.map((row) => (
279
- <DemoListRow key={row.title} row={row} />
280
- ))}
281
- </ScrollableList.Body>
282
- </ScrollableList>
283
- </div>
284
- </FigmaVariant>
285
- </FigmaSection>
286
-
287
- <FigmaSection label="Header (legacy)">
288
- <div className="max-w-xl space-y-4">
289
- <Header title="Fleet overview" />
290
- <Header
291
- variant="nested"
292
- title="Outstanding actions"
293
- actions={<Button hierarchy="primary">Add</Button>}
294
- />
295
- </div>
296
- </FigmaSection>
297
-
298
- <FigmaSection label="Entry">
299
- <div className="max-w-xl space-y-2">
300
- <Entry
301
- variant="chat"
302
- title="Hull inspection report"
303
- subtitle="We’ve got a persistent oil leak from the fuel pump."
304
- />
305
- <Entry
306
- variant="chat"
307
- state="active"
308
- title="Ballast Pump Not Starting"
309
- subtitle="The fuel pump won’t start consistently."
310
- trailing={
311
- <span className="text-display-on-light-secondary">···</span>
312
- }
313
- />
314
- <Entry
315
- variant="issue"
316
- title="Excessive Rust on Fuel Pump"
317
- subtitle="Created by Jake Silva on March 28"
318
- count={3}
319
- />
320
- <Entry
321
- variant="report"
322
- title="Engine Room Oil Leak"
323
- subtitle="We’ve spotted a steady oil leak near the fuel pump."
324
- />
325
- </div>
326
- </FigmaSection>
327
-
328
- <FigmaSection label="Empty State">
329
- <FigmaGrid gap={32}>
330
- <FigmaVariant label="Default">
331
- <div className="w-80">
332
- <EmptyState
333
- title="No workflows yet"
334
- description="Create your first workflow to get started."
335
- />
336
- </div>
337
- </FigmaVariant>
338
- <FigmaVariant label="With illustration">
339
- <div className="w-80">
340
- <EmptyState
341
- title="No reports"
342
- illustration={
343
- <WorkflowsIllustration className="mx-auto h-24 w-32" />
344
- }
345
- action={{ children: "Create report", hierarchy: "primary" }}
346
- />
347
- </div>
348
- </FigmaVariant>
349
- </FigmaGrid>
350
- </FigmaSection>
351
- </FigmaContent>
352
- </FigmaPage>
353
- );
1
+ import { Badge, Button, IconButton, Avatar } from "../../primitives";
2
+ import {
3
+ EmptyState,
4
+ Entry,
5
+ Header,
6
+ PageHeader,
7
+ ScrollableList,
8
+ Tab,
9
+ Tabs,
10
+ TabsContent,
11
+ TabsList,
12
+ TabsTrigger,
13
+ } from "../../components";
14
+ import { FormsIcon, MoreIcon, ShipIcon, TickIcon } from "../../icons";
15
+ import { WorkflowsIllustration } from "../../illustrations";
16
+ import {
17
+ FigmaContent,
18
+ FigmaGrid,
19
+ FigmaPage,
20
+ FigmaSection,
21
+ FigmaVariant,
22
+ } from "../_layout";
23
+ import { FIGMA_WIDTHS } from "./figma-widths";
24
+
25
+ const demoActions = (
26
+ <>
27
+ <Button hierarchy="secondary">Button</Button>
28
+ <IconButton hierarchy="tertiary" size="small" aria-label="More">
29
+ <MoreIcon size="small" />
30
+ </IconButton>
31
+ </>
32
+ );
33
+
34
+ type DemoRow = {
35
+ title: string;
36
+ assignee?: string;
37
+ unassigned?: boolean;
38
+ signatures?: number[];
39
+ date: string;
40
+ vessel: string;
41
+ initials: string;
42
+ avatarClassName: string;
43
+ };
44
+
45
+ const DEMO_ROWS: DemoRow[] = [
46
+ {
47
+ title: "Cargo Tank Cleaning for Grade Change",
48
+ assignee: "Dimitris Konstantinou",
49
+ signatures: [1, 2, 3],
50
+ date: "23/04/2026",
51
+ vessel: "The Coral Explorer",
52
+ initials: "MS",
53
+ avatarClassName: "bg-purple-500 text-white",
54
+ },
55
+ {
56
+ title: "Hot Work in Engine Room",
57
+ assignee: "Dimitris Konstantinou",
58
+ signatures: [1, 2, 3],
59
+ date: "23/04/2026",
60
+ vessel: "Ocean Voyager",
61
+ initials: "PO",
62
+ avatarClassName: "bg-blue-700 text-white",
63
+ },
64
+ {
65
+ title: "Enclosed Space Entry in Ballast Tank",
66
+ assignee: "Yiannis Papadopoulos",
67
+ signatures: [1],
68
+ date: "23/04/2026",
69
+ vessel: "Ocean Voyager",
70
+ initials: "PO",
71
+ avatarClassName: "bg-blue-700 text-white",
72
+ },
73
+ {
74
+ title: "Working at Height on Deck Crane",
75
+ assignee: "Yiannis Papadopoulos",
76
+ date: "23/04/2026",
77
+ vessel: "Albatross Wind",
78
+ initials: "LD",
79
+ avatarClassName: "bg-grey-700 text-white",
80
+ },
81
+ {
82
+ title: "Electrical Isolation for Switchboard Maintenance",
83
+ assignee: "Dimitris Konstantinou",
84
+ signatures: [1, 2, 3],
85
+ date: "23/04/2026",
86
+ vessel: "The Coral Explorer",
87
+ initials: "MS",
88
+ avatarClassName: "bg-purple-500 text-white",
89
+ },
90
+ {
91
+ title: "Pilot Ladder Rigging in High Swell",
92
+ unassigned: true,
93
+ date: "23/04/2026",
94
+ vessel: "Albatross Wind",
95
+ initials: "",
96
+ avatarClassName: "",
97
+ },
98
+ ];
99
+
100
+ function DemoListRow({ row }: { row: DemoRow }) {
101
+ return (
102
+ <div className="flex h-12 w-full shrink-0 items-center gap-2 rounded-lg p-2">
103
+ <FormsIcon size="large" className="shrink-0 text-display-on-light-primary" />
104
+ <div className="flex min-w-0 flex-1 items-center gap-8">
105
+ <div className="flex min-w-0 flex-1 items-center gap-2">
106
+ <p className="shrink-0 truncate text-body text-display-on-light-primary">
107
+ {row.title}
108
+ </p>
109
+ <div className="flex shrink-0 items-start gap-1">
110
+ {row.unassigned ? (
111
+ <Badge color="red">Unassigned</Badge>
112
+ ) : row.assignee ? (
113
+ <Badge color="grey">{row.assignee}</Badge>
114
+ ) : null}
115
+ {row.signatures?.map((n) => (
116
+ <Badge key={n} color="orange" type="icon">
117
+ {n}
118
+ </Badge>
119
+ ))}
120
+ </div>
121
+ </div>
122
+ <div className="w-[90px] shrink-0 text-caption-2 text-display-on-light-secondary">
123
+ {row.date}
124
+ </div>
125
+ <div className="w-[150px] shrink-0 truncate text-caption-2 text-display-on-light-secondary">
126
+ {row.vessel}
127
+ </div>
128
+ {row.initials ? (
129
+ <Avatar
130
+ chief="initials"
131
+ size={24}
132
+ initials={row.initials}
133
+ className={row.avatarClassName}
134
+ />
135
+ ) : (
136
+ <span className="size-6 shrink-0" aria-hidden />
137
+ )}
138
+ </div>
139
+ </div>
140
+ );
141
+ }
142
+
143
+
144
+ export const ContentCanvas = () => (
145
+ <FigmaPage title="Content" width={FIGMA_WIDTHS.content}>
146
+ <FigmaContent>
147
+ <FigmaSection label="Tab">
148
+ <FigmaGrid gap={16}>
149
+ <Tab label="Overview" />
150
+ <Tab label="Tasks" state="active" />
151
+ <Tab label="Reports" className="bg-background-hover" />
152
+ </FigmaGrid>
153
+ </FigmaSection>
154
+
155
+ <FigmaSection label="Tabs">
156
+ <div className="max-w-xl space-y-8">
157
+ <FigmaVariant label="Underline">
158
+ <Tabs defaultValue="all" type="tabs">
159
+ <TabsList>
160
+ <TabsTrigger value="all">All</TabsTrigger>
161
+ <TabsTrigger value="reports">Reports</TabsTrigger>
162
+ <TabsTrigger value="issues">Issues</TabsTrigger>
163
+ </TabsList>
164
+ <TabsContent
165
+ value="all"
166
+ className="pt-3 text-caption-2 text-display-on-light-secondary"
167
+ >
168
+ All content
169
+ </TabsContent>
170
+ <TabsContent
171
+ value="reports"
172
+ className="pt-3 text-caption-2 text-display-on-light-secondary"
173
+ >
174
+ Reports content
175
+ </TabsContent>
176
+ <TabsContent
177
+ value="issues"
178
+ className="pt-3 text-caption-2 text-display-on-light-secondary"
179
+ >
180
+ Issues content
181
+ </TabsContent>
182
+ </Tabs>
183
+ </FigmaVariant>
184
+ <FigmaVariant label="Pills · soft">
185
+ <Tabs defaultValue="active" type="pills" appearance="soft">
186
+ <TabsList>
187
+ <TabsTrigger value="active">Active</TabsTrigger>
188
+ <TabsTrigger value="completed">
189
+ Completed
190
+ <Badge color="blue">3</Badge>
191
+ </TabsTrigger>
192
+ </TabsList>
193
+ <TabsContent
194
+ value="active"
195
+ className="pt-3 text-caption-2 text-display-on-light-secondary"
196
+ >
197
+ Active content
198
+ </TabsContent>
199
+ <TabsContent
200
+ value="completed"
201
+ className="pt-3 text-caption-2 text-display-on-light-secondary"
202
+ >
203
+ Completed content
204
+ </TabsContent>
205
+ </Tabs>
206
+ </FigmaVariant>
207
+ <FigmaVariant label="Pills · solid">
208
+ <Tabs defaultValue="chat" type="pills" appearance="solid">
209
+ <TabsList>
210
+ <TabsTrigger value="chat">Chat</TabsTrigger>
211
+ <TabsTrigger value="questions">
212
+ Questions
213
+ <Badge color="grey">208</Badge>
214
+ </TabsTrigger>
215
+ <TabsTrigger value="review">
216
+ Review
217
+ <Badge color="green" type="icon">
218
+ <TickIcon size="xs" />
219
+ </Badge>
220
+ </TabsTrigger>
221
+ <TabsTrigger value="gaps">
222
+ Gaps
223
+ <Badge color="grey">47</Badge>
224
+ </TabsTrigger>
225
+ </TabsList>
226
+ </Tabs>
227
+ </FigmaVariant>
228
+ </div>
229
+ </FigmaSection>
230
+
231
+ <FigmaSection label="PageHeader">
232
+ <div className="max-w-[1120px] space-y-8">
233
+ <FigmaVariant label="Standard">
234
+ <PageHeader
235
+ icon={<ShipIcon size="large" />}
236
+ title="Title"
237
+ actions={demoActions}
238
+ />
239
+ </FigmaVariant>
240
+ <FigmaVariant label="Nested">
241
+ <PageHeader
242
+ icon={<ShipIcon size="large" />}
243
+ title="Title"
244
+ crumbs={[{ label: "Parent", href: "#parent" }]}
245
+ actions={demoActions}
246
+ />
247
+ </FigmaVariant>
248
+ <FigmaVariant label="Shell (pinned header)">
249
+ <div className="h-64 overflow-hidden rounded-control border border-divider-primary">
250
+ <PageHeader.Shell className="bg-background-primary p-4">
251
+ <PageHeader
252
+ icon={<ShipIcon size="large" />}
253
+ title="Fleet"
254
+ crumbs={[{ label: "Ships", href: "#ships" }]}
255
+ actions={demoActions}
256
+ />
257
+ <PageHeader.Body className="mt-4 space-y-2 text-caption-2 text-display-on-light-secondary">
258
+ {Array.from({ length: 20 }, (_, i) => (
259
+ <p key={i}>Scrollable body line {i + 1}</p>
260
+ ))}
261
+ </PageHeader.Body>
262
+ </PageHeader.Shell>
263
+ </div>
264
+ </FigmaVariant>
265
+ </div>
266
+ </FigmaSection>
267
+
268
+ <FigmaSection label="ScrollableList (Table)">
269
+ <FigmaVariant label="Column header + scrolling body">
270
+ <div className="flex h-[420px] w-full max-w-[960px] flex-col">
271
+ <ScrollableList>
272
+ <ScrollableList.Header>
273
+ <span className="min-w-0 flex-1">Title</span>
274
+ <span className="w-[90px] shrink-0">Date</span>
275
+ <span className="w-[210px] shrink-0">Vessel</span>
276
+ </ScrollableList.Header>
277
+ <ScrollableList.Body>
278
+ {DEMO_ROWS.map((row) => (
279
+ <DemoListRow key={row.title} row={row} />
280
+ ))}
281
+ </ScrollableList.Body>
282
+ </ScrollableList>
283
+ </div>
284
+ </FigmaVariant>
285
+ </FigmaSection>
286
+
287
+ <FigmaSection label="Header (legacy)">
288
+ <div className="max-w-xl space-y-4">
289
+ <Header title="Fleet overview" />
290
+ <Header
291
+ variant="nested"
292
+ title="Outstanding actions"
293
+ actions={<Button hierarchy="primary">Add</Button>}
294
+ />
295
+ </div>
296
+ </FigmaSection>
297
+
298
+ <FigmaSection label="Entry">
299
+ <div className="max-w-xl space-y-2">
300
+ <Entry
301
+ variant="chat"
302
+ title="Hull inspection report"
303
+ subtitle="We’ve got a persistent oil leak from the fuel pump."
304
+ />
305
+ <Entry
306
+ variant="chat"
307
+ state="active"
308
+ title="Ballast Pump Not Starting"
309
+ subtitle="The fuel pump won’t start consistently."
310
+ trailing={
311
+ <span className="text-display-on-light-secondary">···</span>
312
+ }
313
+ />
314
+ <Entry
315
+ variant="issue"
316
+ title="Excessive Rust on Fuel Pump"
317
+ subtitle="Created by Jake Silva on March 28"
318
+ count={3}
319
+ />
320
+ <Entry
321
+ variant="report"
322
+ title="Engine Room Oil Leak"
323
+ subtitle="We’ve spotted a steady oil leak near the fuel pump."
324
+ />
325
+ </div>
326
+ </FigmaSection>
327
+
328
+ <FigmaSection label="Empty State">
329
+ <FigmaGrid gap={32}>
330
+ <FigmaVariant label="Default">
331
+ <div className="w-80">
332
+ <EmptyState
333
+ title="No workflows yet"
334
+ description="Create your first workflow to get started."
335
+ />
336
+ </div>
337
+ </FigmaVariant>
338
+ <FigmaVariant label="With illustration">
339
+ <div className="w-80">
340
+ <EmptyState
341
+ title="No reports"
342
+ illustration={
343
+ <WorkflowsIllustration className="mx-auto h-24 w-32" />
344
+ }
345
+ action={{ children: "Create report", hierarchy: "primary" }}
346
+ />
347
+ </div>
348
+ </FigmaVariant>
349
+ </FigmaGrid>
350
+ </FigmaSection>
351
+ </FigmaContent>
352
+ </FigmaPage>
353
+ );