@lmb-it/kitsconcerto-native 0.1.266 → 0.1.268

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.
@@ -28,7 +28,38 @@ const overlayAnimations = {
28
28
  // Slightly heavier damping/lower stiffness so the sheet glides up without
29
29
  // overshoot. Exit: timed slide-down.
30
30
  sheet: {
31
- enter: { damping: 26, stiffness: 140, mass: 1 },
31
+ /*
32
+ * ⛔ 130ms, MEASURED OFF THE PLATFORM'S OWN SHEET — not chosen by feel.
33
+ *
34
+ * The entrance was `{damping: 26, stiffness: 140, mass: 1}`, and Fouad's
35
+ * note on the select popup was "too slow". It was, and the number that
36
+ * made it slow is not the one it looks like: damping 26 against
37
+ * stiffness 140 is a damping RATIO of 1.10 — very slightly OVERDAMPED —
38
+ * so the panel approaches its resting place asymptotically and never
39
+ * visibly arrives.
40
+ *
41
+ * MEASURED on an iPhone 16 Pro simulator with
42
+ * `UML/Working/tools/motionProbe.mjs`, one instrument for both:
43
+ *
44
+ * the platform's own sheet travel over 9 frames / 126ms,
45
+ * (RN `Modal animationType` then STOPPED
46
+ * ="slide"`, which is what
47
+ * `WorkspaceSwitcherSheet`
48
+ * and React Navigation's
49
+ * `slide_from_bottom` present)
50
+ *
51
+ * this sheet, on the old spring travel over 8 frames / 154ms,
52
+ * and STILL MOVING at 437ms
53
+ *
54
+ * ⚠️ THE INITIAL TRAVEL WAS NEVER THE PROBLEM — 154ms against 126ms is
55
+ * nothing. The tail is. The old spring was still creeping a third of a
56
+ * second after it looked finished, and that is what reads as slow.
57
+ *
58
+ * So the shape follows the house and not the library's habit (§5): the
59
+ * platform slides for a fixed time on an ease-out and stops dead, so
60
+ * this does too. 130 is the measured 126 rounded to the nearest 10ms.
61
+ */
62
+ enter: { duration: 130 },
32
63
  exitDuration: 260},
33
64
  // ── Toast ────────────────────────────────────────────────
34
65
  // One element owns the entrance: FadeInUp/FadeInDown animate opacity AND
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/animations/index.ts"],"sourcesContent":["/**\n * ════════════════════════════════════════════════════════════════════════\n * Overlay animation tuning — EDIT THIS FILE TO CONTROL ALL OVERLAY MOTION\n * ════════════════════════════════════════════════════════════════════════\n *\n * Every in/out animation value used by the animated overlay components on\n * React Native (reanimated) lives here. Change a number and it updates\n * everywhere that animation is used — no need to touch the component files.\n *\n * Consumed by (native):\n * • components/overlay/Dialog/index.native.tsx\n * • components/overlay/ConfirmDialog/index.native.tsx\n * • components/overlay/Toast/index.native.tsx\n *\n * Two kinds of value:\n * • spring → reanimated `.springify().damping(d).stiffness(s)` (+ optional `.delay`)\n * - damping ↓ lower = bouncier, longer settle\n * - stiffness ↑ higher = snappier, faster\n * • duration → milliseconds for `.duration(ms)` (timing-based fade/slide)\n */\n\nexport interface ISpringConfig {\n /** reanimated `.damping()` — lower = bouncier / slower to settle. */\n damping: number;\n /** reanimated `.stiffness()` — higher = snappier / faster. */\n stiffness: number;\n /** reanimated `.mass()` — heavier = slower / more inertia. Defaults to 1. */\n mass?: number;\n /** reanimated `.delay()` in ms — wait before the animation starts. */\n delay?: number;\n}\n\nexport interface IOverlayAnimations {\n /**\n * Dimmed backdrop behind every overlay (fade in/out).\n *\n * ⚠️ `exitDuration` is a FLOOR, not the value to pass — read\n * `scrimExitDuration()` below before using it. The dim has to outlast the\n * panel's own exit or the page behind reappears while the panel is still\n * leaving. ⛔ The old wording here said \"the scrim is the panel's PARENT\";\n * that stopped being true of the Dialog on 29 September 2026, and the\n * function's own comment records both the old reason and the new one.\n */\n scrim: { enterDuration: number; exitDuration: number };\n /** Centered Dialog panel (zoom-in spring in, timed zoom-out). */\n dialog: { enter: ISpringConfig; exitDuration: number };\n /** Confirm: centered panel, its floating icon bubble, and the content-only/prompt panel. */\n confirm: { enter: ISpringConfig; icon: ISpringConfig; content: ISpringConfig; exitDuration: number };\n /**\n * Bottom sheet shared by Dialog & Confirm (slide-up spring in, timed\n * slide-down out).\n *\n * `keepMotionWhenReduced` asks Reanimated to run this one even when the\n * reader has iOS \"Reduce Motion\" on — see the note beside the value.\n */\n sheet: { enter: ISpringConfig; exitDuration: number; keepMotionWhenReduced: boolean };\n /** Toast — single merged fade+slide entrance, timed exit, re-layout, keyboard gap. */\n toast: {\n enter: ISpringConfig;\n exitDuration: number;\n layoutDuration: number;\n keyboardGap: number;\n };\n}\n\nexport const overlayAnimations: IOverlayAnimations = {\n // ── Backdrop / scrim ─────────────────────────────────────\n scrim: {\n enterDuration: 120,\n exitDuration: 100,\n },\n\n // ── Centered Dialog panel ────────────────────────────────\n // Enter: critically-ish damped spring — snappy but settles cleanly (no\n // ringing). Exit: timing-based zoom-out (springs are enter-only).\n dialog: {\n enter: { damping: 26, stiffness: 420, mass: 1 },\n exitDuration: 120,\n },\n\n // ── Confirm dialog ───────────────────────────────────────\n confirm: {\n /** Centered confirm panel pop. */\n enter: { damping: 26, stiffness: 420, mass: 1 },\n /** Floating severity-icon bubble — pops in slightly after the panel. */\n icon: { damping: 26, stiffness: 420, mass: 1, delay: 60 },\n /** Content-only / prompt panel (no header/buttons chrome). */\n content: { damping: 26, stiffness: 420, mass: 1 },\n /** Timed zoom-out for the confirm center/content panels. */\n exitDuration: 120,\n },\n\n // ── Bottom sheet (Dialog + Confirm, position=\"bottom\") ───\n // Slightly heavier damping/lower stiffness so the sheet glides up without\n // overshoot. Exit: timed slide-down.\n sheet: {\n enter: { damping: 26, stiffness: 140, mass: 1 },\n exitDuration: 260,\n /*\n * ⛔ REDUCE MOTION TURNS THIS OFF, AND THAT READS AS A FADE. Reanimated\n * honours iOS \"Reduce Motion\" by default: the entering/exiting\n * animation is skipped and the panel simply appears, so the only thing\n * left moving is the scrim's opacity. Measured on an iPhone 16 Pro\n * simulator, sheet top edge per frame at 30fps:\n * Reduce Motion OFF — 1924 → 1302 → 898 → 683 → 655 px\n * Reduce Motion ON — 655 in a single frame\n * That second row is exactly the \"it still fades\" report.\n *\n * A bottom sheet is kept moving because the platform keeps it moving:\n * iOS's own sheets still slide up under Reduce Motion — what that\n * setting removes is parallax and zoom, not the presentation of a\n * sheet. The centred Dialog's ZoomIn and the scrim's fade are NOT\n * overridden; they stay on the system default.\n */\n keepMotionWhenReduced: true,\n },\n\n // ── Toast ────────────────────────────────────────────────\n // One element owns the entrance: FadeInUp/FadeInDown animate opacity AND\n // translateY together, so there is no second concurrent layer to desync.\n toast: {\n /** Merged fade+slide entrance (position-appropriate direction). */\n enter: { damping: 30, stiffness: 400, mass: 1 },\n /** Timed fade+slide out. */\n exitDuration: 120,\n /** Re-positioning when toasts stack/unstack. */\n layoutDuration: 150,\n /** Gap (pt) kept between a bottom toast and the keyboard when it opens. */\n keyboardGap: 8,\n },\n};\n\n/**\n * How long the SCRIM may take to leave, so the dim outlasts the panel.\n *\n * ⛔ THE REASON IS NOW VISUAL, NOT STRUCTURAL — rewritten 29 September 2026 when\n * the Dialog's scrim and panel became siblings. The panel slides down over\n * `sheet.exitDuration` (260ms). If the dim were allowed to finish in\n * `scrim.exitDuration` (100ms), the last 160ms of that slide would play against\n * the undimmed screen behind it: the page reappears at full brightness while a\n * panel is still visibly on its way out. `max()` keeps the dim present until the\n * panel is off screen.\n *\n * THE TWO NUMBERS, so neither is a bare literal: `scrim.exitDuration` is 100ms —\n * the fade's own pace, and the floor. `sheet.exitDuration` is 260ms and\n * `dialog.exitDuration` is 120ms. So the sheet gets 260 and the centred dialog\n * gets 120; in both cases the panel's own duration wins, and the floor only\n * matters if a caller ever passes something shorter than 100.\n *\n * ── ✅ AND THE FAULT THIS FUNCTION WAS ORIGINALLY WRITTEN FOR IS FIXED ───────\n *\n * It used to exist because the scrim was the panel's PARENT: React unmounts a\n * subtree as one thing, so when the parent's exiting animation reported finished\n * the child was removed wherever its own animation happened to be. A 260ms slide\n * under a 100ms fade did not play for 260ms — it played for 100 and the sheet was\n * simply gone.\n *\n * ⚠️ THE MEASUREMENT IS KEPT, because it is the evidence and a fix that erases\n * its own evidence leaves nothing for the next reader (§12.5). iPhone 16 Pro\n * simulator, 30fps, closing the bottom sheet. The flags inside the sheet are the\n * only saturated pixels on screen, so their y is the sheet's own edge and not the\n * screen's:\n *\n * frame flag y (of 348) sheet white scrim\n * 125 140 237 143 settled\n * 126 143 240 149 starts down\n * 127 197 253 192 54 units travelled\n * 128 gone — 234 removed\n *\n * Three frames. The sheet covered a sixth of its travel and vanished while the\n * scrim faded normally — which is exactly the report that the overlay fades and\n * the sheet does not move.\n *\n * ⚠️ IT WAS INVISIBLE TO THE OBVIOUS MEASUREMENT. A scan for the topmost bright\n * row could not tell a sheet edge at y=655 from the page behind it at y=655; both\n * read white. Only a feature that exists ONLY inside the sheet could say which was\n * on screen.\n *\n * ⛔ THE DIALOG NO LONGER HAS THAT CONTAINMENT. Its panel is a sibling of the\n * scrim and owns the teardown — the Modal unmounts on the PANEL's exit callback,\n * so a scrim that finishes first can no longer take the panel with it.\n * ⚠️ `ConfirmDialog` still nests its panel inside its scrim and therefore still\n * depends on this function for the original reason as well as the visual one.\n * Converting it is a separate unit.\n */\nexport function scrimExitDuration(panelExitDuration: number): number {\n return Math.max(overlayAnimations.scrim.exitDuration, panelExitDuration);\n}\n\nexport default overlayAnimations;\n"],"names":[],"mappings":";;AAiEO,MAAM,iBAAA,GAAwC;AAAA;AAAA,EAEjD,KAAA,EAAO;AAAA,IACH,aAAA,EAAe,GAAA;AAAA,IACf,YAAA,EAAc;AAAA,GAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,EAAQ;AAAA,IACJ,OAAO,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,IAC9C,YAAA,EAAc;AAAA,GAClB;AAAA;AAAA,EAGA,OAAA,EAAS;AAAA;AAAA,IAEL,OAAO,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA;AAAA,IAE9C,IAAA,EAAM,EAAE,OAAA,EAAS,EAAA,EAAI,WAAW,GAAA,EAAK,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,EAAA,EAAG;AAAA;AAAA,IAExD,SAAS,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA;AAAA,IAEhD,YAAA,EAAc;AAAA,GAClB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,EAAO;AAAA,IACH,OAAO,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,IAC9C,YAAA,EAAc,GAkBlB,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,EAAO;AAAA;AAAA,IAEH,OAAO,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA;AAAA,IAE9C,YAAA,EAAc,GAAA;AAAA;AAAA,IAEd,cAAA,EAAgB,GAAA;AAAA;AAAA,IAEhB,WAAA,EAAa;AAAA;AAErB;AAuDO,SAAS,kBAAkB,iBAAA,EAAmC;AACjE,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,iBAAA,CAAkB,KAAA,CAAM,cAAc,iBAAiB,CAAA;AAC3E;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/animations/index.ts"],"sourcesContent":["/**\n * ════════════════════════════════════════════════════════════════════════\n * Overlay animation tuning — EDIT THIS FILE TO CONTROL ALL OVERLAY MOTION\n * ════════════════════════════════════════════════════════════════════════\n *\n * Every in/out animation value used by the animated overlay components on\n * React Native (reanimated) lives here. Change a number and it updates\n * everywhere that animation is used — no need to touch the component files.\n *\n * Consumed by (native):\n * • components/overlay/Dialog/index.native.tsx\n * • components/overlay/ConfirmDialog/index.native.tsx\n * • components/overlay/Toast/index.native.tsx\n *\n * Two kinds of value:\n * • spring → reanimated `.springify().damping(d).stiffness(s)` (+ optional `.delay`)\n * - damping ↓ lower = bouncier, longer settle\n * - stiffness ↑ higher = snappier, faster\n * • duration → milliseconds for `.duration(ms)` (timing-based fade/slide)\n */\n\nexport interface ISpringConfig {\n /** reanimated `.damping()` — lower = bouncier / slower to settle. */\n damping: number;\n /** reanimated `.stiffness()` — higher = snappier / faster. */\n stiffness: number;\n /** reanimated `.mass()` — heavier = slower / more inertia. Defaults to 1. */\n mass?: number;\n /** reanimated `.delay()` in ms — wait before the animation starts. */\n delay?: number;\n}\n\nexport interface IOverlayAnimations {\n /**\n * Dimmed backdrop behind every overlay (fade in/out).\n *\n * ⚠️ `exitDuration` is a FLOOR, not the value to pass — read\n * `scrimExitDuration()` below before using it. The dim has to outlast the\n * panel's own exit or the page behind reappears while the panel is still\n * leaving. ⛔ The old wording here said \"the scrim is the panel's PARENT\";\n * that stopped being true of the Dialog on 29 September 2026, and the\n * function's own comment records both the old reason and the new one.\n */\n scrim: { enterDuration: number; exitDuration: number };\n /** Centered Dialog panel (zoom-in spring in, timed zoom-out). */\n dialog: { enter: ISpringConfig; exitDuration: number };\n /** Confirm: centered panel, its floating icon bubble, and the content-only/prompt panel. */\n confirm: { enter: ISpringConfig; icon: ISpringConfig; content: ISpringConfig; exitDuration: number };\n /**\n * Bottom sheet shared by Dialog & Confirm (slide-up spring in, timed\n * slide-down out).\n *\n * `keepMotionWhenReduced` asks Reanimated to run this one even when the\n * reader has iOS \"Reduce Motion\" on — see the note beside the value.\n */\n sheet: {\n /**\n * ⛔ THE ENTRANCE IS A DURATION NOW, NOT A SPRING — 30 September 2026.\n * See the value below for the measurement that decided it.\n */\n /**\n * ⛔ CARRIES BOTH, AND THE `duration` IS THE ONE THAT DRIVES THIS LIBRARY.\n *\n * `duration` is what `sheetMotion.native.ts` uses — see the value below\n * for the measurement that set it.\n *\n * ⚠️ THE SPRING FIELDS STAY, AND NOT OUT OF TIDINESS. A consumer drives\n * its own animation off them: `App/src/components/shared/ConfirmSheet`\n * reads `.damping/.stiffness/.mass` into RN's own `Animated.spring`,\n * deliberately, because importing Reanimated there dragged its native\n * chain into every suite that mounts it. Deleting them would break that\n * sheet silently.\n * ⛔ SO THAT ONE SHEET IS NOW OUT OF STEP, AND THAT IS A DEBT. It still\n * rises on the slow spring every other sheet just moved off. Named here\n * rather than found later.\n *\n * ⚠️ Keeping both on ONE object is also what leaves `Dialog` and\n * `ConfirmDialog` untouched: both already pass `anim.sheet.enter`, and\n * they still do.\n */\n enter: ISpringConfig & {duration: number};\n exitDuration: number;\n keepMotionWhenReduced: boolean;\n };\n /** Toast — single merged fade+slide entrance, timed exit, re-layout, keyboard gap. */\n toast: {\n enter: ISpringConfig;\n exitDuration: number;\n layoutDuration: number;\n keyboardGap: number;\n };\n}\n\nexport const overlayAnimations: IOverlayAnimations = {\n // ── Backdrop / scrim ─────────────────────────────────────\n scrim: {\n enterDuration: 120,\n exitDuration: 100,\n },\n\n // ── Centered Dialog panel ────────────────────────────────\n // Enter: critically-ish damped spring — snappy but settles cleanly (no\n // ringing). Exit: timing-based zoom-out (springs are enter-only).\n dialog: {\n enter: { damping: 26, stiffness: 420, mass: 1 },\n exitDuration: 120,\n },\n\n // ── Confirm dialog ───────────────────────────────────────\n confirm: {\n /** Centered confirm panel pop. */\n enter: { damping: 26, stiffness: 420, mass: 1 },\n /** Floating severity-icon bubble — pops in slightly after the panel. */\n icon: { damping: 26, stiffness: 420, mass: 1, delay: 60 },\n /** Content-only / prompt panel (no header/buttons chrome). */\n content: { damping: 26, stiffness: 420, mass: 1 },\n /** Timed zoom-out for the confirm center/content panels. */\n exitDuration: 120,\n },\n\n // ── Bottom sheet (Dialog + Confirm, position=\"bottom\") ───\n // Slightly heavier damping/lower stiffness so the sheet glides up without\n // overshoot. Exit: timed slide-down.\n sheet: {\n /*\n * ⛔ 130ms, MEASURED OFF THE PLATFORM'S OWN SHEET — not chosen by feel.\n *\n * The entrance was `{damping: 26, stiffness: 140, mass: 1}`, and Fouad's\n * note on the select popup was \"too slow\". It was, and the number that\n * made it slow is not the one it looks like: damping 26 against\n * stiffness 140 is a damping RATIO of 1.10 — very slightly OVERDAMPED —\n * so the panel approaches its resting place asymptotically and never\n * visibly arrives.\n *\n * MEASURED on an iPhone 16 Pro simulator with\n * `UML/Working/tools/motionProbe.mjs`, one instrument for both:\n *\n * the platform's own sheet travel over 9 frames / 126ms,\n * (RN `Modal animationType` then STOPPED\n * =\"slide\"`, which is what\n * `WorkspaceSwitcherSheet`\n * and React Navigation's\n * `slide_from_bottom` present)\n *\n * this sheet, on the old spring travel over 8 frames / 154ms,\n * and STILL MOVING at 437ms\n *\n * ⚠️ THE INITIAL TRAVEL WAS NEVER THE PROBLEM — 154ms against 126ms is\n * nothing. The tail is. The old spring was still creeping a third of a\n * second after it looked finished, and that is what reads as slow.\n *\n * So the shape follows the house and not the library's habit (§5): the\n * platform slides for a fixed time on an ease-out and stops dead, so\n * this does too. 130 is the measured 126 rounded to the nearest 10ms.\n */\n enter: { damping: 26, stiffness: 140, mass: 1, duration: 130 },\n exitDuration: 260,\n /*\n * ⛔ REDUCE MOTION TURNS THIS OFF, AND THAT READS AS A FADE. Reanimated\n * honours iOS \"Reduce Motion\" by default: the entering/exiting\n * animation is skipped and the panel simply appears, so the only thing\n * left moving is the scrim's opacity. Measured on an iPhone 16 Pro\n * simulator, sheet top edge per frame at 30fps:\n * Reduce Motion OFF — 1924 → 1302 → 898 → 683 → 655 px\n * Reduce Motion ON — 655 in a single frame\n * That second row is exactly the \"it still fades\" report.\n *\n * A bottom sheet is kept moving because the platform keeps it moving:\n * iOS's own sheets still slide up under Reduce Motion — what that\n * setting removes is parallax and zoom, not the presentation of a\n * sheet. The centred Dialog's ZoomIn and the scrim's fade are NOT\n * overridden; they stay on the system default.\n */\n keepMotionWhenReduced: true,\n },\n\n // ── Toast ────────────────────────────────────────────────\n // One element owns the entrance: FadeInUp/FadeInDown animate opacity AND\n // translateY together, so there is no second concurrent layer to desync.\n toast: {\n /** Merged fade+slide entrance (position-appropriate direction). */\n enter: { damping: 30, stiffness: 400, mass: 1 },\n /** Timed fade+slide out. */\n exitDuration: 120,\n /** Re-positioning when toasts stack/unstack. */\n layoutDuration: 150,\n /** Gap (pt) kept between a bottom toast and the keyboard when it opens. */\n keyboardGap: 8,\n },\n};\n\n/**\n * How long the SCRIM may take to leave, so the dim outlasts the panel.\n *\n * ⛔ THE REASON IS NOW VISUAL, NOT STRUCTURAL — rewritten 29 September 2026 when\n * the Dialog's scrim and panel became siblings. The panel slides down over\n * `sheet.exitDuration` (260ms). If the dim were allowed to finish in\n * `scrim.exitDuration` (100ms), the last 160ms of that slide would play against\n * the undimmed screen behind it: the page reappears at full brightness while a\n * panel is still visibly on its way out. `max()` keeps the dim present until the\n * panel is off screen.\n *\n * THE TWO NUMBERS, so neither is a bare literal: `scrim.exitDuration` is 100ms —\n * the fade's own pace, and the floor. `sheet.exitDuration` is 260ms and\n * `dialog.exitDuration` is 120ms. So the sheet gets 260 and the centred dialog\n * gets 120; in both cases the panel's own duration wins, and the floor only\n * matters if a caller ever passes something shorter than 100.\n *\n * ── ✅ AND THE FAULT THIS FUNCTION WAS ORIGINALLY WRITTEN FOR IS FIXED ───────\n *\n * It used to exist because the scrim was the panel's PARENT: React unmounts a\n * subtree as one thing, so when the parent's exiting animation reported finished\n * the child was removed wherever its own animation happened to be. A 260ms slide\n * under a 100ms fade did not play for 260ms — it played for 100 and the sheet was\n * simply gone.\n *\n * ⚠️ THE MEASUREMENT IS KEPT, because it is the evidence and a fix that erases\n * its own evidence leaves nothing for the next reader (§12.5). iPhone 16 Pro\n * simulator, 30fps, closing the bottom sheet. The flags inside the sheet are the\n * only saturated pixels on screen, so their y is the sheet's own edge and not the\n * screen's:\n *\n * frame flag y (of 348) sheet white scrim\n * 125 140 237 143 settled\n * 126 143 240 149 starts down\n * 127 197 253 192 54 units travelled\n * 128 gone — 234 removed\n *\n * Three frames. The sheet covered a sixth of its travel and vanished while the\n * scrim faded normally — which is exactly the report that the overlay fades and\n * the sheet does not move.\n *\n * ⚠️ IT WAS INVISIBLE TO THE OBVIOUS MEASUREMENT. A scan for the topmost bright\n * row could not tell a sheet edge at y=655 from the page behind it at y=655; both\n * read white. Only a feature that exists ONLY inside the sheet could say which was\n * on screen.\n *\n * ⛔ THE DIALOG NO LONGER HAS THAT CONTAINMENT. Its panel is a sibling of the\n * scrim and owns the teardown — the Modal unmounts on the PANEL's exit callback,\n * so a scrim that finishes first can no longer take the panel with it.\n * ⚠️ `ConfirmDialog` still nests its panel inside its scrim and therefore still\n * depends on this function for the original reason as well as the visual one.\n * Converting it is a separate unit.\n */\nexport function scrimExitDuration(panelExitDuration: number): number {\n return Math.max(overlayAnimations.scrim.exitDuration, panelExitDuration);\n}\n\nexport default overlayAnimations;\n"],"names":[],"mappings":";;AA6FO,MAAM,iBAAA,GAAwC;AAAA;AAAA,EAEjD,KAAA,EAAO;AAAA,IACH,aAAA,EAAe,GAAA;AAAA,IACf,YAAA,EAAc;AAAA,GAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,EAAQ;AAAA,IACJ,OAAO,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,IAC9C,YAAA,EAAc;AAAA,GAClB;AAAA;AAAA,EAGA,OAAA,EAAS;AAAA;AAAA,IAEL,OAAO,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA;AAAA,IAE9C,IAAA,EAAM,EAAE,OAAA,EAAS,EAAA,EAAI,WAAW,GAAA,EAAK,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,EAAA,EAAG;AAAA;AAAA,IAExD,SAAS,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA;AAAA,IAEhD,YAAA,EAAc;AAAA,GAClB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgCH,KAAA,EAAO,EAAwC,QAAA,EAAU,GAAA,EAAI;AAAA,IAC7D,YAAA,EAAc,GAkBlB,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,EAAO;AAAA;AAAA,IAEH,OAAO,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA;AAAA,IAE9C,YAAA,EAAc,GAAA;AAAA;AAAA,IAEd,cAAA,EAAgB,GAAA;AAAA;AAAA,IAEhB,WAAA,EAAa;AAAA;AAErB;AAuDO,SAAS,kBAAkB,iBAAA,EAAmC;AACjE,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,iBAAA,CAAkB,KAAA,CAAM,cAAc,iBAAiB,CAAA;AAC3E;;;;;"}
@@ -26,7 +26,38 @@ const overlayAnimations = {
26
26
  // Slightly heavier damping/lower stiffness so the sheet glides up without
27
27
  // overshoot. Exit: timed slide-down.
28
28
  sheet: {
29
- enter: { damping: 26, stiffness: 140, mass: 1 },
29
+ /*
30
+ * ⛔ 130ms, MEASURED OFF THE PLATFORM'S OWN SHEET — not chosen by feel.
31
+ *
32
+ * The entrance was `{damping: 26, stiffness: 140, mass: 1}`, and Fouad's
33
+ * note on the select popup was "too slow". It was, and the number that
34
+ * made it slow is not the one it looks like: damping 26 against
35
+ * stiffness 140 is a damping RATIO of 1.10 — very slightly OVERDAMPED —
36
+ * so the panel approaches its resting place asymptotically and never
37
+ * visibly arrives.
38
+ *
39
+ * MEASURED on an iPhone 16 Pro simulator with
40
+ * `UML/Working/tools/motionProbe.mjs`, one instrument for both:
41
+ *
42
+ * the platform's own sheet travel over 9 frames / 126ms,
43
+ * (RN `Modal animationType` then STOPPED
44
+ * ="slide"`, which is what
45
+ * `WorkspaceSwitcherSheet`
46
+ * and React Navigation's
47
+ * `slide_from_bottom` present)
48
+ *
49
+ * this sheet, on the old spring travel over 8 frames / 154ms,
50
+ * and STILL MOVING at 437ms
51
+ *
52
+ * ⚠️ THE INITIAL TRAVEL WAS NEVER THE PROBLEM — 154ms against 126ms is
53
+ * nothing. The tail is. The old spring was still creeping a third of a
54
+ * second after it looked finished, and that is what reads as slow.
55
+ *
56
+ * So the shape follows the house and not the library's habit (§5): the
57
+ * platform slides for a fixed time on an ease-out and stops dead, so
58
+ * this does too. 130 is the measured 126 rounded to the nearest 10ms.
59
+ */
60
+ enter: { duration: 130 },
30
61
  exitDuration: 260},
31
62
  // ── Toast ────────────────────────────────────────────────
32
63
  // One element owns the entrance: FadeInUp/FadeInDown animate opacity AND
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/animations/index.ts"],"sourcesContent":["/**\n * ════════════════════════════════════════════════════════════════════════\n * Overlay animation tuning — EDIT THIS FILE TO CONTROL ALL OVERLAY MOTION\n * ════════════════════════════════════════════════════════════════════════\n *\n * Every in/out animation value used by the animated overlay components on\n * React Native (reanimated) lives here. Change a number and it updates\n * everywhere that animation is used — no need to touch the component files.\n *\n * Consumed by (native):\n * • components/overlay/Dialog/index.native.tsx\n * • components/overlay/ConfirmDialog/index.native.tsx\n * • components/overlay/Toast/index.native.tsx\n *\n * Two kinds of value:\n * • spring → reanimated `.springify().damping(d).stiffness(s)` (+ optional `.delay`)\n * - damping ↓ lower = bouncier, longer settle\n * - stiffness ↑ higher = snappier, faster\n * • duration → milliseconds for `.duration(ms)` (timing-based fade/slide)\n */\n\nexport interface ISpringConfig {\n /** reanimated `.damping()` — lower = bouncier / slower to settle. */\n damping: number;\n /** reanimated `.stiffness()` — higher = snappier / faster. */\n stiffness: number;\n /** reanimated `.mass()` — heavier = slower / more inertia. Defaults to 1. */\n mass?: number;\n /** reanimated `.delay()` in ms — wait before the animation starts. */\n delay?: number;\n}\n\nexport interface IOverlayAnimations {\n /**\n * Dimmed backdrop behind every overlay (fade in/out).\n *\n * ⚠️ `exitDuration` is a FLOOR, not the value to pass — read\n * `scrimExitDuration()` below before using it. The dim has to outlast the\n * panel's own exit or the page behind reappears while the panel is still\n * leaving. ⛔ The old wording here said \"the scrim is the panel's PARENT\";\n * that stopped being true of the Dialog on 29 September 2026, and the\n * function's own comment records both the old reason and the new one.\n */\n scrim: { enterDuration: number; exitDuration: number };\n /** Centered Dialog panel (zoom-in spring in, timed zoom-out). */\n dialog: { enter: ISpringConfig; exitDuration: number };\n /** Confirm: centered panel, its floating icon bubble, and the content-only/prompt panel. */\n confirm: { enter: ISpringConfig; icon: ISpringConfig; content: ISpringConfig; exitDuration: number };\n /**\n * Bottom sheet shared by Dialog & Confirm (slide-up spring in, timed\n * slide-down out).\n *\n * `keepMotionWhenReduced` asks Reanimated to run this one even when the\n * reader has iOS \"Reduce Motion\" on — see the note beside the value.\n */\n sheet: { enter: ISpringConfig; exitDuration: number; keepMotionWhenReduced: boolean };\n /** Toast — single merged fade+slide entrance, timed exit, re-layout, keyboard gap. */\n toast: {\n enter: ISpringConfig;\n exitDuration: number;\n layoutDuration: number;\n keyboardGap: number;\n };\n}\n\nexport const overlayAnimations: IOverlayAnimations = {\n // ── Backdrop / scrim ─────────────────────────────────────\n scrim: {\n enterDuration: 120,\n exitDuration: 100,\n },\n\n // ── Centered Dialog panel ────────────────────────────────\n // Enter: critically-ish damped spring — snappy but settles cleanly (no\n // ringing). Exit: timing-based zoom-out (springs are enter-only).\n dialog: {\n enter: { damping: 26, stiffness: 420, mass: 1 },\n exitDuration: 120,\n },\n\n // ── Confirm dialog ───────────────────────────────────────\n confirm: {\n /** Centered confirm panel pop. */\n enter: { damping: 26, stiffness: 420, mass: 1 },\n /** Floating severity-icon bubble — pops in slightly after the panel. */\n icon: { damping: 26, stiffness: 420, mass: 1, delay: 60 },\n /** Content-only / prompt panel (no header/buttons chrome). */\n content: { damping: 26, stiffness: 420, mass: 1 },\n /** Timed zoom-out for the confirm center/content panels. */\n exitDuration: 120,\n },\n\n // ── Bottom sheet (Dialog + Confirm, position=\"bottom\") ───\n // Slightly heavier damping/lower stiffness so the sheet glides up without\n // overshoot. Exit: timed slide-down.\n sheet: {\n enter: { damping: 26, stiffness: 140, mass: 1 },\n exitDuration: 260,\n /*\n * ⛔ REDUCE MOTION TURNS THIS OFF, AND THAT READS AS A FADE. Reanimated\n * honours iOS \"Reduce Motion\" by default: the entering/exiting\n * animation is skipped and the panel simply appears, so the only thing\n * left moving is the scrim's opacity. Measured on an iPhone 16 Pro\n * simulator, sheet top edge per frame at 30fps:\n * Reduce Motion OFF — 1924 → 1302 → 898 → 683 → 655 px\n * Reduce Motion ON — 655 in a single frame\n * That second row is exactly the \"it still fades\" report.\n *\n * A bottom sheet is kept moving because the platform keeps it moving:\n * iOS's own sheets still slide up under Reduce Motion — what that\n * setting removes is parallax and zoom, not the presentation of a\n * sheet. The centred Dialog's ZoomIn and the scrim's fade are NOT\n * overridden; they stay on the system default.\n */\n keepMotionWhenReduced: true,\n },\n\n // ── Toast ────────────────────────────────────────────────\n // One element owns the entrance: FadeInUp/FadeInDown animate opacity AND\n // translateY together, so there is no second concurrent layer to desync.\n toast: {\n /** Merged fade+slide entrance (position-appropriate direction). */\n enter: { damping: 30, stiffness: 400, mass: 1 },\n /** Timed fade+slide out. */\n exitDuration: 120,\n /** Re-positioning when toasts stack/unstack. */\n layoutDuration: 150,\n /** Gap (pt) kept between a bottom toast and the keyboard when it opens. */\n keyboardGap: 8,\n },\n};\n\n/**\n * How long the SCRIM may take to leave, so the dim outlasts the panel.\n *\n * ⛔ THE REASON IS NOW VISUAL, NOT STRUCTURAL — rewritten 29 September 2026 when\n * the Dialog's scrim and panel became siblings. The panel slides down over\n * `sheet.exitDuration` (260ms). If the dim were allowed to finish in\n * `scrim.exitDuration` (100ms), the last 160ms of that slide would play against\n * the undimmed screen behind it: the page reappears at full brightness while a\n * panel is still visibly on its way out. `max()` keeps the dim present until the\n * panel is off screen.\n *\n * THE TWO NUMBERS, so neither is a bare literal: `scrim.exitDuration` is 100ms —\n * the fade's own pace, and the floor. `sheet.exitDuration` is 260ms and\n * `dialog.exitDuration` is 120ms. So the sheet gets 260 and the centred dialog\n * gets 120; in both cases the panel's own duration wins, and the floor only\n * matters if a caller ever passes something shorter than 100.\n *\n * ── ✅ AND THE FAULT THIS FUNCTION WAS ORIGINALLY WRITTEN FOR IS FIXED ───────\n *\n * It used to exist because the scrim was the panel's PARENT: React unmounts a\n * subtree as one thing, so when the parent's exiting animation reported finished\n * the child was removed wherever its own animation happened to be. A 260ms slide\n * under a 100ms fade did not play for 260ms — it played for 100 and the sheet was\n * simply gone.\n *\n * ⚠️ THE MEASUREMENT IS KEPT, because it is the evidence and a fix that erases\n * its own evidence leaves nothing for the next reader (§12.5). iPhone 16 Pro\n * simulator, 30fps, closing the bottom sheet. The flags inside the sheet are the\n * only saturated pixels on screen, so their y is the sheet's own edge and not the\n * screen's:\n *\n * frame flag y (of 348) sheet white scrim\n * 125 140 237 143 settled\n * 126 143 240 149 starts down\n * 127 197 253 192 54 units travelled\n * 128 gone — 234 removed\n *\n * Three frames. The sheet covered a sixth of its travel and vanished while the\n * scrim faded normally — which is exactly the report that the overlay fades and\n * the sheet does not move.\n *\n * ⚠️ IT WAS INVISIBLE TO THE OBVIOUS MEASUREMENT. A scan for the topmost bright\n * row could not tell a sheet edge at y=655 from the page behind it at y=655; both\n * read white. Only a feature that exists ONLY inside the sheet could say which was\n * on screen.\n *\n * ⛔ THE DIALOG NO LONGER HAS THAT CONTAINMENT. Its panel is a sibling of the\n * scrim and owns the teardown — the Modal unmounts on the PANEL's exit callback,\n * so a scrim that finishes first can no longer take the panel with it.\n * ⚠️ `ConfirmDialog` still nests its panel inside its scrim and therefore still\n * depends on this function for the original reason as well as the visual one.\n * Converting it is a separate unit.\n */\nexport function scrimExitDuration(panelExitDuration: number): number {\n return Math.max(overlayAnimations.scrim.exitDuration, panelExitDuration);\n}\n\nexport default overlayAnimations;\n"],"names":[],"mappings":"AAiEO,MAAM,iBAAA,GAAwC;AAAA;AAAA,EAEjD,KAAA,EAAO;AAAA,IACH,aAAA,EAAe,GAAA;AAAA,IACf,YAAA,EAAc;AAAA,GAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,EAAQ;AAAA,IACJ,OAAO,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,IAC9C,YAAA,EAAc;AAAA,GAClB;AAAA;AAAA,EAGA,OAAA,EAAS;AAAA;AAAA,IAEL,OAAO,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA;AAAA,IAE9C,IAAA,EAAM,EAAE,OAAA,EAAS,EAAA,EAAI,WAAW,GAAA,EAAK,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,EAAA,EAAG;AAAA;AAAA,IAExD,SAAS,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA;AAAA,IAEhD,YAAA,EAAc;AAAA,GAClB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,EAAO;AAAA,IACH,OAAO,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,IAC9C,YAAA,EAAc,GAkBlB,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,EAAO;AAAA;AAAA,IAEH,OAAO,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA;AAAA,IAE9C,YAAA,EAAc,GAAA;AAAA;AAAA,IAEd,cAAA,EAAgB,GAAA;AAAA;AAAA,IAEhB,WAAA,EAAa;AAAA;AAErB;AAuDO,SAAS,kBAAkB,iBAAA,EAAmC;AACjE,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,iBAAA,CAAkB,KAAA,CAAM,cAAc,iBAAiB,CAAA;AAC3E;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/animations/index.ts"],"sourcesContent":["/**\n * ════════════════════════════════════════════════════════════════════════\n * Overlay animation tuning — EDIT THIS FILE TO CONTROL ALL OVERLAY MOTION\n * ════════════════════════════════════════════════════════════════════════\n *\n * Every in/out animation value used by the animated overlay components on\n * React Native (reanimated) lives here. Change a number and it updates\n * everywhere that animation is used — no need to touch the component files.\n *\n * Consumed by (native):\n * • components/overlay/Dialog/index.native.tsx\n * • components/overlay/ConfirmDialog/index.native.tsx\n * • components/overlay/Toast/index.native.tsx\n *\n * Two kinds of value:\n * • spring → reanimated `.springify().damping(d).stiffness(s)` (+ optional `.delay`)\n * - damping ↓ lower = bouncier, longer settle\n * - stiffness ↑ higher = snappier, faster\n * • duration → milliseconds for `.duration(ms)` (timing-based fade/slide)\n */\n\nexport interface ISpringConfig {\n /** reanimated `.damping()` — lower = bouncier / slower to settle. */\n damping: number;\n /** reanimated `.stiffness()` — higher = snappier / faster. */\n stiffness: number;\n /** reanimated `.mass()` — heavier = slower / more inertia. Defaults to 1. */\n mass?: number;\n /** reanimated `.delay()` in ms — wait before the animation starts. */\n delay?: number;\n}\n\nexport interface IOverlayAnimations {\n /**\n * Dimmed backdrop behind every overlay (fade in/out).\n *\n * ⚠️ `exitDuration` is a FLOOR, not the value to pass — read\n * `scrimExitDuration()` below before using it. The dim has to outlast the\n * panel's own exit or the page behind reappears while the panel is still\n * leaving. ⛔ The old wording here said \"the scrim is the panel's PARENT\";\n * that stopped being true of the Dialog on 29 September 2026, and the\n * function's own comment records both the old reason and the new one.\n */\n scrim: { enterDuration: number; exitDuration: number };\n /** Centered Dialog panel (zoom-in spring in, timed zoom-out). */\n dialog: { enter: ISpringConfig; exitDuration: number };\n /** Confirm: centered panel, its floating icon bubble, and the content-only/prompt panel. */\n confirm: { enter: ISpringConfig; icon: ISpringConfig; content: ISpringConfig; exitDuration: number };\n /**\n * Bottom sheet shared by Dialog & Confirm (slide-up spring in, timed\n * slide-down out).\n *\n * `keepMotionWhenReduced` asks Reanimated to run this one even when the\n * reader has iOS \"Reduce Motion\" on — see the note beside the value.\n */\n sheet: {\n /**\n * ⛔ THE ENTRANCE IS A DURATION NOW, NOT A SPRING — 30 September 2026.\n * See the value below for the measurement that decided it.\n */\n /**\n * ⛔ CARRIES BOTH, AND THE `duration` IS THE ONE THAT DRIVES THIS LIBRARY.\n *\n * `duration` is what `sheetMotion.native.ts` uses — see the value below\n * for the measurement that set it.\n *\n * ⚠️ THE SPRING FIELDS STAY, AND NOT OUT OF TIDINESS. A consumer drives\n * its own animation off them: `App/src/components/shared/ConfirmSheet`\n * reads `.damping/.stiffness/.mass` into RN's own `Animated.spring`,\n * deliberately, because importing Reanimated there dragged its native\n * chain into every suite that mounts it. Deleting them would break that\n * sheet silently.\n * ⛔ SO THAT ONE SHEET IS NOW OUT OF STEP, AND THAT IS A DEBT. It still\n * rises on the slow spring every other sheet just moved off. Named here\n * rather than found later.\n *\n * ⚠️ Keeping both on ONE object is also what leaves `Dialog` and\n * `ConfirmDialog` untouched: both already pass `anim.sheet.enter`, and\n * they still do.\n */\n enter: ISpringConfig & {duration: number};\n exitDuration: number;\n keepMotionWhenReduced: boolean;\n };\n /** Toast — single merged fade+slide entrance, timed exit, re-layout, keyboard gap. */\n toast: {\n enter: ISpringConfig;\n exitDuration: number;\n layoutDuration: number;\n keyboardGap: number;\n };\n}\n\nexport const overlayAnimations: IOverlayAnimations = {\n // ── Backdrop / scrim ─────────────────────────────────────\n scrim: {\n enterDuration: 120,\n exitDuration: 100,\n },\n\n // ── Centered Dialog panel ────────────────────────────────\n // Enter: critically-ish damped spring — snappy but settles cleanly (no\n // ringing). Exit: timing-based zoom-out (springs are enter-only).\n dialog: {\n enter: { damping: 26, stiffness: 420, mass: 1 },\n exitDuration: 120,\n },\n\n // ── Confirm dialog ───────────────────────────────────────\n confirm: {\n /** Centered confirm panel pop. */\n enter: { damping: 26, stiffness: 420, mass: 1 },\n /** Floating severity-icon bubble — pops in slightly after the panel. */\n icon: { damping: 26, stiffness: 420, mass: 1, delay: 60 },\n /** Content-only / prompt panel (no header/buttons chrome). */\n content: { damping: 26, stiffness: 420, mass: 1 },\n /** Timed zoom-out for the confirm center/content panels. */\n exitDuration: 120,\n },\n\n // ── Bottom sheet (Dialog + Confirm, position=\"bottom\") ───\n // Slightly heavier damping/lower stiffness so the sheet glides up without\n // overshoot. Exit: timed slide-down.\n sheet: {\n /*\n * ⛔ 130ms, MEASURED OFF THE PLATFORM'S OWN SHEET — not chosen by feel.\n *\n * The entrance was `{damping: 26, stiffness: 140, mass: 1}`, and Fouad's\n * note on the select popup was \"too slow\". It was, and the number that\n * made it slow is not the one it looks like: damping 26 against\n * stiffness 140 is a damping RATIO of 1.10 — very slightly OVERDAMPED —\n * so the panel approaches its resting place asymptotically and never\n * visibly arrives.\n *\n * MEASURED on an iPhone 16 Pro simulator with\n * `UML/Working/tools/motionProbe.mjs`, one instrument for both:\n *\n * the platform's own sheet travel over 9 frames / 126ms,\n * (RN `Modal animationType` then STOPPED\n * =\"slide\"`, which is what\n * `WorkspaceSwitcherSheet`\n * and React Navigation's\n * `slide_from_bottom` present)\n *\n * this sheet, on the old spring travel over 8 frames / 154ms,\n * and STILL MOVING at 437ms\n *\n * ⚠️ THE INITIAL TRAVEL WAS NEVER THE PROBLEM — 154ms against 126ms is\n * nothing. The tail is. The old spring was still creeping a third of a\n * second after it looked finished, and that is what reads as slow.\n *\n * So the shape follows the house and not the library's habit (§5): the\n * platform slides for a fixed time on an ease-out and stops dead, so\n * this does too. 130 is the measured 126 rounded to the nearest 10ms.\n */\n enter: { damping: 26, stiffness: 140, mass: 1, duration: 130 },\n exitDuration: 260,\n /*\n * ⛔ REDUCE MOTION TURNS THIS OFF, AND THAT READS AS A FADE. Reanimated\n * honours iOS \"Reduce Motion\" by default: the entering/exiting\n * animation is skipped and the panel simply appears, so the only thing\n * left moving is the scrim's opacity. Measured on an iPhone 16 Pro\n * simulator, sheet top edge per frame at 30fps:\n * Reduce Motion OFF — 1924 → 1302 → 898 → 683 → 655 px\n * Reduce Motion ON — 655 in a single frame\n * That second row is exactly the \"it still fades\" report.\n *\n * A bottom sheet is kept moving because the platform keeps it moving:\n * iOS's own sheets still slide up under Reduce Motion — what that\n * setting removes is parallax and zoom, not the presentation of a\n * sheet. The centred Dialog's ZoomIn and the scrim's fade are NOT\n * overridden; they stay on the system default.\n */\n keepMotionWhenReduced: true,\n },\n\n // ── Toast ────────────────────────────────────────────────\n // One element owns the entrance: FadeInUp/FadeInDown animate opacity AND\n // translateY together, so there is no second concurrent layer to desync.\n toast: {\n /** Merged fade+slide entrance (position-appropriate direction). */\n enter: { damping: 30, stiffness: 400, mass: 1 },\n /** Timed fade+slide out. */\n exitDuration: 120,\n /** Re-positioning when toasts stack/unstack. */\n layoutDuration: 150,\n /** Gap (pt) kept between a bottom toast and the keyboard when it opens. */\n keyboardGap: 8,\n },\n};\n\n/**\n * How long the SCRIM may take to leave, so the dim outlasts the panel.\n *\n * ⛔ THE REASON IS NOW VISUAL, NOT STRUCTURAL — rewritten 29 September 2026 when\n * the Dialog's scrim and panel became siblings. The panel slides down over\n * `sheet.exitDuration` (260ms). If the dim were allowed to finish in\n * `scrim.exitDuration` (100ms), the last 160ms of that slide would play against\n * the undimmed screen behind it: the page reappears at full brightness while a\n * panel is still visibly on its way out. `max()` keeps the dim present until the\n * panel is off screen.\n *\n * THE TWO NUMBERS, so neither is a bare literal: `scrim.exitDuration` is 100ms —\n * the fade's own pace, and the floor. `sheet.exitDuration` is 260ms and\n * `dialog.exitDuration` is 120ms. So the sheet gets 260 and the centred dialog\n * gets 120; in both cases the panel's own duration wins, and the floor only\n * matters if a caller ever passes something shorter than 100.\n *\n * ── ✅ AND THE FAULT THIS FUNCTION WAS ORIGINALLY WRITTEN FOR IS FIXED ───────\n *\n * It used to exist because the scrim was the panel's PARENT: React unmounts a\n * subtree as one thing, so when the parent's exiting animation reported finished\n * the child was removed wherever its own animation happened to be. A 260ms slide\n * under a 100ms fade did not play for 260ms — it played for 100 and the sheet was\n * simply gone.\n *\n * ⚠️ THE MEASUREMENT IS KEPT, because it is the evidence and a fix that erases\n * its own evidence leaves nothing for the next reader (§12.5). iPhone 16 Pro\n * simulator, 30fps, closing the bottom sheet. The flags inside the sheet are the\n * only saturated pixels on screen, so their y is the sheet's own edge and not the\n * screen's:\n *\n * frame flag y (of 348) sheet white scrim\n * 125 140 237 143 settled\n * 126 143 240 149 starts down\n * 127 197 253 192 54 units travelled\n * 128 gone — 234 removed\n *\n * Three frames. The sheet covered a sixth of its travel and vanished while the\n * scrim faded normally — which is exactly the report that the overlay fades and\n * the sheet does not move.\n *\n * ⚠️ IT WAS INVISIBLE TO THE OBVIOUS MEASUREMENT. A scan for the topmost bright\n * row could not tell a sheet edge at y=655 from the page behind it at y=655; both\n * read white. Only a feature that exists ONLY inside the sheet could say which was\n * on screen.\n *\n * ⛔ THE DIALOG NO LONGER HAS THAT CONTAINMENT. Its panel is a sibling of the\n * scrim and owns the teardown — the Modal unmounts on the PANEL's exit callback,\n * so a scrim that finishes first can no longer take the panel with it.\n * ⚠️ `ConfirmDialog` still nests its panel inside its scrim and therefore still\n * depends on this function for the original reason as well as the visual one.\n * Converting it is a separate unit.\n */\nexport function scrimExitDuration(panelExitDuration: number): number {\n return Math.max(overlayAnimations.scrim.exitDuration, panelExitDuration);\n}\n\nexport default overlayAnimations;\n"],"names":[],"mappings":"AA6FO,MAAM,iBAAA,GAAwC;AAAA;AAAA,EAEjD,KAAA,EAAO;AAAA,IACH,aAAA,EAAe,GAAA;AAAA,IACf,YAAA,EAAc;AAAA,GAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,EAAQ;AAAA,IACJ,OAAO,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,IAC9C,YAAA,EAAc;AAAA,GAClB;AAAA;AAAA,EAGA,OAAA,EAAS;AAAA;AAAA,IAEL,OAAO,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA;AAAA,IAE9C,IAAA,EAAM,EAAE,OAAA,EAAS,EAAA,EAAI,WAAW,GAAA,EAAK,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,EAAA,EAAG;AAAA;AAAA,IAExD,SAAS,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA;AAAA,IAEhD,YAAA,EAAc;AAAA,GAClB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgCH,KAAA,EAAO,EAAwC,QAAA,EAAU,GAAA,EAAI;AAAA,IAC7D,YAAA,EAAc,GAkBlB,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,EAAO;AAAA;AAAA,IAEH,OAAO,EAAE,OAAA,EAAS,IAAI,SAAA,EAAW,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA;AAAA,IAE9C,YAAA,EAAc,GAAA;AAAA;AAAA,IAEd,cAAA,EAAgB,GAAA;AAAA;AAAA,IAEhB,WAAA,EAAa;AAAA;AAErB;AAuDO,SAAS,kBAAkB,iBAAA,EAAmC;AACjE,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,iBAAA,CAAkB,KAAA,CAAM,cAAc,iBAAiB,CAAA;AAC3E;;;;"}
@@ -11,6 +11,7 @@ var useSeverityColors = require('../../../hooks/useSeverityColors.cjs');
11
11
  require('../../../contexts/DialogContext.cjs');
12
12
  var useResolvedStyle = require('../../../hooks/useResolvedStyle.cjs');
13
13
  var index = require('../../../animations/index.cjs');
14
+ var sheetMotion_native = require('../sheetMotion.cjs');
14
15
  var KitsThemeProvider_native = require('../../../contexts/Theme/KitsThemeProvider.cjs');
15
16
  var index_native = require('../../../primitives/Text/index.cjs');
16
17
  var index_native$1 = require('../../../primitives/Icon/index.cjs');
@@ -150,11 +151,8 @@ function KitsConfirm(props) {
150
151
  /* @__PURE__ */ jsxRuntime.jsxs(
151
152
  Animated.View,
152
153
  {
153
- entering: Animated.SlideInDown.springify().damping(index.overlayAnimations.sheet.enter.damping).stiffness(index.overlayAnimations.sheet.enter.stiffness).mass(index.overlayAnimations.sheet.enter.mass),
154
- exiting: Animated.SlideOutDown.duration(index.overlayAnimations.sheet.exitDuration).easing(Animated.Easing.in(Animated.Easing.ease)).withCallback((finished) => {
155
- "worklet";
156
- if (finished) Animated.runOnJS(handleExitFinished)();
157
- }),
154
+ entering: sheetMotion_native.sheetEnter(index.overlayAnimations.sheet.enter),
155
+ exiting: sheetMotion_native.sheetExit(index.overlayAnimations.sheet.exitDuration, handleExitFinished),
158
156
  style: [
159
157
  styles.sheetPanel,
160
158
  { backgroundColor: panelBg, paddingBottom: 24 + insets.bottom },
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../../src/components/overlay/ConfirmDialog/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Modal, Pressable, StyleSheet, View} from \"react-native\";\nimport Animated, {Easing, FadeIn, FadeOut, runOnJS, SlideInDown, SlideOutDown, ZoomIn, ZoomOut} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Icon, Text} from \"../../../_compat\";\nimport type {IConfirmDialogProps} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {useSeverityColors, useAllSeverityColors} from \"../../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../../hooks\";\nimport {overlayAnimations as anim, scrimExitDuration} from \"../../../animations\";\n\n/**\n * Keeps the RN Modal mounted through the exit animation. `visible` drives the\n * inner scrim + panel entering/exiting; the Modal itself stays mounted until\n * the panel's exit animation reports finished, then unmounts.\n *\n * Re-entrancy: a new `visible=true` during an exit cancels the panel's exit\n * (reanimated reports `finished=false`, so the unmount is skipped) and the\n * inner re-enters cleanly; `visibleRef` is a second guard for the case where\n * the exit had already completed.\n */\nfunction useOverlayPresence(visible: boolean) {\n const [mounted, setMounted] = React.useState(visible);\n const visibleRef = React.useRef(visible);\n React.useEffect(() => {\n visibleRef.current = visible;\n if (visible) setMounted(true);\n }, [visible]);\n // Runs on the JS thread (dispatched via runOnJS from the exit worklet).\n const handleExitFinished = React.useCallback(() => {\n if (!visibleRef.current) setMounted(false);\n }, []);\n return {mounted, handleExitFinished};\n}\n\nexport default function KitsConfirm(props: IConfirmDialogProps) {\n const {\n visible,\n header,\n message,\n icon,\n type = \"secondary\",\n accept,\n reject,\n acceptLabel = \"Accept\",\n rejectLabel = \"Reject\",\n buttons,\n headless,\n defaultUI,\n async: asyncMode,\n onHide,\n content,\n children,\n position = \"center\",\n style,\n contentStyle,\n headerStyle,\n maskStyle,\n // LEGIT-PLATFORM-ONLY (web): acceptIcon/rejectIcon take PrimeReact\n // icon classes ('pi pi-*') with no native rendering path — use the\n // `buttons` array for custom native actions. acceptClassName/\n // rejectClassName are CSS classes; appendTo is a DOM portal target.\n ...rest\n } = props;\n\n const {resolveToken, theme} = useKitsTheme();\n const colors = useSeverityColors(type);\n const allColors = useAllSeverityColors();\n const insets = useSafeAreaInsets();\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const subtextColor = resolveToken('gray.500');\n const grabberColor = resolveToken('gray.300');\n // Scrim via the literal alpha overlay token → rgba(0,0,0,0.4) in both modes.\n const scrimColor = resolveToken('black-alpha-40');\n const brandLogo = type === 'brand' ? theme.config.logo : null;\n\n const resolvedStyle = useResolvedStyle(style || {});\n const resolvedContentStyle = useResolvedStyle(contentStyle || {});\n const resolvedHeaderStyle = useResolvedStyle(headerStyle || {});\n const resolvedMaskStyle = useResolvedStyle(maskStyle || {});\n\n const {mounted, handleExitFinished} = useOverlayPresence(!!visible);\n if (!mounted) return null;\n\n const isSheet = position === 'bottom';\n const hide = () => onHide?.('hide');\n\n const doClick = async (callback?: () => void) => {\n if (asyncMode) {\n await callback?.();\n hide();\n } else {\n hide();\n callback?.();\n }\n };\n\n const showIcon = icon != null || brandLogo != null;\n // Panel always uses surface-card. Severity (danger/success/...) only colours\n // the icon bubble and the action button — not the whole panel — otherwise\n // a danger confirm renders as a red wash with the underlying screen\n // bleeding through.\n const panelBg = surfaceColor;\n\n // Shared action row. `stretch` makes each button flex:1 (bottom-sheet,\n // full-width). The default accept/reject pair is ordered accept-first in the\n // centered card but reject-first (Cancel | Confirm) in the sheet, matching\n // the platform-native bottom-sheet convention.\n const renderActions = (stretch: boolean) => {\n if (buttons?.length) {\n return (\n <View style={styles.buttonRow}>\n {buttons.map((b, i) => {\n const btnColor = allColors[b.type ?? type]?.solid ?? colors.solid;\n return (\n <Pressable\n key={i}\n disabled={b.disabled}\n style={[\n styles.actionBtn,\n stretch && styles.actionBtnSheet,\n stretch && {flex: 1},\n b.outlined\n ? {backgroundColor: \"transparent\", borderColor: btnColor, borderWidth: 1.5}\n : {backgroundColor: btnColor},\n b.rounded && {borderRadius: 999},\n b.disabled && {opacity: 0.5},\n ]}\n onPress={() => b.onClick(hide, accept, reject)}\n >\n <Text style={{\n color: b.outlined ? btnColor : \"#fff\",\n fontWeight: \"600\",\n fontSize: 14,\n }}>\n {b.title}\n </Text>\n </Pressable>\n );\n })}\n </View>\n );\n }\n\n const acceptBtn = (\n <Pressable\n key=\"accept\"\n style={[styles.actionBtn, stretch && styles.actionBtnSheet, {backgroundColor: colors.solid, flex: 1}]}\n onPress={() => doClick(accept)}\n >\n <Text style={styles.btnTextPrimary}>{acceptLabel}</Text>\n </Pressable>\n );\n const rejectBtn = !defaultUI ? (\n <Pressable\n key=\"reject\"\n style={[styles.actionBtn, styles.actionBtnOutlined, stretch && styles.actionBtnSheet, {borderColor: colors.solid, flex: 1}]}\n onPress={() => doClick(reject)}\n >\n <Text style={[styles.btnTextOutlined, {color: colors.solid}]}>{rejectLabel}</Text>\n </Pressable>\n ) : null;\n\n return (\n <View style={styles.buttonRow}>\n {stretch ? <>{rejectBtn}{acceptBtn}</> : <>{acceptBtn}{rejectBtn}</>}\n </View>\n );\n };\n\n // ── Bottom sheet ────────────────────────────────────────\n if (isSheet) {\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the sheet — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.sheet.exitDuration))}\n style={[styles.sheetOverlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n <Animated.View\n entering={SlideInDown.springify().damping(anim.sheet.enter.damping).stiffness(anim.sheet.enter.stiffness).mass(anim.sheet.enter.mass ?? 1)}\n exiting={SlideOutDown.duration(anim.sheet.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.sheetPanel,\n {backgroundColor: panelBg, paddingBottom: 24 + insets.bottom},\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {/* Grabber */}\n <View style={[styles.grabber, {backgroundColor: grabberColor}]}/>\n\n {/* Header */}\n {header != null && (\n <Text style={[styles.sheetHeader, {color: textColor}, resolvedHeaderStyle as any]}>\n {header as React.ReactNode}\n </Text>\n )}\n\n {/* Message */}\n {message != null && (\n <Text style={[styles.sheetMessage, {color: subtextColor}]}>\n {message as React.ReactNode}\n </Text>\n )}\n\n {/* Injected item / extra content */}\n {children}\n\n {/* Actions */}\n {renderActions(true)}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n }\n\n // ── Content-only mode (prompt) ──────────────────────────\n if (content) {\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the centred panel — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.confirm.exitDuration))}\n style={[styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.content.damping).stiffness(anim.confirm.content.stiffness).mass(anim.confirm.content.mass ?? 1)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n {backgroundColor: surfaceColor, minWidth: 250, maxWidth: 380},\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {content as React.ReactNode}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n }\n\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the centred panel — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.confirm.exitDuration))}\n style={[styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n\n {/* Card + icon stack: icon sits above the card */}\n <View style={styles.cardStack}>\n {/* Soft-circle icon bubble */}\n {showIcon && (\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.icon.damping).stiffness(anim.confirm.icon.stiffness).mass(anim.confirm.icon.mass ?? 1).delay(anim.confirm.icon.delay ?? 0)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease))}\n style={[styles.iconBubble, {backgroundColor: colors.iconBg}]}\n >\n {brandLogo ? brandLogo : typeof icon === \"string\" ? (\n <Icon name={icon as never} size={'xl'} color={colors.iconFg}/>\n ) : (\n icon\n )}\n </Animated.View>\n )}\n\n {/* Panel */}\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.enter.damping).stiffness(anim.confirm.enter.stiffness).mass(anim.confirm.enter.mass ?? 1)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n {\n backgroundColor: panelBg,\n paddingTop: showIcon ? 48 : 24,\n gap: 10,\n },\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {/* Close button */}\n <Pressable style={styles.closeBtn} onPress={hide} hitSlop={12}>\n <Text style={{fontSize: 18, color: subtextColor}}>✕</Text>\n </Pressable>\n\n {/* Header */}\n {header != null && (\n <Text style={[styles.header, {color: textColor}, resolvedHeaderStyle as any]}>\n {header as React.ReactNode}\n </Text>\n )}\n\n {/* Message */}\n {message != null && (\n <Text style={[styles.message, {color: subtextColor}]}>\n {message as React.ReactNode}\n </Text>\n )}\n\n {/* Children */}\n {children}\n\n {/* Buttons */}\n {renderActions(false)}\n </Animated.View>\n </View>\n </Animated.View>\n )}\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 28,\n },\n sheetOverlay: {\n flex: 1,\n justifyContent: \"flex-end\",\n },\n sheetPanel: {\n // 24 == radii.2xl, top corners only (bottom stays square).\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 24,\n paddingTop: 10,\n gap: 14,\n // Subtle elevation (upward for a sheet): low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: -2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n },\n grabber: {\n width: 40,\n height: 5,\n borderRadius: 999,\n alignSelf: \"center\",\n marginBottom: 6,\n },\n sheetHeader: {\n fontSize: 24,\n fontWeight: \"700\",\n textAlign: \"left\",\n },\n sheetMessage: {\n fontSize: 15,\n lineHeight: 22,\n textAlign: \"left\",\n },\n cardStack: {\n minWidth: 250,\n maxWidth: 380,\n alignItems: \"center\",\n },\n iconBubble: {\n width: 72,\n height: 72,\n borderRadius: 36,\n justifyContent: \"center\",\n alignItems: \"center\",\n zIndex: 2,\n marginBottom: -36,\n elevation: 8,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 4},\n shadowOpacity: 0.15,\n shadowRadius: 8,\n },\n panel: {\n alignSelf: \"stretch\",\n // 20 == radii.xl. Side padding (24) == bottom padding (24) for even rhythm.\n borderRadius: 20,\n paddingHorizontal: 24,\n paddingBottom: 24,\n // Subtle elevation: low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n alignItems: \"center\",\n },\n closeBtn: {\n position: \"absolute\",\n top: 12,\n right: 14,\n zIndex: 3,\n },\n header: {\n fontSize: 22,\n fontWeight: \"700\",\n textAlign: \"center\",\n marginBottom: 8,\n },\n message: {\n fontSize: 14,\n textAlign: \"center\",\n lineHeight: 20,\n // Tightened so top/bottom whitespace around the actions reads balanced.\n marginBottom: 16,\n },\n buttonRow: {\n flexDirection: \"row\",\n justifyContent: \"center\",\n gap: 12,\n width: \"100%\",\n },\n actionBtn: {\n paddingVertical: 12,\n paddingHorizontal: 24,\n // Pill (== radii.pill). Buttons here are raw Pressables, not kits Button,\n // so the pill comes from borderRadius — the pattern the `buttons` array\n // path (`b.rounded && {borderRadius: 999}`) already uses in this file.\n borderRadius: 999,\n minWidth: 100,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n // Taller buttons for the bottom-sheet action row (pill shape shared).\n actionBtnSheet: {\n paddingVertical: 16,\n borderRadius: 999,\n },\n actionBtnOutlined: {\n backgroundColor: \"transparent\",\n borderWidth: 1.5,\n },\n btnTextPrimary: {\n color: \"#fff\",\n fontWeight: \"600\",\n fontSize: 14,\n },\n btnTextOutlined: {\n fontWeight: \"600\",\n fontSize: 14,\n },\n});\n"],"names":["useKitsTheme","useSeverityColors","useAllSeverityColors","useSafeAreaInsets","useResolvedStyle","jsx","View","Pressable","Text","jsxs","Fragment","Modal","FadeIn","anim","FadeOut","scrimExitDuration","StyleSheet","SlideInDown","SlideOutDown","Easing","runOnJS","ZoomIn","ZoomOut","Icon"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../../src/components/overlay/ConfirmDialog/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Modal, Pressable, StyleSheet, View} from \"react-native\";\nimport Animated, {Easing, FadeIn, FadeOut, runOnJS, ZoomIn, ZoomOut} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Icon, Text} from \"../../../_compat\";\nimport type {IConfirmDialogProps} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {useSeverityColors, useAllSeverityColors} from \"../../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../../hooks\";\nimport {overlayAnimations as anim, scrimExitDuration} from \"../../../animations\";\nimport {sheetEnter, sheetExit} from \"../sheetMotion\";\n\n/**\n * Keeps the RN Modal mounted through the exit animation. `visible` drives the\n * inner scrim + panel entering/exiting; the Modal itself stays mounted until\n * the panel's exit animation reports finished, then unmounts.\n *\n * Re-entrancy: a new `visible=true` during an exit cancels the panel's exit\n * (reanimated reports `finished=false`, so the unmount is skipped) and the\n * inner re-enters cleanly; `visibleRef` is a second guard for the case where\n * the exit had already completed.\n */\nfunction useOverlayPresence(visible: boolean) {\n const [mounted, setMounted] = React.useState(visible);\n const visibleRef = React.useRef(visible);\n React.useEffect(() => {\n visibleRef.current = visible;\n if (visible) setMounted(true);\n }, [visible]);\n // Runs on the JS thread (dispatched via runOnJS from the exit worklet).\n const handleExitFinished = React.useCallback(() => {\n if (!visibleRef.current) setMounted(false);\n }, []);\n return {mounted, handleExitFinished};\n}\n\nexport default function KitsConfirm(props: IConfirmDialogProps) {\n const {\n visible,\n header,\n message,\n icon,\n type = \"secondary\",\n accept,\n reject,\n acceptLabel = \"Accept\",\n rejectLabel = \"Reject\",\n buttons,\n headless,\n defaultUI,\n async: asyncMode,\n onHide,\n content,\n children,\n position = \"center\",\n style,\n contentStyle,\n headerStyle,\n maskStyle,\n // LEGIT-PLATFORM-ONLY (web): acceptIcon/rejectIcon take PrimeReact\n // icon classes ('pi pi-*') with no native rendering path — use the\n // `buttons` array for custom native actions. acceptClassName/\n // rejectClassName are CSS classes; appendTo is a DOM portal target.\n ...rest\n } = props;\n\n const {resolveToken, theme} = useKitsTheme();\n const colors = useSeverityColors(type);\n const allColors = useAllSeverityColors();\n const insets = useSafeAreaInsets();\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const subtextColor = resolveToken('gray.500');\n const grabberColor = resolveToken('gray.300');\n // Scrim via the literal alpha overlay token → rgba(0,0,0,0.4) in both modes.\n const scrimColor = resolveToken('black-alpha-40');\n const brandLogo = type === 'brand' ? theme.config.logo : null;\n\n const resolvedStyle = useResolvedStyle(style || {});\n const resolvedContentStyle = useResolvedStyle(contentStyle || {});\n const resolvedHeaderStyle = useResolvedStyle(headerStyle || {});\n const resolvedMaskStyle = useResolvedStyle(maskStyle || {});\n\n const {mounted, handleExitFinished} = useOverlayPresence(!!visible);\n if (!mounted) return null;\n\n const isSheet = position === 'bottom';\n const hide = () => onHide?.('hide');\n\n const doClick = async (callback?: () => void) => {\n if (asyncMode) {\n await callback?.();\n hide();\n } else {\n hide();\n callback?.();\n }\n };\n\n const showIcon = icon != null || brandLogo != null;\n // Panel always uses surface-card. Severity (danger/success/...) only colours\n // the icon bubble and the action button — not the whole panel — otherwise\n // a danger confirm renders as a red wash with the underlying screen\n // bleeding through.\n const panelBg = surfaceColor;\n\n // Shared action row. `stretch` makes each button flex:1 (bottom-sheet,\n // full-width). The default accept/reject pair is ordered accept-first in the\n // centered card but reject-first (Cancel | Confirm) in the sheet, matching\n // the platform-native bottom-sheet convention.\n const renderActions = (stretch: boolean) => {\n if (buttons?.length) {\n return (\n <View style={styles.buttonRow}>\n {buttons.map((b, i) => {\n const btnColor = allColors[b.type ?? type]?.solid ?? colors.solid;\n return (\n <Pressable\n key={i}\n disabled={b.disabled}\n style={[\n styles.actionBtn,\n stretch && styles.actionBtnSheet,\n stretch && {flex: 1},\n b.outlined\n ? {backgroundColor: \"transparent\", borderColor: btnColor, borderWidth: 1.5}\n : {backgroundColor: btnColor},\n b.rounded && {borderRadius: 999},\n b.disabled && {opacity: 0.5},\n ]}\n onPress={() => b.onClick(hide, accept, reject)}\n >\n <Text style={{\n color: b.outlined ? btnColor : \"#fff\",\n fontWeight: \"600\",\n fontSize: 14,\n }}>\n {b.title}\n </Text>\n </Pressable>\n );\n })}\n </View>\n );\n }\n\n const acceptBtn = (\n <Pressable\n key=\"accept\"\n style={[styles.actionBtn, stretch && styles.actionBtnSheet, {backgroundColor: colors.solid, flex: 1}]}\n onPress={() => doClick(accept)}\n >\n <Text style={styles.btnTextPrimary}>{acceptLabel}</Text>\n </Pressable>\n );\n const rejectBtn = !defaultUI ? (\n <Pressable\n key=\"reject\"\n style={[styles.actionBtn, styles.actionBtnOutlined, stretch && styles.actionBtnSheet, {borderColor: colors.solid, flex: 1}]}\n onPress={() => doClick(reject)}\n >\n <Text style={[styles.btnTextOutlined, {color: colors.solid}]}>{rejectLabel}</Text>\n </Pressable>\n ) : null;\n\n return (\n <View style={styles.buttonRow}>\n {stretch ? <>{rejectBtn}{acceptBtn}</> : <>{acceptBtn}{rejectBtn}</>}\n </View>\n );\n };\n\n // ── Bottom sheet ────────────────────────────────────────\n if (isSheet) {\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the sheet — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.sheet.exitDuration))}\n style={[styles.sheetOverlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n <Animated.View\n /* ⛔ THE SAME FAULT AS `Dialog`'s SHEET, AND THE SAME ANSWER —\n see `../sheetMotion`. `SlideInDown` takes its travel from\n the window, and inside an RN `Modal` the window it measures\n is not the screen, so the panel is placed at rest on frame\n one. Measured on the Dialog, 30 September 2026; this file\n has the identical shape, so it takes the identical fix\n rather than a second one (§5).\n ⚠️ AND THIS FILE IS NOT YET WHOLE. Its panel is still a\n CHILD of the scrim above, so it still inherits the scrim's\n fade — the defect `Dialog` had corrected on 29 September and\n that was recorded then as this file's own next unit. The\n sheet will now slide AND fade here. That is better than not\n sliding, and it is still not the ruled motion. Not fixed in\n this unit, and not left unsaid. */\n entering={sheetEnter(anim.sheet.enter)}\n exiting={sheetExit(anim.sheet.exitDuration, handleExitFinished)}\n style={[\n styles.sheetPanel,\n {backgroundColor: panelBg, paddingBottom: 24 + insets.bottom},\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {/* Grabber */}\n <View style={[styles.grabber, {backgroundColor: grabberColor}]}/>\n\n {/* Header */}\n {header != null && (\n <Text style={[styles.sheetHeader, {color: textColor}, resolvedHeaderStyle as any]}>\n {header as React.ReactNode}\n </Text>\n )}\n\n {/* Message */}\n {message != null && (\n <Text style={[styles.sheetMessage, {color: subtextColor}]}>\n {message as React.ReactNode}\n </Text>\n )}\n\n {/* Injected item / extra content */}\n {children}\n\n {/* Actions */}\n {renderActions(true)}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n }\n\n // ── Content-only mode (prompt) ──────────────────────────\n if (content) {\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the centred panel — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.confirm.exitDuration))}\n style={[styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.content.damping).stiffness(anim.confirm.content.stiffness).mass(anim.confirm.content.mass ?? 1)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n {backgroundColor: surfaceColor, minWidth: 250, maxWidth: 380},\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {content as React.ReactNode}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n }\n\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the centred panel — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.confirm.exitDuration))}\n style={[styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n\n {/* Card + icon stack: icon sits above the card */}\n <View style={styles.cardStack}>\n {/* Soft-circle icon bubble */}\n {showIcon && (\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.icon.damping).stiffness(anim.confirm.icon.stiffness).mass(anim.confirm.icon.mass ?? 1).delay(anim.confirm.icon.delay ?? 0)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease))}\n style={[styles.iconBubble, {backgroundColor: colors.iconBg}]}\n >\n {brandLogo ? brandLogo : typeof icon === \"string\" ? (\n <Icon name={icon as never} size={'xl'} color={colors.iconFg}/>\n ) : (\n icon\n )}\n </Animated.View>\n )}\n\n {/* Panel */}\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.enter.damping).stiffness(anim.confirm.enter.stiffness).mass(anim.confirm.enter.mass ?? 1)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n {\n backgroundColor: panelBg,\n paddingTop: showIcon ? 48 : 24,\n gap: 10,\n },\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {/* Close button */}\n <Pressable style={styles.closeBtn} onPress={hide} hitSlop={12}>\n <Text style={{fontSize: 18, color: subtextColor}}>✕</Text>\n </Pressable>\n\n {/* Header */}\n {header != null && (\n <Text style={[styles.header, {color: textColor}, resolvedHeaderStyle as any]}>\n {header as React.ReactNode}\n </Text>\n )}\n\n {/* Message */}\n {message != null && (\n <Text style={[styles.message, {color: subtextColor}]}>\n {message as React.ReactNode}\n </Text>\n )}\n\n {/* Children */}\n {children}\n\n {/* Buttons */}\n {renderActions(false)}\n </Animated.View>\n </View>\n </Animated.View>\n )}\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 28,\n },\n sheetOverlay: {\n flex: 1,\n justifyContent: \"flex-end\",\n },\n sheetPanel: {\n // 24 == radii.2xl, top corners only (bottom stays square).\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 24,\n paddingTop: 10,\n gap: 14,\n // Subtle elevation (upward for a sheet): low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: -2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n },\n grabber: {\n width: 40,\n height: 5,\n borderRadius: 999,\n alignSelf: \"center\",\n marginBottom: 6,\n },\n sheetHeader: {\n fontSize: 24,\n fontWeight: \"700\",\n textAlign: \"left\",\n },\n sheetMessage: {\n fontSize: 15,\n lineHeight: 22,\n textAlign: \"left\",\n },\n cardStack: {\n minWidth: 250,\n maxWidth: 380,\n alignItems: \"center\",\n },\n iconBubble: {\n width: 72,\n height: 72,\n borderRadius: 36,\n justifyContent: \"center\",\n alignItems: \"center\",\n zIndex: 2,\n marginBottom: -36,\n elevation: 8,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 4},\n shadowOpacity: 0.15,\n shadowRadius: 8,\n },\n panel: {\n alignSelf: \"stretch\",\n // 20 == radii.xl. Side padding (24) == bottom padding (24) for even rhythm.\n borderRadius: 20,\n paddingHorizontal: 24,\n paddingBottom: 24,\n // Subtle elevation: low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n alignItems: \"center\",\n },\n closeBtn: {\n position: \"absolute\",\n top: 12,\n right: 14,\n zIndex: 3,\n },\n header: {\n fontSize: 22,\n fontWeight: \"700\",\n textAlign: \"center\",\n marginBottom: 8,\n },\n message: {\n fontSize: 14,\n textAlign: \"center\",\n lineHeight: 20,\n // Tightened so top/bottom whitespace around the actions reads balanced.\n marginBottom: 16,\n },\n buttonRow: {\n flexDirection: \"row\",\n justifyContent: \"center\",\n gap: 12,\n width: \"100%\",\n },\n actionBtn: {\n paddingVertical: 12,\n paddingHorizontal: 24,\n // Pill (== radii.pill). Buttons here are raw Pressables, not kits Button,\n // so the pill comes from borderRadius — the pattern the `buttons` array\n // path (`b.rounded && {borderRadius: 999}`) already uses in this file.\n borderRadius: 999,\n minWidth: 100,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n // Taller buttons for the bottom-sheet action row (pill shape shared).\n actionBtnSheet: {\n paddingVertical: 16,\n borderRadius: 999,\n },\n actionBtnOutlined: {\n backgroundColor: \"transparent\",\n borderWidth: 1.5,\n },\n btnTextPrimary: {\n color: \"#fff\",\n fontWeight: \"600\",\n fontSize: 14,\n },\n btnTextOutlined: {\n fontWeight: \"600\",\n fontSize: 14,\n },\n});\n"],"names":["useKitsTheme","useSeverityColors","useAllSeverityColors","useSafeAreaInsets","useResolvedStyle","jsx","View","Pressable","Text","jsxs","Fragment","Modal","FadeIn","anim","FadeOut","scrimExitDuration","StyleSheet","sheetEnter","sheetExit","ZoomIn","ZoomOut","Easing","runOnJS","Icon"],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import React from 'react';
3
3
  import { Modal, Pressable, StyleSheet, View } from 'react-native';
4
- import Animated, { SlideOutDown, Easing, runOnJS, SlideInDown, FadeOut, FadeIn, ZoomOut, ZoomIn } from 'react-native-reanimated';
4
+ import Animated, { FadeOut, FadeIn, ZoomOut, Easing, runOnJS, ZoomIn } from 'react-native-reanimated';
5
5
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
6
6
  import { useSeverityColors, useAllSeverityColors } from '../../../hooks/useSeverityColors.js';
7
7
  import '../../../contexts/DialogContext.js';
8
8
  import useResolvedStyle from '../../../hooks/useResolvedStyle.js';
9
- import { overlayAnimations, scrimExitDuration } from '../../../animations/index.js';
9
+ import { scrimExitDuration, overlayAnimations } from '../../../animations/index.js';
10
+ import { sheetExit, sheetEnter } from '../sheetMotion.js';
10
11
  import { useKitsTheme } from '../../../contexts/Theme/KitsThemeProvider.js';
11
12
  import Text from '../../../primitives/Text/index.js';
12
13
  import { Icon } from '../../../primitives/Icon/index.js';
@@ -146,11 +147,8 @@ function KitsConfirm(props) {
146
147
  /* @__PURE__ */ jsxs(
147
148
  Animated.View,
148
149
  {
149
- entering: SlideInDown.springify().damping(overlayAnimations.sheet.enter.damping).stiffness(overlayAnimations.sheet.enter.stiffness).mass(overlayAnimations.sheet.enter.mass),
150
- exiting: SlideOutDown.duration(overlayAnimations.sheet.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {
151
- "worklet";
152
- if (finished) runOnJS(handleExitFinished)();
153
- }),
150
+ entering: sheetEnter(overlayAnimations.sheet.enter),
151
+ exiting: sheetExit(overlayAnimations.sheet.exitDuration, handleExitFinished),
154
152
  style: [
155
153
  styles.sheetPanel,
156
154
  { backgroundColor: panelBg, paddingBottom: 24 + insets.bottom },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/components/overlay/ConfirmDialog/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Modal, Pressable, StyleSheet, View} from \"react-native\";\nimport Animated, {Easing, FadeIn, FadeOut, runOnJS, SlideInDown, SlideOutDown, ZoomIn, ZoomOut} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Icon, Text} from \"../../../_compat\";\nimport type {IConfirmDialogProps} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {useSeverityColors, useAllSeverityColors} from \"../../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../../hooks\";\nimport {overlayAnimations as anim, scrimExitDuration} from \"../../../animations\";\n\n/**\n * Keeps the RN Modal mounted through the exit animation. `visible` drives the\n * inner scrim + panel entering/exiting; the Modal itself stays mounted until\n * the panel's exit animation reports finished, then unmounts.\n *\n * Re-entrancy: a new `visible=true` during an exit cancels the panel's exit\n * (reanimated reports `finished=false`, so the unmount is skipped) and the\n * inner re-enters cleanly; `visibleRef` is a second guard for the case where\n * the exit had already completed.\n */\nfunction useOverlayPresence(visible: boolean) {\n const [mounted, setMounted] = React.useState(visible);\n const visibleRef = React.useRef(visible);\n React.useEffect(() => {\n visibleRef.current = visible;\n if (visible) setMounted(true);\n }, [visible]);\n // Runs on the JS thread (dispatched via runOnJS from the exit worklet).\n const handleExitFinished = React.useCallback(() => {\n if (!visibleRef.current) setMounted(false);\n }, []);\n return {mounted, handleExitFinished};\n}\n\nexport default function KitsConfirm(props: IConfirmDialogProps) {\n const {\n visible,\n header,\n message,\n icon,\n type = \"secondary\",\n accept,\n reject,\n acceptLabel = \"Accept\",\n rejectLabel = \"Reject\",\n buttons,\n headless,\n defaultUI,\n async: asyncMode,\n onHide,\n content,\n children,\n position = \"center\",\n style,\n contentStyle,\n headerStyle,\n maskStyle,\n // LEGIT-PLATFORM-ONLY (web): acceptIcon/rejectIcon take PrimeReact\n // icon classes ('pi pi-*') with no native rendering path — use the\n // `buttons` array for custom native actions. acceptClassName/\n // rejectClassName are CSS classes; appendTo is a DOM portal target.\n ...rest\n } = props;\n\n const {resolveToken, theme} = useKitsTheme();\n const colors = useSeverityColors(type);\n const allColors = useAllSeverityColors();\n const insets = useSafeAreaInsets();\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const subtextColor = resolveToken('gray.500');\n const grabberColor = resolveToken('gray.300');\n // Scrim via the literal alpha overlay token → rgba(0,0,0,0.4) in both modes.\n const scrimColor = resolveToken('black-alpha-40');\n const brandLogo = type === 'brand' ? theme.config.logo : null;\n\n const resolvedStyle = useResolvedStyle(style || {});\n const resolvedContentStyle = useResolvedStyle(contentStyle || {});\n const resolvedHeaderStyle = useResolvedStyle(headerStyle || {});\n const resolvedMaskStyle = useResolvedStyle(maskStyle || {});\n\n const {mounted, handleExitFinished} = useOverlayPresence(!!visible);\n if (!mounted) return null;\n\n const isSheet = position === 'bottom';\n const hide = () => onHide?.('hide');\n\n const doClick = async (callback?: () => void) => {\n if (asyncMode) {\n await callback?.();\n hide();\n } else {\n hide();\n callback?.();\n }\n };\n\n const showIcon = icon != null || brandLogo != null;\n // Panel always uses surface-card. Severity (danger/success/...) only colours\n // the icon bubble and the action button — not the whole panel — otherwise\n // a danger confirm renders as a red wash with the underlying screen\n // bleeding through.\n const panelBg = surfaceColor;\n\n // Shared action row. `stretch` makes each button flex:1 (bottom-sheet,\n // full-width). The default accept/reject pair is ordered accept-first in the\n // centered card but reject-first (Cancel | Confirm) in the sheet, matching\n // the platform-native bottom-sheet convention.\n const renderActions = (stretch: boolean) => {\n if (buttons?.length) {\n return (\n <View style={styles.buttonRow}>\n {buttons.map((b, i) => {\n const btnColor = allColors[b.type ?? type]?.solid ?? colors.solid;\n return (\n <Pressable\n key={i}\n disabled={b.disabled}\n style={[\n styles.actionBtn,\n stretch && styles.actionBtnSheet,\n stretch && {flex: 1},\n b.outlined\n ? {backgroundColor: \"transparent\", borderColor: btnColor, borderWidth: 1.5}\n : {backgroundColor: btnColor},\n b.rounded && {borderRadius: 999},\n b.disabled && {opacity: 0.5},\n ]}\n onPress={() => b.onClick(hide, accept, reject)}\n >\n <Text style={{\n color: b.outlined ? btnColor : \"#fff\",\n fontWeight: \"600\",\n fontSize: 14,\n }}>\n {b.title}\n </Text>\n </Pressable>\n );\n })}\n </View>\n );\n }\n\n const acceptBtn = (\n <Pressable\n key=\"accept\"\n style={[styles.actionBtn, stretch && styles.actionBtnSheet, {backgroundColor: colors.solid, flex: 1}]}\n onPress={() => doClick(accept)}\n >\n <Text style={styles.btnTextPrimary}>{acceptLabel}</Text>\n </Pressable>\n );\n const rejectBtn = !defaultUI ? (\n <Pressable\n key=\"reject\"\n style={[styles.actionBtn, styles.actionBtnOutlined, stretch && styles.actionBtnSheet, {borderColor: colors.solid, flex: 1}]}\n onPress={() => doClick(reject)}\n >\n <Text style={[styles.btnTextOutlined, {color: colors.solid}]}>{rejectLabel}</Text>\n </Pressable>\n ) : null;\n\n return (\n <View style={styles.buttonRow}>\n {stretch ? <>{rejectBtn}{acceptBtn}</> : <>{acceptBtn}{rejectBtn}</>}\n </View>\n );\n };\n\n // ── Bottom sheet ────────────────────────────────────────\n if (isSheet) {\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the sheet — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.sheet.exitDuration))}\n style={[styles.sheetOverlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n <Animated.View\n entering={SlideInDown.springify().damping(anim.sheet.enter.damping).stiffness(anim.sheet.enter.stiffness).mass(anim.sheet.enter.mass ?? 1)}\n exiting={SlideOutDown.duration(anim.sheet.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.sheetPanel,\n {backgroundColor: panelBg, paddingBottom: 24 + insets.bottom},\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {/* Grabber */}\n <View style={[styles.grabber, {backgroundColor: grabberColor}]}/>\n\n {/* Header */}\n {header != null && (\n <Text style={[styles.sheetHeader, {color: textColor}, resolvedHeaderStyle as any]}>\n {header as React.ReactNode}\n </Text>\n )}\n\n {/* Message */}\n {message != null && (\n <Text style={[styles.sheetMessage, {color: subtextColor}]}>\n {message as React.ReactNode}\n </Text>\n )}\n\n {/* Injected item / extra content */}\n {children}\n\n {/* Actions */}\n {renderActions(true)}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n }\n\n // ── Content-only mode (prompt) ──────────────────────────\n if (content) {\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the centred panel — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.confirm.exitDuration))}\n style={[styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.content.damping).stiffness(anim.confirm.content.stiffness).mass(anim.confirm.content.mass ?? 1)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n {backgroundColor: surfaceColor, minWidth: 250, maxWidth: 380},\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {content as React.ReactNode}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n }\n\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the centred panel — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.confirm.exitDuration))}\n style={[styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n\n {/* Card + icon stack: icon sits above the card */}\n <View style={styles.cardStack}>\n {/* Soft-circle icon bubble */}\n {showIcon && (\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.icon.damping).stiffness(anim.confirm.icon.stiffness).mass(anim.confirm.icon.mass ?? 1).delay(anim.confirm.icon.delay ?? 0)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease))}\n style={[styles.iconBubble, {backgroundColor: colors.iconBg}]}\n >\n {brandLogo ? brandLogo : typeof icon === \"string\" ? (\n <Icon name={icon as never} size={'xl'} color={colors.iconFg}/>\n ) : (\n icon\n )}\n </Animated.View>\n )}\n\n {/* Panel */}\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.enter.damping).stiffness(anim.confirm.enter.stiffness).mass(anim.confirm.enter.mass ?? 1)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n {\n backgroundColor: panelBg,\n paddingTop: showIcon ? 48 : 24,\n gap: 10,\n },\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {/* Close button */}\n <Pressable style={styles.closeBtn} onPress={hide} hitSlop={12}>\n <Text style={{fontSize: 18, color: subtextColor}}>✕</Text>\n </Pressable>\n\n {/* Header */}\n {header != null && (\n <Text style={[styles.header, {color: textColor}, resolvedHeaderStyle as any]}>\n {header as React.ReactNode}\n </Text>\n )}\n\n {/* Message */}\n {message != null && (\n <Text style={[styles.message, {color: subtextColor}]}>\n {message as React.ReactNode}\n </Text>\n )}\n\n {/* Children */}\n {children}\n\n {/* Buttons */}\n {renderActions(false)}\n </Animated.View>\n </View>\n </Animated.View>\n )}\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 28,\n },\n sheetOverlay: {\n flex: 1,\n justifyContent: \"flex-end\",\n },\n sheetPanel: {\n // 24 == radii.2xl, top corners only (bottom stays square).\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 24,\n paddingTop: 10,\n gap: 14,\n // Subtle elevation (upward for a sheet): low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: -2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n },\n grabber: {\n width: 40,\n height: 5,\n borderRadius: 999,\n alignSelf: \"center\",\n marginBottom: 6,\n },\n sheetHeader: {\n fontSize: 24,\n fontWeight: \"700\",\n textAlign: \"left\",\n },\n sheetMessage: {\n fontSize: 15,\n lineHeight: 22,\n textAlign: \"left\",\n },\n cardStack: {\n minWidth: 250,\n maxWidth: 380,\n alignItems: \"center\",\n },\n iconBubble: {\n width: 72,\n height: 72,\n borderRadius: 36,\n justifyContent: \"center\",\n alignItems: \"center\",\n zIndex: 2,\n marginBottom: -36,\n elevation: 8,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 4},\n shadowOpacity: 0.15,\n shadowRadius: 8,\n },\n panel: {\n alignSelf: \"stretch\",\n // 20 == radii.xl. Side padding (24) == bottom padding (24) for even rhythm.\n borderRadius: 20,\n paddingHorizontal: 24,\n paddingBottom: 24,\n // Subtle elevation: low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n alignItems: \"center\",\n },\n closeBtn: {\n position: \"absolute\",\n top: 12,\n right: 14,\n zIndex: 3,\n },\n header: {\n fontSize: 22,\n fontWeight: \"700\",\n textAlign: \"center\",\n marginBottom: 8,\n },\n message: {\n fontSize: 14,\n textAlign: \"center\",\n lineHeight: 20,\n // Tightened so top/bottom whitespace around the actions reads balanced.\n marginBottom: 16,\n },\n buttonRow: {\n flexDirection: \"row\",\n justifyContent: \"center\",\n gap: 12,\n width: \"100%\",\n },\n actionBtn: {\n paddingVertical: 12,\n paddingHorizontal: 24,\n // Pill (== radii.pill). Buttons here are raw Pressables, not kits Button,\n // so the pill comes from borderRadius — the pattern the `buttons` array\n // path (`b.rounded && {borderRadius: 999}`) already uses in this file.\n borderRadius: 999,\n minWidth: 100,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n // Taller buttons for the bottom-sheet action row (pill shape shared).\n actionBtnSheet: {\n paddingVertical: 16,\n borderRadius: 999,\n },\n actionBtnOutlined: {\n backgroundColor: \"transparent\",\n borderWidth: 1.5,\n },\n btnTextPrimary: {\n color: \"#fff\",\n fontWeight: \"600\",\n fontSize: 14,\n },\n btnTextOutlined: {\n fontWeight: \"600\",\n fontSize: 14,\n },\n});\n"],"names":["anim"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/components/overlay/ConfirmDialog/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Modal, Pressable, StyleSheet, View} from \"react-native\";\nimport Animated, {Easing, FadeIn, FadeOut, runOnJS, ZoomIn, ZoomOut} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Icon, Text} from \"../../../_compat\";\nimport type {IConfirmDialogProps} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {useSeverityColors, useAllSeverityColors} from \"../../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../../hooks\";\nimport {overlayAnimations as anim, scrimExitDuration} from \"../../../animations\";\nimport {sheetEnter, sheetExit} from \"../sheetMotion\";\n\n/**\n * Keeps the RN Modal mounted through the exit animation. `visible` drives the\n * inner scrim + panel entering/exiting; the Modal itself stays mounted until\n * the panel's exit animation reports finished, then unmounts.\n *\n * Re-entrancy: a new `visible=true` during an exit cancels the panel's exit\n * (reanimated reports `finished=false`, so the unmount is skipped) and the\n * inner re-enters cleanly; `visibleRef` is a second guard for the case where\n * the exit had already completed.\n */\nfunction useOverlayPresence(visible: boolean) {\n const [mounted, setMounted] = React.useState(visible);\n const visibleRef = React.useRef(visible);\n React.useEffect(() => {\n visibleRef.current = visible;\n if (visible) setMounted(true);\n }, [visible]);\n // Runs on the JS thread (dispatched via runOnJS from the exit worklet).\n const handleExitFinished = React.useCallback(() => {\n if (!visibleRef.current) setMounted(false);\n }, []);\n return {mounted, handleExitFinished};\n}\n\nexport default function KitsConfirm(props: IConfirmDialogProps) {\n const {\n visible,\n header,\n message,\n icon,\n type = \"secondary\",\n accept,\n reject,\n acceptLabel = \"Accept\",\n rejectLabel = \"Reject\",\n buttons,\n headless,\n defaultUI,\n async: asyncMode,\n onHide,\n content,\n children,\n position = \"center\",\n style,\n contentStyle,\n headerStyle,\n maskStyle,\n // LEGIT-PLATFORM-ONLY (web): acceptIcon/rejectIcon take PrimeReact\n // icon classes ('pi pi-*') with no native rendering path — use the\n // `buttons` array for custom native actions. acceptClassName/\n // rejectClassName are CSS classes; appendTo is a DOM portal target.\n ...rest\n } = props;\n\n const {resolveToken, theme} = useKitsTheme();\n const colors = useSeverityColors(type);\n const allColors = useAllSeverityColors();\n const insets = useSafeAreaInsets();\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const subtextColor = resolveToken('gray.500');\n const grabberColor = resolveToken('gray.300');\n // Scrim via the literal alpha overlay token → rgba(0,0,0,0.4) in both modes.\n const scrimColor = resolveToken('black-alpha-40');\n const brandLogo = type === 'brand' ? theme.config.logo : null;\n\n const resolvedStyle = useResolvedStyle(style || {});\n const resolvedContentStyle = useResolvedStyle(contentStyle || {});\n const resolvedHeaderStyle = useResolvedStyle(headerStyle || {});\n const resolvedMaskStyle = useResolvedStyle(maskStyle || {});\n\n const {mounted, handleExitFinished} = useOverlayPresence(!!visible);\n if (!mounted) return null;\n\n const isSheet = position === 'bottom';\n const hide = () => onHide?.('hide');\n\n const doClick = async (callback?: () => void) => {\n if (asyncMode) {\n await callback?.();\n hide();\n } else {\n hide();\n callback?.();\n }\n };\n\n const showIcon = icon != null || brandLogo != null;\n // Panel always uses surface-card. Severity (danger/success/...) only colours\n // the icon bubble and the action button — not the whole panel — otherwise\n // a danger confirm renders as a red wash with the underlying screen\n // bleeding through.\n const panelBg = surfaceColor;\n\n // Shared action row. `stretch` makes each button flex:1 (bottom-sheet,\n // full-width). The default accept/reject pair is ordered accept-first in the\n // centered card but reject-first (Cancel | Confirm) in the sheet, matching\n // the platform-native bottom-sheet convention.\n const renderActions = (stretch: boolean) => {\n if (buttons?.length) {\n return (\n <View style={styles.buttonRow}>\n {buttons.map((b, i) => {\n const btnColor = allColors[b.type ?? type]?.solid ?? colors.solid;\n return (\n <Pressable\n key={i}\n disabled={b.disabled}\n style={[\n styles.actionBtn,\n stretch && styles.actionBtnSheet,\n stretch && {flex: 1},\n b.outlined\n ? {backgroundColor: \"transparent\", borderColor: btnColor, borderWidth: 1.5}\n : {backgroundColor: btnColor},\n b.rounded && {borderRadius: 999},\n b.disabled && {opacity: 0.5},\n ]}\n onPress={() => b.onClick(hide, accept, reject)}\n >\n <Text style={{\n color: b.outlined ? btnColor : \"#fff\",\n fontWeight: \"600\",\n fontSize: 14,\n }}>\n {b.title}\n </Text>\n </Pressable>\n );\n })}\n </View>\n );\n }\n\n const acceptBtn = (\n <Pressable\n key=\"accept\"\n style={[styles.actionBtn, stretch && styles.actionBtnSheet, {backgroundColor: colors.solid, flex: 1}]}\n onPress={() => doClick(accept)}\n >\n <Text style={styles.btnTextPrimary}>{acceptLabel}</Text>\n </Pressable>\n );\n const rejectBtn = !defaultUI ? (\n <Pressable\n key=\"reject\"\n style={[styles.actionBtn, styles.actionBtnOutlined, stretch && styles.actionBtnSheet, {borderColor: colors.solid, flex: 1}]}\n onPress={() => doClick(reject)}\n >\n <Text style={[styles.btnTextOutlined, {color: colors.solid}]}>{rejectLabel}</Text>\n </Pressable>\n ) : null;\n\n return (\n <View style={styles.buttonRow}>\n {stretch ? <>{rejectBtn}{acceptBtn}</> : <>{acceptBtn}{rejectBtn}</>}\n </View>\n );\n };\n\n // ── Bottom sheet ────────────────────────────────────────\n if (isSheet) {\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the sheet — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.sheet.exitDuration))}\n style={[styles.sheetOverlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n <Animated.View\n /* ⛔ THE SAME FAULT AS `Dialog`'s SHEET, AND THE SAME ANSWER —\n see `../sheetMotion`. `SlideInDown` takes its travel from\n the window, and inside an RN `Modal` the window it measures\n is not the screen, so the panel is placed at rest on frame\n one. Measured on the Dialog, 30 September 2026; this file\n has the identical shape, so it takes the identical fix\n rather than a second one (§5).\n ⚠️ AND THIS FILE IS NOT YET WHOLE. Its panel is still a\n CHILD of the scrim above, so it still inherits the scrim's\n fade — the defect `Dialog` had corrected on 29 September and\n that was recorded then as this file's own next unit. The\n sheet will now slide AND fade here. That is better than not\n sliding, and it is still not the ruled motion. Not fixed in\n this unit, and not left unsaid. */\n entering={sheetEnter(anim.sheet.enter)}\n exiting={sheetExit(anim.sheet.exitDuration, handleExitFinished)}\n style={[\n styles.sheetPanel,\n {backgroundColor: panelBg, paddingBottom: 24 + insets.bottom},\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {/* Grabber */}\n <View style={[styles.grabber, {backgroundColor: grabberColor}]}/>\n\n {/* Header */}\n {header != null && (\n <Text style={[styles.sheetHeader, {color: textColor}, resolvedHeaderStyle as any]}>\n {header as React.ReactNode}\n </Text>\n )}\n\n {/* Message */}\n {message != null && (\n <Text style={[styles.sheetMessage, {color: subtextColor}]}>\n {message as React.ReactNode}\n </Text>\n )}\n\n {/* Injected item / extra content */}\n {children}\n\n {/* Actions */}\n {renderActions(true)}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n }\n\n // ── Content-only mode (prompt) ──────────────────────────\n if (content) {\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the centred panel — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.confirm.exitDuration))}\n style={[styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.content.damping).stiffness(anim.confirm.content.stiffness).mass(anim.confirm.content.mass ?? 1)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n {backgroundColor: surfaceColor, minWidth: 250, maxWidth: 380},\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {content as React.ReactNode}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n }\n\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the centred panel — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.confirm.exitDuration))}\n style={[styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n\n {/* Card + icon stack: icon sits above the card */}\n <View style={styles.cardStack}>\n {/* Soft-circle icon bubble */}\n {showIcon && (\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.icon.damping).stiffness(anim.confirm.icon.stiffness).mass(anim.confirm.icon.mass ?? 1).delay(anim.confirm.icon.delay ?? 0)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease))}\n style={[styles.iconBubble, {backgroundColor: colors.iconBg}]}\n >\n {brandLogo ? brandLogo : typeof icon === \"string\" ? (\n <Icon name={icon as never} size={'xl'} color={colors.iconFg}/>\n ) : (\n icon\n )}\n </Animated.View>\n )}\n\n {/* Panel */}\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.enter.damping).stiffness(anim.confirm.enter.stiffness).mass(anim.confirm.enter.mass ?? 1)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n {\n backgroundColor: panelBg,\n paddingTop: showIcon ? 48 : 24,\n gap: 10,\n },\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {/* Close button */}\n <Pressable style={styles.closeBtn} onPress={hide} hitSlop={12}>\n <Text style={{fontSize: 18, color: subtextColor}}>✕</Text>\n </Pressable>\n\n {/* Header */}\n {header != null && (\n <Text style={[styles.header, {color: textColor}, resolvedHeaderStyle as any]}>\n {header as React.ReactNode}\n </Text>\n )}\n\n {/* Message */}\n {message != null && (\n <Text style={[styles.message, {color: subtextColor}]}>\n {message as React.ReactNode}\n </Text>\n )}\n\n {/* Children */}\n {children}\n\n {/* Buttons */}\n {renderActions(false)}\n </Animated.View>\n </View>\n </Animated.View>\n )}\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 28,\n },\n sheetOverlay: {\n flex: 1,\n justifyContent: \"flex-end\",\n },\n sheetPanel: {\n // 24 == radii.2xl, top corners only (bottom stays square).\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 24,\n paddingTop: 10,\n gap: 14,\n // Subtle elevation (upward for a sheet): low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: -2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n },\n grabber: {\n width: 40,\n height: 5,\n borderRadius: 999,\n alignSelf: \"center\",\n marginBottom: 6,\n },\n sheetHeader: {\n fontSize: 24,\n fontWeight: \"700\",\n textAlign: \"left\",\n },\n sheetMessage: {\n fontSize: 15,\n lineHeight: 22,\n textAlign: \"left\",\n },\n cardStack: {\n minWidth: 250,\n maxWidth: 380,\n alignItems: \"center\",\n },\n iconBubble: {\n width: 72,\n height: 72,\n borderRadius: 36,\n justifyContent: \"center\",\n alignItems: \"center\",\n zIndex: 2,\n marginBottom: -36,\n elevation: 8,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 4},\n shadowOpacity: 0.15,\n shadowRadius: 8,\n },\n panel: {\n alignSelf: \"stretch\",\n // 20 == radii.xl. Side padding (24) == bottom padding (24) for even rhythm.\n borderRadius: 20,\n paddingHorizontal: 24,\n paddingBottom: 24,\n // Subtle elevation: low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n alignItems: \"center\",\n },\n closeBtn: {\n position: \"absolute\",\n top: 12,\n right: 14,\n zIndex: 3,\n },\n header: {\n fontSize: 22,\n fontWeight: \"700\",\n textAlign: \"center\",\n marginBottom: 8,\n },\n message: {\n fontSize: 14,\n textAlign: \"center\",\n lineHeight: 20,\n // Tightened so top/bottom whitespace around the actions reads balanced.\n marginBottom: 16,\n },\n buttonRow: {\n flexDirection: \"row\",\n justifyContent: \"center\",\n gap: 12,\n width: \"100%\",\n },\n actionBtn: {\n paddingVertical: 12,\n paddingHorizontal: 24,\n // Pill (== radii.pill). Buttons here are raw Pressables, not kits Button,\n // so the pill comes from borderRadius — the pattern the `buttons` array\n // path (`b.rounded && {borderRadius: 999}`) already uses in this file.\n borderRadius: 999,\n minWidth: 100,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n // Taller buttons for the bottom-sheet action row (pill shape shared).\n actionBtnSheet: {\n paddingVertical: 16,\n borderRadius: 999,\n },\n actionBtnOutlined: {\n backgroundColor: \"transparent\",\n borderWidth: 1.5,\n },\n btnTextPrimary: {\n color: \"#fff\",\n fontWeight: \"600\",\n fontSize: 14,\n },\n btnTextOutlined: {\n fontWeight: \"600\",\n fontSize: 14,\n },\n});\n"],"names":["anim"],"mappings":"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"}
@@ -11,6 +11,7 @@ var useSeverityColors = require('../../../hooks/useSeverityColors.cjs');
11
11
  require('../../../contexts/DialogContext.cjs');
12
12
  var useResolvedStyle = require('../../../hooks/useResolvedStyle.cjs');
13
13
  var index = require('../../../animations/index.cjs');
14
+ var sheetMotion_native = require('../sheetMotion.cjs');
14
15
  var KitsThemeProvider_native = require('../../../contexts/Theme/KitsThemeProvider.cjs');
15
16
  var index_native = require('../../../primitives/Icon/index.cjs');
16
17
  var index_native$1 = require('../../../primitives/Text/index.cjs');
@@ -117,8 +118,8 @@ function KitsDialogControlled({ state, onHide }) {
117
118
  children: /* @__PURE__ */ jsxRuntime.jsx(
118
119
  Animated.View,
119
120
  {
120
- entering: isSheet ? Animated.SlideInDown.springify().damping(index.overlayAnimations.sheet.enter.damping).stiffness(index.overlayAnimations.sheet.enter.stiffness).mass(index.overlayAnimations.sheet.enter.mass).reduceMotion(Animated.ReduceMotion.Never ) : Animated.ZoomIn.springify().damping(index.overlayAnimations.dialog.enter.damping).stiffness(index.overlayAnimations.dialog.enter.stiffness).mass(index.overlayAnimations.dialog.enter.mass),
121
- exiting: (isSheet ? Animated.SlideOutDown.duration(index.overlayAnimations.sheet.exitDuration).easing(Animated.Easing.in(Animated.Easing.ease)).reduceMotion(Animated.ReduceMotion.Never ) : Animated.ZoomOut.duration(index.overlayAnimations.dialog.exitDuration).easing(Animated.Easing.in(Animated.Easing.ease))).withCallback((finished) => {
121
+ entering: isSheet ? sheetMotion_native.sheetEnter(index.overlayAnimations.sheet.enter) : Animated.ZoomIn.springify().damping(index.overlayAnimations.dialog.enter.damping).stiffness(index.overlayAnimations.dialog.enter.stiffness).mass(index.overlayAnimations.dialog.enter.mass),
122
+ exiting: isSheet ? sheetMotion_native.sheetExit(index.overlayAnimations.sheet.exitDuration, handleExitFinished) : Animated.ZoomOut.duration(index.overlayAnimations.dialog.exitDuration).easing(Animated.Easing.in(Animated.Easing.ease)).withCallback((finished) => {
122
123
  "worklet";
123
124
  if (finished) Animated.runOnJS(handleExitFinished)();
124
125
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../../src/components/overlay/Dialog/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Modal, Pressable, ScrollView, StyleSheet, View, useWindowDimensions} from \"react-native\";\nimport Animated, {Easing, FadeIn, FadeOut, ReduceMotion, runOnJS, SlideInDown, SlideOutDown, ZoomIn, ZoomOut} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Icon, Text} from \"../../../_compat\";\nimport type {IKitsDialogControlled} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {useSeverityColors} from \"../../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../../hooks\";\nimport {overlayAnimations as anim, scrimExitDuration} from \"../../../animations\";\n\n/**\n * Keeps the RN Modal mounted through the exit animation. `visible` drives the\n * inner scrim + panel entering/exiting; the Modal itself stays mounted until\n * the panel's exit animation reports finished, then unmounts.\n *\n * Re-entrancy: a new `visible=true` during an exit re-renders the inner (which\n * re-enters), and the still-pending exit callback is ignored because\n * `visibleRef` is already back to `true` — so the Modal is never torn down\n * mid-reopen.\n */\nfunction useOverlayPresence(visible: boolean) {\n const [mounted, setMounted] = React.useState(visible);\n const visibleRef = React.useRef(visible);\n React.useEffect(() => {\n visibleRef.current = visible;\n if (visible) setMounted(true);\n }, [visible]);\n // Runs on the JS thread (dispatched via runOnJS from the exit worklet).\n const handleExitFinished = React.useCallback(() => {\n if (!visibleRef.current) setMounted(false);\n }, []);\n return {mounted, handleExitFinished};\n}\n\n/**\n * The scrim: it fades AND it is the thing you tap to dismiss, in one element.\n *\n * ⛔ THIS IS THE ACTIONSHEET'S SHAPE, NOT A THIRD PATTERN (§5). Two components in\n * this library already keep the backdrop a sibling of the panel:\n * `apps/mobile/src/ui/actionsheet/index.tsx:53` declares `Backdrop:\n * AnimatedPressable` — an animated, tappable element in its own right — and\n * `apps/mobile/src/ui/bottomsheet/index.tsx:124` passes `backdropComponent` to\n * `@gorhom/bottom-sheet`. The gorhom one is a prop-injection API belonging to a\n * sheet container that owns its own presentation; this Dialog owns its own RN\n * `Modal`, so there is nothing to inject into. The actionsheet's shape is the one\n * that fits, and it also collapses the separate `absoluteFill` Pressable this\n * component used to need into the scrim itself.\n *\n * ⚠️ BUILT WITH REANIMATED, NOT WITH THE ACTIONSHEET'S `createMotionAnimatedComponent`.\n * That helper wraps a different animation engine; this file's entering/exiting are\n * reanimated layout animations throughout, and mixing two engines in one overlay\n * would be inventing the third pattern §5 forbids.\n */\nconst AnimatedPressable = Animated.createAnimatedComponent(Pressable);\n\nexport default function KitsDialogControlled({state, onHide}: IKitsDialogControlled) {\n const {\n children,\n content: contentProp,\n onClose,\n asyncClose,\n type,\n icon,\n style,\n contentStyle,\n headerStyle,\n maskStyle,\n position = 'center',\n responsive = true,\n hideHeader,\n headerRender,\n footerRender,\n footerStyle,\n canClose,\n bodyStyle,\n closeIcon,\n // Native default true preserves historical tap-to-dismiss; web's\n // PrimeReact default is false — pass explicitly in shared code.\n dismissableMask = true,\n breakpoints,\n ...rest\n } = state;\n const {resolveToken, theme} = useKitsTheme();\n const severityColors = useSeverityColors(type || 'secondary');\n const colors = type ? severityColors : null;\n const insets = useSafeAreaInsets();\n const isSheet = position === 'bottom';\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const borderColor = colors?.border ?? resolveToken('border');\n const subtextColor = resolveToken('gray.500');\n const grabberColor = resolveToken('gray.300');\n // Scrim via the literal alpha overlay token → rgba(0,0,0,0.4) in both modes.\n const scrimColor = resolveToken('black-alpha-40');\n const brandLogo = type === 'brand' ? theme.config.logo : null;\n\n const resolvedStyle = useResolvedStyle(style || {});\n const resolvedContentStyle = useResolvedStyle(contentStyle || {});\n const resolvedHeaderStyle = useResolvedStyle(headerStyle || {});\n const resolvedMaskStyle = useResolvedStyle(maskStyle || {});\n const resolvedFooterStyle = useResolvedStyle(footerStyle || {});\n const resolvedBodyStyle = useResolvedStyle(bodyStyle || {});\n\n const {width: screenWidth} = useWindowDimensions();\n // Consumer `breakpoints` ({'960px': '75vw'}) mirrors the web prop: the\n // smallest max-width threshold >= the screen width wins; vw/% both map\n // to a percentage of the window width. Falls back to the responsive\n // default (50% tablets/desktop, 95% phones <=641px).\n const breakpointWidth = (() => {\n if (!breakpoints) return null;\n const matches = Object.entries(breakpoints)\n .map(([k, v]) => [parseFloat(k), v] as const)\n .filter(([px]) => !Number.isNaN(px) && screenWidth <= px)\n .sort(([a], [b]) => a - b);\n const value = matches[0]?.[1];\n if (value == null) return null;\n const num = parseFloat(value);\n return Number.isNaN(num) ? null : `${num}%`;\n })();\n const responsiveWidth = breakpointWidth ?? (screenWidth > 641 ? '50%' : '95%');\n const hasExplicitWidth = (resolvedStyle as any).width != null;\n\n const hide = async () => {\n // canClose gate — intercepts every close path (backdrop Pressable,\n // built-in X Pressable, RN Modal onRequestClose). When blocked,\n // onClose is suppressed and the dialog stays open.\n if (canClose === false || (typeof canClose === 'function' && !canClose())) {\n return;\n }\n if (asyncClose && typeof onClose === \"function\") {\n await onClose();\n } else {\n onClose?.();\n }\n onHide();\n };\n\n const {mounted, handleExitFinished} = useOverlayPresence(!!state.visible);\n if (!mounted) return null;\n\n const content = typeof children === \"function\" ? children(hide) : children;\n // Content-mode override (mirrors web): consumer node replaces the whole\n // header / body / footer template inside the panel.\n const contentMode = contentProp != null\n ? (typeof contentProp === \"function\" ? contentProp({hide}) : contentProp)\n : null;\n\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {state.visible && (\n <View style={styles.root}>\n {/*\n ⛔ THE SCRIM IS A SIBLING OF THE PANEL, NOT ITS PARENT.\n It used to be the panel's parent, and opacity composes down a\n view tree — so the scrim's FadeIn/FadeOut multiplied the panel's\n opacity for the whole of both animations and the panel faded as\n well as travelled. `SlideInDown` animates `originY` only and\n never touched opacity; the fade was entirely inherited. Fixed\n 29 September 2026 — the structure is the fix, and no duration\n was tuned to make it look better (§12.5).\n\n ⚠️ IT IS ALSO THE DISMISS TARGET. The component used to draw a\n separate `absoluteFill` Pressable inside the scrim; scrim and\n target are one element now, which is the actionsheet's shape.\n */}\n <AnimatedPressable\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n exiting={FadeOut.duration(scrimExitDuration(isSheet ? anim.sheet.exitDuration : anim.dialog.exitDuration))}\n style={[StyleSheet.absoluteFill, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n onPress={dismissableMask ? hide : undefined}\n />\n {/*\n ⚠️ `pointerEvents=\"box-none\"` IS LOAD-BEARING. This view spans the\n screen so it can place the panel — centred, or pinned to the\n bottom — and it sits ON TOP of the scrim. Without `box-none` it\n would swallow every tap meant for the scrim and tap-to-dismiss\n would stop working. With it, the empty area passes taps through\n to the scrim beneath while the panel still receives its own.\n */}\n <View\n style={isSheet ? styles.sheetArrange : styles.centerArrange}\n pointerEvents=\"box-none\"\n >\n <Animated.View\n /* The sheet asks Reanimated to keep moving under iOS\n \"Reduce Motion\" — see `overlayAnimations.sheet`. Without\n it the panel appears in one frame and the only motion\n left is the scrim, which reads as a fade. The centred\n dialog keeps the system default. */\n entering={isSheet\n ? SlideInDown.springify().damping(anim.sheet.enter.damping).stiffness(anim.sheet.enter.stiffness).mass(anim.sheet.enter.mass ?? 1)\n .reduceMotion(anim.sheet.keepMotionWhenReduced ? ReduceMotion.Never : ReduceMotion.System)\n : ZoomIn.springify().damping(anim.dialog.enter.damping).stiffness(anim.dialog.enter.stiffness).mass(anim.dialog.enter.mass ?? 1)}\n exiting={(isSheet\n ? SlideOutDown.duration(anim.sheet.exitDuration).easing(Easing.in(Easing.ease))\n .reduceMotion(anim.sheet.keepMotionWhenReduced ? ReduceMotion.Never : ReduceMotion.System)\n : ZoomOut.duration(anim.dialog.exitDuration).easing(Easing.in(Easing.ease))\n ).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n isSheet && styles.sheetPanel,\n {backgroundColor: surfaceColor, borderColor},\n // Explicit `breakpoints` win even when responsive=false (web parity)\n !isSheet && !hasExplicitWidth && (breakpoints != null || responsive) ? {width: responsiveWidth} : null,\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {contentMode != null ? contentMode : <>\n {/* Grabber (bottom-sheet) */}\n {isSheet && <View style={[styles.grabber, {backgroundColor: grabberColor}]}/>}\n\n {/* Severity accent strip */}\n {colors && !isSheet && (\n <View style={{height: 4, backgroundColor: colors.solid, borderTopLeftRadius: 20, borderTopRightRadius: 20}}/>\n )}\n\n {/* Custom header (headerRender) — fully replaces the built-in header\n View when provided. Wins over the default header even if `header`\n is also set. */}\n {!hideHeader && headerRender != null && headerRender({close: () => { void hide(); }})}\n\n {/* Header (default) — rendered when no headerRender and `header` is set. */}\n {!hideHeader && headerRender == null && rest.header != null && (\n <View style={[styles.header, {borderBottomColor: borderColor}, resolvedHeaderStyle as any]}>\n {/* Inline severity icon */}\n {(icon || brandLogo) && colors && (\n <View style={{\n width: 36,\n height: 36,\n borderRadius: 18,\n backgroundColor: colors.iconBg,\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: 12,\n }}>\n {brandLogo ? brandLogo : typeof icon === 'string' ? (\n <Icon name={icon as never} size={'lg'} color={colors.iconFg}/>\n ) : icon}\n </View>\n )}\n <Text style={{fontSize: 18, fontWeight: \"700\", color: textColor, flex: 1}}>\n {rest.header as React.ReactNode}\n </Text>\n <Pressable onPress={hide} hitSlop={8}>\n {closeIcon ?? <Text style={{fontSize: 18, color: subtextColor}}>✕</Text>}\n </Pressable>\n </View>\n )}\n\n {/* Body — bodyStyle is applied AFTER the built-in maxHeight: 400,\n so consumers can lift the cap (`maxHeight: 600`) or unlock flex\n sizing (`minHeight: 0`) without losing the default behavior when\n bodyStyle is unset. */}\n <ScrollView\n style={[styles.body, resolvedBodyStyle as any]}\n contentContainerStyle={styles.bodyContent}\n showsVerticalScrollIndicator={false}\n >\n {content}\n </ScrollView>\n\n {/* Footer — footerRender takes precedence over `footer`. footerStyle\n is merged AFTER the built-in flex defaults so consumers can override\n alignment (e.g. justifyContent: 'space-between' for left-delete /\n right-actions layouts) without losing the borderTop / padding. */}\n {(footerRender != null || rest.footer != null) && (\n <View style={[\n styles.footer,\n {borderTopColor: borderColor},\n isSheet && {paddingBottom: 12 + insets.bottom},\n resolvedFooterStyle as any,\n ]}>\n {footerRender\n ? footerRender({close: () => { void hide(); }})\n : (rest.footer as React.ReactNode)}\n </View>\n )}\n </>}\n </Animated.View>\n </View>\n </View>\n )}\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n /**\n * The container. ⛔ IT IS NEVER ANIMATED AND CARRIES NO OPACITY — that is the\n * whole point of the change. It only exists to give the scrim and the panel a\n * shared parent so they can be siblings.\n */\n root: {\n flex: 1,\n },\n /**\n * Places the panel. ⚠️ The 24 padding moved here from the old `overlay` style,\n * and it had to: `position: absolute` resolves against a parent's PADDING box\n * in React Native, so a scrim absolutely filling a padded parent would have\n * stopped 24 short of every screen edge and left an undimmed frame. The scrim\n * now fills `root`, which has no padding, and the inset belongs to the layer\n * that positions the panel.\n */\n centerArrange: {\n ...StyleSheet.absoluteFillObject,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 24,\n },\n sheetArrange: {\n ...StyleSheet.absoluteFillObject,\n justifyContent: \"flex-end\",\n },\n sheetPanel: {\n width: \"100%\",\n maxWidth: \"100%\",\n maxHeight: \"90%\",\n borderWidth: 0,\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n borderBottomLeftRadius: 0,\n borderBottomRightRadius: 0,\n paddingTop: 10,\n },\n grabber: {\n width: 40,\n height: 5,\n borderRadius: 999,\n alignSelf: \"center\",\n marginBottom: 6,\n },\n panel: {\n // 20 == radii.xl (no numeric radii resolver on native — see report).\n borderRadius: 20,\n borderWidth: 1,\n minWidth: 250,\n maxWidth: \"90%\",\n maxHeight: \"80%\",\n overflow: \"hidden\",\n // Subtle elevation: low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n },\n header: {\n flexDirection: \"row\",\n alignItems: \"center\",\n paddingHorizontal: 20,\n paddingVertical: 16,\n borderBottomWidth: 1,\n },\n body: {\n maxHeight: 400,\n },\n bodyContent: {\n padding: 20,\n },\n footer: {\n flexDirection: \"row\",\n justifyContent: \"flex-end\",\n paddingHorizontal: 20,\n paddingVertical: 12,\n borderTopWidth: 1,\n gap: 8,\n },\n});\n"],"names":["Pressable","useKitsTheme","useSeverityColors","useSafeAreaInsets","useResolvedStyle","useWindowDimensions","Modal","jsxs","View","jsx","FadeIn","anim","FadeOut","scrimExitDuration","StyleSheet","SlideInDown","ReduceMotion","ZoomIn","SlideOutDown","Easing","ZoomOut","runOnJS","Fragment","Icon","Text","ScrollView"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../../src/components/overlay/Dialog/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Modal, Pressable, ScrollView, StyleSheet, View, useWindowDimensions} from \"react-native\";\n/* ⛔ `ReduceMotion` IS GONE FROM THIS FILE, AND THAT IS A STATEMENT, NOT A\n TIDY-UP. The sheet used to carry `.reduceMotion(ReduceMotion.Never)` — an\n instruction to keep moving when the device asks for less motion — and it is\n on record that the modifier does not hold: the sheet was skipped anyway, in\n this library's own Storybook as well as in the App. It was a claim the code\n could not deliver, so it is removed rather than left to be believed.\n ⚠️ A CUSTOM entering/exiting is outside Reanimated's reduce-motion handling\n altogether, so the sheet now genuinely keeps its motion — which is what the\n modifier was asking for and never achieved. `anim.sheet.keepMotionWhenReduced`\n is left in the presets: ConfirmDialog is a separate unit and no preset should\n change under it. */\nimport Animated, {Easing, FadeIn, FadeOut, runOnJS, ZoomIn, ZoomOut} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Icon, Text} from \"../../../_compat\";\nimport type {IKitsDialogControlled} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {useSeverityColors} from \"../../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../../hooks\";\nimport {overlayAnimations as anim, scrimExitDuration} from \"../../../animations\";\nimport {sheetEnter, sheetExit} from \"../sheetMotion\";\n\n/**\n * Keeps the RN Modal mounted through the exit animation. `visible` drives the\n * inner scrim + panel entering/exiting; the Modal itself stays mounted until\n * the panel's exit animation reports finished, then unmounts.\n *\n * Re-entrancy: a new `visible=true` during an exit re-renders the inner (which\n * re-enters), and the still-pending exit callback is ignored because\n * `visibleRef` is already back to `true` — so the Modal is never torn down\n * mid-reopen.\n */\nfunction useOverlayPresence(visible: boolean) {\n const [mounted, setMounted] = React.useState(visible);\n const visibleRef = React.useRef(visible);\n React.useEffect(() => {\n visibleRef.current = visible;\n if (visible) setMounted(true);\n }, [visible]);\n // Runs on the JS thread (dispatched via runOnJS from the exit worklet).\n const handleExitFinished = React.useCallback(() => {\n if (!visibleRef.current) setMounted(false);\n }, []);\n return {mounted, handleExitFinished};\n}\n\n/**\n * The scrim: it fades AND it is the thing you tap to dismiss, in one element.\n *\n * ⛔ THIS IS THE ACTIONSHEET'S SHAPE, NOT A THIRD PATTERN (§5). Two components in\n * this library already keep the backdrop a sibling of the panel:\n * `apps/mobile/src/ui/actionsheet/index.tsx:53` declares `Backdrop:\n * AnimatedPressable` — an animated, tappable element in its own right — and\n * `apps/mobile/src/ui/bottomsheet/index.tsx:124` passes `backdropComponent` to\n * `@gorhom/bottom-sheet`. The gorhom one is a prop-injection API belonging to a\n * sheet container that owns its own presentation; this Dialog owns its own RN\n * `Modal`, so there is nothing to inject into. The actionsheet's shape is the one\n * that fits, and it also collapses the separate `absoluteFill` Pressable this\n * component used to need into the scrim itself.\n *\n * ⚠️ BUILT WITH REANIMATED, NOT WITH THE ACTIONSHEET'S `createMotionAnimatedComponent`.\n * That helper wraps a different animation engine; this file's entering/exiting are\n * reanimated layout animations throughout, and mixing two engines in one overlay\n * would be inventing the third pattern §5 forbids.\n */\nconst AnimatedPressable = Animated.createAnimatedComponent(Pressable);\n\nexport default function KitsDialogControlled({state, onHide}: IKitsDialogControlled) {\n const {\n children,\n content: contentProp,\n onClose,\n asyncClose,\n type,\n icon,\n style,\n contentStyle,\n headerStyle,\n maskStyle,\n position = 'center',\n responsive = true,\n hideHeader,\n headerRender,\n footerRender,\n footerStyle,\n canClose,\n bodyStyle,\n closeIcon,\n // Native default true preserves historical tap-to-dismiss; web's\n // PrimeReact default is false — pass explicitly in shared code.\n dismissableMask = true,\n breakpoints,\n ...rest\n } = state;\n const {resolveToken, theme} = useKitsTheme();\n const severityColors = useSeverityColors(type || 'secondary');\n const colors = type ? severityColors : null;\n const insets = useSafeAreaInsets();\n const isSheet = position === 'bottom';\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const borderColor = colors?.border ?? resolveToken('border');\n const subtextColor = resolveToken('gray.500');\n const grabberColor = resolveToken('gray.300');\n // Scrim via the literal alpha overlay token → rgba(0,0,0,0.4) in both modes.\n const scrimColor = resolveToken('black-alpha-40');\n const brandLogo = type === 'brand' ? theme.config.logo : null;\n\n const resolvedStyle = useResolvedStyle(style || {});\n const resolvedContentStyle = useResolvedStyle(contentStyle || {});\n const resolvedHeaderStyle = useResolvedStyle(headerStyle || {});\n const resolvedMaskStyle = useResolvedStyle(maskStyle || {});\n const resolvedFooterStyle = useResolvedStyle(footerStyle || {});\n const resolvedBodyStyle = useResolvedStyle(bodyStyle || {});\n\n const {width: screenWidth} = useWindowDimensions();\n // Consumer `breakpoints` ({'960px': '75vw'}) mirrors the web prop: the\n // smallest max-width threshold >= the screen width wins; vw/% both map\n // to a percentage of the window width. Falls back to the responsive\n // default (50% tablets/desktop, 95% phones <=641px).\n const breakpointWidth = (() => {\n if (!breakpoints) return null;\n const matches = Object.entries(breakpoints)\n .map(([k, v]) => [parseFloat(k), v] as const)\n .filter(([px]) => !Number.isNaN(px) && screenWidth <= px)\n .sort(([a], [b]) => a - b);\n const value = matches[0]?.[1];\n if (value == null) return null;\n const num = parseFloat(value);\n return Number.isNaN(num) ? null : `${num}%`;\n })();\n const responsiveWidth = breakpointWidth ?? (screenWidth > 641 ? '50%' : '95%');\n const hasExplicitWidth = (resolvedStyle as any).width != null;\n\n const hide = async () => {\n // canClose gate — intercepts every close path (backdrop Pressable,\n // built-in X Pressable, RN Modal onRequestClose). When blocked,\n // onClose is suppressed and the dialog stays open.\n if (canClose === false || (typeof canClose === 'function' && !canClose())) {\n return;\n }\n if (asyncClose && typeof onClose === \"function\") {\n await onClose();\n } else {\n onClose?.();\n }\n onHide();\n };\n\n const {mounted, handleExitFinished} = useOverlayPresence(!!state.visible);\n if (!mounted) return null;\n\n const content = typeof children === \"function\" ? children(hide) : children;\n // Content-mode override (mirrors web): consumer node replaces the whole\n // header / body / footer template inside the panel.\n const contentMode = contentProp != null\n ? (typeof contentProp === \"function\" ? contentProp({hide}) : contentProp)\n : null;\n\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {state.visible && (\n <View style={styles.root}>\n {/*\n ⛔ THE SCRIM IS A SIBLING OF THE PANEL, NOT ITS PARENT.\n It used to be the panel's parent, and opacity composes down a\n view tree — so the scrim's FadeIn/FadeOut multiplied the panel's\n opacity for the whole of both animations and the panel faded as\n well as travelled. `SlideInDown` animates `originY` only and\n never touched opacity; the fade was entirely inherited. Fixed\n 29 September 2026 — the structure is the fix, and no duration\n was tuned to make it look better (§12.5).\n\n ⚠️ IT IS ALSO THE DISMISS TARGET. The component used to draw a\n separate `absoluteFill` Pressable inside the scrim; scrim and\n target are one element now, which is the actionsheet's shape.\n */}\n <AnimatedPressable\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n exiting={FadeOut.duration(scrimExitDuration(isSheet ? anim.sheet.exitDuration : anim.dialog.exitDuration))}\n style={[StyleSheet.absoluteFill, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n onPress={dismissableMask ? hide : undefined}\n />\n {/*\n ⚠️ `pointerEvents=\"box-none\"` IS LOAD-BEARING. This view spans the\n screen so it can place the panel — centred, or pinned to the\n bottom — and it sits ON TOP of the scrim. Without `box-none` it\n would swallow every tap meant for the scrim and tap-to-dismiss\n would stop working. With it, the empty area passes taps through\n to the scrim beneath while the panel still receives its own.\n */}\n <View\n style={isSheet ? styles.sheetArrange : styles.centerArrange}\n pointerEvents=\"box-none\"\n >\n <Animated.View\n /* The sheet asks Reanimated to keep moving under iOS\n \"Reduce Motion\" — see `overlayAnimations.sheet`. Without\n it the panel appears in one frame and the only motion\n left is the scrim, which reads as a fade. The centred\n dialog keeps the system default. */\n entering={isSheet\n ? sheetEnter(anim.sheet.enter)\n : ZoomIn.springify().damping(anim.dialog.enter.damping).stiffness(anim.dialog.enter.stiffness).mass(anim.dialog.enter.mass ?? 1)}\n exiting={isSheet\n ? sheetExit(anim.sheet.exitDuration, handleExitFinished)\n : ZoomOut.duration(anim.dialog.exitDuration).easing(Easing.in(Easing.ease))\n .withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n isSheet && styles.sheetPanel,\n {backgroundColor: surfaceColor, borderColor},\n // Explicit `breakpoints` win even when responsive=false (web parity)\n !isSheet && !hasExplicitWidth && (breakpoints != null || responsive) ? {width: responsiveWidth} : null,\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {contentMode != null ? contentMode : <>\n {/* Grabber (bottom-sheet) */}\n {isSheet && <View style={[styles.grabber, {backgroundColor: grabberColor}]}/>}\n\n {/* Severity accent strip */}\n {colors && !isSheet && (\n <View style={{height: 4, backgroundColor: colors.solid, borderTopLeftRadius: 20, borderTopRightRadius: 20}}/>\n )}\n\n {/* Custom header (headerRender) — fully replaces the built-in header\n View when provided. Wins over the default header even if `header`\n is also set. */}\n {!hideHeader && headerRender != null && headerRender({close: () => { void hide(); }})}\n\n {/* Header (default) — rendered when no headerRender and `header` is set. */}\n {!hideHeader && headerRender == null && rest.header != null && (\n <View style={[styles.header, {borderBottomColor: borderColor}, resolvedHeaderStyle as any]}>\n {/* Inline severity icon */}\n {(icon || brandLogo) && colors && (\n <View style={{\n width: 36,\n height: 36,\n borderRadius: 18,\n backgroundColor: colors.iconBg,\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: 12,\n }}>\n {brandLogo ? brandLogo : typeof icon === 'string' ? (\n <Icon name={icon as never} size={'lg'} color={colors.iconFg}/>\n ) : icon}\n </View>\n )}\n <Text style={{fontSize: 18, fontWeight: \"700\", color: textColor, flex: 1}}>\n {rest.header as React.ReactNode}\n </Text>\n <Pressable onPress={hide} hitSlop={8}>\n {closeIcon ?? <Text style={{fontSize: 18, color: subtextColor}}>✕</Text>}\n </Pressable>\n </View>\n )}\n\n {/* Body — bodyStyle is applied AFTER the built-in maxHeight: 400,\n so consumers can lift the cap (`maxHeight: 600`) or unlock flex\n sizing (`minHeight: 0`) without losing the default behavior when\n bodyStyle is unset. */}\n <ScrollView\n style={[styles.body, resolvedBodyStyle as any]}\n contentContainerStyle={styles.bodyContent}\n showsVerticalScrollIndicator={false}\n >\n {content}\n </ScrollView>\n\n {/* Footer — footerRender takes precedence over `footer`. footerStyle\n is merged AFTER the built-in flex defaults so consumers can override\n alignment (e.g. justifyContent: 'space-between' for left-delete /\n right-actions layouts) without losing the borderTop / padding. */}\n {(footerRender != null || rest.footer != null) && (\n <View style={[\n styles.footer,\n {borderTopColor: borderColor},\n isSheet && {paddingBottom: 12 + insets.bottom},\n resolvedFooterStyle as any,\n ]}>\n {footerRender\n ? footerRender({close: () => { void hide(); }})\n : (rest.footer as React.ReactNode)}\n </View>\n )}\n </>}\n </Animated.View>\n </View>\n </View>\n )}\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n /**\n * The container. ⛔ IT IS NEVER ANIMATED AND CARRIES NO OPACITY — that is the\n * whole point of the change. It only exists to give the scrim and the panel a\n * shared parent so they can be siblings.\n */\n root: {\n flex: 1,\n },\n /**\n * Places the panel. ⚠️ The 24 padding moved here from the old `overlay` style,\n * and it had to: `position: absolute` resolves against a parent's PADDING box\n * in React Native, so a scrim absolutely filling a padded parent would have\n * stopped 24 short of every screen edge and left an undimmed frame. The scrim\n * now fills `root`, which has no padding, and the inset belongs to the layer\n * that positions the panel.\n */\n centerArrange: {\n ...StyleSheet.absoluteFillObject,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 24,\n },\n sheetArrange: {\n ...StyleSheet.absoluteFillObject,\n justifyContent: \"flex-end\",\n },\n sheetPanel: {\n width: \"100%\",\n maxWidth: \"100%\",\n maxHeight: \"90%\",\n borderWidth: 0,\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n borderBottomLeftRadius: 0,\n borderBottomRightRadius: 0,\n paddingTop: 10,\n },\n grabber: {\n width: 40,\n height: 5,\n borderRadius: 999,\n alignSelf: \"center\",\n marginBottom: 6,\n },\n panel: {\n // 20 == radii.xl (no numeric radii resolver on native — see report).\n borderRadius: 20,\n borderWidth: 1,\n minWidth: 250,\n maxWidth: \"90%\",\n maxHeight: \"80%\",\n overflow: \"hidden\",\n // Subtle elevation: low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n },\n header: {\n flexDirection: \"row\",\n alignItems: \"center\",\n paddingHorizontal: 20,\n paddingVertical: 16,\n borderBottomWidth: 1,\n },\n body: {\n maxHeight: 400,\n },\n bodyContent: {\n padding: 20,\n },\n footer: {\n flexDirection: \"row\",\n justifyContent: \"flex-end\",\n paddingHorizontal: 20,\n paddingVertical: 12,\n borderTopWidth: 1,\n gap: 8,\n },\n});\n"],"names":["Pressable","useKitsTheme","useSeverityColors","useSafeAreaInsets","useResolvedStyle","useWindowDimensions","Modal","jsxs","View","jsx","FadeIn","anim","FadeOut","scrimExitDuration","StyleSheet","sheetEnter","ZoomIn","sheetExit","ZoomOut","Easing","runOnJS","Fragment","Icon","Text","ScrollView"],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import React from 'react';
3
3
  import { useWindowDimensions, Modal, View, StyleSheet, Pressable, ScrollView } from 'react-native';
4
- import Animated, { FadeOut, FadeIn, SlideOutDown, Easing, ReduceMotion, ZoomOut, runOnJS, SlideInDown, ZoomIn } from 'react-native-reanimated';
4
+ import Animated, { FadeOut, FadeIn, ZoomOut, Easing, runOnJS, ZoomIn } from 'react-native-reanimated';
5
5
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
6
6
  import { useSeverityColors } from '../../../hooks/useSeverityColors.js';
7
7
  import '../../../contexts/DialogContext.js';
8
8
  import useResolvedStyle from '../../../hooks/useResolvedStyle.js';
9
9
  import { scrimExitDuration, overlayAnimations } from '../../../animations/index.js';
10
+ import { sheetExit, sheetEnter } from '../sheetMotion.js';
10
11
  import { useKitsTheme } from '../../../contexts/Theme/KitsThemeProvider.js';
11
12
  import { Icon } from '../../../primitives/Icon/index.js';
12
13
  import Text from '../../../primitives/Text/index.js';
@@ -113,8 +114,8 @@ function KitsDialogControlled({ state, onHide }) {
113
114
  children: /* @__PURE__ */ jsx(
114
115
  Animated.View,
115
116
  {
116
- entering: isSheet ? SlideInDown.springify().damping(overlayAnimations.sheet.enter.damping).stiffness(overlayAnimations.sheet.enter.stiffness).mass(overlayAnimations.sheet.enter.mass).reduceMotion(ReduceMotion.Never ) : ZoomIn.springify().damping(overlayAnimations.dialog.enter.damping).stiffness(overlayAnimations.dialog.enter.stiffness).mass(overlayAnimations.dialog.enter.mass),
117
- exiting: (isSheet ? SlideOutDown.duration(overlayAnimations.sheet.exitDuration).easing(Easing.in(Easing.ease)).reduceMotion(ReduceMotion.Never ) : ZoomOut.duration(overlayAnimations.dialog.exitDuration).easing(Easing.in(Easing.ease))).withCallback((finished) => {
117
+ entering: isSheet ? sheetEnter(overlayAnimations.sheet.enter) : ZoomIn.springify().damping(overlayAnimations.dialog.enter.damping).stiffness(overlayAnimations.dialog.enter.stiffness).mass(overlayAnimations.dialog.enter.mass),
118
+ exiting: isSheet ? sheetExit(overlayAnimations.sheet.exitDuration, handleExitFinished) : ZoomOut.duration(overlayAnimations.dialog.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {
118
119
  "worklet";
119
120
  if (finished) runOnJS(handleExitFinished)();
120
121
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/components/overlay/Dialog/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Modal, Pressable, ScrollView, StyleSheet, View, useWindowDimensions} from \"react-native\";\nimport Animated, {Easing, FadeIn, FadeOut, ReduceMotion, runOnJS, SlideInDown, SlideOutDown, ZoomIn, ZoomOut} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Icon, Text} from \"../../../_compat\";\nimport type {IKitsDialogControlled} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {useSeverityColors} from \"../../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../../hooks\";\nimport {overlayAnimations as anim, scrimExitDuration} from \"../../../animations\";\n\n/**\n * Keeps the RN Modal mounted through the exit animation. `visible` drives the\n * inner scrim + panel entering/exiting; the Modal itself stays mounted until\n * the panel's exit animation reports finished, then unmounts.\n *\n * Re-entrancy: a new `visible=true` during an exit re-renders the inner (which\n * re-enters), and the still-pending exit callback is ignored because\n * `visibleRef` is already back to `true` — so the Modal is never torn down\n * mid-reopen.\n */\nfunction useOverlayPresence(visible: boolean) {\n const [mounted, setMounted] = React.useState(visible);\n const visibleRef = React.useRef(visible);\n React.useEffect(() => {\n visibleRef.current = visible;\n if (visible) setMounted(true);\n }, [visible]);\n // Runs on the JS thread (dispatched via runOnJS from the exit worklet).\n const handleExitFinished = React.useCallback(() => {\n if (!visibleRef.current) setMounted(false);\n }, []);\n return {mounted, handleExitFinished};\n}\n\n/**\n * The scrim: it fades AND it is the thing you tap to dismiss, in one element.\n *\n * ⛔ THIS IS THE ACTIONSHEET'S SHAPE, NOT A THIRD PATTERN (§5). Two components in\n * this library already keep the backdrop a sibling of the panel:\n * `apps/mobile/src/ui/actionsheet/index.tsx:53` declares `Backdrop:\n * AnimatedPressable` — an animated, tappable element in its own right — and\n * `apps/mobile/src/ui/bottomsheet/index.tsx:124` passes `backdropComponent` to\n * `@gorhom/bottom-sheet`. The gorhom one is a prop-injection API belonging to a\n * sheet container that owns its own presentation; this Dialog owns its own RN\n * `Modal`, so there is nothing to inject into. The actionsheet's shape is the one\n * that fits, and it also collapses the separate `absoluteFill` Pressable this\n * component used to need into the scrim itself.\n *\n * ⚠️ BUILT WITH REANIMATED, NOT WITH THE ACTIONSHEET'S `createMotionAnimatedComponent`.\n * That helper wraps a different animation engine; this file's entering/exiting are\n * reanimated layout animations throughout, and mixing two engines in one overlay\n * would be inventing the third pattern §5 forbids.\n */\nconst AnimatedPressable = Animated.createAnimatedComponent(Pressable);\n\nexport default function KitsDialogControlled({state, onHide}: IKitsDialogControlled) {\n const {\n children,\n content: contentProp,\n onClose,\n asyncClose,\n type,\n icon,\n style,\n contentStyle,\n headerStyle,\n maskStyle,\n position = 'center',\n responsive = true,\n hideHeader,\n headerRender,\n footerRender,\n footerStyle,\n canClose,\n bodyStyle,\n closeIcon,\n // Native default true preserves historical tap-to-dismiss; web's\n // PrimeReact default is false — pass explicitly in shared code.\n dismissableMask = true,\n breakpoints,\n ...rest\n } = state;\n const {resolveToken, theme} = useKitsTheme();\n const severityColors = useSeverityColors(type || 'secondary');\n const colors = type ? severityColors : null;\n const insets = useSafeAreaInsets();\n const isSheet = position === 'bottom';\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const borderColor = colors?.border ?? resolveToken('border');\n const subtextColor = resolveToken('gray.500');\n const grabberColor = resolveToken('gray.300');\n // Scrim via the literal alpha overlay token → rgba(0,0,0,0.4) in both modes.\n const scrimColor = resolveToken('black-alpha-40');\n const brandLogo = type === 'brand' ? theme.config.logo : null;\n\n const resolvedStyle = useResolvedStyle(style || {});\n const resolvedContentStyle = useResolvedStyle(contentStyle || {});\n const resolvedHeaderStyle = useResolvedStyle(headerStyle || {});\n const resolvedMaskStyle = useResolvedStyle(maskStyle || {});\n const resolvedFooterStyle = useResolvedStyle(footerStyle || {});\n const resolvedBodyStyle = useResolvedStyle(bodyStyle || {});\n\n const {width: screenWidth} = useWindowDimensions();\n // Consumer `breakpoints` ({'960px': '75vw'}) mirrors the web prop: the\n // smallest max-width threshold >= the screen width wins; vw/% both map\n // to a percentage of the window width. Falls back to the responsive\n // default (50% tablets/desktop, 95% phones <=641px).\n const breakpointWidth = (() => {\n if (!breakpoints) return null;\n const matches = Object.entries(breakpoints)\n .map(([k, v]) => [parseFloat(k), v] as const)\n .filter(([px]) => !Number.isNaN(px) && screenWidth <= px)\n .sort(([a], [b]) => a - b);\n const value = matches[0]?.[1];\n if (value == null) return null;\n const num = parseFloat(value);\n return Number.isNaN(num) ? null : `${num}%`;\n })();\n const responsiveWidth = breakpointWidth ?? (screenWidth > 641 ? '50%' : '95%');\n const hasExplicitWidth = (resolvedStyle as any).width != null;\n\n const hide = async () => {\n // canClose gate — intercepts every close path (backdrop Pressable,\n // built-in X Pressable, RN Modal onRequestClose). When blocked,\n // onClose is suppressed and the dialog stays open.\n if (canClose === false || (typeof canClose === 'function' && !canClose())) {\n return;\n }\n if (asyncClose && typeof onClose === \"function\") {\n await onClose();\n } else {\n onClose?.();\n }\n onHide();\n };\n\n const {mounted, handleExitFinished} = useOverlayPresence(!!state.visible);\n if (!mounted) return null;\n\n const content = typeof children === \"function\" ? children(hide) : children;\n // Content-mode override (mirrors web): consumer node replaces the whole\n // header / body / footer template inside the panel.\n const contentMode = contentProp != null\n ? (typeof contentProp === \"function\" ? contentProp({hide}) : contentProp)\n : null;\n\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {state.visible && (\n <View style={styles.root}>\n {/*\n ⛔ THE SCRIM IS A SIBLING OF THE PANEL, NOT ITS PARENT.\n It used to be the panel's parent, and opacity composes down a\n view tree — so the scrim's FadeIn/FadeOut multiplied the panel's\n opacity for the whole of both animations and the panel faded as\n well as travelled. `SlideInDown` animates `originY` only and\n never touched opacity; the fade was entirely inherited. Fixed\n 29 September 2026 — the structure is the fix, and no duration\n was tuned to make it look better (§12.5).\n\n ⚠️ IT IS ALSO THE DISMISS TARGET. The component used to draw a\n separate `absoluteFill` Pressable inside the scrim; scrim and\n target are one element now, which is the actionsheet's shape.\n */}\n <AnimatedPressable\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n exiting={FadeOut.duration(scrimExitDuration(isSheet ? anim.sheet.exitDuration : anim.dialog.exitDuration))}\n style={[StyleSheet.absoluteFill, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n onPress={dismissableMask ? hide : undefined}\n />\n {/*\n ⚠️ `pointerEvents=\"box-none\"` IS LOAD-BEARING. This view spans the\n screen so it can place the panel — centred, or pinned to the\n bottom — and it sits ON TOP of the scrim. Without `box-none` it\n would swallow every tap meant for the scrim and tap-to-dismiss\n would stop working. With it, the empty area passes taps through\n to the scrim beneath while the panel still receives its own.\n */}\n <View\n style={isSheet ? styles.sheetArrange : styles.centerArrange}\n pointerEvents=\"box-none\"\n >\n <Animated.View\n /* The sheet asks Reanimated to keep moving under iOS\n \"Reduce Motion\" — see `overlayAnimations.sheet`. Without\n it the panel appears in one frame and the only motion\n left is the scrim, which reads as a fade. The centred\n dialog keeps the system default. */\n entering={isSheet\n ? SlideInDown.springify().damping(anim.sheet.enter.damping).stiffness(anim.sheet.enter.stiffness).mass(anim.sheet.enter.mass ?? 1)\n .reduceMotion(anim.sheet.keepMotionWhenReduced ? ReduceMotion.Never : ReduceMotion.System)\n : ZoomIn.springify().damping(anim.dialog.enter.damping).stiffness(anim.dialog.enter.stiffness).mass(anim.dialog.enter.mass ?? 1)}\n exiting={(isSheet\n ? SlideOutDown.duration(anim.sheet.exitDuration).easing(Easing.in(Easing.ease))\n .reduceMotion(anim.sheet.keepMotionWhenReduced ? ReduceMotion.Never : ReduceMotion.System)\n : ZoomOut.duration(anim.dialog.exitDuration).easing(Easing.in(Easing.ease))\n ).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n isSheet && styles.sheetPanel,\n {backgroundColor: surfaceColor, borderColor},\n // Explicit `breakpoints` win even when responsive=false (web parity)\n !isSheet && !hasExplicitWidth && (breakpoints != null || responsive) ? {width: responsiveWidth} : null,\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {contentMode != null ? contentMode : <>\n {/* Grabber (bottom-sheet) */}\n {isSheet && <View style={[styles.grabber, {backgroundColor: grabberColor}]}/>}\n\n {/* Severity accent strip */}\n {colors && !isSheet && (\n <View style={{height: 4, backgroundColor: colors.solid, borderTopLeftRadius: 20, borderTopRightRadius: 20}}/>\n )}\n\n {/* Custom header (headerRender) — fully replaces the built-in header\n View when provided. Wins over the default header even if `header`\n is also set. */}\n {!hideHeader && headerRender != null && headerRender({close: () => { void hide(); }})}\n\n {/* Header (default) — rendered when no headerRender and `header` is set. */}\n {!hideHeader && headerRender == null && rest.header != null && (\n <View style={[styles.header, {borderBottomColor: borderColor}, resolvedHeaderStyle as any]}>\n {/* Inline severity icon */}\n {(icon || brandLogo) && colors && (\n <View style={{\n width: 36,\n height: 36,\n borderRadius: 18,\n backgroundColor: colors.iconBg,\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: 12,\n }}>\n {brandLogo ? brandLogo : typeof icon === 'string' ? (\n <Icon name={icon as never} size={'lg'} color={colors.iconFg}/>\n ) : icon}\n </View>\n )}\n <Text style={{fontSize: 18, fontWeight: \"700\", color: textColor, flex: 1}}>\n {rest.header as React.ReactNode}\n </Text>\n <Pressable onPress={hide} hitSlop={8}>\n {closeIcon ?? <Text style={{fontSize: 18, color: subtextColor}}>✕</Text>}\n </Pressable>\n </View>\n )}\n\n {/* Body — bodyStyle is applied AFTER the built-in maxHeight: 400,\n so consumers can lift the cap (`maxHeight: 600`) or unlock flex\n sizing (`minHeight: 0`) without losing the default behavior when\n bodyStyle is unset. */}\n <ScrollView\n style={[styles.body, resolvedBodyStyle as any]}\n contentContainerStyle={styles.bodyContent}\n showsVerticalScrollIndicator={false}\n >\n {content}\n </ScrollView>\n\n {/* Footer — footerRender takes precedence over `footer`. footerStyle\n is merged AFTER the built-in flex defaults so consumers can override\n alignment (e.g. justifyContent: 'space-between' for left-delete /\n right-actions layouts) without losing the borderTop / padding. */}\n {(footerRender != null || rest.footer != null) && (\n <View style={[\n styles.footer,\n {borderTopColor: borderColor},\n isSheet && {paddingBottom: 12 + insets.bottom},\n resolvedFooterStyle as any,\n ]}>\n {footerRender\n ? footerRender({close: () => { void hide(); }})\n : (rest.footer as React.ReactNode)}\n </View>\n )}\n </>}\n </Animated.View>\n </View>\n </View>\n )}\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n /**\n * The container. ⛔ IT IS NEVER ANIMATED AND CARRIES NO OPACITY — that is the\n * whole point of the change. It only exists to give the scrim and the panel a\n * shared parent so they can be siblings.\n */\n root: {\n flex: 1,\n },\n /**\n * Places the panel. ⚠️ The 24 padding moved here from the old `overlay` style,\n * and it had to: `position: absolute` resolves against a parent's PADDING box\n * in React Native, so a scrim absolutely filling a padded parent would have\n * stopped 24 short of every screen edge and left an undimmed frame. The scrim\n * now fills `root`, which has no padding, and the inset belongs to the layer\n * that positions the panel.\n */\n centerArrange: {\n ...StyleSheet.absoluteFillObject,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 24,\n },\n sheetArrange: {\n ...StyleSheet.absoluteFillObject,\n justifyContent: \"flex-end\",\n },\n sheetPanel: {\n width: \"100%\",\n maxWidth: \"100%\",\n maxHeight: \"90%\",\n borderWidth: 0,\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n borderBottomLeftRadius: 0,\n borderBottomRightRadius: 0,\n paddingTop: 10,\n },\n grabber: {\n width: 40,\n height: 5,\n borderRadius: 999,\n alignSelf: \"center\",\n marginBottom: 6,\n },\n panel: {\n // 20 == radii.xl (no numeric radii resolver on native — see report).\n borderRadius: 20,\n borderWidth: 1,\n minWidth: 250,\n maxWidth: \"90%\",\n maxHeight: \"80%\",\n overflow: \"hidden\",\n // Subtle elevation: low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n },\n header: {\n flexDirection: \"row\",\n alignItems: \"center\",\n paddingHorizontal: 20,\n paddingVertical: 16,\n borderBottomWidth: 1,\n },\n body: {\n maxHeight: 400,\n },\n bodyContent: {\n padding: 20,\n },\n footer: {\n flexDirection: \"row\",\n justifyContent: \"flex-end\",\n paddingHorizontal: 20,\n paddingVertical: 12,\n borderTopWidth: 1,\n gap: 8,\n },\n});\n"],"names":["anim"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/components/overlay/Dialog/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Modal, Pressable, ScrollView, StyleSheet, View, useWindowDimensions} from \"react-native\";\n/* ⛔ `ReduceMotion` IS GONE FROM THIS FILE, AND THAT IS A STATEMENT, NOT A\n TIDY-UP. The sheet used to carry `.reduceMotion(ReduceMotion.Never)` — an\n instruction to keep moving when the device asks for less motion — and it is\n on record that the modifier does not hold: the sheet was skipped anyway, in\n this library's own Storybook as well as in the App. It was a claim the code\n could not deliver, so it is removed rather than left to be believed.\n ⚠️ A CUSTOM entering/exiting is outside Reanimated's reduce-motion handling\n altogether, so the sheet now genuinely keeps its motion — which is what the\n modifier was asking for and never achieved. `anim.sheet.keepMotionWhenReduced`\n is left in the presets: ConfirmDialog is a separate unit and no preset should\n change under it. */\nimport Animated, {Easing, FadeIn, FadeOut, runOnJS, ZoomIn, ZoomOut} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Icon, Text} from \"../../../_compat\";\nimport type {IKitsDialogControlled} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {useSeverityColors} from \"../../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../../hooks\";\nimport {overlayAnimations as anim, scrimExitDuration} from \"../../../animations\";\nimport {sheetEnter, sheetExit} from \"../sheetMotion\";\n\n/**\n * Keeps the RN Modal mounted through the exit animation. `visible` drives the\n * inner scrim + panel entering/exiting; the Modal itself stays mounted until\n * the panel's exit animation reports finished, then unmounts.\n *\n * Re-entrancy: a new `visible=true` during an exit re-renders the inner (which\n * re-enters), and the still-pending exit callback is ignored because\n * `visibleRef` is already back to `true` — so the Modal is never torn down\n * mid-reopen.\n */\nfunction useOverlayPresence(visible: boolean) {\n const [mounted, setMounted] = React.useState(visible);\n const visibleRef = React.useRef(visible);\n React.useEffect(() => {\n visibleRef.current = visible;\n if (visible) setMounted(true);\n }, [visible]);\n // Runs on the JS thread (dispatched via runOnJS from the exit worklet).\n const handleExitFinished = React.useCallback(() => {\n if (!visibleRef.current) setMounted(false);\n }, []);\n return {mounted, handleExitFinished};\n}\n\n/**\n * The scrim: it fades AND it is the thing you tap to dismiss, in one element.\n *\n * ⛔ THIS IS THE ACTIONSHEET'S SHAPE, NOT A THIRD PATTERN (§5). Two components in\n * this library already keep the backdrop a sibling of the panel:\n * `apps/mobile/src/ui/actionsheet/index.tsx:53` declares `Backdrop:\n * AnimatedPressable` — an animated, tappable element in its own right — and\n * `apps/mobile/src/ui/bottomsheet/index.tsx:124` passes `backdropComponent` to\n * `@gorhom/bottom-sheet`. The gorhom one is a prop-injection API belonging to a\n * sheet container that owns its own presentation; this Dialog owns its own RN\n * `Modal`, so there is nothing to inject into. The actionsheet's shape is the one\n * that fits, and it also collapses the separate `absoluteFill` Pressable this\n * component used to need into the scrim itself.\n *\n * ⚠️ BUILT WITH REANIMATED, NOT WITH THE ACTIONSHEET'S `createMotionAnimatedComponent`.\n * That helper wraps a different animation engine; this file's entering/exiting are\n * reanimated layout animations throughout, and mixing two engines in one overlay\n * would be inventing the third pattern §5 forbids.\n */\nconst AnimatedPressable = Animated.createAnimatedComponent(Pressable);\n\nexport default function KitsDialogControlled({state, onHide}: IKitsDialogControlled) {\n const {\n children,\n content: contentProp,\n onClose,\n asyncClose,\n type,\n icon,\n style,\n contentStyle,\n headerStyle,\n maskStyle,\n position = 'center',\n responsive = true,\n hideHeader,\n headerRender,\n footerRender,\n footerStyle,\n canClose,\n bodyStyle,\n closeIcon,\n // Native default true preserves historical tap-to-dismiss; web's\n // PrimeReact default is false — pass explicitly in shared code.\n dismissableMask = true,\n breakpoints,\n ...rest\n } = state;\n const {resolveToken, theme} = useKitsTheme();\n const severityColors = useSeverityColors(type || 'secondary');\n const colors = type ? severityColors : null;\n const insets = useSafeAreaInsets();\n const isSheet = position === 'bottom';\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const borderColor = colors?.border ?? resolveToken('border');\n const subtextColor = resolveToken('gray.500');\n const grabberColor = resolveToken('gray.300');\n // Scrim via the literal alpha overlay token → rgba(0,0,0,0.4) in both modes.\n const scrimColor = resolveToken('black-alpha-40');\n const brandLogo = type === 'brand' ? theme.config.logo : null;\n\n const resolvedStyle = useResolvedStyle(style || {});\n const resolvedContentStyle = useResolvedStyle(contentStyle || {});\n const resolvedHeaderStyle = useResolvedStyle(headerStyle || {});\n const resolvedMaskStyle = useResolvedStyle(maskStyle || {});\n const resolvedFooterStyle = useResolvedStyle(footerStyle || {});\n const resolvedBodyStyle = useResolvedStyle(bodyStyle || {});\n\n const {width: screenWidth} = useWindowDimensions();\n // Consumer `breakpoints` ({'960px': '75vw'}) mirrors the web prop: the\n // smallest max-width threshold >= the screen width wins; vw/% both map\n // to a percentage of the window width. Falls back to the responsive\n // default (50% tablets/desktop, 95% phones <=641px).\n const breakpointWidth = (() => {\n if (!breakpoints) return null;\n const matches = Object.entries(breakpoints)\n .map(([k, v]) => [parseFloat(k), v] as const)\n .filter(([px]) => !Number.isNaN(px) && screenWidth <= px)\n .sort(([a], [b]) => a - b);\n const value = matches[0]?.[1];\n if (value == null) return null;\n const num = parseFloat(value);\n return Number.isNaN(num) ? null : `${num}%`;\n })();\n const responsiveWidth = breakpointWidth ?? (screenWidth > 641 ? '50%' : '95%');\n const hasExplicitWidth = (resolvedStyle as any).width != null;\n\n const hide = async () => {\n // canClose gate — intercepts every close path (backdrop Pressable,\n // built-in X Pressable, RN Modal onRequestClose). When blocked,\n // onClose is suppressed and the dialog stays open.\n if (canClose === false || (typeof canClose === 'function' && !canClose())) {\n return;\n }\n if (asyncClose && typeof onClose === \"function\") {\n await onClose();\n } else {\n onClose?.();\n }\n onHide();\n };\n\n const {mounted, handleExitFinished} = useOverlayPresence(!!state.visible);\n if (!mounted) return null;\n\n const content = typeof children === \"function\" ? children(hide) : children;\n // Content-mode override (mirrors web): consumer node replaces the whole\n // header / body / footer template inside the panel.\n const contentMode = contentProp != null\n ? (typeof contentProp === \"function\" ? contentProp({hide}) : contentProp)\n : null;\n\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {state.visible && (\n <View style={styles.root}>\n {/*\n ⛔ THE SCRIM IS A SIBLING OF THE PANEL, NOT ITS PARENT.\n It used to be the panel's parent, and opacity composes down a\n view tree — so the scrim's FadeIn/FadeOut multiplied the panel's\n opacity for the whole of both animations and the panel faded as\n well as travelled. `SlideInDown` animates `originY` only and\n never touched opacity; the fade was entirely inherited. Fixed\n 29 September 2026 — the structure is the fix, and no duration\n was tuned to make it look better (§12.5).\n\n ⚠️ IT IS ALSO THE DISMISS TARGET. The component used to draw a\n separate `absoluteFill` Pressable inside the scrim; scrim and\n target are one element now, which is the actionsheet's shape.\n */}\n <AnimatedPressable\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n exiting={FadeOut.duration(scrimExitDuration(isSheet ? anim.sheet.exitDuration : anim.dialog.exitDuration))}\n style={[StyleSheet.absoluteFill, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n onPress={dismissableMask ? hide : undefined}\n />\n {/*\n ⚠️ `pointerEvents=\"box-none\"` IS LOAD-BEARING. This view spans the\n screen so it can place the panel — centred, or pinned to the\n bottom — and it sits ON TOP of the scrim. Without `box-none` it\n would swallow every tap meant for the scrim and tap-to-dismiss\n would stop working. With it, the empty area passes taps through\n to the scrim beneath while the panel still receives its own.\n */}\n <View\n style={isSheet ? styles.sheetArrange : styles.centerArrange}\n pointerEvents=\"box-none\"\n >\n <Animated.View\n /* The sheet asks Reanimated to keep moving under iOS\n \"Reduce Motion\" — see `overlayAnimations.sheet`. Without\n it the panel appears in one frame and the only motion\n left is the scrim, which reads as a fade. The centred\n dialog keeps the system default. */\n entering={isSheet\n ? sheetEnter(anim.sheet.enter)\n : ZoomIn.springify().damping(anim.dialog.enter.damping).stiffness(anim.dialog.enter.stiffness).mass(anim.dialog.enter.mass ?? 1)}\n exiting={isSheet\n ? sheetExit(anim.sheet.exitDuration, handleExitFinished)\n : ZoomOut.duration(anim.dialog.exitDuration).easing(Easing.in(Easing.ease))\n .withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n isSheet && styles.sheetPanel,\n {backgroundColor: surfaceColor, borderColor},\n // Explicit `breakpoints` win even when responsive=false (web parity)\n !isSheet && !hasExplicitWidth && (breakpoints != null || responsive) ? {width: responsiveWidth} : null,\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {contentMode != null ? contentMode : <>\n {/* Grabber (bottom-sheet) */}\n {isSheet && <View style={[styles.grabber, {backgroundColor: grabberColor}]}/>}\n\n {/* Severity accent strip */}\n {colors && !isSheet && (\n <View style={{height: 4, backgroundColor: colors.solid, borderTopLeftRadius: 20, borderTopRightRadius: 20}}/>\n )}\n\n {/* Custom header (headerRender) — fully replaces the built-in header\n View when provided. Wins over the default header even if `header`\n is also set. */}\n {!hideHeader && headerRender != null && headerRender({close: () => { void hide(); }})}\n\n {/* Header (default) — rendered when no headerRender and `header` is set. */}\n {!hideHeader && headerRender == null && rest.header != null && (\n <View style={[styles.header, {borderBottomColor: borderColor}, resolvedHeaderStyle as any]}>\n {/* Inline severity icon */}\n {(icon || brandLogo) && colors && (\n <View style={{\n width: 36,\n height: 36,\n borderRadius: 18,\n backgroundColor: colors.iconBg,\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: 12,\n }}>\n {brandLogo ? brandLogo : typeof icon === 'string' ? (\n <Icon name={icon as never} size={'lg'} color={colors.iconFg}/>\n ) : icon}\n </View>\n )}\n <Text style={{fontSize: 18, fontWeight: \"700\", color: textColor, flex: 1}}>\n {rest.header as React.ReactNode}\n </Text>\n <Pressable onPress={hide} hitSlop={8}>\n {closeIcon ?? <Text style={{fontSize: 18, color: subtextColor}}>✕</Text>}\n </Pressable>\n </View>\n )}\n\n {/* Body — bodyStyle is applied AFTER the built-in maxHeight: 400,\n so consumers can lift the cap (`maxHeight: 600`) or unlock flex\n sizing (`minHeight: 0`) without losing the default behavior when\n bodyStyle is unset. */}\n <ScrollView\n style={[styles.body, resolvedBodyStyle as any]}\n contentContainerStyle={styles.bodyContent}\n showsVerticalScrollIndicator={false}\n >\n {content}\n </ScrollView>\n\n {/* Footer — footerRender takes precedence over `footer`. footerStyle\n is merged AFTER the built-in flex defaults so consumers can override\n alignment (e.g. justifyContent: 'space-between' for left-delete /\n right-actions layouts) without losing the borderTop / padding. */}\n {(footerRender != null || rest.footer != null) && (\n <View style={[\n styles.footer,\n {borderTopColor: borderColor},\n isSheet && {paddingBottom: 12 + insets.bottom},\n resolvedFooterStyle as any,\n ]}>\n {footerRender\n ? footerRender({close: () => { void hide(); }})\n : (rest.footer as React.ReactNode)}\n </View>\n )}\n </>}\n </Animated.View>\n </View>\n </View>\n )}\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n /**\n * The container. ⛔ IT IS NEVER ANIMATED AND CARRIES NO OPACITY — that is the\n * whole point of the change. It only exists to give the scrim and the panel a\n * shared parent so they can be siblings.\n */\n root: {\n flex: 1,\n },\n /**\n * Places the panel. ⚠️ The 24 padding moved here from the old `overlay` style,\n * and it had to: `position: absolute` resolves against a parent's PADDING box\n * in React Native, so a scrim absolutely filling a padded parent would have\n * stopped 24 short of every screen edge and left an undimmed frame. The scrim\n * now fills `root`, which has no padding, and the inset belongs to the layer\n * that positions the panel.\n */\n centerArrange: {\n ...StyleSheet.absoluteFillObject,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 24,\n },\n sheetArrange: {\n ...StyleSheet.absoluteFillObject,\n justifyContent: \"flex-end\",\n },\n sheetPanel: {\n width: \"100%\",\n maxWidth: \"100%\",\n maxHeight: \"90%\",\n borderWidth: 0,\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n borderBottomLeftRadius: 0,\n borderBottomRightRadius: 0,\n paddingTop: 10,\n },\n grabber: {\n width: 40,\n height: 5,\n borderRadius: 999,\n alignSelf: \"center\",\n marginBottom: 6,\n },\n panel: {\n // 20 == radii.xl (no numeric radii resolver on native — see report).\n borderRadius: 20,\n borderWidth: 1,\n minWidth: 250,\n maxWidth: \"90%\",\n maxHeight: \"80%\",\n overflow: \"hidden\",\n // Subtle elevation: low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n },\n header: {\n flexDirection: \"row\",\n alignItems: \"center\",\n paddingHorizontal: 20,\n paddingVertical: 16,\n borderBottomWidth: 1,\n },\n body: {\n maxHeight: 400,\n },\n bodyContent: {\n padding: 20,\n },\n footer: {\n flexDirection: \"row\",\n justifyContent: \"flex-end\",\n paddingHorizontal: 20,\n paddingVertical: 12,\n borderTopWidth: 1,\n gap: 8,\n },\n});\n"],"names":["anim"],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ 'use strict';
2
+
3
+ var Animated = require('react-native-reanimated');
4
+
5
+ const sheetEnter = (sheet) => (values) => {
6
+ "worklet";
7
+ return {
8
+ initialValues: { transform: [{ translateY: values.targetHeight }] },
9
+ animations: {
10
+ transform: [{
11
+ translateY: Animated.withTiming(0, {
12
+ duration: sheet.duration,
13
+ /* Deceleration, which is what a platform sheet does: fast
14
+ off the bottom edge, easing into its stop. `Easing.out`
15
+ is resolved here rather than stored in the preset,
16
+ because an Easing function is not serialisable config. */
17
+ easing: Animated.Easing.out(Animated.Easing.cubic)
18
+ })
19
+ }]
20
+ }
21
+ };
22
+ };
23
+ const sheetExit = (duration, onFinished) => (values) => {
24
+ "worklet";
25
+ return {
26
+ initialValues: { transform: [{ translateY: 0 }] },
27
+ animations: {
28
+ transform: [{
29
+ translateY: Animated.withTiming(values.currentHeight, {
30
+ duration,
31
+ easing: Animated.Easing.in(Animated.Easing.ease)
32
+ })
33
+ }]
34
+ },
35
+ /* ⛔ THE MODAL UNMOUNTS ON THIS. A custom exiting reports through
36
+ `callback`, where a built-in used `.withCallback`. Losing it
37
+ would leave the RN Modal mounted over the app for ever. */
38
+ callback: (finished) => {
39
+ "worklet";
40
+ if (finished) Animated.runOnJS(onFinished)();
41
+ }
42
+ };
43
+ };
44
+
45
+ exports.sheetEnter = sheetEnter;
46
+ exports.sheetExit = sheetExit;
47
+ //# sourceMappingURL=sheetMotion.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheetMotion.cjs","sources":["../../../../src/components/overlay/sheetMotion.native.ts"],"sourcesContent":["import {Easing, runOnJS, withTiming} from \"react-native-reanimated\";\n\n/**\n * The bottom sheet's entering and exiting motion, for every overlay in this\n * library that presents one. ⛔ ONE DEFINITION, TWO CALLERS — `Dialog` and\n * `ConfirmDialog` both draw a sheet inside their own RN `Modal`, both hit the\n * same fault, and two copies of an animation drift the moment one is tuned.\n *\n**\n * ⛔ THE SHEET'S SLIDE IS WRITTEN BY HAND, BECAUSE `SlideInDown` DOES NOT MOVE\n * THIS PANEL AT ALL — measured on an iPhone 16 Pro simulator, 30 September 2026.\n *\n * ⚠️ THE MEASUREMENT, because three earlier rounds of this hunt cited\n * instruments that exist in no repository. One view, one tree, one Modal, one\n * method — a tap followed by a screenshot — and only the animation changed:\n *\n * FadeIn.duration(10000) the panel is caught HALF TRANSPARENT\n * SlideInDown.duration(10000) the panel is at rest and fully opaque\n * translateY 700 -> 0, 10000ms the panel is caught PARTWAY UP THE SCREEN\n *\n * So the view can be faded, and it can be translated. What fails is\n * `SlideInDown`'s own arithmetic for HOW FAR to travel. It derives that from\n * the window — and inside a React Native `Modal`, which hosts its own native\n * view hierarchy, the window it measures is not the screen. The distance comes\n * out as nothing, so the panel is placed at its resting position on frame one.\n *\n * ⚠️ THE DURATIONS ABOVE ARE THE INSTRUMENT, NOT THE PRODUCT. 10000ms was used\n * because the only method available — tap, then screenshot — has a round trip\n * longer than three seconds, which silently invalidated an earlier round of\n * 3000ms probes: every one of them showed a finished animation and read as\n * \"nothing ran\". No shipped duration was touched to make anything look better\n * (§12.5); the numbers below are still `overlayAnimations`'.\n *\n * ⛔ AND THIS IS WHY THE SCRIM-AND-PANEL SIBLING FIX CHANGED NOTHING VISIBLE.\n * That fix was real: the panel had been inheriting the scrim's fade. But the\n * panel's own slide had never run, so removing the inherited fade left a panel\n * that simply appears. The fix made the sheet strictly LESS animated, and the\n * report that \"it is the same\" was correct.\n *\n * WHAT THESE USE INSTEAD. `targetHeight` and `currentHeight` are the PANEL's\n * own box, laid out inside the Modal's own hierarchy, so they are the one\n * distance that is right in this coordinate space. A sheet travels its own\n * height; it never needed the window.\n */\n/**\n * ⛔ A DURATION, NOT A SPRING, AND THE RULING CHANGED TO GET HERE. The entrance\n * was a spring because the motion spec said so. Fouad withdrew that on 30\n * September 2026 in favour of §5: whatever the app's existing sheets do, this\n * does. They are presented by the PLATFORM — RN's `Modal animationType=\"slide\"`\n * and React Navigation's `slide_from_bottom` — which slides for a fixed time on\n * an ease-out and stops dead.\n *\n * ⚠️ AND THE MEASUREMENT SAID THE SAME THING. The old spring's damping ratio was\n * 1.10 — overdamped — so it approached its resting place asymptotically. Its\n * first travel was fine (154ms against the platform's 126ms); it was still\n * creeping 437ms after the tap. A duration cannot do that: it arrives and stops.\n * Numbers, method and instrument: `overlayAnimations.sheet.enter.duration`.\n *\n * ⚠️ THE SIGNATURE IS UNCHANGED ON PURPOSE. `duration` was added to the SAME\n * `anim.sheet.enter` object the spring fields live on, so `Dialog` and\n * `ConfirmDialog` still pass exactly what they passed before and neither file is\n * touched by this change. The spring fields are still read — by a consumer\n * driving its own `Animated.spring`; see the preset's note.\n */\nexport const sheetEnter = (sheet: {duration: number}) =>\n (values: any) => {\n 'worklet';\n return {\n initialValues: {transform: [{translateY: values.targetHeight}]},\n animations: {\n transform: [{\n translateY: withTiming(0, {\n duration: sheet.duration,\n /* Deceleration, which is what a platform sheet does: fast\n off the bottom edge, easing into its stop. `Easing.out`\n is resolved here rather than stored in the preset,\n because an Easing function is not serialisable config. */\n easing: Easing.out(Easing.cubic),\n }),\n }],\n },\n };\n };\n\nexport const sheetExit = (duration: number, onFinished: () => void) =>\n (values: any) => {\n 'worklet';\n return {\n initialValues: {transform: [{translateY: 0}]},\n animations: {\n transform: [{\n translateY: withTiming(values.currentHeight, {\n duration,\n easing: Easing.in(Easing.ease),\n }),\n }],\n },\n /* ⛔ THE MODAL UNMOUNTS ON THIS. A custom exiting reports through\n `callback`, where a built-in used `.withCallback`. Losing it\n would leave the RN Modal mounted over the app for ever. */\n callback: (finished: boolean) => {\n 'worklet';\n if (finished) runOnJS(onFinished)();\n },\n };\n };\n\n\n"],"names":["withTiming","Easing","runOnJS"],"mappings":";;;;AAgEO,MAAM,UAAA,GAAa,CAAC,KAAA,KACvB,CAAC,MAAA,KAAgB;AACb,EAAA,SAAA;AACA,EAAA,OAAO;AAAA,IACH,aAAA,EAAe,EAAC,SAAA,EAAW,CAAC,EAAC,UAAA,EAAY,MAAA,CAAO,YAAA,EAAa,CAAA,EAAC;AAAA,IAC9D,UAAA,EAAY;AAAA,MACR,WAAW,CAAC;AAAA,QACR,UAAA,EAAYA,oBAAW,CAAA,EAAG;AAAA,UACtB,UAAU,KAAA,CAAM,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAKhB,MAAA,EAAQC,eAAA,CAAO,GAAA,CAAIA,eAAA,CAAO,KAAK;AAAA,SAClC;AAAA,OACJ;AAAA;AACL,GACJ;AACJ;AAEG,MAAM,SAAA,GAAY,CAAC,QAAA,EAAkB,UAAA,KACxC,CAAC,MAAA,KAAgB;AACb,EAAA,SAAA;AACA,EAAA,OAAO;AAAA,IACH,aAAA,EAAe,EAAC,SAAA,EAAW,CAAC,EAAC,UAAA,EAAY,CAAA,EAAE,CAAA,EAAC;AAAA,IAC5C,UAAA,EAAY;AAAA,MACR,WAAW,CAAC;AAAA,QACR,UAAA,EAAYD,mBAAA,CAAW,MAAA,CAAO,aAAA,EAAe;AAAA,UACzC,QAAA;AAAA,UACA,MAAA,EAAQC,eAAA,CAAO,EAAA,CAAGA,eAAA,CAAO,IAAI;AAAA,SAChC;AAAA,OACJ;AAAA,KACL;AAAA;AAAA;AAAA;AAAA,IAIA,QAAA,EAAU,CAAC,QAAA,KAAsB;AAC7B,MAAA,SAAA;AACA,MAAA,IAAI,QAAA,EAAUC,gBAAA,CAAQ,UAAU,CAAA,EAAE;AAAA,IACtC;AAAA,GACJ;AACJ;;;;;"}
@@ -0,0 +1,44 @@
1
+ import { runOnJS, withTiming, Easing } from 'react-native-reanimated';
2
+
3
+ const sheetEnter = (sheet) => (values) => {
4
+ "worklet";
5
+ return {
6
+ initialValues: { transform: [{ translateY: values.targetHeight }] },
7
+ animations: {
8
+ transform: [{
9
+ translateY: withTiming(0, {
10
+ duration: sheet.duration,
11
+ /* Deceleration, which is what a platform sheet does: fast
12
+ off the bottom edge, easing into its stop. `Easing.out`
13
+ is resolved here rather than stored in the preset,
14
+ because an Easing function is not serialisable config. */
15
+ easing: Easing.out(Easing.cubic)
16
+ })
17
+ }]
18
+ }
19
+ };
20
+ };
21
+ const sheetExit = (duration, onFinished) => (values) => {
22
+ "worklet";
23
+ return {
24
+ initialValues: { transform: [{ translateY: 0 }] },
25
+ animations: {
26
+ transform: [{
27
+ translateY: withTiming(values.currentHeight, {
28
+ duration,
29
+ easing: Easing.in(Easing.ease)
30
+ })
31
+ }]
32
+ },
33
+ /* ⛔ THE MODAL UNMOUNTS ON THIS. A custom exiting reports through
34
+ `callback`, where a built-in used `.withCallback`. Losing it
35
+ would leave the RN Modal mounted over the app for ever. */
36
+ callback: (finished) => {
37
+ "worklet";
38
+ if (finished) runOnJS(onFinished)();
39
+ }
40
+ };
41
+ };
42
+
43
+ export { sheetEnter, sheetExit };
44
+ //# sourceMappingURL=sheetMotion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheetMotion.js","sources":["../../../../src/components/overlay/sheetMotion.native.ts"],"sourcesContent":["import {Easing, runOnJS, withTiming} from \"react-native-reanimated\";\n\n/**\n * The bottom sheet's entering and exiting motion, for every overlay in this\n * library that presents one. ⛔ ONE DEFINITION, TWO CALLERS — `Dialog` and\n * `ConfirmDialog` both draw a sheet inside their own RN `Modal`, both hit the\n * same fault, and two copies of an animation drift the moment one is tuned.\n *\n**\n * ⛔ THE SHEET'S SLIDE IS WRITTEN BY HAND, BECAUSE `SlideInDown` DOES NOT MOVE\n * THIS PANEL AT ALL — measured on an iPhone 16 Pro simulator, 30 September 2026.\n *\n * ⚠️ THE MEASUREMENT, because three earlier rounds of this hunt cited\n * instruments that exist in no repository. One view, one tree, one Modal, one\n * method — a tap followed by a screenshot — and only the animation changed:\n *\n * FadeIn.duration(10000) the panel is caught HALF TRANSPARENT\n * SlideInDown.duration(10000) the panel is at rest and fully opaque\n * translateY 700 -> 0, 10000ms the panel is caught PARTWAY UP THE SCREEN\n *\n * So the view can be faded, and it can be translated. What fails is\n * `SlideInDown`'s own arithmetic for HOW FAR to travel. It derives that from\n * the window — and inside a React Native `Modal`, which hosts its own native\n * view hierarchy, the window it measures is not the screen. The distance comes\n * out as nothing, so the panel is placed at its resting position on frame one.\n *\n * ⚠️ THE DURATIONS ABOVE ARE THE INSTRUMENT, NOT THE PRODUCT. 10000ms was used\n * because the only method available — tap, then screenshot — has a round trip\n * longer than three seconds, which silently invalidated an earlier round of\n * 3000ms probes: every one of them showed a finished animation and read as\n * \"nothing ran\". No shipped duration was touched to make anything look better\n * (§12.5); the numbers below are still `overlayAnimations`'.\n *\n * ⛔ AND THIS IS WHY THE SCRIM-AND-PANEL SIBLING FIX CHANGED NOTHING VISIBLE.\n * That fix was real: the panel had been inheriting the scrim's fade. But the\n * panel's own slide had never run, so removing the inherited fade left a panel\n * that simply appears. The fix made the sheet strictly LESS animated, and the\n * report that \"it is the same\" was correct.\n *\n * WHAT THESE USE INSTEAD. `targetHeight` and `currentHeight` are the PANEL's\n * own box, laid out inside the Modal's own hierarchy, so they are the one\n * distance that is right in this coordinate space. A sheet travels its own\n * height; it never needed the window.\n */\n/**\n * ⛔ A DURATION, NOT A SPRING, AND THE RULING CHANGED TO GET HERE. The entrance\n * was a spring because the motion spec said so. Fouad withdrew that on 30\n * September 2026 in favour of §5: whatever the app's existing sheets do, this\n * does. They are presented by the PLATFORM — RN's `Modal animationType=\"slide\"`\n * and React Navigation's `slide_from_bottom` — which slides for a fixed time on\n * an ease-out and stops dead.\n *\n * ⚠️ AND THE MEASUREMENT SAID THE SAME THING. The old spring's damping ratio was\n * 1.10 — overdamped — so it approached its resting place asymptotically. Its\n * first travel was fine (154ms against the platform's 126ms); it was still\n * creeping 437ms after the tap. A duration cannot do that: it arrives and stops.\n * Numbers, method and instrument: `overlayAnimations.sheet.enter.duration`.\n *\n * ⚠️ THE SIGNATURE IS UNCHANGED ON PURPOSE. `duration` was added to the SAME\n * `anim.sheet.enter` object the spring fields live on, so `Dialog` and\n * `ConfirmDialog` still pass exactly what they passed before and neither file is\n * touched by this change. The spring fields are still read — by a consumer\n * driving its own `Animated.spring`; see the preset's note.\n */\nexport const sheetEnter = (sheet: {duration: number}) =>\n (values: any) => {\n 'worklet';\n return {\n initialValues: {transform: [{translateY: values.targetHeight}]},\n animations: {\n transform: [{\n translateY: withTiming(0, {\n duration: sheet.duration,\n /* Deceleration, which is what a platform sheet does: fast\n off the bottom edge, easing into its stop. `Easing.out`\n is resolved here rather than stored in the preset,\n because an Easing function is not serialisable config. */\n easing: Easing.out(Easing.cubic),\n }),\n }],\n },\n };\n };\n\nexport const sheetExit = (duration: number, onFinished: () => void) =>\n (values: any) => {\n 'worklet';\n return {\n initialValues: {transform: [{translateY: 0}]},\n animations: {\n transform: [{\n translateY: withTiming(values.currentHeight, {\n duration,\n easing: Easing.in(Easing.ease),\n }),\n }],\n },\n /* ⛔ THE MODAL UNMOUNTS ON THIS. A custom exiting reports through\n `callback`, where a built-in used `.withCallback`. Losing it\n would leave the RN Modal mounted over the app for ever. */\n callback: (finished: boolean) => {\n 'worklet';\n if (finished) runOnJS(onFinished)();\n },\n };\n };\n\n\n"],"names":[],"mappings":";;AAgEO,MAAM,UAAA,GAAa,CAAC,KAAA,KACvB,CAAC,MAAA,KAAgB;AACb,EAAA,SAAA;AACA,EAAA,OAAO;AAAA,IACH,aAAA,EAAe,EAAC,SAAA,EAAW,CAAC,EAAC,UAAA,EAAY,MAAA,CAAO,YAAA,EAAa,CAAA,EAAC;AAAA,IAC9D,UAAA,EAAY;AAAA,MACR,WAAW,CAAC;AAAA,QACR,UAAA,EAAY,WAAW,CAAA,EAAG;AAAA,UACtB,UAAU,KAAA,CAAM,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAKhB,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,KAAK;AAAA,SAClC;AAAA,OACJ;AAAA;AACL,GACJ;AACJ;AAEG,MAAM,SAAA,GAAY,CAAC,QAAA,EAAkB,UAAA,KACxC,CAAC,MAAA,KAAgB;AACb,EAAA,SAAA;AACA,EAAA,OAAO;AAAA,IACH,aAAA,EAAe,EAAC,SAAA,EAAW,CAAC,EAAC,UAAA,EAAY,CAAA,EAAE,CAAA,EAAC;AAAA,IAC5C,UAAA,EAAY;AAAA,MACR,WAAW,CAAC;AAAA,QACR,UAAA,EAAY,UAAA,CAAW,MAAA,CAAO,aAAA,EAAe;AAAA,UACzC,QAAA;AAAA,UACA,MAAA,EAAQ,MAAA,CAAO,EAAA,CAAG,MAAA,CAAO,IAAI;AAAA,SAChC;AAAA,OACJ;AAAA,KACL;AAAA;AAAA;AAAA;AAAA,IAIA,QAAA,EAAU,CAAC,QAAA,KAAsB;AAC7B,MAAA,SAAA;AACA,MAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,UAAU,CAAA,EAAE;AAAA,IACtC;AAAA,GACJ;AACJ;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lmb-it/kitsconcerto-native",
3
- "version": "0.1.266",
3
+ "version": "0.1.268",
4
4
  "description": "KitsConcerto — Native (React Native) UI components",
5
5
  "main": "index.cjs",
6
6
  "module": "index.js",