@almadar/ui 5.13.2 → 5.13.3

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.
@@ -10,9 +10,9 @@ var LucideIcons2 = require('lucide-react');
10
10
  var PhosphorIcons = require('@phosphor-icons/react');
11
11
  var TablerIcons = require('@tabler/icons-react');
12
12
  var FaIcons = require('react-icons/fa');
13
+ var reactDom = require('react-dom');
13
14
  var evaluator = require('@almadar/evaluator');
14
15
  var context = require('@almadar/ui/context');
15
- var reactDom = require('react-dom');
16
16
  var reactRouterDom = require('react-router-dom');
17
17
  var ELK = require('elkjs/lib/elk.bundled.js');
18
18
  var ReactMarkdown = require('react-markdown');
@@ -2276,7 +2276,7 @@ var init_Modal = __esm({
2276
2276
  document.body.style.overflow = "";
2277
2277
  };
2278
2278
  }, [isOpen]);
2279
- if (!isOpen) return null;
2279
+ if (!isOpen || typeof document === "undefined") return null;
2280
2280
  const handleClose = () => {
2281
2281
  if (closeEvent) eventBus.emit(`UI:${closeEvent}`, {});
2282
2282
  onClose();
@@ -2286,124 +2286,127 @@ var init_Modal = __esm({
2286
2286
  handleClose();
2287
2287
  }
2288
2288
  };
2289
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2290
- /* @__PURE__ */ jsxRuntime.jsx(
2291
- Overlay,
2292
- {
2293
- isVisible: isOpen,
2294
- onClick: handleOverlayClick,
2295
- className: "z-40"
2296
- }
2297
- ),
2298
- /* @__PURE__ */ jsxRuntime.jsx(
2299
- Box,
2300
- {
2301
- className: cn(
2302
- "fixed inset-0 z-50 pointer-events-none",
2303
- "flex items-start justify-center px-4 pb-4 pt-[10vh]",
2304
- "max-sm:items-stretch max-sm:p-0 max-sm:pt-0"
2305
- ),
2306
- children: /* @__PURE__ */ jsxRuntime.jsxs(
2307
- Dialog,
2308
- {
2309
- ref: modalRef,
2310
- open: true,
2311
- className: cn(
2312
- // Reset browser-default dialog chrome — we own styling. `static`
2313
- // overrides the user-agent `position: absolute` so the parent
2314
- // flex container's `justify-center` actually centers the dialog
2315
- // (without this, the dialog drops out of flex flow and `m-0`
2316
- // kills the user-agent's `margin: auto` centering, pinning the
2317
- // dialog to top-left).
2318
- "static m-0 p-0 border-0 bg-transparent",
2319
- // Pre-existing dialog frame
2320
- "pointer-events-auto w-full flex flex-col bg-surface border shadow-elevation-dialog rounded-container",
2321
- // Desktop sizing + viewport-aware floor.
2322
- sizeClasses2[size],
2323
- minWidthClasses[size],
2324
- "max-h-[80vh]",
2325
- // Mobile: take the entire screen. Override desktop max-w cap,
2326
- // full height, no rounded corners, no min-width.
2327
- "max-sm:max-w-none max-sm:max-h-none max-sm:w-full max-sm:h-full max-sm:rounded-none",
2328
- lookStyles[look],
2329
- className
2330
- ),
2331
- style: dragY > 0 ? {
2332
- transform: `translateY(${dragY}px)`,
2333
- transition: isDragging.current ? "none" : "transform 200ms ease-out"
2334
- } : void 0,
2335
- ...title && { "aria-labelledby": "modal-title" },
2336
- children: [
2337
- /* @__PURE__ */ jsxRuntime.jsx(
2338
- Box,
2339
- {
2340
- className: "hidden max-sm:flex justify-center py-2 cursor-grab active:cursor-grabbing touch-none",
2341
- onPointerDown: (e) => {
2342
- if (!swipeDownToClose) return;
2343
- dragStartY.current = e.clientY;
2344
- isDragging.current = true;
2345
- e.target.setPointerCapture(e.pointerId);
2346
- },
2347
- onPointerMove: (e) => {
2348
- if (!isDragging.current) return;
2349
- const dy = Math.max(0, e.clientY - dragStartY.current);
2350
- setDragY(dy);
2351
- },
2352
- onPointerUp: () => {
2353
- if (!isDragging.current) return;
2354
- isDragging.current = false;
2355
- if (dragY > 100) {
2356
- handleClose();
2357
- }
2358
- setDragY(0);
2359
- },
2360
- onPointerCancel: () => {
2361
- isDragging.current = false;
2362
- setDragY(0);
2363
- },
2364
- children: /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "w-10 h-1 rounded-full bg-border" })
2365
- }
2289
+ return reactDom.createPortal(
2290
+ /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2291
+ /* @__PURE__ */ jsxRuntime.jsx(
2292
+ Overlay,
2293
+ {
2294
+ isVisible: isOpen,
2295
+ onClick: handleOverlayClick,
2296
+ className: "z-[1000]"
2297
+ }
2298
+ ),
2299
+ /* @__PURE__ */ jsxRuntime.jsx(
2300
+ Box,
2301
+ {
2302
+ className: cn(
2303
+ "fixed inset-0 z-[1001] pointer-events-none",
2304
+ "flex items-start justify-center px-4 pb-4 pt-[10vh]",
2305
+ "max-sm:items-stretch max-sm:p-0 max-sm:pt-0"
2306
+ ),
2307
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
2308
+ Dialog,
2309
+ {
2310
+ ref: modalRef,
2311
+ open: true,
2312
+ className: cn(
2313
+ // Reset browser-default dialog chrome we own styling. `static`
2314
+ // overrides the user-agent `position: absolute` so the parent
2315
+ // flex container's `justify-center` actually centers the dialog
2316
+ // (without this, the dialog drops out of flex flow and `m-0`
2317
+ // kills the user-agent's `margin: auto` centering, pinning the
2318
+ // dialog to top-left).
2319
+ "static m-0 p-0 border-0 bg-transparent",
2320
+ // Pre-existing dialog frame
2321
+ "pointer-events-auto w-full flex flex-col bg-surface border shadow-elevation-dialog rounded-container",
2322
+ // Desktop sizing + viewport-aware floor.
2323
+ sizeClasses2[size],
2324
+ minWidthClasses[size],
2325
+ "max-h-[80vh]",
2326
+ // Mobile: take the entire screen. Override desktop max-w cap,
2327
+ // full height, no rounded corners, no min-width.
2328
+ "max-sm:max-w-none max-sm:max-h-none max-sm:w-full max-sm:h-full max-sm:rounded-none",
2329
+ lookStyles[look],
2330
+ className
2366
2331
  ),
2367
- (title || showCloseButton) && /* @__PURE__ */ jsxRuntime.jsxs(
2368
- Box,
2369
- {
2370
- className: cn(
2371
- "px-6 py-4 flex items-center justify-between",
2372
- "border-b-[length:var(--border-width)] border-border"
2373
- ),
2374
- children: [
2375
- title && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h4", as: "h2", id: "modal-title", children: title }),
2376
- showCloseButton && /* @__PURE__ */ jsxRuntime.jsx(
2377
- Button,
2378
- {
2379
- variant: "ghost",
2380
- size: "sm",
2381
- icon: "x",
2382
- onClick: handleClose,
2383
- "data-event": "CLOSE",
2384
- "aria-label": "Close modal"
2332
+ style: dragY > 0 ? {
2333
+ transform: `translateY(${dragY}px)`,
2334
+ transition: isDragging.current ? "none" : "transform 200ms ease-out"
2335
+ } : void 0,
2336
+ ...title && { "aria-labelledby": "modal-title" },
2337
+ children: [
2338
+ /* @__PURE__ */ jsxRuntime.jsx(
2339
+ Box,
2340
+ {
2341
+ className: "hidden max-sm:flex justify-center py-2 cursor-grab active:cursor-grabbing touch-none",
2342
+ onPointerDown: (e) => {
2343
+ if (!swipeDownToClose) return;
2344
+ dragStartY.current = e.clientY;
2345
+ isDragging.current = true;
2346
+ e.target.setPointerCapture(e.pointerId);
2347
+ },
2348
+ onPointerMove: (e) => {
2349
+ if (!isDragging.current) return;
2350
+ const dy = Math.max(0, e.clientY - dragStartY.current);
2351
+ setDragY(dy);
2352
+ },
2353
+ onPointerUp: () => {
2354
+ if (!isDragging.current) return;
2355
+ isDragging.current = false;
2356
+ if (dragY > 100) {
2357
+ handleClose();
2385
2358
  }
2386
- )
2387
- ]
2388
- }
2389
- ),
2390
- /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1 overflow-y-auto p-6", children }),
2391
- footer && /* @__PURE__ */ jsxRuntime.jsx(
2392
- Box,
2393
- {
2394
- className: cn(
2395
- "px-6 py-4 bg-muted",
2396
- "border-t-[length:var(--border-width)] border-border"
2397
- ),
2398
- children: footer
2399
- }
2400
- )
2401
- ]
2402
- }
2403
- )
2404
- }
2405
- )
2406
- ] });
2359
+ setDragY(0);
2360
+ },
2361
+ onPointerCancel: () => {
2362
+ isDragging.current = false;
2363
+ setDragY(0);
2364
+ },
2365
+ children: /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "w-10 h-1 rounded-full bg-border" })
2366
+ }
2367
+ ),
2368
+ (title || showCloseButton) && /* @__PURE__ */ jsxRuntime.jsxs(
2369
+ Box,
2370
+ {
2371
+ className: cn(
2372
+ "px-6 py-4 flex items-center justify-between",
2373
+ "border-b-[length:var(--border-width)] border-border"
2374
+ ),
2375
+ children: [
2376
+ title && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h4", as: "h2", id: "modal-title", children: title }),
2377
+ showCloseButton && /* @__PURE__ */ jsxRuntime.jsx(
2378
+ Button,
2379
+ {
2380
+ variant: "ghost",
2381
+ size: "sm",
2382
+ icon: "x",
2383
+ onClick: handleClose,
2384
+ "data-event": "CLOSE",
2385
+ "aria-label": "Close modal"
2386
+ }
2387
+ )
2388
+ ]
2389
+ }
2390
+ ),
2391
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1 overflow-y-auto p-6", children }),
2392
+ footer && /* @__PURE__ */ jsxRuntime.jsx(
2393
+ Box,
2394
+ {
2395
+ className: cn(
2396
+ "px-6 py-4 bg-muted",
2397
+ "border-t-[length:var(--border-width)] border-border"
2398
+ ),
2399
+ children: footer
2400
+ }
2401
+ )
2402
+ ]
2403
+ }
2404
+ )
2405
+ }
2406
+ )
2407
+ ] }),
2408
+ document.body
2409
+ );
2407
2410
  };
2408
2411
  Modal.displayName = "Modal";
2409
2412
  }
@@ -13864,7 +13867,7 @@ var init_CodeBlock = __esm({
13864
13867
  };
13865
13868
  };
13866
13869
  }, [errorLines]);
13867
- const isFoldable = foldableProp ?? (language === "orb" || language === "json");
13870
+ const isFoldable = foldableProp ?? true;
13868
13871
  const [collapsed, setCollapsed] = React85.useState(() => /* @__PURE__ */ new Set());
13869
13872
  const foldRegions = React85.useMemo(
13870
13873
  () => isFoldable ? computeFoldRegions(code) : [],
@@ -10,9 +10,9 @@ import { Loader2, X, List, Printer, ChevronRight, ChevronLeft, GitBranch, Pencil
10
10
  import * as PhosphorIcons from '@phosphor-icons/react';
11
11
  import * as TablerIcons from '@tabler/icons-react';
12
12
  import * as FaIcons from 'react-icons/fa';
13
+ import { createPortal } from 'react-dom';
13
14
  import { evaluate, createMinimalContext } from '@almadar/evaluator';
14
15
  import { useUISlots, UISlotProvider } from '@almadar/ui/context';
15
- import { createPortal } from 'react-dom';
16
16
  import { Link, Outlet, useLocation } from 'react-router-dom';
17
17
  import ELK from 'elkjs/lib/elk.bundled.js';
18
18
  import ReactMarkdown from 'react-markdown';
@@ -2227,7 +2227,7 @@ var init_Modal = __esm({
2227
2227
  document.body.style.overflow = "";
2228
2228
  };
2229
2229
  }, [isOpen]);
2230
- if (!isOpen) return null;
2230
+ if (!isOpen || typeof document === "undefined") return null;
2231
2231
  const handleClose = () => {
2232
2232
  if (closeEvent) eventBus.emit(`UI:${closeEvent}`, {});
2233
2233
  onClose();
@@ -2237,124 +2237,127 @@ var init_Modal = __esm({
2237
2237
  handleClose();
2238
2238
  }
2239
2239
  };
2240
- return /* @__PURE__ */ jsxs(Fragment, { children: [
2241
- /* @__PURE__ */ jsx(
2242
- Overlay,
2243
- {
2244
- isVisible: isOpen,
2245
- onClick: handleOverlayClick,
2246
- className: "z-40"
2247
- }
2248
- ),
2249
- /* @__PURE__ */ jsx(
2250
- Box,
2251
- {
2252
- className: cn(
2253
- "fixed inset-0 z-50 pointer-events-none",
2254
- "flex items-start justify-center px-4 pb-4 pt-[10vh]",
2255
- "max-sm:items-stretch max-sm:p-0 max-sm:pt-0"
2256
- ),
2257
- children: /* @__PURE__ */ jsxs(
2258
- Dialog,
2259
- {
2260
- ref: modalRef,
2261
- open: true,
2262
- className: cn(
2263
- // Reset browser-default dialog chrome — we own styling. `static`
2264
- // overrides the user-agent `position: absolute` so the parent
2265
- // flex container's `justify-center` actually centers the dialog
2266
- // (without this, the dialog drops out of flex flow and `m-0`
2267
- // kills the user-agent's `margin: auto` centering, pinning the
2268
- // dialog to top-left).
2269
- "static m-0 p-0 border-0 bg-transparent",
2270
- // Pre-existing dialog frame
2271
- "pointer-events-auto w-full flex flex-col bg-surface border shadow-elevation-dialog rounded-container",
2272
- // Desktop sizing + viewport-aware floor.
2273
- sizeClasses2[size],
2274
- minWidthClasses[size],
2275
- "max-h-[80vh]",
2276
- // Mobile: take the entire screen. Override desktop max-w cap,
2277
- // full height, no rounded corners, no min-width.
2278
- "max-sm:max-w-none max-sm:max-h-none max-sm:w-full max-sm:h-full max-sm:rounded-none",
2279
- lookStyles[look],
2280
- className
2281
- ),
2282
- style: dragY > 0 ? {
2283
- transform: `translateY(${dragY}px)`,
2284
- transition: isDragging.current ? "none" : "transform 200ms ease-out"
2285
- } : void 0,
2286
- ...title && { "aria-labelledby": "modal-title" },
2287
- children: [
2288
- /* @__PURE__ */ jsx(
2289
- Box,
2290
- {
2291
- className: "hidden max-sm:flex justify-center py-2 cursor-grab active:cursor-grabbing touch-none",
2292
- onPointerDown: (e) => {
2293
- if (!swipeDownToClose) return;
2294
- dragStartY.current = e.clientY;
2295
- isDragging.current = true;
2296
- e.target.setPointerCapture(e.pointerId);
2297
- },
2298
- onPointerMove: (e) => {
2299
- if (!isDragging.current) return;
2300
- const dy = Math.max(0, e.clientY - dragStartY.current);
2301
- setDragY(dy);
2302
- },
2303
- onPointerUp: () => {
2304
- if (!isDragging.current) return;
2305
- isDragging.current = false;
2306
- if (dragY > 100) {
2307
- handleClose();
2308
- }
2309
- setDragY(0);
2310
- },
2311
- onPointerCancel: () => {
2312
- isDragging.current = false;
2313
- setDragY(0);
2314
- },
2315
- children: /* @__PURE__ */ jsx(Box, { className: "w-10 h-1 rounded-full bg-border" })
2316
- }
2240
+ return createPortal(
2241
+ /* @__PURE__ */ jsxs(Fragment, { children: [
2242
+ /* @__PURE__ */ jsx(
2243
+ Overlay,
2244
+ {
2245
+ isVisible: isOpen,
2246
+ onClick: handleOverlayClick,
2247
+ className: "z-[1000]"
2248
+ }
2249
+ ),
2250
+ /* @__PURE__ */ jsx(
2251
+ Box,
2252
+ {
2253
+ className: cn(
2254
+ "fixed inset-0 z-[1001] pointer-events-none",
2255
+ "flex items-start justify-center px-4 pb-4 pt-[10vh]",
2256
+ "max-sm:items-stretch max-sm:p-0 max-sm:pt-0"
2257
+ ),
2258
+ children: /* @__PURE__ */ jsxs(
2259
+ Dialog,
2260
+ {
2261
+ ref: modalRef,
2262
+ open: true,
2263
+ className: cn(
2264
+ // Reset browser-default dialog chrome we own styling. `static`
2265
+ // overrides the user-agent `position: absolute` so the parent
2266
+ // flex container's `justify-center` actually centers the dialog
2267
+ // (without this, the dialog drops out of flex flow and `m-0`
2268
+ // kills the user-agent's `margin: auto` centering, pinning the
2269
+ // dialog to top-left).
2270
+ "static m-0 p-0 border-0 bg-transparent",
2271
+ // Pre-existing dialog frame
2272
+ "pointer-events-auto w-full flex flex-col bg-surface border shadow-elevation-dialog rounded-container",
2273
+ // Desktop sizing + viewport-aware floor.
2274
+ sizeClasses2[size],
2275
+ minWidthClasses[size],
2276
+ "max-h-[80vh]",
2277
+ // Mobile: take the entire screen. Override desktop max-w cap,
2278
+ // full height, no rounded corners, no min-width.
2279
+ "max-sm:max-w-none max-sm:max-h-none max-sm:w-full max-sm:h-full max-sm:rounded-none",
2280
+ lookStyles[look],
2281
+ className
2317
2282
  ),
2318
- (title || showCloseButton) && /* @__PURE__ */ jsxs(
2319
- Box,
2320
- {
2321
- className: cn(
2322
- "px-6 py-4 flex items-center justify-between",
2323
- "border-b-[length:var(--border-width)] border-border"
2324
- ),
2325
- children: [
2326
- title && /* @__PURE__ */ jsx(Typography, { variant: "h4", as: "h2", id: "modal-title", children: title }),
2327
- showCloseButton && /* @__PURE__ */ jsx(
2328
- Button,
2329
- {
2330
- variant: "ghost",
2331
- size: "sm",
2332
- icon: "x",
2333
- onClick: handleClose,
2334
- "data-event": "CLOSE",
2335
- "aria-label": "Close modal"
2283
+ style: dragY > 0 ? {
2284
+ transform: `translateY(${dragY}px)`,
2285
+ transition: isDragging.current ? "none" : "transform 200ms ease-out"
2286
+ } : void 0,
2287
+ ...title && { "aria-labelledby": "modal-title" },
2288
+ children: [
2289
+ /* @__PURE__ */ jsx(
2290
+ Box,
2291
+ {
2292
+ className: "hidden max-sm:flex justify-center py-2 cursor-grab active:cursor-grabbing touch-none",
2293
+ onPointerDown: (e) => {
2294
+ if (!swipeDownToClose) return;
2295
+ dragStartY.current = e.clientY;
2296
+ isDragging.current = true;
2297
+ e.target.setPointerCapture(e.pointerId);
2298
+ },
2299
+ onPointerMove: (e) => {
2300
+ if (!isDragging.current) return;
2301
+ const dy = Math.max(0, e.clientY - dragStartY.current);
2302
+ setDragY(dy);
2303
+ },
2304
+ onPointerUp: () => {
2305
+ if (!isDragging.current) return;
2306
+ isDragging.current = false;
2307
+ if (dragY > 100) {
2308
+ handleClose();
2336
2309
  }
2337
- )
2338
- ]
2339
- }
2340
- ),
2341
- /* @__PURE__ */ jsx(Box, { className: "flex-1 overflow-y-auto p-6", children }),
2342
- footer && /* @__PURE__ */ jsx(
2343
- Box,
2344
- {
2345
- className: cn(
2346
- "px-6 py-4 bg-muted",
2347
- "border-t-[length:var(--border-width)] border-border"
2348
- ),
2349
- children: footer
2350
- }
2351
- )
2352
- ]
2353
- }
2354
- )
2355
- }
2356
- )
2357
- ] });
2310
+ setDragY(0);
2311
+ },
2312
+ onPointerCancel: () => {
2313
+ isDragging.current = false;
2314
+ setDragY(0);
2315
+ },
2316
+ children: /* @__PURE__ */ jsx(Box, { className: "w-10 h-1 rounded-full bg-border" })
2317
+ }
2318
+ ),
2319
+ (title || showCloseButton) && /* @__PURE__ */ jsxs(
2320
+ Box,
2321
+ {
2322
+ className: cn(
2323
+ "px-6 py-4 flex items-center justify-between",
2324
+ "border-b-[length:var(--border-width)] border-border"
2325
+ ),
2326
+ children: [
2327
+ title && /* @__PURE__ */ jsx(Typography, { variant: "h4", as: "h2", id: "modal-title", children: title }),
2328
+ showCloseButton && /* @__PURE__ */ jsx(
2329
+ Button,
2330
+ {
2331
+ variant: "ghost",
2332
+ size: "sm",
2333
+ icon: "x",
2334
+ onClick: handleClose,
2335
+ "data-event": "CLOSE",
2336
+ "aria-label": "Close modal"
2337
+ }
2338
+ )
2339
+ ]
2340
+ }
2341
+ ),
2342
+ /* @__PURE__ */ jsx(Box, { className: "flex-1 overflow-y-auto p-6", children }),
2343
+ footer && /* @__PURE__ */ jsx(
2344
+ Box,
2345
+ {
2346
+ className: cn(
2347
+ "px-6 py-4 bg-muted",
2348
+ "border-t-[length:var(--border-width)] border-border"
2349
+ ),
2350
+ children: footer
2351
+ }
2352
+ )
2353
+ ]
2354
+ }
2355
+ )
2356
+ }
2357
+ )
2358
+ ] }),
2359
+ document.body
2360
+ );
2358
2361
  };
2359
2362
  Modal.displayName = "Modal";
2360
2363
  }
@@ -13815,7 +13818,7 @@ var init_CodeBlock = __esm({
13815
13818
  };
13816
13819
  };
13817
13820
  }, [errorLines]);
13818
- const isFoldable = foldableProp ?? (language === "orb" || language === "json");
13821
+ const isFoldable = foldableProp ?? true;
13819
13822
  const [collapsed, setCollapsed] = useState(() => /* @__PURE__ */ new Set());
13820
13823
  const foldRegions = useMemo(
13821
13824
  () => isFoldable ? computeFoldRegions(code) : [],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "5.13.2",
3
+ "version": "5.13.3",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -242,6 +242,8 @@ module.exports = {
242
242
  'w-[480px]',
243
243
  'w-[640px]',
244
244
  'will-change-[opacity,transform]',
245
+ 'z-[1000]',
246
+ 'z-[1001]',
245
247
  'z-[60]',
246
248
  ],
247
249
  theme: {