@hanzo/ui 8.29.8 → 8.29.10

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 (47) hide show
  1. package/dist/auth/signout.cjs +10 -6
  2. package/dist/auth/signout.d.ts +8 -1
  3. package/dist/auth/signout.d.ts.map +1 -1
  4. package/dist/auth/signout.js +10 -6
  5. package/dist/auth/signout.js.map +1 -1
  6. package/dist/backends/gui/tabs.cjs +6 -1
  7. package/dist/backends/gui/tabs.d.ts.map +1 -1
  8. package/dist/backends/gui/tabs.js +6 -1
  9. package/dist/backends/gui/tabs.js.map +1 -1
  10. package/dist/corner/Corner.cjs +279 -0
  11. package/dist/corner/Corner.d.ts +21 -0
  12. package/dist/corner/Corner.d.ts.map +1 -0
  13. package/dist/corner/Corner.js +277 -0
  14. package/dist/corner/Corner.js.map +1 -0
  15. package/dist/corner/index.cjs +11 -0
  16. package/dist/corner/index.d.ts +3 -0
  17. package/dist/corner/index.d.ts.map +1 -0
  18. package/dist/corner/index.js +3 -0
  19. package/dist/corner/index.js.map +1 -0
  20. package/dist/corner/logic.cjs +47 -0
  21. package/dist/corner/logic.d.ts +59 -0
  22. package/dist/corner/logic.d.ts.map +1 -0
  23. package/dist/corner/logic.js +42 -0
  24. package/dist/corner/logic.js.map +1 -0
  25. package/dist/gallery.cjs +3 -1
  26. package/dist/gallery.d.ts.map +1 -1
  27. package/dist/gallery.html +11 -5
  28. package/dist/gallery.js +3 -1
  29. package/dist/gallery.js.map +1 -1
  30. package/dist/look.cjs +19 -0
  31. package/dist/look.d.ts +9 -0
  32. package/dist/look.d.ts.map +1 -0
  33. package/dist/look.js +17 -0
  34. package/dist/look.js.map +1 -0
  35. package/dist/product/Filters.cjs +5 -1
  36. package/dist/product/Filters.d.ts.map +1 -1
  37. package/dist/product/Filters.js +5 -1
  38. package/dist/product/Filters.js.map +1 -1
  39. package/dist/root.cjs +8 -2
  40. package/dist/root.d.ts +1 -1
  41. package/dist/root.d.ts.map +1 -1
  42. package/dist/root.js +8 -2
  43. package/dist/root.js.map +1 -1
  44. package/dist/root.node.cjs +8 -2
  45. package/dist/root.node.js +8 -2
  46. package/dist/styles.css +6 -0
  47. package/package.json +8 -1
@@ -27,14 +27,18 @@ async function revoke(origin, token, hint, access, clientId) {
27
27
  * call @hanzo/iam's `end()` makes; `redirect: manual` keeps a registered
28
28
  * post-logout address from being fetched.
29
29
  */
30
- async function end(origin, idToken, clientId) {
30
+ async function end(origin, idToken, clientId, everywhere) {
31
31
  try {
32
32
  await fetch(`${origin}/v1/iam/oauth/logout`, {
33
33
  method: 'POST',
34
34
  credentials: 'include',
35
35
  redirect: 'manual',
36
36
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
37
- body: new URLSearchParams({ ...(clientId ? { client_id: clientId } : {}), ...(idToken ? { id_token_hint: idToken } : {}) }).toString(),
37
+ body: new URLSearchParams({
38
+ ...(clientId ? { client_id: clientId } : {}),
39
+ ...(idToken ? { id_token_hint: idToken } : {}),
40
+ ...(everywhere ? { everywhere: 'true' } : {}),
41
+ }).toString(),
38
42
  });
39
43
  }
40
44
  catch {
@@ -47,7 +51,7 @@ async function end(origin, idToken, clientId) {
47
51
  * end IAM's session cookie, clear the local session, and land on the site's own
48
52
  * `/login?from=logout`. IAM's own logout page is never visited.
49
53
  */
50
- async function signOut(iam, { via, to = '/login?from=logout', clientId, track } = {}) {
54
+ async function signOut(iam, { via, to = '/login?from=logout', clientId, track, everywhere } = {}) {
51
55
  const origin = via ?? window.location.origin;
52
56
  const access = (0, session_1.bearer)();
53
57
  const refresh = (0, session_1.refresher)();
@@ -56,7 +60,7 @@ async function signOut(iam, { via, to = '/login?from=logout', clientId, track }
56
60
  try {
57
61
  await revoke(origin, refresh, 'refresh_token', access, clientId);
58
62
  await revoke(origin, access, 'access_token', access, clientId);
59
- await end(origin, idToken, clientId);
63
+ await end(origin, idToken, clientId, everywhere);
60
64
  }
61
65
  finally {
62
66
  track?.('logout_completed', {});
@@ -66,6 +70,6 @@ async function signOut(iam, { via, to = '/login?from=logout', clientId, track }
66
70
  /** `signOut` bound to the page's IAM client. */
67
71
  function useSignOut(options = {}) {
68
72
  const { sdk, config } = (0, react_2.useIam)();
69
- const { via, to, track, clientId = config.clientId } = options;
70
- return (0, react_1.useCallback)(() => signOut(sdk, { via, to, track, clientId }), [sdk, via, to, track, clientId]);
73
+ const { via, to, track, clientId = config.clientId, everywhere } = options;
74
+ return (0, react_1.useCallback)(() => signOut(sdk, { via, to, track, clientId, everywhere }), [sdk, via, to, track, clientId, everywhere]);
71
75
  }
@@ -8,6 +8,13 @@ export interface SignOutOptions {
8
8
  clientId?: string;
9
9
  /** `logout_completed` reaches the stream here. */
10
10
  track?: (name: string, props?: Record<string, unknown>) => void;
11
+ /**
12
+ * Leave every application of the client's organization, not only this one:
13
+ * IAM retires the person's grant to each of them with the session
14
+ * (`everywhere=true`), so a sign-out on hanzo.ai is one on platform.hanzo.ai
15
+ * too. An application of another organization keeps its grant.
16
+ */
17
+ everywhere?: boolean;
11
18
  }
12
19
  /**
13
20
  * Sign out: hand both tokens back to IAM through its /v1/iam revocation route
@@ -15,7 +22,7 @@ export interface SignOutOptions {
15
22
  * end IAM's session cookie, clear the local session, and land on the site's own
16
23
  * `/login?from=logout`. IAM's own logout page is never visited.
17
24
  */
18
- export declare function signOut(iam: IAM, { via, to, clientId, track }?: SignOutOptions): Promise<void>;
25
+ export declare function signOut(iam: IAM, { via, to, clientId, track, everywhere }?: SignOutOptions): Promise<void>;
19
26
  /** `signOut` bound to the page's IAM client. */
20
27
  export declare function useSignOut(options?: SignOutOptions): () => Promise<void>;
21
28
  //# sourceMappingURL=signout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signout.d.ts","sourceRoot":"","sources":["../../src/auth/signout.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;AAIrC,MAAM,WAAW,cAAc;IAC7B,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,yFAAyF;IACzF,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kDAAkD;IAClD,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CAChE;AAoCD;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAyB,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAc/H;AAED,gDAAgD;AAChD,wBAAgB,UAAU,CAAC,OAAO,GAAE,cAAmB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAI5E"}
1
+ {"version":3,"file":"signout.d.ts","sourceRoot":"","sources":["../../src/auth/signout.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;AAIrC,MAAM,WAAW,cAAc;IAC7B,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,yFAAyF;IACzF,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kDAAkD;IAClD,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAC/D;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAwCD;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAyB,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAc3I;AAED,gDAAgD;AAChD,wBAAgB,UAAU,CAAC,OAAO,GAAE,cAAmB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAI5E"}
@@ -23,14 +23,18 @@ async function revoke(origin, token, hint, access, clientId) {
23
23
  * call @hanzo/iam's `end()` makes; `redirect: manual` keeps a registered
24
24
  * post-logout address from being fetched.
25
25
  */
26
- async function end(origin, idToken, clientId) {
26
+ async function end(origin, idToken, clientId, everywhere) {
27
27
  try {
28
28
  await fetch(`${origin}/v1/iam/oauth/logout`, {
29
29
  method: 'POST',
30
30
  credentials: 'include',
31
31
  redirect: 'manual',
32
32
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
33
- body: new URLSearchParams({ ...(clientId ? { client_id: clientId } : {}), ...(idToken ? { id_token_hint: idToken } : {}) }).toString(),
33
+ body: new URLSearchParams({
34
+ ...(clientId ? { client_id: clientId } : {}),
35
+ ...(idToken ? { id_token_hint: idToken } : {}),
36
+ ...(everywhere ? { everywhere: 'true' } : {}),
37
+ }).toString(),
34
38
  });
35
39
  }
36
40
  catch {
@@ -43,7 +47,7 @@ async function end(origin, idToken, clientId) {
43
47
  * end IAM's session cookie, clear the local session, and land on the site's own
44
48
  * `/login?from=logout`. IAM's own logout page is never visited.
45
49
  */
46
- export async function signOut(iam, { via, to = '/login?from=logout', clientId, track } = {}) {
50
+ export async function signOut(iam, { via, to = '/login?from=logout', clientId, track, everywhere } = {}) {
47
51
  const origin = via ?? window.location.origin;
48
52
  const access = bearer();
49
53
  const refresh = refresher();
@@ -52,7 +56,7 @@ export async function signOut(iam, { via, to = '/login?from=logout', clientId, t
52
56
  try {
53
57
  await revoke(origin, refresh, 'refresh_token', access, clientId);
54
58
  await revoke(origin, access, 'access_token', access, clientId);
55
- await end(origin, idToken, clientId);
59
+ await end(origin, idToken, clientId, everywhere);
56
60
  }
57
61
  finally {
58
62
  track?.('logout_completed', {});
@@ -62,7 +66,7 @@ export async function signOut(iam, { via, to = '/login?from=logout', clientId, t
62
66
  /** `signOut` bound to the page's IAM client. */
63
67
  export function useSignOut(options = {}) {
64
68
  const { sdk, config } = useIam();
65
- const { via, to, track, clientId = config.clientId } = options;
66
- return useCallback(() => signOut(sdk, { via, to, track, clientId }), [sdk, via, to, track, clientId]);
69
+ const { via, to, track, clientId = config.clientId, everywhere } = options;
70
+ return useCallback(() => signOut(sdk, { via, to, track, clientId, everywhere }), [sdk, via, to, track, clientId, everywhere]);
67
71
  }
68
72
  //# sourceMappingURL=signout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signout.js","sourceRoot":"","sources":["../../src/auth/signout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signout.js","sourceRoot":"","sources":["../../src/auth/signout.ts"],"names":[],"mappings":"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"}
@@ -74,5 +74,10 @@ const TabsTrigger = (props) => {
74
74
  }, ...p, children: [startIcon, (0, ink_1.ink)(children, undefined, { size: '$2', fontWeight: '500' }), badge, endIcon] }));
75
75
  };
76
76
  exports.TabsTrigger = TabsTrigger;
77
- const TabsContent = ({ children, ...p }) => ((0, jsx_runtime_1.jsx)(gui_1.Tabs.Content, { ...(0, slot_1.slot)('tabs-content'), flex: 1, ...p, children: (0, ink_1.ink)(children) }));
77
+ // A panel fills a Tabs given a height, and is as tall as what it holds in one that
78
+ // has none. `flex={1}` set its basis to 0, so in an auto-height column the panel
79
+ // folded to 0px and its content drew over whatever came after the Tabs: every
80
+ // code sample on hanzo.ai/sdks overlapped the next section. Growing from its
81
+ // content's own height does both jobs.
82
+ const TabsContent = ({ children, ...p }) => ((0, jsx_runtime_1.jsx)(gui_1.Tabs.Content, { ...(0, slot_1.slot)('tabs-content'), flexGrow: 1, ...p, children: (0, ink_1.ink)(children) }));
78
83
  exports.TabsContent = TabsContent;
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../src/backends/gui/tabs.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,IAAI,IAAI,OAAO,EAAkB,MAAM,YAAY,CAAA;AAC5D,OAAO,EAAuC,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAWhG,MAAM,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,OAAO,CAAC,GAAG;IACvD,gFAAgF;IAChF,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;CAC7B,CAAA;AACD,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAA;AAC/D,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG;IAChF,mDAAmD;IACnD,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,yCAAyC;IACzC,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,yDAAyD;IACzD,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IAClB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,CAAA;AACD,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,OAAO,CAAC,OAAO,CAAC,CAAA;AAErE,QAAA,MAAM,IAAI,uEAAoF,SAAS,gCAoBtG,CAAA;AAED,QAAA,MAAM,QAAQ,MAAO,aAAa,gCAgCjC,CAAA;AAwDD,QAAA,MAAM,WAAW,UAAW,gBAAgB,gCAuC3C,CAAA;AAED,QAAA,MAAM,WAAW,uBAAwB,gBAAgB,gCAIxD,CAAA;AAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,CAAA"}
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../src/backends/gui/tabs.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,IAAI,IAAI,OAAO,EAAkB,MAAM,YAAY,CAAA;AAC5D,OAAO,EAAuC,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAWhG,MAAM,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,OAAO,CAAC,GAAG;IACvD,gFAAgF;IAChF,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;CAC7B,CAAA;AACD,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAA;AAC/D,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG;IAChF,mDAAmD;IACnD,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,yCAAyC;IACzC,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,yDAAyD;IACzD,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IAClB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,CAAA;AACD,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,OAAO,CAAC,OAAO,CAAC,CAAA;AAErE,QAAA,MAAM,IAAI,uEAAoF,SAAS,gCAoBtG,CAAA;AAED,QAAA,MAAM,QAAQ,MAAO,aAAa,gCAgCjC,CAAA;AAwDD,QAAA,MAAM,WAAW,UAAW,gBAAgB,gCAuC3C,CAAA;AAOD,QAAA,MAAM,WAAW,uBAAwB,gBAAgB,gCAIxD,CAAA;AAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,CAAA"}
@@ -68,6 +68,11 @@ const TabsTrigger = (props) => {
68
68
  shadowOffset: { width: 0, height: 1 },
69
69
  }, ...p, children: [startIcon, ink(children, undefined, { size: '$2', fontWeight: '500' }), badge, endIcon] }));
70
70
  };
71
- const TabsContent = ({ children, ...p }) => (_jsx(GuiTabs.Content, { ...slot('tabs-content'), flex: 1, ...p, children: ink(children) }));
71
+ // A panel fills a Tabs given a height, and is as tall as what it holds in one that
72
+ // has none. `flex={1}` set its basis to 0, so in an auto-height column the panel
73
+ // folded to 0px and its content drew over whatever came after the Tabs: every
74
+ // code sample on hanzo.ai/sdks overlapped the next section. Growing from its
75
+ // content's own height does both jobs.
76
+ const TabsContent = ({ children, ...p }) => (_jsx(GuiTabs.Content, { ...slot('tabs-content'), flexGrow: 1, ...p, children: ink(children) }));
72
77
  export { Tabs, TabsList, TabsTrigger, TabsContent };
73
78
  //# sourceMappingURL=tabs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../../src/backends/gui/tabs.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../../src/backends/gui/tabs.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,279 @@
1
+ 'use client';"use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Corner = Corner;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ /**
7
+ * Corner — help and preferences, behind the one control that is on every page.
8
+ *
9
+ * <Corner
10
+ * help={[{ label: 'Get help', href: '/support' }, { label: 'Docs', href: 'https://docs.hanzo.ai' }]}
11
+ * language={{ value: locale, options: LANGUAGES, onChange: setLocale }}
12
+ * currency={{ value: fiat, options: CURRENCIES, onChange: setFiat }}
13
+ * />
14
+ *
15
+ * A small `?` sits at the bottom START corner of the window (bottom-left in a
16
+ * left-to-right page, bottom-right in a right-to-left one), clear of the notch
17
+ * and the home indicator. Pressing it opens one card that opens toward the
18
+ * inside: the host's help links first, then Theme, Language and Currency. The
19
+ * three settings a visitor is most likely to want are where they look when they
20
+ * want the page to explain itself, on every surface, in the same place.
21
+ *
22
+ * Theme is the library's own: `@hanzo/appearance`, written through `<Hanzo>`'s
23
+ * resolved stack when there is one (`Look`), so it is stored, painted before
24
+ * first paint and carried across origins exactly as the settings panel does.
25
+ * Language and currency are the HOST's — this package depends on no i18n or
26
+ * money library, so it draws the value it is handed and reports a choice. A row
27
+ * the host passes nothing for is not drawn.
28
+ *
29
+ * Behaviour is the package `Popover`'s: portalled, dismissed by Escape and an
30
+ * outside press, focus trapped while open and handed back to the trigger on
31
+ * close. Escape in a list returns to the card rather than closing it. Arrow keys
32
+ * move through the card's rows and through a list; a long list (more than
33
+ * `LONG`) gets a search field that owns the cursor (`aria-activedescendant`).
34
+ * Nothing animates, so there is no motion to reduce.
35
+ *
36
+ * Web-only — it is fixed to the window — so it ships at `@hanzo/ui/corner`
37
+ * beside `consent`, not on the barrel that promises native.
38
+ */
39
+ const gui_1 = require("@hanzo/gui");
40
+ const lucide_icons_2_1 = require("@hanzogui/lucide-icons-2");
41
+ const appearance_1 = require("@hanzo/appearance");
42
+ const react_1 = require("react");
43
+ const popover_1 = require("../backends/gui/popover.cjs");
44
+ const gesture_1 = require("../backends/gui/gesture.cjs");
45
+ const press_1 = require("../backends/gui/press.cjs");
46
+ const slot_1 = require("../backends/gui/slot.cjs");
47
+ const nav_1 = require("../masthead/nav.cjs");
48
+ const chipSelect_logic_1 = require("../product/chipSelect.logic.cjs");
49
+ const Filters_1 = require("../product/Filters.cjs");
50
+ const instrument_1 = require("../product/instrument.cjs");
51
+ const look_1 = require("../look.cjs");
52
+ const logic_1 = require("./logic.cjs");
53
+ /**
54
+ * The trigger's distance from the window's foot and its start edge: 10px, or the
55
+ * device's inset and 4px where that is wider. A right-to-left page puts the
56
+ * trigger on the right, so the inline edge takes the wider of the two side insets.
57
+ */
58
+ const EDGE = {
59
+ bottom: 'max(10px, calc(var(--safe-bottom, env(safe-area-inset-bottom, 0px)) + 4px))',
60
+ start: 'max(10px, calc(max(var(--safe-left, env(safe-area-inset-left, 0px)), var(--safe-right, env(safe-area-inset-right, 0px))) + 4px))',
61
+ };
62
+ /**
63
+ * A row's height: 36 under a mouse, 44 under a finger. Rows sit edge to edge,
64
+ * so the height itself is the target — an overlay past it would land on the
65
+ * next row. (`[role=button]` gets the same floor from design's base sheet.)
66
+ */
67
+ const ROW = { minH: 36, $touchable: { minH: 44 } };
68
+ /** The keys a list answers. */
69
+ const MOVES = new Set(['ArrowDown', 'ArrowUp', 'Home', 'End', 'PageDown', 'PageUp']);
70
+ /** Everything in the card the arrow keys step through, in document order. */
71
+ const STOPS = '[data-corner-stop], [data-slot="segmented-item"][data-state="checked"]';
72
+ /**
73
+ * The theme, as the person chose it, and the one way to change it.
74
+ *
75
+ * Under `<Hanzo>` it writes through the root's `useAppearance` (its org,
76
+ * install and account layers). Under a host's own gui provider it writes the
77
+ * device's layer and repaints the resolved stack, which is what `useAppearance`
78
+ * would do there. Nobody chose yet: the row marks what the document shows.
79
+ */
80
+ function useTheme() {
81
+ const look = (0, react_1.useContext)(look_1.Look);
82
+ const ground = (0, appearance_1.useScheme)();
83
+ const [own, setOwn] = (0, react_1.useState)(undefined);
84
+ (0, react_1.useEffect)(() => {
85
+ if (!look)
86
+ setOwn((0, appearance_1.read)().theme);
87
+ }, [look]);
88
+ const set = (0, react_1.useCallback)((theme) => {
89
+ if (look)
90
+ return look.set({ theme });
91
+ (0, appearance_1.write)({ ...(0, appearance_1.read)(), theme });
92
+ (0, appearance_1.apply)((0, appearance_1.current)().pref);
93
+ setOwn(theme);
94
+ }, [look]);
95
+ return [(look ? look.pref.theme : own) ?? ground, set];
96
+ }
97
+ function Corner({ help = [], language, currency, words }) {
98
+ const w = { ...logic_1.WORDS, ...words };
99
+ const [open, setOpen] = (0, react_1.useState)(false);
100
+ const [view, setView] = (0, react_1.useState)('main');
101
+ // Which row opened a list, so going back puts focus where it was.
102
+ const [from, setFrom] = (0, react_1.useState)('main');
103
+ const [rtl, setRtl] = (0, react_1.useState)(false);
104
+ const [theme, setTheme] = useTheme();
105
+ const emit = (0, instrument_1.useEmit)();
106
+ const trigger = (0, react_1.useRef)(null);
107
+ const panel = (0, react_1.useRef)(null);
108
+ const settings = { language, currency };
109
+ // Focus follows the view: a list puts it on its search or its options, the
110
+ // card on the row the list was opened from.
111
+ (0, react_1.useEffect)(() => {
112
+ if (!open)
113
+ return;
114
+ const root = panel.current;
115
+ if (!root)
116
+ return;
117
+ const target = view === 'main'
118
+ ? from === 'main'
119
+ ? null
120
+ : root.querySelector(`[data-corner-row="${from}"]`)
121
+ : root.querySelector('[data-corner-field]');
122
+ target?.focus();
123
+ }, [open, view, from]);
124
+ const toggle = (next) => {
125
+ if (next) {
126
+ // A right-to-left page mirrors the chevrons; read once, where the trigger sits.
127
+ if (trigger.current && typeof getComputedStyle === 'function')
128
+ setRtl(getComputedStyle(trigger.current).direction === 'rtl');
129
+ setView('main');
130
+ setFrom('main');
131
+ emit({ component: 'Corner', action: 'open' });
132
+ }
133
+ setOpen(next);
134
+ };
135
+ const back = () => setView('main');
136
+ const choose = (kind, code) => {
137
+ const s = settings[kind];
138
+ if (!s)
139
+ return;
140
+ if (code !== s.value) {
141
+ emit({ component: 'Corner', action: 'change', id: kind, value: code });
142
+ s.onChange(code);
143
+ }
144
+ back();
145
+ };
146
+ // The card's own arrows: up and down walk its stops. A radio group keeps its
147
+ // arrows (they move the theme, as a radio group's should).
148
+ const onCard = (e) => {
149
+ const key = e.key;
150
+ if (key !== 'ArrowDown' && key !== 'ArrowUp' && key !== 'Home' && key !== 'End')
151
+ return;
152
+ const el = e.target;
153
+ if (el?.closest?.('[role="radiogroup"]') && (key === 'ArrowDown' || key === 'ArrowUp'))
154
+ return;
155
+ const stops = Array.from(panel.current?.querySelectorAll(STOPS) ?? []);
156
+ if (!stops.length)
157
+ return;
158
+ e.preventDefault?.();
159
+ const at = stops.findIndex((s) => s === el || s.contains(el));
160
+ const to = key === 'Home' ? 0 : key === 'End' ? stops.length - 1 : Math.max(0, Math.min(stops.length - 1, at + (key === 'ArrowDown' ? 1 : -1)));
161
+ stops[to]?.focus();
162
+ };
163
+ const Forward = rtl ? lucide_icons_2_1.ChevronLeft : lucide_icons_2_1.ChevronRight;
164
+ return ((0, jsx_runtime_1.jsx)(gui_1.XStack, { ...(0, slot_1.slot)('corner'), position: "fixed", bottom: EDGE.bottom, insetInlineStart: EDGE.start, z: 'var(--z-dock, 40)', children: (0, jsx_runtime_1.jsxs)(popover_1.Popover, { open: open, onOpenChange: toggle, placement: "top-start", allowFlip: true, stayInFrame: true, children: [(0, jsx_runtime_1.jsx)(popover_1.PopoverTrigger, { asChild: true, children: (0, jsx_runtime_1.jsx)(gui_1.XStack, { ref: trigger, ...(0, slot_1.slot)('corner-trigger'), ...(0, slot_1.tip)(w.open), role: "button", tabIndex: 0, "aria-label": w.open, "aria-haspopup": "dialog", "aria-expanded": open, ...(0, gesture_1.touch)(32), width: 32, height: 32, items: "center", justify: "center", rounded: "$10", cursor: "pointer", opacity: open ? 1 : 0.85, hoverStyle: { opacity: 1 }, focusVisibleStyle: press_1.RING, onKeyDown: (e) => {
165
+ if (e?.key !== 'Enter' && e?.key !== ' ')
166
+ return;
167
+ e.preventDefault?.();
168
+ toggle(!open);
169
+ }, children: (0, jsx_runtime_1.jsx)(lucide_icons_2_1.CircleHelp, { size: 22, color: "$background", fill: "var(--foreground)", "aria-hidden": true }) }) }), (0, jsx_runtime_1.jsxs)(popover_1.PopoverContent, { ref: panel, ...(0, slot_1.slot)('corner-card'), role: "dialog", "aria-label": w.open, solid: true, sideOffset: 6, width: 288, maxW: "calc(100vw - 20px)", maxH: 'calc(100dvh - 72px)', overflowY: "auto", p: "$3", gap: "$2", items: "stretch", elevation: "$4", trapFocus: true, onOpenAutoFocus: (e) => {
170
+ // The first thing in the card that does something, not its close button.
171
+ e.preventDefault();
172
+ panel.current?.querySelector(STOPS)?.focus();
173
+ }, onCloseAutoFocus: (e) => {
174
+ e.preventDefault();
175
+ trigger.current?.focus();
176
+ }, onEscapeKeyDown: (e) => {
177
+ // Escape in a list goes back to the card; on the card it closes.
178
+ if (view === 'main')
179
+ return;
180
+ e.preventDefault();
181
+ back();
182
+ }, children: [(0, jsx_runtime_1.jsx)(Reflow, { on: view }), view === 'main' ? ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { gap: "$2", onKeyDown: onCard, children: [help.length ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(Head, { title: w.help, close: w.close, onClose: () => toggle(false) }), (0, jsx_runtime_1.jsx)(gui_1.YStack, { ...(0, slot_1.slot)('corner-help'), role: "list", "aria-label": w.help, children: help.map((link) => ((0, jsx_runtime_1.jsx)(Item, { link: link, leaving: w.leaves, onPress: () => emit({ component: 'Corner', action: 'click', id: link.label }) }, link.href + link.label))) }), (0, jsx_runtime_1.jsx)(gui_1.YStack, { height: 1, bg: "$borderColor", my: "$1", "aria-hidden": true })] })) : null, (0, jsx_runtime_1.jsx)(Head, { title: w.preferences, close: help.length ? undefined : w.close, onClose: () => toggle(false) }), (0, jsx_runtime_1.jsxs)(gui_1.XStack, { ...(0, slot_1.slot)('corner-theme'), ...ROW, items: "center", justify: "space-between", gap: "$3", children: [(0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$aside", children: w.theme }), (0, jsx_runtime_1.jsx)(Filters_1.Segmented, { variant: "track", itemWidth: "content", name: "theme", "aria-label": w.theme, value: theme, onChange: setTheme, options: [
183
+ { value: 'system', label: w.auto },
184
+ { value: 'light', label: '', 'aria-label': w.light, icon: (0, jsx_runtime_1.jsx)(lucide_icons_2_1.Sun, { size: 14, color: "$ink", "aria-hidden": true }) },
185
+ { value: 'dark', label: '', 'aria-label': w.dark, icon: (0, jsx_runtime_1.jsx)(lucide_icons_2_1.Moon, { size: 14, color: "$ink", "aria-hidden": true }) },
186
+ ] })] }), ['language', 'currency'].map((kind) => {
187
+ const s = settings[kind];
188
+ if (!s)
189
+ return null;
190
+ const chosen = s.options.find((o) => o.code === s.value);
191
+ return ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { ...(0, slot_1.slot)('corner-row'), ...(0, press_1.press)(() => {
192
+ setFrom(kind);
193
+ setView(kind);
194
+ }), "data-corner-stop": "", "data-corner-row": kind, "aria-haspopup": "listbox", ...ROW, items: "center", gap: "$3", mx: -8, px: "$2", rounded: "$3", cursor: "pointer", hoverStyle: { bg: '$hover' }, focusVisibleStyle: press_1.RING, children: [(0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$aside", flex: 1, children: w[kind] }), (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$ink", fontWeight: "600", numberOfLines: 1, shrink: 1, ...(kind === 'language' ? { lang: s.value, dir: chosen?.dir } : null), children: (0, logic_1.shown)(s) }), (0, jsx_runtime_1.jsx)(Forward, { size: 16, color: "$hint", "aria-hidden": true })] }, kind));
195
+ })] })) : ((0, jsx_runtime_1.jsx)(List, { kind: view, setting: settings[view], title: w[view], words: w, rtl: rtl, onBack: back, onChoose: (code) => choose(view, code) }, view))] })] }) }));
196
+ }
197
+ /**
198
+ * Places the card again when it changes size. gui's popper re-measures when its
199
+ * TRIGGER moves, never when the card does, so a card that grows into a list
200
+ * keeps its old top and runs off the foot of the window. Inside the content,
201
+ * so it reads the popper the content belongs to.
202
+ */
203
+ function Reflow({ on }) {
204
+ const { update } = (0, gui_1.usePopperContextSlow)();
205
+ (0, react_1.useLayoutEffect)(() => {
206
+ update?.();
207
+ }, [on, update]);
208
+ return null;
209
+ }
210
+ /** A section's quiet title, and the card's close button when the section is first. */
211
+ function Head({ title, close, onClose }) {
212
+ return ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { items: "center", justify: "space-between", minH: 28, children: [(0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$2", color: "$hint", render: "h2", m: 0, children: title }), close ? (0, jsx_runtime_1.jsx)(Icon, { label: close, onPress: onClose, glyph: (0, jsx_runtime_1.jsx)(lucide_icons_2_1.X, { size: 18, color: "$aside", "aria-hidden": true }) }) : null] }));
213
+ }
214
+ /** An icon-only button: 28px drawn, 44 under a finger. */
215
+ function Icon({ label, glyph, onPress }) {
216
+ return ((0, jsx_runtime_1.jsx)(gui_1.XStack, { ...(0, press_1.press)(onPress), ...(0, slot_1.tip)(label), "aria-label": label, ...(0, gesture_1.touch)(28), width: 28, height: 28, marginInlineEnd: -6, items: "center", justify: "center", rounded: "$10", cursor: "pointer", hoverStyle: { bg: '$hover' }, focusVisibleStyle: press_1.RING, children: glyph }));
217
+ }
218
+ /** One help link. A link that leaves the site opens a new tab and says so, to the eye and to a screen reader. */
219
+ function Item({ link, leaving, onPress }) {
220
+ const out = typeof location !== 'undefined' && (0, nav_1.leaves)(link.href, location.origin);
221
+ return ((0, jsx_runtime_1.jsx)(gui_1.XStack, { role: "listitem", children: (0, jsx_runtime_1.jsxs)(gui_1.Anchor, { ...(0, slot_1.slot)('corner-link'), "data-corner-stop": "", href: link.href, target: out ? '_blank' : undefined, rel: out ? 'noopener noreferrer' : undefined, "aria-label": out ? `${link.label} (${leaving})` : undefined, onPress: onPress, display: "flex", flexDirection: "row", flex: 1, items: "center", gap: "$2.5", ...ROW, mx: -8, px: "$2", rounded: "$3", textDecorationLine: "none", color: "$ink", hoverStyle: { bg: '$hover' }, focusVisibleStyle: press_1.RING, children: [link.icon ? ((0, jsx_runtime_1.jsx)(gui_1.XStack, { width: 20, items: "center", justify: "center", "aria-hidden": true, children: link.icon })) : null, (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$ink", fontWeight: "500", children: link.label }), out ? (0, jsx_runtime_1.jsx)(lucide_icons_2_1.ExternalLink, { size: 12, color: "$hint", "aria-hidden": true }) : null] }) }));
222
+ }
223
+ /**
224
+ * A setting's options, in place of the card: back, the title, a search when the
225
+ * list is long, then the options with a check on the current one.
226
+ *
227
+ * ARIA: the options are a listbox. With a search, the field is the combobox and
228
+ * owns the cursor through `aria-activedescendant`, so focus never leaves it
229
+ * while the arrows move; without one the listbox itself takes focus and does the
230
+ * same. Enter or a press chooses.
231
+ */
232
+ function List({ kind, setting, title, words, rtl, onBack, onChoose, }) {
233
+ const [q, setQ] = (0, react_1.useState)('');
234
+ const rows = (0, logic_1.find)(setting.options, q);
235
+ const [at, setAt] = (0, react_1.useState)(() => Math.max(0, rows.findIndex((o) => o.code === setting.value)));
236
+ const id = (0, react_1.useId)();
237
+ const listId = `${id}-list`;
238
+ const optionId = (i) => `${id}-opt-${i}`;
239
+ const searchable = setting.options.length > logic_1.LONG;
240
+ const Back = rtl ? lucide_icons_2_1.ChevronRight : lucide_icons_2_1.ChevronLeft;
241
+ // A new search starts the cursor at the top.
242
+ (0, react_1.useEffect)(() => {
243
+ if (q)
244
+ setAt(0);
245
+ }, [q]);
246
+ // Keep the row under the cursor in view as it moves.
247
+ (0, react_1.useEffect)(() => {
248
+ if (typeof document === 'undefined')
249
+ return;
250
+ document.getElementById(optionId(at))?.scrollIntoView?.({ block: 'nearest' });
251
+ // eslint-disable-next-line react-hooks/exhaustive-deps
252
+ }, [at]);
253
+ const onKey = (e) => {
254
+ const key = e?.key;
255
+ if (MOVES.has(key)) {
256
+ if ((key === 'Home' || key === 'End') && q)
257
+ return;
258
+ e.preventDefault?.();
259
+ setAt((0, chipSelect_logic_1.move)(key, at, rows.length));
260
+ return;
261
+ }
262
+ if (key === 'Enter' || (key === ' ' && !searchable)) {
263
+ e.preventDefault?.();
264
+ const o = rows[at];
265
+ if (o)
266
+ onChoose(o.code);
267
+ }
268
+ };
269
+ const active = rows[at] ? optionId(at) : undefined;
270
+ return ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { gap: "$2", children: [(0, jsx_runtime_1.jsxs)(gui_1.XStack, { items: "center", gap: "$1", minH: 28, children: [(0, jsx_runtime_1.jsx)(gui_1.XStack, { marginInlineStart: -6, children: (0, jsx_runtime_1.jsx)(Icon, { label: words.back, onPress: onBack, glyph: (0, jsx_runtime_1.jsx)(Back, { size: 18, color: "$aside", "aria-hidden": true }) }) }), (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$ink", fontWeight: "600", render: "h2", m: 0, children: title })] }), searchable ? ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { ...(0, slot_1.slot)('corner-search'), height: 32, px: "$2", gap: "$1.5", items: "center", rounded: "$3", borderWidth: 1, borderColor: "$borderColor", bg: "$background", focusWithinStyle: { borderColor: '$outlineColor' }, children: [(0, jsx_runtime_1.jsx)(lucide_icons_2_1.Search, { size: 14, color: "$hint", "aria-hidden": true }), (0, jsx_runtime_1.jsx)(gui_1.Input, { ...(0, slot_1.slot)('corner-input'), "data-corner-field": "", unstyled: true, flex: 1, minW: 0, height: 30, p: 0, borderWidth: 0, bg: "transparent", fontSize: "$3", color: "$ink", placeholderTextColor: "$placeholderColor", placeholder: words.search, value: q, onChangeText: setQ, role: "combobox", "aria-label": `${words.search}: ${title}`, "aria-expanded": true, "aria-controls": listId, "aria-autocomplete": "list", "aria-activedescendant": active, autoComplete: "off", spellCheck: false, onKeyDown: onKey })] })) : null, (0, jsx_runtime_1.jsxs)(gui_1.YStack, { ...(0, slot_1.slot)('corner-list'), id: listId, role: "listbox", "aria-label": title, ...(searchable
271
+ ? null
272
+ : { 'data-corner-field': '', tabIndex: 0, 'aria-activedescendant': active, onKeyDown: onKey, focusVisibleStyle: press_1.RING }),
273
+ // A height, not a ceiling: a search that narrows the list leaves the card
274
+ // where it is instead of shrinking it away from the trigger.
275
+ height: 'min(320px, calc(100dvh - 180px))', overflowY: "auto", mx: -4, px: "$1", rounded: "$3", children: [rows.map((o, i) => {
276
+ const picked = o.code === setting.value;
277
+ return ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { ...(0, slot_1.slot)('corner-option'), id: optionId(i), role: "option", "aria-selected": picked, ...ROW, px: "$2", gap: "$2", items: "center", rounded: "$3", cursor: "pointer", bg: i === at ? '$hover' : 'transparent', onHoverIn: () => setAt(i), onPress: () => onChoose(o.code), children: [(0, jsx_runtime_1.jsx)(gui_1.YStack, { flex: 1, minW: 0, children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$ink", fontWeight: picked ? '600' : '400', numberOfLines: 1, self: "flex-start", maxW: "100%", ...(kind === 'language' ? { lang: o.code, dir: o.dir } : null), children: o.label }) }), o.hint ? ((0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$2", color: "$hint", numberOfLines: 1, shrink: 0, children: o.hint })) : null, (0, jsx_runtime_1.jsx)(gui_1.XStack, { width: 16, items: "center", justify: "center", shrink: 0, "aria-hidden": true, children: picked ? (0, jsx_runtime_1.jsx)(lucide_icons_2_1.Check, { size: 16, color: "$ink" }) : null })] }, o.code));
278
+ }), rows.length === 0 ? ((0, jsx_runtime_1.jsx)(gui_1.XStack, { ...ROW, px: "$2", items: "center", role: "status", children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$3", color: "$hint", children: words.none }) })) : null] })] }));
279
+ }
@@ -0,0 +1,21 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type Setting, type Words } from './logic.js';
3
+ export type { Option, Setting, Words } from './logic.js';
4
+ /** A help link. `icon` leads the label; an address on another host opens in a new tab with the outbound mark. */
5
+ export type Link = {
6
+ label: string;
7
+ href: string;
8
+ icon?: ReactNode;
9
+ };
10
+ export type CornerProps = {
11
+ /** Help links, in order: Get help, Docs, Contact us. None, and the card opens on Preferences. */
12
+ help?: readonly Link[];
13
+ /** The page's language, owned by the host. Absent, the row is not drawn. */
14
+ language?: Setting;
15
+ /** The page's display currency, owned by the host. Absent, the row is not drawn. */
16
+ currency?: Setting;
17
+ /** The panel's own words, for a host that speaks another language. */
18
+ words?: Partial<Words>;
19
+ };
20
+ export declare function Corner({ help, language, currency, words }: CornerProps): import("react").JSX.Element;
21
+ //# sourceMappingURL=Corner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Corner.d.ts","sourceRoot":"","sources":["../../src/corner/Corner.tsx"],"names":[],"mappings":"AAsCA,OAAO,EAAgF,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAWpH,OAAO,EAAyC,KAAK,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,SAAS,CAAA;AAEzF,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAErD,iHAAiH;AACjH,MAAM,MAAM,IAAI,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,CAAA;AAEpE,MAAM,MAAM,WAAW,GAAG;IACxB,iGAAiG;IACjG,IAAI,CAAC,EAAE,SAAS,IAAI,EAAE,CAAA;IACtB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,sEAAsE;IACtE,KAAK,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;CACvB,CAAA;AAuDD,wBAAgB,MAAM,CAAC,EAAE,IAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,WAAW,+BA0O3E"}