@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.
Files changed (232) hide show
  1. package/.storybook/preview.tsx +7 -0
  2. package/.turbo/turbo-build.log +7 -7
  3. package/.turbo/turbo-check.log +2 -2
  4. package/.turbo/turbo-type.log +1 -1
  5. package/CHANGELOG.md +10 -0
  6. package/dist/components/avatar/avatar.js +1 -1
  7. package/dist/components/avatar/avatar.js.map +1 -1
  8. package/dist/components/button-group/button-group.d.ts +17 -0
  9. package/dist/components/button-group/button-group.d.ts.map +1 -0
  10. package/dist/components/button-group/button-group.js +74 -0
  11. package/dist/components/button-group/button-group.js.map +1 -0
  12. package/dist/components/button-group/button-group.stories.js +644 -0
  13. package/dist/components/button-group/button-group.stories.js.map +1 -0
  14. package/dist/components/button-group/index.d.ts +2 -0
  15. package/dist/components/button-group/index.d.ts.map +1 -0
  16. package/dist/components/button-group/index.js +3 -0
  17. package/dist/components/button-group/index.js.map +1 -0
  18. package/dist/components/code-block/code-block-footer.d.ts.map +1 -1
  19. package/dist/components/code-block/code-block-footer.js +4 -2
  20. package/dist/components/code-block/code-block-footer.js.map +1 -1
  21. package/dist/components/command/command.d.ts +28 -0
  22. package/dist/components/command/command.d.ts.map +1 -0
  23. package/dist/components/command/command.js +190 -0
  24. package/dist/components/command/command.js.map +1 -0
  25. package/dist/components/command/command.stories.js +228 -0
  26. package/dist/components/command/command.stories.js.map +1 -0
  27. package/dist/components/command/index.d.ts +2 -0
  28. package/dist/components/command/index.d.ts.map +1 -0
  29. package/dist/components/command/index.js +3 -0
  30. package/dist/components/command/index.js.map +1 -0
  31. package/dist/components/dashboard/components/analytics-content.d.ts +2 -0
  32. package/dist/components/dashboard/components/analytics-content.d.ts.map +1 -0
  33. package/dist/components/dashboard/components/analytics-content.js +180 -0
  34. package/dist/components/dashboard/components/analytics-content.js.map +1 -0
  35. package/dist/components/dashboard/components/animated-logo.d.ts +4 -0
  36. package/dist/components/dashboard/components/animated-logo.d.ts.map +1 -0
  37. package/dist/components/dashboard/components/animated-logo.js +23 -0
  38. package/dist/components/dashboard/components/animated-logo.js.map +1 -0
  39. package/dist/components/dashboard/components/complete-setup-button.d.ts +4 -0
  40. package/dist/components/dashboard/components/complete-setup-button.d.ts.map +1 -0
  41. package/dist/components/dashboard/components/complete-setup-button.js +28 -0
  42. package/dist/components/dashboard/components/complete-setup-button.js.map +1 -0
  43. package/dist/components/dashboard/components/jobs-content.d.ts +2 -0
  44. package/dist/components/dashboard/components/jobs-content.d.ts.map +1 -0
  45. package/dist/components/dashboard/components/jobs-content.js +69 -0
  46. package/dist/components/dashboard/components/jobs-content.js.map +1 -0
  47. package/dist/components/dashboard/components/mobile-menu.d.ts +2 -0
  48. package/dist/components/dashboard/components/mobile-menu.d.ts.map +1 -0
  49. package/dist/components/dashboard/components/mobile-menu.js +65 -0
  50. package/dist/components/dashboard/components/mobile-menu.js.map +1 -0
  51. package/dist/components/dashboard/components/organization-selector.d.ts +2 -0
  52. package/dist/components/dashboard/components/organization-selector.d.ts.map +1 -0
  53. package/dist/components/dashboard/components/organization-selector.js +92 -0
  54. package/dist/components/dashboard/components/organization-selector.js.map +1 -0
  55. package/dist/components/dashboard/components/top-menu.d.ts +5 -0
  56. package/dist/components/dashboard/components/top-menu.d.ts.map +1 -0
  57. package/dist/components/dashboard/components/top-menu.js +31 -0
  58. package/dist/components/dashboard/components/top-menu.js.map +1 -0
  59. package/dist/components/dashboard/components/topbar-button.d.ts +7 -0
  60. package/dist/components/dashboard/components/topbar-button.d.ts.map +1 -0
  61. package/dist/components/dashboard/components/topbar-button.js +18 -0
  62. package/dist/components/dashboard/components/topbar-button.js.map +1 -0
  63. package/dist/components/dashboard/components/topbar.d.ts +4 -0
  64. package/dist/components/dashboard/components/topbar.d.ts.map +1 -0
  65. package/dist/components/dashboard/components/topbar.js +62 -0
  66. package/dist/components/dashboard/components/topbar.js.map +1 -0
  67. package/dist/components/dashboard/components/user-profile.d.ts +2 -0
  68. package/dist/components/dashboard/components/user-profile.d.ts.map +1 -0
  69. package/dist/components/dashboard/components/user-profile.js +146 -0
  70. package/dist/components/dashboard/components/user-profile.js.map +1 -0
  71. package/dist/components/dashboard/dashboard.d.ts +2 -0
  72. package/dist/components/dashboard/dashboard.d.ts.map +1 -0
  73. package/dist/components/dashboard/dashboard.js +70 -0
  74. package/dist/components/dashboard/dashboard.js.map +1 -0
  75. package/dist/components/dashboard/dashboard.stories.js +23 -0
  76. package/dist/components/dashboard/dashboard.stories.js.map +1 -0
  77. package/dist/components/dashboard/index.d.ts +2 -0
  78. package/dist/components/dashboard/index.d.ts.map +1 -0
  79. package/dist/components/dashboard/index.js +3 -0
  80. package/dist/components/dashboard/index.js.map +1 -0
  81. package/dist/components/form/form.stories.js +6 -1
  82. package/dist/components/form/form.stories.js.map +1 -1
  83. package/dist/components/index.d.ts +7 -0
  84. package/dist/components/index.d.ts.map +1 -1
  85. package/dist/components/index.js +7 -0
  86. package/dist/components/index.js.map +1 -1
  87. package/dist/components/kbd/index.d.ts +2 -0
  88. package/dist/components/kbd/index.d.ts.map +1 -0
  89. package/dist/components/kbd/index.js +3 -0
  90. package/dist/components/kbd/index.js.map +1 -0
  91. package/dist/components/kbd/kbd.d.ts +7 -0
  92. package/dist/components/kbd/kbd.d.ts.map +1 -0
  93. package/dist/components/kbd/kbd.js +18 -0
  94. package/dist/components/kbd/kbd.js.map +1 -0
  95. package/dist/components/kbd/kbd.stories.js +119 -0
  96. package/dist/components/kbd/kbd.stories.js.map +1 -0
  97. package/dist/components/search/index.d.ts +7 -0
  98. package/dist/components/search/index.d.ts.map +1 -0
  99. package/dist/components/search/index.js +8 -0
  100. package/dist/components/search/index.js.map +1 -0
  101. package/dist/components/search/search-context.d.ts +11 -0
  102. package/dist/components/search/search-context.d.ts.map +1 -0
  103. package/dist/components/search/search-context.js +56 -0
  104. package/dist/components/search/search-context.js.map +1 -0
  105. package/dist/components/search/search-inline.d.ts +9 -0
  106. package/dist/components/search/search-inline.d.ts.map +1 -0
  107. package/dist/components/search/search-inline.js +85 -0
  108. package/dist/components/search/search-inline.js.map +1 -0
  109. package/dist/components/search/search-modal.d.ts +25 -0
  110. package/dist/components/search/search-modal.d.ts.map +1 -0
  111. package/dist/components/search/search-modal.js +162 -0
  112. package/dist/components/search/search-modal.js.map +1 -0
  113. package/dist/components/search/search-trigger.d.ts +9 -0
  114. package/dist/components/search/search-trigger.d.ts.map +1 -0
  115. package/dist/components/search/search-trigger.js +37 -0
  116. package/dist/components/search/search-trigger.js.map +1 -0
  117. package/dist/components/search/search-variants.d.ts +14 -0
  118. package/dist/components/search/search-variants.d.ts.map +1 -0
  119. package/dist/components/search/search-variants.js +90 -0
  120. package/dist/components/search/search-variants.js.map +1 -0
  121. package/dist/components/search/search.d.ts +11 -0
  122. package/dist/components/search/search.d.ts.map +1 -0
  123. package/dist/components/search/search.js +35 -0
  124. package/dist/components/search/search.js.map +1 -0
  125. package/dist/components/search/search.stories.js +630 -0
  126. package/dist/components/search/search.stories.js.map +1 -0
  127. package/dist/components/select/index.d.ts +2 -0
  128. package/dist/components/select/index.d.ts.map +1 -0
  129. package/dist/components/select/index.js +3 -0
  130. package/dist/components/select/index.js.map +1 -0
  131. package/dist/components/select/select.d.ts +25 -0
  132. package/dist/components/select/select.d.ts.map +1 -0
  133. package/dist/components/select/select.js +153 -0
  134. package/dist/components/select/select.js.map +1 -0
  135. package/dist/components/select/select.stories.js +393 -0
  136. package/dist/components/select/select.stories.js.map +1 -0
  137. package/dist/components/skeleton/index.d.ts +2 -0
  138. package/dist/components/skeleton/index.d.ts.map +1 -0
  139. package/dist/components/skeleton/index.js +3 -0
  140. package/dist/components/skeleton/index.js.map +1 -0
  141. package/dist/components/skeleton/skeleton.d.ts +5 -0
  142. package/dist/components/skeleton/skeleton.d.ts.map +1 -0
  143. package/dist/components/skeleton/skeleton.js +11 -0
  144. package/dist/components/skeleton/skeleton.js.map +1 -0
  145. package/dist/components/skeleton/skeleton.stories.js +345 -0
  146. package/dist/components/skeleton/skeleton.stories.js.map +1 -0
  147. package/dist/components/table/data-table.d.ts +70 -0
  148. package/dist/components/table/data-table.d.ts.map +1 -0
  149. package/dist/components/table/data-table.js +159 -0
  150. package/dist/components/table/data-table.js.map +1 -0
  151. package/dist/components/table/index.d.ts +6 -0
  152. package/dist/components/table/index.d.ts.map +1 -0
  153. package/dist/components/table/index.js +6 -0
  154. package/dist/components/table/index.js.map +1 -0
  155. package/dist/components/table/table-column-header.d.ts +79 -0
  156. package/dist/components/table/table-column-header.d.ts.map +1 -0
  157. package/dist/components/table/table-column-header.js +99 -0
  158. package/dist/components/table/table-column-header.js.map +1 -0
  159. package/dist/components/table/table-pagination.d.ts +53 -0
  160. package/dist/components/table/table-pagination.d.ts.map +1 -0
  161. package/dist/components/table/table-pagination.js +139 -0
  162. package/dist/components/table/table-pagination.js.map +1 -0
  163. package/dist/components/table/table.d.ts +11 -0
  164. package/dist/components/table/table.d.ts.map +1 -0
  165. package/dist/components/table/table.js +64 -0
  166. package/dist/components/table/table.js.map +1 -0
  167. package/dist/components/table/table.stories.columns.d.ts +24 -0
  168. package/dist/components/table/table.stories.columns.d.ts.map +1 -0
  169. package/dist/components/table/table.stories.columns.js +310 -0
  170. package/dist/components/table/table.stories.columns.js.map +1 -0
  171. package/dist/components/table/table.stories.components.d.ts +14 -0
  172. package/dist/components/table/table.stories.components.d.ts.map +1 -0
  173. package/dist/components/table/table.stories.components.js +107 -0
  174. package/dist/components/table/table.stories.components.js.map +1 -0
  175. package/dist/components/table/table.stories.data.d.ts +54 -0
  176. package/dist/components/table/table.stories.data.d.ts.map +1 -0
  177. package/dist/components/table/table.stories.data.js +122 -0
  178. package/dist/components/table/table.stories.data.js.map +1 -0
  179. package/dist/components/table/table.stories.js +302 -0
  180. package/dist/components/table/table.stories.js.map +1 -0
  181. package/dist/styles.css +1 -1
  182. package/index.css +48 -0
  183. package/package.json +3 -2
  184. package/src/components/avatar/avatar.tsx +1 -1
  185. package/src/components/button-group/button-group.stories.tsx +361 -0
  186. package/src/components/button-group/button-group.tsx +111 -0
  187. package/src/components/button-group/index.ts +1 -0
  188. package/src/components/code-block/code-block-footer.tsx +8 -1
  189. package/src/components/command/command.stories.tsx +133 -0
  190. package/src/components/command/command.tsx +265 -0
  191. package/src/components/command/index.ts +1 -0
  192. package/src/components/dashboard/components/analytics-content.tsx +102 -0
  193. package/src/components/dashboard/components/animated-logo.tsx +25 -0
  194. package/src/components/dashboard/components/complete-setup-button.tsx +30 -0
  195. package/src/components/dashboard/components/jobs-content.tsx +51 -0
  196. package/src/components/dashboard/components/mobile-menu.tsx +50 -0
  197. package/src/components/dashboard/components/organization-selector.tsx +51 -0
  198. package/src/components/dashboard/components/top-menu.tsx +26 -0
  199. package/src/components/dashboard/components/topbar-button.tsx +27 -0
  200. package/src/components/dashboard/components/topbar.tsx +40 -0
  201. package/src/components/dashboard/components/user-profile.tsx +90 -0
  202. package/src/components/dashboard/dashboard.stories.tsx +25 -0
  203. package/src/components/dashboard/dashboard.tsx +61 -0
  204. package/src/components/dashboard/index.ts +1 -0
  205. package/src/components/form/form.stories.tsx +5 -0
  206. package/src/components/index.ts +7 -0
  207. package/src/components/kbd/index.ts +1 -0
  208. package/src/components/kbd/kbd.stories.tsx +64 -0
  209. package/src/components/kbd/kbd.tsx +32 -0
  210. package/src/components/search/index.ts +28 -0
  211. package/src/components/search/search-context.tsx +78 -0
  212. package/src/components/search/search-inline.tsx +107 -0
  213. package/src/components/search/search-modal.tsx +198 -0
  214. package/src/components/search/search-trigger.tsx +47 -0
  215. package/src/components/search/search-variants.ts +88 -0
  216. package/src/components/search/search.stories.tsx +392 -0
  217. package/src/components/search/search.tsx +47 -0
  218. package/src/components/select/index.ts +1 -0
  219. package/src/components/select/select.stories.tsx +207 -0
  220. package/src/components/select/select.tsx +220 -0
  221. package/src/components/skeleton/index.ts +1 -0
  222. package/src/components/skeleton/skeleton.stories.tsx +178 -0
  223. package/src/components/skeleton/skeleton.tsx +14 -0
  224. package/src/components/table/data-table.tsx +254 -0
  225. package/src/components/table/index.ts +5 -0
  226. package/src/components/table/table-column-header.tsx +141 -0
  227. package/src/components/table/table-pagination.tsx +161 -0
  228. package/src/components/table/table.stories.columns.tsx +198 -0
  229. package/src/components/table/table.stories.components.tsx +104 -0
  230. package/src/components/table/table.stories.data.ts +117 -0
  231. package/src/components/table/table.stories.tsx +256 -0
  232. 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,2 @@
1
+ export declare function MobileMenu(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=mobile-menu.d.ts.map
@@ -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,2 @@
1
+ export declare function OrganizationSelector(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=organization-selector.d.ts.map
@@ -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,5 @@
1
+ export declare function TopMenu({ activeTab, onTabChange, }: {
2
+ activeTab: string;
3
+ onTabChange: (tab: string) => void;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=top-menu.d.ts.map
@@ -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,4 @@
1
+ export declare function Topbar({ hideLogo }: {
2
+ hideLogo?: boolean;
3
+ }): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=topbar.d.ts.map
@@ -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,2 @@
1
+ export declare function UserProfile(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=user-profile.d.ts.map
@@ -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,2 @@
1
+ export declare function Dashboard(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -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