@lateralus-ai/shipping-ui 2.0.0-dev.0 → 2.0.0-dev.10

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 (80) hide show
  1. package/dist/components/EmptyState.d.ts +1 -1
  2. package/dist/components/Entry.d.ts +27 -7
  3. package/dist/components/Modal.d.ts +36 -0
  4. package/dist/components/Tabs.d.ts +23 -8
  5. package/dist/components/index.d.ts +3 -2
  6. package/dist/index.cjs +32 -32
  7. package/dist/index.d.ts +2 -2
  8. package/dist/index.esm.js +4406 -3917
  9. package/dist/patterns/Search/ResultRow.d.ts +16 -7
  10. package/dist/patterns/Search/SearchModal.d.ts +84 -2
  11. package/dist/patterns/Search/index.d.ts +2 -2
  12. package/dist/primitives/Badge.d.ts +7 -4
  13. package/dist/primitives/Button.d.ts +17 -8
  14. package/dist/primitives/button-styles.d.ts +4 -0
  15. package/dist/primitives/index.d.ts +4 -2
  16. package/dist/style.css +1 -1
  17. package/dist/tailwind-theme.d.ts +4 -4
  18. package/dist/theme-entry-BUK3MJUJ.mjs +261 -0
  19. package/dist/theme-entry-ygTpGaNC.js +1 -0
  20. package/dist/theme-entry.d.ts +2 -0
  21. package/dist/theme.cjs +1 -0
  22. package/dist/theme.d.ts +2 -0
  23. package/dist/theme.esm.js +5 -0
  24. package/package.json +10 -3
  25. package/src/components/EmptyState.tsx +2 -2
  26. package/src/components/Entry.tsx +119 -45
  27. package/src/components/Modal.tsx +141 -0
  28. package/src/components/Tabs.tsx +146 -48
  29. package/src/components/index.ts +43 -13
  30. package/src/icons/arrow-paths.ts +8 -8
  31. package/src/icons/chevron-paths.ts +17 -17
  32. package/src/icons/icons-data.ts +656 -656
  33. package/src/index.ts +76 -50
  34. package/src/patterns/Search/ResultRow.tsx +44 -52
  35. package/src/patterns/Search/SearchModal.tsx +310 -88
  36. package/src/patterns/Search/index.ts +31 -5
  37. package/src/patterns/Sidebar/assets/logo-compliance-mark.png +5 -5
  38. package/src/patterns/Sidebar/assets/logo-compliance-mask.png +13 -13
  39. package/src/patterns/Sidebar/assets/logo-compliance.svg +17 -17
  40. package/src/patterns/Sidebar/assets/logo-technical-avatar.svg +17 -17
  41. package/src/patterns/Sidebar/assets/logo-technical-mark.png +5 -5
  42. package/src/patterns/Sidebar/assets/logo-technical.svg +16 -16
  43. package/src/patterns/Skeleton/Skeleton.tsx +56 -57
  44. package/src/primitives/Badge.tsx +20 -10
  45. package/src/primitives/Button.tsx +201 -37
  46. package/src/primitives/button-styles.ts +92 -0
  47. package/src/primitives/index.ts +7 -2
  48. package/src/stories/canvases/ButtonsCanvas.tsx +94 -44
  49. package/src/stories/canvases/ButtonsMatrixCanvas.tsx +8 -7
  50. package/src/stories/canvases/ContentCanvas.tsx +157 -88
  51. package/src/stories/canvases/SearchCanvas.tsx +150 -65
  52. package/src/stories/canvases/figma-buttons-layout.ts +83 -0
  53. package/src/stories/canvases/helpers.tsx +26 -43
  54. package/src/stories/components/Buttons.stories.tsx +11 -11
  55. package/src/stories/components/Chat.stories.tsx +11 -11
  56. package/src/stories/components/Content.stories.tsx +11 -11
  57. package/src/stories/components/Core.stories.tsx +11 -11
  58. package/src/stories/components/DomainForms.stories.tsx +11 -11
  59. package/src/stories/components/Filters.stories.tsx +11 -11
  60. package/src/stories/components/Forms.stories.tsx +11 -11
  61. package/src/stories/components/Icons.stories.tsx +11 -11
  62. package/src/stories/components/Illustrations.stories.tsx +11 -11
  63. package/src/stories/components/Library.stories.tsx +11 -11
  64. package/src/stories/components/Modals.stories.tsx +11 -11
  65. package/src/stories/components/Report.stories.tsx +11 -11
  66. package/src/stories/components/ReportLayout.stories.tsx +11 -11
  67. package/src/stories/components/Search.stories.tsx +11 -11
  68. package/src/stories/components/Settings.stories.tsx +11 -11
  69. package/src/stories/components/Ships.stories.tsx +11 -11
  70. package/src/stories/components/SidebarLayouts.stories.tsx +11 -11
  71. package/src/stories/components/Skeletons.stories.tsx +11 -11
  72. package/src/stories/components/Workflows.stories.tsx +11 -11
  73. package/src/stories/style-guide/Buttons.stories.tsx +11 -11
  74. package/src/stories/style-guide/ColorTokens.stories.tsx +11 -11
  75. package/src/stories/style-guide/Colors.stories.tsx +11 -11
  76. package/src/stories/style-guide/RaiseLevels.stories.tsx +11 -11
  77. package/src/stories/style-guide/Typography.stories.tsx +11 -11
  78. package/src/tailwind-theme.ts +4 -4
  79. package/src/theme-entry.ts +2 -0
  80. package/tailwind.config.ts +12 -0
@@ -0,0 +1,92 @@
1
+ export type ButtonHierarchy =
2
+ | "primary"
3
+ | "secondary"
4
+ | "tertiary"
5
+ | "quaternary"
6
+ | "destructive";
7
+
8
+ export type ButtonAppearance = "idle" | "hover" | "disabled";
9
+
10
+ type HierarchyStyleMap = Record<ButtonAppearance, string>;
11
+
12
+ const primaryStyles: HierarchyStyleMap = {
13
+ idle: "bg-action-primary-idle text-action-primary-on-idle",
14
+ hover: "bg-action-primary-hover text-action-primary-on-hover",
15
+ disabled: "bg-action-primary-disabled text-action-primary-on-disabled",
16
+ };
17
+
18
+ const secondaryStyles: HierarchyStyleMap = {
19
+ idle:
20
+ "border border-divider-primary bg-action-secondary-idle text-action-secondary-on-idle",
21
+ hover:
22
+ "border border-divider-secondary bg-action-secondary-hover text-action-secondary-on-hover",
23
+ disabled:
24
+ "border border-divider-primary bg-action-secondary-disabled text-action-secondary-on-disabled",
25
+ };
26
+
27
+ const tertiaryStyles: HierarchyStyleMap = {
28
+ idle: "bg-action-tertiary-idle text-action-tertiary-on-idle",
29
+ hover: "bg-action-tertiary-hover text-action-tertiary-on-hover",
30
+ disabled: "bg-action-tertiary-disabled text-action-tertiary-on-disabled",
31
+ };
32
+
33
+ const quaternaryStyles: HierarchyStyleMap = {
34
+ idle: "bg-action-quaternary-idle text-action-quaternary-on-idle",
35
+ hover: "bg-action-quaternary-hover text-action-quaternary-on-hover",
36
+ disabled: "bg-action-quaternary-disabled text-action-quaternary-on-disabled",
37
+ };
38
+
39
+ const destructiveStyles: HierarchyStyleMap = {
40
+ idle: "bg-action-destructive-idle text-action-destructive-on-idle",
41
+ hover: "bg-action-destructive-hover text-action-destructive-on-hover",
42
+ disabled:
43
+ "bg-action-destructive-disabled text-action-destructive-on-disabled",
44
+ };
45
+
46
+ const hierarchyStyles: Record<ButtonHierarchy, HierarchyStyleMap> = {
47
+ primary: primaryStyles,
48
+ secondary: secondaryStyles,
49
+ tertiary: tertiaryStyles,
50
+ quaternary: quaternaryStyles,
51
+ destructive: destructiveStyles,
52
+ };
53
+
54
+ const interactiveHierarchyStyles: Record<ButtonHierarchy, string> = {
55
+ primary:
56
+ "bg-action-primary-idle text-action-primary-on-idle hover:bg-action-primary-hover hover:text-action-primary-on-hover",
57
+ secondary:
58
+ "border border-divider-primary bg-action-secondary-idle text-action-secondary-on-idle hover:border-divider-secondary hover:bg-action-secondary-hover hover:text-action-secondary-on-hover",
59
+ tertiary:
60
+ "bg-action-tertiary-idle text-action-tertiary-on-idle hover:bg-action-tertiary-hover hover:text-action-tertiary-on-hover",
61
+ quaternary:
62
+ "bg-action-quaternary-idle text-action-quaternary-on-idle hover:bg-action-quaternary-hover hover:text-action-quaternary-on-hover",
63
+ destructive:
64
+ "bg-action-destructive-idle text-action-destructive-on-idle hover:bg-action-destructive-hover hover:text-action-destructive-on-hover",
65
+ };
66
+
67
+ const disabledHierarchyStyles: Record<ButtonHierarchy, string> = {
68
+ primary: "bg-action-primary-disabled text-action-primary-on-disabled",
69
+ secondary:
70
+ "border border-divider-primary bg-action-secondary-disabled text-action-secondary-on-disabled",
71
+ tertiary: "bg-action-tertiary-disabled text-action-tertiary-on-disabled",
72
+ quaternary:
73
+ "bg-action-quaternary-disabled text-action-quaternary-on-disabled",
74
+ destructive:
75
+ "bg-action-destructive-disabled text-action-destructive-on-disabled",
76
+ };
77
+
78
+ export const getButtonAppearanceClasses = (
79
+ hierarchy: ButtonHierarchy,
80
+ appearance: ButtonAppearance,
81
+ ) => hierarchyStyles[hierarchy][appearance];
82
+
83
+ export const getButtonInteractiveClasses = (
84
+ hierarchy: ButtonHierarchy,
85
+ disabled: boolean,
86
+ ) => {
87
+ if (disabled) {
88
+ return disabledHierarchyStyles[hierarchy];
89
+ }
90
+
91
+ return interactiveHierarchyStyles[hierarchy];
92
+ };
@@ -1,4 +1,9 @@
1
- export { Button, type ButtonProps } from "./Button";
1
+ export type {
2
+ ButtonAppearance,
3
+ ButtonHierarchy,
4
+ } from "./button-styles";
5
+ export type { ButtonProps, ButtonDropdownOption } from "./Button";
6
+ export { Button } from "./Button";
2
7
  export { IconButton, type IconButtonProps } from "./IconButton";
3
8
  export { Logo, type LogoProps } from "./Logo";
4
9
  export { Avatar, type AvatarProps } from "./Avatar";
@@ -9,5 +14,5 @@ export { Tooltip, TooltipProvider, type TooltipProps, type TooltipSide } from ".
9
14
  export { ThinkingDot, type ThinkingDotProps } from "./ThinkingDot";
10
15
  export { Count, type CountProps } from "./Count";
11
16
  export { Switch, type SwitchProps } from "./Switch";
12
- export { Badge, type BadgeProps } from "./Badge";
17
+ export { Badge, type BadgeProps, type BadgeColor, type BadgeType } from "./Badge";
13
18
  export { Callout, type CalloutProps } from "./Callout";
@@ -1,57 +1,107 @@
1
- import {
2
- FigmaContent,
3
- FigmaGrid,
4
- FigmaPage,
5
- FigmaSection,
6
- } from "../_layout";
7
- import { ButtonSnapshot } from "./helpers";
1
+ import { AttachmentIcon } from "../../icons";
2
+ import { Button } from "../../primitives";
3
+ import { FigmaContent, FigmaPage, FigmaSection } from "../_layout";
8
4
  import { FIGMA_WIDTHS } from "./figma-widths";
5
+ import {
6
+ BUTTON_VARIANT_SLOTS,
7
+ FIGMA_BUTTON_SLOTS,
8
+ FIGMA_BUTTONS_CANVAS,
9
+ FIGMA_BUTTONS_GRID,
10
+ type ButtonVisualState,
11
+ } from "./figma-buttons-layout";
12
+ import { IconButtonSnapshot } from "./helpers";
13
+
14
+ const demoDropdownOptions = [
15
+ { label: "Option A", onSelect: () => undefined },
16
+ { label: "Option B", onSelect: () => undefined },
17
+ ];
9
18
 
10
- const hierarchies = ["primary", "secondary", "tertiary", "quaternary"] as const;
19
+ const slotProps = (visualState: ButtonVisualState) => ({
20
+ forcedState: visualState === "idle" ? undefined : visualState,
21
+ disabled: visualState === "disabled",
22
+ });
11
23
 
12
24
  export const ButtonsCanvas = () => (
13
25
  <FigmaPage title="Buttons" width={FIGMA_WIDTHS.buttons}>
14
- <FigmaContent>
15
- <FigmaSection label="Button">
16
- <FigmaGrid gap={24}>
17
- {hierarchies.map((hierarchy) => (
18
- <div key={hierarchy} className="flex flex-col gap-4">
19
- {(["idle", "hover", "disabled"] as const).map((state) => (
20
- <ButtonSnapshot key={state} hierarchy={hierarchy} visualState={state} />
26
+ <FigmaContent padding={0}>
27
+ <div className="px-8 pb-8 pt-6">
28
+ <FigmaSection label="Button">
29
+ <div
30
+ className="relative"
31
+ style={{
32
+ width: FIGMA_BUTTONS_CANVAS.width,
33
+ height: FIGMA_BUTTONS_CANVAS.height,
34
+ }}
35
+ >
36
+ <div
37
+ data-figma-buttons-grid
38
+ className="absolute left-0 top-0"
39
+ style={{
40
+ width: FIGMA_BUTTONS_GRID.width,
41
+ height: FIGMA_BUTTONS_GRID.height,
42
+ }}
43
+ >
44
+ {FIGMA_BUTTON_SLOTS.map((slot) => (
45
+ <div
46
+ key={`${slot.hierarchy}-${slot.visualState}`}
47
+ className="absolute"
48
+ style={{ left: slot.x, top: slot.y }}
49
+ >
50
+ <Button
51
+ hierarchy={slot.hierarchy}
52
+ icon={AttachmentIcon}
53
+ dropdownOptions={demoDropdownOptions}
54
+ {...slotProps(slot.visualState)}
55
+ >
56
+ Button
57
+ </Button>
58
+ </div>
21
59
  ))}
22
60
  </div>
23
- ))}
24
- <div className="flex flex-col gap-4">
25
- {(["idle", "hover", "disabled"] as const).map((state) => (
26
- <ButtonSnapshot
27
- key={state}
28
- hierarchy="primary"
29
- outcome="destructive"
30
- visualState={state}
31
- />
61
+
62
+ {BUTTON_VARIANT_SLOTS.map((slot) => (
63
+ <div
64
+ key={`${slot.hierarchy}-${slot.variant}`}
65
+ data-visual-test-only
66
+ className="absolute"
67
+ style={{ left: slot.x, top: slot.y }}
68
+ >
69
+ {slot.variant === "noIcon" ? (
70
+ <Button
71
+ hierarchy={slot.hierarchy}
72
+ dropdownOptions={demoDropdownOptions}
73
+ >
74
+ Button
75
+ </Button>
76
+ ) : (
77
+ <Button hierarchy={slot.hierarchy} icon={AttachmentIcon}>
78
+ Button
79
+ </Button>
80
+ )}
81
+ </div>
32
82
  ))}
33
83
  </div>
34
- </FigmaGrid>
35
- </FigmaSection>
84
+ </FigmaSection>
36
85
 
37
- <FigmaSection label="Icon Button">
38
- <FigmaGrid gap={24}>
39
- <ButtonSnapshot hierarchy="tertiary" visualState="idle" />
40
- <ButtonSnapshot hierarchy="tertiary" visualState="hover" />
41
- <ButtonSnapshot hierarchy="quaternary" visualState="idle" />
42
- <ButtonSnapshot hierarchy="quaternary" visualState="hover" />
43
- <span className="inline-flex size-8 items-center justify-center rounded-control bg-action-quaternary-idle text-action-quaternary-on-idle">
44
- <svg viewBox="0 0 16 16" className="size-4" fill="none" stroke="currentColor" strokeWidth="1.5" aria-hidden>
45
- <path d="M8 3.33v9.34M3.33 8h9.34" strokeLinecap="round" />
46
- </svg>
47
- </span>
48
- <span className="inline-flex size-8 items-center justify-center rounded-control bg-action-quaternary-hover text-action-quaternary-on-hover">
49
- <svg viewBox="0 0 16 16" className="size-4" fill="none" stroke="currentColor" strokeWidth="1.5" aria-hidden>
50
- <path d="M8 3.33v9.34M3.33 8h9.34" strokeLinecap="round" />
51
- </svg>
52
- </span>
53
- </FigmaGrid>
54
- </FigmaSection>
86
+ <FigmaSection label="Icon Button" className="mt-8">
87
+ <div className="flex flex-wrap items-center gap-6">
88
+ <IconButtonSnapshot hierarchy="tertiary" visualState="idle" />
89
+ <IconButtonSnapshot hierarchy="tertiary" visualState="hover" />
90
+ <IconButtonSnapshot hierarchy="quaternary" visualState="idle" />
91
+ <IconButtonSnapshot hierarchy="quaternary" visualState="hover" />
92
+ <IconButtonSnapshot
93
+ hierarchy="quaternary"
94
+ visualState="idle"
95
+ size="small"
96
+ />
97
+ <IconButtonSnapshot
98
+ hierarchy="quaternary"
99
+ visualState="hover"
100
+ size="small"
101
+ />
102
+ </div>
103
+ </FigmaSection>
104
+ </div>
55
105
  </FigmaContent>
56
106
  </FigmaPage>
57
107
  );
@@ -9,7 +9,13 @@ import {
9
9
  import { ButtonSnapshot } from "./helpers";
10
10
  import { FIGMA_WIDTHS } from "./figma-widths";
11
11
 
12
- const hierarchies = ["primary", "secondary", "tertiary", "quaternary"] as const;
12
+ const hierarchies = [
13
+ "primary",
14
+ "secondary",
15
+ "tertiary",
16
+ "quaternary",
17
+ "destructive",
18
+ ] as const;
13
19
  const columnLabels = ["Primary", "Secondary", "Tertiary", "Quaternary", "Destructive"];
14
20
  const rowLabels = ["Idle", "Hover", "Disabled"];
15
21
 
@@ -36,17 +42,12 @@ export const ButtonsMatrixCanvas = () => (
36
42
  visualState={rowLabel.toLowerCase() as "idle" | "hover" | "disabled"}
37
43
  />
38
44
  ))}
39
- <ButtonSnapshot
40
- hierarchy="primary"
41
- outcome="destructive"
42
- visualState={rowLabel.toLowerCase() as "idle" | "hover" | "disabled"}
43
- />
44
45
  </FigmaRow>
45
46
  ))}
46
47
 
47
48
  <FigmaRow label="Idle" gap={24}>
48
49
  <div className="w-24" />
49
- <Button startIcon={<AddIcon />} className="min-w-[304px]">
50
+ <Button icon={<AddIcon size="small" />} className="min-w-[304px]">
50
51
  New chat
51
52
  </Button>
52
53
  </FigmaRow>
@@ -1,88 +1,157 @@
1
- import { Button } from "../../primitives";
2
- import {
3
- EmptyState,
4
- Entry,
5
- Header,
6
- Tab,
7
- Tabs,
8
- } from "../../components";
9
- import { WorkflowsIllustration } from "../../illustrations";
10
- import {
11
- FigmaContent,
12
- FigmaGrid,
13
- FigmaPage,
14
- FigmaSection,
15
- FigmaVariant,
16
- } from "../_layout";
17
- import { FIGMA_WIDTHS } from "./figma-widths";
18
-
19
- export const ContentCanvas = () => (
20
- <FigmaPage title="Content" width={FIGMA_WIDTHS.content}>
21
- <FigmaContent>
22
- <FigmaSection label="Tab">
23
- <FigmaGrid gap={16}>
24
- <Tab label="Overview" />
25
- <Tab label="Tasks" state="active" />
26
- <Tab label="Reports" className="bg-background-hover" />
27
- </FigmaGrid>
28
- </FigmaSection>
29
-
30
- <FigmaSection label="Tabs">
31
- <div className="max-w-xl space-y-6">
32
- <Tabs
33
- items={[{ label: "All" }, { label: "Reports" }, { label: "Issues" }]}
34
- activeIndex={0}
35
- onChange={() => {}}
36
- />
37
- <Tabs
38
- type="pills"
39
- items={[{ label: "Active" }, { label: "Completed" }]}
40
- activeIndex={1}
41
- onChange={() => {}}
42
- />
43
- </div>
44
- </FigmaSection>
45
-
46
- <FigmaSection label="Header">
47
- <div className="max-w-xl space-y-4">
48
- <Header title="Fleet overview" />
49
- <Header
50
- variant="nested"
51
- title="Outstanding actions"
52
- actions={<Button hierarchy="primary">Add</Button>}
53
- />
54
- </div>
55
- </FigmaSection>
56
-
57
- <FigmaSection label="Entry">
58
- <div className="max-w-xl space-y-2">
59
- <Entry type="chat" title="Hull inspection report" subtitle="2 hours ago" meta="17" />
60
- <Entry type="issue" title="Critical valve malfunction" state="selected" meta="High" />
61
- <Entry type="chat" title="Port state control checklist" subtitle="Yesterday" className="bg-background-hover" />
62
- </div>
63
- </FigmaSection>
64
-
65
- <FigmaSection label="Empty State">
66
- <FigmaGrid gap={32}>
67
- <FigmaVariant label="Default">
68
- <div className="w-80">
69
- <EmptyState
70
- title="No workflows yet"
71
- description="Create your first workflow to get started."
72
- />
73
- </div>
74
- </FigmaVariant>
75
- <FigmaVariant label="With illustration">
76
- <div className="w-80">
77
- <EmptyState
78
- title="No reports"
79
- illustration={<WorkflowsIllustration className="mx-auto h-24 w-32" />}
80
- action={{ children: "Create report", hierarchy: "primary" }}
81
- />
82
- </div>
83
- </FigmaVariant>
84
- </FigmaGrid>
85
- </FigmaSection>
86
- </FigmaContent>
87
- </FigmaPage>
88
- );
1
+ import { Badge, Button } from "../../primitives";
2
+ import {
3
+ EmptyState,
4
+ Entry,
5
+ Header,
6
+ Tab,
7
+ Tabs,
8
+ TabsContent,
9
+ TabsList,
10
+ TabsTrigger,
11
+ } from "../../components";
12
+ import { TickIcon } from "../../icons";
13
+ import { WorkflowsIllustration } from "../../illustrations";
14
+ import {
15
+ FigmaContent,
16
+ FigmaGrid,
17
+ FigmaPage,
18
+ FigmaSection,
19
+ FigmaVariant,
20
+ } from "../_layout";
21
+ import { FIGMA_WIDTHS } from "./figma-widths";
22
+
23
+ export const ContentCanvas = () => (
24
+ <FigmaPage title="Content" width={FIGMA_WIDTHS.content}>
25
+ <FigmaContent>
26
+ <FigmaSection label="Tab">
27
+ <FigmaGrid gap={16}>
28
+ <Tab label="Overview" />
29
+ <Tab label="Tasks" state="active" />
30
+ <Tab label="Reports" className="bg-background-hover" />
31
+ </FigmaGrid>
32
+ </FigmaSection>
33
+
34
+ <FigmaSection label="Tabs">
35
+ <div className="max-w-xl space-y-8">
36
+ <FigmaVariant label="Underline">
37
+ <Tabs defaultValue="all" type="tabs">
38
+ <TabsList>
39
+ <TabsTrigger value="all">All</TabsTrigger>
40
+ <TabsTrigger value="reports">Reports</TabsTrigger>
41
+ <TabsTrigger value="issues">Issues</TabsTrigger>
42
+ </TabsList>
43
+ <TabsContent value="all" className="pt-3 text-caption-2 text-display-on-light-secondary">
44
+ All content
45
+ </TabsContent>
46
+ <TabsContent value="reports" className="pt-3 text-caption-2 text-display-on-light-secondary">
47
+ Reports content
48
+ </TabsContent>
49
+ <TabsContent value="issues" className="pt-3 text-caption-2 text-display-on-light-secondary">
50
+ Issues content
51
+ </TabsContent>
52
+ </Tabs>
53
+ </FigmaVariant>
54
+ <FigmaVariant label="Pills · soft">
55
+ <Tabs defaultValue="active" type="pills" appearance="soft">
56
+ <TabsList>
57
+ <TabsTrigger value="active">Active</TabsTrigger>
58
+ <TabsTrigger value="completed">
59
+ Completed
60
+ <Badge color="blue">3</Badge>
61
+ </TabsTrigger>
62
+ </TabsList>
63
+ <TabsContent value="active" className="pt-3 text-caption-2 text-display-on-light-secondary">
64
+ Active content
65
+ </TabsContent>
66
+ <TabsContent value="completed" className="pt-3 text-caption-2 text-display-on-light-secondary">
67
+ Completed content
68
+ </TabsContent>
69
+ </Tabs>
70
+ </FigmaVariant>
71
+ <FigmaVariant label="Pills · solid">
72
+ <Tabs defaultValue="chat" type="pills" appearance="solid">
73
+ <TabsList>
74
+ <TabsTrigger value="chat">Chat</TabsTrigger>
75
+ <TabsTrigger value="questions">
76
+ Questions
77
+ <Badge color="grey">208</Badge>
78
+ </TabsTrigger>
79
+ <TabsTrigger value="review">
80
+ Review
81
+ <Badge color="green" type="icon">
82
+ <TickIcon size="xs" />
83
+ </Badge>
84
+ </TabsTrigger>
85
+ <TabsTrigger value="gaps">
86
+ Gaps
87
+ <Badge color="grey">47</Badge>
88
+ </TabsTrigger>
89
+ </TabsList>
90
+ </Tabs>
91
+ </FigmaVariant>
92
+ </div>
93
+ </FigmaSection>
94
+
95
+ <FigmaSection label="Header">
96
+ <div className="max-w-xl space-y-4">
97
+ <Header title="Fleet overview" />
98
+ <Header
99
+ variant="nested"
100
+ title="Outstanding actions"
101
+ actions={<Button hierarchy="primary">Add</Button>}
102
+ />
103
+ </div>
104
+ </FigmaSection>
105
+
106
+ <FigmaSection label="Entry">
107
+ <div className="max-w-xl space-y-2">
108
+ <Entry
109
+ variant="chat"
110
+ title="Hull inspection report"
111
+ subtitle="We’ve got a persistent oil leak from the fuel pump."
112
+ />
113
+ <Entry
114
+ variant="chat"
115
+ state="active"
116
+ title="Ballast Pump Not Starting"
117
+ subtitle="The fuel pump won’t start consistently."
118
+ trailing={<span className="text-display-on-light-secondary">···</span>}
119
+ />
120
+ <Entry
121
+ variant="issue"
122
+ title="Excessive Rust on Fuel Pump"
123
+ subtitle="Created by Jake Silva on March 28"
124
+ count={3}
125
+ />
126
+ <Entry
127
+ variant="report"
128
+ title="Engine Room Oil Leak"
129
+ subtitle="We’ve spotted a steady oil leak near the fuel pump."
130
+ />
131
+ </div>
132
+ </FigmaSection>
133
+
134
+ <FigmaSection label="Empty State">
135
+ <FigmaGrid gap={32}>
136
+ <FigmaVariant label="Default">
137
+ <div className="w-80">
138
+ <EmptyState
139
+ title="No workflows yet"
140
+ description="Create your first workflow to get started."
141
+ />
142
+ </div>
143
+ </FigmaVariant>
144
+ <FigmaVariant label="With illustration">
145
+ <div className="w-80">
146
+ <EmptyState
147
+ title="No reports"
148
+ illustration={<WorkflowsIllustration className="mx-auto h-24 w-32" />}
149
+ action={{ children: "Create report", hierarchy: "primary" }}
150
+ />
151
+ </div>
152
+ </FigmaVariant>
153
+ </FigmaGrid>
154
+ </FigmaSection>
155
+ </FigmaContent>
156
+ </FigmaPage>
157
+ );