@visin/frontend-core 1.7.0 → 1.9.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 (52) hide show
  1. package/dist/auth/AuthProvider.d.ts.map +1 -1
  2. package/dist/auth/AuthProvider.js +29 -0
  3. package/dist/auth/AuthProvider.js.map +1 -1
  4. package/dist/auth/authService.d.ts +6 -0
  5. package/dist/auth/authService.d.ts.map +1 -1
  6. package/dist/auth/authService.js +1 -0
  7. package/dist/auth/authService.js.map +1 -1
  8. package/dist/components/AppLayout/AppLayout.d.ts +2 -4
  9. package/dist/components/AppLayout/AppLayout.d.ts.map +1 -1
  10. package/dist/components/AppLayout/AppLayout.js +78 -55
  11. package/dist/components/AppLayout/AppLayout.js.map +1 -1
  12. package/dist/components/Page/EmptyState.d.ts +10 -0
  13. package/dist/components/Page/EmptyState.d.ts.map +1 -0
  14. package/dist/components/Page/EmptyState.js +19 -0
  15. package/dist/components/Page/EmptyState.js.map +1 -0
  16. package/dist/components/Page/ListRow.d.ts +27 -0
  17. package/dist/components/Page/ListRow.d.ts.map +1 -0
  18. package/dist/components/Page/ListRow.js +72 -0
  19. package/dist/components/Page/ListRow.js.map +1 -0
  20. package/dist/components/Page/PageHeader.d.ts +33 -0
  21. package/dist/components/Page/PageHeader.d.ts.map +1 -0
  22. package/dist/components/Page/PageHeader.js +47 -0
  23. package/dist/components/Page/PageHeader.js.map +1 -0
  24. package/dist/components/Page/Panel.d.ts +16 -0
  25. package/dist/components/Page/Panel.d.ts.map +1 -0
  26. package/dist/components/Page/Panel.js +13 -0
  27. package/dist/components/Page/Panel.js.map +1 -0
  28. package/dist/components/Page/ResponsiveActions.d.ts +38 -0
  29. package/dist/components/Page/ResponsiveActions.d.ts.map +1 -0
  30. package/dist/components/Page/ResponsiveActions.js +30 -0
  31. package/dist/components/Page/ResponsiveActions.js.map +1 -0
  32. package/dist/components/Page/SectionHeading.d.ts +10 -0
  33. package/dist/components/Page/SectionHeading.d.ts.map +1 -0
  34. package/dist/components/Page/SectionHeading.js +7 -0
  35. package/dist/components/Page/SectionHeading.js.map +1 -0
  36. package/dist/components/Page/index.d.ts +14 -0
  37. package/dist/components/Page/index.d.ts.map +1 -0
  38. package/dist/components/Page/index.js +8 -0
  39. package/dist/components/Page/index.js.map +1 -0
  40. package/dist/components/Page/layout.d.ts +10 -0
  41. package/dist/components/Page/layout.d.ts.map +1 -0
  42. package/dist/components/Page/layout.js +14 -0
  43. package/dist/components/Page/layout.js.map +1 -0
  44. package/dist/index.d.ts +3 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +2 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/theme.d.ts +27 -0
  49. package/dist/theme.d.ts.map +1 -0
  50. package/dist/theme.js +121 -0
  51. package/dist/theme.js.map +1 -0
  52. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../../src/auth/AuthProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACpG,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,iFAAiF;IACjF,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,gGAAgG;IAChG,OAAO,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;CACzC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW;iCAUpB;QAAE,QAAQ,EAAE,SAAS,CAAA;KAAE;mBAuCvC,gBAAgB;EASrC"}
1
+ {"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../../src/auth/AuthProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACpG,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAS5E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,iFAAiF;IACjF,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,gGAAgG;IAChG,OAAO,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;CACzC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW;iCAWpB;QAAE,QAAQ,EAAE,SAAS,CAAA;KAAE;mBA2DvC,gBAAgB;EASrC"}
@@ -1,5 +1,11 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { createContext, useCallback, useContext, useEffect, useState } from 'react';
3
+ /**
4
+ * How stale the session check may get before returning to the app re-runs it.
5
+ * Each check renews the session cookie, so an installed app left open for days
6
+ * keeps its session alive instead of only renewing on a full page load.
7
+ */
8
+ const AUTH_RECHECK_INTERVAL_MS = 60 * 60 * 1000;
3
9
  /**
4
10
  * Builds a Context + `useAuth()` hook backed by a single `authService`
5
11
  * instance, so every consumer in the app shares one session check instead
@@ -13,11 +19,13 @@ export function createAuthContext(authService) {
13
19
  // flashing "Checking authentication..." on every visit. The check still runs
14
20
  // on each mount and corrects it.
15
21
  let lastKnownUser;
22
+ let lastCheckedAt = 0;
16
23
  function AuthProvider({ children }) {
17
24
  const [user, setUser] = useState(lastKnownUser ?? null);
18
25
  const [isLoading, setIsLoading] = useState(lastKnownUser === undefined);
19
26
  const refresh = useCallback(async () => {
20
27
  const result = await authService.checkAuth();
28
+ lastCheckedAt = Date.now();
21
29
  lastKnownUser = result.user;
22
30
  setUser(result.user);
23
31
  return result;
@@ -32,6 +40,27 @@ export function createAuthContext(authService) {
32
40
  cancelled = true;
33
41
  };
34
42
  }, [refresh]);
43
+ // Returning to the app (a tab brought forward, an installed app resumed)
44
+ // re-checks a stale session. A check that could not reach the server — a
45
+ // phone waking up offline — leaves the session as it was rather than
46
+ // signing the user out; the next return tries again.
47
+ useEffect(() => {
48
+ const onVisibilityChange = () => {
49
+ if (document.visibilityState !== 'visible')
50
+ return;
51
+ if (Date.now() - lastCheckedAt < AUTH_RECHECK_INTERVAL_MS)
52
+ return;
53
+ lastCheckedAt = Date.now();
54
+ void authService.checkAuth().then((result) => {
55
+ if (result.failed)
56
+ return;
57
+ lastKnownUser = result.user;
58
+ setUser(result.user);
59
+ });
60
+ };
61
+ document.addEventListener('visibilitychange', onVisibilityChange);
62
+ return () => document.removeEventListener('visibilitychange', onVisibilityChange);
63
+ }, []);
35
64
  const login = useCallback(() => {
36
65
  authService.redirectToLogin();
37
66
  }, []);
@@ -1 +1 @@
1
- {"version":3,"file":"AuthProvider.js","sourceRoot":"","sources":["../../src/auth/AuthProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAcpG;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAwB;IACxD,MAAM,WAAW,GAAG,aAAa,CAA+B,SAAS,CAAC,CAAC;IAE3E,6EAA6E;IAC7E,2EAA2E;IAC3E,8EAA8E;IAC9E,6EAA6E;IAC7E,iCAAiC;IACjC,IAAI,aAA0C,CAAC;IAE/C,SAAS,YAAY,CAAC,EAAE,QAAQ,EAA2B;QACzD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAkB,aAAa,IAAI,IAAI,CAAC,CAAC;QACzE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC;QAExE,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAA8B,EAAE;YAC/D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,CAAC;YAC7C,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrB,OAAO,MAAM,CAAC;QAChB,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,SAAS,CAAC,GAAG,EAAE;YACb,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;gBACrB,IAAI,CAAC,SAAS;oBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YACH,OAAO,GAAG,EAAE;gBACV,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC,CAAC;QACJ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QAEd,MAAM,KAAK,GAAG,WAAW,CAAC,GAAS,EAAE;YACnC,WAAW,CAAC,eAAe,EAAE,CAAC;QAChC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,IAAmB,EAAE;YACnD,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;YAC3B,aAAa,GAAG,IAAI,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3B,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO,CACL,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAC9F,QAAQ,GACY,CACxB,CAAC;IACJ,CAAC;IAED,SAAS,OAAO;QACd,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;QACxC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"AuthProvider.js","sourceRoot":"","sources":["../../src/auth/AuthProvider.tsx"],"names":[],"mappings":"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"}
@@ -29,6 +29,12 @@ export interface AuthUser {
29
29
  export interface AuthCheckResult {
30
30
  authenticated: boolean;
31
31
  user: AuthUser | null;
32
+ /**
33
+ * True when the check never got an answer (network down, server error), as
34
+ * opposed to the server saying "not logged in". `authenticated` is false
35
+ * either way; this is what lets a caller keep a session it already has.
36
+ */
37
+ failed?: boolean;
32
38
  }
33
39
  export interface AuthServiceOptions {
34
40
  /** Base URL of auth-service, e.g. `() => getGlobalConfig().AUTH_SERVICE_URL`. */
@@ -1 +1 @@
1
- {"version":3,"file":"authService.d.ts","sourceRoot":"","sources":["../../src/auth/authService.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,4FAA4F;IAC5F,YAAY,EAAE,MAAM,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,EAAE,kBAAkB;qBAS9D,OAAO,CAAC,eAAe,CAAC;0BA+Bb,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;sBAK5B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;2BAUnB,OAAO,CAAC,OAAO,CAAC;kBAKzB,OAAO,CAAC,OAAO,CAAC;kCAUJ,MAAM,KAAG,IAAI;EAcnD;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
1
+ {"version":3,"file":"authService.d.ts","sourceRoot":"","sources":["../../src/auth/authService.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,4FAA4F;IAC5F,YAAY,EAAE,MAAM,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,EAAE,kBAAkB;qBAS9D,OAAO,CAAC,eAAe,CAAC;0BAgCb,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;sBAK5B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;2BAUnB,OAAO,CAAC,OAAO,CAAC;kBAKzB,OAAO,CAAC,OAAO,CAAC;kCAUJ,MAAM,KAAG,IAAI;EAcnD;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -34,6 +34,7 @@ export function createAuthService({ authServiceUrl, authFrontUrl }) {
34
34
  // anonymous visitor, not a bug worth an error-level log.
35
35
  if (!(error instanceof ApiError && error.status === 401)) {
36
36
  console.error('Auth check failed:', error);
37
+ return { authenticated: false, user: null, failed: true };
37
38
  }
38
39
  return { authenticated: false, user: null };
39
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"authService.js","sourceRoot":"","sources":["../../src/auth/authService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authService.js","sourceRoot":"","sources":["../../src/auth/authService.ts"],"names":[],"mappings":"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"}
@@ -38,8 +38,6 @@ export interface AppLayoutProps {
38
38
  children: ReactNode;
39
39
  /** The page title where no section names the page. */
40
40
  appName: string;
41
- /** Static description shown under the desktop page title. */
42
- subtitle: string;
43
41
  navGroups: AppLayoutNavGroup[];
44
42
  /**
45
43
  * Account's sections: listed in the account menu, and in the section bar
@@ -59,7 +57,7 @@ export interface AppLayoutProps {
59
57
  /** Required when `isAuthenticated` can be false. */
60
58
  onLogin?: () => void;
61
59
  /**
62
- * False drops the page title/subtitle header, for apps whose pages render
60
+ * False drops the page title, for apps whose pages render
63
61
  * their own headings. Defaults to true.
64
62
  */
65
63
  showPageHeader?: boolean;
@@ -77,6 +75,6 @@ export interface AppLayoutProps {
77
75
  * behind a burger button on phones, and collapsed on desktop to an icon rail
78
76
  * that relied on the reader recognising the icons.
79
77
  */
80
- export declare function AppLayout({ children, appName, subtitle, navGroups, accountItems, user, onLogout, maxContentWidth, isAuthenticated, onLogin, showPageHeader, homePath }: AppLayoutProps): import("react").JSX.Element;
78
+ export declare function AppLayout({ children, appName, navGroups, accountItems, user, onLogout, maxContentWidth, isAuthenticated, onLogin, showPageHeader, homePath }: AppLayoutProps): import("react").JSX.Element;
81
79
  export {};
82
80
  //# sourceMappingURL=AppLayout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AppLayout.d.ts","sourceRoot":"","sources":["../../../src/components/AppLayout/AppLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,OAAO,CAAC;AA4BxD,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,8DAA8D;AAC9D,MAAM,WAAW,wBAAyB,SAAQ,WAAW;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,qEAAqE;AACrE,MAAM,WAAW,wBAAyB,SAAQ,WAAW;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAAG,wBAAwB,GAAG,wBAAwB,CAAC;AAEnF;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,yDAAyD;IACzD,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B;;;;OAIG;IACH,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAClC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,2GAA2G;IAC3G,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAUD;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,SAAS,EACT,YAAiB,EACjB,IAAI,EACJ,QAAQ,EACR,eAAqB,EACrB,eAAsB,EACtB,OAAO,EACP,cAAqB,EACrB,QAAQ,EACT,EAAE,cAAc,+BAgWhB"}
1
+ {"version":3,"file":"AppLayout.d.ts","sourceRoot":"","sources":["../../../src/components/AppLayout/AppLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,OAAO,CAAC;AA4BxD,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,8DAA8D;AAC9D,MAAM,WAAW,wBAAyB,SAAQ,WAAW;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,qEAAqE;AACrE,MAAM,WAAW,wBAAyB,SAAQ,WAAW;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAAG,wBAAwB,GAAG,wBAAwB,CAAC;AAEnF;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,yDAAyD;IACzD,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B;;;;OAIG;IACH,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAClC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,2GAA2G;IAC3G,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAUD;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,OAAO,EACP,SAAS,EACT,YAAiB,EACjB,IAAI,EACJ,QAAQ,EACR,eAAqB,EACrB,eAAsB,EACtB,OAAO,EACP,cAAqB,EACrB,QAAQ,EACT,EAAE,cAAc,+BAkXhB"}
@@ -1,14 +1,14 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
- import { Avatar, Box, Button, ButtonBase, CssBaseline, Divider, Drawer, ListItemIcon, ListItemText, Menu, MenuItem, MenuList, Typography, useMediaQuery, useTheme } from '@mui/material';
3
+ import { Avatar, Box, Button, ButtonBase, CssBaseline, Divider, Drawer, ListItemIcon, ListItemText, Menu, MenuItem, MenuList, Typography, useTheme } from '@mui/material';
4
4
  import { alpha } from '@mui/material/styles';
5
5
  import { ExpandMore, Login, Logout, Person } from '@mui/icons-material';
6
6
  import { Link, useLocation } from 'react-router-dom';
7
+ import { VISIN_COLORS } from '../../theme';
8
+ import { TAB_BAR_HEIGHT, useCompactLayout } from '../Page/layout';
7
9
  const RAIL_WIDTH = 88;
8
- /** Height the phone tab bar covers at the foot of the screen, above the safe-area inset. */
9
- const TAB_BAR_HEIGHT = 72;
10
- const CHROME_BG = '#111827';
11
- const CHROME_BORDER = 'rgba(255,255,255,0.1)';
10
+ const APP_BAR_HEIGHT = 56;
11
+ const RAIL_BORDER = 'rgba(255,255,255,0.08)';
12
12
  const ownsPath = (prefix, pathname) => pathname === prefix || pathname.startsWith(`${prefix}/`);
13
13
  // A router link for a local section, a plain anchor — a full page load — for a
14
14
  // sibling app's.
@@ -24,17 +24,13 @@ const linkProps = (item) => item.path !== undefined ? { component: Link, to: ite
24
24
  * behind a burger button on phones, and collapsed on desktop to an icon rail
25
25
  * that relied on the reader recognising the icons.
26
26
  */
27
- export function AppLayout({ children, appName, subtitle, navGroups, accountItems = [], user, onLogout, maxContentWidth = 800, isAuthenticated = true, onLogin, showPageHeader = true, homePath }) {
27
+ export function AppLayout({ children, appName, navGroups, accountItems = [], user, onLogout, maxContentWidth = 800, isAuthenticated = true, onLogin, showPageHeader = true, homePath }) {
28
28
  const { pathname } = useLocation();
29
29
  const theme = useTheme();
30
- // Read synchronously. The default first pass assumes a wide screen, which
31
- // would draw the rail on a phone for a frame before swapping in the tab bar.
32
- //
33
- // The cut is at `md`, not `sm`: a tablet-width window has room for the rail
34
- // but not for the rail *and* a readable content column, so from 600 to 900 it
35
- // was the content that gave up the 88px. Below `md` the compact layout — tab
36
- // bar, section dropdown, bottom-sheet account — gets the full width instead.
37
- const mobile = useMediaQuery(theme.breakpoints.down('md'), { noSsr: true });
30
+ // Below `md` the compact layout — app bar, tab bar, section dropdown,
31
+ // bottom-sheet account — gets the full width; from 600 to 900 there is room
32
+ // for the rail but not the rail *and* a readable content column.
33
+ const mobile = useCompactLayout();
38
34
  const [accountAnchor, setAccountAnchor] = useState(null);
39
35
  const [sectionAnchor, setSectionAnchor] = useState(null);
40
36
  const closeAccount = () => setAccountAnchor(null);
@@ -81,37 +77,44 @@ export function AppLayout({ children, appName, subtitle, navGroups, accountItems
81
77
  paper: { sx: { ml: 1, minWidth: 240, maxWidth: 320, borderRadius: 3 } },
82
78
  list: { 'aria-label': 'Account' }
83
79
  }, children: accountMenuItems }));
84
- const sectionBarSx = {
80
+ // What the app bar calls the page: its section, else its group, else the app.
81
+ const barTitle = activeItem?.text ?? activeGroup?.label ?? appName;
82
+ const appBarSx = {
83
+ position: 'sticky',
84
+ top: 0,
85
+ zIndex: theme.zIndex.appBar,
85
86
  display: 'flex',
86
87
  alignItems: 'center',
87
- borderBottom: 1,
88
- borderColor: 'divider',
89
- bgcolor: 'background.paper'
88
+ bgcolor: VISIN_COLORS.appBar,
89
+ color: '#fff',
90
+ borderBottom: `1px solid ${RAIL_BORDER}`,
91
+ // Under a status bar the installed app draws into (viewport-fit=cover).
92
+ pt: 'env(safe-area-inset-top)'
90
93
  };
91
- const sectionBar = sectionGroup &&
92
- (mobile ? (_jsxs(Box, { component: "nav", "aria-label": sectionGroup.label, sx: { ...sectionBarSx, minHeight: 52, px: 1 }, children: [_jsx(Button, { onClick: (event) => setSectionAnchor(event.currentTarget), endIcon: _jsx(ExpandMore, {}), "aria-haspopup": "menu", "aria-expanded": Boolean(sectionAnchor), sx: {
93
- textTransform: 'none',
94
+ const sectionMenu = sectionGroup && (_jsx(Menu, { anchorEl: sectionAnchor, open: Boolean(sectionAnchor), onClose: closeSections, anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, transformOrigin: { vertical: 'top', horizontal: 'left' }, slotProps: { paper: { sx: { minWidth: 220 } } }, children: sectionGroup.items.map((item) => menuItem(item, closeSections)) }));
95
+ const header = mobile ? (_jsx(Box, { component: "header", sx: { ...appBarSx, minHeight: APP_BAR_HEIGHT, px: 1 }, children: sectionGroup ? (_jsxs(Box, { component: "nav", "aria-label": sectionGroup.label, sx: { minWidth: 0 }, children: [_jsx(Button, { onClick: (event) => setSectionAnchor(event.currentTarget), endIcon: _jsx(ExpandMore, {}), "aria-haspopup": "menu", "aria-expanded": Boolean(sectionAnchor), sx: {
94
96
  fontWeight: 700,
95
- fontSize: '1rem',
96
- color: 'text.primary',
97
- borderRadius: 2,
97
+ fontSize: '1.125rem',
98
+ color: 'inherit',
98
99
  minWidth: 0,
99
- maxWidth: '100%'
100
- }, children: _jsx(Box, { component: "span", sx: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }, children: sectionGroup.items.find(isActive)?.text ?? sectionGroup.label }) }), _jsx(Menu, { anchorEl: sectionAnchor, open: Boolean(sectionAnchor), onClose: closeSections, anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, transformOrigin: { vertical: 'top', horizontal: 'left' }, slotProps: { paper: { sx: { minWidth: 220, borderRadius: 3 } } }, children: sectionGroup.items.map((item) => menuItem(item, closeSections)) })] })) : (_jsx(Box, { component: "nav", "aria-label": sectionGroup.label, sx: { ...sectionBarSx, gap: 1, minHeight: 56, px: { sm: 3, md: 7 }, overflowX: 'auto' }, children: sectionGroup.items.map((item) => {
101
- const active = isActive(item);
102
- return (_jsx(Button, { ...linkProps(item), startIcon: item.icon, "aria-current": active ? 'page' : undefined, sx: {
103
- flexShrink: 0,
104
- px: 2,
105
- borderRadius: 2,
106
- textTransform: 'none',
107
- fontWeight: active ? 700 : 500,
108
- color: active ? 'primary.main' : 'text.secondary',
109
- bgcolor: active ? alpha(theme.palette.primary.main, 0.08) : 'transparent',
110
- '&:hover': { bgcolor: active ? alpha(theme.palette.primary.main, 0.14) : 'action.hover' }
111
- }, children: item.text }, item.text));
112
- }) })));
113
- // On a phone the section dropdown already names the page.
114
- const pageHeader = showPageHeader && !(mobile && sectionGroup) && (_jsxs(Box, { sx: { mb: { xs: 3, md: 6 } }, children: [_jsx(Typography, { variant: "h4", sx: { fontWeight: 700, letterSpacing: '-1px', mb: 1, fontSize: { xs: '1.5rem', sm: '2.125rem' } }, children: activeItem?.text || appName }), _jsx(Typography, { variant: "body1", sx: { color: 'text.secondary', display: { xs: 'none', md: 'block' } }, children: subtitle })] }));
100
+ maxWidth: '100%',
101
+ px: 1.25,
102
+ '&:hover': { bgcolor: 'rgba(255,255,255,0.12)' }
103
+ }, children: _jsx(Box, { component: "span", sx: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }, children: sectionGroup.items.find(isActive)?.text ?? sectionGroup.label }) }), sectionMenu] })) : (_jsx(Typography, { component: "span", noWrap: true, sx: { fontWeight: 700, fontSize: '1.125rem', px: 1.25 }, children: barTitle })) })) : (_jsxs(Box, { component: "header", sx: { ...appBarSx, minHeight: 64, gap: 3, px: { md: 5 } }, children: [_jsx(Typography, { component: "span", noWrap: true, sx: { fontWeight: 700, fontSize: '1.125rem', flexShrink: 0 }, children: activeGroup?.label ?? appName }), sectionGroup && (_jsx(Box, { component: "nav", "aria-label": sectionGroup.label, sx: { display: 'flex', alignItems: 'center', gap: 0.5, overflowX: 'auto', minWidth: 0 }, children: sectionGroup.items.map((item) => {
104
+ const active = isActive(item);
105
+ return (_jsx(Button, { ...linkProps(item), startIcon: item.icon, "aria-current": active ? 'page' : undefined, sx: {
106
+ flexShrink: 0,
107
+ px: 1.75,
108
+ height: 36,
109
+ fontWeight: active ? 700 : 500,
110
+ color: active ? '#fff' : 'rgba(255,255,255,0.72)',
111
+ bgcolor: active ? 'rgba(255,255,255,0.16)' : 'transparent',
112
+ '& .MuiButton-startIcon svg': { fontSize: 20 },
113
+ '&:hover': { bgcolor: active ? 'rgba(255,255,255,0.22)' : 'rgba(255,255,255,0.1)', color: '#fff' }
114
+ }, children: item.text }, item.text));
115
+ }) }))] }));
116
+ // On a phone the app bar already names the page.
117
+ const pageHeader = showPageHeader && !mobile && (_jsx(Typography, { variant: "h4", component: "h1", sx: { fontSize: '1.75rem', lineHeight: 1.25, mb: 3 }, children: activeItem?.text || appName }));
115
118
  return (_jsxs(Box, { sx: { display: 'flex', minHeight: '100vh', bgcolor: 'background.default' }, children: [_jsx(CssBaseline, {}), !mobile && (_jsxs(Box, { component: "nav", "aria-label": "Main", sx: {
116
119
  width: RAIL_WIDTH,
117
120
  flexShrink: 0,
@@ -127,20 +130,20 @@ export function AppLayout({ children, appName, subtitle, navGroups, accountItems
127
130
  px: 0.5,
128
131
  py: 2,
129
132
  overflowY: 'auto',
130
- bgcolor: CHROME_BG,
133
+ bgcolor: VISIN_COLORS.rail,
131
134
  color: '#fff',
132
- borderRight: `1px solid ${CHROME_BORDER}`
135
+ borderRight: `1px solid ${RAIL_BORDER}`
133
136
  }, children: [homePath ? (_jsx(ButtonBase, { component: Link, to: homePath, "aria-label": "Visin home", disableRipple: true, sx: {
134
137
  alignSelf: 'center',
135
138
  mb: 2,
136
139
  p: 0.5,
137
140
  borderRadius: '10px',
138
141
  '&.Mui-focusVisible': { outline: `2px solid ${theme.palette.primary.light}`, outlineOffset: 1 }
139
- }, children: _jsx(Box, { component: "img", src: "/logo.svg", alt: "Visin", sx: { display: 'block', width: 32, height: 32 } }) })) : (_jsx(Box, { component: "img", src: "/logo.svg", alt: "Visin", sx: { width: 32, height: 32, mx: 'auto', mb: 2.5, mt: 0.5 } })), railEntries] })), _jsxs(Box, { sx: { flexGrow: 1, minWidth: 0, display: 'flex', flexDirection: 'column' }, children: [sectionBar, _jsx(Box, { component: "main", sx: {
142
+ }, children: _jsx(Box, { component: "img", src: "/logo.svg", alt: "Visin", sx: { display: 'block', width: 32, height: 32 } }) })) : (_jsx(Box, { component: "img", src: "/logo.svg", alt: "Visin", sx: { width: 32, height: 32, mx: 'auto', mb: 2.5, mt: 0.5 } })), railEntries] })), _jsxs(Box, { sx: { flexGrow: 1, minWidth: 0, display: 'flex', flexDirection: 'column' }, children: [header, _jsx(Box, { component: "main", sx: {
140
143
  flexGrow: 1,
141
144
  // Gutters stay narrow for as long as the compact layout runs; 4 was
142
145
  // a desktop margin applied to a tablet's much shorter line.
143
- p: { xs: 2, sm: 3, md: 8 },
146
+ p: { xs: 2, sm: 3, md: 5 },
144
147
  // Clear of the fixed tab bar. On the padding rather than a spacer,
145
148
  // since the workbench sizes its frame to what main's padding leaves.
146
149
  ...(mobile && { pb: `calc(${TAB_BAR_HEIGHT}px + ${theme.spacing(2)} + env(safe-area-inset-bottom))` }),
@@ -157,13 +160,35 @@ export function AppLayout({ children, appName, subtitle, navGroups, accountItems
157
160
  px: 0.5,
158
161
  pt: 0.75,
159
162
  pb: 'calc(6px + env(safe-area-inset-bottom))',
160
- bgcolor: CHROME_BG,
161
- color: '#fff',
162
- borderTop: `1px solid ${CHROME_BORDER}`
163
+ bgcolor: 'background.paper',
164
+ color: 'text.secondary',
165
+ borderTop: 1,
166
+ borderColor: 'divider',
167
+ boxShadow: '0 -4px 16px rgba(15, 23, 42, 0.04)'
163
168
  }, children: railEntries })), isAuthenticated && accountMenu] }));
164
169
  }
165
170
  function NavButton({ label, icon, active, current, mobile, target, onClick, expanded }) {
166
171
  const theme = useTheme();
172
+ // The rail is dark; the phone's tab bar is light, under a coloured app bar.
173
+ const tone = mobile
174
+ ? {
175
+ idle: theme.palette.text.secondary,
176
+ active: theme.palette.text.primary,
177
+ activeIcon: theme.palette.primary.main,
178
+ pill: alpha(theme.palette.primary.main, 0.12),
179
+ pillHover: alpha(theme.palette.primary.main, 0.18),
180
+ idleHover: theme.palette.action.hover,
181
+ focus: theme.palette.primary.main
182
+ }
183
+ : {
184
+ idle: 'rgba(255,255,255,0.62)',
185
+ active: '#fff',
186
+ activeIcon: theme.palette.primary.light,
187
+ pill: alpha(theme.palette.primary.main, 0.24),
188
+ pillHover: alpha(theme.palette.primary.main, 0.34),
189
+ idleHover: 'rgba(255,255,255,0.08)',
190
+ focus: theme.palette.primary.light
191
+ };
167
192
  const sx = {
168
193
  flex: mobile ? 1 : 'none',
169
194
  minWidth: 0,
@@ -173,7 +198,7 @@ function NavButton({ label, icon, active, current, mobile, target, onClick, expa
173
198
  gap: 0.5,
174
199
  py: 0.5,
175
200
  borderRadius: 3,
176
- color: active ? '#fff' : 'rgba(255,255,255,0.6)',
201
+ color: active ? tone.active : tone.idle,
177
202
  WebkitTapHighlightColor: 'transparent',
178
203
  '& .nav-pill': {
179
204
  width: 56,
@@ -181,16 +206,14 @@ function NavButton({ label, icon, active, current, mobile, target, onClick, expa
181
206
  borderRadius: 999,
182
207
  display: 'grid',
183
208
  placeItems: 'center',
184
- color: active ? theme.palette.primary.light : 'inherit',
185
- bgcolor: active ? alpha(theme.palette.primary.main, 0.22) : 'transparent',
209
+ color: active ? tone.activeIcon : 'inherit',
210
+ bgcolor: active ? tone.pill : 'transparent',
186
211
  transition: 'background-color .2s ease, color .2s ease, transform .15s ease'
187
212
  },
188
- '&:hover': { color: '#fff' },
189
- '&:hover .nav-pill': {
190
- bgcolor: active ? alpha(theme.palette.primary.main, 0.32) : 'rgba(255,255,255,0.08)'
191
- },
213
+ '&:hover': { color: tone.active },
214
+ '&:hover .nav-pill': { bgcolor: active ? tone.pillHover : tone.idleHover },
192
215
  '&:active .nav-pill': { transform: 'scale(0.94)' },
193
- '&.Mui-focusVisible .nav-pill': { outline: `2px solid ${theme.palette.primary.light}`, outlineOffset: 1 }
216
+ '&.Mui-focusVisible .nav-pill': { outline: `2px solid ${tone.focus}`, outlineOffset: 1 }
194
217
  };
195
218
  const body = (_jsxs(_Fragment, { children: [_jsx(Box, { className: "nav-pill", "aria-hidden": true, children: icon }), _jsx(Box, { component: "span", sx: {
196
219
  maxWidth: '100%',
@@ -1 +1 @@
1
- {"version":3,"file":"AppLayout.js","sourceRoot":"","sources":["../../../src/components/AppLayout/AppLayout.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AppLayout.js","sourceRoot":"","sources":["../../../src/components/AppLayout/AppLayout.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface EmptyStateProps {
3
+ icon: ReactNode;
4
+ title: string;
5
+ description?: ReactNode;
6
+ action?: ReactNode;
7
+ }
8
+ /** What stands in for a list with nothing in it: what would be here, and how to add the first one. */
9
+ export declare function EmptyState({ icon, title, description, action }: EmptyStateProps): import("react").JSX.Element;
10
+ //# sourceMappingURL=EmptyState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../../src/components/Page/EmptyState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,sGAAsG;AACtG,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,eAAe,+BA6B/E"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Typography } from '@mui/material';
3
+ import { alpha } from '@mui/material/styles';
4
+ /** What stands in for a list with nothing in it: what would be here, and how to add the first one. */
5
+ export function EmptyState({ icon, title, description, action }) {
6
+ return (_jsxs(Box, { sx: { textAlign: 'center', px: 3, py: { xs: 6, md: 8 } }, children: [_jsx(Box, { "aria-hidden": true, sx: (theme) => ({
7
+ width: 56,
8
+ height: 56,
9
+ mx: 'auto',
10
+ mb: 2,
11
+ borderRadius: '16px',
12
+ display: 'grid',
13
+ placeItems: 'center',
14
+ color: 'primary.main',
15
+ bgcolor: alpha(theme.palette.primary.main, 0.1),
16
+ '& svg': { fontSize: 28 }
17
+ }), children: icon }), _jsx(Typography, { sx: { fontWeight: 700, fontSize: '1.05rem' }, children: title }), description && (_jsx(Typography, { variant: "body2", sx: { color: 'text.secondary', mt: 0.5, maxWidth: 420, mx: 'auto' }, children: description })), action && _jsx(Box, { sx: { mt: 2.5 }, children: action })] }));
18
+ }
19
+ //# sourceMappingURL=EmptyState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.js","sourceRoot":"","sources":["../../../src/components/Page/EmptyState.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAS7C,sGAAsG;AACtG,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAmB;IAC9E,OAAO,CACL,MAAC,GAAG,IAAC,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,aAC3D,KAAC,GAAG,yBAEF,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBACd,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE,EAAE;oBACV,EAAE,EAAE,MAAM;oBACV,EAAE,EAAE,CAAC;oBACL,YAAY,EAAE,MAAM;oBACpB,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,cAAc;oBACrB,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;oBAC/C,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;iBAC1B,CAAC,YAED,IAAI,GACD,EACN,KAAC,UAAU,IAAC,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAG,KAAK,GAAc,EAC7E,WAAW,IAAI,CACd,KAAC,UAAU,IAAC,OAAO,EAAC,OAAO,EAAC,EAAE,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,YAC5F,WAAW,GACD,CACd,EACA,MAAM,IAAI,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,YAAG,MAAM,GAAO,IAC3C,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface ListRowProps {
3
+ /** A route in this app. */
4
+ to?: string;
5
+ /** A page elsewhere, loaded in full. */
6
+ href?: string;
7
+ onClick?: () => void;
8
+ leading?: ReactNode;
9
+ title: ReactNode;
10
+ secondary?: ReactNode;
11
+ /** Controls at the end of the row (a menu, a chip). Replaces the chevron, and sits outside the tap target. */
12
+ trailing?: ReactNode;
13
+ /** Drawn under the secondary line, e.g. a progress meter. */
14
+ children?: ReactNode;
15
+ }
16
+ /**
17
+ * One row of a native-style list: icon, two lines, and a chevron — the whole
18
+ * row one tap target. Rows in a `Panel` get hairlines between them, inset past
19
+ * the icon the way a phone draws them.
20
+ */
21
+ export declare function ListRow({ to, href, onClick, leading, title, secondary, trailing, children }: ListRowProps): import("react").JSX.Element;
22
+ /** The tinted square an icon sits in at the start of a row. */
23
+ export declare function RowIcon({ color, children }: {
24
+ color: string;
25
+ children: ReactNode;
26
+ }): import("react").JSX.Element;
27
+ //# sourceMappingURL=ListRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListRow.d.ts","sourceRoot":"","sources":["../../../src/components/Page/ListRow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAgBvC,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,8GAA8G;IAC9G,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,YAAY,+BA2EzG;AAED,+DAA+D;AAC/D,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAmBlF"}
@@ -0,0 +1,72 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Link as RouterLink } from 'react-router-dom';
3
+ import { Box, ButtonBase, Typography } from '@mui/material';
4
+ import { alpha } from '@mui/material/styles';
5
+ import { ChevronRight } from '@mui/icons-material';
6
+ // Up to two lines, then an ellipsis: one line cut a phone row's detail off
7
+ // before its most useful part.
8
+ const twoLines = {
9
+ display: '-webkit-box',
10
+ WebkitBoxOrient: 'vertical',
11
+ WebkitLineClamp: 2,
12
+ overflow: 'hidden',
13
+ overflowWrap: 'anywhere'
14
+ };
15
+ /**
16
+ * One row of a native-style list: icon, two lines, and a chevron — the whole
17
+ * row one tap target. Rows in a `Panel` get hairlines between them, inset past
18
+ * the icon the way a phone draws them.
19
+ */
20
+ export function ListRow({ to, href, onClick, leading, title, secondary, trailing, children }) {
21
+ const navigable = to !== undefined || href !== undefined || onClick !== undefined;
22
+ const target = to !== undefined ? { component: RouterLink, to } : href !== undefined ? { component: 'a', href } : {};
23
+ const body = (_jsxs(_Fragment, { children: [leading, _jsxs(Box, { component: "span", sx: { flex: 1, minWidth: 0 }, children: [_jsx(Typography, { component: "span", sx: { ...twoLines, fontSize: '0.975rem', fontWeight: 600, lineHeight: 1.4 }, children: title }), secondary && (_jsx(Typography, { component: "span", variant: "body2", sx: { ...twoLines, color: 'text.secondary' }, children: secondary })), children] }), navigable && !trailing && _jsx(ChevronRight, { sx: { color: 'text.disabled', flexShrink: 0 } })] }));
24
+ const rowSx = {
25
+ flex: 1,
26
+ minWidth: 0,
27
+ display: 'flex',
28
+ alignItems: 'center',
29
+ justifyContent: 'flex-start',
30
+ gap: 1.5,
31
+ px: 2,
32
+ py: 1.5,
33
+ minHeight: 64,
34
+ textAlign: 'left',
35
+ color: 'text.primary'
36
+ };
37
+ return (_jsxs(Box, { className: "visin-list-row", sx: {
38
+ position: 'relative',
39
+ display: 'flex',
40
+ alignItems: 'center',
41
+ pr: trailing ? 1 : 0,
42
+ '.visin-list-row + &::before': {
43
+ content: '""',
44
+ position: 'absolute',
45
+ top: 0,
46
+ left: leading ? 68 : 16,
47
+ right: 0,
48
+ borderTop: '1px solid',
49
+ borderColor: 'divider'
50
+ }
51
+ }, children: [navigable ? (_jsx(ButtonBase, { ...target, onClick: onClick, sx: {
52
+ ...rowSx,
53
+ WebkitTapHighlightColor: 'transparent',
54
+ transition: 'background-color .15s ease',
55
+ '&:hover': { bgcolor: 'action.hover' },
56
+ '&:active': { bgcolor: 'action.selected' }
57
+ }, children: body })) : (_jsx(Box, { sx: rowSx, children: body })), trailing && _jsx(Box, { sx: { display: 'flex', alignItems: 'center', gap: 0.5, flexShrink: 0 }, children: trailing })] }));
58
+ }
59
+ /** The tinted square an icon sits in at the start of a row. */
60
+ export function RowIcon({ color, children }) {
61
+ return (_jsx(Box, { component: "span", "aria-hidden": true, sx: {
62
+ width: 40,
63
+ height: 40,
64
+ borderRadius: '12px',
65
+ display: 'grid',
66
+ placeItems: 'center',
67
+ flexShrink: 0,
68
+ color,
69
+ bgcolor: alpha(color, 0.12)
70
+ }, children: children }));
71
+ }
72
+ //# sourceMappingURL=ListRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListRow.js","sourceRoot":"","sources":["../../../src/components/Page/ListRow.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface PageAction {
3
+ label: string;
4
+ icon?: ReactNode;
5
+ /** A route in this app. */
6
+ to?: string;
7
+ onClick?: () => void;
8
+ disabled?: boolean;
9
+ }
10
+ export interface PageHeaderProps {
11
+ /**
12
+ * Left out where the layout already titles the page (label and account pages,
13
+ * whose `AppLayout` header names them): then only the subtitle and actions show.
14
+ */
15
+ title?: string;
16
+ subtitle?: ReactNode;
17
+ /** Secondary controls beside the primary action, e.g. a refresh button. */
18
+ actions?: ReactNode;
19
+ /** The page's main action. A button on desktop; a floating button above the tab bar on a phone. */
20
+ primaryAction?: PageAction;
21
+ /**
22
+ * The app bar already names this page on a phone — a top-level section like
23
+ * Projects or Jobs — so the title is left out there rather than said twice.
24
+ */
25
+ hideTitleOnPhone?: boolean;
26
+ }
27
+ /**
28
+ * The top of a page: its title, a line saying what it is for, and what can be
29
+ * done here. On a phone the main action moves to a floating button in thumb
30
+ * reach, the way a native app offers "new".
31
+ */
32
+ export declare function PageHeader({ title, subtitle, actions, primaryAction, hideTitleOnPhone }: PageHeaderProps): import("react").JSX.Element;
33
+ //# sourceMappingURL=PageHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageHeader.d.ts","sourceRoot":"","sources":["../../../src/components/Page/PageHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAcvC,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2BAA2B;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,mGAAmG;IACnG,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,gBAAwB,EAAE,EAAE,eAAe,+BAuFhH"}
@@ -0,0 +1,47 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Link as RouterLink } from 'react-router-dom';
3
+ import { Box, Button, Fab, Typography } from '@mui/material';
4
+ import { TAB_BAR_HEIGHT, useCompactLayout } from './layout';
5
+ const visuallyHidden = {
6
+ position: 'absolute',
7
+ width: '1px',
8
+ height: '1px',
9
+ overflow: 'hidden',
10
+ clip: 'rect(0 0 0 0)',
11
+ whiteSpace: 'nowrap'
12
+ };
13
+ /**
14
+ * The top of a page: its title, a line saying what it is for, and what can be
15
+ * done here. On a phone the main action moves to a floating button in thumb
16
+ * reach, the way a native app offers "new".
17
+ */
18
+ export function PageHeader({ title, subtitle, actions, primaryAction, hideTitleOnPhone = false }) {
19
+ const compact = useCompactLayout();
20
+ const showTitle = title !== undefined && !(compact && hideTitleOnPhone);
21
+ const link = primaryAction?.to !== undefined ? { component: RouterLink, to: primaryAction.to } : {};
22
+ const primary = primaryAction &&
23
+ (compact ? (_jsxs(Fab, { variant: "extended", color: "primary", ...link, onClick: primaryAction.onClick, disabled: primaryAction.disabled, sx: {
24
+ position: 'fixed',
25
+ right: 16,
26
+ bottom: `calc(${TAB_BAR_HEIGHT}px + 16px + env(safe-area-inset-bottom))`,
27
+ zIndex: (theme) => theme.zIndex.speedDial,
28
+ gap: 1,
29
+ px: 2.5,
30
+ boxShadow: '0 8px 24px rgba(37, 99, 235, 0.35)'
31
+ }, children: [primaryAction.icon, primaryAction.label] })) : (_jsx(Button, { variant: "contained", ...link, onClick: primaryAction.onClick, disabled: primaryAction.disabled, startIcon: primaryAction.icon, sx: { flexShrink: 0, height: 40, px: 2.25 }, children: primaryAction.label })));
32
+ const controls = (actions || (primary && !compact)) && (_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1, flexShrink: 0 }, children: [actions, !compact && primary] }));
33
+ return (_jsxs(Box, { component: "header", sx: {
34
+ display: 'flex',
35
+ alignItems: showTitle ? 'flex-start' : 'center',
36
+ justifyContent: 'space-between',
37
+ // A narrow screen wraps a wide control (a select) under the text rather
38
+ // than squeezing the text into a strip beside it; an icon still fits.
39
+ flexWrap: 'wrap',
40
+ gap: 2,
41
+ // Nothing visible (a phone, no subtitle or controls): no gap either.
42
+ mb: !showTitle && !subtitle && !controls ? 0 : { xs: 2, md: 3 }
43
+ }, children: [_jsxs(Box, { sx: { minWidth: 0, flex: '1 1 240px' }, children: [title !== undefined && (_jsx(Typography, { variant: "h4", component: "h1", sx: showTitle
44
+ ? { fontSize: { xs: '1.5rem', md: '1.75rem' }, lineHeight: 1.25, mb: subtitle ? 0.5 : 0 }
45
+ : visuallyHidden, children: title })), subtitle && (_jsx(Typography, { variant: "body2", sx: { color: 'text.secondary', fontSize: { md: '0.95rem' } }, children: subtitle }))] }), controls, compact && primary] }));
46
+ }
47
+ //# sourceMappingURL=PageHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageHeader.js","sourceRoot":"","sources":["../../../src/components/Page/PageHeader.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ReactNode } from 'react';
2
+ import { type SxProps, type Theme } from '@mui/material';
3
+ export interface PanelProps {
4
+ children: ReactNode;
5
+ sx?: SxProps<Theme>;
6
+ /** The element to render, e.g. `section` or `ul`. */
7
+ component?: React.ElementType;
8
+ 'aria-label'?: string;
9
+ 'aria-labelledby'?: string;
10
+ }
11
+ /**
12
+ * The surface lists, tables and forms sit on: white, a hairline border, 16px
13
+ * corners. Flat on purpose — on a phone, stacked shadows read as clutter.
14
+ */
15
+ export declare function Panel({ children, sx, component, ...aria }: PanelProps): import("react").JSX.Element;
16
+ //# sourceMappingURL=Panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Panel.d.ts","sourceRoot":"","sources":["../../../src/components/Page/Panel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAO,KAAK,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAE9D,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,SAAS,CAAC;IACpB,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACpB,qDAAqD;IACrD,SAAS,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAiB,EAAE,GAAG,IAAI,EAAE,EAAE,UAAU,+BAa7E"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box } from '@mui/material';
3
+ /**
4
+ * The surface lists, tables and forms sit on: white, a hairline border, 16px
5
+ * corners. Flat on purpose — on a phone, stacked shadows read as clutter.
6
+ */
7
+ export function Panel({ children, sx, component = 'div', ...aria }) {
8
+ return (_jsx(Box, { component: component, ...aria, sx: [
9
+ { bgcolor: 'background.paper', border: '1px solid', borderColor: 'divider', borderRadius: '16px', overflow: 'hidden' },
10
+ ...(Array.isArray(sx) ? sx : [sx])
11
+ ], children: children }));
12
+ }
13
+ //# sourceMappingURL=Panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Panel.js","sourceRoot":"","sources":["../../../src/components/Page/Panel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAA4B,MAAM,eAAe,CAAC;AAW9D;;;GAGG;AACH,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,IAAI,EAAc;IAC5E,OAAO,CACL,KAAC,GAAG,IACF,SAAS,EAAE,SAAS,KAChB,IAAI,EACR,EAAE,EAAE;YACF,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE;YACtH,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACnC,YAEA,QAAQ,GACL,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface ResponsiveAction {
3
+ label: string;
4
+ icon?: ReactNode;
5
+ onClick?: () => void;
6
+ /** A route in this app. */
7
+ to?: string;
8
+ /** A page or file elsewhere. */
9
+ href?: string;
10
+ /** Filled: the one thing this page is for. At most one per bar. */
11
+ primary?: boolean;
12
+ /** A destructive action, drawn in the error colour. */
13
+ danger?: boolean;
14
+ disabled?: boolean;
15
+ }
16
+ export interface ResponsiveActionsProps {
17
+ actions: ResponsiveAction[];
18
+ /**
19
+ * How many of the leading actions stay buttons on a phone; the rest move into
20
+ * a ⋮ menu. Defaults to 0 — a phone's width belongs to the content.
21
+ */
22
+ keepOnPhone?: number;
23
+ /**
24
+ * How many stay buttons on desktop; the rest go behind ⋮ there too. Defaults
25
+ * to all — set it where a page has chores (exports, archive) that would
26
+ * otherwise crowd out what the page is for.
27
+ */
28
+ keepOnDesktop?: number;
29
+ /** Names the ⋮ button, e.g. "More actions for VLM". */
30
+ menuLabel?: string;
31
+ }
32
+ /**
33
+ * A page's actions: a row of buttons on desktop, and on a phone the leading
34
+ * few as buttons with the rest behind a ⋮ menu, the way a native app keeps its
35
+ * toolbar to what fits.
36
+ */
37
+ export declare function ResponsiveActions({ actions, keepOnPhone, keepOnDesktop, menuLabel }: ResponsiveActionsProps): import("react").JSX.Element | null;
38
+ //# sourceMappingURL=ResponsiveActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResponsiveActions.d.ts","sourceRoot":"","sources":["../../../src/components/Page/ResponsiveActions.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAMjD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,2BAA2B;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uDAAuD;IACvD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,OAAO,EAAE,WAAe,EAAE,aAAa,EAAE,SAA0B,EAAE,EAAE,sBAAsB,sCA2DhI"}
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { Link as RouterLink } from 'react-router-dom';
4
+ import { Box, Button, IconButton, ListItemIcon, Menu, MenuItem } from '@mui/material';
5
+ import { MoreVert } from '@mui/icons-material';
6
+ import { useCompactLayout } from './layout';
7
+ const linkProps = (action) => action.to !== undefined
8
+ ? { component: RouterLink, to: action.to }
9
+ : action.href !== undefined
10
+ ? { component: 'a', href: action.href }
11
+ : {};
12
+ /**
13
+ * A page's actions: a row of buttons on desktop, and on a phone the leading
14
+ * few as buttons with the rest behind a ⋮ menu, the way a native app keeps its
15
+ * toolbar to what fits.
16
+ */
17
+ export function ResponsiveActions({ actions, keepOnPhone = 0, keepOnDesktop, menuLabel = 'More actions' }) {
18
+ const compact = useCompactLayout();
19
+ const [anchor, setAnchor] = useState(null);
20
+ const kept = compact ? keepOnPhone : (keepOnDesktop ?? actions.length);
21
+ const shown = actions.slice(0, kept);
22
+ const overflow = actions.slice(kept);
23
+ if (actions.length === 0)
24
+ return null;
25
+ return (_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', flexWrap: 'wrap', gap: 1 }, children: [shown.map((action) => (_jsx(Button, { ...linkProps(action), onClick: action.onClick, disabled: action.disabled, startIcon: action.icon, variant: action.primary ? 'contained' : 'outlined', color: action.danger ? 'error' : action.primary ? 'primary' : 'inherit', sx: action.primary || action.danger ? undefined : { borderColor: 'divider', color: 'text.primary' }, children: action.label }, action.label))), overflow.length > 0 && (_jsxs(_Fragment, { children: [_jsx(IconButton, { "aria-label": menuLabel, "aria-haspopup": "menu", onClick: (event) => setAnchor(event.currentTarget), children: _jsx(MoreVert, {}) }), _jsx(Menu, { anchorEl: anchor, open: Boolean(anchor), onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'right' }, transformOrigin: { vertical: 'top', horizontal: 'right' }, slotProps: { paper: { sx: { minWidth: 200 } } }, children: overflow.map((action) => (_jsxs(MenuItem, { ...linkProps(action), disabled: action.disabled, onClick: () => {
26
+ setAnchor(null);
27
+ action.onClick?.();
28
+ }, sx: action.danger ? { color: 'error.main' } : undefined, children: [action.icon && _jsx(ListItemIcon, { sx: action.danger ? { color: 'inherit' } : undefined, children: action.icon }), action.label] }, action.label))) })] }))] }));
29
+ }
30
+ //# sourceMappingURL=ResponsiveActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResponsiveActions.js","sourceRoot":"","sources":["../../../src/components/Page/ResponsiveActions.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface SectionHeadingProps {
3
+ id?: string;
4
+ children: ReactNode;
5
+ /** Beside the caption, e.g. a "See all" link. */
6
+ action?: ReactNode;
7
+ }
8
+ /** The small caption over a group of rows, the way a phone's settings screens caption theirs. */
9
+ export declare function SectionHeading({ id, children, action }: SectionHeadingProps): import("react").JSX.Element;
10
+ //# sourceMappingURL=SectionHeading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionHeading.d.ts","sourceRoot":"","sources":["../../../src/components/Page/SectionHeading.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,WAAW,mBAAmB;IAClC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,SAAS,CAAC;IACpB,iDAAiD;IACjD,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,iGAAiG;AACjG,wBAAgB,cAAc,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,mBAAmB,+BAa3E"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Typography } from '@mui/material';
3
+ /** The small caption over a group of rows, the way a phone's settings screens caption theirs. */
4
+ export function SectionHeading({ id, children, action }) {
5
+ return (_jsxs(Box, { sx: { display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 2, px: 0.5, mb: 1 }, children: [_jsx(Typography, { id: id, component: "h2", sx: { fontSize: 13, fontWeight: 700, letterSpacing: '0.06em', textTransform: 'uppercase', color: 'text.secondary' }, children: children }), action] }));
6
+ }
7
+ //# sourceMappingURL=SectionHeading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionHeading.js","sourceRoot":"","sources":["../../../src/components/Page/SectionHeading.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAShD,iGAAiG;AACjG,MAAM,UAAU,cAAc,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAuB;IAC1E,OAAO,CACL,MAAC,GAAG,IAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,aAC3G,KAAC,UAAU,IACT,EAAE,EAAE,EAAE,EACN,SAAS,EAAC,IAAI,EACd,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAElH,QAAQ,GACE,EACZ,MAAM,IACH,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ export { PageHeader } from './PageHeader';
2
+ export type { PageHeaderProps, PageAction } from './PageHeader';
3
+ export { Panel } from './Panel';
4
+ export type { PanelProps } from './Panel';
5
+ export { ListRow, RowIcon } from './ListRow';
6
+ export type { ListRowProps } from './ListRow';
7
+ export { SectionHeading } from './SectionHeading';
8
+ export type { SectionHeadingProps } from './SectionHeading';
9
+ export { EmptyState } from './EmptyState';
10
+ export type { EmptyStateProps } from './EmptyState';
11
+ export { ResponsiveActions } from './ResponsiveActions';
12
+ export type { ResponsiveAction, ResponsiveActionsProps } from './ResponsiveActions';
13
+ export { TAB_BAR_HEIGHT, useCompactLayout } from './layout';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Page/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { PageHeader } from './PageHeader';
2
+ export { Panel } from './Panel';
3
+ export { ListRow, RowIcon } from './ListRow';
4
+ export { SectionHeading } from './SectionHeading';
5
+ export { EmptyState } from './EmptyState';
6
+ export { ResponsiveActions } from './ResponsiveActions';
7
+ export { TAB_BAR_HEIGHT, useCompactLayout } from './layout';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/Page/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** Height the phone tab bar covers at the foot of the screen, above the safe-area inset. */
2
+ export declare const TAB_BAR_HEIGHT = 72;
3
+ /**
4
+ * Whether the compact (phone) layout is showing: tab bar, app-bar titles,
5
+ * floating actions. The cut is at `md`, where the rail and a readable content
6
+ * column stop fitting side by side. Read synchronously, so a phone never draws
7
+ * a frame of the desktop layout first.
8
+ */
9
+ export declare function useCompactLayout(): boolean;
10
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/components/Page/layout.ts"],"names":[],"mappings":"AAEA,4FAA4F;AAC5F,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAG1C"}
@@ -0,0 +1,14 @@
1
+ import { useMediaQuery, useTheme } from '@mui/material';
2
+ /** Height the phone tab bar covers at the foot of the screen, above the safe-area inset. */
3
+ export const TAB_BAR_HEIGHT = 72;
4
+ /**
5
+ * Whether the compact (phone) layout is showing: tab bar, app-bar titles,
6
+ * floating actions. The cut is at `md`, where the rail and a readable content
7
+ * column stop fitting side by side. Read synchronously, so a phone never draws
8
+ * a frame of the desktop layout first.
9
+ */
10
+ export function useCompactLayout() {
11
+ const theme = useTheme();
12
+ return useMediaQuery(theme.breakpoints.down('md'), { noSsr: true });
13
+ }
14
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/components/Page/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAExD,4FAA4F;AAC5F,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AAEjC;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,OAAO,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACtE,CAAC"}
package/dist/index.d.ts CHANGED
@@ -6,6 +6,9 @@ export { ErrorPage } from './components/ErrorPage';
6
6
  export type { ErrorPageProps } from './components/ErrorPage';
7
7
  export { AppLayout } from './components/AppLayout';
8
8
  export type { AppLayoutProps, AppLayoutNavGroup, AppLayoutNavItem, AppLayoutInternalNavItem, AppLayoutExternalNavItem, AppLayoutUser } from './components/AppLayout';
9
+ export { PageHeader, Panel, ListRow, RowIcon, SectionHeading, EmptyState, ResponsiveActions, TAB_BAR_HEIGHT, useCompactLayout } from './components/Page';
10
+ export type { PageHeaderProps, PageAction, PanelProps, ListRowProps, SectionHeadingProps, EmptyStateProps, ResponsiveAction, ResponsiveActionsProps } from './components/Page';
11
+ export { createVisinTheme, VISIN_COLORS } from './theme';
9
12
  export { createVisinNavigation } from './navigation';
10
13
  export type { VisinApp, VisinAppUrls, VisinNavigation } from './navigation';
11
14
  export { createProtectedRoute } from './components/ProtectedRoute';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,wBAAwB,EACxB,aAAa,EACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAE1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,YAAY,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,wBAAwB,EACxB,aAAa,EACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,UAAU,EACV,KAAK,EACL,OAAO,EACP,OAAO,EACP,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,eAAe,EACf,UAAU,EACV,UAAU,EACV,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAE1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,YAAY,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC"}
package/dist/index.js CHANGED
@@ -3,6 +3,8 @@ export { createApiClient, ApiError } from './apiClient';
3
3
  export { Loader } from './components/Loader';
4
4
  export { ErrorPage } from './components/ErrorPage';
5
5
  export { AppLayout } from './components/AppLayout';
6
+ export { PageHeader, Panel, ListRow, RowIcon, SectionHeading, EmptyState, ResponsiveActions, TAB_BAR_HEIGHT, useCompactLayout } from './components/Page';
7
+ export { createVisinTheme, VISIN_COLORS } from './theme';
6
8
  export { createVisinNavigation } from './navigation';
7
9
  export { createProtectedRoute } from './components/ProtectedRoute';
8
10
  export { createLoginRedirect } from './components/LoginRedirect';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mFAAmF;AAEnF,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGxD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AASnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mFAAmF;AAEnF,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGxD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AASnD,OAAO,EACL,UAAU,EACV,KAAK,EACL,OAAO,EACP,OAAO,EACP,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAW3B,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { type Theme, type ThemeOptions } from '@mui/material/styles';
2
+ /**
3
+ * The colours of Visin's own chrome — the landing page's: dark ink behind the
4
+ * navigation, one blue for what can be acted on. Exported for the places that
5
+ * have to name a colour outside a theme: the browser's `theme-color`, the
6
+ * manifest, the offline page.
7
+ */
8
+ export declare const VISIN_COLORS: {
9
+ /** Primary: buttons, links, the selected state. */
10
+ readonly brand: "#2563EB";
11
+ /** The app bar across the top of every page (and the phone's status bar); the landing page's ink. */
12
+ readonly appBar: "#111827";
13
+ /** The desktop navigation rail beside the content. */
14
+ readonly rail: "#111827";
15
+ readonly background: "#F6F7FB";
16
+ };
17
+ /**
18
+ * The one theme every Visin front renders with — shell, vision, label, account
19
+ * and sign-in — so crossing apps inside the shell never changes the typeface,
20
+ * the blue, or the shape of a button.
21
+ *
22
+ * `shape.borderRadius` stays MUI's 4px unit on purpose: pages across the apps
23
+ * set radii as theme multiples (`borderRadius: 2`), and a larger unit turned
24
+ * those into pills. Components get their rounder corners here instead.
25
+ */
26
+ export declare function createVisinTheme(overrides?: ThemeOptions): Theme;
27
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAElF;;;;;GAKG;AACH,eAAO,MAAM,YAAY;IACvB,mDAAmD;;IAEnD,qGAAqG;;IAErG,sDAAsD;;;CAG9C,CAAC;AAOX;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,YAAiB,GAAG,KAAK,CA8FpE"}
package/dist/theme.js ADDED
@@ -0,0 +1,121 @@
1
+ import { createTheme } from '@mui/material/styles';
2
+ /**
3
+ * The colours of Visin's own chrome — the landing page's: dark ink behind the
4
+ * navigation, one blue for what can be acted on. Exported for the places that
5
+ * have to name a colour outside a theme: the browser's `theme-color`, the
6
+ * manifest, the offline page.
7
+ */
8
+ export const VISIN_COLORS = {
9
+ /** Primary: buttons, links, the selected state. */
10
+ brand: '#2563EB',
11
+ /** The app bar across the top of every page (and the phone's status bar); the landing page's ink. */
12
+ appBar: '#111827',
13
+ /** The desktop navigation rail beside the content. */
14
+ rail: '#111827',
15
+ background: '#F6F7FB'
16
+ };
17
+ /** Below `md` — the compact (phone) layout, as `useCompactLayout` reads it. */
18
+ const PHONE = '@media (max-width:899.95px)';
19
+ const FONT_STACK = '"Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif';
20
+ /**
21
+ * The one theme every Visin front renders with — shell, vision, label, account
22
+ * and sign-in — so crossing apps inside the shell never changes the typeface,
23
+ * the blue, or the shape of a button.
24
+ *
25
+ * `shape.borderRadius` stays MUI's 4px unit on purpose: pages across the apps
26
+ * set radii as theme multiples (`borderRadius: 2`), and a larger unit turned
27
+ * those into pills. Components get their rounder corners here instead.
28
+ */
29
+ export function createVisinTheme(overrides = {}) {
30
+ return createTheme({
31
+ palette: {
32
+ primary: { main: VISIN_COLORS.brand, light: '#60A5FA', dark: '#1D4ED8', contrastText: '#FFFFFF' },
33
+ secondary: { main: '#64748B' },
34
+ success: { main: '#16A34A' },
35
+ warning: { main: '#D97706' },
36
+ error: { main: '#DC2626' },
37
+ info: { main: '#0284C7' },
38
+ background: { default: VISIN_COLORS.background, paper: '#FFFFFF' },
39
+ text: { primary: '#0F172A', secondary: '#475569' },
40
+ divider: '#E2E8F0'
41
+ },
42
+ typography: {
43
+ fontFamily: FONT_STACK,
44
+ h1: { fontWeight: 700, letterSpacing: '-0.02em' },
45
+ h2: { fontWeight: 700, letterSpacing: '-0.02em' },
46
+ h3: { fontWeight: 700, letterSpacing: '-0.02em' },
47
+ // Page titles: MUI's 2.125rem h4 filled a phone's width with two words.
48
+ h4: { fontWeight: 700, letterSpacing: '-0.02em', fontSize: '1.75rem', [PHONE]: { fontSize: '1.375rem' } },
49
+ h5: { fontWeight: 600, [PHONE]: { fontSize: '1.2rem' } },
50
+ h6: { fontWeight: 600 },
51
+ subtitle1: { fontWeight: 600 },
52
+ subtitle2: { fontWeight: 600 },
53
+ button: { textTransform: 'none', fontWeight: 600 }
54
+ },
55
+ shape: { borderRadius: 4 },
56
+ components: {
57
+ MuiCssBaseline: {
58
+ styleOverrides: {
59
+ body: { WebkitFontSmoothing: 'antialiased', MozOsxFontSmoothing: 'grayscale' }
60
+ }
61
+ },
62
+ // AppLayout's content column already has the page gutters; a Container's
63
+ // own added a second pair, which a phone paid for in width.
64
+ MuiContainer: {
65
+ defaultProps: { disableGutters: true }
66
+ },
67
+ MuiButton: {
68
+ defaultProps: { disableElevation: true },
69
+ styleOverrides: { root: { borderRadius: 10 } }
70
+ },
71
+ MuiFab: {
72
+ styleOverrides: { root: { textTransform: 'none', fontWeight: 600 } }
73
+ },
74
+ MuiPaper: {
75
+ styleOverrides: {
76
+ rounded: { borderRadius: 12 },
77
+ outlined: { borderColor: '#E2E8F0' }
78
+ }
79
+ },
80
+ MuiCard: {
81
+ defaultProps: { variant: 'outlined' },
82
+ styleOverrides: { root: { borderRadius: 16 } }
83
+ },
84
+ MuiDialog: {
85
+ styleOverrides: { paper: { borderRadius: 16 } }
86
+ },
87
+ MuiMenu: {
88
+ styleOverrides: { paper: { borderRadius: 12 } }
89
+ },
90
+ MuiOutlinedInput: {
91
+ styleOverrides: { root: { borderRadius: 10, backgroundColor: '#FFFFFF' } }
92
+ },
93
+ MuiAlert: {
94
+ styleOverrides: { root: { borderRadius: 10 } }
95
+ },
96
+ MuiChip: {
97
+ styleOverrides: { root: { fontWeight: 500 } }
98
+ },
99
+ MuiTab: {
100
+ styleOverrides: { root: { textTransform: 'none', fontWeight: 600 } }
101
+ },
102
+ MuiTableCell: {
103
+ styleOverrides: {
104
+ root: { borderColor: '#E2E8F0' },
105
+ head: {
106
+ backgroundColor: '#F8FAFC',
107
+ color: '#475569',
108
+ fontSize: '0.75rem',
109
+ fontWeight: 600,
110
+ letterSpacing: '0.04em',
111
+ textTransform: 'uppercase'
112
+ }
113
+ }
114
+ },
115
+ MuiLinearProgress: {
116
+ styleOverrides: { root: { borderRadius: 999 }, bar: { borderRadius: 999 } }
117
+ }
118
+ }
119
+ }, overrides);
120
+ }
121
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visin/frontend-core",
3
- "version": "1.7.0",
3
+ "version": "1.9.0",
4
4
  "description": "Shared frontend auth/API-client logic for Visin frontends",
5
5
  "author": "Toomas Tahves",
6
6
  "license": "MIT",