@checkstack/slo-frontend 0.3.10 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,102 @@
1
1
  # @checkstack/slo-frontend
2
2
 
3
+ ## 0.4.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [9016526]
8
+ - @checkstack/common@0.10.0
9
+ - @checkstack/catalog-common@2.2.0
10
+ - @checkstack/healthcheck-common@1.1.0
11
+ - @checkstack/dependency-common@1.1.0
12
+ - @checkstack/slo-common@0.4.0
13
+ - @checkstack/dashboard-frontend@0.7.1
14
+ - @checkstack/frontend-api@0.5.1
15
+ - @checkstack/tips-frontend@0.2.1
16
+ - @checkstack/ui@1.8.1
17
+ - @checkstack/signal-frontend@0.1.3
18
+
19
+ ## 0.4.0
20
+
21
+ ### Minor Changes
22
+
23
+ - 3547670: Wire the new tips infrastructure across the frontends:
24
+
25
+ **Empty-state coaching.** Replace generic "no items" copy with onboarding
26
+ guidance — short description, three numbered steps and a primary CTA — on
27
+ every EmptyState that has a meaningful next action. Affects: catalog
28
+ (systems + groups), dashboard, health-check page, integrations (subscriptions
29
+
30
+ - provider connections), GitOps providers + secrets, GitOps provenance,
31
+ SLO config + overview, maintenance config, satellites, plugin manager,
32
+ incident config, announcements. Read-only EmptyStates (incident history,
33
+ maintenance history, plugin events) get clearer descriptions explaining
34
+ what would populate them.
35
+
36
+ **First-run anchored tips.** Add `<Tip>` popovers to the most important
37
+ "Create" affordances so first-time users see a one-line explanation of
38
+ what they're about to make and why it matters: catalog “Add System” /
39
+ “Add Group”, healthcheck “Create Check”, integrations “New Subscription”,
40
+ GitOps “Add Provider”, SLO “Create SLO”, maintenance “Create Maintenance”,
41
+ satellite “Create Satellite”, plugin-manager “Install plugin”, incident
42
+ “Report Incident”, announcement “New Announcement”. Each tip is dismissed
43
+ per user (server-backed when signed in, localStorage otherwise) and
44
+ namespaced through `qualifyTipId(plugin, …)` so it cannot escape the
45
+ plugin's own namespace.
46
+
47
+ **Welcome banner on the dashboard.** A `<TipBanner>` at the top of the
48
+ dashboard introduces Checkstack's main flow ("add a system, then a health
49
+ check") with a one-click jump into the catalog.
50
+
51
+ ### Patch Changes
52
+
53
+ - 950d6ec: Fix mobile UserMenu items rendering at zero height, group menu items by
54
+ section, and unstack cramped card headers on small viewports.
55
+
56
+ - **UserMenu mobile bug**: On mobile, the user-menu Sheet rendered every
57
+ menu item as a grid row, which combined with `flex-shrink: 1` on each
58
+ item collapsed the buttons whose internal layout uses `display: flex`
59
+ (the items registered with `useNavigate` rather than `<Link>`) to zero
60
+ content height. Switched the mobile container to a flex column with
61
+ `[&>*]:shrink-0` and added `min-h-0` so the sheet scrolls correctly
62
+ when the list overflows.
63
+
64
+ - **UserMenu grouping**: Slot extensions now accept an optional `group`
65
+ field. The user menu buckets `UserMenuItemsSlot` extensions by `group`
66
+ and renders each group under a labeled header (`Workspace`,
67
+ `Reliability`, `Configuration`, `Documentation`, `Account`). Existing
68
+ core plugins are tagged with the appropriate group; third-party plugins
69
+ can pick any of these or supply their own label. Untagged extensions
70
+ render last with no header. `UserMenuItemsBottomSlot` is unaffected.
71
+
72
+ - **Card header responsiveness**: `CardHeaderRow` (the primitive shared by
73
+ Incident, Maintenance, Auth, Catalog, GitOps and other config cards) now
74
+ stacks vertically on narrow viewports and only switches to a single row
75
+ at the `sm` breakpoint, so titles and adjacent filter controls (e.g.
76
+ status `Select`, "Show resolved" checkbox) no longer cram together on
77
+ mobile. Refactored the Incident and Maintenance config pages to use the
78
+ primitive instead of a hand-rolled `flex items-center justify-between`
79
+ row, and made their `Select` triggers full-width on mobile.
80
+
81
+ - Updated dependencies [42abfff]
82
+ - Updated dependencies [3547670]
83
+ - Updated dependencies [1ef2e79]
84
+ - Updated dependencies [aa89bc5]
85
+ - Updated dependencies [3547670]
86
+ - Updated dependencies [950d6ec]
87
+ - Updated dependencies [3547670]
88
+ - Updated dependencies [3547670]
89
+ - @checkstack/common@0.9.0
90
+ - @checkstack/ui@1.8.0
91
+ - @checkstack/catalog-common@2.1.0
92
+ - @checkstack/frontend-api@0.5.0
93
+ - @checkstack/tips-frontend@0.2.0
94
+ - @checkstack/dashboard-frontend@0.7.0
95
+ - @checkstack/dependency-common@1.0.2
96
+ - @checkstack/healthcheck-common@1.0.2
97
+ - @checkstack/slo-common@0.3.3
98
+ - @checkstack/signal-frontend@0.1.2
99
+
3
100
  ## 0.3.10
4
101
 
5
102
  ### Patch Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@checkstack/slo-frontend",
3
- "version": "0.3.10",
3
+ "version": "0.4.1",
4
4
  "license": "Elastic-2.0",
5
5
  "type": "module",
6
6
  "main": "src/index.tsx",
@@ -13,15 +13,16 @@
13
13
  "lint:code": "eslint . --max-warnings 0"
14
14
  },
15
15
  "dependencies": {
16
- "@checkstack/catalog-common": "2.0.0",
17
- "@checkstack/common": "0.7.0",
18
- "@checkstack/dashboard-frontend": "0.6.0",
19
- "@checkstack/dependency-common": "1.0.0",
20
- "@checkstack/frontend-api": "0.4.1",
21
- "@checkstack/healthcheck-common": "1.0.0",
22
- "@checkstack/signal-frontend": "0.1.0",
23
- "@checkstack/slo-common": "0.3.1",
24
- "@checkstack/ui": "1.7.0",
16
+ "@checkstack/catalog-common": "2.1.0",
17
+ "@checkstack/common": "0.9.0",
18
+ "@checkstack/dashboard-frontend": "0.7.0",
19
+ "@checkstack/dependency-common": "1.0.2",
20
+ "@checkstack/frontend-api": "0.5.0",
21
+ "@checkstack/healthcheck-common": "1.0.2",
22
+ "@checkstack/signal-frontend": "0.1.2",
23
+ "@checkstack/slo-common": "0.3.3",
24
+ "@checkstack/tips-frontend": "0.2.0",
25
+ "@checkstack/ui": "1.8.0",
25
26
  "date-fns": "^4.1.0",
26
27
  "lucide-react": "^0.344.0",
27
28
  "react": "^18.2.0",
@@ -31,7 +32,7 @@
31
32
  "devDependencies": {
32
33
  "typescript": "^5.0.0",
33
34
  "@types/react": "^18.2.0",
34
- "@checkstack/tsconfig": "0.0.6",
35
- "@checkstack/scripts": "0.1.2"
35
+ "@checkstack/tsconfig": "0.0.7",
36
+ "@checkstack/scripts": "0.3.1"
36
37
  }
37
38
  }
package/src/index.tsx CHANGED
@@ -40,6 +40,7 @@ export default createFrontendPlugin({
40
40
  createSlotExtension(UserMenuItemsSlot, {
41
41
  id: "slo.user-menu.items",
42
42
  component: SloMenuItems,
43
+ metadata: { group: "Reliability" },
43
44
  }),
44
45
  createSlotExtension(SystemStateBadgesSlot, {
45
46
  id: "slo.system-state-badge",
@@ -7,7 +7,12 @@ import {
7
7
  wrapInSuspense,
8
8
  } from "@checkstack/frontend-api";
9
9
  import { SloApi } from "../api";
10
- import { sloAccess, type SloObjective } from "@checkstack/slo-common";
10
+ import {
11
+ sloAccess,
12
+ pluginMetadata as sloPluginMetadata,
13
+ type SloObjective,
14
+ } from "@checkstack/slo-common";
15
+ import { Tip } from "@checkstack/tips-frontend";
11
16
  import { CatalogApi } from "@checkstack/catalog-common";
12
17
  import {
13
18
  Card,
@@ -132,10 +137,19 @@ const SloConfigPageContent: React.FC = () => {
132
137
  loading={accessLoading}
133
138
  allowed={canManage}
134
139
  actions={
135
- <Button onClick={handleCreate}>
136
- <Plus className="h-4 w-4 mr-2" />
137
- Create SLO
138
- </Button>
140
+ <Tip
141
+ plugin={sloPluginMetadata}
142
+ id="objectives.create"
143
+ title="Set the bar for reliability"
144
+ description="An SLO is a contract you set with yourself — “this service is healthy 99.9% of the time over 30 days”. Checkstack measures it from your existing health-check history, tracks the error budget, and shows you when you're burning it too fast."
145
+ side="bottom"
146
+ align="end"
147
+ >
148
+ <Button onClick={handleCreate}>
149
+ <Plus className="h-4 w-4 mr-2" />
150
+ Create SLO
151
+ </Button>
152
+ </Tip>
139
153
  }
140
154
  >
141
155
  <Card>
@@ -152,8 +166,22 @@ const SloConfigPageContent: React.FC = () => {
152
166
  </div>
153
167
  ) : objectives.length === 0 ? (
154
168
  <EmptyState
155
- title="No SLO objectives"
156
- description="Create your first SLO objective to start tracking reliability."
169
+ icon={<Target className="size-10" />}
170
+ title="No SLO objectives yet"
171
+ description="An SLO turns raw uptime into a target you can hold yourself to: “API X is healthy 99.9% of the time over the last 30 days.” Checkstack tracks the error budget against your health-check history and lets you exclude planned maintenance."
172
+ steps={[
173
+ "Click “Create SLO” and pick the system to measure.",
174
+ "Choose a target (e.g. 99.9%) and a rolling window (e.g. 30 days).",
175
+ "Decide whether scheduled maintenances eat into the error budget — usually you want them excluded.",
176
+ ]}
177
+ actions={
178
+ canManage ? (
179
+ <Button onClick={handleCreate}>
180
+ <Plus className="h-4 w-4 mr-2" />
181
+ Create your first SLO
182
+ </Button>
183
+ ) : undefined
184
+ }
157
185
  />
158
186
  ) : (
159
187
  <Table>
@@ -62,8 +62,23 @@ const SloOverviewPageContent: React.FC = () => {
62
62
  </div>
63
63
  ) : objectives.length === 0 ? (
64
64
  <EmptyState
65
+ icon={<Target className="size-10" />}
65
66
  title="No SLOs configured"
66
- description="Define Service Level Objectives to track reliability."
67
+ description="SLOs translate uptime into a target — “healthy 99.9% of the time over 30 days” — and let you track the error budget per system. This dashboard lights up once you've defined at least one."
68
+ steps={[
69
+ "Open SLO management to create your first objective.",
70
+ "Pick the system, the target percentage and the rolling window.",
71
+ "Come back here for an at-a-glance view of every SLO and its remaining error budget.",
72
+ ]}
73
+ actions={
74
+ <Link
75
+ to={resolveRoute(sloRoutes.routes.config)}
76
+ className="inline-flex items-center gap-2 text-sm font-medium text-primary hover:underline"
77
+ >
78
+ Manage SLOs
79
+ <ArrowRight className="w-4 h-4" />
80
+ </Link>
81
+ }
67
82
  />
68
83
  ) : (
69
84
  <div className="grid grid-cols-1 lg:grid-cols-[1fr_300px] gap-6">
package/tsconfig.json CHANGED
@@ -28,6 +28,9 @@
28
28
  {
29
29
  "path": "../slo-common"
30
30
  },
31
+ {
32
+ "path": "../tips-frontend"
33
+ },
31
34
  {
32
35
  "path": "../ui"
33
36
  }