@shipfox/react-ui 0.13.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 (268) 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 +16 -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 +13 -5
  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/confetti/confetti.d.ts +21 -0
  32. package/dist/components/confetti/confetti.d.ts.map +1 -0
  33. package/dist/components/confetti/confetti.js +101 -0
  34. package/dist/components/confetti/confetti.js.map +1 -0
  35. package/dist/components/confetti/confetti.stories.js +41 -0
  36. package/dist/components/confetti/confetti.stories.js.map +1 -0
  37. package/dist/components/confetti/index.d.ts +2 -0
  38. package/dist/components/confetti/index.d.ts.map +1 -0
  39. package/dist/components/confetti/index.js +3 -0
  40. package/dist/components/confetti/index.js.map +1 -0
  41. package/dist/components/dashboard/components/analytics-content.d.ts +2 -0
  42. package/dist/components/dashboard/components/analytics-content.d.ts.map +1 -0
  43. package/dist/components/dashboard/components/analytics-content.js +180 -0
  44. package/dist/components/dashboard/components/analytics-content.js.map +1 -0
  45. package/dist/components/dashboard/components/animated-logo.d.ts +4 -0
  46. package/dist/components/dashboard/components/animated-logo.d.ts.map +1 -0
  47. package/dist/components/dashboard/components/animated-logo.js +23 -0
  48. package/dist/components/dashboard/components/animated-logo.js.map +1 -0
  49. package/dist/components/dashboard/components/complete-setup-button.d.ts +4 -0
  50. package/dist/components/dashboard/components/complete-setup-button.d.ts.map +1 -0
  51. package/dist/components/dashboard/components/complete-setup-button.js +28 -0
  52. package/dist/components/dashboard/components/complete-setup-button.js.map +1 -0
  53. package/dist/components/dashboard/components/jobs-content.d.ts +2 -0
  54. package/dist/components/dashboard/components/jobs-content.d.ts.map +1 -0
  55. package/dist/components/dashboard/components/jobs-content.js +69 -0
  56. package/dist/components/dashboard/components/jobs-content.js.map +1 -0
  57. package/dist/components/dashboard/components/mobile-menu.d.ts +2 -0
  58. package/dist/components/dashboard/components/mobile-menu.d.ts.map +1 -0
  59. package/dist/components/dashboard/components/mobile-menu.js +65 -0
  60. package/dist/components/dashboard/components/mobile-menu.js.map +1 -0
  61. package/dist/components/dashboard/components/organization-selector.d.ts +2 -0
  62. package/dist/components/dashboard/components/organization-selector.d.ts.map +1 -0
  63. package/dist/components/dashboard/components/organization-selector.js +92 -0
  64. package/dist/components/dashboard/components/organization-selector.js.map +1 -0
  65. package/dist/components/dashboard/components/top-menu.d.ts +5 -0
  66. package/dist/components/dashboard/components/top-menu.d.ts.map +1 -0
  67. package/dist/components/dashboard/components/top-menu.js +31 -0
  68. package/dist/components/dashboard/components/top-menu.js.map +1 -0
  69. package/dist/components/dashboard/components/topbar-button.d.ts +7 -0
  70. package/dist/components/dashboard/components/topbar-button.d.ts.map +1 -0
  71. package/dist/components/dashboard/components/topbar-button.js +18 -0
  72. package/dist/components/dashboard/components/topbar-button.js.map +1 -0
  73. package/dist/components/dashboard/components/topbar.d.ts +4 -0
  74. package/dist/components/dashboard/components/topbar.d.ts.map +1 -0
  75. package/dist/components/dashboard/components/topbar.js +62 -0
  76. package/dist/components/dashboard/components/topbar.js.map +1 -0
  77. package/dist/components/dashboard/components/user-profile.d.ts +2 -0
  78. package/dist/components/dashboard/components/user-profile.d.ts.map +1 -0
  79. package/dist/components/dashboard/components/user-profile.js +146 -0
  80. package/dist/components/dashboard/components/user-profile.js.map +1 -0
  81. package/dist/components/dashboard/dashboard.d.ts +2 -0
  82. package/dist/components/dashboard/dashboard.d.ts.map +1 -0
  83. package/dist/components/dashboard/dashboard.js +70 -0
  84. package/dist/components/dashboard/dashboard.js.map +1 -0
  85. package/dist/components/dashboard/dashboard.stories.js +23 -0
  86. package/dist/components/dashboard/dashboard.stories.js.map +1 -0
  87. package/dist/components/dashboard/index.d.ts +2 -0
  88. package/dist/components/dashboard/index.d.ts.map +1 -0
  89. package/dist/components/dashboard/index.js +3 -0
  90. package/dist/components/dashboard/index.js.map +1 -0
  91. package/dist/components/form/form.stories.js +6 -1
  92. package/dist/components/form/form.stories.js.map +1 -1
  93. package/dist/components/icon/icon.d.ts +3 -2
  94. package/dist/components/icon/icon.d.ts.map +1 -1
  95. package/dist/components/icon/icon.js +7 -2
  96. package/dist/components/icon/icon.js.map +1 -1
  97. package/dist/components/index.d.ts +9 -0
  98. package/dist/components/index.d.ts.map +1 -1
  99. package/dist/components/index.js +9 -0
  100. package/dist/components/index.js.map +1 -1
  101. package/dist/components/kbd/index.d.ts +2 -0
  102. package/dist/components/kbd/index.d.ts.map +1 -0
  103. package/dist/components/kbd/index.js +3 -0
  104. package/dist/components/kbd/index.js.map +1 -0
  105. package/dist/components/kbd/kbd.d.ts +7 -0
  106. package/dist/components/kbd/kbd.d.ts.map +1 -0
  107. package/dist/components/kbd/kbd.js +18 -0
  108. package/dist/components/kbd/kbd.js.map +1 -0
  109. package/dist/components/kbd/kbd.stories.js +119 -0
  110. package/dist/components/kbd/kbd.stories.js.map +1 -0
  111. package/dist/components/modal/modal.stories.js +227 -168
  112. package/dist/components/modal/modal.stories.js.map +1 -1
  113. package/dist/components/search/index.d.ts +7 -0
  114. package/dist/components/search/index.d.ts.map +1 -0
  115. package/dist/components/search/index.js +8 -0
  116. package/dist/components/search/index.js.map +1 -0
  117. package/dist/components/search/search-context.d.ts +11 -0
  118. package/dist/components/search/search-context.d.ts.map +1 -0
  119. package/dist/components/search/search-context.js +56 -0
  120. package/dist/components/search/search-context.js.map +1 -0
  121. package/dist/components/search/search-inline.d.ts +9 -0
  122. package/dist/components/search/search-inline.d.ts.map +1 -0
  123. package/dist/components/search/search-inline.js +85 -0
  124. package/dist/components/search/search-inline.js.map +1 -0
  125. package/dist/components/search/search-modal.d.ts +25 -0
  126. package/dist/components/search/search-modal.d.ts.map +1 -0
  127. package/dist/components/search/search-modal.js +162 -0
  128. package/dist/components/search/search-modal.js.map +1 -0
  129. package/dist/components/search/search-trigger.d.ts +9 -0
  130. package/dist/components/search/search-trigger.d.ts.map +1 -0
  131. package/dist/components/search/search-trigger.js +37 -0
  132. package/dist/components/search/search-trigger.js.map +1 -0
  133. package/dist/components/search/search-variants.d.ts +14 -0
  134. package/dist/components/search/search-variants.d.ts.map +1 -0
  135. package/dist/components/search/search-variants.js +90 -0
  136. package/dist/components/search/search-variants.js.map +1 -0
  137. package/dist/components/search/search.d.ts +11 -0
  138. package/dist/components/search/search.d.ts.map +1 -0
  139. package/dist/components/search/search.js +35 -0
  140. package/dist/components/search/search.js.map +1 -0
  141. package/dist/components/search/search.stories.js +630 -0
  142. package/dist/components/search/search.stories.js.map +1 -0
  143. package/dist/components/select/index.d.ts +2 -0
  144. package/dist/components/select/index.d.ts.map +1 -0
  145. package/dist/components/select/index.js +3 -0
  146. package/dist/components/select/index.js.map +1 -0
  147. package/dist/components/select/select.d.ts +25 -0
  148. package/dist/components/select/select.d.ts.map +1 -0
  149. package/dist/components/select/select.js +153 -0
  150. package/dist/components/select/select.js.map +1 -0
  151. package/dist/components/select/select.stories.js +393 -0
  152. package/dist/components/select/select.stories.js.map +1 -0
  153. package/dist/components/shiny-text/index.d.ts +2 -0
  154. package/dist/components/shiny-text/index.d.ts.map +1 -0
  155. package/dist/components/shiny-text/index.js +3 -0
  156. package/dist/components/shiny-text/index.js.map +1 -0
  157. package/dist/components/shiny-text/shiny-text.d.ts +10 -0
  158. package/dist/components/shiny-text/shiny-text.d.ts.map +1 -0
  159. package/dist/components/shiny-text/shiny-text.js +17 -0
  160. package/dist/components/shiny-text/shiny-text.js.map +1 -0
  161. package/dist/components/skeleton/index.d.ts +2 -0
  162. package/dist/components/skeleton/index.d.ts.map +1 -0
  163. package/dist/components/skeleton/index.js +3 -0
  164. package/dist/components/skeleton/index.js.map +1 -0
  165. package/dist/components/skeleton/skeleton.d.ts +5 -0
  166. package/dist/components/skeleton/skeleton.d.ts.map +1 -0
  167. package/dist/components/skeleton/skeleton.js +11 -0
  168. package/dist/components/skeleton/skeleton.js.map +1 -0
  169. package/dist/components/skeleton/skeleton.stories.js +345 -0
  170. package/dist/components/skeleton/skeleton.stories.js.map +1 -0
  171. package/dist/components/table/data-table.d.ts +70 -0
  172. package/dist/components/table/data-table.d.ts.map +1 -0
  173. package/dist/components/table/data-table.js +159 -0
  174. package/dist/components/table/data-table.js.map +1 -0
  175. package/dist/components/table/index.d.ts +6 -0
  176. package/dist/components/table/index.d.ts.map +1 -0
  177. package/dist/components/table/index.js +6 -0
  178. package/dist/components/table/index.js.map +1 -0
  179. package/dist/components/table/table-column-header.d.ts +79 -0
  180. package/dist/components/table/table-column-header.d.ts.map +1 -0
  181. package/dist/components/table/table-column-header.js +99 -0
  182. package/dist/components/table/table-column-header.js.map +1 -0
  183. package/dist/components/table/table-pagination.d.ts +53 -0
  184. package/dist/components/table/table-pagination.d.ts.map +1 -0
  185. package/dist/components/table/table-pagination.js +139 -0
  186. package/dist/components/table/table-pagination.js.map +1 -0
  187. package/dist/components/table/table.d.ts +11 -0
  188. package/dist/components/table/table.d.ts.map +1 -0
  189. package/dist/components/table/table.js +64 -0
  190. package/dist/components/table/table.js.map +1 -0
  191. package/dist/components/table/table.stories.columns.d.ts +24 -0
  192. package/dist/components/table/table.stories.columns.d.ts.map +1 -0
  193. package/dist/components/table/table.stories.columns.js +310 -0
  194. package/dist/components/table/table.stories.columns.js.map +1 -0
  195. package/dist/components/table/table.stories.components.d.ts +14 -0
  196. package/dist/components/table/table.stories.components.d.ts.map +1 -0
  197. package/dist/components/table/table.stories.components.js +107 -0
  198. package/dist/components/table/table.stories.components.js.map +1 -0
  199. package/dist/components/table/table.stories.data.d.ts +54 -0
  200. package/dist/components/table/table.stories.data.d.ts.map +1 -0
  201. package/dist/components/table/table.stories.data.js +122 -0
  202. package/dist/components/table/table.stories.data.js.map +1 -0
  203. package/dist/components/table/table.stories.js +302 -0
  204. package/dist/components/table/table.stories.js.map +1 -0
  205. package/dist/index.d.ts +1 -0
  206. package/dist/index.d.ts.map +1 -1
  207. package/dist/index.js +1 -0
  208. package/dist/index.js.map +1 -1
  209. package/dist/styles.css +1 -1
  210. package/index.css +79 -0
  211. package/package.json +6 -2
  212. package/src/components/avatar/avatar.tsx +1 -1
  213. package/src/components/button-group/button-group.stories.tsx +361 -0
  214. package/src/components/button-group/button-group.tsx +111 -0
  215. package/src/components/button-group/index.ts +1 -0
  216. package/src/components/code-block/code-block-footer.tsx +19 -2
  217. package/src/components/command/command.stories.tsx +133 -0
  218. package/src/components/command/command.tsx +265 -0
  219. package/src/components/command/index.ts +1 -0
  220. package/src/components/confetti/confetti.stories.tsx +38 -0
  221. package/src/components/confetti/confetti.tsx +140 -0
  222. package/src/components/confetti/index.ts +1 -0
  223. package/src/components/dashboard/components/analytics-content.tsx +102 -0
  224. package/src/components/dashboard/components/animated-logo.tsx +25 -0
  225. package/src/components/dashboard/components/complete-setup-button.tsx +30 -0
  226. package/src/components/dashboard/components/jobs-content.tsx +51 -0
  227. package/src/components/dashboard/components/mobile-menu.tsx +50 -0
  228. package/src/components/dashboard/components/organization-selector.tsx +51 -0
  229. package/src/components/dashboard/components/top-menu.tsx +26 -0
  230. package/src/components/dashboard/components/topbar-button.tsx +27 -0
  231. package/src/components/dashboard/components/topbar.tsx +40 -0
  232. package/src/components/dashboard/components/user-profile.tsx +90 -0
  233. package/src/components/dashboard/dashboard.stories.tsx +25 -0
  234. package/src/components/dashboard/dashboard.tsx +61 -0
  235. package/src/components/dashboard/index.ts +1 -0
  236. package/src/components/form/form.stories.tsx +5 -0
  237. package/src/components/icon/icon.tsx +7 -3
  238. package/src/components/index.ts +9 -0
  239. package/src/components/kbd/index.ts +1 -0
  240. package/src/components/kbd/kbd.stories.tsx +64 -0
  241. package/src/components/kbd/kbd.tsx +32 -0
  242. package/src/components/modal/modal.stories.tsx +58 -4
  243. package/src/components/search/index.ts +28 -0
  244. package/src/components/search/search-context.tsx +78 -0
  245. package/src/components/search/search-inline.tsx +107 -0
  246. package/src/components/search/search-modal.tsx +198 -0
  247. package/src/components/search/search-trigger.tsx +47 -0
  248. package/src/components/search/search-variants.ts +88 -0
  249. package/src/components/search/search.stories.tsx +392 -0
  250. package/src/components/search/search.tsx +47 -0
  251. package/src/components/select/index.ts +1 -0
  252. package/src/components/select/select.stories.tsx +207 -0
  253. package/src/components/select/select.tsx +220 -0
  254. package/src/components/shiny-text/index.ts +1 -0
  255. package/src/components/shiny-text/shiny-text.tsx +21 -0
  256. package/src/components/skeleton/index.ts +1 -0
  257. package/src/components/skeleton/skeleton.stories.tsx +178 -0
  258. package/src/components/skeleton/skeleton.tsx +14 -0
  259. package/src/components/table/data-table.tsx +254 -0
  260. package/src/components/table/index.ts +5 -0
  261. package/src/components/table/table-column-header.tsx +141 -0
  262. package/src/components/table/table-pagination.tsx +161 -0
  263. package/src/components/table/table.stories.columns.tsx +198 -0
  264. package/src/components/table/table.stories.components.tsx +104 -0
  265. package/src/components/table/table.stories.data.ts +117 -0
  266. package/src/components/table/table.stories.tsx +256 -0
  267. package/src/components/table/table.tsx +95 -0
  268. package/src/index.ts +1 -0
@@ -0,0 +1,180 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Icon } from '../../../components/icon/index.js';
3
+ import { Skeleton } from '../../../components/skeleton/index.js';
4
+ import { Text } from '../../../components/typography/index.js';
5
+ export function AnalyticsContent() {
6
+ return /*#__PURE__*/ _jsxs("div", {
7
+ className: "min-h-[calc(100vh-48px)] p-12 md:p-24 space-y-16 md:space-y-20 bg-background-neutral-base",
8
+ children: [
9
+ /*#__PURE__*/ _jsxs("div", {
10
+ className: "flex flex-col md:flex-row items-start md:items-center justify-between gap-12 md:gap-0",
11
+ children: [
12
+ /*#__PURE__*/ _jsx(Skeleton, {
13
+ className: "h-28 md:h-32 w-120 md:w-160"
14
+ }),
15
+ /*#__PURE__*/ _jsxs("div", {
16
+ className: "flex items-center gap-8 md:gap-16",
17
+ children: [
18
+ /*#__PURE__*/ _jsx(Skeleton, {
19
+ className: "h-28 md:h-32 w-80 md:w-100"
20
+ }),
21
+ /*#__PURE__*/ _jsx(Skeleton, {
22
+ className: "h-28 md:h-32 w-100 md:w-160"
23
+ })
24
+ ]
25
+ })
26
+ ]
27
+ }),
28
+ /*#__PURE__*/ _jsx("div", {
29
+ className: "flex gap-12 md:gap-16 overflow-x-auto scrollbar pb-4 md:pb-0 -mx-12 px-12 md:mx-0 md:px-0",
30
+ children: [
31
+ 'Total',
32
+ 'Success',
33
+ 'Failed',
34
+ 'Neutral',
35
+ 'Failure rate'
36
+ ].map((label)=>/*#__PURE__*/ _jsxs("div", {
37
+ className: "shrink-0 w-100 md:w-auto md:flex-1 p-12 rounded-8 bg-background-neutral-base border border-border-neutral-base",
38
+ children: [
39
+ /*#__PURE__*/ _jsx("p", {
40
+ className: "text-xs text-foreground-neutral-subtle mb-4",
41
+ children: label
42
+ }),
43
+ /*#__PURE__*/ _jsx(Skeleton, {
44
+ className: "h-20 w-40"
45
+ })
46
+ ]
47
+ }, label))
48
+ }),
49
+ /*#__PURE__*/ _jsxs("div", {
50
+ className: "flex flex-col md:flex-row gap-16 md:gap-20",
51
+ children: [
52
+ /*#__PURE__*/ _jsxs("div", {
53
+ className: "flex-1 p-12 rounded-8 bg-background-neutral-base border border-border-neutral-base",
54
+ children: [
55
+ /*#__PURE__*/ _jsx("p", {
56
+ className: "text-sm font-medium text-foreground-neutral-base mb-12",
57
+ children: "Performance over time"
58
+ }),
59
+ /*#__PURE__*/ _jsx("div", {
60
+ className: "h-120 md:h-160 flex items-center justify-center",
61
+ children: /*#__PURE__*/ _jsxs("div", {
62
+ className: "text-center",
63
+ children: [
64
+ /*#__PURE__*/ _jsx(Icon, {
65
+ name: "fileChartLine",
66
+ className: "size-24 text-foreground-neutral-muted mx-auto mb-8"
67
+ }),
68
+ /*#__PURE__*/ _jsx("p", {
69
+ className: "text-sm text-foreground-neutral-subtle",
70
+ children: "Nothing here yet."
71
+ })
72
+ ]
73
+ })
74
+ })
75
+ ]
76
+ }),
77
+ /*#__PURE__*/ _jsxs("div", {
78
+ className: "flex-1 p-12 rounded-8 bg-background-neutral-base border border-border-neutral-base",
79
+ children: [
80
+ /*#__PURE__*/ _jsx("p", {
81
+ className: "text-sm font-medium text-foreground-neutral-base mb-12",
82
+ children: "Duration distribution"
83
+ }),
84
+ /*#__PURE__*/ _jsx("div", {
85
+ className: "h-120 md:h-160 flex items-center justify-center",
86
+ children: /*#__PURE__*/ _jsxs("div", {
87
+ className: "text-center",
88
+ children: [
89
+ /*#__PURE__*/ _jsx(Icon, {
90
+ name: "barChartBoxLine",
91
+ className: "size-24 text-foreground-neutral-muted mx-auto mb-8"
92
+ }),
93
+ /*#__PURE__*/ _jsx("p", {
94
+ className: "text-sm text-foreground-neutral-subtle",
95
+ children: "Nothing here yet."
96
+ })
97
+ ]
98
+ })
99
+ })
100
+ ]
101
+ })
102
+ ]
103
+ }),
104
+ /*#__PURE__*/ _jsxs("div", {
105
+ className: "rounded-8 bg-background-neutral-base border border-border-neutral-base overflow-hidden",
106
+ children: [
107
+ /*#__PURE__*/ _jsxs("div", {
108
+ className: "flex flex-col md:flex-row items-start md:items-center justify-between p-12 gap-12 md:gap-0 border-b border-border-neutral-strong",
109
+ children: [
110
+ /*#__PURE__*/ _jsx("p", {
111
+ className: "text-sm font-medium text-foreground-neutral-base",
112
+ children: "Jobs breakdown"
113
+ }),
114
+ /*#__PURE__*/ _jsxs("div", {
115
+ className: "flex items-center gap-8 md:gap-16 w-full md:w-auto",
116
+ children: [
117
+ /*#__PURE__*/ _jsx(Skeleton, {
118
+ className: "h-28 flex-1 md:flex-none md:w-200"
119
+ }),
120
+ /*#__PURE__*/ _jsx(Skeleton, {
121
+ className: "h-28 w-28 shrink-0"
122
+ })
123
+ ]
124
+ })
125
+ ]
126
+ }),
127
+ /*#__PURE__*/ _jsxs("div", {
128
+ className: "py-48 md:py-64 flex flex-col items-center justify-center gap-12",
129
+ children: [
130
+ /*#__PURE__*/ _jsx("div", {
131
+ className: "size-32 rounded-6 bg-transparent border border-border-neutral-strong flex items-center justify-center",
132
+ children: /*#__PURE__*/ _jsx(Icon, {
133
+ name: "shipfox",
134
+ className: "size-16 text-foreground-neutral-subtle",
135
+ color: "var(--foreground-neutral-subtle, #a1a1aa)"
136
+ })
137
+ }),
138
+ /*#__PURE__*/ _jsxs("div", {
139
+ className: "text-center space-y-4 px-16",
140
+ children: [
141
+ /*#__PURE__*/ _jsx(Text, {
142
+ size: "sm",
143
+ className: "text-foreground-neutral-base",
144
+ children: "No jobs yet"
145
+ }),
146
+ /*#__PURE__*/ _jsx(Text, {
147
+ size: "xs",
148
+ className: "text-foreground-neutral-muted",
149
+ children: "Import past runs or start a runner."
150
+ })
151
+ ]
152
+ })
153
+ ]
154
+ })
155
+ ]
156
+ }),
157
+ /*#__PURE__*/ _jsx("div", {
158
+ className: "space-y-16",
159
+ children: Array.from({
160
+ length: 3
161
+ }).map((_, i)=>{
162
+ const blockId = `analytics-extra-block-${i}`;
163
+ return /*#__PURE__*/ _jsxs("div", {
164
+ className: "p-12 md:p-16 rounded-8 bg-background-subtle-base border border-border-neutral-strong",
165
+ children: [
166
+ /*#__PURE__*/ _jsx(Skeleton, {
167
+ className: "h-16 w-full max-w-400 mb-8"
168
+ }),
169
+ /*#__PURE__*/ _jsx(Skeleton, {
170
+ className: "h-12 w-full max-w-600"
171
+ })
172
+ ]
173
+ }, blockId);
174
+ })
175
+ })
176
+ ]
177
+ });
178
+ }
179
+
180
+ //# sourceMappingURL=analytics-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/dashboard/components/analytics-content.tsx"],"sourcesContent":["import {Icon} from 'components/icon';\nimport {Skeleton} from 'components/skeleton';\nimport {Text} from 'components/typography';\n\nexport function AnalyticsContent() {\n return (\n <div className=\"min-h-[calc(100vh-48px)] p-12 md:p-24 space-y-16 md:space-y-20 bg-background-neutral-base\">\n <div className=\"flex flex-col md:flex-row items-start md:items-center justify-between gap-12 md:gap-0\">\n <Skeleton className=\"h-28 md:h-32 w-120 md:w-160\" />\n <div className=\"flex items-center gap-8 md:gap-16\">\n <Skeleton className=\"h-28 md:h-32 w-80 md:w-100\" />\n <Skeleton className=\"h-28 md:h-32 w-100 md:w-160\" />\n </div>\n </div>\n\n <div className=\"flex gap-12 md:gap-16 overflow-x-auto scrollbar pb-4 md:pb-0 -mx-12 px-12 md:mx-0 md:px-0\">\n {['Total', 'Success', 'Failed', 'Neutral', 'Failure rate'].map((label) => (\n <div\n key={label}\n className=\"shrink-0 w-100 md:w-auto md:flex-1 p-12 rounded-8 bg-background-neutral-base border border-border-neutral-base\"\n >\n <p className=\"text-xs text-foreground-neutral-subtle mb-4\">{label}</p>\n <Skeleton className=\"h-20 w-40\" />\n </div>\n ))}\n </div>\n\n <div className=\"flex flex-col md:flex-row gap-16 md:gap-20\">\n <div className=\"flex-1 p-12 rounded-8 bg-background-neutral-base border border-border-neutral-base\">\n <p className=\"text-sm font-medium text-foreground-neutral-base mb-12\">\n Performance over time\n </p>\n <div className=\"h-120 md:h-160 flex items-center justify-center\">\n <div className=\"text-center\">\n <Icon\n name=\"fileChartLine\"\n className=\"size-24 text-foreground-neutral-muted mx-auto mb-8\"\n />\n <p className=\"text-sm text-foreground-neutral-subtle\">Nothing here yet.</p>\n </div>\n </div>\n </div>\n <div className=\"flex-1 p-12 rounded-8 bg-background-neutral-base border border-border-neutral-base\">\n <p className=\"text-sm font-medium text-foreground-neutral-base mb-12\">\n Duration distribution\n </p>\n <div className=\"h-120 md:h-160 flex items-center justify-center\">\n <div className=\"text-center\">\n <Icon\n name=\"barChartBoxLine\"\n className=\"size-24 text-foreground-neutral-muted mx-auto mb-8\"\n />\n <p className=\"text-sm text-foreground-neutral-subtle\">Nothing here yet.</p>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"rounded-8 bg-background-neutral-base border border-border-neutral-base overflow-hidden\">\n <div className=\"flex flex-col md:flex-row items-start md:items-center justify-between p-12 gap-12 md:gap-0 border-b border-border-neutral-strong\">\n <p className=\"text-sm font-medium text-foreground-neutral-base\">Jobs breakdown</p>\n <div className=\"flex items-center gap-8 md:gap-16 w-full md:w-auto\">\n <Skeleton className=\"h-28 flex-1 md:flex-none md:w-200\" />\n <Skeleton className=\"h-28 w-28 shrink-0\" />\n </div>\n </div>\n <div className=\"py-48 md:py-64 flex flex-col items-center justify-center gap-12\">\n <div className=\"size-32 rounded-6 bg-transparent border border-border-neutral-strong flex items-center justify-center\">\n <Icon\n name=\"shipfox\"\n className=\"size-16 text-foreground-neutral-subtle\"\n color=\"var(--foreground-neutral-subtle, #a1a1aa)\"\n />\n </div>\n <div className=\"text-center space-y-4 px-16\">\n <Text size=\"sm\" className=\"text-foreground-neutral-base\">\n No jobs yet\n </Text>\n <Text size=\"xs\" className=\"text-foreground-neutral-muted\">\n Import past runs or start a runner.\n </Text>\n </div>\n </div>\n </div>\n\n <div className=\"space-y-16\">\n {Array.from({length: 3}).map((_, i) => {\n const blockId = `analytics-extra-block-${i}`;\n return (\n <div\n key={blockId}\n className=\"p-12 md:p-16 rounded-8 bg-background-subtle-base border border-border-neutral-strong\"\n >\n <Skeleton className=\"h-16 w-full max-w-400 mb-8\" />\n <Skeleton className=\"h-12 w-full max-w-600\" />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"],"names":["Icon","Skeleton","Text","AnalyticsContent","div","className","map","label","p","name","color","size","Array","from","length","_","i","blockId"],"mappings":";AAAA,SAAQA,IAAI,QAAO,kBAAkB;AACrC,SAAQC,QAAQ,QAAO,sBAAsB;AAC7C,SAAQC,IAAI,QAAO,wBAAwB;AAE3C,OAAO,SAASC;IACd,qBACE,MAACC;QAAIC,WAAU;;0BACb,MAACD;gBAAIC,WAAU;;kCACb,KAACJ;wBAASI,WAAU;;kCACpB,MAACD;wBAAIC,WAAU;;0CACb,KAACJ;gCAASI,WAAU;;0CACpB,KAACJ;gCAASI,WAAU;;;;;;0BAIxB,KAACD;gBAAIC,WAAU;0BACZ;oBAAC;oBAAS;oBAAW;oBAAU;oBAAW;iBAAe,CAACC,GAAG,CAAC,CAACC,sBAC9D,MAACH;wBAECC,WAAU;;0CAEV,KAACG;gCAAEH,WAAU;0CAA+CE;;0CAC5D,KAACN;gCAASI,WAAU;;;uBAJfE;;0BASX,MAACH;gBAAIC,WAAU;;kCACb,MAACD;wBAAIC,WAAU;;0CACb,KAACG;gCAAEH,WAAU;0CAAyD;;0CAGtE,KAACD;gCAAIC,WAAU;0CACb,cAAA,MAACD;oCAAIC,WAAU;;sDACb,KAACL;4CACCS,MAAK;4CACLJ,WAAU;;sDAEZ,KAACG;4CAAEH,WAAU;sDAAyC;;;;;;;kCAI5D,MAACD;wBAAIC,WAAU;;0CACb,KAACG;gCAAEH,WAAU;0CAAyD;;0CAGtE,KAACD;gCAAIC,WAAU;0CACb,cAAA,MAACD;oCAAIC,WAAU;;sDACb,KAACL;4CACCS,MAAK;4CACLJ,WAAU;;sDAEZ,KAACG;4CAAEH,WAAU;sDAAyC;;;;;;;;;0BAM9D,MAACD;gBAAIC,WAAU;;kCACb,MAACD;wBAAIC,WAAU;;0CACb,KAACG;gCAAEH,WAAU;0CAAmD;;0CAChE,MAACD;gCAAIC,WAAU;;kDACb,KAACJ;wCAASI,WAAU;;kDACpB,KAACJ;wCAASI,WAAU;;;;;;kCAGxB,MAACD;wBAAIC,WAAU;;0CACb,KAACD;gCAAIC,WAAU;0CACb,cAAA,KAACL;oCACCS,MAAK;oCACLJ,WAAU;oCACVK,OAAM;;;0CAGV,MAACN;gCAAIC,WAAU;;kDACb,KAACH;wCAAKS,MAAK;wCAAKN,WAAU;kDAA+B;;kDAGzD,KAACH;wCAAKS,MAAK;wCAAKN,WAAU;kDAAgC;;;;;;;;0BAOhE,KAACD;gBAAIC,WAAU;0BACZO,MAAMC,IAAI,CAAC;oBAACC,QAAQ;gBAAC,GAAGR,GAAG,CAAC,CAACS,GAAGC;oBAC/B,MAAMC,UAAU,CAAC,sBAAsB,EAAED,GAAG;oBAC5C,qBACE,MAACZ;wBAECC,WAAU;;0CAEV,KAACJ;gCAASI,WAAU;;0CACpB,KAACJ;gCAASI,WAAU;;;uBAJfY;gBAOX;;;;AAIR"}
@@ -0,0 +1,4 @@
1
+ export declare function AnimatedLogo({ scrollProgress }: {
2
+ scrollProgress: number;
3
+ }): import("react/jsx-runtime").JSX.Element | null;
4
+ //# sourceMappingURL=animated-logo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animated-logo.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/components/animated-logo.tsx"],"names":[],"mappings":"AAKA,wBAAgB,YAAY,CAAC,EAAC,cAAc,EAAC,EAAE;IAAC,cAAc,EAAE,MAAM,CAAA;CAAC,kDAmBtE"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Icon } from '../../../components/icon/index.js';
3
+ import { motion } from 'framer-motion';
4
+ const LOGO_HEIGHT = 48;
5
+ export function AnimatedLogo({ scrollProgress }) {
6
+ const isVisible = scrollProgress > 0;
7
+ if (!isVisible) return null;
8
+ const easedProgress = 1 - (1 - scrollProgress) ** 3;
9
+ return /*#__PURE__*/ _jsx(motion.div, {
10
+ className: "fixed top-0 left-0 z-50 flex items-center justify-center shrink-0 w-48 h-48 bg-background-neutral-base",
11
+ style: {
12
+ opacity: easedProgress,
13
+ transform: `translateY(${-LOGO_HEIGHT + easedProgress * LOGO_HEIGHT}px)`
14
+ },
15
+ initial: false,
16
+ children: /*#__PURE__*/ _jsx(Icon, {
17
+ name: "shipfox",
18
+ className: "size-20 text-foreground-neutral-subtle"
19
+ })
20
+ });
21
+ }
22
+
23
+ //# sourceMappingURL=animated-logo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/dashboard/components/animated-logo.tsx"],"sourcesContent":["import {Icon} from 'components/icon';\nimport {motion} from 'framer-motion';\n\nconst LOGO_HEIGHT = 48;\n\nexport function AnimatedLogo({scrollProgress}: {scrollProgress: number}) {\n const isVisible = scrollProgress > 0;\n\n if (!isVisible) return null;\n\n const easedProgress = 1 - (1 - scrollProgress) ** 3;\n\n return (\n <motion.div\n className=\"fixed top-0 left-0 z-50 flex items-center justify-center shrink-0 w-48 h-48 bg-background-neutral-base\"\n style={{\n opacity: easedProgress,\n transform: `translateY(${-LOGO_HEIGHT + easedProgress * LOGO_HEIGHT}px)`,\n }}\n initial={false}\n >\n <Icon name=\"shipfox\" className=\"size-20 text-foreground-neutral-subtle\" />\n </motion.div>\n );\n}\n"],"names":["Icon","motion","LOGO_HEIGHT","AnimatedLogo","scrollProgress","isVisible","easedProgress","div","className","style","opacity","transform","initial","name"],"mappings":";AAAA,SAAQA,IAAI,QAAO,kBAAkB;AACrC,SAAQC,MAAM,QAAO,gBAAgB;AAErC,MAAMC,cAAc;AAEpB,OAAO,SAASC,aAAa,EAACC,cAAc,EAA2B;IACrE,MAAMC,YAAYD,iBAAiB;IAEnC,IAAI,CAACC,WAAW,OAAO;IAEvB,MAAMC,gBAAgB,IAAI,AAAC,CAAA,IAAIF,cAAa,KAAM;IAElD,qBACE,KAACH,OAAOM,GAAG;QACTC,WAAU;QACVC,OAAO;YACLC,SAASJ;YACTK,WAAW,CAAC,WAAW,EAAE,CAACT,cAAcI,gBAAgBJ,YAAY,GAAG,CAAC;QAC1E;QACAU,SAAS;kBAET,cAAA,KAACZ;YAAKa,MAAK;YAAUL,WAAU;;;AAGrC"}
@@ -0,0 +1,4 @@
1
+ export declare function CompleteSetupButton({ className }: {
2
+ className?: string;
3
+ }): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=complete-setup-button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete-setup-button.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/components/complete-setup-button.tsx"],"names":[],"mappings":"AAMA,wBAAgB,mBAAmB,CAAC,EAAC,SAAS,EAAC,EAAE;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,2CAuBpE"}
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from '../../../components/button/index.js';
3
+ import { ShinyText } from '../../../components/shiny-text/index.js';
4
+ import { useResolvedTheme } from '../../../hooks/useResolvedTheme.js';
5
+ import { ShipfoxLoader } from 'shipfox-loader-react';
6
+ import { cn } from '../../../utils/cn.js';
7
+ export function CompleteSetupButton({ className }) {
8
+ const resolvedTheme = useResolvedTheme();
9
+ return /*#__PURE__*/ _jsxs(Button, {
10
+ type: "button",
11
+ variant: "transparent",
12
+ className: cn('flex items-center gap-8 min-w-124 max-w-280 overflow-hidden px-12 py-10 transition-colors rounded-none h-40 border-l border-border-neutral-strong', className),
13
+ children: [
14
+ /*#__PURE__*/ _jsx(ShipfoxLoader, {
15
+ size: 13,
16
+ animation: "circular",
17
+ color: resolvedTheme === 'dark' ? 'white' : 'orange',
18
+ background: resolvedTheme === 'dark' ? 'dark' : 'light'
19
+ }),
20
+ /*#__PURE__*/ _jsx(ShinyText, {
21
+ text: "Complete setup",
22
+ className: "flex-1 text-sm font-medium leading-20 text-foreground-neutral-base truncate text-left"
23
+ })
24
+ ]
25
+ });
26
+ }
27
+
28
+ //# sourceMappingURL=complete-setup-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/dashboard/components/complete-setup-button.tsx"],"sourcesContent":["import {Button} from 'components/button';\nimport {ShinyText} from 'components/shiny-text';\nimport {useResolvedTheme} from 'hooks/useResolvedTheme';\nimport {ShipfoxLoader} from 'shipfox-loader-react';\nimport {cn} from 'utils/cn';\n\nexport function CompleteSetupButton({className}: {className?: string}) {\n const resolvedTheme = useResolvedTheme();\n return (\n <Button\n type=\"button\"\n variant=\"transparent\"\n className={cn(\n 'flex items-center gap-8 min-w-124 max-w-280 overflow-hidden px-12 py-10 transition-colors rounded-none h-40 border-l border-border-neutral-strong',\n className,\n )}\n >\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 </Button>\n );\n}\n"],"names":["Button","ShinyText","useResolvedTheme","ShipfoxLoader","cn","CompleteSetupButton","className","resolvedTheme","type","variant","size","animation","color","background","text"],"mappings":";AAAA,SAAQA,MAAM,QAAO,oBAAoB;AACzC,SAAQC,SAAS,QAAO,wBAAwB;AAChD,SAAQC,gBAAgB,QAAO,yBAAyB;AACxD,SAAQC,aAAa,QAAO,uBAAuB;AACnD,SAAQC,EAAE,QAAO,WAAW;AAE5B,OAAO,SAASC,oBAAoB,EAACC,SAAS,EAAuB;IACnE,MAAMC,gBAAgBL;IACtB,qBACE,MAACF;QACCQ,MAAK;QACLC,SAAQ;QACRH,WAAWF,GACT,qJACAE;;0BAGF,KAACH;gBACCO,MAAM;gBACNC,WAAU;gBACVC,OAAOL,kBAAkB,SAAS,UAAU;gBAC5CM,YAAYN,kBAAkB,SAAS,SAAS;;0BAElD,KAACN;gBACCa,MAAK;gBACLR,WAAU;;;;AAIlB"}
@@ -0,0 +1,2 @@
1
+ export declare function JobsContent(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=jobs-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs-content.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/components/jobs-content.tsx"],"names":[],"mappings":"AASA,wBAAgB,WAAW,4CAyC1B"}
@@ -0,0 +1,69 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from '../../../components/button/index.js';
3
+ import { Icon } from '../../../components/icon/index.js';
4
+ import { SearchInline } from '../../../components/search/search-inline.js';
5
+ import { DataTable } from '../../../components/table/data-table.js';
6
+ import { jobColumns } from '../../../components/table/table.stories.columns.js';
7
+ import { jobsData } from '../../../components/table/table.stories.data.js';
8
+ import { Header as TypographyHeader } from '../../../components/typography/index.js';
9
+ import { useMemo, useState } from 'react';
10
+ export function JobsContent() {
11
+ const [searchQuery, setSearchQuery] = useState('');
12
+ const filteredData = useMemo(()=>jobsData.filter((job)=>job.name.toLowerCase().includes(searchQuery.toLowerCase())), [
13
+ searchQuery
14
+ ]);
15
+ return /*#__PURE__*/ _jsx("div", {
16
+ className: "min-h-[calc(100vh-48px)] p-12 md:p-24 bg-background-neutral-base",
17
+ children: /*#__PURE__*/ _jsxs("div", {
18
+ className: "rounded-t-8 overflow-hidden",
19
+ children: [
20
+ /*#__PURE__*/ _jsxs("div", {
21
+ 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",
22
+ children: [
23
+ /*#__PURE__*/ _jsx(TypographyHeader, {
24
+ variant: "h3",
25
+ className: "text-foreground-neutral-base",
26
+ children: "Jobs breakdown"
27
+ }),
28
+ /*#__PURE__*/ _jsxs("div", {
29
+ className: "flex items-center gap-8 md:gap-16 w-full md:w-auto",
30
+ children: [
31
+ /*#__PURE__*/ _jsx(SearchInline, {
32
+ placeholder: "Search...",
33
+ value: searchQuery,
34
+ onChange: (e)=>setSearchQuery(e.target.value),
35
+ onClear: ()=>setSearchQuery(''),
36
+ className: "flex-1 md:w-240"
37
+ }),
38
+ /*#__PURE__*/ _jsx(Button, {
39
+ variant: "secondary",
40
+ "aria-label": "Insert column left",
41
+ className: "shrink-0",
42
+ children: /*#__PURE__*/ _jsx(Icon, {
43
+ name: "insertColumnLeft",
44
+ className: "size-16 text-foreground-neutral-subtle"
45
+ })
46
+ })
47
+ ]
48
+ })
49
+ ]
50
+ }),
51
+ /*#__PURE__*/ _jsx(DataTable, {
52
+ columns: jobColumns,
53
+ data: filteredData,
54
+ pagination: true,
55
+ pageSize: 10,
56
+ pageSizeOptions: [
57
+ 10,
58
+ 20,
59
+ 50,
60
+ 100
61
+ ],
62
+ className: "rounded-t-none"
63
+ })
64
+ ]
65
+ })
66
+ });
67
+ }
68
+
69
+ //# sourceMappingURL=jobs-content.js.map
@@ -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