@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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +28 -0
- package/README.md +26 -7
- package/dist/components/setup-checklist-body.d.ts +3 -0
- package/dist/components/setup-checklist-body.d.ts.map +1 -0
- package/dist/components/setup-checklist-body.js +25 -0
- package/dist/components/setup-checklist-body.js.map +1 -0
- package/dist/components/setup-checklist-completion.d.ts +6 -0
- package/dist/components/setup-checklist-completion.d.ts.map +1 -0
- package/dist/components/setup-checklist-completion.js +156 -0
- package/dist/components/setup-checklist-completion.js.map +1 -0
- package/dist/components/setup-checklist-confetti.d.ts +13 -0
- package/dist/components/setup-checklist-confetti.d.ts.map +1 -0
- package/dist/components/setup-checklist-confetti.js +24 -0
- package/dist/components/setup-checklist-confetti.js.map +1 -0
- package/dist/components/setup-checklist-host-primitives.d.ts +11 -0
- package/dist/components/setup-checklist-host-primitives.d.ts.map +1 -0
- package/dist/components/setup-checklist-host-primitives.js +71 -0
- package/dist/components/setup-checklist-host-primitives.js.map +1 -0
- package/dist/components/setup-checklist-row.d.ts +7 -0
- package/dist/components/setup-checklist-row.d.ts.map +1 -0
- package/dist/components/setup-checklist-row.js +177 -0
- package/dist/components/setup-checklist-row.js.map +1 -0
- package/dist/components/setup-checklist-types.d.ts +19 -0
- package/dist/components/setup-checklist-types.d.ts.map +1 -0
- package/dist/components/setup-checklist-types.js +3 -0
- package/dist/components/setup-checklist-types.js.map +1 -0
- package/dist/components/setup-checklist.d.ts +5 -0
- package/dist/components/setup-checklist.d.ts.map +1 -0
- package/dist/components/setup-checklist.js +5 -0
- package/dist/components/setup-checklist.js.map +1 -0
- package/dist/components/setup-checklist.stories.d.ts +19 -0
- package/dist/components/setup-checklist.stories.d.ts.map +1 -0
- package/dist/components/setup-checklist.stories.js +305 -0
- package/dist/components/setup-checklist.stories.js.map +1 -0
- package/dist/components/workspace-setup-checklist.d.ts +3 -0
- package/dist/components/workspace-setup-checklist.d.ts.map +1 -0
- package/dist/components/workspace-setup-checklist.js +80 -0
- package/dist/components/workspace-setup-checklist.js.map +1 -0
- package/dist/components/workspace-setup-indicator.d.ts +3 -0
- package/dist/components/workspace-setup-indicator.d.ts.map +1 -0
- package/dist/components/workspace-setup-indicator.js +133 -0
- package/dist/components/workspace-setup-indicator.js.map +1 -0
- package/dist/core/setup-checklist.d.ts +2 -0
- package/dist/core/setup-checklist.d.ts.map +1 -1
- package/dist/core/setup-checklist.js +11 -6
- package/dist/core/setup-checklist.js.map +1 -1
- package/dist/feature.d.ts +6 -0
- package/dist/feature.d.ts.map +1 -0
- package/dist/feature.js +19 -0
- package/dist/feature.js.map +1 -0
- package/dist/hooks/api/setup-checklist.d.ts +13 -0
- package/dist/hooks/api/setup-checklist.d.ts.map +1 -0
- package/dist/hooks/api/setup-checklist.js +103 -0
- package/dist/hooks/api/setup-checklist.js.map +1 -0
- package/dist/hooks/use-checklist-analytics.d.ts +6 -0
- package/dist/hooks/use-checklist-analytics.d.ts.map +1 -0
- package/dist/hooks/use-checklist-analytics.js +51 -0
- package/dist/hooks/use-checklist-analytics.js.map +1 -0
- package/dist/hooks/use-checklist-dismissal.d.ts +5 -0
- package/dist/hooks/use-checklist-dismissal.d.ts.map +1 -0
- package/dist/hooks/use-checklist-dismissal.js +31 -0
- package/dist/hooks/use-checklist-dismissal.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +12 -5
- package/src/components/setup-checklist-body.tsx +35 -0
- package/src/components/setup-checklist-completion.test.tsx +124 -0
- package/src/components/setup-checklist-completion.tsx +165 -0
- package/src/components/setup-checklist-confetti.test.ts +19 -0
- package/src/components/setup-checklist-confetti.ts +39 -0
- package/src/components/setup-checklist-host-primitives.tsx +65 -0
- package/src/components/setup-checklist-row.tsx +189 -0
- package/src/components/setup-checklist-types.ts +21 -0
- package/src/components/setup-checklist.stories.tsx +281 -0
- package/src/components/setup-checklist.test.tsx +564 -0
- package/src/components/setup-checklist.tsx +8 -0
- package/src/components/workspace-setup-checklist.tsx +91 -0
- package/src/components/workspace-setup-indicator.tsx +126 -0
- package/src/core/setup-checklist.test.ts +2 -2
- package/src/core/setup-checklist.ts +19 -10
- package/src/feature.ts +16 -0
- package/src/hooks/api/setup-checklist.ts +144 -0
- package/src/hooks/use-checklist-analytics.ts +60 -0
- package/src/hooks/use-checklist-dismissal.ts +30 -0
- package/src/index.ts +8 -0
- package/tsconfig.build.tsbuildinfo +1 -1
- package/vitest.config.ts +2 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
$ shipfox-swc
|
|
2
|
-
Successfully compiled:
|
|
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
|
|
4
|
-
|
|
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
|
-
|
|
25
|
-
the checklist shows,
|
|
26
|
-
|
|
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`,
|
|
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)
|
|
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"}
|