@shipfox/react-ui 0.14.0 → 0.15.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/.storybook/preview.tsx +7 -0
- package/.turbo/turbo-build.log +7 -7
- package/.turbo/turbo-check.log +2 -2
- package/.turbo/turbo-type.log +1 -1
- package/CHANGELOG.md +10 -0
- package/dist/components/avatar/avatar.js +1 -1
- package/dist/components/avatar/avatar.js.map +1 -1
- package/dist/components/button-group/button-group.d.ts +17 -0
- package/dist/components/button-group/button-group.d.ts.map +1 -0
- package/dist/components/button-group/button-group.js +74 -0
- package/dist/components/button-group/button-group.js.map +1 -0
- package/dist/components/button-group/button-group.stories.js +644 -0
- package/dist/components/button-group/button-group.stories.js.map +1 -0
- package/dist/components/button-group/index.d.ts +2 -0
- package/dist/components/button-group/index.d.ts.map +1 -0
- package/dist/components/button-group/index.js +3 -0
- package/dist/components/button-group/index.js.map +1 -0
- package/dist/components/code-block/code-block-footer.d.ts.map +1 -1
- package/dist/components/code-block/code-block-footer.js +4 -2
- package/dist/components/code-block/code-block-footer.js.map +1 -1
- package/dist/components/command/command.d.ts +28 -0
- package/dist/components/command/command.d.ts.map +1 -0
- package/dist/components/command/command.js +190 -0
- package/dist/components/command/command.js.map +1 -0
- package/dist/components/command/command.stories.js +228 -0
- package/dist/components/command/command.stories.js.map +1 -0
- package/dist/components/command/index.d.ts +2 -0
- package/dist/components/command/index.d.ts.map +1 -0
- package/dist/components/command/index.js +3 -0
- package/dist/components/command/index.js.map +1 -0
- package/dist/components/dashboard/components/analytics-content.d.ts +2 -0
- package/dist/components/dashboard/components/analytics-content.d.ts.map +1 -0
- package/dist/components/dashboard/components/analytics-content.js +180 -0
- package/dist/components/dashboard/components/analytics-content.js.map +1 -0
- package/dist/components/dashboard/components/animated-logo.d.ts +4 -0
- package/dist/components/dashboard/components/animated-logo.d.ts.map +1 -0
- package/dist/components/dashboard/components/animated-logo.js +23 -0
- package/dist/components/dashboard/components/animated-logo.js.map +1 -0
- package/dist/components/dashboard/components/complete-setup-button.d.ts +4 -0
- package/dist/components/dashboard/components/complete-setup-button.d.ts.map +1 -0
- package/dist/components/dashboard/components/complete-setup-button.js +28 -0
- package/dist/components/dashboard/components/complete-setup-button.js.map +1 -0
- package/dist/components/dashboard/components/jobs-content.d.ts +2 -0
- package/dist/components/dashboard/components/jobs-content.d.ts.map +1 -0
- package/dist/components/dashboard/components/jobs-content.js +69 -0
- package/dist/components/dashboard/components/jobs-content.js.map +1 -0
- package/dist/components/dashboard/components/mobile-menu.d.ts +2 -0
- package/dist/components/dashboard/components/mobile-menu.d.ts.map +1 -0
- package/dist/components/dashboard/components/mobile-menu.js +65 -0
- package/dist/components/dashboard/components/mobile-menu.js.map +1 -0
- package/dist/components/dashboard/components/organization-selector.d.ts +2 -0
- package/dist/components/dashboard/components/organization-selector.d.ts.map +1 -0
- package/dist/components/dashboard/components/organization-selector.js +92 -0
- package/dist/components/dashboard/components/organization-selector.js.map +1 -0
- package/dist/components/dashboard/components/top-menu.d.ts +5 -0
- package/dist/components/dashboard/components/top-menu.d.ts.map +1 -0
- package/dist/components/dashboard/components/top-menu.js +31 -0
- package/dist/components/dashboard/components/top-menu.js.map +1 -0
- package/dist/components/dashboard/components/topbar-button.d.ts +7 -0
- package/dist/components/dashboard/components/topbar-button.d.ts.map +1 -0
- package/dist/components/dashboard/components/topbar-button.js +18 -0
- package/dist/components/dashboard/components/topbar-button.js.map +1 -0
- package/dist/components/dashboard/components/topbar.d.ts +4 -0
- package/dist/components/dashboard/components/topbar.d.ts.map +1 -0
- package/dist/components/dashboard/components/topbar.js +62 -0
- package/dist/components/dashboard/components/topbar.js.map +1 -0
- package/dist/components/dashboard/components/user-profile.d.ts +2 -0
- package/dist/components/dashboard/components/user-profile.d.ts.map +1 -0
- package/dist/components/dashboard/components/user-profile.js +146 -0
- package/dist/components/dashboard/components/user-profile.js.map +1 -0
- package/dist/components/dashboard/dashboard.d.ts +2 -0
- package/dist/components/dashboard/dashboard.d.ts.map +1 -0
- package/dist/components/dashboard/dashboard.js +70 -0
- package/dist/components/dashboard/dashboard.js.map +1 -0
- package/dist/components/dashboard/dashboard.stories.js +23 -0
- package/dist/components/dashboard/dashboard.stories.js.map +1 -0
- package/dist/components/dashboard/index.d.ts +2 -0
- package/dist/components/dashboard/index.d.ts.map +1 -0
- package/dist/components/dashboard/index.js +3 -0
- package/dist/components/dashboard/index.js.map +1 -0
- package/dist/components/form/form.stories.js +6 -1
- package/dist/components/form/form.stories.js.map +1 -1
- package/dist/components/index.d.ts +7 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +7 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/kbd/index.d.ts +2 -0
- package/dist/components/kbd/index.d.ts.map +1 -0
- package/dist/components/kbd/index.js +3 -0
- package/dist/components/kbd/index.js.map +1 -0
- package/dist/components/kbd/kbd.d.ts +7 -0
- package/dist/components/kbd/kbd.d.ts.map +1 -0
- package/dist/components/kbd/kbd.js +18 -0
- package/dist/components/kbd/kbd.js.map +1 -0
- package/dist/components/kbd/kbd.stories.js +119 -0
- package/dist/components/kbd/kbd.stories.js.map +1 -0
- package/dist/components/search/index.d.ts +7 -0
- package/dist/components/search/index.d.ts.map +1 -0
- package/dist/components/search/index.js +8 -0
- package/dist/components/search/index.js.map +1 -0
- package/dist/components/search/search-context.d.ts +11 -0
- package/dist/components/search/search-context.d.ts.map +1 -0
- package/dist/components/search/search-context.js +56 -0
- package/dist/components/search/search-context.js.map +1 -0
- package/dist/components/search/search-inline.d.ts +9 -0
- package/dist/components/search/search-inline.d.ts.map +1 -0
- package/dist/components/search/search-inline.js +85 -0
- package/dist/components/search/search-inline.js.map +1 -0
- package/dist/components/search/search-modal.d.ts +25 -0
- package/dist/components/search/search-modal.d.ts.map +1 -0
- package/dist/components/search/search-modal.js +162 -0
- package/dist/components/search/search-modal.js.map +1 -0
- package/dist/components/search/search-trigger.d.ts +9 -0
- package/dist/components/search/search-trigger.d.ts.map +1 -0
- package/dist/components/search/search-trigger.js +37 -0
- package/dist/components/search/search-trigger.js.map +1 -0
- package/dist/components/search/search-variants.d.ts +14 -0
- package/dist/components/search/search-variants.d.ts.map +1 -0
- package/dist/components/search/search-variants.js +90 -0
- package/dist/components/search/search-variants.js.map +1 -0
- package/dist/components/search/search.d.ts +11 -0
- package/dist/components/search/search.d.ts.map +1 -0
- package/dist/components/search/search.js +35 -0
- package/dist/components/search/search.js.map +1 -0
- package/dist/components/search/search.stories.js +630 -0
- package/dist/components/search/search.stories.js.map +1 -0
- package/dist/components/select/index.d.ts +2 -0
- package/dist/components/select/index.d.ts.map +1 -0
- package/dist/components/select/index.js +3 -0
- package/dist/components/select/index.js.map +1 -0
- package/dist/components/select/select.d.ts +25 -0
- package/dist/components/select/select.d.ts.map +1 -0
- package/dist/components/select/select.js +153 -0
- package/dist/components/select/select.js.map +1 -0
- package/dist/components/select/select.stories.js +393 -0
- package/dist/components/select/select.stories.js.map +1 -0
- package/dist/components/skeleton/index.d.ts +2 -0
- package/dist/components/skeleton/index.d.ts.map +1 -0
- package/dist/components/skeleton/index.js +3 -0
- package/dist/components/skeleton/index.js.map +1 -0
- package/dist/components/skeleton/skeleton.d.ts +5 -0
- package/dist/components/skeleton/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton/skeleton.js +11 -0
- package/dist/components/skeleton/skeleton.js.map +1 -0
- package/dist/components/skeleton/skeleton.stories.js +345 -0
- package/dist/components/skeleton/skeleton.stories.js.map +1 -0
- package/dist/components/table/data-table.d.ts +70 -0
- package/dist/components/table/data-table.d.ts.map +1 -0
- package/dist/components/table/data-table.js +159 -0
- package/dist/components/table/data-table.js.map +1 -0
- package/dist/components/table/index.d.ts +6 -0
- package/dist/components/table/index.d.ts.map +1 -0
- package/dist/components/table/index.js +6 -0
- package/dist/components/table/index.js.map +1 -0
- package/dist/components/table/table-column-header.d.ts +79 -0
- package/dist/components/table/table-column-header.d.ts.map +1 -0
- package/dist/components/table/table-column-header.js +99 -0
- package/dist/components/table/table-column-header.js.map +1 -0
- package/dist/components/table/table-pagination.d.ts +53 -0
- package/dist/components/table/table-pagination.d.ts.map +1 -0
- package/dist/components/table/table-pagination.js +139 -0
- package/dist/components/table/table-pagination.js.map +1 -0
- package/dist/components/table/table.d.ts +11 -0
- package/dist/components/table/table.d.ts.map +1 -0
- package/dist/components/table/table.js +64 -0
- package/dist/components/table/table.js.map +1 -0
- package/dist/components/table/table.stories.columns.d.ts +24 -0
- package/dist/components/table/table.stories.columns.d.ts.map +1 -0
- package/dist/components/table/table.stories.columns.js +310 -0
- package/dist/components/table/table.stories.columns.js.map +1 -0
- package/dist/components/table/table.stories.components.d.ts +14 -0
- package/dist/components/table/table.stories.components.d.ts.map +1 -0
- package/dist/components/table/table.stories.components.js +107 -0
- package/dist/components/table/table.stories.components.js.map +1 -0
- package/dist/components/table/table.stories.data.d.ts +54 -0
- package/dist/components/table/table.stories.data.d.ts.map +1 -0
- package/dist/components/table/table.stories.data.js +122 -0
- package/dist/components/table/table.stories.data.js.map +1 -0
- package/dist/components/table/table.stories.js +302 -0
- package/dist/components/table/table.stories.js.map +1 -0
- package/dist/styles.css +1 -1
- package/index.css +48 -0
- package/package.json +3 -2
- package/src/components/avatar/avatar.tsx +1 -1
- package/src/components/button-group/button-group.stories.tsx +361 -0
- package/src/components/button-group/button-group.tsx +111 -0
- package/src/components/button-group/index.ts +1 -0
- package/src/components/code-block/code-block-footer.tsx +8 -1
- package/src/components/command/command.stories.tsx +133 -0
- package/src/components/command/command.tsx +265 -0
- package/src/components/command/index.ts +1 -0
- package/src/components/dashboard/components/analytics-content.tsx +102 -0
- package/src/components/dashboard/components/animated-logo.tsx +25 -0
- package/src/components/dashboard/components/complete-setup-button.tsx +30 -0
- package/src/components/dashboard/components/jobs-content.tsx +51 -0
- package/src/components/dashboard/components/mobile-menu.tsx +50 -0
- package/src/components/dashboard/components/organization-selector.tsx +51 -0
- package/src/components/dashboard/components/top-menu.tsx +26 -0
- package/src/components/dashboard/components/topbar-button.tsx +27 -0
- package/src/components/dashboard/components/topbar.tsx +40 -0
- package/src/components/dashboard/components/user-profile.tsx +90 -0
- package/src/components/dashboard/dashboard.stories.tsx +25 -0
- package/src/components/dashboard/dashboard.tsx +61 -0
- package/src/components/dashboard/index.ts +1 -0
- package/src/components/form/form.stories.tsx +5 -0
- package/src/components/index.ts +7 -0
- package/src/components/kbd/index.ts +1 -0
- package/src/components/kbd/kbd.stories.tsx +64 -0
- package/src/components/kbd/kbd.tsx +32 -0
- package/src/components/search/index.ts +28 -0
- package/src/components/search/search-context.tsx +78 -0
- package/src/components/search/search-inline.tsx +107 -0
- package/src/components/search/search-modal.tsx +198 -0
- package/src/components/search/search-trigger.tsx +47 -0
- package/src/components/search/search-variants.ts +88 -0
- package/src/components/search/search.stories.tsx +392 -0
- package/src/components/search/search.tsx +47 -0
- package/src/components/select/index.ts +1 -0
- package/src/components/select/select.stories.tsx +207 -0
- package/src/components/select/select.tsx +220 -0
- package/src/components/skeleton/index.ts +1 -0
- package/src/components/skeleton/skeleton.stories.tsx +178 -0
- package/src/components/skeleton/skeleton.tsx +14 -0
- package/src/components/table/data-table.tsx +254 -0
- package/src/components/table/index.ts +5 -0
- package/src/components/table/table-column-header.tsx +141 -0
- package/src/components/table/table-pagination.tsx +161 -0
- package/src/components/table/table.stories.columns.tsx +198 -0
- package/src/components/table/table.stories.components.tsx +104 -0
- package/src/components/table/table.stories.data.ts +117 -0
- package/src/components/table/table.stories.tsx +256 -0
- package/src/components/table/table.tsx +95 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/dashboard/components/jobs-content.tsx"],"sourcesContent":["import {Button} from 'components/button';\nimport {Icon} from 'components/icon';\nimport {SearchInline} from 'components/search/search-inline';\nimport {DataTable} from 'components/table/data-table';\nimport {jobColumns} from 'components/table/table.stories.columns';\nimport {jobsData} from 'components/table/table.stories.data';\nimport {Header as TypographyHeader} from 'components/typography';\nimport {useMemo, useState} from 'react';\n\nexport function JobsContent() {\n const [searchQuery, setSearchQuery] = useState('');\n\n const filteredData = useMemo(\n () => jobsData.filter((job) => job.name.toLowerCase().includes(searchQuery.toLowerCase())),\n [searchQuery],\n );\n\n return (\n <div className=\"min-h-[calc(100vh-48px)] p-12 md:p-24 bg-background-neutral-base\">\n <div className=\"rounded-t-8 overflow-hidden\">\n <div className=\"flex flex-col md:flex-row md:items-center md:justify-between gap-12 md:gap-0 p-12 border-t border-x border-border-neutral-base rounded-t-8 bg-background-neutral-base\">\n <TypographyHeader variant=\"h3\" className=\"text-foreground-neutral-base\">\n Jobs breakdown\n </TypographyHeader>\n\n <div className=\"flex items-center gap-8 md:gap-16 w-full md:w-auto\">\n <SearchInline\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n onClear={() => setSearchQuery('')}\n className=\"flex-1 md:w-240\"\n />\n <Button variant=\"secondary\" aria-label=\"Insert column left\" className=\"shrink-0\">\n <Icon name=\"insertColumnLeft\" className=\"size-16 text-foreground-neutral-subtle\" />\n </Button>\n </div>\n </div>\n\n <DataTable\n columns={jobColumns}\n data={filteredData}\n pagination={true}\n pageSize={10}\n pageSizeOptions={[10, 20, 50, 100]}\n className=\"rounded-t-none\"\n />\n </div>\n </div>\n );\n}\n"],"names":["Button","Icon","SearchInline","DataTable","jobColumns","jobsData","Header","TypographyHeader","useMemo","useState","JobsContent","searchQuery","setSearchQuery","filteredData","filter","job","name","toLowerCase","includes","div","className","variant","placeholder","value","onChange","e","target","onClear","aria-label","columns","data","pagination","pageSize","pageSizeOptions"],"mappings":";AAAA,SAAQA,MAAM,QAAO,oBAAoB;AACzC,SAAQC,IAAI,QAAO,kBAAkB;AACrC,SAAQC,YAAY,QAAO,kCAAkC;AAC7D,SAAQC,SAAS,QAAO,8BAA8B;AACtD,SAAQC,UAAU,QAAO,yCAAyC;AAClE,SAAQC,QAAQ,QAAO,sCAAsC;AAC7D,SAAQC,UAAUC,gBAAgB,QAAO,wBAAwB;AACjE,SAAQC,OAAO,EAAEC,QAAQ,QAAO,QAAQ;AAExC,OAAO,SAASC;IACd,MAAM,CAACC,aAAaC,eAAe,GAAGH,SAAS;IAE/C,MAAMI,eAAeL,QACnB,IAAMH,SAASS,MAAM,CAAC,CAACC,MAAQA,IAAIC,IAAI,CAACC,WAAW,GAAGC,QAAQ,CAACP,YAAYM,WAAW,MACtF;QAACN;KAAY;IAGf,qBACE,KAACQ;QAAIC,WAAU;kBACb,cAAA,MAACD;YAAIC,WAAU;;8BACb,MAACD;oBAAIC,WAAU;;sCACb,KAACb;4BAAiBc,SAAQ;4BAAKD,WAAU;sCAA+B;;sCAIxE,MAACD;4BAAIC,WAAU;;8CACb,KAAClB;oCACCoB,aAAY;oCACZC,OAAOZ;oCACPa,UAAU,CAACC,IAAMb,eAAea,EAAEC,MAAM,CAACH,KAAK;oCAC9CI,SAAS,IAAMf,eAAe;oCAC9BQ,WAAU;;8CAEZ,KAACpB;oCAAOqB,SAAQ;oCAAYO,cAAW;oCAAqBR,WAAU;8CACpE,cAAA,KAACnB;wCAAKe,MAAK;wCAAmBI,WAAU;;;;;;;8BAK9C,KAACjB;oBACC0B,SAASzB;oBACT0B,MAAMjB;oBACNkB,YAAY;oBACZC,UAAU;oBACVC,iBAAiB;wBAAC;wBAAI;wBAAI;wBAAI;qBAAI;oBAClCb,WAAU;;;;;AAKpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mobile-menu.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/components/mobile-menu.tsx"],"names":[],"mappings":"AAaA,wBAAgB,UAAU,4CAoCzB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from '../../../components/button/index.js';
|
|
3
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from '../../../components/dropdown-menu/index.js';
|
|
4
|
+
import { Icon } from '../../../components/icon/index.js';
|
|
5
|
+
import { ShinyText } from '../../../components/shiny-text/index.js';
|
|
6
|
+
import { useResolvedTheme } from '../../../hooks/useResolvedTheme.js';
|
|
7
|
+
import { ShipfoxLoader } from 'shipfox-loader-react';
|
|
8
|
+
export function MobileMenu() {
|
|
9
|
+
const resolvedTheme = useResolvedTheme();
|
|
10
|
+
return /*#__PURE__*/ _jsxs(DropdownMenu, {
|
|
11
|
+
children: [
|
|
12
|
+
/*#__PURE__*/ _jsx(DropdownMenuTrigger, {
|
|
13
|
+
asChild: true,
|
|
14
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
15
|
+
type: "button",
|
|
16
|
+
variant: "transparent",
|
|
17
|
+
className: "flex md:hidden items-center justify-center shrink-0 w-40 h-40 bg-background-subtle-base hover:bg-background-neutral-hover transition-colors rounded-none border-l border-border-neutral-strong",
|
|
18
|
+
"aria-label": "Menu",
|
|
19
|
+
children: /*#__PURE__*/ _jsx(Icon, {
|
|
20
|
+
name: "menuLine",
|
|
21
|
+
className: "size-18 text-foreground-neutral-subtle"
|
|
22
|
+
})
|
|
23
|
+
})
|
|
24
|
+
}),
|
|
25
|
+
/*#__PURE__*/ _jsxs(DropdownMenuContent, {
|
|
26
|
+
align: "end",
|
|
27
|
+
className: "w-200",
|
|
28
|
+
children: [
|
|
29
|
+
/*#__PURE__*/ _jsx(DropdownMenuItem, {
|
|
30
|
+
children: /*#__PURE__*/ _jsxs("div", {
|
|
31
|
+
className: "flex items-center gap-8",
|
|
32
|
+
children: [
|
|
33
|
+
/*#__PURE__*/ _jsx(ShipfoxLoader, {
|
|
34
|
+
size: 13,
|
|
35
|
+
animation: "circular",
|
|
36
|
+
color: resolvedTheme === 'dark' ? 'white' : 'orange',
|
|
37
|
+
background: resolvedTheme === 'dark' ? 'dark' : 'light'
|
|
38
|
+
}),
|
|
39
|
+
/*#__PURE__*/ _jsx(ShinyText, {
|
|
40
|
+
text: "Complete setup",
|
|
41
|
+
className: "flex-1 text-sm font-medium leading-20 text-foreground-neutral-base truncate text-left"
|
|
42
|
+
})
|
|
43
|
+
]
|
|
44
|
+
})
|
|
45
|
+
}),
|
|
46
|
+
/*#__PURE__*/ _jsx(DropdownMenuSeparator, {}),
|
|
47
|
+
/*#__PURE__*/ _jsx(DropdownMenuItem, {
|
|
48
|
+
icon: "searchLine",
|
|
49
|
+
children: "Search"
|
|
50
|
+
}),
|
|
51
|
+
/*#__PURE__*/ _jsx(DropdownMenuItem, {
|
|
52
|
+
icon: "questionLine",
|
|
53
|
+
children: "Help"
|
|
54
|
+
}),
|
|
55
|
+
/*#__PURE__*/ _jsx(DropdownMenuItem, {
|
|
56
|
+
icon: "notification3Line",
|
|
57
|
+
children: "Notifications"
|
|
58
|
+
})
|
|
59
|
+
]
|
|
60
|
+
})
|
|
61
|
+
]
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=mobile-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/dashboard/components/mobile-menu.tsx"],"sourcesContent":["import {Button} from 'components/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from 'components/dropdown-menu';\nimport {Icon} from 'components/icon';\nimport {ShinyText} from 'components/shiny-text';\nimport {useResolvedTheme} from 'hooks/useResolvedTheme';\nimport {ShipfoxLoader} from 'shipfox-loader-react';\n\nexport function MobileMenu() {\n const resolvedTheme = useResolvedTheme();\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"transparent\"\n className=\"flex md:hidden items-center justify-center shrink-0 w-40 h-40 bg-background-subtle-base hover:bg-background-neutral-hover transition-colors rounded-none border-l border-border-neutral-strong\"\n aria-label=\"Menu\"\n >\n <Icon name=\"menuLine\" className=\"size-18 text-foreground-neutral-subtle\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-200\">\n <DropdownMenuItem>\n <div className=\"flex items-center gap-8\">\n <ShipfoxLoader\n size={13}\n animation=\"circular\"\n color={resolvedTheme === 'dark' ? 'white' : 'orange'}\n background={resolvedTheme === 'dark' ? 'dark' : 'light'}\n />\n <ShinyText\n text=\"Complete setup\"\n className=\"flex-1 text-sm font-medium leading-20 text-foreground-neutral-base truncate text-left\"\n />\n </div>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem icon=\"searchLine\">Search</DropdownMenuItem>\n <DropdownMenuItem icon=\"questionLine\">Help</DropdownMenuItem>\n <DropdownMenuItem icon=\"notification3Line\">Notifications</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"names":["Button","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuTrigger","Icon","ShinyText","useResolvedTheme","ShipfoxLoader","MobileMenu","resolvedTheme","asChild","type","variant","className","aria-label","name","align","div","size","animation","color","background","text","icon"],"mappings":";AAAA,SAAQA,MAAM,QAAO,oBAAoB;AACzC,SACEC,YAAY,EACZC,mBAAmB,EACnBC,gBAAgB,EAChBC,qBAAqB,EACrBC,mBAAmB,QACd,2BAA2B;AAClC,SAAQC,IAAI,QAAO,kBAAkB;AACrC,SAAQC,SAAS,QAAO,wBAAwB;AAChD,SAAQC,gBAAgB,QAAO,yBAAyB;AACxD,SAAQC,aAAa,QAAO,uBAAuB;AAEnD,OAAO,SAASC;IACd,MAAMC,gBAAgBH;IACtB,qBACE,MAACP;;0BACC,KAACI;gBAAoBO,OAAO;0BAC1B,cAAA,KAACZ;oBACCa,MAAK;oBACLC,SAAQ;oBACRC,WAAU;oBACVC,cAAW;8BAEX,cAAA,KAACV;wBAAKW,MAAK;wBAAWF,WAAU;;;;0BAGpC,MAACb;gBAAoBgB,OAAM;gBAAMH,WAAU;;kCACzC,KAACZ;kCACC,cAAA,MAACgB;4BAAIJ,WAAU;;8CACb,KAACN;oCACCW,MAAM;oCACNC,WAAU;oCACVC,OAAOX,kBAAkB,SAAS,UAAU;oCAC5CY,YAAYZ,kBAAkB,SAAS,SAAS;;8CAElD,KAACJ;oCACCiB,MAAK;oCACLT,WAAU;;;;;kCAIhB,KAACX;kCACD,KAACD;wBAAiBsB,MAAK;kCAAa;;kCACpC,KAACtB;wBAAiBsB,MAAK;kCAAe;;kCACtC,KAACtB;wBAAiBsB,MAAK;kCAAoB;;;;;;AAInD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organization-selector.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/components/organization-selector.tsx"],"names":[],"mappings":"AAYA,wBAAgB,oBAAoB,4CAsCnC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Avatar } from '../../../components/avatar/index.js';
|
|
3
|
+
import { Button } from '../../../components/button/index.js';
|
|
4
|
+
import { Icon } from '../../../components/icon/index.js';
|
|
5
|
+
import { Select, SelectContent, SelectItem, SelectSeparator, SelectTrigger, SelectValue } from '../../../components/select/index.js';
|
|
6
|
+
export function OrganizationSelector() {
|
|
7
|
+
return /*#__PURE__*/ _jsxs(Select, {
|
|
8
|
+
defaultValue: "stripe",
|
|
9
|
+
children: [
|
|
10
|
+
/*#__PURE__*/ _jsx(SelectTrigger, {
|
|
11
|
+
className: "w-200 h-40 shadow-none bg-background-neutral-base hover:bg-background-neutral-hover rounded-none gap-8 pl-12 border-l min-[321px]:border-r border-border-neutral-strong",
|
|
12
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
13
|
+
className: "flex items-center gap-8 flex-1 min-w-0",
|
|
14
|
+
children: /*#__PURE__*/ _jsx(SelectValue, {
|
|
15
|
+
placeholder: "Select organization"
|
|
16
|
+
})
|
|
17
|
+
})
|
|
18
|
+
}),
|
|
19
|
+
/*#__PURE__*/ _jsxs(SelectContent, {
|
|
20
|
+
children: [
|
|
21
|
+
/*#__PURE__*/ _jsx(SelectItem, {
|
|
22
|
+
value: "stripe",
|
|
23
|
+
children: /*#__PURE__*/ _jsxs("div", {
|
|
24
|
+
className: "flex items-center gap-8",
|
|
25
|
+
children: [
|
|
26
|
+
/*#__PURE__*/ _jsx(Avatar, {
|
|
27
|
+
size: "3xs",
|
|
28
|
+
content: "logo",
|
|
29
|
+
logoName: "stripe",
|
|
30
|
+
radius: "rounded"
|
|
31
|
+
}),
|
|
32
|
+
/*#__PURE__*/ _jsx("span", {
|
|
33
|
+
children: "Stripe"
|
|
34
|
+
})
|
|
35
|
+
]
|
|
36
|
+
})
|
|
37
|
+
}),
|
|
38
|
+
/*#__PURE__*/ _jsx(SelectItem, {
|
|
39
|
+
value: "shipfox",
|
|
40
|
+
children: /*#__PURE__*/ _jsxs("div", {
|
|
41
|
+
className: "flex items-center gap-8",
|
|
42
|
+
children: [
|
|
43
|
+
/*#__PURE__*/ _jsx(Avatar, {
|
|
44
|
+
size: "3xs",
|
|
45
|
+
content: "logo",
|
|
46
|
+
logoName: "shipfox",
|
|
47
|
+
radius: "rounded"
|
|
48
|
+
}),
|
|
49
|
+
/*#__PURE__*/ _jsx("span", {
|
|
50
|
+
children: "Shipfox"
|
|
51
|
+
})
|
|
52
|
+
]
|
|
53
|
+
})
|
|
54
|
+
}),
|
|
55
|
+
/*#__PURE__*/ _jsx(SelectItem, {
|
|
56
|
+
value: "github",
|
|
57
|
+
children: /*#__PURE__*/ _jsxs("div", {
|
|
58
|
+
className: "flex items-center gap-8",
|
|
59
|
+
children: [
|
|
60
|
+
/*#__PURE__*/ _jsx(Avatar, {
|
|
61
|
+
size: "3xs",
|
|
62
|
+
content: "logo",
|
|
63
|
+
logoName: "github",
|
|
64
|
+
radius: "rounded"
|
|
65
|
+
}),
|
|
66
|
+
/*#__PURE__*/ _jsx("span", {
|
|
67
|
+
children: "GitHub"
|
|
68
|
+
})
|
|
69
|
+
]
|
|
70
|
+
})
|
|
71
|
+
}),
|
|
72
|
+
/*#__PURE__*/ _jsx(SelectSeparator, {}),
|
|
73
|
+
/*#__PURE__*/ _jsxs(Button, {
|
|
74
|
+
variant: "transparent",
|
|
75
|
+
className: "w-full justify-start text-foreground-neutral-subtle",
|
|
76
|
+
children: [
|
|
77
|
+
/*#__PURE__*/ _jsx(Icon, {
|
|
78
|
+
name: "addLine",
|
|
79
|
+
className: "size-16 shrink-0"
|
|
80
|
+
}),
|
|
81
|
+
/*#__PURE__*/ _jsx("span", {
|
|
82
|
+
children: "New organization"
|
|
83
|
+
})
|
|
84
|
+
]
|
|
85
|
+
})
|
|
86
|
+
]
|
|
87
|
+
})
|
|
88
|
+
]
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
//# sourceMappingURL=organization-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/dashboard/components/organization-selector.tsx"],"sourcesContent":["import {Avatar} from 'components/avatar';\nimport {Button} from 'components/button';\nimport {Icon} from 'components/icon';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n} from 'components/select';\n\nexport function OrganizationSelector() {\n return (\n <Select defaultValue=\"stripe\">\n <SelectTrigger className=\"w-200 h-40 shadow-none bg-background-neutral-base hover:bg-background-neutral-hover rounded-none gap-8 pl-12 border-l min-[321px]:border-r border-border-neutral-strong\">\n <div className=\"flex items-center gap-8 flex-1 min-w-0\">\n <SelectValue placeholder=\"Select organization\" />\n </div>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"stripe\">\n <div className=\"flex items-center gap-8\">\n <Avatar size=\"3xs\" content=\"logo\" logoName=\"stripe\" radius=\"rounded\" />\n <span>Stripe</span>\n </div>\n </SelectItem>\n <SelectItem value=\"shipfox\">\n <div className=\"flex items-center gap-8\">\n <Avatar size=\"3xs\" content=\"logo\" logoName=\"shipfox\" radius=\"rounded\" />\n <span>Shipfox</span>\n </div>\n </SelectItem>\n <SelectItem value=\"github\">\n <div className=\"flex items-center gap-8\">\n <Avatar size=\"3xs\" content=\"logo\" logoName=\"github\" radius=\"rounded\" />\n <span>GitHub</span>\n </div>\n </SelectItem>\n <SelectSeparator />\n <Button\n variant=\"transparent\"\n className=\"w-full justify-start text-foreground-neutral-subtle\"\n >\n <Icon name=\"addLine\" className=\"size-16 shrink-0\" />\n <span>New organization</span>\n </Button>\n </SelectContent>\n </Select>\n );\n}\n"],"names":["Avatar","Button","Icon","Select","SelectContent","SelectItem","SelectSeparator","SelectTrigger","SelectValue","OrganizationSelector","defaultValue","className","div","placeholder","value","size","content","logoName","radius","span","variant","name"],"mappings":";AAAA,SAAQA,MAAM,QAAO,oBAAoB;AACzC,SAAQC,MAAM,QAAO,oBAAoB;AACzC,SAAQC,IAAI,QAAO,kBAAkB;AACrC,SACEC,MAAM,EACNC,aAAa,EACbC,UAAU,EACVC,eAAe,EACfC,aAAa,EACbC,WAAW,QACN,oBAAoB;AAE3B,OAAO,SAASC;IACd,qBACE,MAACN;QAAOO,cAAa;;0BACnB,KAACH;gBAAcI,WAAU;0BACvB,cAAA,KAACC;oBAAID,WAAU;8BACb,cAAA,KAACH;wBAAYK,aAAY;;;;0BAG7B,MAACT;;kCACC,KAACC;wBAAWS,OAAM;kCAChB,cAAA,MAACF;4BAAID,WAAU;;8CACb,KAACX;oCAAOe,MAAK;oCAAMC,SAAQ;oCAAOC,UAAS;oCAASC,QAAO;;8CAC3D,KAACC;8CAAK;;;;;kCAGV,KAACd;wBAAWS,OAAM;kCAChB,cAAA,MAACF;4BAAID,WAAU;;8CACb,KAACX;oCAAOe,MAAK;oCAAMC,SAAQ;oCAAOC,UAAS;oCAAUC,QAAO;;8CAC5D,KAACC;8CAAK;;;;;kCAGV,KAACd;wBAAWS,OAAM;kCAChB,cAAA,MAACF;4BAAID,WAAU;;8CACb,KAACX;oCAAOe,MAAK;oCAAMC,SAAQ;oCAAOC,UAAS;oCAASC,QAAO;;8CAC3D,KAACC;8CAAK;;;;;kCAGV,KAACb;kCACD,MAACL;wBACCmB,SAAQ;wBACRT,WAAU;;0CAEV,KAACT;gCAAKmB,MAAK;gCAAUV,WAAU;;0CAC/B,KAACQ;0CAAK;;;;;;;;AAKhB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"top-menu.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/components/top-menu.tsx"],"names":[],"mappings":"AAEA,wBAAgB,OAAO,CAAC,EACtB,SAAS,EACT,WAAW,GACZ,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC,2CAiBA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Tabs, TabsList, TabsTrigger } from '../../../components/tabs/index.js';
|
|
3
|
+
export function TopMenu({ activeTab, onTabChange }) {
|
|
4
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
5
|
+
className: "flex items-center justify-between w-full",
|
|
6
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
7
|
+
className: "flex items-center flex-1 min-w-0 pl-12 md:pl-20 pr-8",
|
|
8
|
+
children: /*#__PURE__*/ _jsx(Tabs, {
|
|
9
|
+
value: activeTab,
|
|
10
|
+
onValueChange: onTabChange,
|
|
11
|
+
children: /*#__PURE__*/ _jsxs(TabsList, {
|
|
12
|
+
className: "h-48 gap-8 md:gap-12",
|
|
13
|
+
children: [
|
|
14
|
+
/*#__PURE__*/ _jsx(TabsTrigger, {
|
|
15
|
+
value: "analytics",
|
|
16
|
+
className: "text-sm font-medium",
|
|
17
|
+
children: "Analytics"
|
|
18
|
+
}),
|
|
19
|
+
/*#__PURE__*/ _jsx(TabsTrigger, {
|
|
20
|
+
value: "jobs",
|
|
21
|
+
className: "text-sm font-medium",
|
|
22
|
+
children: "Jobs"
|
|
23
|
+
})
|
|
24
|
+
]
|
|
25
|
+
})
|
|
26
|
+
})
|
|
27
|
+
})
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=top-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/dashboard/components/top-menu.tsx"],"sourcesContent":["import {Tabs, TabsList, TabsTrigger} from 'components/tabs';\n\nexport function TopMenu({\n activeTab,\n onTabChange,\n}: {\n activeTab: string;\n onTabChange: (tab: string) => void;\n}) {\n return (\n <div className=\"flex items-center justify-between w-full\">\n <div className=\"flex items-center flex-1 min-w-0 pl-12 md:pl-20 pr-8\">\n <Tabs value={activeTab} onValueChange={onTabChange}>\n <TabsList className=\"h-48 gap-8 md:gap-12\">\n <TabsTrigger value=\"analytics\" className=\"text-sm font-medium\">\n Analytics\n </TabsTrigger>\n <TabsTrigger value=\"jobs\" className=\"text-sm font-medium\">\n Jobs\n </TabsTrigger>\n </TabsList>\n </Tabs>\n </div>\n </div>\n );\n}\n"],"names":["Tabs","TabsList","TabsTrigger","TopMenu","activeTab","onTabChange","div","className","value","onValueChange"],"mappings":";AAAA,SAAQA,IAAI,EAAEC,QAAQ,EAAEC,WAAW,QAAO,kBAAkB;AAE5D,OAAO,SAASC,QAAQ,EACtBC,SAAS,EACTC,WAAW,EAIZ;IACC,qBACE,KAACC;QAAIC,WAAU;kBACb,cAAA,KAACD;YAAIC,WAAU;sBACb,cAAA,KAACP;gBAAKQ,OAAOJ;gBAAWK,eAAeJ;0BACrC,cAAA,MAACJ;oBAASM,WAAU;;sCAClB,KAACL;4BAAYM,OAAM;4BAAYD,WAAU;sCAAsB;;sCAG/D,KAACL;4BAAYM,OAAM;4BAAOD,WAAU;sCAAsB;;;;;;;AAQtE"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type IconName } from '../../../components/icon';
|
|
2
|
+
export declare function TopbarButton({ className, icon, label, }: {
|
|
3
|
+
className?: string;
|
|
4
|
+
icon: IconName;
|
|
5
|
+
label?: string;
|
|
6
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=topbar-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topbar-button.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/components/topbar-button.tsx"],"names":[],"mappings":"AACA,OAAO,EAAO,KAAK,QAAQ,EAAC,MAAM,iBAAiB,CAAC;AAGpD,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,IAAI,EACJ,KAAK,GACN,EAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,2CAcA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from '../../../components/button/index.js';
|
|
3
|
+
import { Icon } from '../../../components/icon/index.js';
|
|
4
|
+
import { cn } from '../../../utils/cn.js';
|
|
5
|
+
export function TopbarButton({ className, icon, label }) {
|
|
6
|
+
return /*#__PURE__*/ _jsx(Button, {
|
|
7
|
+
type: "button",
|
|
8
|
+
variant: "transparent",
|
|
9
|
+
className: cn('flex items-center justify-center overflow-hidden shrink-0 w-40 h-40 bg-background-subtle-base hover:bg-background-neutral-hover transition-colors rounded-none border-l border-border-neutral-strong', className),
|
|
10
|
+
"aria-label": label ?? undefined,
|
|
11
|
+
children: /*#__PURE__*/ _jsx(Icon, {
|
|
12
|
+
name: icon,
|
|
13
|
+
className: "size-18 text-foreground-neutral-subtle"
|
|
14
|
+
})
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=topbar-button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/dashboard/components/topbar-button.tsx"],"sourcesContent":["import {Button} from 'components/button';\nimport {Icon, type IconName} from 'components/icon';\nimport {cn} from 'utils/cn';\n\nexport function TopbarButton({\n className,\n icon,\n label,\n}: {\n className?: string;\n icon: IconName;\n label?: string;\n}) {\n return (\n <Button\n type=\"button\"\n variant=\"transparent\"\n className={cn(\n 'flex items-center justify-center overflow-hidden shrink-0 w-40 h-40 bg-background-subtle-base hover:bg-background-neutral-hover transition-colors rounded-none border-l border-border-neutral-strong',\n className,\n )}\n aria-label={label ?? undefined}\n >\n <Icon name={icon} className=\"size-18 text-foreground-neutral-subtle\" />\n </Button>\n );\n}\n"],"names":["Button","Icon","cn","TopbarButton","className","icon","label","type","variant","aria-label","undefined","name"],"mappings":";AAAA,SAAQA,MAAM,QAAO,oBAAoB;AACzC,SAAQC,IAAI,QAAsB,kBAAkB;AACpD,SAAQC,EAAE,QAAO,WAAW;AAE5B,OAAO,SAASC,aAAa,EAC3BC,SAAS,EACTC,IAAI,EACJC,KAAK,EAKN;IACC,qBACE,KAACN;QACCO,MAAK;QACLC,SAAQ;QACRJ,WAAWF,GACT,wMACAE;QAEFK,cAAYH,SAASI;kBAErB,cAAA,KAACT;YAAKU,MAAMN;YAAMD,WAAU;;;AAGlC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topbar.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/components/topbar.tsx"],"names":[],"mappings":"AAOA,wBAAgB,MAAM,CAAC,EAAC,QAAgB,EAAC,EAAE;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAC,2CAgC9D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../../../utils/cn.js';
|
|
3
|
+
import { CompleteSetupButton } from './complete-setup-button.js';
|
|
4
|
+
import { MobileMenu } from './mobile-menu.js';
|
|
5
|
+
import { OrganizationSelector } from './organization-selector.js';
|
|
6
|
+
import { TopbarButton } from './topbar-button.js';
|
|
7
|
+
import { UserProfile } from './user-profile.js';
|
|
8
|
+
export function Topbar({ hideLogo = false }) {
|
|
9
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
10
|
+
className: "flex flex-col items-start w-full bg-background-subtle-base",
|
|
11
|
+
children: /*#__PURE__*/ _jsxs("div", {
|
|
12
|
+
className: "flex items-center justify-between w-full shrink-0 border-b border-border-neutral-strong",
|
|
13
|
+
children: [
|
|
14
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
15
|
+
className: "flex items-center flex-1 min-w-0",
|
|
16
|
+
children: [
|
|
17
|
+
/*#__PURE__*/ _jsx("div", {
|
|
18
|
+
className: cn('shrink-0', hideLogo ? 'opacity-0' : 'opacity-100'),
|
|
19
|
+
children: /*#__PURE__*/ _jsx(TopbarButton, {
|
|
20
|
+
icon: "shipfox",
|
|
21
|
+
label: "Shipfox",
|
|
22
|
+
className: "border-none"
|
|
23
|
+
})
|
|
24
|
+
}),
|
|
25
|
+
/*#__PURE__*/ _jsx(OrganizationSelector, {}),
|
|
26
|
+
/*#__PURE__*/ _jsx("div", {
|
|
27
|
+
className: "hidden md:block flex-1 h-40 bg-background-subtle-base"
|
|
28
|
+
})
|
|
29
|
+
]
|
|
30
|
+
}),
|
|
31
|
+
/*#__PURE__*/ _jsx(CompleteSetupButton, {
|
|
32
|
+
className: "hidden md:flex"
|
|
33
|
+
}),
|
|
34
|
+
/*#__PURE__*/ _jsx("div", {
|
|
35
|
+
className: "hidden md:block",
|
|
36
|
+
children: /*#__PURE__*/ _jsx(TopbarButton, {
|
|
37
|
+
icon: "searchLine",
|
|
38
|
+
label: "Search"
|
|
39
|
+
})
|
|
40
|
+
}),
|
|
41
|
+
/*#__PURE__*/ _jsx("div", {
|
|
42
|
+
className: "hidden md:block",
|
|
43
|
+
children: /*#__PURE__*/ _jsx(TopbarButton, {
|
|
44
|
+
icon: "questionLine",
|
|
45
|
+
label: "Help"
|
|
46
|
+
})
|
|
47
|
+
}),
|
|
48
|
+
/*#__PURE__*/ _jsx("div", {
|
|
49
|
+
className: "hidden md:block",
|
|
50
|
+
children: /*#__PURE__*/ _jsx(TopbarButton, {
|
|
51
|
+
icon: "notification3Line",
|
|
52
|
+
label: "Notifications"
|
|
53
|
+
})
|
|
54
|
+
}),
|
|
55
|
+
/*#__PURE__*/ _jsx(MobileMenu, {}),
|
|
56
|
+
/*#__PURE__*/ _jsx(UserProfile, {})
|
|
57
|
+
]
|
|
58
|
+
})
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=topbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/dashboard/components/topbar.tsx"],"sourcesContent":["import {cn} from 'utils/cn';\nimport {CompleteSetupButton} from './complete-setup-button';\nimport {MobileMenu} from './mobile-menu';\nimport {OrganizationSelector} from './organization-selector';\nimport {TopbarButton} from './topbar-button';\nimport {UserProfile} from './user-profile';\n\nexport function Topbar({hideLogo = false}: {hideLogo?: boolean}) {\n return (\n <div className=\"flex flex-col items-start w-full bg-background-subtle-base\">\n <div className=\"flex items-center justify-between w-full shrink-0 border-b border-border-neutral-strong\">\n <div className=\"flex items-center flex-1 min-w-0\">\n <div className={cn('shrink-0', hideLogo ? 'opacity-0' : 'opacity-100')}>\n <TopbarButton icon=\"shipfox\" label=\"Shipfox\" className=\"border-none\" />\n </div>\n <OrganizationSelector />\n <div className=\"hidden md:block flex-1 h-40 bg-background-subtle-base\" />\n </div>\n\n <CompleteSetupButton className=\"hidden md:flex\" />\n\n <div className=\"hidden md:block\">\n <TopbarButton icon=\"searchLine\" label=\"Search\" />\n </div>\n\n <div className=\"hidden md:block\">\n <TopbarButton icon=\"questionLine\" label=\"Help\" />\n </div>\n\n <div className=\"hidden md:block\">\n <TopbarButton icon=\"notification3Line\" label=\"Notifications\" />\n </div>\n\n <MobileMenu />\n\n <UserProfile />\n </div>\n </div>\n );\n}\n"],"names":["cn","CompleteSetupButton","MobileMenu","OrganizationSelector","TopbarButton","UserProfile","Topbar","hideLogo","div","className","icon","label"],"mappings":";AAAA,SAAQA,EAAE,QAAO,WAAW;AAC5B,SAAQC,mBAAmB,QAAO,0BAA0B;AAC5D,SAAQC,UAAU,QAAO,gBAAgB;AACzC,SAAQC,oBAAoB,QAAO,0BAA0B;AAC7D,SAAQC,YAAY,QAAO,kBAAkB;AAC7C,SAAQC,WAAW,QAAO,iBAAiB;AAE3C,OAAO,SAASC,OAAO,EAACC,WAAW,KAAK,EAAuB;IAC7D,qBACE,KAACC;QAAIC,WAAU;kBACb,cAAA,MAACD;YAAIC,WAAU;;8BACb,MAACD;oBAAIC,WAAU;;sCACb,KAACD;4BAAIC,WAAWT,GAAG,YAAYO,WAAW,cAAc;sCACtD,cAAA,KAACH;gCAAaM,MAAK;gCAAUC,OAAM;gCAAUF,WAAU;;;sCAEzD,KAACN;sCACD,KAACK;4BAAIC,WAAU;;;;8BAGjB,KAACR;oBAAoBQ,WAAU;;8BAE/B,KAACD;oBAAIC,WAAU;8BACb,cAAA,KAACL;wBAAaM,MAAK;wBAAaC,OAAM;;;8BAGxC,KAACH;oBAAIC,WAAU;8BACb,cAAA,KAACL;wBAAaM,MAAK;wBAAeC,OAAM;;;8BAG1C,KAACH;oBAAIC,WAAU;8BACb,cAAA,KAACL;wBAAaM,MAAK;wBAAoBC,OAAM;;;8BAG/C,KAACT;8BAED,KAACG;;;;AAIT"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-profile.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/components/user-profile.tsx"],"names":[],"mappings":"AAsBA,wBAAgB,WAAW,4CAmE1B"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Avatar } from '../../../components/avatar/index.js';
|
|
3
|
+
import { UserBadge } from '../../../components/badge/index.js';
|
|
4
|
+
import { Button } from '../../../components/button/index.js';
|
|
5
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from '../../../components/dropdown-menu/index.js';
|
|
6
|
+
import { ShinyText } from '../../../components/shiny-text/index.js';
|
|
7
|
+
function UsageGauge({ used, total }) {
|
|
8
|
+
const percentage = total <= 0 ? 0 : Math.min(used / total * 100, 100);
|
|
9
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
10
|
+
className: "flex h-8 w-full rounded-full bg-tag-neutral-bg overflow-hidden",
|
|
11
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
12
|
+
className: "h-full bg-tag-success-icon rounded-l-2",
|
|
13
|
+
style: {
|
|
14
|
+
width: `${percentage}%`
|
|
15
|
+
}
|
|
16
|
+
})
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function UserProfile() {
|
|
20
|
+
const userName = 'Thierry Abalea';
|
|
21
|
+
const userEmail = 'thierryabalea@acme.com';
|
|
22
|
+
const creditsUsed = 3213;
|
|
23
|
+
const creditsTotal = 6000;
|
|
24
|
+
return /*#__PURE__*/ _jsxs(DropdownMenu, {
|
|
25
|
+
children: [
|
|
26
|
+
/*#__PURE__*/ _jsx(DropdownMenuTrigger, {
|
|
27
|
+
asChild: true,
|
|
28
|
+
children: /*#__PURE__*/ _jsxs("div", {
|
|
29
|
+
className: "flex items-center justify-center h-40 px-8 cursor-pointer border-l border-border-neutral-strong",
|
|
30
|
+
children: [
|
|
31
|
+
/*#__PURE__*/ _jsx(Avatar, {
|
|
32
|
+
className: "size-24 md:hidden",
|
|
33
|
+
content: "image",
|
|
34
|
+
fallback: "TA"
|
|
35
|
+
}),
|
|
36
|
+
/*#__PURE__*/ _jsx(UserBadge, {
|
|
37
|
+
name: userName,
|
|
38
|
+
className: "hidden md:inline-flex"
|
|
39
|
+
})
|
|
40
|
+
]
|
|
41
|
+
})
|
|
42
|
+
}),
|
|
43
|
+
/*#__PURE__*/ _jsxs(DropdownMenuContent, {
|
|
44
|
+
align: "end",
|
|
45
|
+
className: "w-220",
|
|
46
|
+
children: [
|
|
47
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
48
|
+
className: "flex items-center gap-12 px-8 py-4",
|
|
49
|
+
children: [
|
|
50
|
+
/*#__PURE__*/ _jsx(Avatar, {
|
|
51
|
+
className: "size-28 shrink-0",
|
|
52
|
+
content: "image",
|
|
53
|
+
fallback: "TA"
|
|
54
|
+
}),
|
|
55
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
56
|
+
className: "flex flex-col min-w-0",
|
|
57
|
+
children: [
|
|
58
|
+
/*#__PURE__*/ _jsx("span", {
|
|
59
|
+
className: "text-sm font-medium leading-20 text-foreground-neutral-base truncate",
|
|
60
|
+
children: userName
|
|
61
|
+
}),
|
|
62
|
+
/*#__PURE__*/ _jsx("span", {
|
|
63
|
+
className: "text-xs leading-20 text-foreground-neutral-subtle truncate",
|
|
64
|
+
children: userEmail
|
|
65
|
+
})
|
|
66
|
+
]
|
|
67
|
+
})
|
|
68
|
+
]
|
|
69
|
+
}),
|
|
70
|
+
/*#__PURE__*/ _jsx(DropdownMenuSeparator, {}),
|
|
71
|
+
/*#__PURE__*/ _jsx(DropdownMenuItem, {
|
|
72
|
+
icon: "sparkling2Fill",
|
|
73
|
+
children: "Getting started"
|
|
74
|
+
}),
|
|
75
|
+
/*#__PURE__*/ _jsx(DropdownMenuItem, {
|
|
76
|
+
icon: "userLine",
|
|
77
|
+
children: "Profile settings"
|
|
78
|
+
}),
|
|
79
|
+
/*#__PURE__*/ _jsx(DropdownMenuSeparator, {}),
|
|
80
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
81
|
+
className: "flex flex-col gap-8 px-8 py-4",
|
|
82
|
+
children: [
|
|
83
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
84
|
+
className: "flex items-center justify-between gap-8",
|
|
85
|
+
children: [
|
|
86
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
87
|
+
className: "flex items-center gap-8",
|
|
88
|
+
children: [
|
|
89
|
+
/*#__PURE__*/ _jsx(Avatar, {
|
|
90
|
+
className: "size-12",
|
|
91
|
+
content: "logo",
|
|
92
|
+
logoName: "stripe",
|
|
93
|
+
radius: "rounded"
|
|
94
|
+
}),
|
|
95
|
+
/*#__PURE__*/ _jsx("span", {
|
|
96
|
+
className: "text-sm font-medium leading-20 text-foreground-neutral-subtle",
|
|
97
|
+
children: "Usage"
|
|
98
|
+
})
|
|
99
|
+
]
|
|
100
|
+
}),
|
|
101
|
+
/*#__PURE__*/ _jsxs("span", {
|
|
102
|
+
className: "text-sm font-medium leading-20 text-foreground-neutral-subtle",
|
|
103
|
+
children: [
|
|
104
|
+
creditsUsed,
|
|
105
|
+
" / ",
|
|
106
|
+
creditsTotal
|
|
107
|
+
]
|
|
108
|
+
})
|
|
109
|
+
]
|
|
110
|
+
}),
|
|
111
|
+
/*#__PURE__*/ _jsx(UsageGauge, {
|
|
112
|
+
used: creditsUsed,
|
|
113
|
+
total: creditsTotal
|
|
114
|
+
}),
|
|
115
|
+
/*#__PURE__*/ _jsxs("span", {
|
|
116
|
+
className: "text-xs leading-20 text-foreground-neutral-subtle",
|
|
117
|
+
children: [
|
|
118
|
+
creditsTotal,
|
|
119
|
+
" free credits every month."
|
|
120
|
+
]
|
|
121
|
+
})
|
|
122
|
+
]
|
|
123
|
+
}),
|
|
124
|
+
/*#__PURE__*/ _jsx("div", {
|
|
125
|
+
className: "px-8 pb-12",
|
|
126
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
127
|
+
type: "button",
|
|
128
|
+
className: "w-full",
|
|
129
|
+
children: /*#__PURE__*/ _jsx(ShinyText, {
|
|
130
|
+
text: "Upgrade Plan",
|
|
131
|
+
className: "flex-1 text-sm font-medium leading-20 text-foreground-neutral-base truncate text-center"
|
|
132
|
+
})
|
|
133
|
+
})
|
|
134
|
+
}),
|
|
135
|
+
/*#__PURE__*/ _jsx(DropdownMenuSeparator, {}),
|
|
136
|
+
/*#__PURE__*/ _jsx(DropdownMenuItem, {
|
|
137
|
+
icon: "logoutCircleLine",
|
|
138
|
+
children: "Log out"
|
|
139
|
+
})
|
|
140
|
+
]
|
|
141
|
+
})
|
|
142
|
+
]
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
//# sourceMappingURL=user-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/dashboard/components/user-profile.tsx"],"sourcesContent":["import {Avatar} from 'components/avatar';\nimport {UserBadge} from 'components/badge';\nimport {Button} from 'components/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from 'components/dropdown-menu';\nimport {ShinyText} from 'components/shiny-text';\n\nfunction UsageGauge({used, total}: {used: number; total: number}) {\n const percentage = total <= 0 ? 0 : Math.min((used / total) * 100, 100);\n\n return (\n <div className=\"flex h-8 w-full rounded-full bg-tag-neutral-bg overflow-hidden\">\n <div className=\"h-full bg-tag-success-icon rounded-l-2\" style={{width: `${percentage}%`}} />\n </div>\n );\n}\n\nexport function UserProfile() {\n const userName = 'Thierry Abalea';\n const userEmail = 'thierryabalea@acme.com';\n const creditsUsed = 3213;\n const creditsTotal = 6000;\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <div className=\"flex items-center justify-center h-40 px-8 cursor-pointer border-l border-border-neutral-strong\">\n <Avatar className=\"size-24 md:hidden\" content=\"image\" fallback=\"TA\" />\n <UserBadge name={userName} className=\"hidden md:inline-flex\" />\n </div>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-220\">\n <div className=\"flex items-center gap-12 px-8 py-4\">\n <Avatar className=\"size-28 shrink-0\" content=\"image\" fallback=\"TA\" />\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium leading-20 text-foreground-neutral-base truncate\">\n {userName}\n </span>\n <span className=\"text-xs leading-20 text-foreground-neutral-subtle truncate\">\n {userEmail}\n </span>\n </div>\n </div>\n\n <DropdownMenuSeparator />\n\n <DropdownMenuItem icon=\"sparkling2Fill\">Getting started</DropdownMenuItem>\n <DropdownMenuItem icon=\"userLine\">Profile settings</DropdownMenuItem>\n\n <DropdownMenuSeparator />\n\n <div className=\"flex flex-col gap-8 px-8 py-4\">\n <div className=\"flex items-center justify-between gap-8\">\n <div className=\"flex items-center gap-8\">\n <Avatar className=\"size-12\" content=\"logo\" logoName=\"stripe\" radius=\"rounded\" />\n <span className=\"text-sm font-medium leading-20 text-foreground-neutral-subtle\">\n Usage\n </span>\n </div>\n <span className=\"text-sm font-medium leading-20 text-foreground-neutral-subtle\">\n {creditsUsed} / {creditsTotal}\n </span>\n </div>\n <UsageGauge used={creditsUsed} total={creditsTotal} />\n <span className=\"text-xs leading-20 text-foreground-neutral-subtle\">\n {creditsTotal} free credits every month.\n </span>\n </div>\n\n <div className=\"px-8 pb-12\">\n <Button type=\"button\" className=\"w-full\">\n <ShinyText\n text=\"Upgrade Plan\"\n className=\"flex-1 text-sm font-medium leading-20 text-foreground-neutral-base truncate text-center\"\n />\n </Button>\n </div>\n\n <DropdownMenuSeparator />\n\n <DropdownMenuItem icon=\"logoutCircleLine\">Log out</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"names":["Avatar","UserBadge","Button","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuTrigger","ShinyText","UsageGauge","used","total","percentage","Math","min","div","className","style","width","UserProfile","userName","userEmail","creditsUsed","creditsTotal","asChild","content","fallback","name","align","span","icon","logoName","radius","type","text"],"mappings":";AAAA,SAAQA,MAAM,QAAO,oBAAoB;AACzC,SAAQC,SAAS,QAAO,mBAAmB;AAC3C,SAAQC,MAAM,QAAO,oBAAoB;AACzC,SACEC,YAAY,EACZC,mBAAmB,EACnBC,gBAAgB,EAChBC,qBAAqB,EACrBC,mBAAmB,QACd,2BAA2B;AAClC,SAAQC,SAAS,QAAO,wBAAwB;AAEhD,SAASC,WAAW,EAACC,IAAI,EAAEC,KAAK,EAAgC;IAC9D,MAAMC,aAAaD,SAAS,IAAI,IAAIE,KAAKC,GAAG,CAAC,AAACJ,OAAOC,QAAS,KAAK;IAEnE,qBACE,KAACI;QAAIC,WAAU;kBACb,cAAA,KAACD;YAAIC,WAAU;YAAyCC,OAAO;gBAACC,OAAO,GAAGN,WAAW,CAAC,CAAC;YAAA;;;AAG7F;AAEA,OAAO,SAASO;IACd,MAAMC,WAAW;IACjB,MAAMC,YAAY;IAClB,MAAMC,cAAc;IACpB,MAAMC,eAAe;IAErB,qBACE,MAACpB;;0BACC,KAACI;gBAAoBiB,OAAO;0BAC1B,cAAA,MAACT;oBAAIC,WAAU;;sCACb,KAAChB;4BAAOgB,WAAU;4BAAoBS,SAAQ;4BAAQC,UAAS;;sCAC/D,KAACzB;4BAAU0B,MAAMP;4BAAUJ,WAAU;;;;;0BAGzC,MAACZ;gBAAoBwB,OAAM;gBAAMZ,WAAU;;kCACzC,MAACD;wBAAIC,WAAU;;0CACb,KAAChB;gCAAOgB,WAAU;gCAAmBS,SAAQ;gCAAQC,UAAS;;0CAC9D,MAACX;gCAAIC,WAAU;;kDACb,KAACa;wCAAKb,WAAU;kDACbI;;kDAEH,KAACS;wCAAKb,WAAU;kDACbK;;;;;;kCAKP,KAACf;kCAED,KAACD;wBAAiByB,MAAK;kCAAiB;;kCACxC,KAACzB;wBAAiByB,MAAK;kCAAW;;kCAElC,KAACxB;kCAED,MAACS;wBAAIC,WAAU;;0CACb,MAACD;gCAAIC,WAAU;;kDACb,MAACD;wCAAIC,WAAU;;0DACb,KAAChB;gDAAOgB,WAAU;gDAAUS,SAAQ;gDAAOM,UAAS;gDAASC,QAAO;;0DACpE,KAACH;gDAAKb,WAAU;0DAAgE;;;;kDAIlF,MAACa;wCAAKb,WAAU;;4CACbM;4CAAY;4CAAIC;;;;;0CAGrB,KAACd;gCAAWC,MAAMY;gCAAaX,OAAOY;;0CACtC,MAACM;gCAAKb,WAAU;;oCACbO;oCAAa;;;;;kCAIlB,KAACR;wBAAIC,WAAU;kCACb,cAAA,KAACd;4BAAO+B,MAAK;4BAASjB,WAAU;sCAC9B,cAAA,KAACR;gCACC0B,MAAK;gCACLlB,WAAU;;;;kCAKhB,KAACV;kCAED,KAACD;wBAAiByB,MAAK;kCAAmB;;;;;;AAIlD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/components/dashboard/dashboard.tsx"],"names":[],"mappings":"AAWA,wBAAgB,SAAS,4CAiDxB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMotionValueEvent, useScroll } from 'framer-motion';
|
|
3
|
+
import { useCallback, useRef, useState } from 'react';
|
|
4
|
+
import { AnalyticsContent } from './components/analytics-content.js';
|
|
5
|
+
import { AnimatedLogo } from './components/animated-logo.js';
|
|
6
|
+
import { JobsContent } from './components/jobs-content.js';
|
|
7
|
+
import { TopMenu } from './components/top-menu.js';
|
|
8
|
+
import { Topbar } from './components/topbar.js';
|
|
9
|
+
const LOGO_HEIGHT = 48;
|
|
10
|
+
const TOPBAR_HEIGHT = 41;
|
|
11
|
+
export function Dashboard() {
|
|
12
|
+
const containerRef = useRef(null);
|
|
13
|
+
const topbarRef = useRef(null);
|
|
14
|
+
const [scrollProgress, setScrollProgress] = useState(0);
|
|
15
|
+
const [activeTab, setActiveTab] = useState('analytics');
|
|
16
|
+
const { scrollY } = useScroll({
|
|
17
|
+
container: containerRef
|
|
18
|
+
});
|
|
19
|
+
useMotionValueEvent(scrollY, 'change', (latest)=>{
|
|
20
|
+
const progress = Math.min(latest / TOPBAR_HEIGHT, 1);
|
|
21
|
+
setScrollProgress(progress);
|
|
22
|
+
});
|
|
23
|
+
const handleTabChange = useCallback((tab)=>{
|
|
24
|
+
setActiveTab(tab);
|
|
25
|
+
if (containerRef.current) {
|
|
26
|
+
containerRef.current.scrollTo({
|
|
27
|
+
top: 0,
|
|
28
|
+
behavior: 'instant'
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
setScrollProgress(0);
|
|
32
|
+
}, []);
|
|
33
|
+
const isTopbarHidden = scrollProgress >= 1;
|
|
34
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
35
|
+
className: "flex flex-col w-full h-full",
|
|
36
|
+
children: [
|
|
37
|
+
/*#__PURE__*/ _jsx(AnimatedLogo, {
|
|
38
|
+
scrollProgress: scrollProgress
|
|
39
|
+
}),
|
|
40
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
41
|
+
ref: containerRef,
|
|
42
|
+
className: "flex flex-col w-full h-full overflow-auto",
|
|
43
|
+
children: [
|
|
44
|
+
/*#__PURE__*/ _jsx("div", {
|
|
45
|
+
ref: topbarRef,
|
|
46
|
+
children: /*#__PURE__*/ _jsx(Topbar, {
|
|
47
|
+
hideLogo: isTopbarHidden
|
|
48
|
+
})
|
|
49
|
+
}),
|
|
50
|
+
/*#__PURE__*/ _jsx("div", {
|
|
51
|
+
className: "sticky top-0 z-40 border-b border-border-neutral-strong bg-background-neutral-base",
|
|
52
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
53
|
+
style: {
|
|
54
|
+
paddingLeft: `${(1 - (1 - scrollProgress) ** 3) * (LOGO_HEIGHT - 8)}px`
|
|
55
|
+
},
|
|
56
|
+
children: /*#__PURE__*/ _jsx(TopMenu, {
|
|
57
|
+
activeTab: activeTab,
|
|
58
|
+
onTabChange: handleTabChange
|
|
59
|
+
})
|
|
60
|
+
})
|
|
61
|
+
}),
|
|
62
|
+
activeTab === 'analytics' && /*#__PURE__*/ _jsx(AnalyticsContent, {}),
|
|
63
|
+
activeTab === 'jobs' && /*#__PURE__*/ _jsx(JobsContent, {})
|
|
64
|
+
]
|
|
65
|
+
})
|
|
66
|
+
]
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=dashboard.js.map
|