@shipfox/client-onboarding 23.0.0 → 25.0.0

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 (91) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +28 -0
  3. package/README.md +26 -7
  4. package/dist/components/setup-checklist-body.d.ts +3 -0
  5. package/dist/components/setup-checklist-body.d.ts.map +1 -0
  6. package/dist/components/setup-checklist-body.js +25 -0
  7. package/dist/components/setup-checklist-body.js.map +1 -0
  8. package/dist/components/setup-checklist-completion.d.ts +6 -0
  9. package/dist/components/setup-checklist-completion.d.ts.map +1 -0
  10. package/dist/components/setup-checklist-completion.js +156 -0
  11. package/dist/components/setup-checklist-completion.js.map +1 -0
  12. package/dist/components/setup-checklist-confetti.d.ts +13 -0
  13. package/dist/components/setup-checklist-confetti.d.ts.map +1 -0
  14. package/dist/components/setup-checklist-confetti.js +24 -0
  15. package/dist/components/setup-checklist-confetti.js.map +1 -0
  16. package/dist/components/setup-checklist-host-primitives.d.ts +11 -0
  17. package/dist/components/setup-checklist-host-primitives.d.ts.map +1 -0
  18. package/dist/components/setup-checklist-host-primitives.js +71 -0
  19. package/dist/components/setup-checklist-host-primitives.js.map +1 -0
  20. package/dist/components/setup-checklist-row.d.ts +7 -0
  21. package/dist/components/setup-checklist-row.d.ts.map +1 -0
  22. package/dist/components/setup-checklist-row.js +177 -0
  23. package/dist/components/setup-checklist-row.js.map +1 -0
  24. package/dist/components/setup-checklist-types.d.ts +19 -0
  25. package/dist/components/setup-checklist-types.d.ts.map +1 -0
  26. package/dist/components/setup-checklist-types.js +3 -0
  27. package/dist/components/setup-checklist-types.js.map +1 -0
  28. package/dist/components/setup-checklist.d.ts +5 -0
  29. package/dist/components/setup-checklist.d.ts.map +1 -0
  30. package/dist/components/setup-checklist.js +5 -0
  31. package/dist/components/setup-checklist.js.map +1 -0
  32. package/dist/components/setup-checklist.stories.d.ts +19 -0
  33. package/dist/components/setup-checklist.stories.d.ts.map +1 -0
  34. package/dist/components/setup-checklist.stories.js +305 -0
  35. package/dist/components/setup-checklist.stories.js.map +1 -0
  36. package/dist/components/workspace-setup-checklist.d.ts +3 -0
  37. package/dist/components/workspace-setup-checklist.d.ts.map +1 -0
  38. package/dist/components/workspace-setup-checklist.js +80 -0
  39. package/dist/components/workspace-setup-checklist.js.map +1 -0
  40. package/dist/components/workspace-setup-indicator.d.ts +3 -0
  41. package/dist/components/workspace-setup-indicator.d.ts.map +1 -0
  42. package/dist/components/workspace-setup-indicator.js +133 -0
  43. package/dist/components/workspace-setup-indicator.js.map +1 -0
  44. package/dist/core/setup-checklist.d.ts +2 -0
  45. package/dist/core/setup-checklist.d.ts.map +1 -1
  46. package/dist/core/setup-checklist.js +11 -6
  47. package/dist/core/setup-checklist.js.map +1 -1
  48. package/dist/feature.d.ts +6 -0
  49. package/dist/feature.d.ts.map +1 -0
  50. package/dist/feature.js +19 -0
  51. package/dist/feature.js.map +1 -0
  52. package/dist/hooks/api/setup-checklist.d.ts +13 -0
  53. package/dist/hooks/api/setup-checklist.d.ts.map +1 -0
  54. package/dist/hooks/api/setup-checklist.js +103 -0
  55. package/dist/hooks/api/setup-checklist.js.map +1 -0
  56. package/dist/hooks/use-checklist-analytics.d.ts +6 -0
  57. package/dist/hooks/use-checklist-analytics.d.ts.map +1 -0
  58. package/dist/hooks/use-checklist-analytics.js +51 -0
  59. package/dist/hooks/use-checklist-analytics.js.map +1 -0
  60. package/dist/hooks/use-checklist-dismissal.d.ts +5 -0
  61. package/dist/hooks/use-checklist-dismissal.d.ts.map +1 -0
  62. package/dist/hooks/use-checklist-dismissal.js +31 -0
  63. package/dist/hooks/use-checklist-dismissal.js.map +1 -0
  64. package/dist/index.d.ts +1 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +1 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/tsconfig.test.tsbuildinfo +1 -1
  69. package/package.json +12 -5
  70. package/src/components/setup-checklist-body.tsx +35 -0
  71. package/src/components/setup-checklist-completion.test.tsx +124 -0
  72. package/src/components/setup-checklist-completion.tsx +165 -0
  73. package/src/components/setup-checklist-confetti.test.ts +19 -0
  74. package/src/components/setup-checklist-confetti.ts +39 -0
  75. package/src/components/setup-checklist-host-primitives.tsx +65 -0
  76. package/src/components/setup-checklist-row.tsx +189 -0
  77. package/src/components/setup-checklist-types.ts +21 -0
  78. package/src/components/setup-checklist.stories.tsx +281 -0
  79. package/src/components/setup-checklist.test.tsx +564 -0
  80. package/src/components/setup-checklist.tsx +8 -0
  81. package/src/components/workspace-setup-checklist.tsx +91 -0
  82. package/src/components/workspace-setup-indicator.tsx +126 -0
  83. package/src/core/setup-checklist.test.ts +2 -2
  84. package/src/core/setup-checklist.ts +19 -10
  85. package/src/feature.ts +16 -0
  86. package/src/hooks/api/setup-checklist.ts +144 -0
  87. package/src/hooks/use-checklist-analytics.ts +60 -0
  88. package/src/hooks/use-checklist-dismissal.ts +30 -0
  89. package/src/index.ts +8 -0
  90. package/tsconfig.build.tsbuildinfo +1 -1
  91. package/vitest.config.ts +2 -0
@@ -1,2 +1,2 @@
1
1
  $ shipfox-swc
2
- Successfully compiled: 4 files with swc (436.14ms)
2
+ Successfully compiled: 18 files with swc (604.09ms)
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # @shipfox/client-onboarding
2
2
 
3
+ ## 25.0.0
4
+
5
+ ### Minor Changes
6
+
7
+ - f57bcc3: Adds the workspace setup checklist panel and top-bar indicator.
8
+
9
+ ### Patch Changes
10
+
11
+ - de25460: Makes the onboarding completion burst deterministic in reduced-motion environments.
12
+ - Updated dependencies [af27652]
13
+ - Updated dependencies [f57bcc3]
14
+ - @shipfox/client-shell@25.0.0
15
+ - @shipfox/client-integrations@25.0.0
16
+ - @shipfox/client-projects@25.0.0
17
+ - @shipfox/client-agent@25.0.0
18
+ - @shipfox/client-runners@25.0.0
19
+ - @shipfox/client-workspace-settings@25.0.0
20
+
21
+ ## 24.0.0
22
+
23
+ ### Patch Changes
24
+
25
+ - Updated dependencies [989eb11]
26
+ - @shipfox/client-agent@24.0.0
27
+ - @shipfox/client-projects@24.0.0
28
+ - @shipfox/client-integrations@24.0.0
29
+ - @shipfox/client-shell@24.0.0
30
+
3
31
  ## 23.0.0
4
32
 
5
33
  ### Minor Changes
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Shipfox Client Onboarding
2
2
 
3
- Client onboarding for Shipfox workspaces: the pre-project setup gate and the
4
- pure derivations behind the post-activation Get-started checklist.
3
+ Client onboarding for Shipfox workspaces: the pre-project setup gate, the
4
+ post-activation Get-started checklist, and its panel and top-bar hosts.
5
5
 
6
6
  ## What it does
7
7
 
@@ -20,10 +20,13 @@ pure derivations behind the post-activation Get-started checklist.
20
20
  `complete`. Rows follow the spec order; the runner and model-provider rows
21
21
  exist only when the installation does not already provide the capability;
22
22
  the first-workflow and teammates rows are pointers that never count.
23
+ - **`WorkspaceSetupChecklist`** and **`WorkspaceSetupIndicator`**: slot-ready
24
+ hosts that load the five checklist query families, render the checklist in a
25
+ panel or a non-modal popover, and persist per-device dismissal.
23
26
 
24
- Both derivations are pure functions. They test without React and decide what
25
- the checklist shows, so the component work in this package renders their
26
- output without re-deriving anything.
27
+ The derivations are pure functions. They test without React and decide what
28
+ the checklist shows, while the hosts own query freshness, loading and failure
29
+ gating, analytics, completion transitions, and the completion burst.
27
30
 
28
31
  ## Installation and setup
29
32
 
@@ -32,7 +35,8 @@ pnpm add @shipfox/client-onboarding
32
35
  ```
33
36
 
34
37
  The package is part of the `libs/client` workspace. Its runtime dependencies
35
- are `client-agent`, `client-integrations`, `client-projects`, and `client-shell`.
38
+ are `client-agent`, `client-integrations`, `client-projects`, `client-runners`,
39
+ `client-shell`, and `client-workspace-settings`.
36
40
 
37
41
  ## Usage
38
42
 
@@ -65,6 +69,16 @@ checklist.openCount; // 3
65
69
  checklist.complete; // false
66
70
  ```
67
71
 
72
+ The rendered hosts can be exported through the package feature entry point for
73
+ shell slot composition:
74
+
75
+ ```ts
76
+ import {
77
+ WorkspaceSetupChecklist,
78
+ WorkspaceSetupIndicator,
79
+ } from '@shipfox/client-onboarding/feature';
80
+ ```
81
+
68
82
  The caller maps its own query results to the derivation inputs:
69
83
 
70
84
  - `providers` and `connections` use the plain values from
@@ -92,6 +106,11 @@ The caller maps its own query results to the derivation inputs:
92
106
  false.
93
107
  - The teammates row renders done at `memberCount >= 2` or
94
108
  `pendingInvitationCount >= 1`, but stays a pointer.
109
+ - The panel and indicator render nothing for an initially complete checklist;
110
+ the mounted host that observes the final tracked row transition renders the
111
+ completion state and owns its one-shot burst.
112
+ - Dismissal is scoped to the workspace and device. A dismissed host does not
113
+ subscribe to checklist queries until the flag is cleared.
95
114
 
96
115
  ## Development
97
116
 
@@ -103,7 +122,7 @@ turbo build --filter=@shipfox/client-onboarding
103
122
  ```
104
123
 
105
124
  The package runs Storybook per the per-package recipe (`pnpm storybook` on
106
- port 6015). The Storybook test project activates when checklist stories land.
125
+ port 6015) with stories covering both hosts and each checklist state.
107
126
 
108
127
  ## License
109
128
 
@@ -0,0 +1,3 @@
1
+ import type { SetupChecklistBodyProps } from './setup-checklist-types.js';
2
+ export declare function SetupChecklistBody({ checklist, workspaceSlug, completion, showBurst, onBurstComplete, onAction, onDone, }: SetupChecklistBodyProps): import("react").JSX.Element;
3
+ //# sourceMappingURL=setup-checklist-body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-checklist-body.d.ts","sourceRoot":"","sources":["../../src/components/setup-checklist-body.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,4BAA4B,CAAC;AAExE,wBAAgB,kBAAkB,CAAC,EACjC,SAAS,EACT,aAAa,EACb,UAAkB,EAClB,SAAiB,EACjB,eAAe,EACf,QAAQ,EACR,MAAM,GACP,EAAE,uBAAuB,+BAsBzB"}
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { SetupChecklistCompletion } from './setup-checklist-completion.js';
3
+ import { ChecklistRow } from './setup-checklist-row.js';
4
+ export function SetupChecklistBody({ checklist, workspaceSlug, completion = false, showBurst = false, onBurstComplete, onAction, onDone }) {
5
+ return /*#__PURE__*/ _jsxs("div", {
6
+ children: [
7
+ completion ? /*#__PURE__*/ _jsx(SetupChecklistCompletion, {
8
+ showBurst: showBurst,
9
+ onBurstComplete: onBurstComplete,
10
+ onDone: onDone
11
+ }) : null,
12
+ /*#__PURE__*/ _jsx("ol", {
13
+ "aria-label": "Setup steps",
14
+ className: "m-0 list-none p-0",
15
+ children: checklist.items.map((item)=>/*#__PURE__*/ _jsx(ChecklistRow, {
16
+ item: item,
17
+ workspaceSlug: workspaceSlug,
18
+ onAction: onAction
19
+ }, item.id))
20
+ })
21
+ ]
22
+ });
23
+ }
24
+
25
+ //# sourceMappingURL=setup-checklist-body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/setup-checklist-body.tsx"],"sourcesContent":["import {SetupChecklistCompletion} from './setup-checklist-completion.js';\nimport {ChecklistRow} from './setup-checklist-row.js';\nimport type {SetupChecklistBodyProps} from './setup-checklist-types.js';\n\nexport function SetupChecklistBody({\n checklist,\n workspaceSlug,\n completion = false,\n showBurst = false,\n onBurstComplete,\n onAction,\n onDone,\n}: SetupChecklistBodyProps) {\n return (\n <div>\n {completion ? (\n <SetupChecklistCompletion\n showBurst={showBurst}\n onBurstComplete={onBurstComplete}\n onDone={onDone}\n />\n ) : null}\n <ol aria-label=\"Setup steps\" className=\"m-0 list-none p-0\">\n {checklist.items.map((item) => (\n <ChecklistRow\n key={item.id}\n item={item}\n workspaceSlug={workspaceSlug}\n onAction={onAction}\n />\n ))}\n </ol>\n </div>\n );\n}\n"],"names":["SetupChecklistCompletion","ChecklistRow","SetupChecklistBody","checklist","workspaceSlug","completion","showBurst","onBurstComplete","onAction","onDone","div","ol","aria-label","className","items","map","item","id"],"mappings":";AAAA,SAAQA,wBAAwB,QAAO,kCAAkC;AACzE,SAAQC,YAAY,QAAO,2BAA2B;AAGtD,OAAO,SAASC,mBAAmB,EACjCC,SAAS,EACTC,aAAa,EACbC,aAAa,KAAK,EAClBC,YAAY,KAAK,EACjBC,eAAe,EACfC,QAAQ,EACRC,MAAM,EACkB;IACxB,qBACE,MAACC;;YACEL,2BACC,KAACL;gBACCM,WAAWA;gBACXC,iBAAiBA;gBACjBE,QAAQA;iBAER;0BACJ,KAACE;gBAAGC,cAAW;gBAAcC,WAAU;0BACpCV,UAAUW,KAAK,CAACC,GAAG,CAAC,CAACC,qBACpB,KAACf;wBAECe,MAAMA;wBACNZ,eAAeA;wBACfI,UAAUA;uBAHLQ,KAAKC,EAAE;;;;AASxB"}
@@ -0,0 +1,6 @@
1
+ export declare function SetupChecklistCompletion({ showBurst, onBurstComplete, onDone, }: {
2
+ showBurst: boolean;
3
+ onBurstComplete?: (() => void) | undefined;
4
+ onDone?: (() => void) | undefined;
5
+ }): import("react").JSX.Element;
6
+ //# sourceMappingURL=setup-checklist-completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-checklist-completion.d.ts","sourceRoot":"","sources":["../../src/components/setup-checklist-completion.tsx"],"names":[],"mappings":"AAUA,wBAAgB,wBAAwB,CAAC,EACvC,SAAS,EACT,eAAe,EACf,MAAM,GACP,EAAE;IACD,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC3C,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CACnC,+BAwBA"}
@@ -0,0 +1,156 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from '@shipfox/react-ui/button';
3
+ import { Icon } from '@shipfox/react-ui/icon';
4
+ import { Text } from '@shipfox/react-ui/typography';
5
+ import { useEffect, useRef } from 'react';
6
+ import { createConfettiParticles } from './setup-checklist-confetti.js';
7
+ const JSDOM_USER_AGENT_RE = /jsdom/u;
8
+ const CONFETTI_DURATION_MS = 2000;
9
+ const CONFETTI_RANDOM_SEED = 0x5f3759df;
10
+ export function SetupChecklistCompletion({ showBurst, onBurstComplete, onDone }) {
11
+ return /*#__PURE__*/ _jsxs("div", {
12
+ className: "relative overflow-hidden border-b border-tag-success-border bg-tag-success-bg p-panel",
13
+ children: [
14
+ /*#__PURE__*/ _jsx(ConfettiBurst, {
15
+ active: showBurst,
16
+ onComplete: onBurstComplete
17
+ }),
18
+ /*#__PURE__*/ _jsxs("div", {
19
+ className: "relative flex items-center gap-group",
20
+ children: [
21
+ /*#__PURE__*/ _jsx(Icon, {
22
+ name: "checkCircleSolid",
23
+ className: "size-20 shrink-0 text-tag-success-icon",
24
+ "aria-hidden": "true"
25
+ }),
26
+ /*#__PURE__*/ _jsxs("div", {
27
+ className: "min-w-0 flex-1",
28
+ children: [
29
+ /*#__PURE__*/ _jsx(Text, {
30
+ size: "sm",
31
+ bold: true,
32
+ className: "text-tag-success-text",
33
+ children: "You're set up"
34
+ }),
35
+ /*#__PURE__*/ _jsx(Text, {
36
+ size: "xs",
37
+ className: "text-tag-success-text",
38
+ children: "Your workspace is ready for its first workflow."
39
+ })
40
+ ]
41
+ }),
42
+ /*#__PURE__*/ _jsx(Button, {
43
+ type: "button",
44
+ size: "sm",
45
+ variant: "primary",
46
+ onClick: onDone,
47
+ children: "Done"
48
+ })
49
+ ]
50
+ })
51
+ ]
52
+ });
53
+ }
54
+ function ConfettiBurst({ active, onComplete }) {
55
+ const canvasRef = useRef(null);
56
+ useEffect(()=>{
57
+ if (!active || typeof window === 'undefined') return;
58
+ let completed = false;
59
+ const finish = ()=>{
60
+ if (completed) return;
61
+ completed = true;
62
+ onComplete?.();
63
+ };
64
+ const prefersReducedMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches ?? false;
65
+ if (typeof navigator !== 'undefined' && JSDOM_USER_AGENT_RE.test(navigator.userAgent)) {
66
+ finish();
67
+ return;
68
+ }
69
+ const canvas = canvasRef.current;
70
+ if (!canvas) {
71
+ finish();
72
+ return;
73
+ }
74
+ const bounds = canvas.getBoundingClientRect();
75
+ if (bounds.width === 0 && bounds.height === 0) {
76
+ finish();
77
+ return;
78
+ }
79
+ const context = canvas.getContext('2d');
80
+ if (!context) {
81
+ finish();
82
+ return;
83
+ }
84
+ const pixelRatio = Math.min(window.devicePixelRatio || 1, 2);
85
+ const width = Math.max(bounds.width, 1);
86
+ const height = Math.max(bounds.height, 1);
87
+ canvas.width = Math.floor(width * pixelRatio);
88
+ canvas.height = Math.floor(height * pixelRatio);
89
+ context.scale(pixelRatio, pixelRatio);
90
+ const styles = getComputedStyle(canvas);
91
+ const colors = [
92
+ styles.getPropertyValue('--color-background-accent-blue-base').trim(),
93
+ styles.getPropertyValue('--color-background-accent-purple-base').trim(),
94
+ styles.getPropertyValue('--color-background-accent-success-base').trim(),
95
+ styles.getPropertyValue('--color-background-accent-warning-base').trim()
96
+ ].filter(Boolean);
97
+ if (colors.length === 0) {
98
+ finish();
99
+ return;
100
+ }
101
+ const particles = createConfettiParticles(width, height, colors, prefersReducedMotion ? CONFETTI_RANDOM_SEED : undefined);
102
+ let frame = 0;
103
+ const startedAt = performance.now();
104
+ const draw = (now, advance = true)=>{
105
+ const elapsed = now - startedAt;
106
+ context.clearRect(0, 0, width, height);
107
+ context.globalAlpha = Math.max(0, 1 - elapsed / CONFETTI_DURATION_MS);
108
+ for (const particle of particles){
109
+ if (advance) {
110
+ particle.vy += 0.025;
111
+ particle.vx *= 0.985;
112
+ particle.x += particle.vx;
113
+ particle.y += particle.vy;
114
+ particle.rotation += 0.1;
115
+ }
116
+ context.save();
117
+ context.translate(particle.x, particle.y);
118
+ context.rotate(particle.rotation);
119
+ context.fillStyle = particle.color;
120
+ context.fillRect(-particle.size / 2, -particle.size / 2, particle.size, particle.size * 0.6);
121
+ context.restore();
122
+ }
123
+ context.globalAlpha = 1;
124
+ if (!advance) return;
125
+ if (elapsed < CONFETTI_DURATION_MS) {
126
+ frame = requestAnimationFrame(draw);
127
+ } else {
128
+ finish();
129
+ }
130
+ };
131
+ if (prefersReducedMotion) {
132
+ draw(startedAt, false);
133
+ finish();
134
+ // Keep the static frame after hosts consume the burst immediately.
135
+ return;
136
+ }
137
+ frame = requestAnimationFrame(draw);
138
+ return ()=>{
139
+ cancelAnimationFrame(frame);
140
+ context.clearRect(0, 0, width, height);
141
+ };
142
+ }, [
143
+ active,
144
+ onComplete
145
+ ]);
146
+ return /*#__PURE__*/ _jsx("div", {
147
+ "aria-hidden": "true",
148
+ className: "pointer-events-none absolute inset-0 size-full",
149
+ children: /*#__PURE__*/ _jsx("canvas", {
150
+ ref: canvasRef,
151
+ className: "size-full"
152
+ })
153
+ });
154
+ }
155
+
156
+ //# sourceMappingURL=setup-checklist-completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/setup-checklist-completion.tsx"],"sourcesContent":["import {Button} from '@shipfox/react-ui/button';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {useEffect, useRef} from 'react';\nimport {createConfettiParticles} from './setup-checklist-confetti.js';\n\nconst JSDOM_USER_AGENT_RE = /jsdom/u;\nconst CONFETTI_DURATION_MS = 2000;\nconst CONFETTI_RANDOM_SEED = 0x5f3759df;\n\nexport function SetupChecklistCompletion({\n showBurst,\n onBurstComplete,\n onDone,\n}: {\n showBurst: boolean;\n onBurstComplete?: (() => void) | undefined;\n onDone?: (() => void) | undefined;\n}) {\n return (\n <div className=\"relative overflow-hidden border-b border-tag-success-border bg-tag-success-bg p-panel\">\n <ConfettiBurst active={showBurst} onComplete={onBurstComplete} />\n <div className=\"relative flex items-center gap-group\">\n <Icon\n name=\"checkCircleSolid\"\n className=\"size-20 shrink-0 text-tag-success-icon\"\n aria-hidden=\"true\"\n />\n <div className=\"min-w-0 flex-1\">\n <Text size=\"sm\" bold className=\"text-tag-success-text\">\n You're set up\n </Text>\n <Text size=\"xs\" className=\"text-tag-success-text\">\n Your workspace is ready for its first workflow.\n </Text>\n </div>\n <Button type=\"button\" size=\"sm\" variant=\"primary\" onClick={onDone}>\n Done\n </Button>\n </div>\n </div>\n );\n}\n\nfunction ConfettiBurst({\n active,\n onComplete,\n}: {\n active: boolean;\n onComplete?: (() => void) | undefined;\n}) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n if (!active || typeof window === 'undefined') return;\n let completed = false;\n const finish = () => {\n if (completed) return;\n completed = true;\n onComplete?.();\n };\n\n const prefersReducedMotion =\n window.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches ?? false;\n if (typeof navigator !== 'undefined' && JSDOM_USER_AGENT_RE.test(navigator.userAgent)) {\n finish();\n return;\n }\n\n const canvas = canvasRef.current;\n if (!canvas) {\n finish();\n return;\n }\n const bounds = canvas.getBoundingClientRect();\n if (bounds.width === 0 && bounds.height === 0) {\n finish();\n return;\n }\n const context = canvas.getContext('2d');\n if (!context) {\n finish();\n return;\n }\n\n const pixelRatio = Math.min(window.devicePixelRatio || 1, 2);\n const width = Math.max(bounds.width, 1);\n const height = Math.max(bounds.height, 1);\n canvas.width = Math.floor(width * pixelRatio);\n canvas.height = Math.floor(height * pixelRatio);\n context.scale(pixelRatio, pixelRatio);\n\n const styles = getComputedStyle(canvas);\n const colors = [\n styles.getPropertyValue('--color-background-accent-blue-base').trim(),\n styles.getPropertyValue('--color-background-accent-purple-base').trim(),\n styles.getPropertyValue('--color-background-accent-success-base').trim(),\n styles.getPropertyValue('--color-background-accent-warning-base').trim(),\n ].filter(Boolean);\n if (colors.length === 0) {\n finish();\n return;\n }\n const particles = createConfettiParticles(\n width,\n height,\n colors,\n prefersReducedMotion ? CONFETTI_RANDOM_SEED : undefined,\n );\n let frame = 0;\n const startedAt = performance.now();\n\n const draw = (now: number, advance = true) => {\n const elapsed = now - startedAt;\n context.clearRect(0, 0, width, height);\n context.globalAlpha = Math.max(0, 1 - elapsed / CONFETTI_DURATION_MS);\n for (const particle of particles) {\n if (advance) {\n particle.vy += 0.025;\n particle.vx *= 0.985;\n particle.x += particle.vx;\n particle.y += particle.vy;\n particle.rotation += 0.1;\n }\n context.save();\n context.translate(particle.x, particle.y);\n context.rotate(particle.rotation);\n context.fillStyle = particle.color;\n context.fillRect(\n -particle.size / 2,\n -particle.size / 2,\n particle.size,\n particle.size * 0.6,\n );\n context.restore();\n }\n context.globalAlpha = 1;\n if (!advance) return;\n if (elapsed < CONFETTI_DURATION_MS) {\n frame = requestAnimationFrame(draw);\n } else {\n finish();\n }\n };\n\n if (prefersReducedMotion) {\n draw(startedAt, false);\n finish();\n // Keep the static frame after hosts consume the burst immediately.\n return;\n }\n\n frame = requestAnimationFrame(draw);\n return () => {\n cancelAnimationFrame(frame);\n context.clearRect(0, 0, width, height);\n };\n }, [active, onComplete]);\n\n return (\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-0 size-full\">\n <canvas ref={canvasRef} className=\"size-full\" />\n </div>\n );\n}\n"],"names":["Button","Icon","Text","useEffect","useRef","createConfettiParticles","JSDOM_USER_AGENT_RE","CONFETTI_DURATION_MS","CONFETTI_RANDOM_SEED","SetupChecklistCompletion","showBurst","onBurstComplete","onDone","div","className","ConfettiBurst","active","onComplete","name","aria-hidden","size","bold","type","variant","onClick","canvasRef","window","completed","finish","prefersReducedMotion","matchMedia","matches","navigator","test","userAgent","canvas","current","bounds","getBoundingClientRect","width","height","context","getContext","pixelRatio","Math","min","devicePixelRatio","max","floor","scale","styles","getComputedStyle","colors","getPropertyValue","trim","filter","Boolean","length","particles","undefined","frame","startedAt","performance","now","draw","advance","elapsed","clearRect","globalAlpha","particle","vy","vx","x","y","rotation","save","translate","rotate","fillStyle","color","fillRect","restore","requestAnimationFrame","cancelAnimationFrame","ref"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare const CONFETTI_PARTICLE_COUNT = 48;
2
+ interface ConfettiParticle {
3
+ x: number;
4
+ y: number;
5
+ vx: number;
6
+ vy: number;
7
+ rotation: number;
8
+ size: number;
9
+ color: string;
10
+ }
11
+ export declare function createConfettiParticles(width: number, height: number, palette: readonly string[], seed?: number): ConfettiParticle[];
12
+ export {};
13
+ //# sourceMappingURL=setup-checklist-confetti.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-checklist-confetti.d.ts","sourceRoot":"","sources":["../../src/components/setup-checklist-confetti.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C,UAAU,gBAAgB;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,IAAI,CAAC,EAAE,MAAM,GACZ,gBAAgB,EAAE,CAYpB"}
@@ -0,0 +1,24 @@
1
+ export const CONFETTI_PARTICLE_COUNT = 48;
2
+ export function createConfettiParticles(width, height, palette, seed) {
3
+ const random = seed === undefined ? Math.random : createSeededRandom(seed);
4
+ return Array.from({
5
+ length: CONFETTI_PARTICLE_COUNT
6
+ }, (_, index)=>({
7
+ x: width / 2 + (random() - 0.5) * width * 0.55,
8
+ y: height * (0.4 + random() * 0.15),
9
+ vx: (random() - 0.5) * 2.5,
10
+ vy: -(random() * 0.7 + 0.4),
11
+ rotation: random() * Math.PI,
12
+ size: random() * 5 + 5,
13
+ color: palette[index % palette.length] ?? palette[0] ?? ''
14
+ }));
15
+ }
16
+ function createSeededRandom(seed) {
17
+ let state = seed >>> 0;
18
+ return ()=>{
19
+ state = Math.imul(state, 1_664_525) + 1_013_904_223 >>> 0;
20
+ return state / 2 ** 32;
21
+ };
22
+ }
23
+
24
+ //# sourceMappingURL=setup-checklist-confetti.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/setup-checklist-confetti.ts"],"sourcesContent":["export const CONFETTI_PARTICLE_COUNT = 48;\n\ninterface ConfettiParticle {\n x: number;\n y: number;\n vx: number;\n vy: number;\n rotation: number;\n size: number;\n color: string;\n}\n\nexport function createConfettiParticles(\n width: number,\n height: number,\n palette: readonly string[],\n seed?: number,\n): ConfettiParticle[] {\n const random = seed === undefined ? Math.random : createSeededRandom(seed);\n\n return Array.from({length: CONFETTI_PARTICLE_COUNT}, (_, index) => ({\n x: width / 2 + (random() - 0.5) * width * 0.55,\n y: height * (0.4 + random() * 0.15),\n vx: (random() - 0.5) * 2.5,\n vy: -(random() * 0.7 + 0.4),\n rotation: random() * Math.PI,\n size: random() * 5 + 5,\n color: palette[index % palette.length] ?? palette[0] ?? '',\n }));\n}\n\nfunction createSeededRandom(seed: number): () => number {\n let state = seed >>> 0;\n\n return () => {\n state = (Math.imul(state, 1_664_525) + 1_013_904_223) >>> 0;\n return state / 2 ** 32;\n };\n}\n"],"names":["CONFETTI_PARTICLE_COUNT","createConfettiParticles","width","height","palette","seed","random","undefined","Math","createSeededRandom","Array","from","length","_","index","x","y","vx","vy","rotation","PI","size","color","state","imul"],"mappings":"AAAA,OAAO,MAAMA,0BAA0B,GAAG;AAY1C,OAAO,SAASC,wBACdC,KAAa,EACbC,MAAc,EACdC,OAA0B,EAC1BC,IAAa;IAEb,MAAMC,SAASD,SAASE,YAAYC,KAAKF,MAAM,GAAGG,mBAAmBJ;IAErE,OAAOK,MAAMC,IAAI,CAAC;QAACC,QAAQZ;IAAuB,GAAG,CAACa,GAAGC,QAAW,CAAA;YAClEC,GAAGb,QAAQ,IAAI,AAACI,CAAAA,WAAW,GAAE,IAAKJ,QAAQ;YAC1Cc,GAAGb,SAAU,CAAA,MAAMG,WAAW,IAAG;YACjCW,IAAI,AAACX,CAAAA,WAAW,GAAE,IAAK;YACvBY,IAAI,CAAEZ,CAAAA,WAAW,MAAM,GAAE;YACzBa,UAAUb,WAAWE,KAAKY,EAAE;YAC5BC,MAAMf,WAAW,IAAI;YACrBgB,OAAOlB,OAAO,CAACU,QAAQV,QAAQQ,MAAM,CAAC,IAAIR,OAAO,CAAC,EAAE,IAAI;QAC1D,CAAA;AACF;AAEA,SAASK,mBAAmBJ,IAAY;IACtC,IAAIkB,QAAQlB,SAAS;IAErB,OAAO;QACLkB,QAAQ,AAACf,KAAKgB,IAAI,CAACD,OAAO,aAAa,kBAAmB;QAC1D,OAAOA,QAAQ,KAAK;IACtB;AACF"}
@@ -0,0 +1,11 @@
1
+ import type { SetupChecklist } from '#core/setup-checklist.js';
2
+ export declare function ChecklistDismissAction({ onDismiss }: {
3
+ onDismiss: () => void;
4
+ }): import("react").JSX.Element;
5
+ export declare function ChecklistHeader({ count, onDismiss, }: {
6
+ count?: string | undefined;
7
+ onDismiss: () => void;
8
+ }): import("react").JSX.Element;
9
+ export declare function ChecklistSkeleton(): import("react").JSX.Element;
10
+ export declare function checklistCountLabel(checklist: SetupChecklist): string;
11
+ //# sourceMappingURL=setup-checklist-host-primitives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-checklist-host-primitives.d.ts","sourceRoot":"","sources":["../../src/components/setup-checklist-host-primitives.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,0BAA0B,CAAC;AAE7D,wBAAgB,sBAAsB,CAAC,EAAC,SAAS,EAAC,EAAE;IAAC,SAAS,EAAE,MAAM,IAAI,CAAA;CAAC,+BAQ1E;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,SAAS,GACV,EAAE;IACD,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB,+BAwBA;AAED,wBAAgB,iBAAiB,gCAYhC;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,cAAc,UAE5D"}
@@ -0,0 +1,71 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, IconButton } from '@shipfox/react-ui/button';
3
+ import { PanelActions, PanelHeader, PanelTitle } from '@shipfox/react-ui/panel';
4
+ import { Skeleton } from '@shipfox/react-ui/skeleton';
5
+ import { Text } from '@shipfox/react-ui/typography';
6
+ export function ChecklistDismissAction({ onDismiss }) {
7
+ return /*#__PURE__*/ _jsx("div", {
8
+ className: "flex justify-end border-t border-border-neutral-base px-row py-row",
9
+ children: /*#__PURE__*/ _jsx(Button, {
10
+ type: "button",
11
+ size: "sm",
12
+ variant: "transparentMuted",
13
+ onClick: onDismiss,
14
+ children: "Hide setup guide"
15
+ })
16
+ });
17
+ }
18
+ export function ChecklistHeader({ count, onDismiss }) {
19
+ return /*#__PURE__*/ _jsxs(PanelHeader, {
20
+ children: [
21
+ /*#__PURE__*/ _jsxs("div", {
22
+ className: "flex min-w-0 items-center gap-group",
23
+ children: [
24
+ /*#__PURE__*/ _jsx(PanelTitle, {
25
+ children: "Get started"
26
+ }),
27
+ count ? /*#__PURE__*/ _jsx(Text, {
28
+ as: "span",
29
+ size: "sm",
30
+ className: "shrink-0 text-foreground-neutral-muted",
31
+ children: count
32
+ }) : null
33
+ ]
34
+ }),
35
+ /*#__PURE__*/ _jsx(PanelActions, {
36
+ children: /*#__PURE__*/ _jsx(IconButton, {
37
+ type: "button",
38
+ variant: "transparent",
39
+ size: "sm",
40
+ muted: true,
41
+ icon: "close",
42
+ "aria-label": "Hide setup guide",
43
+ onClick: onDismiss
44
+ })
45
+ })
46
+ ]
47
+ });
48
+ }
49
+ export function ChecklistSkeleton() {
50
+ return /*#__PURE__*/ _jsxs("div", {
51
+ role: "status",
52
+ "aria-label": "Loading setup guide",
53
+ className: "flex flex-col gap-inline p-panel",
54
+ children: [
55
+ /*#__PURE__*/ _jsx(Skeleton, {
56
+ className: "h-16 w-3/4"
57
+ }),
58
+ /*#__PURE__*/ _jsx(Skeleton, {
59
+ className: "h-16 w-5/6"
60
+ }),
61
+ /*#__PURE__*/ _jsx(Skeleton, {
62
+ className: "h-16 w-2/3"
63
+ })
64
+ ]
65
+ });
66
+ }
67
+ export function checklistCountLabel(checklist) {
68
+ return `${checklist.trackedCount - checklist.openCount} of ${checklist.trackedCount} done`;
69
+ }
70
+
71
+ //# sourceMappingURL=setup-checklist-host-primitives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/setup-checklist-host-primitives.tsx"],"sourcesContent":["import {Button, IconButton} from '@shipfox/react-ui/button';\nimport {PanelActions, PanelHeader, PanelTitle} from '@shipfox/react-ui/panel';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Text} from '@shipfox/react-ui/typography';\nimport type {SetupChecklist} from '#core/setup-checklist.js';\n\nexport function ChecklistDismissAction({onDismiss}: {onDismiss: () => void}) {\n return (\n <div className=\"flex justify-end border-t border-border-neutral-base px-row py-row\">\n <Button type=\"button\" size=\"sm\" variant=\"transparentMuted\" onClick={onDismiss}>\n Hide setup guide\n </Button>\n </div>\n );\n}\n\nexport function ChecklistHeader({\n count,\n onDismiss,\n}: {\n count?: string | undefined;\n onDismiss: () => void;\n}) {\n return (\n <PanelHeader>\n <div className=\"flex min-w-0 items-center gap-group\">\n <PanelTitle>Get started</PanelTitle>\n {count ? (\n <Text as=\"span\" size=\"sm\" className=\"shrink-0 text-foreground-neutral-muted\">\n {count}\n </Text>\n ) : null}\n </div>\n <PanelActions>\n <IconButton\n type=\"button\"\n variant=\"transparent\"\n size=\"sm\"\n muted\n icon=\"close\"\n aria-label=\"Hide setup guide\"\n onClick={onDismiss}\n />\n </PanelActions>\n </PanelHeader>\n );\n}\n\nexport function ChecklistSkeleton() {\n return (\n <div\n role=\"status\"\n aria-label=\"Loading setup guide\"\n className=\"flex flex-col gap-inline p-panel\"\n >\n <Skeleton className=\"h-16 w-3/4\" />\n <Skeleton className=\"h-16 w-5/6\" />\n <Skeleton className=\"h-16 w-2/3\" />\n </div>\n );\n}\n\nexport function checklistCountLabel(checklist: SetupChecklist) {\n return `${checklist.trackedCount - checklist.openCount} of ${checklist.trackedCount} done`;\n}\n"],"names":["Button","IconButton","PanelActions","PanelHeader","PanelTitle","Skeleton","Text","ChecklistDismissAction","onDismiss","div","className","type","size","variant","onClick","ChecklistHeader","count","as","muted","icon","aria-label","ChecklistSkeleton","role","checklistCountLabel","checklist","trackedCount","openCount"],"mappings":";AAAA,SAAQA,MAAM,EAAEC,UAAU,QAAO,2BAA2B;AAC5D,SAAQC,YAAY,EAAEC,WAAW,EAAEC,UAAU,QAAO,0BAA0B;AAC9E,SAAQC,QAAQ,QAAO,6BAA6B;AACpD,SAAQC,IAAI,QAAO,+BAA+B;AAGlD,OAAO,SAASC,uBAAuB,EAACC,SAAS,EAA0B;IACzE,qBACE,KAACC;QAAIC,WAAU;kBACb,cAAA,KAACV;YAAOW,MAAK;YAASC,MAAK;YAAKC,SAAQ;YAAmBC,SAASN;sBAAW;;;AAKrF;AAEA,OAAO,SAASO,gBAAgB,EAC9BC,KAAK,EACLR,SAAS,EAIV;IACC,qBACE,MAACL;;0BACC,MAACM;gBAAIC,WAAU;;kCACb,KAACN;kCAAW;;oBACXY,sBACC,KAACV;wBAAKW,IAAG;wBAAOL,MAAK;wBAAKF,WAAU;kCACjCM;yBAED;;;0BAEN,KAACd;0BACC,cAAA,KAACD;oBACCU,MAAK;oBACLE,SAAQ;oBACRD,MAAK;oBACLM,KAAK;oBACLC,MAAK;oBACLC,cAAW;oBACXN,SAASN;;;;;AAKnB;AAEA,OAAO,SAASa;IACd,qBACE,MAACZ;QACCa,MAAK;QACLF,cAAW;QACXV,WAAU;;0BAEV,KAACL;gBAASK,WAAU;;0BACpB,KAACL;gBAASK,WAAU;;0BACpB,KAACL;gBAASK,WAAU;;;;AAG1B;AAEA,OAAO,SAASa,oBAAoBC,SAAyB;IAC3D,OAAO,GAAGA,UAAUC,YAAY,GAAGD,UAAUE,SAAS,CAAC,IAAI,EAAEF,UAAUC,YAAY,CAAC,KAAK,CAAC;AAC5F"}
@@ -0,0 +1,7 @@
1
+ import type { SetupChecklistItem } from '#core/setup-checklist.js';
2
+ export declare function ChecklistRow({ item, workspaceSlug, onAction, }: {
3
+ item: SetupChecklistItem;
4
+ workspaceSlug: string;
5
+ onAction?: ((item: SetupChecklistItem) => void) | undefined;
6
+ }): import("react").JSX.Element;
7
+ //# sourceMappingURL=setup-checklist-row.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-checklist-row.d.ts","sourceRoot":"","sources":["../../src/components/setup-checklist-row.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,0BAA0B,CAAC;AAIjE,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,aAAa,EACb,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,kBAAkB,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC7D,+BA+CA"}