@arbidocs/blocks 0.4.140 → 0.4.142

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dist/agents/index.cjs +264 -263
  2. package/dist/agents/index.js +7 -6
  3. package/dist/calls/index.cjs +3 -3
  4. package/dist/calls/index.js +2 -2
  5. package/dist/{chunk-5Y3SAJUK.cjs → chunk-7NDW4KF4.cjs} +4 -4
  6. package/dist/{chunk-5Y3SAJUK.cjs.map → chunk-7NDW4KF4.cjs.map} +1 -1
  7. package/dist/chunk-AHDJXIUB.cjs +25 -0
  8. package/dist/chunk-AHDJXIUB.cjs.map +1 -0
  9. package/dist/{chunk-DAIHYDK6.cjs → chunk-DPGFEMVT.cjs} +11 -26
  10. package/dist/chunk-DPGFEMVT.cjs.map +1 -0
  11. package/dist/{chunk-ZAVEMQ37.cjs → chunk-DWZXSPMB.cjs} +3 -3
  12. package/dist/{chunk-ZAVEMQ37.cjs.map → chunk-DWZXSPMB.cjs.map} +1 -1
  13. package/dist/{chunk-ZNTHEXNJ.js → chunk-ETXYVO6E.js} +4 -4
  14. package/dist/{chunk-ZNTHEXNJ.js.map → chunk-ETXYVO6E.js.map} +1 -1
  15. package/dist/{chunk-5HFPRI3W.js → chunk-FUTMU4FR.js} +3 -3
  16. package/dist/{chunk-5HFPRI3W.js.map → chunk-FUTMU4FR.js.map} +1 -1
  17. package/dist/{chunk-BPUZEYSP.js → chunk-FXG7TFAG.js} +3 -3
  18. package/dist/{chunk-BPUZEYSP.js.map → chunk-FXG7TFAG.js.map} +1 -1
  19. package/dist/{chunk-YLUEQSMK.cjs → chunk-GBS6QVGS.cjs} +5 -5
  20. package/dist/{chunk-YLUEQSMK.cjs.map → chunk-GBS6QVGS.cjs.map} +1 -1
  21. package/dist/{chunk-SU7QY7U2.cjs → chunk-HIJUXAWS.cjs} +34 -33
  22. package/dist/chunk-HIJUXAWS.cjs.map +1 -0
  23. package/dist/{chunk-O6W6RW3B.js → chunk-I7WG3JRD.js} +206 -53
  24. package/dist/chunk-I7WG3JRD.js.map +1 -0
  25. package/dist/{chunk-RYEJ6AA5.js → chunk-N5X37J3D.js} +8 -7
  26. package/dist/chunk-N5X37J3D.js.map +1 -0
  27. package/dist/{chunk-OCDDWDH2.js → chunk-ON3TKY5Y.js} +3 -3
  28. package/dist/{chunk-OCDDWDH2.js.map → chunk-ON3TKY5Y.js.map} +1 -1
  29. package/dist/{chunk-DJM7DLCT.cjs → chunk-OPTBQSCV.cjs} +3 -3
  30. package/dist/{chunk-DJM7DLCT.cjs.map → chunk-OPTBQSCV.cjs.map} +1 -1
  31. package/dist/{chunk-IBIUPT23.js → chunk-PROK33G6.js} +8 -22
  32. package/dist/chunk-PROK33G6.js.map +1 -0
  33. package/dist/{chunk-UMG5S6H5.cjs → chunk-QIMVTGKS.cjs} +3 -3
  34. package/dist/{chunk-UMG5S6H5.cjs.map → chunk-QIMVTGKS.cjs.map} +1 -1
  35. package/dist/chunk-RLWIUUQ5.js +23 -0
  36. package/dist/chunk-RLWIUUQ5.js.map +1 -0
  37. package/dist/{chunk-ECERC6TI.js → chunk-VHJHY7TT.js} +3 -3
  38. package/dist/{chunk-ECERC6TI.js.map → chunk-VHJHY7TT.js.map} +1 -1
  39. package/dist/{chunk-GFRQG36Y.cjs → chunk-YFY3TQ6Q.cjs} +208 -52
  40. package/dist/chunk-YFY3TQ6Q.cjs.map +1 -0
  41. package/dist/collaboration/index.cjs +42 -42
  42. package/dist/collaboration/index.js +2 -2
  43. package/dist/connect/docx.cjs +6 -6
  44. package/dist/connect/docx.js +5 -5
  45. package/dist/connect/index.cjs +92 -91
  46. package/dist/connect/index.cjs.map +1 -1
  47. package/dist/connect/index.js +15 -14
  48. package/dist/connect/index.js.map +1 -1
  49. package/dist/facts/index.cjs +2 -2
  50. package/dist/facts/index.js +2 -2
  51. package/dist/files/index.cjs +3 -3
  52. package/dist/files/index.js +3 -3
  53. package/dist/home/index.cjs +2 -2
  54. package/dist/home/index.js +2 -2
  55. package/dist/index.cjs +585 -572
  56. package/dist/index.cjs.map +1 -1
  57. package/dist/index.js +19 -18
  58. package/dist/index.js.map +1 -1
  59. package/dist/lib/sidebar-mode.d.ts +1 -3
  60. package/dist/lib/use-close-on-escape.d.ts +6 -0
  61. package/dist/retrieval/index.cjs +1 -1
  62. package/dist/retrieval/index.js +1 -1
  63. package/dist/settings/index.cjs +40 -40
  64. package/dist/settings/index.js +5 -5
  65. package/dist/shell/ShellSidebar.d.ts +37 -0
  66. package/dist/shell/Sidebar.d.ts +6 -6
  67. package/dist/shell/index.cjs +55 -42
  68. package/dist/shell/index.d.ts +4 -1
  69. package/dist/shell/index.js +5 -4
  70. package/dist/shell/types.d.ts +18 -0
  71. package/dist/shell/use-sidebar-controller.d.ts +59 -0
  72. package/dist/site/index.cjs +5 -5
  73. package/dist/site/index.js +1 -1
  74. package/dist/studio/index.cjs +3 -3
  75. package/dist/studio/index.js +3 -3
  76. package/dist/workflow-canvas/index.cjs +20 -19
  77. package/dist/workflow-canvas/index.cjs.map +1 -1
  78. package/dist/workflow-canvas/index.js +7 -6
  79. package/dist/workflow-canvas/index.js.map +1 -1
  80. package/node_modules/@arbidocs/coedit/package.json +1 -1
  81. package/package.json +4 -4
  82. package/dist/chunk-DAIHYDK6.cjs.map +0 -1
  83. package/dist/chunk-GFRQG36Y.cjs.map +0 -1
  84. package/dist/chunk-IBIUPT23.js.map +0 -1
  85. package/dist/chunk-O6W6RW3B.js.map +0 -1
  86. package/dist/chunk-RYEJ6AA5.js.map +0 -1
  87. package/dist/chunk-SU7QY7U2.cjs.map +0 -1
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ import { useState, useRef, useCallback } from 'react';
3
+
4
+ // src/lib/useControllableState.ts
5
+ function useControllableState(value, defaultValue, onChange) {
6
+ const [inner, setInner] = useState(defaultValue);
7
+ const isControlled = value !== void 0;
8
+ const current = isControlled ? value : inner;
9
+ const onChangeRef = useRef(onChange);
10
+ onChangeRef.current = onChange;
11
+ const set = useCallback(
12
+ (next) => {
13
+ if (!isControlled) setInner(next);
14
+ onChangeRef.current?.(next);
15
+ },
16
+ [isControlled]
17
+ );
18
+ return [current, set];
19
+ }
20
+
21
+ export { useControllableState };
22
+ //# sourceMappingURL=chunk-RLWIUUQ5.js.map
23
+ //# sourceMappingURL=chunk-RLWIUUQ5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/useControllableState.ts"],"names":[],"mappings":";;;AAMO,SAAS,oBAAA,CACd,KAAA,EACA,YAAA,EACA,QAAA,EACwB;AACxB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAY,YAAY,CAAA;AAClD,EAAA,MAAM,eAAe,KAAA,KAAU,MAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,eAAe,KAAA,GAAQ,KAAA;AACvC,EAAA,MAAM,WAAA,GAAc,OAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,EAAA,MAAM,GAAA,GAAM,WAAA;AAAA,IACV,CAAC,IAAA,KAAY;AACX,MAAA,IAAI,CAAC,YAAA,EAAc,QAAA,CAAS,IAAI,CAAA;AAChC,MAAA,WAAA,CAAY,UAAU,IAAI,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AACA,EAAA,OAAO,CAAC,SAAS,GAAG,CAAA;AACtB","file":"chunk-RLWIUUQ5.js","sourcesContent":["import { useCallback, useRef, useState } from 'react'\n\n/**\n * State that is controlled when `value` is passed and uncontrolled (seeded by `defaultValue`)\n * otherwise. `onChange` fires in both modes.\n */\nexport function useControllableState<T>(\n value: T | undefined,\n defaultValue: T,\n onChange?: (next: T) => void\n): [T, (next: T) => void] {\n const [inner, setInner] = useState<T>(defaultValue)\n const isControlled = value !== undefined\n const current = isControlled ? value : inner\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n const set = useCallback(\n (next: T) => {\n if (!isControlled) setInner(next)\n onChangeRef.current?.(next)\n },\n [isControlled]\n )\n return [current, set]\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { ModalScaffold } from './chunk-TX2ZICS7.js';
3
2
  import { testIdOr } from './chunk-7F6CBP3Z.js';
3
+ import { ModalScaffold } from './chunk-TX2ZICS7.js';
4
4
  import { useMemo, useRef } from 'react';
5
5
  import { AlertTriangle } from 'lucide-react';
6
6
  import { Button } from '@arbidocs/react/ui';
@@ -73,5 +73,5 @@ function ConfirmDialog({
73
73
  }
74
74
 
75
75
  export { ConfirmDialog, DEFAULT_CONFIRM_DIALOG_LABELS };
76
- //# sourceMappingURL=chunk-ECERC6TI.js.map
77
- //# sourceMappingURL=chunk-ECERC6TI.js.map
76
+ //# sourceMappingURL=chunk-VHJHY7TT.js.map
77
+ //# sourceMappingURL=chunk-VHJHY7TT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/settings/ConfirmDialog.tsx"],"names":[],"mappings":";;;;;;;AAaO,IAAM,6BAAA,GAAqD;AAAA,EAChE,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAY;AACd;AAyBO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,aAAA;AAAA,EACV,SAAA,GAAY,KAAA;AAAA,EACZ,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,OAAO,EAAE,GAAG,6BAAA,EAA+B,GAAG,MAAA,EAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AACnF,EAAA,MAAM,SAAA,GAAY,OAA0B,IAAI,CAAA;AAChD,EAAA,uBACE,IAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,MAAA;AAAA,MACN,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,QAAA,IAAI,CAAC,MAAM,OAAA,EAAQ;AAAA,MACrB,CAAA;AAAA,MACA,IAAA,EAAK,aAAA;AAAA,MACL,eAAA,EAAiB,SAAA;AAAA,MACjB,KAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA,EAAe,IAAA;AAAA,MACf,IAAA,EACE,YAAY,aAAA,mBACV,GAAA,CAAC,iBAAc,SAAA,EAAU,uBAAA,EAAwB,aAAA,EAAY,MAAA,EAAO,CAAA,GAClE,IAAA;AAAA,MAEN,QAAQ,QAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,sBAAsB,CAAA;AAAA,MAExD,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACD,IAAA,CAAC,aAAA,CAAc,MAAA,EAAd,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,SAAA;AAAA,cACL,OAAA,EAAQ,SAAA;AAAA,cACR,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,cACvB,QAAA,EAAU,SAAA;AAAA,cACV,eAAa,QAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,oCAAoC,CAAA;AAAA,cAEpF,wBAAc,CAAA,CAAE;AAAA;AAAA,WACnB;AAAA,0BACA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAA;AAAA,cACA,OAAA,EAAS,SAAA;AAAA,cACT,QAAA,EAAU,SAAA;AAAA,cACV,eAAa,QAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,qCAAqC,CAAA;AAAA,cAEtF,QAAA,EAAA,SAAA,GAAY,CAAA,CAAE,UAAA,GAAc,WAAA,IAAe,CAAA,CAAE;AAAA;AAAA;AAChD,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ","file":"chunk-ECERC6TI.js","sourcesContent":["import { useMemo, useRef, type ReactNode } from 'react'\nimport { AlertTriangle } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { ModalScaffold } from './ModalScaffold'\n\n/** Every fixed string of the confirm dialog. `confirmText` / `cancelText` props win. */\nexport interface ConfirmDialogLabels {\n confirm: string\n cancel: string\n pleaseWait: string\n}\n\nexport const DEFAULT_CONFIRM_DIALOG_LABELS: ConfirmDialogLabels = {\n confirm: 'Confirm',\n cancel: 'Cancel',\n pleaseWait: 'Please wait...',\n}\n\nexport interface ConfirmDialogProps {\n labels?: Partial<ConfirmDialogLabels>\n isOpen: boolean\n onClose: () => void\n onConfirm: () => void\n title: string\n description: string\n confirmText?: string\n cancelText?: string\n variant?: 'destructive' | 'default'\n isLoading?: boolean\n /** Dialog test id (default `confirmation-modal`). */\n testId?: string\n /** Button ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'confirm', string>>\n /** Extra content between the description and the buttons (e.g. an opt-in checkbox). */\n children?: ReactNode\n}\n\n/**\n * Declarative yes/no confirmation with a loading state. An `alertdialog`: initial focus is on\n * Cancel (the safe action) and clicking outside does not dismiss it; Escape and Cancel do.\n */\nexport function ConfirmDialog({\n isOpen,\n onClose,\n onConfirm,\n title,\n description,\n confirmText,\n cancelText,\n variant = 'destructive',\n isLoading = false,\n labels,\n testId,\n testIds,\n children,\n}: ConfirmDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONFIRM_DIALOG_LABELS, ...labels }), [labels])\n const cancelRef = useRef<HTMLButtonElement>(null)\n return (\n <ModalScaffold\n open={isOpen}\n onOpenChange={(next) => {\n if (!next) onClose()\n }}\n role=\"alertdialog\"\n initialFocusRef={cancelRef}\n title={title}\n description={description}\n showDescription\n icon={\n variant === 'destructive' ? (\n <AlertTriangle className=\"h-5 w-5 text-red-text\" aria-hidden=\"true\" />\n ) : null\n }\n testId={testIdOr(testId, { testId: 'confirmation-modal' })}\n >\n {children}\n <ModalScaffold.Footer>\n <Button\n ref={cancelRef}\n variant=\"outline\"\n onClick={() => onClose()}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.cancel, { testId: 'confirmation-modal-cancel-button' })}\n >\n {cancelText ?? l.cancel}\n </Button>\n <Button\n variant={variant}\n onClick={onConfirm}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.confirm, { testId: 'confirmation-modal-confirm-button' })}\n >\n {isLoading ? l.pleaseWait : (confirmText ?? l.confirm)}\n </Button>\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/settings/ConfirmDialog.tsx"],"names":[],"mappings":";;;;;;;AAaO,IAAM,6BAAA,GAAqD;AAAA,EAChE,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAY;AACd;AAyBO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,aAAA;AAAA,EACV,SAAA,GAAY,KAAA;AAAA,EACZ,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,OAAO,EAAE,GAAG,6BAAA,EAA+B,GAAG,MAAA,EAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AACnF,EAAA,MAAM,SAAA,GAAY,OAA0B,IAAI,CAAA;AAChD,EAAA,uBACE,IAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,MAAA;AAAA,MACN,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,QAAA,IAAI,CAAC,MAAM,OAAA,EAAQ;AAAA,MACrB,CAAA;AAAA,MACA,IAAA,EAAK,aAAA;AAAA,MACL,eAAA,EAAiB,SAAA;AAAA,MACjB,KAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA,EAAe,IAAA;AAAA,MACf,IAAA,EACE,YAAY,aAAA,mBACV,GAAA,CAAC,iBAAc,SAAA,EAAU,uBAAA,EAAwB,aAAA,EAAY,MAAA,EAAO,CAAA,GAClE,IAAA;AAAA,MAEN,QAAQ,QAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,sBAAsB,CAAA;AAAA,MAExD,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACD,IAAA,CAAC,aAAA,CAAc,MAAA,EAAd,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,SAAA;AAAA,cACL,OAAA,EAAQ,SAAA;AAAA,cACR,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,cACvB,QAAA,EAAU,SAAA;AAAA,cACV,eAAa,QAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,oCAAoC,CAAA;AAAA,cAEpF,wBAAc,CAAA,CAAE;AAAA;AAAA,WACnB;AAAA,0BACA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAA;AAAA,cACA,OAAA,EAAS,SAAA;AAAA,cACT,QAAA,EAAU,SAAA;AAAA,cACV,eAAa,QAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,qCAAqC,CAAA;AAAA,cAEtF,QAAA,EAAA,SAAA,GAAY,CAAA,CAAE,UAAA,GAAc,WAAA,IAAe,CAAA,CAAE;AAAA;AAAA;AAChD,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ","file":"chunk-VHJHY7TT.js","sourcesContent":["import { useMemo, useRef, type ReactNode } from 'react'\nimport { AlertTriangle } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { ModalScaffold } from './ModalScaffold'\n\n/** Every fixed string of the confirm dialog. `confirmText` / `cancelText` props win. */\nexport interface ConfirmDialogLabels {\n confirm: string\n cancel: string\n pleaseWait: string\n}\n\nexport const DEFAULT_CONFIRM_DIALOG_LABELS: ConfirmDialogLabels = {\n confirm: 'Confirm',\n cancel: 'Cancel',\n pleaseWait: 'Please wait...',\n}\n\nexport interface ConfirmDialogProps {\n labels?: Partial<ConfirmDialogLabels>\n isOpen: boolean\n onClose: () => void\n onConfirm: () => void\n title: string\n description: string\n confirmText?: string\n cancelText?: string\n variant?: 'destructive' | 'default'\n isLoading?: boolean\n /** Dialog test id (default `confirmation-modal`). */\n testId?: string\n /** Button ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'confirm', string>>\n /** Extra content between the description and the buttons (e.g. an opt-in checkbox). */\n children?: ReactNode\n}\n\n/**\n * Declarative yes/no confirmation with a loading state. An `alertdialog`: initial focus is on\n * Cancel (the safe action) and clicking outside does not dismiss it; Escape and Cancel do.\n */\nexport function ConfirmDialog({\n isOpen,\n onClose,\n onConfirm,\n title,\n description,\n confirmText,\n cancelText,\n variant = 'destructive',\n isLoading = false,\n labels,\n testId,\n testIds,\n children,\n}: ConfirmDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONFIRM_DIALOG_LABELS, ...labels }), [labels])\n const cancelRef = useRef<HTMLButtonElement>(null)\n return (\n <ModalScaffold\n open={isOpen}\n onOpenChange={(next) => {\n if (!next) onClose()\n }}\n role=\"alertdialog\"\n initialFocusRef={cancelRef}\n title={title}\n description={description}\n showDescription\n icon={\n variant === 'destructive' ? (\n <AlertTriangle className=\"h-5 w-5 text-red-text\" aria-hidden=\"true\" />\n ) : null\n }\n testId={testIdOr(testId, { testId: 'confirmation-modal' })}\n >\n {children}\n <ModalScaffold.Footer>\n <Button\n ref={cancelRef}\n variant=\"outline\"\n onClick={() => onClose()}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.cancel, { testId: 'confirmation-modal-cancel-button' })}\n >\n {cancelText ?? l.cancel}\n </Button>\n <Button\n variant={variant}\n onClick={onConfirm}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.confirm, { testId: 'confirmation-modal-confirm-button' })}\n >\n {isLoading ? l.pleaseWait : (confirmText ?? l.confirm)}\n </Button>\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n"]}
@@ -1,8 +1,10 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
+ var chunkAHDJXIUB_cjs = require('./chunk-AHDJXIUB.cjs');
4
5
  var chunkR26BK7YL_cjs = require('./chunk-R26BK7YL.cjs');
5
6
  var chunkB6MVQCXW_cjs = require('./chunk-B6MVQCXW.cjs');
7
+ var chunkFX3K6LNZ_cjs = require('./chunk-FX3K6LNZ.cjs');
6
8
  var chunkMHVNT4J3_cjs = require('./chunk-MHVNT4J3.cjs');
7
9
  var react = require('react');
8
10
  var lucideReact = require('lucide-react');
@@ -102,7 +104,6 @@ function SidebarRoot({
102
104
  mode,
103
105
  expanded,
104
106
  isHovering = false,
105
- isPeeking = false,
106
107
  onBackdropClick,
107
108
  hasRailBackdrop = false,
108
109
  onMouseEnter,
@@ -166,18 +167,16 @@ function SidebarRoot({
166
167
  "nav",
167
168
  {
168
169
  ...common,
169
- className: ui.cn(navBase, "absolute left-0 top-0 z-[45]", isPeeking && "shadow-xl", className),
170
+ className: ui.cn(navBase, "absolute left-0 top-0 z-[45]", className),
170
171
  style: {
171
- width: isPeeking ? EXPANDED_WIDTH : "0px",
172
+ width: "0px",
172
173
  minWidth: 0,
173
- paddingLeft: isPeeking ? "0.75rem" : 0,
174
- paddingRight: isPeeking ? "0.75rem" : 0,
175
- borderRightWidth: isPeeking ? void 0 : 0,
176
- pointerEvents: isPeeking ? "auto" : "none"
174
+ paddingLeft: 0,
175
+ paddingRight: 0,
176
+ borderRightWidth: 0,
177
+ pointerEvents: "none"
177
178
  },
178
- inert: !isPeeking,
179
- onMouseEnter,
180
- onMouseLeave,
179
+ inert: true,
181
180
  children
182
181
  }
183
182
  );
@@ -246,7 +245,13 @@ function SidebarHeader({ children, className, "data-testid": testId }) {
246
245
  }
247
246
  );
248
247
  }
249
- function SidebarNav({ items, children, className, "data-testid": testId }) {
248
+ function SidebarNav({
249
+ items,
250
+ sections,
251
+ children,
252
+ className,
253
+ "data-testid": testId
254
+ }) {
250
255
  const { expanded } = useSidebarContext();
251
256
  return /* @__PURE__ */ jsxRuntime.jsxs(
252
257
  "div",
@@ -256,6 +261,16 @@ function SidebarNav({ items, children, className, "data-testid": testId }) {
256
261
  className: ui.cn("flex flex-shrink-0 flex-col gap-0.5", !expanded && "items-center", className),
257
262
  children: [
258
263
  items?.map((item) => /* @__PURE__ */ jsxRuntime.jsx(SidebarNavItem, { ...item }, item.id)),
264
+ sections?.map((section) => /* @__PURE__ */ jsxRuntime.jsx(
265
+ SidebarGroup,
266
+ {
267
+ label: section.label,
268
+ ariaLabel: section.ariaLabel,
269
+ "data-testid": section.testId,
270
+ children: section.items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(SidebarNavItem, { ...item }, item.id))
271
+ },
272
+ section.id
273
+ )),
259
274
  children
260
275
  ]
261
276
  }
@@ -320,6 +335,11 @@ function SidebarFooter({ children, className, "data-testid": testId }) {
320
335
  }
321
336
  );
322
337
  }
338
+ var INDICATOR_TONES = {
339
+ progress: "bg-primary",
340
+ error: "bg-red-solid",
341
+ attention: "bg-yellow-solid"
342
+ };
323
343
  function SidebarNavItem({
324
344
  label,
325
345
  icon,
@@ -331,6 +351,7 @@ function SidebarNavItem({
331
351
  testId,
332
352
  disabled = false,
333
353
  trailing,
354
+ indicator,
334
355
  className,
335
356
  tooltip
336
357
  }) {
@@ -354,7 +375,20 @@ function SidebarNavItem({
354
375
  disabled && "pointer-events-none cursor-not-allowed opacity-30",
355
376
  className
356
377
  ),
357
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex size-5 items-center justify-center", children: icon })
378
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex size-5 items-center justify-center", children: indicator ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
379
+ icon,
380
+ /* @__PURE__ */ jsxRuntime.jsx(
381
+ "div",
382
+ {
383
+ "data-slot": "sidebar-nav-indicator",
384
+ "data-tone": indicator,
385
+ className: ui.cn(
386
+ "absolute -right-1 -top-1 size-2.5 rounded-full border border-sidebar",
387
+ INDICATOR_TONES[indicator]
388
+ )
389
+ }
390
+ )
391
+ ] }) : icon })
358
392
  }
359
393
  );
360
394
  if (!tip) return railButton;
@@ -536,6 +570,163 @@ var Sidebar = {
536
570
  BadgeRow: SidebarBadgeRow,
537
571
  DrawerHeader: SidebarDrawerHeader
538
572
  };
573
+ function ShellSidebar({
574
+ controller,
575
+ drawerLogo,
576
+ drawerCloseTestId,
577
+ header,
578
+ items,
579
+ sections,
580
+ navClassName,
581
+ tips,
582
+ footer,
583
+ ...rootProps
584
+ }) {
585
+ if (controller.layout.hidden) return null;
586
+ return /* @__PURE__ */ jsxRuntime.jsxs(Sidebar.Root, { ...controller.rootProps, ...rootProps, children: [
587
+ controller.isDrawer && drawerLogo && /* @__PURE__ */ jsxRuntime.jsx(
588
+ Sidebar.DrawerHeader,
589
+ {
590
+ logo: drawerLogo,
591
+ onClose: controller.closeDrawer,
592
+ "data-testid": drawerCloseTestId
593
+ }
594
+ ),
595
+ header && /* @__PURE__ */ jsxRuntime.jsx(Sidebar.Header, { children: header }),
596
+ /* @__PURE__ */ jsxRuntime.jsx(Sidebar.Nav, { items, sections, className: navClassName }),
597
+ (tips || footer) && /* @__PURE__ */ jsxRuntime.jsxs(Sidebar.Footer, { children: [
598
+ controller.tipsVisible && tips,
599
+ footer
600
+ ] })
601
+ ] });
602
+ }
603
+ function useCloseOnEscape(isActive, onClose) {
604
+ const onCloseRef = react.useRef(onClose);
605
+ react.useEffect(() => {
606
+ onCloseRef.current = onClose;
607
+ });
608
+ react.useEffect(() => {
609
+ if (!isActive) return;
610
+ const onKeyDown = (e) => {
611
+ if (e.key === "Escape" && !e.defaultPrevented) onCloseRef.current();
612
+ };
613
+ document.addEventListener("keydown", onKeyDown);
614
+ return () => document.removeEventListener("keydown", onKeyDown);
615
+ }, [isActive]);
616
+ }
617
+ function resolveSidebarLayout(input) {
618
+ const { isSmallScreen, isDrawerRequested, isCollapsed, isPinned, isHovering } = input;
619
+ const canPin = isPinned && !isSmallScreen && !input.isNarrow;
620
+ const drawerOpen = isSmallScreen && isDrawerRequested;
621
+ const effectiveCollapsed = isCollapsed || isSmallScreen && !drawerOpen;
622
+ const hovering = isHovering && !isSmallScreen;
623
+ let mode;
624
+ if (drawerOpen) mode = "drawer";
625
+ else if (effectiveCollapsed) mode = "collapsed";
626
+ else if (canPin) mode = "pinned";
627
+ else mode = "rail";
628
+ const expanded = drawerOpen || !effectiveCollapsed && (canPin || hovering);
629
+ return { mode, expanded, hidden: isSmallScreen && !drawerOpen, hovering };
630
+ }
631
+ function useSidebarSettle(expanded, settleMs = 300) {
632
+ const [labelsExpanded, setLabelsExpanded] = react.useState(expanded);
633
+ const [tipsVisible, setTipsVisible] = react.useState(expanded);
634
+ const labelsTimer = react.useRef(null);
635
+ const tipsTimer = react.useRef(null);
636
+ react.useEffect(() => {
637
+ if (labelsTimer.current) clearTimeout(labelsTimer.current);
638
+ if (expanded) setLabelsExpanded(true);
639
+ else labelsTimer.current = setTimeout(() => setLabelsExpanded(false), settleMs);
640
+ return () => {
641
+ if (labelsTimer.current) clearTimeout(labelsTimer.current);
642
+ };
643
+ }, [expanded, settleMs]);
644
+ react.useEffect(() => {
645
+ if (tipsTimer.current) clearTimeout(tipsTimer.current);
646
+ if (expanded) tipsTimer.current = setTimeout(() => setTipsVisible(true), settleMs);
647
+ else setTipsVisible(false);
648
+ return () => {
649
+ if (tipsTimer.current) clearTimeout(tipsTimer.current);
650
+ };
651
+ }, [expanded, settleMs]);
652
+ return { labelsExpanded, tipsVisible };
653
+ }
654
+
655
+ // src/shell/use-sidebar-controller.ts
656
+ var isMenuOpen = () => typeof document !== "undefined" && document.querySelector('[role="menu"][data-state="open"]') !== null;
657
+ function useSidebarController(options = {}) {
658
+ const [storedPinned, setPinned] = chunkAHDJXIUB_cjs.useControllableState(
659
+ options.isPinned,
660
+ options.defaultPinned ?? true,
661
+ options.onPinnedChange
662
+ );
663
+ const [isHovering, setHovering] = chunkAHDJXIUB_cjs.useControllableState(
664
+ options.isHovering,
665
+ false,
666
+ options.onHoveringChange
667
+ );
668
+ const [isDrawerOpen, setDrawerOpen] = chunkAHDJXIUB_cjs.useControllableState(
669
+ options.isDrawerOpen,
670
+ false,
671
+ options.onDrawerOpenChange
672
+ );
673
+ const isSmallScreen = chunkFX3K6LNZ_cjs.useIsPhone();
674
+ const isNarrow = chunkFX3K6LNZ_cjs.useIsNarrow() || !!options.forceRail;
675
+ const isTouch = chunkFX3K6LNZ_cjs.useIsTouchScreen();
676
+ const layout = resolveSidebarLayout({
677
+ isSmallScreen,
678
+ isDrawerRequested: isDrawerOpen,
679
+ isCollapsed: false,
680
+ isPinned: storedPinned,
681
+ isHovering,
682
+ isNarrow
683
+ });
684
+ const isDrawer = layout.mode === "drawer";
685
+ const { labelsExpanded, tipsVisible } = useSidebarSettle(layout.expanded);
686
+ const isPointerOver = react.useRef(false);
687
+ const closeDrawer = react.useCallback(() => setDrawerOpen(false), [setDrawerOpen]);
688
+ const openDrawer = react.useCallback(() => setDrawerOpen(true), [setDrawerOpen]);
689
+ useCloseOnEscape(layout.mode === "rail" && layout.hovering, () => setHovering(false));
690
+ react.useEffect(() => {
691
+ if (isDrawerOpen && !isSmallScreen) setDrawerOpen(false);
692
+ }, [isDrawerOpen, isSmallScreen, setDrawerOpen]);
693
+ const onMouseEnter = () => {
694
+ if (isTouch) return;
695
+ isPointerOver.current = true;
696
+ if (!isSmallScreen && !isNarrow && !isMenuOpen()) setHovering(true);
697
+ };
698
+ const onMouseLeave = () => {
699
+ if (isTouch) return;
700
+ isPointerOver.current = false;
701
+ if (!isSmallScreen) setHovering(false);
702
+ };
703
+ return {
704
+ layout,
705
+ expanded: labelsExpanded,
706
+ tipsVisible,
707
+ isDrawer,
708
+ isSmallScreen,
709
+ isNarrow,
710
+ isPinned: storedPinned && !isNarrow,
711
+ rootProps: {
712
+ mode: layout.mode,
713
+ expanded: labelsExpanded,
714
+ isHovering: layout.hovering,
715
+ onBackdropClick: isDrawer ? closeDrawer : () => setHovering(false),
716
+ hasRailBackdrop: isTouch,
717
+ onMouseEnter,
718
+ onMouseLeave
719
+ },
720
+ openDrawer,
721
+ closeDrawer,
722
+ togglePin: () => isNarrow ? setHovering(!isHovering) : setPinned(!storedPinned),
723
+ expand: () => isNarrow ? setHovering(true) : setPinned(true),
724
+ afterNavigate: () => {
725
+ if (!isPointerOver.current && !storedPinned) setHovering(false);
726
+ if (isDrawer) closeDrawer();
727
+ }
728
+ };
729
+ }
539
730
  var PULSE_STYLES = {
540
731
  active: "animate-pulse-attention text-primary",
541
732
  success: "animate-pulse-attention text-green-text",
@@ -1497,44 +1688,6 @@ function TipCard({
1497
1688
  }
1498
1689
  );
1499
1690
  }
1500
- function resolveSidebarLayout(input) {
1501
- const { isSmallScreen, isDrawerRequested, isCollapsed, isPinned, isHovering } = input;
1502
- const isPeeking = input.isPeeking ?? false;
1503
- const canPin = isPinned && !isSmallScreen && !input.isNarrow;
1504
- const drawerOpen = isSmallScreen && isDrawerRequested;
1505
- const effectiveCollapsed = isCollapsed || isSmallScreen && !drawerOpen;
1506
- const hovering = isHovering && !isSmallScreen;
1507
- let mode;
1508
- if (drawerOpen) mode = "drawer";
1509
- else if (effectiveCollapsed) mode = "collapsed";
1510
- else if (canPin) mode = "pinned";
1511
- else mode = "rail";
1512
- const expanded = drawerOpen || canPin || !isCollapsed && isHovering || isCollapsed && isPeeking;
1513
- return { mode, expanded, hidden: isSmallScreen && !drawerOpen, hovering };
1514
- }
1515
- function useSidebarSettle(expanded, settleMs = 300) {
1516
- const [labelsExpanded, setLabelsExpanded] = react.useState(expanded);
1517
- const [tipsVisible, setTipsVisible] = react.useState(expanded);
1518
- const labelsTimer = react.useRef(null);
1519
- const tipsTimer = react.useRef(null);
1520
- react.useEffect(() => {
1521
- if (labelsTimer.current) clearTimeout(labelsTimer.current);
1522
- if (expanded) setLabelsExpanded(true);
1523
- else labelsTimer.current = setTimeout(() => setLabelsExpanded(false), settleMs);
1524
- return () => {
1525
- if (labelsTimer.current) clearTimeout(labelsTimer.current);
1526
- };
1527
- }, [expanded, settleMs]);
1528
- react.useEffect(() => {
1529
- if (tipsTimer.current) clearTimeout(tipsTimer.current);
1530
- if (expanded) tipsTimer.current = setTimeout(() => setTipsVisible(true), settleMs);
1531
- else setTipsVisible(false);
1532
- return () => {
1533
- if (tipsTimer.current) clearTimeout(tipsTimer.current);
1534
- };
1535
- }, [expanded, settleMs]);
1536
- return { labelsExpanded, tipsVisible };
1537
- }
1538
1691
  var VARIANT_TONE = {
1539
1692
  info: "bg-blue-bg text-primary border-blue-border",
1540
1693
  warning: "bg-yellow-bg text-yellow-text border-yellow-border",
@@ -1690,6 +1843,7 @@ exports.OfflinePill = OfflinePill;
1690
1843
  exports.RemoteControlPill = RemoteControlPill;
1691
1844
  exports.STATUS_ROW_BASE_CLASS = STATUS_ROW_BASE_CLASS;
1692
1845
  exports.STATUS_ROW_TONES = STATUS_ROW_TONES;
1846
+ exports.ShellSidebar = ShellSidebar;
1693
1847
  exports.Sidebar = Sidebar;
1694
1848
  exports.SidebarBadgeRow = SidebarBadgeRow;
1695
1849
  exports.SidebarRowAction = SidebarRowAction;
@@ -1703,8 +1857,10 @@ exports.initInstallPrompt = initInstallPrompt;
1703
1857
  exports.isIosDevice = isIosDevice;
1704
1858
  exports.promptAppInstall = promptAppInstall;
1705
1859
  exports.resolveSidebarLayout = resolveSidebarLayout;
1860
+ exports.useCloseOnEscape = useCloseOnEscape;
1706
1861
  exports.useInstallPrompt = useInstallPrompt;
1707
1862
  exports.useSidebarContext = useSidebarContext;
1863
+ exports.useSidebarController = useSidebarController;
1708
1864
  exports.useSidebarSettle = useSidebarSettle;
1709
- //# sourceMappingURL=chunk-GFRQG36Y.cjs.map
1710
- //# sourceMappingURL=chunk-GFRQG36Y.cjs.map
1865
+ //# sourceMappingURL=chunk-YFY3TQ6Q.cjs.map
1866
+ //# sourceMappingURL=chunk-YFY3TQ6Q.cjs.map