@path58/ui 2.2.0 → 2.7.2

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 (64) hide show
  1. package/dist/atoms/Layout/Layout.d.ts +47 -0
  2. package/dist/atoms/Layout/Layout.d.ts.map +1 -0
  3. package/dist/atoms/Layout/index.d.ts +3 -0
  4. package/dist/atoms/Layout/index.d.ts.map +1 -0
  5. package/dist/atoms/index.d.ts +1 -0
  6. package/dist/atoms/index.d.ts.map +1 -1
  7. package/dist/index.d.ts +10 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +2165 -1232
  10. package/dist/organisms/ToolAuthGate/ToolAuthGate.d.ts +47 -0
  11. package/dist/organisms/ToolAuthGate/ToolAuthGate.d.ts.map +1 -0
  12. package/dist/organisms/ToolAuthGate/index.d.ts +3 -0
  13. package/dist/organisms/ToolAuthGate/index.d.ts.map +1 -0
  14. package/dist/organisms/ToolFooter/ToolFooter.d.ts +21 -0
  15. package/dist/organisms/ToolFooter/ToolFooter.d.ts.map +1 -0
  16. package/dist/organisms/ToolFooter/index.d.ts +3 -0
  17. package/dist/organisms/ToolFooter/index.d.ts.map +1 -0
  18. package/dist/organisms/ToolSidebar/ToolSidebar.d.ts +60 -0
  19. package/dist/organisms/ToolSidebar/ToolSidebar.d.ts.map +1 -0
  20. package/dist/organisms/ToolSidebar/index.d.ts +3 -0
  21. package/dist/organisms/ToolSidebar/index.d.ts.map +1 -0
  22. package/dist/organisms/ToolSidebarHost/ToolSidebarHost.d.ts +18 -0
  23. package/dist/organisms/ToolSidebarHost/ToolSidebarHost.d.ts.map +1 -0
  24. package/dist/organisms/ToolSidebarHost/index.d.ts +3 -0
  25. package/dist/organisms/ToolSidebarHost/index.d.ts.map +1 -0
  26. package/dist/organisms/ToolTopbar/ToolTopbar.d.ts +27 -0
  27. package/dist/organisms/ToolTopbar/ToolTopbar.d.ts.map +1 -0
  28. package/dist/organisms/ToolTopbar/index.d.ts +3 -0
  29. package/dist/organisms/ToolTopbar/index.d.ts.map +1 -0
  30. package/dist/organisms/index.d.ts +4 -0
  31. package/dist/organisms/index.d.ts.map +1 -1
  32. package/dist/organisms/inputs/MoneyInput.d.ts +34 -0
  33. package/dist/organisms/inputs/MoneyInput.d.ts.map +1 -0
  34. package/dist/organisms/inputs/NumberInput.d.ts +36 -0
  35. package/dist/organisms/inputs/NumberInput.d.ts.map +1 -0
  36. package/dist/organisms/inputs/PercentInput.d.ts +36 -0
  37. package/dist/organisms/inputs/PercentInput.d.ts.map +1 -0
  38. package/dist/organisms/inputs/TextInput.d.ts +31 -0
  39. package/dist/organisms/inputs/TextInput.d.ts.map +1 -0
  40. package/dist/organisms/inputs/index.d.ts +18 -0
  41. package/dist/organisms/inputs/index.d.ts.map +1 -0
  42. package/dist/organisms/inputs/useBlurOnEnterEscapeClickOut.d.ts +29 -0
  43. package/dist/organisms/inputs/useBlurOnEnterEscapeClickOut.d.ts.map +1 -0
  44. package/dist/organisms/inputs/useNumericInputState.d.ts +23 -0
  45. package/dist/organisms/inputs/useNumericInputState.d.ts.map +1 -0
  46. package/dist/primitives/P58Button.d.ts.map +1 -1
  47. package/dist/primitives/P58Card.d.ts.map +1 -1
  48. package/dist/primitives/P58Eyebrow.d.ts.map +1 -1
  49. package/dist/styles.css +1 -1
  50. package/package.json +13 -16
  51. package/dist/atoms/Alert/Alert.stories.d.ts +0 -12
  52. package/dist/atoms/Alert/Alert.stories.d.ts.map +0 -1
  53. package/dist/atoms/Banner/Banner.stories.d.ts +0 -11
  54. package/dist/atoms/Banner/Banner.stories.d.ts.map +0 -1
  55. package/dist/atoms/Toast/Toast.stories.d.ts +0 -10
  56. package/dist/atoms/Toast/Toast.stories.d.ts.map +0 -1
  57. package/dist/molecules/ConfirmDialog/ConfirmDialog.stories.d.ts +0 -9
  58. package/dist/molecules/ConfirmDialog/ConfirmDialog.stories.d.ts.map +0 -1
  59. package/dist/molecules/Modal/Modal.stories.d.ts +0 -11
  60. package/dist/molecules/Modal/Modal.stories.d.ts.map +0 -1
  61. package/dist/molecules/PromptDialog/PromptDialog.stories.d.ts +0 -10
  62. package/dist/molecules/PromptDialog/PromptDialog.stories.d.ts.map +0 -1
  63. package/dist/primitives/Dialog/Dialog.stories.d.ts +0 -9
  64. package/dist/primitives/Dialog/Dialog.stories.d.ts.map +0 -1
@@ -0,0 +1,47 @@
1
+ import './ToolAuthGate.css';
2
+ /**
3
+ * ToolAuthGate — third chrome organism for Path58 consultancy tools.
4
+ *
5
+ * Joins ToolTopbar + ToolFooter as the canonical pre-authenticated surface
6
+ * for any Path58 consultancy tool that uses Supabase magic-link auth.
7
+ *
8
+ * Replaces 5 ad-hoc per-tool AuthGate implementations (TOOL-002/003/005/006/007)
9
+ * that drifted to 4 different visual treatments before consolidation here.
10
+ *
11
+ * Brand canon:
12
+ * - path58-tool theme (cream-cool / navy / restrained-lime)
13
+ * - Filled navy CTA (var(--p58-blue-900)) — Path58 brand-canon for primary action
14
+ * - Card surface (var(--p58-surface)) on page bg (var(--p58-bg))
15
+ * - Money-moment-utility-aware (path58-light loaded first per DSGN-1.5.3 Finding #8)
16
+ *
17
+ * Source: DSGN-1.5.3 TOOL-002 reference AuthGate (commit 11c3589) — most polished
18
+ * implementation; this organism canonicalizes its visual treatment.
19
+ *
20
+ * Per CLIENT_TOOL_BRANDING_POLICY v1.1.0:
21
+ * - Engagement-context badge ("For {clientName} engagement · {toolId}")
22
+ * - Tool name as h1
23
+ * - Path58 logo top of card (consumer supplies logoSrc; default fallback gracefully)
24
+ */
25
+ export interface ToolAuthGateProps {
26
+ /** Tool display name (e.g., "Revenue Factory Canvas") */
27
+ toolName: string;
28
+ /** Tool ID (e.g., "TOOL-002") */
29
+ toolId: string;
30
+ /** Client engagement name — caller passes window.__P58_CONFIG__?.clientName ?? 'Client' */
31
+ clientName: string;
32
+ /**
33
+ * Async magic-link send handler.
34
+ * Returns { ok: true } on success or { ok: false, error?: string } on failure.
35
+ * Caller wires this to their tool-local Supabase client + RUNBOOK auth flow.
36
+ */
37
+ onSendMagicLink: (email: string) => Promise<{
38
+ ok: boolean;
39
+ error?: string;
40
+ }>;
41
+ /** Optional brand logo override; defaults to deploy-time `_brand/path58/assets/path58-logo-wide-text.svg` */
42
+ logoSrc?: string;
43
+ /** Optional className passthrough on the outer container */
44
+ className?: string;
45
+ }
46
+ export declare function ToolAuthGate({ toolName, toolId, clientName, onSendMagicLink, logoSrc, className, }: ToolAuthGateProps): import("react").JSX.Element;
47
+ //# sourceMappingURL=ToolAuthGate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolAuthGate.d.ts","sourceRoot":"","sources":["../../../src/organisms/ToolAuthGate/ToolAuthGate.tsx"],"names":[],"mappings":"AACA,OAAO,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,iBAAiB;IAChC,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,2FAA2F;IAC3F,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,6GAA6G;IAC7G,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,MAAM,EACN,UAAU,EACV,eAAe,EACf,OAA0B,EAC1B,SAAS,GACV,EAAE,iBAAiB,+BAmFnB"}
@@ -0,0 +1,3 @@
1
+ export { ToolAuthGate } from './ToolAuthGate';
2
+ export type { ToolAuthGateProps } from './ToolAuthGate';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/organisms/ToolAuthGate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import './ToolFooter.css';
3
+ export interface ToolFooterProps {
4
+ /** Tool display name (e.g., "Revenue Factory Canvas"). Required. Renders emphasized inline in attribution prose. */
5
+ toolName: string;
6
+ /** Tool version semver string (e.g., "0.3.0"). Required. Renders as "v{toolVersion}" in attribution. */
7
+ toolVersion: string;
8
+ /** Client engagement name (e.g., "Nimble"). Required. Renders as "For {clientName} engagement" in attribution. */
9
+ clientName: string;
10
+ /** Show the path58-mark icon left of attribution. Default: true. */
11
+ showMark?: boolean;
12
+ /** "About this tool" callback. When undefined, the About button does NOT render.
13
+ * When defined: tool's thin Footer.tsx wrapper hosts modal state + renders tool-local <AboutThisTool>
14
+ * per CLIENT_TOOL_BRANDING_POLICY v1.0.0. */
15
+ onAbout?: () => void;
16
+ /** Show the Print button (internally calls `window.print()`). Default: true. */
17
+ showPrint?: boolean;
18
+ }
19
+ export declare const ToolFooter: React.FC<ToolFooterProps>;
20
+ export default ToolFooter;
21
+ //# sourceMappingURL=ToolFooter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolFooter.d.ts","sourceRoot":"","sources":["../../../src/organisms/ToolFooter/ToolFooter.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,kBAAkB,CAAC;AAE1B,MAAM,WAAW,eAAe;IAC9B,oHAAoH;IACpH,QAAQ,EAAE,MAAM,CAAC;IAEjB,wGAAwG;IACxG,WAAW,EAAE,MAAM,CAAC;IAEpB,kHAAkH;IAClH,UAAU,EAAE,MAAM,CAAC;IAEnB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;kDAE8C;IAC9C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,gFAAgF;IAChF,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAuChD,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as ToolFooter } from './ToolFooter';
2
+ export type { ToolFooterProps } from './ToolFooter';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/organisms/ToolFooter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,60 @@
1
+ import React from 'react';
2
+ import './ToolSidebar.css';
3
+ /**
4
+ * DSGN-2.10.2 — ToolSidebar organism
5
+ *
6
+ * Canonical left-rail navigation. 4th chrome organism (joins ToolTopbar +
7
+ * ToolFooter + ToolAuthGate). Consumed by Path58 tool surfaces + the portal
8
+ * launchpad page (DSGN-2.10.3).
9
+ *
10
+ * Design lineage (forks #1-6 locked 2026-06-27, see DSGN-2.10.2-COMPLETION § Decision log):
11
+ * #1 Width: 56px collapsed / 240px expanded
12
+ * #2 Engagement chip: outlined navy pill (matches ToolTopbar canon)
13
+ * #3 Active indicator: 3px navy left-rail + --p58-nav-active-bg
14
+ * #4 Mobile drawer: slide-in 240ms ease-out-expo + backdrop fade
15
+ * #5 Collapse/expand: 240ms simultaneous (single motion vocabulary)
16
+ * #6 Hover/focus: --p58-nav-hover-bg + --p58-ring-focus + tooltip on collapsed
17
+ *
18
+ * Token-only CSS (zero hex; overlay-bound rendering per DESIGN-PER-CLIENT-OVERLAY-LOCK-2026-06-19).
19
+ */
20
+ export interface ToolSidebarTool {
21
+ /** Canonical tool ID — e.g. "TOOL-002". Matches `__P58_CONFIG__.enabledTools[i]`. */
22
+ id: string;
23
+ /** URL-safe slug — e.g. "revenue-factory-canvas". Used as href fragment + active-match key. */
24
+ slug: string;
25
+ /** Display label rendered in expanded sidebar — e.g. "02 Revenue Factory". */
26
+ displayLabel: string;
27
+ /** Short label rendered in collapsed (56px) state — e.g. "02". Falls back to first 2 chars of displayLabel. */
28
+ shortLabel?: string;
29
+ }
30
+ export interface ToolSidebarProps {
31
+ /** Tools list — typically resolved by consumer from `__P58_CONFIG__.enabledTools` against a local registry. */
32
+ tools: ToolSidebarTool[];
33
+ /** Client engagement name shown in engagement chip — e.g. "Nimble". Required so chip is never empty. */
34
+ clientName: string;
35
+ /** Slug of the currently-active tool. Undefined = no tool active (portal page case). */
36
+ currentToolSlug?: string;
37
+ /** Launchpad URL — anchor link rendered above the tool list. Omit to hide. */
38
+ launchpadUrl?: string;
39
+ /** Launchpad label — defaults to "Launchpad". */
40
+ launchpadLabel?: string;
41
+ /** Navigation handler — consumer wires their router. Called with `slug`. If omitted, falls back to native anchor href. */
42
+ onToolNavigate?: (slug: string) => void;
43
+ /** Launchpad navigation handler — falls back to anchor href if omitted. */
44
+ onLaunchpadNavigate?: () => void;
45
+ /** Default collapsed state when no localStorage value present. Default: false. */
46
+ defaultCollapsed?: boolean;
47
+ /** localStorage key for collapse persistence. Default: "path58.toolSidebar.collapsed". Pass null to disable persistence (Storybook). */
48
+ storageKey?: string | null;
49
+ /** Force collapsed/expanded — controlled mode. When set, internal state + persistence are ignored. */
50
+ collapsed?: boolean;
51
+ /** Controlled-mode change callback. */
52
+ onCollapsedChange?: (collapsed: boolean) => void;
53
+ /** Mobile drawer open state (controlled). When undefined, sidebar renders inline as a desktop rail at all viewport widths. */
54
+ mobileOpen?: boolean;
55
+ /** Mobile drawer state-change handler — fires on backdrop tap + Escape key. */
56
+ onMobileOpenChange?: (open: boolean) => void;
57
+ }
58
+ export declare const ToolSidebar: React.FC<ToolSidebarProps>;
59
+ export default ToolSidebar;
60
+ //# sourceMappingURL=ToolSidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolSidebar.d.ts","sourceRoot":"","sources":["../../../src/organisms/ToolSidebar/ToolSidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAEzE,OAAO,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,eAAe;IAC9B,qFAAqF;IACrF,EAAE,EAAE,MAAM,CAAC;IACX,+FAA+F;IAC/F,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,YAAY,EAAE,MAAM,CAAC;IACrB,+GAA+G;IAC/G,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,+GAA+G;IAC/G,KAAK,EAAE,eAAe,EAAE,CAAC;IAEzB,wGAAwG;IACxG,UAAU,EAAE,MAAM,CAAC;IAEnB,wFAAwF;IACxF,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,0HAA0H;IAC1H,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAExC,2EAA2E;IAC3E,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IAEjC,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,wIAAwI;IACxI,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B,sGAAsG;IACtG,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,uCAAuC;IACvC,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAEjD,8HAA8H;IAC9H,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,+EAA+E;IAC/E,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9C;AASD,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAsKlD,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as ToolSidebar } from './ToolSidebar';
2
+ export type { ToolSidebarProps, ToolSidebarTool } from './ToolSidebar';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/organisms/ToolSidebar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import type { ToolSidebarTool } from '../ToolSidebar';
3
+ import './ToolSidebarHost.css';
4
+ export interface ToolSidebarHostProps {
5
+ /** The TOOL-* ID of the host tool — drives the current-tool indicator + which item is highlighted. */
6
+ currentToolId: string;
7
+ /** Override the tools list. Default: derived from `window.__P58_CONFIG__.enabledTools`. */
8
+ tools?: ToolSidebarTool[];
9
+ /** Override the client engagement name. Default: derived from `window.__P58_CONFIG__.displayName`. */
10
+ clientName?: string;
11
+ /** Launchpad URL — anchor in the sidebar. Default: '../portal/' (sibling to each tool folder). Pass empty string to hide. */
12
+ launchpadUrl?: string;
13
+ /** Main content area. */
14
+ children?: React.ReactNode;
15
+ }
16
+ export declare const ToolSidebarHost: React.FC<ToolSidebarHostProps>;
17
+ export default ToolSidebarHost;
18
+ //# sourceMappingURL=ToolSidebarHost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolSidebarHost.d.ts","sourceRoot":"","sources":["../../../src/organisms/ToolSidebarHost/ToolSidebarHost.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAGjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,uBAAuB,CAAC;AAoC/B,MAAM,WAAW,oBAAoB;IACnC,sGAAsG;IACtG,aAAa,EAAE,MAAM,CAAC;IAEtB,2FAA2F;IAC3F,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;IAE1B,sGAAsG;IACtG,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,6HAA6H;IAC7H,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAoD1D,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as ToolSidebarHost } from './ToolSidebarHost';
2
+ export type { ToolSidebarHostProps } from './ToolSidebarHost';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/organisms/ToolSidebarHost/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ import './ToolTopbar.css';
3
+ export interface ToolTopbarProps {
4
+ /** Tool display name shown LEFT after the divider. Required. */
5
+ toolName: string;
6
+ /** Canonical tool ID (e.g., "TOOL-002"). Shown in the meta cluster on RIGHT. Required. */
7
+ toolId: string;
8
+ /** Client engagement name (e.g., "Nimble"). Renders inside the engagement chip on RIGHT as "For {clientName} engagement". Required. */
9
+ clientName: string;
10
+ /** Last-saved ISO timestamp. `null` or `undefined` triggers save-state UI:
11
+ * - `undefined` (prop omitted) AND `saving === undefined` → no save UI at all (TOOL-001 static-tool path).
12
+ * - `null` AND `!saving` → "Not saved yet" idle state.
13
+ * - String AND `!saving` → "Auto-saved · HH:MM" saved state.
14
+ */
15
+ savedAt?: string | null;
16
+ /** Save in flight. Renders "Saving…" state with amber pulsing dot when true. */
17
+ saving?: boolean;
18
+ /** Sign-out handler. When undefined, Sign out button does NOT render (TOOL-001 static-tool path). */
19
+ onSignOut?: () => void;
20
+ /** Tool-specific action buttons (and selects, attribution chips, etc.) slotted into RIGHT cluster between meta and Sign out.
21
+ * Convention: use `<Button variant="secondary" size="sm">` for actions, `<Button variant="primary" size="sm">` for THE tool's primary CTA (e.g., "Save version").
22
+ * TOOL-001 uses this slot for the WbD attribution chip. */
23
+ children?: React.ReactNode;
24
+ }
25
+ export declare const ToolTopbar: React.FC<ToolTopbarProps>;
26
+ export default ToolTopbar;
27
+ //# sourceMappingURL=ToolTopbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolTopbar.d.ts","sourceRoot":"","sources":["../../../src/organisms/ToolTopbar/ToolTopbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,OAAO,kBAAkB,CAAC;AAE1B,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC;IAEjB,0FAA0F;IAC1F,MAAM,EAAE,MAAM,CAAC;IAEf,uIAAuI;IACvI,UAAU,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAExB,gFAAgF;IAChF,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,qGAAqG;IACrG,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IAEvB;;gEAE4D;IAC5D,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AA8BD,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAyDhD,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as ToolTopbar } from './ToolTopbar';
2
+ export type { ToolTopbarProps } from './ToolTopbar';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/organisms/ToolTopbar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -8,4 +8,8 @@ export * from './TagFilterList';
8
8
  export * from './CategoryGroup';
9
9
  export * from './ArtifactList';
10
10
  export * from './ToastProvider';
11
+ export * from './ToolTopbar';
12
+ export * from './ToolFooter';
13
+ export * from './ToolAuthGate';
14
+ export * from './inputs';
11
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/organisms/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAI/B,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/organisms/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAI/B,cAAc,iBAAiB,CAAC;AAGhC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAK7B,cAAc,gBAAgB,CAAC;AAI/B,cAAc,UAAU,CAAC"}
@@ -0,0 +1,34 @@
1
+ import type { FocusEvent, InputHTMLAttributes } from 'react';
2
+ import './TextInput.css';
3
+ export type MoneyInputSize = 'sm' | 'md' | 'lg';
4
+ export interface MoneyInputProps {
5
+ /** Visible label text. Required for a11y; never omit. */
6
+ label: string;
7
+ /** Controlled numeric value. null = empty (renders as "0" per Tsvika 2026-06-19 spec). */
8
+ value: number | null;
9
+ /** Fires on commit (Enter blur OR click-outside blur) with the parsed value. */
10
+ onChange: (next: number | null) => void;
11
+ hint?: string;
12
+ errorMessage?: string;
13
+ size?: MoneyInputSize;
14
+ required?: boolean;
15
+ invalid?: boolean;
16
+ disabled?: boolean;
17
+ /** Hide the visible label (sr-only). For table-cell consumption. Default: false. */
18
+ hideLabel?: boolean;
19
+ min?: number;
20
+ max?: number;
21
+ /** Step for rounding on commit. Default 1 = integer-only (cents → step=0.01). */
22
+ step?: number;
23
+ /** BCP-47 locale tag for Intl.NumberFormat (default 'en-US'). */
24
+ locale?: string;
25
+ /** Prefix character — default '$'. Currency-parameterization deferred per REQ-19-003. */
26
+ prefix?: string;
27
+ id?: string;
28
+ name?: string;
29
+ autoComplete?: InputHTMLAttributes<HTMLInputElement>['autoComplete'];
30
+ onFocus?: (e: FocusEvent<HTMLInputElement>) => void;
31
+ onBlur?: (e: FocusEvent<HTMLInputElement>) => void;
32
+ }
33
+ export declare function MoneyInput({ label, value, onChange, hint, errorMessage, size, required, invalid, disabled, hideLabel, min, max, step, locale, prefix, id: providedId, name, autoComplete, onFocus, onBlur, }: MoneyInputProps): import("react").JSX.Element;
34
+ //# sourceMappingURL=MoneyInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MoneyInput.d.ts","sourceRoot":"","sources":["../../../src/organisms/inputs/MoneyInput.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAG7D,OAAO,iBAAiB,CAAC;AAEzB,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gFAAgF;IAChF,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAExC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oFAAoF;IACpF,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,yFAAyF;IACzF,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,cAAc,CAAC,CAAC;IAErE,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACpD,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;CACpD;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,IAAW,EACX,QAAgB,EAChB,OAAe,EACf,QAAgB,EAChB,SAAiB,EACjB,GAAG,EACH,GAAG,EACH,IAAQ,EACR,MAAgB,EAChB,MAAY,EACZ,EAAE,EAAE,UAAU,EACd,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,MAAM,GACP,EAAE,eAAe,+BAwGjB"}
@@ -0,0 +1,36 @@
1
+ import type { FocusEvent, InputHTMLAttributes } from 'react';
2
+ import './TextInput.css';
3
+ export type NumberInputSize = 'sm' | 'md' | 'lg';
4
+ export interface NumberInputProps {
5
+ /** Visible label text. Required for a11y; never omit. */
6
+ label: string;
7
+ /** Controlled numeric value. null = empty. */
8
+ value: number | null;
9
+ /** Fires on commit (Enter blur OR click-outside blur) with the parsed value. */
10
+ onChange: (next: number | null) => void;
11
+ placeholder?: string;
12
+ hint?: string;
13
+ /** Shown below input when invalid; replaces hint while invalid. */
14
+ errorMessage?: string;
15
+ size?: NumberInputSize;
16
+ required?: boolean;
17
+ invalid?: boolean;
18
+ disabled?: boolean;
19
+ /** Hide the visible label (sr-only). For table-cell consumption. Default: false. */
20
+ hideLabel?: boolean;
21
+ /** Inclusive lower bound. Omit to allow negatives. */
22
+ min?: number;
23
+ /** Inclusive upper bound. */
24
+ max?: number;
25
+ /** Step for rounding on commit. Default 1 = integer-only. */
26
+ step?: number;
27
+ /** BCP-47 locale tag for Intl.NumberFormat (default 'en-US'). */
28
+ locale?: string;
29
+ id?: string;
30
+ name?: string;
31
+ autoComplete?: InputHTMLAttributes<HTMLInputElement>['autoComplete'];
32
+ onFocus?: (e: FocusEvent<HTMLInputElement>) => void;
33
+ onBlur?: (e: FocusEvent<HTMLInputElement>) => void;
34
+ }
35
+ export declare function NumberInput({ label, value, onChange, placeholder, hint, errorMessage, size, required, invalid, disabled, hideLabel, min, max, step, locale, id: providedId, name, autoComplete, onFocus, onBlur, }: NumberInputProps): import("react").JSX.Element;
36
+ //# sourceMappingURL=NumberInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NumberInput.d.ts","sourceRoot":"","sources":["../../../src/organisms/inputs/NumberInput.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAG7D,OAAO,iBAAiB,CAAC;AAEzB,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gFAAgF;IAChF,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAExC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oFAAoF;IACpF,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,sDAAsD;IACtD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,cAAc,CAAC,CAAC;IAErE,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACpD,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;CACpD;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,WAAW,EACX,IAAI,EACJ,YAAY,EACZ,IAAW,EACX,QAAgB,EAChB,OAAe,EACf,QAAgB,EAChB,SAAiB,EACjB,GAAG,EACH,GAAG,EACH,IAAQ,EACR,MAAgB,EAChB,EAAE,EAAE,UAAU,EACd,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,MAAM,GACP,EAAE,gBAAgB,+BA8FlB"}
@@ -0,0 +1,36 @@
1
+ import type { FocusEvent, InputHTMLAttributes } from 'react';
2
+ import './TextInput.css';
3
+ export type PercentInputSize = 'sm' | 'md' | 'lg';
4
+ export interface PercentInputProps {
5
+ /** Visible label text. Required for a11y; never omit. */
6
+ label: string;
7
+ /** Controlled numeric value. null = empty (renders as "0" per Tsvika 2026-06-19 spec). */
8
+ value: number | null;
9
+ /** Fires on commit (Enter blur OR click-outside blur) with the parsed value. */
10
+ onChange: (next: number | null) => void;
11
+ hint?: string;
12
+ errorMessage?: string;
13
+ size?: PercentInputSize;
14
+ required?: boolean;
15
+ invalid?: boolean;
16
+ disabled?: boolean;
17
+ /** Hide the visible label (sr-only). For table-cell consumption. Default: false. */
18
+ hideLabel?: boolean;
19
+ /** Default 0. Override to allow negatives. */
20
+ min?: number;
21
+ /** Default 100. Override for basis-point-style or unbounded use. */
22
+ max?: number;
23
+ /** Step for rounding on commit. Default 1 = integer percent. */
24
+ step?: number;
25
+ /** BCP-47 locale tag for Intl.NumberFormat (default 'en-US'). */
26
+ locale?: string;
27
+ /** Suffix character — default '%'. */
28
+ suffix?: string;
29
+ id?: string;
30
+ name?: string;
31
+ autoComplete?: InputHTMLAttributes<HTMLInputElement>['autoComplete'];
32
+ onFocus?: (e: FocusEvent<HTMLInputElement>) => void;
33
+ onBlur?: (e: FocusEvent<HTMLInputElement>) => void;
34
+ }
35
+ export declare function PercentInput({ label, value, onChange, hint, errorMessage, size, required, invalid, disabled, hideLabel, min, max, step, locale, suffix, id: providedId, name, autoComplete, onFocus, onBlur, }: PercentInputProps): import("react").JSX.Element;
36
+ //# sourceMappingURL=PercentInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PercentInput.d.ts","sourceRoot":"","sources":["../../../src/organisms/inputs/PercentInput.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAG7D,OAAO,iBAAiB,CAAC;AAEzB,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gFAAgF;IAChF,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAExC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oFAAoF;IACpF,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,cAAc,CAAC,CAAC;IAErE,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACpD,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;CACpD;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,IAAW,EACX,QAAgB,EAChB,OAAe,EACf,QAAgB,EAChB,SAAiB,EACjB,GAAO,EACP,GAAS,EACT,IAAQ,EACR,MAAgB,EAChB,MAAY,EACZ,EAAE,EAAE,UAAU,EACd,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,MAAM,GACP,EAAE,iBAAiB,+BAuGnB"}
@@ -0,0 +1,31 @@
1
+ import type { FocusEvent, InputHTMLAttributes } from 'react';
2
+ import './TextInput.css';
3
+ export type TextInputSize = 'sm' | 'md' | 'lg';
4
+ export type TextInputType = 'text' | 'email' | 'tel' | 'url' | 'password';
5
+ export interface TextInputProps {
6
+ /** Visible label text. Required for a11y; never omit. */
7
+ label: string;
8
+ /** Controlled value. */
9
+ value: string;
10
+ /** Fires on every keystroke AND on Escape revert (with the pre-focus snapshot). */
11
+ onChange: (next: string) => void;
12
+ placeholder?: string;
13
+ hint?: string;
14
+ size?: TextInputSize;
15
+ required?: boolean;
16
+ invalid?: boolean;
17
+ disabled?: boolean;
18
+ /** Hide the visible label (sr-only). For table-cell consumption where the column header is the visible label. Default: false. */
19
+ hideLabel?: boolean;
20
+ /** Shown below input when invalid; replaces hint while invalid. */
21
+ errorMessage?: string;
22
+ id?: string;
23
+ name?: string;
24
+ autoComplete?: InputHTMLAttributes<HTMLInputElement>['autoComplete'];
25
+ inputMode?: InputHTMLAttributes<HTMLInputElement>['inputMode'];
26
+ type?: TextInputType;
27
+ onFocus?: (e: FocusEvent<HTMLInputElement>) => void;
28
+ onBlur?: (e: FocusEvent<HTMLInputElement>) => void;
29
+ }
30
+ export declare function TextInput({ label, value, onChange, placeholder, hint, size, required, invalid, disabled, hideLabel, errorMessage, id: providedId, name, autoComplete, inputMode, type, onFocus: userOnFocus, onBlur: userOnBlur, }: TextInputProps): import("react").JSX.Element;
31
+ //# sourceMappingURL=TextInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextInput.d.ts","sourceRoot":"","sources":["../../../src/organisms/inputs/TextInput.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,UAAU,EACV,mBAAmB,EACpB,MAAM,OAAO,CAAC;AAGf,OAAO,iBAAiB,CAAC;AAEzB,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC/C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAEjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iIAAiI;IACjI,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,cAAc,CAAC,CAAC;IACrE,SAAS,CAAC,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,WAAW,CAAC,CAAC;IAC/D,IAAI,CAAC,EAAE,aAAa,CAAC;IAErB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACpD,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;CACpD;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,KAAK,EACL,QAAQ,EACR,WAAW,EACX,IAAI,EACJ,IAAW,EACX,QAAgB,EAChB,OAAe,EACf,QAAgB,EAChB,SAAiB,EACjB,YAAY,EACZ,EAAE,EAAE,UAAU,EACd,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,IAAa,EACb,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,GACnB,EAAE,cAAc,+BA8GhB"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @path58/ui — input molecules (DSGN-2.7)
3
+ *
4
+ * Foundation: TextInput + useBlurOnEnterEscapeClickOut hook (2.7.1).
5
+ * Extensions land in 2.7.2 (NumberInput), 2.7.3 (MoneyInput), 2.7.4 (PercentInput).
6
+ */
7
+ export { TextInput } from './TextInput';
8
+ export type { TextInputProps, TextInputSize, TextInputType, } from './TextInput';
9
+ export { NumberInput } from './NumberInput';
10
+ export type { NumberInputProps, NumberInputSize, } from './NumberInput';
11
+ export { MoneyInput } from './MoneyInput';
12
+ export type { MoneyInputProps, MoneyInputSize, } from './MoneyInput';
13
+ export { PercentInput } from './PercentInput';
14
+ export type { PercentInputProps, PercentInputSize, } from './PercentInput';
15
+ export { useBlurOnEnterEscapeClickOut } from './useBlurOnEnterEscapeClickOut';
16
+ export type { UseBlurOnEnterEscapeClickOutOptions } from './useBlurOnEnterEscapeClickOut';
17
+ export { formatValue, parseNumber, clampAndStep } from './useNumericInputState';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/organisms/inputs/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EACV,cAAc,EACd,aAAa,EACb,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EACV,gBAAgB,EAChB,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EACV,eAAe,EACf,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EACV,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,YAAY,EAAE,mCAAmC,EAAE,MAAM,gCAAgC,CAAC;AAG1F,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { FocusEvent, KeyboardEvent, RefObject } from 'react';
2
+ type InputLike = HTMLInputElement | HTMLTextAreaElement;
3
+ export interface UseBlurOnEnterEscapeClickOutOptions {
4
+ /** Fires on Enter blur OR click-outside blur (the "commit" path). */
5
+ onCommit?: () => void;
6
+ /** Fires on Escape blur (the "revert" path). */
7
+ onRevert?: () => void;
8
+ }
9
+ /**
10
+ * Wires Enter/Escape/click-out blur semantics for a controlled input.
11
+ *
12
+ * - Enter → preventDefault (avoid surrounding form submit) → blur → onCommit
13
+ * - Escape → blur → onRevert (caller restores the pre-focus snapshot via onChange)
14
+ * - Click-outside → native browser blur → onCommit (no override needed)
15
+ *
16
+ * The consumer wires the returned `onKeyDown` to the input AND the returned
17
+ * `onBlur` (composing with any consumer-side onBlur via the standard pattern).
18
+ *
19
+ * Esc semantics ratified blur+revert per Tsvika 2026-06-25 design discovery
20
+ * (matches Excel / Sheets / IDE convention; safer for accidental keystrokes).
21
+ *
22
+ * Genesis: REQ-2026-06-19-003 § Behavioral contract; DSGN-2.7.1 SPEC § 7.
23
+ */
24
+ export declare function useBlurOnEnterEscapeClickOut<T extends InputLike>(ref: RefObject<T>, options?: UseBlurOnEnterEscapeClickOutOptions): {
25
+ onKeyDown: (e: KeyboardEvent<T>) => void;
26
+ onBlur: (_e: FocusEvent<T>) => void;
27
+ };
28
+ export {};
29
+ //# sourceMappingURL=useBlurOnEnterEscapeClickOut.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBlurOnEnterEscapeClickOut.d.ts","sourceRoot":"","sources":["../../../src/organisms/inputs/useBlurOnEnterEscapeClickOut.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElE,KAAK,SAAS,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAExD,MAAM,WAAW,mCAAmC;IAClD,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,SAAS,SAAS,EAC9D,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,EACjB,OAAO,GAAE,mCAAwC;mBAM3C,aAAa,CAAC,CAAC,CAAC;iBAaf,UAAU,CAAC,CAAC,CAAC;EAYrB"}
@@ -0,0 +1,23 @@
1
+ import type { ChangeEvent, FocusEvent, RefObject } from 'react';
2
+ export declare function formatValue(value: number | null, locale: string): string;
3
+ export declare function parseNumber(raw: string): number | null;
4
+ export declare function clampAndStep(n: number | null, min: number | undefined, max: number | undefined, step: number): number | null;
5
+ export interface UseNumericInputStateOptions {
6
+ value: number | null;
7
+ onChange: (next: number | null) => void;
8
+ min?: number;
9
+ max?: number;
10
+ step: number;
11
+ locale: string;
12
+ inputRef: RefObject<HTMLInputElement>;
13
+ userOnFocus?: (e: FocusEvent<HTMLInputElement>) => void;
14
+ userOnBlur?: (e: FocusEvent<HTMLInputElement>) => void;
15
+ }
16
+ export declare function useNumericInputState(opts: UseNumericInputStateOptions): {
17
+ displayValue: string;
18
+ handleFocus: (e: FocusEvent<HTMLInputElement>) => void;
19
+ handleBlur: (e: FocusEvent<HTMLInputElement>) => void;
20
+ handleChange: (e: ChangeEvent<HTMLInputElement>) => void;
21
+ onKeyDown: (e: import("react").KeyboardEvent<HTMLInputElement>) => void;
22
+ };
23
+ //# sourceMappingURL=useNumericInputState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNumericInputState.d.ts","sourceRoot":"","sources":["../../../src/organisms/inputs/useNumericInputState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAchE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGxE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMtD;AAED,wBAAgB,YAAY,CAC1B,CAAC,EAAE,MAAM,GAAG,IAAI,EAChB,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAOf;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACxD,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;CACxD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,2BAA2B;;qBAU9D,UAAU,CAAC,gBAAgB,CAAC;oBA0B5B,UAAU,CAAC,gBAAgB,CAAC;sBAOG,WAAW,CAAC,gBAAgB,CAAC;;EAWnE"}
@@ -1 +1 @@
1
- {"version":3,"file":"P58Button.d.ts","sourceRoot":"","sources":["../../src/primitives/P58Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC5E,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/C,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AA+CD;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA2C9C,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"P58Button.d.ts","sourceRoot":"","sources":["../../src/primitives/P58Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC5E,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/C,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAmDD;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA2C9C,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"P58Card.d.ts","sourceRoot":"","sources":["../../src/primitives/P58Card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,iDAAiD;IACjD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAMD;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CA0B1C,CAAC;AAEF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"P58Card.d.ts","sourceRoot":"","sources":["../../src/primitives/P58Card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,iDAAiD;IACjD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAMD;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CA+B1C,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"P58Eyebrow.d.ts","sourceRoot":"","sources":["../../src/primitives/P58Eyebrow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAahD,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"P58Eyebrow.d.ts","sourceRoot":"","sources":["../../src/primitives/P58Eyebrow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAchD,CAAC;AAEF,eAAe,UAAU,CAAC"}