@flamingo-stack/openframe-frontend-core 0.0.486-snapshot.20260727163255 → 0.0.486
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-WLRBZXFB.js → chunk-2BMYCH3D.js} +2 -2
- package/dist/{chunk-AUGM74CO.js → chunk-5WZGZ6B2.js} +4 -4
- package/dist/{chunk-QBDHNUQX.js → chunk-6QJ2QRQE.js} +4 -4
- package/dist/{chunk-UU4DW7JX.cjs → chunk-BVHMDHQY.cjs} +31 -31
- package/dist/{chunk-UU4DW7JX.cjs.map → chunk-BVHMDHQY.cjs.map} +1 -1
- package/dist/{chunk-KTD2MGYF.cjs → chunk-C4QKMOQK.cjs} +7 -7
- package/dist/{chunk-KTD2MGYF.cjs.map → chunk-C4QKMOQK.cjs.map} +1 -1
- package/dist/{chunk-HWK5CH5N.cjs → chunk-F3BH5B7M.cjs} +11 -11
- package/dist/{chunk-HWK5CH5N.cjs.map → chunk-F3BH5B7M.cjs.map} +1 -1
- package/dist/{chunk-EO7MUGY4.cjs → chunk-HQITFULS.cjs} +9 -9
- package/dist/{chunk-EO7MUGY4.cjs.map → chunk-HQITFULS.cjs.map} +1 -1
- package/dist/{chunk-GXOUXAXU.js → chunk-J5KX5K5T.js} +2 -2
- package/dist/{chunk-SDNMOAT4.js → chunk-KA4ILVCX.js} +2 -2
- package/dist/{chunk-ITEPRN6L.js → chunk-KRKNTK5Y.js} +2 -2
- package/dist/{chunk-UBK5HIMH.js → chunk-MD5E5BKO.js} +4 -4
- package/dist/{chunk-RAYDQGJV.cjs → chunk-NTHTORJ3.cjs} +59 -59
- package/dist/{chunk-RAYDQGJV.cjs.map → chunk-NTHTORJ3.cjs.map} +1 -1
- package/dist/{chunk-TJSJPOPL.cjs → chunk-NZYUSFMI.cjs} +350 -573
- package/dist/chunk-NZYUSFMI.cjs.map +1 -0
- package/dist/{chunk-NETEA5E4.js → chunk-OW33LYO2.js} +4 -4
- package/dist/{chunk-4TFUB2CR.cjs → chunk-PHYEC3EG.cjs} +26 -26
- package/dist/{chunk-4TFUB2CR.cjs.map → chunk-PHYEC3EG.cjs.map} +1 -1
- package/dist/{chunk-QL7S3CH4.cjs → chunk-RB6HX4KC.cjs} +26 -26
- package/dist/{chunk-QL7S3CH4.cjs.map → chunk-RB6HX4KC.cjs.map} +1 -1
- package/dist/{chunk-BC74IKAX.js → chunk-REURWDBC.js} +4482 -4705
- package/dist/chunk-REURWDBC.js.map +1 -0
- package/dist/{chunk-K6MITU6M.cjs → chunk-RILRBUDL.cjs} +62 -62
- package/dist/{chunk-K6MITU6M.cjs.map → chunk-RILRBUDL.cjs.map} +1 -1
- package/dist/{chunk-W6GDTB4R.cjs → chunk-RR6XPEEG.cjs} +15 -15
- package/dist/{chunk-W6GDTB4R.cjs.map → chunk-RR6XPEEG.cjs.map} +1 -1
- package/dist/{chunk-QW6SPNPT.cjs → chunk-XJ6VL3AP.cjs} +37 -37
- package/dist/{chunk-QW6SPNPT.cjs.map → chunk-XJ6VL3AP.cjs.map} +1 -1
- package/dist/{chunk-SMD67GJP.js → chunk-XOIKQW2H.js} +2 -2
- package/dist/{chunk-BTMYUK4P.js → chunk-Z3V42W7P.js} +2 -2
- package/dist/{chunk-G4XU7BYU.js → chunk-ZTRRB2Y2.js} +2 -2
- package/dist/{chunk-6SBAF5VG.cjs → chunk-ZVFH4LTD.cjs} +5 -5
- package/dist/{chunk-6SBAF5VG.cjs.map → chunk-ZVFH4LTD.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/index.cjs +2 -2
- package/dist/components/chat/index.js +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/index.cjs +2 -2
- package/dist/components/features/index.js +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 +130 -144
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +9 -23
- package/dist/components/index.js.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/assignee-dropdown.d.ts.map +1 -1
- package/dist/components/ui/index.cjs +2 -16
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.d.ts +0 -2
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +1 -15
- package/dist/index.cjs +2 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -15
- package/package.json +1 -1
- package/src/components/ui/assignee-dropdown.tsx +91 -36
- package/src/components/ui/index.ts +0 -2
- package/dist/chunk-BC74IKAX.js.map +0 -1
- package/dist/chunk-TJSJPOPL.cjs.map +0 -1
- package/dist/components/ui/searchable-select.d.ts +0 -43
- package/dist/components/ui/searchable-select.d.ts.map +0 -1
- package/dist/components/ui/test-run.d.ts +0 -74
- package/dist/components/ui/test-run.d.ts.map +0 -1
- package/src/components/ui/searchable-select.tsx +0 -186
- package/src/components/ui/test-run.tsx +0 -282
- package/src/stories/SearchableSelect.stories.tsx +0 -139
- package/src/stories/TestRun.stories.tsx +0 -118
- /package/dist/{chunk-WLRBZXFB.js.map → chunk-2BMYCH3D.js.map} +0 -0
- /package/dist/{chunk-AUGM74CO.js.map → chunk-5WZGZ6B2.js.map} +0 -0
- /package/dist/{chunk-QBDHNUQX.js.map → chunk-6QJ2QRQE.js.map} +0 -0
- /package/dist/{chunk-GXOUXAXU.js.map → chunk-J5KX5K5T.js.map} +0 -0
- /package/dist/{chunk-SDNMOAT4.js.map → chunk-KA4ILVCX.js.map} +0 -0
- /package/dist/{chunk-ITEPRN6L.js.map → chunk-KRKNTK5Y.js.map} +0 -0
- /package/dist/{chunk-UBK5HIMH.js.map → chunk-MD5E5BKO.js.map} +0 -0
- /package/dist/{chunk-NETEA5E4.js.map → chunk-OW33LYO2.js.map} +0 -0
- /package/dist/{chunk-SMD67GJP.js.map → chunk-XOIKQW2H.js.map} +0 -0
- /package/dist/{chunk-BTMYUK4P.js.map → chunk-Z3V42W7P.js.map} +0 -0
- /package/dist/{chunk-G4XU7BYU.js.map → chunk-ZTRRB2Y2.js.map} +0 -0
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/nextjs-vite';
|
|
2
|
-
import { useState } from 'react';
|
|
3
|
-
import { SearchableSelect, type SearchableSelectProps } from '../components/ui/searchable-select';
|
|
4
|
-
import { SquareAvatar } from '../components/ui/square-avatar';
|
|
5
|
-
import { MonitorIcon, UserPlusIcon } from '../components/icons-v2-generated';
|
|
6
|
-
|
|
7
|
-
const meta = {
|
|
8
|
-
title: 'UI/SearchableSelect',
|
|
9
|
-
component: SearchableSelect,
|
|
10
|
-
argTypes: {
|
|
11
|
-
align: {
|
|
12
|
-
control: 'select',
|
|
13
|
-
options: ['start', 'center', 'end'],
|
|
14
|
-
},
|
|
15
|
-
isLoading: { control: 'boolean' },
|
|
16
|
-
disabled: { control: 'boolean' },
|
|
17
|
-
},
|
|
18
|
-
parameters: {
|
|
19
|
-
docs: {
|
|
20
|
-
description: {
|
|
21
|
-
component:
|
|
22
|
-
'Select-style dropdown whose first item is a search field filtering the option list - ' +
|
|
23
|
-
'the ticket assignee "Search users..." pattern generalized for any entity. The default ' +
|
|
24
|
-
'trigger matches SelectTrigger; pass a custom trigger for icon-button use cases ' +
|
|
25
|
-
'(AssigneeDropdown compact is built on this component).',
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
} satisfies Meta<typeof SearchableSelect>;
|
|
30
|
-
|
|
31
|
-
export default meta;
|
|
32
|
-
type Story = StoryObj<typeof meta>;
|
|
33
|
-
|
|
34
|
-
const DEVICES = [
|
|
35
|
-
{ value: '1', label: "John's MacBook Pro" },
|
|
36
|
-
{ value: '2', label: 'Design-Studio-iMac' },
|
|
37
|
-
{ value: '3', label: 'Front-Desk-PC' },
|
|
38
|
-
{ value: '4', label: 'QA-Windows-11' },
|
|
39
|
-
{ value: '5', label: 'Server-Room-Linux' },
|
|
40
|
-
{ value: '6', label: "Olivia's ThinkPad" },
|
|
41
|
-
{ value: '7', label: 'Warehouse-Scanner-01' },
|
|
42
|
-
{ value: '8', label: 'Reception-Tablet' },
|
|
43
|
-
];
|
|
44
|
-
|
|
45
|
-
function ControlledSelect(props: Partial<SearchableSelectProps>) {
|
|
46
|
-
const [value, setValue] = useState<string | null>(props.value ?? null);
|
|
47
|
-
return (
|
|
48
|
-
<SearchableSelect
|
|
49
|
-
options={DEVICES}
|
|
50
|
-
placeholder="Select Device"
|
|
51
|
-
searchPlaceholder="Search for Device"
|
|
52
|
-
emptyText="No devices found"
|
|
53
|
-
{...props}
|
|
54
|
-
value={value}
|
|
55
|
-
onValueChange={setValue}
|
|
56
|
-
/>
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/** Default select-like trigger; the search input is the first dropdown item. */
|
|
61
|
-
export const DeviceSelect: Story = {
|
|
62
|
-
args: {
|
|
63
|
-
options: DEVICES,
|
|
64
|
-
onValueChange: () => {},
|
|
65
|
-
placeholder: 'Select Device',
|
|
66
|
-
searchPlaceholder: 'Search for Device',
|
|
67
|
-
emptyText: 'No devices found',
|
|
68
|
-
},
|
|
69
|
-
render: args => (
|
|
70
|
-
<div className="w-[320px] bg-ods-bg p-[var(--spacing-system-mf)]">
|
|
71
|
-
<ControlledSelect {...args} />
|
|
72
|
-
</div>
|
|
73
|
-
),
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
/** Options can carry a leading icon/avatar node. */
|
|
77
|
-
export const WithOptionIcons: Story = {
|
|
78
|
-
args: {
|
|
79
|
-
options: DEVICES.map(d => ({
|
|
80
|
-
...d,
|
|
81
|
-
icon: <MonitorIcon className="size-5 shrink-0 text-ods-text-secondary" />,
|
|
82
|
-
})),
|
|
83
|
-
onValueChange: () => {},
|
|
84
|
-
placeholder: 'Select Device',
|
|
85
|
-
searchPlaceholder: 'Search for Device',
|
|
86
|
-
emptyText: 'No devices found',
|
|
87
|
-
},
|
|
88
|
-
render: args => (
|
|
89
|
-
<div className="w-[320px] bg-ods-bg p-[var(--spacing-system-mf)]">
|
|
90
|
-
<ControlledSelect {...args} />
|
|
91
|
-
</div>
|
|
92
|
-
),
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
/** Custom icon-button trigger - the AssigneeDropdown compact use case. */
|
|
96
|
-
export const CustomTrigger: Story = {
|
|
97
|
-
args: {
|
|
98
|
-
options: ['Roman Smith', 'Mike Johnson', 'Olivia Chen', 'Ava Martinez'].map((name, i) => ({
|
|
99
|
-
value: String(i + 1),
|
|
100
|
-
label: name,
|
|
101
|
-
icon: <SquareAvatar alt={name} fallback={name} size="sm" variant="round" className="h-6 w-6 shrink-0" />,
|
|
102
|
-
})),
|
|
103
|
-
onValueChange: () => {},
|
|
104
|
-
searchPlaceholder: 'Search users...',
|
|
105
|
-
emptyText: 'No users found',
|
|
106
|
-
align: 'end',
|
|
107
|
-
contentClassName: 'w-72',
|
|
108
|
-
trigger: (
|
|
109
|
-
<button
|
|
110
|
-
type="button"
|
|
111
|
-
aria-label="Assign user"
|
|
112
|
-
className="size-8 rounded-full border border-ods-border flex items-center justify-center shrink-0 text-ods-text-secondary hover:text-ods-accent hover:border-ods-accent transition-colors"
|
|
113
|
-
>
|
|
114
|
-
<UserPlusIcon className="size-4" />
|
|
115
|
-
</button>
|
|
116
|
-
),
|
|
117
|
-
},
|
|
118
|
-
render: args => (
|
|
119
|
-
<div className="flex w-[320px] justify-end bg-ods-bg p-[var(--spacing-system-mf)]">
|
|
120
|
-
<ControlledSelect {...args} />
|
|
121
|
-
</div>
|
|
122
|
-
),
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
/** Loading state shown inside the dropdown. */
|
|
126
|
-
export const Loading: Story = {
|
|
127
|
-
args: {
|
|
128
|
-
options: [],
|
|
129
|
-
onValueChange: () => {},
|
|
130
|
-
placeholder: 'Select Device',
|
|
131
|
-
searchPlaceholder: 'Search for Device',
|
|
132
|
-
isLoading: true,
|
|
133
|
-
},
|
|
134
|
-
render: args => (
|
|
135
|
-
<div className="w-[320px] bg-ods-bg p-[var(--spacing-system-mf)]">
|
|
136
|
-
<ControlledSelect {...args} />
|
|
137
|
-
</div>
|
|
138
|
-
),
|
|
139
|
-
};
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/nextjs-vite';
|
|
2
|
-
import { TestResultsSkeleton, TestRunResults, TimingStat } from '../components/ui/test-run';
|
|
3
|
-
|
|
4
|
-
const meta = {
|
|
5
|
-
title: 'UI/TestRun',
|
|
6
|
-
component: TestRunResults,
|
|
7
|
-
parameters: {
|
|
8
|
-
docs: {
|
|
9
|
-
description: {
|
|
10
|
-
component:
|
|
11
|
-
'Building blocks for live test-run panels ("run a query somewhere, stream tabular results back"): ' +
|
|
12
|
-
'timing stats, a one-row column skeleton, and a results table with always-visible headers and ' +
|
|
13
|
-
'horizontal scroll fades. Pair with useTestRunState, which wraps an app-owned campaign ' +
|
|
14
|
-
'(e.g. a Fleet live query hook) with the run/stop/reset state machine.',
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
} satisfies Meta<typeof TestRunResults>;
|
|
19
|
-
|
|
20
|
-
export default meta;
|
|
21
|
-
type Story = StoryObj<typeof meta>;
|
|
22
|
-
|
|
23
|
-
const RESULT_ROWS = [
|
|
24
|
-
{
|
|
25
|
-
'host display name': 'workstation-01',
|
|
26
|
-
pid: '1234',
|
|
27
|
-
name: 'chrome',
|
|
28
|
-
path: '/Applications/Google Chrome.app',
|
|
29
|
-
state: 'R',
|
|
30
|
-
uid: '501',
|
|
31
|
-
'resident size': '245760000',
|
|
32
|
-
threads: '42',
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
'host display name': 'workstation-01',
|
|
36
|
-
pid: '5678',
|
|
37
|
-
name: 'node',
|
|
38
|
-
path: '/usr/local/bin/node',
|
|
39
|
-
state: 'S',
|
|
40
|
-
uid: '501',
|
|
41
|
-
'resident size': '98304000',
|
|
42
|
-
threads: '12',
|
|
43
|
-
},
|
|
44
|
-
];
|
|
45
|
-
|
|
46
|
-
/** Finished run with rows: DataTable styling, headers on all breakpoints. */
|
|
47
|
-
export const WithResults: Story = {
|
|
48
|
-
args: {
|
|
49
|
-
isActive: false,
|
|
50
|
-
displayRows: RESULT_ROWS,
|
|
51
|
-
firstError: null,
|
|
52
|
-
},
|
|
53
|
-
render: args => (
|
|
54
|
-
<div className="max-w-[720px] bg-ods-bg p-[var(--spacing-system-mf)]">
|
|
55
|
-
<TestRunResults {...args} />
|
|
56
|
-
</div>
|
|
57
|
-
),
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
/** Running: one-row skeleton with fixed 160px columns. */
|
|
61
|
-
export const Running: Story = {
|
|
62
|
-
args: {
|
|
63
|
-
isActive: true,
|
|
64
|
-
displayRows: [],
|
|
65
|
-
firstError: null,
|
|
66
|
-
},
|
|
67
|
-
render: args => (
|
|
68
|
-
<div className="max-w-[720px] bg-ods-bg p-[var(--spacing-system-mf)]">
|
|
69
|
-
<TestRunResults {...args} />
|
|
70
|
-
</div>
|
|
71
|
-
),
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
/** Finished with zero rows: fixed-height empty state (no layout jump). */
|
|
75
|
-
export const EmptyResult: Story = {
|
|
76
|
-
args: {
|
|
77
|
-
isActive: false,
|
|
78
|
-
displayRows: [],
|
|
79
|
-
firstError: null,
|
|
80
|
-
},
|
|
81
|
-
render: args => (
|
|
82
|
-
<div className="max-w-[720px] bg-ods-bg p-[var(--spacing-system-mf)]">
|
|
83
|
-
<TestRunResults {...args} />
|
|
84
|
-
</div>
|
|
85
|
-
),
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
/** Finished with an error: the alert line replaces the empty state. */
|
|
89
|
-
export const WithError: Story = {
|
|
90
|
-
args: {
|
|
91
|
-
isActive: false,
|
|
92
|
-
displayRows: [],
|
|
93
|
-
firstError: 'no such table: procesess (near "procesess": syntax error)',
|
|
94
|
-
},
|
|
95
|
-
render: args => (
|
|
96
|
-
<div className="max-w-[720px] bg-ods-bg p-[var(--spacing-system-mf)]">
|
|
97
|
-
<TestRunResults {...args} />
|
|
98
|
-
</div>
|
|
99
|
-
),
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
/** Timing cells + standalone skeleton, as composed by app test panels. */
|
|
103
|
-
export const TimingAndSkeleton: Story = {
|
|
104
|
-
args: {
|
|
105
|
-
isActive: true,
|
|
106
|
-
displayRows: [],
|
|
107
|
-
firstError: null,
|
|
108
|
-
},
|
|
109
|
-
render: () => (
|
|
110
|
-
<div className="flex max-w-[720px] flex-col gap-[var(--spacing-system-m)] bg-ods-bg p-[var(--spacing-system-mf)]">
|
|
111
|
-
<div className="flex items-center gap-[var(--spacing-system-m)]">
|
|
112
|
-
<TimingStat value="02:15 PM" label="Started" className="flex-1" />
|
|
113
|
-
<TimingStat value="00:00:05" label="Duration" className="flex-1" />
|
|
114
|
-
</div>
|
|
115
|
-
<TestResultsSkeleton />
|
|
116
|
-
</div>
|
|
117
|
-
),
|
|
118
|
-
};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|