@flamingo-stack/openframe-frontend-core 0.0.390 → 0.0.391-snapshot.20260709132828
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/dist/{chunk-RAN67OX4.js → chunk-2KW2GOFW.js} +2394 -2203
- package/dist/chunk-2KW2GOFW.js.map +1 -0
- package/dist/{chunk-3DTVUZUS.cjs → chunk-2Q2PIMSX.cjs} +5 -5
- package/dist/{chunk-3DTVUZUS.cjs.map → chunk-2Q2PIMSX.cjs.map} +1 -1
- package/dist/{chunk-W4T6Z27I.cjs → chunk-2RCCOZHC.cjs} +15 -15
- package/dist/{chunk-W4T6Z27I.cjs.map → chunk-2RCCOZHC.cjs.map} +1 -1
- package/dist/{chunk-XR4SQ32H.cjs → chunk-3YBDFKBZ.cjs} +1953 -1762
- package/dist/chunk-3YBDFKBZ.cjs.map +1 -0
- package/dist/{chunk-PQY63H3D.js → chunk-45IP2W4W.js} +2 -2
- package/dist/{chunk-ZT56IO5B.js → chunk-4L4JG5GB.js} +2 -2
- package/dist/{chunk-DI55URRP.js → chunk-4ZCXV6GB.js} +4 -4
- package/dist/{chunk-PY376F37.cjs → chunk-5PF4BSCV.cjs} +12 -12
- package/dist/{chunk-PY376F37.cjs.map → chunk-5PF4BSCV.cjs.map} +1 -1
- package/dist/{chunk-ZPMRWBWF.js → chunk-AGZMMTRL.js} +4 -4
- package/dist/{chunk-NIBFE2DV.cjs → chunk-ANLFC67D.cjs} +37 -37
- package/dist/{chunk-NIBFE2DV.cjs.map → chunk-ANLFC67D.cjs.map} +1 -1
- package/dist/{chunk-IDDSEQBZ.js → chunk-AQUU74K4.js} +4 -4
- package/dist/{chunk-3BNQCRMN.js → chunk-CSHLDG7J.js} +2 -2
- package/dist/{chunk-L5HOLKHH.cjs → chunk-DHJVMIKE.cjs} +26 -26
- package/dist/{chunk-L5HOLKHH.cjs.map → chunk-DHJVMIKE.cjs.map} +1 -1
- package/dist/{chunk-HWH2ZTP3.cjs → chunk-FGZ23YLT.cjs} +62 -62
- package/dist/{chunk-HWH2ZTP3.cjs.map → chunk-FGZ23YLT.cjs.map} +1 -1
- package/dist/{chunk-EFY7ALPU.cjs → chunk-GCUAXBR6.cjs} +9 -9
- package/dist/{chunk-EFY7ALPU.cjs.map → chunk-GCUAXBR6.cjs.map} +1 -1
- package/dist/{chunk-LTGZ46D4.js → chunk-HXFHEKGD.js} +4 -4
- package/dist/{chunk-IBEJAPAU.js → chunk-J6QEZIRO.js} +2 -2
- package/dist/{chunk-XG4FQFMH.cjs → chunk-NYAZENBC.cjs} +7 -7
- package/dist/{chunk-XG4FQFMH.cjs.map → chunk-NYAZENBC.cjs.map} +1 -1
- package/dist/{chunk-DAMGTJ7E.js → chunk-QEN2T5AV.js} +2 -2
- package/dist/{chunk-MSKUU2C6.js → chunk-R2VRTPLY.js} +2 -2
- package/dist/{chunk-33IT4ZAY.js → chunk-SGKMMZBD.js} +2 -2
- package/dist/{chunk-TOBDMXND.cjs → chunk-TTL3ILIM.cjs} +31 -31
- package/dist/{chunk-TOBDMXND.cjs.map → chunk-TTL3ILIM.cjs.map} +1 -1
- package/dist/{chunk-RABSUY3W.cjs → chunk-UCXBVKSM.cjs} +26 -26
- package/dist/{chunk-RABSUY3W.cjs.map → chunk-UCXBVKSM.cjs.map} +1 -1
- package/dist/{chunk-EIH6WUAP.cjs → chunk-YV4UMWDP.cjs} +59 -59
- package/dist/{chunk-EIH6WUAP.cjs.map → chunk-YV4UMWDP.cjs.map} +1 -1
- package/dist/components/case-studies/index.cjs +8 -8
- package/dist/components/case-studies/index.js +2 -2
- package/dist/components/chat/approval-batch-message.d.ts +13 -4
- package/dist/components/chat/approval-batch-message.d.ts.map +1 -1
- package/dist/components/chat/approval-request-message.d.ts.map +1 -1
- package/dist/components/chat/chat-message-enhanced.d.ts.map +1 -1
- package/dist/components/chat/chat-message-list.d.ts.map +1 -1
- package/dist/components/chat/index.cjs +4 -2
- package/dist/components/chat/index.cjs.map +1 -1
- package/dist/components/chat/index.js +3 -1
- package/dist/components/chat/types/chat.types.d.ts +13 -0
- package/dist/components/chat/types/chat.types.d.ts.map +1 -1
- package/dist/components/chat/types/component.types.d.ts +21 -3
- package/dist/components/chat/types/component.types.d.ts.map +1 -1
- package/dist/components/chat/types/message.types.d.ts +3 -0
- package/dist/components/chat/types/message.types.d.ts.map +1 -1
- package/dist/components/contact/index.cjs +3 -3
- package/dist/components/contact/index.js +2 -2
- package/dist/components/docs/index.cjs +5 -5
- package/dist/components/docs/index.js +4 -4
- package/dist/components/embeds/index.cjs +3 -3
- package/dist/components/embeds/index.js +2 -2
- package/dist/components/faq/index.cjs +3 -3
- package/dist/components/faq/index.js +2 -2
- package/dist/components/features/auth/auth-shell.d.ts +1 -3
- package/dist/components/features/auth/auth-shell.d.ts.map +1 -1
- package/dist/components/features/auth/complete-account-form.d.ts +43 -0
- package/dist/components/features/auth/complete-account-form.d.ts.map +1 -0
- package/dist/components/features/auth/index.d.ts +1 -1
- package/dist/components/features/auth/index.d.ts.map +1 -1
- package/dist/components/features/index.cjs +2 -2
- package/dist/components/features/index.cjs.map +1 -1
- package/dist/components/features/index.js +3 -3
- package/dist/components/features/notifications/notification-drawer.d.ts.map +1 -1
- package/dist/components/features/time-tracker/time-tracker-header-button.d.ts +5 -2
- package/dist/components/features/time-tracker/time-tracker-header-button.d.ts.map +1 -1
- package/dist/components/help-center-pages/index.cjs +20 -20
- package/dist/components/help-center-pages/index.js +11 -11
- package/dist/components/index.cjs +122 -120
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +13 -11
- package/dist/components/index.js.map +1 -1
- package/dist/components/navigation/app-header.d.ts.map +1 -1
- package/dist/components/navigation/app-layout-context.d.ts +34 -0
- package/dist/components/navigation/app-layout-context.d.ts.map +1 -0
- package/dist/components/navigation/app-layout-drawer.d.ts.map +1 -1
- package/dist/components/navigation/app-layout.d.ts +2 -21
- package/dist/components/navigation/app-layout.d.ts.map +1 -1
- package/dist/components/navigation/index.cjs +2 -2
- package/dist/components/navigation/index.js +1 -1
- package/dist/components/onboarding-guides/index.cjs +5 -5
- package/dist/components/onboarding-guides/index.js +4 -4
- package/dist/components/related-content/index.cjs +3 -3
- package/dist/components/related-content/index.js +2 -2
- package/dist/components/tickets/index.cjs +5 -5
- package/dist/components/tickets/index.js +4 -4
- package/dist/components/ui/index.cjs +4 -2
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.js +3 -1
- package/dist/index.cjs +4 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -3
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/chat/approval-batch-message.tsx +104 -88
- package/src/components/chat/approval-request-message.tsx +57 -3
- package/src/components/chat/chat-message-enhanced.tsx +16 -2
- package/src/components/chat/chat-message-list.tsx +3 -0
- package/src/components/chat/types/chat.types.ts +17 -0
- package/src/components/chat/types/component.types.ts +21 -3
- package/src/components/chat/types/message.types.ts +3 -0
- package/src/components/features/auth/auth-shell.tsx +2 -11
- package/src/components/features/auth/complete-account-form.tsx +197 -0
- package/src/components/features/auth/index.ts +1 -1
- package/src/components/features/notifications/notification-drawer.tsx +72 -43
- package/src/components/features/time-tracker/time-tracker-header-button.tsx +46 -6
- package/src/components/navigation/app-header.tsx +13 -9
- package/src/components/navigation/app-layout-context.ts +46 -0
- package/src/components/navigation/app-layout-drawer.tsx +21 -11
- package/src/components/navigation/app-layout.tsx +17 -39
- package/src/stories/ApprovalBatchMessageClient.stories.tsx +20 -62
- package/src/stories/auth/CompleteAccount.stories.tsx +103 -0
- package/src/stories/auth/CreateOrganization.stories.tsx +0 -6
- package/src/stories/auth/Login.stories.tsx +0 -6
- package/src/stories/auth/PasswordReset.stories.tsx +0 -6
- package/src/styles/app-globals.css +30 -17
- package/dist/chunk-RAN67OX4.js.map +0 -1
- package/dist/chunk-XR4SQ32H.cjs.map +0 -1
- package/dist/components/features/auth/accept-invitation-form.d.ts +0 -23
- package/dist/components/features/auth/accept-invitation-form.d.ts.map +0 -1
- package/src/components/features/auth/accept-invitation-form.tsx +0 -71
- package/src/stories/auth/AcceptInvitation.stories.tsx +0 -54
- /package/dist/{chunk-PQY63H3D.js.map → chunk-45IP2W4W.js.map} +0 -0
- /package/dist/{chunk-ZT56IO5B.js.map → chunk-4L4JG5GB.js.map} +0 -0
- /package/dist/{chunk-DI55URRP.js.map → chunk-4ZCXV6GB.js.map} +0 -0
- /package/dist/{chunk-ZPMRWBWF.js.map → chunk-AGZMMTRL.js.map} +0 -0
- /package/dist/{chunk-IDDSEQBZ.js.map → chunk-AQUU74K4.js.map} +0 -0
- /package/dist/{chunk-3BNQCRMN.js.map → chunk-CSHLDG7J.js.map} +0 -0
- /package/dist/{chunk-LTGZ46D4.js.map → chunk-HXFHEKGD.js.map} +0 -0
- /package/dist/{chunk-IBEJAPAU.js.map → chunk-J6QEZIRO.js.map} +0 -0
- /package/dist/{chunk-DAMGTJ7E.js.map → chunk-QEN2T5AV.js.map} +0 -0
- /package/dist/{chunk-MSKUU2C6.js.map → chunk-R2VRTPLY.js.map} +0 -0
- /package/dist/{chunk-33IT4ZAY.js.map → chunk-SGKMMZBD.js.map} +0 -0
|
@@ -4,34 +4,31 @@ import type React from "react";
|
|
|
4
4
|
import { ApprovalBatchMessage } from "../components/chat/approval-batch-message";
|
|
5
5
|
import type {
|
|
6
6
|
ApprovalBatchData,
|
|
7
|
-
ApprovalBatchExecutionState,
|
|
8
7
|
PendingToolCallData,
|
|
9
8
|
} from "../components/chat/types";
|
|
10
9
|
|
|
11
10
|
/**
|
|
12
|
-
* CLIENT (Fae) variant of the
|
|
11
|
+
* CLIENT (end-user Fae desktop app) variant of the approval block — Figma
|
|
12
|
+
* node 203-11947 ("fae-approval-block").
|
|
13
13
|
*
|
|
14
|
-
* Same component and props as the Admin card, driven by `
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
14
|
+
* Same component and props as the Admin card, driven by `variant="client"`.
|
|
15
|
+
* The end client sees ONLY the BE-generated title plus the Approve/Reject
|
|
16
|
+
* buttons, or the full-text resolved pill ("Approved by Michael Johnson").
|
|
17
|
+
* Commands, scripts, expandable args/results and execution icons are never
|
|
18
|
+
* rendered in this variant.
|
|
18
19
|
*/
|
|
19
20
|
|
|
20
21
|
const LONG_COMMAND = `Get-CimInstance Win32_Process |
|
|
21
22
|
Select-Object ProcessId, Name, Path, CommandLine |
|
|
22
23
|
Where-Object { $_.Path -like 'C:\\Users\\Public\\*' }`;
|
|
23
24
|
|
|
24
|
-
const RESULT = `pid | name | path | cmdline
|
|
25
|
-
4821 | suspicious.exe | C:\\Users\\Public\\suspicious.exe | suspicious.exe --hidden --connect 185.220.101.45`;
|
|
26
|
-
|
|
27
25
|
const REQUEST_ID = "req-1";
|
|
28
26
|
|
|
29
27
|
const toolCall: PendingToolCallData = {
|
|
30
28
|
toolExecutionRequestId: REQUEST_ID,
|
|
31
29
|
toolName: "run_script",
|
|
32
30
|
toolTitle: "Run Script",
|
|
33
|
-
//
|
|
34
|
-
// the raw command moves into the expanded body (Figma 1972-6100).
|
|
31
|
+
// BE-generated human-readable title — the ONLY content the client sees.
|
|
35
32
|
toolExplanation:
|
|
36
33
|
"Collects today's system, application, and security event logs and exports them to a CSV file.",
|
|
37
34
|
toolType: "OPENFRAME_RMM",
|
|
@@ -44,39 +41,12 @@ const toolCall: PendingToolCallData = {
|
|
|
44
41
|
},
|
|
45
42
|
};
|
|
46
43
|
|
|
47
|
-
const makeData = (
|
|
48
|
-
executions?: Record<string, ApprovalBatchExecutionState>,
|
|
49
|
-
): ApprovalBatchData => ({
|
|
44
|
+
const makeData = (): ApprovalBatchData => ({
|
|
50
45
|
approvalRequestId: "batch-1",
|
|
51
46
|
approvalType: "CLIENT",
|
|
52
47
|
toolCalls: [toolCall],
|
|
53
|
-
executions,
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
const executingData = makeData({ [REQUEST_ID]: { status: "executing" } });
|
|
57
|
-
const doneData = makeData({
|
|
58
|
-
[REQUEST_ID]: { status: "done", result: RESULT, success: true },
|
|
59
48
|
});
|
|
60
49
|
|
|
61
|
-
/**
|
|
62
|
-
* The assistant's message text that precedes the command block in the real
|
|
63
|
-
* chat (Figma "Command description text."). It is NOT part of the component —
|
|
64
|
-
* shown here only so the story matches the Figma frame.
|
|
65
|
-
*/
|
|
66
|
-
const CommandHeading = () => (
|
|
67
|
-
<p className="text-h4 text-ods-text-primary mb-[var(--spacing-system-xxs)]">
|
|
68
|
-
Command description text.
|
|
69
|
-
</p>
|
|
70
|
-
);
|
|
71
|
-
|
|
72
|
-
const constrainedDecorator =
|
|
73
|
-
(width?: number) => (Story: React.ComponentType) => (
|
|
74
|
-
<div style={{ maxWidth: width ?? 400, background: "var(--color-bg)" }}>
|
|
75
|
-
<CommandHeading />
|
|
76
|
-
<Story />
|
|
77
|
-
</div>
|
|
78
|
-
);
|
|
79
|
-
|
|
80
50
|
const plainDecorator =
|
|
81
51
|
(width?: number) => (Story: React.ComponentType) => (
|
|
82
52
|
<div style={{ maxWidth: width ?? 400, background: "var(--color-bg)" }}>
|
|
@@ -88,22 +58,22 @@ const meta = {
|
|
|
88
58
|
title: "Chat/Client/ApprovalBatchMessage",
|
|
89
59
|
component: ApprovalBatchMessage,
|
|
90
60
|
tags: ["autodocs"],
|
|
91
|
-
args: {
|
|
61
|
+
args: { variant: "client" },
|
|
92
62
|
parameters: {
|
|
93
63
|
docs: {
|
|
94
64
|
description: {
|
|
95
65
|
component:
|
|
96
|
-
"CLIENT (Fae)
|
|
66
|
+
"CLIENT (Fae end-user) approval block — title-only card with Approve/Reject or a full-text status pill. Commands/scripts are never shown. Gated by variant='client' (Figma 203-11947).",
|
|
97
67
|
},
|
|
98
68
|
},
|
|
99
69
|
},
|
|
100
|
-
decorators: [
|
|
70
|
+
decorators: [plainDecorator()],
|
|
101
71
|
} satisfies Meta<typeof ApprovalBatchMessage>;
|
|
102
72
|
|
|
103
73
|
export default meta;
|
|
104
74
|
type Story = StoryObj<typeof meta>;
|
|
105
75
|
|
|
106
|
-
/** Pending — Approve / Reject buttons.
|
|
76
|
+
/** Pending — title + Approve / Reject buttons. No expandable command. */
|
|
107
77
|
export const Pending: Story = {
|
|
108
78
|
args: {
|
|
109
79
|
data: makeData(),
|
|
@@ -113,19 +83,10 @@ export const Pending: Story = {
|
|
|
113
83
|
},
|
|
114
84
|
};
|
|
115
85
|
|
|
116
|
-
/** Approved
|
|
117
|
-
export const
|
|
86
|
+
/** Approved — full-text green status pill. */
|
|
87
|
+
export const Approved: Story = {
|
|
118
88
|
args: {
|
|
119
|
-
data:
|
|
120
|
-
status: "approved",
|
|
121
|
-
resolvedByName: "Michael Johnson",
|
|
122
|
-
},
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
/** Approved and finished — green check + expandable Result block. */
|
|
126
|
-
export const ApprovedDone: Story = {
|
|
127
|
-
args: {
|
|
128
|
-
data: doneData,
|
|
89
|
+
data: makeData(),
|
|
129
90
|
status: "approved",
|
|
130
91
|
resolvedByName: "Michael Johnson",
|
|
131
92
|
},
|
|
@@ -150,25 +111,22 @@ export const Cancelled: Story = {
|
|
|
150
111
|
};
|
|
151
112
|
|
|
152
113
|
/**
|
|
153
|
-
* All states side by side — mirrors the Figma CLIENT
|
|
114
|
+
* All states side by side — mirrors the Figma CLIENT approval-block frames
|
|
115
|
+
* (1-6575 / 1-6621 / 1-6637 / 1-6653).
|
|
154
116
|
*/
|
|
155
117
|
export const AllStates: Story = {
|
|
156
118
|
decorators: [plainDecorator(420)],
|
|
157
119
|
render: () => {
|
|
158
120
|
const states = [
|
|
159
121
|
{ data: makeData(), status: "pending" as const, onApprove: () => {}, onReject: () => {} },
|
|
160
|
-
{ data:
|
|
161
|
-
{ data: doneData, status: "approved" as const, resolvedByName: "Michael Johnson" },
|
|
122
|
+
{ data: makeData(), status: "approved" as const, resolvedByName: "Michael Johnson" },
|
|
162
123
|
{ data: makeData(), status: "rejected" as const, resolvedByName: "Michael Johnson" },
|
|
163
124
|
{ data: makeData(), status: "cancelled" as const, resolvedByName: "Michael Johnson" },
|
|
164
125
|
];
|
|
165
126
|
return (
|
|
166
127
|
<div style={{ display: "flex", flexDirection: "column", gap: 32 }}>
|
|
167
128
|
{states.map((s, i) => (
|
|
168
|
-
<
|
|
169
|
-
<CommandHeading />
|
|
170
|
-
<ApprovalBatchMessage assistantType="fae" {...s} />
|
|
171
|
-
</div>
|
|
129
|
+
<ApprovalBatchMessage key={i} variant="client" {...s} />
|
|
172
130
|
))}
|
|
173
131
|
</div>
|
|
174
132
|
);
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/nextjs-vite'
|
|
2
|
+
import { useState } from 'react'
|
|
3
|
+
import {
|
|
4
|
+
type AuthSsoProvider,
|
|
5
|
+
AuthShell,
|
|
6
|
+
BackToLoginLink,
|
|
7
|
+
CompleteAccountForm,
|
|
8
|
+
} from '../../components/features/auth'
|
|
9
|
+
import { TabSelector } from '../../components/ui/tab-selector'
|
|
10
|
+
|
|
11
|
+
const meta = {
|
|
12
|
+
title: 'Auth/Complete Account',
|
|
13
|
+
component: CompleteAccountForm,
|
|
14
|
+
parameters: {
|
|
15
|
+
layout: 'fullscreen',
|
|
16
|
+
docs: {
|
|
17
|
+
description: {
|
|
18
|
+
component:
|
|
19
|
+
'Account details form shared by Sign Up ("Complete your Account") and Accept Invitation: Continue with Google/Microsoft on top, then name + password fields. Presentational + controlled.',
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
tags: ['autodocs'],
|
|
24
|
+
} satisfies Meta<typeof CompleteAccountForm>
|
|
25
|
+
|
|
26
|
+
export default meta
|
|
27
|
+
type Story = StoryObj<typeof meta>
|
|
28
|
+
|
|
29
|
+
const SSO_PROVIDERS: AuthSsoProvider[] = ['google', 'microsoft']
|
|
30
|
+
|
|
31
|
+
function useAccountFields(filled: boolean) {
|
|
32
|
+
const [firstName, setFirstName] = useState(filled ? 'Ada' : '')
|
|
33
|
+
const [lastName, setLastName] = useState(filled ? 'Lovelace' : '')
|
|
34
|
+
const [password, setPassword] = useState(filled ? 'SuperSecretPassphrase2024!' : '')
|
|
35
|
+
const [confirmPassword, setConfirmPassword] = useState(filled ? 'SuperSecretPassphrase2024!' : '')
|
|
36
|
+
|
|
37
|
+
const isValid =
|
|
38
|
+
!!firstName.trim() && !!lastName.trim() && password.length >= 8 && password === confirmPassword
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
firstName,
|
|
42
|
+
lastName,
|
|
43
|
+
password,
|
|
44
|
+
confirmPassword,
|
|
45
|
+
onFirstNameChange: setFirstName,
|
|
46
|
+
onLastNameChange: setLastName,
|
|
47
|
+
onPasswordChange: setPassword,
|
|
48
|
+
onConfirmPasswordChange: setConfirmPassword,
|
|
49
|
+
submitDisabled: !isValid,
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Sign Up step: tabs + Back to Organization secondary action. */
|
|
54
|
+
function SignUpPage({ filled = false }: { filled?: boolean }) {
|
|
55
|
+
const fields = useAccountFields(filled)
|
|
56
|
+
|
|
57
|
+
const tabs = (
|
|
58
|
+
<TabSelector
|
|
59
|
+
value="signup"
|
|
60
|
+
onValueChange={() => {}}
|
|
61
|
+
variant="primary"
|
|
62
|
+
items={[
|
|
63
|
+
{ id: 'signup', label: 'Sign Up' },
|
|
64
|
+
{ id: 'login', label: 'Login' },
|
|
65
|
+
]}
|
|
66
|
+
/>
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
return (
|
|
70
|
+
<AuthShell tabs={tabs}>
|
|
71
|
+
<CompleteAccountForm
|
|
72
|
+
{...fields}
|
|
73
|
+
onSubmit={() => {}}
|
|
74
|
+
onBack={() => {}}
|
|
75
|
+
ssoProviders={SSO_PROVIDERS}
|
|
76
|
+
onSsoClick={() => {}}
|
|
77
|
+
/>
|
|
78
|
+
</AuthShell>
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Accept Invitation: no tabs, no back action; "Back to Login" in the shell footer. */
|
|
83
|
+
function InvitationPage({ filled = false }: { filled?: boolean }) {
|
|
84
|
+
const fields = useAccountFields(filled)
|
|
85
|
+
|
|
86
|
+
return (
|
|
87
|
+
<AuthShell footer={<BackToLoginLink onClick={() => {}} />}>
|
|
88
|
+
<CompleteAccountForm
|
|
89
|
+
{...fields}
|
|
90
|
+
onSubmit={() => {}}
|
|
91
|
+
ssoProviders={SSO_PROVIDERS}
|
|
92
|
+
onSsoClick={() => {}}
|
|
93
|
+
title="Accept Invitation"
|
|
94
|
+
subtitle="Complete your registration to join the organization"
|
|
95
|
+
/>
|
|
96
|
+
</AuthShell>
|
|
97
|
+
)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export const SignUpEmpty: Story = { render: () => <SignUpPage /> }
|
|
101
|
+
export const SignUpFilled: Story = { render: () => <SignUpPage filled /> }
|
|
102
|
+
export const InvitationEmpty: Story = { render: () => <InvitationPage /> }
|
|
103
|
+
export const InvitationFilled: Story = { render: () => <InvitationPage filled /> }
|
|
@@ -51,12 +51,6 @@ function CreateOrganizationPage(initial: Partial<CreateOrganizationFormProps>) {
|
|
|
51
51
|
return (
|
|
52
52
|
<AuthShell
|
|
53
53
|
tabs={tabs}
|
|
54
|
-
mobileTagline={
|
|
55
|
-
<>
|
|
56
|
-
<p>All your MSP ops in one place.</p>
|
|
57
|
-
<p>Open-source, AI-ready, no vendor tax.</p>
|
|
58
|
-
</>
|
|
59
|
-
}
|
|
60
54
|
>
|
|
61
55
|
{tab === 'signup' ? (
|
|
62
56
|
<CreateOrganizationForm
|
|
@@ -43,12 +43,6 @@ function LoginPage(initial: Partial<LoginFormProps>) {
|
|
|
43
43
|
return (
|
|
44
44
|
<AuthShell
|
|
45
45
|
tabs={tabs}
|
|
46
|
-
mobileTagline={
|
|
47
|
-
<>
|
|
48
|
-
<p>All your MSP ops in one place.</p>
|
|
49
|
-
<p>Open-source, AI-ready, no vendor tax.</p>
|
|
50
|
-
</>
|
|
51
|
-
}
|
|
52
46
|
>
|
|
53
47
|
{tab === 'login' ? (
|
|
54
48
|
<LoginForm
|
|
@@ -29,12 +29,6 @@ function PasswordResetPage({ initialPassword = '', initialConfirm = '' }: { init
|
|
|
29
29
|
|
|
30
30
|
return (
|
|
31
31
|
<AuthShell
|
|
32
|
-
mobileTagline={
|
|
33
|
-
<>
|
|
34
|
-
<p>All your MSP ops in one place.</p>
|
|
35
|
-
<p>Open-source, AI-ready, no vendor tax.</p>
|
|
36
|
-
</>
|
|
37
|
-
}
|
|
38
32
|
footer={<BackToLoginLink onClick={() => {}} />}
|
|
39
33
|
>
|
|
40
34
|
<PasswordResetForm
|
|
@@ -1,14 +1,39 @@
|
|
|
1
1
|
/* Global resets */
|
|
2
2
|
* {
|
|
3
3
|
@apply border-border;
|
|
4
|
-
scrollbar-width: none;
|
|
5
|
-
-ms-overflow-style: none;
|
|
6
4
|
}
|
|
7
5
|
|
|
6
|
+
/* Elevator scrollbar, Firefox fallback. Scoped via @supports because
|
|
7
|
+
scrollbar-width/color would disable ::-webkit-scrollbar styling in Chrome */
|
|
8
|
+
@supports not selector(::-webkit-scrollbar) {
|
|
9
|
+
* {
|
|
10
|
+
scrollbar-width: thin;
|
|
11
|
+
scrollbar-color: var(--ods-system-greys-grey) var(--ods-system-greys-soft-grey);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* Elevator scrollbar (ODS): 8px track + draggable rounded thumb */
|
|
8
16
|
*::-webkit-scrollbar {
|
|
9
|
-
width:
|
|
10
|
-
height:
|
|
11
|
-
|
|
17
|
+
width: 8px;
|
|
18
|
+
height: 8px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
*::-webkit-scrollbar-track {
|
|
22
|
+
background-color: var(--ods-system-greys-soft-grey);
|
|
23
|
+
border-radius: 4px;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
*::-webkit-scrollbar-thumb {
|
|
27
|
+
background-color: var(--ods-system-greys-grey);
|
|
28
|
+
border-radius: 4px;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
*::-webkit-scrollbar-thumb:hover {
|
|
32
|
+
background-color: var(--ods-system-greys-grey-hover);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
*::-webkit-scrollbar-corner {
|
|
36
|
+
background-color: transparent;
|
|
12
37
|
}
|
|
13
38
|
|
|
14
39
|
body {
|
|
@@ -134,18 +159,6 @@ body {
|
|
|
134
159
|
}
|
|
135
160
|
}
|
|
136
161
|
|
|
137
|
-
/* Global scrollbar suppression */
|
|
138
|
-
*::-webkit-scrollbar-thumb {
|
|
139
|
-
background-color: transparent;
|
|
140
|
-
}
|
|
141
|
-
*::-webkit-scrollbar-track {
|
|
142
|
-
background-color: transparent;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
* {
|
|
146
|
-
scrollbar-color: transparent transparent;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
162
|
/* Shadcn/ui HSL CSS variables for Tailwind compatibility */
|
|
150
163
|
:root {
|
|
151
164
|
--background: 0 0% 8.6%;
|