@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.
- package/dist/agents/index.cjs +264 -263
- package/dist/agents/index.js +7 -6
- package/dist/calls/index.cjs +3 -3
- package/dist/calls/index.js +2 -2
- package/dist/{chunk-5Y3SAJUK.cjs → chunk-7NDW4KF4.cjs} +4 -4
- package/dist/{chunk-5Y3SAJUK.cjs.map → chunk-7NDW4KF4.cjs.map} +1 -1
- package/dist/chunk-AHDJXIUB.cjs +25 -0
- package/dist/chunk-AHDJXIUB.cjs.map +1 -0
- package/dist/{chunk-DAIHYDK6.cjs → chunk-DPGFEMVT.cjs} +11 -26
- package/dist/chunk-DPGFEMVT.cjs.map +1 -0
- package/dist/{chunk-ZAVEMQ37.cjs → chunk-DWZXSPMB.cjs} +3 -3
- package/dist/{chunk-ZAVEMQ37.cjs.map → chunk-DWZXSPMB.cjs.map} +1 -1
- package/dist/{chunk-ZNTHEXNJ.js → chunk-ETXYVO6E.js} +4 -4
- package/dist/{chunk-ZNTHEXNJ.js.map → chunk-ETXYVO6E.js.map} +1 -1
- package/dist/{chunk-5HFPRI3W.js → chunk-FUTMU4FR.js} +3 -3
- package/dist/{chunk-5HFPRI3W.js.map → chunk-FUTMU4FR.js.map} +1 -1
- package/dist/{chunk-BPUZEYSP.js → chunk-FXG7TFAG.js} +3 -3
- package/dist/{chunk-BPUZEYSP.js.map → chunk-FXG7TFAG.js.map} +1 -1
- package/dist/{chunk-YLUEQSMK.cjs → chunk-GBS6QVGS.cjs} +5 -5
- package/dist/{chunk-YLUEQSMK.cjs.map → chunk-GBS6QVGS.cjs.map} +1 -1
- package/dist/{chunk-SU7QY7U2.cjs → chunk-HIJUXAWS.cjs} +34 -33
- package/dist/chunk-HIJUXAWS.cjs.map +1 -0
- package/dist/{chunk-O6W6RW3B.js → chunk-I7WG3JRD.js} +206 -53
- package/dist/chunk-I7WG3JRD.js.map +1 -0
- package/dist/{chunk-RYEJ6AA5.js → chunk-N5X37J3D.js} +8 -7
- package/dist/chunk-N5X37J3D.js.map +1 -0
- package/dist/{chunk-OCDDWDH2.js → chunk-ON3TKY5Y.js} +3 -3
- package/dist/{chunk-OCDDWDH2.js.map → chunk-ON3TKY5Y.js.map} +1 -1
- package/dist/{chunk-DJM7DLCT.cjs → chunk-OPTBQSCV.cjs} +3 -3
- package/dist/{chunk-DJM7DLCT.cjs.map → chunk-OPTBQSCV.cjs.map} +1 -1
- package/dist/{chunk-IBIUPT23.js → chunk-PROK33G6.js} +8 -22
- package/dist/chunk-PROK33G6.js.map +1 -0
- package/dist/{chunk-UMG5S6H5.cjs → chunk-QIMVTGKS.cjs} +3 -3
- package/dist/{chunk-UMG5S6H5.cjs.map → chunk-QIMVTGKS.cjs.map} +1 -1
- package/dist/chunk-RLWIUUQ5.js +23 -0
- package/dist/chunk-RLWIUUQ5.js.map +1 -0
- package/dist/{chunk-ECERC6TI.js → chunk-VHJHY7TT.js} +3 -3
- package/dist/{chunk-ECERC6TI.js.map → chunk-VHJHY7TT.js.map} +1 -1
- package/dist/{chunk-GFRQG36Y.cjs → chunk-YFY3TQ6Q.cjs} +208 -52
- package/dist/chunk-YFY3TQ6Q.cjs.map +1 -0
- package/dist/collaboration/index.cjs +42 -42
- package/dist/collaboration/index.js +2 -2
- package/dist/connect/docx.cjs +6 -6
- package/dist/connect/docx.js +5 -5
- package/dist/connect/index.cjs +92 -91
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.js +15 -14
- package/dist/connect/index.js.map +1 -1
- package/dist/facts/index.cjs +2 -2
- package/dist/facts/index.js +2 -2
- package/dist/files/index.cjs +3 -3
- package/dist/files/index.js +3 -3
- package/dist/home/index.cjs +2 -2
- package/dist/home/index.js +2 -2
- package/dist/index.cjs +585 -572
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +19 -18
- package/dist/index.js.map +1 -1
- package/dist/lib/sidebar-mode.d.ts +1 -3
- package/dist/lib/use-close-on-escape.d.ts +6 -0
- package/dist/retrieval/index.cjs +1 -1
- package/dist/retrieval/index.js +1 -1
- package/dist/settings/index.cjs +40 -40
- package/dist/settings/index.js +5 -5
- package/dist/shell/ShellSidebar.d.ts +37 -0
- package/dist/shell/Sidebar.d.ts +6 -6
- package/dist/shell/index.cjs +55 -42
- package/dist/shell/index.d.ts +4 -1
- package/dist/shell/index.js +5 -4
- package/dist/shell/types.d.ts +18 -0
- package/dist/shell/use-sidebar-controller.d.ts +59 -0
- package/dist/site/index.cjs +5 -5
- package/dist/site/index.js +1 -1
- package/dist/studio/index.cjs +3 -3
- package/dist/studio/index.js +3 -3
- package/dist/workflow-canvas/index.cjs +20 -19
- package/dist/workflow-canvas/index.cjs.map +1 -1
- package/dist/workflow-canvas/index.js +7 -6
- package/dist/workflow-canvas/index.js.map +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +4 -4
- package/dist/chunk-DAIHYDK6.cjs.map +0 -1
- package/dist/chunk-GFRQG36Y.cjs.map +0 -1
- package/dist/chunk-IBIUPT23.js.map +0 -1
- package/dist/chunk-O6W6RW3B.js.map +0 -1
- package/dist/chunk-RYEJ6AA5.js.map +0 -1
- 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-
|
|
77
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
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]",
|
|
170
|
+
className: ui.cn(navBase, "absolute left-0 top-0 z-[45]", className),
|
|
170
171
|
style: {
|
|
171
|
-
width:
|
|
172
|
+
width: "0px",
|
|
172
173
|
minWidth: 0,
|
|
173
|
-
paddingLeft:
|
|
174
|
-
paddingRight:
|
|
175
|
-
borderRightWidth:
|
|
176
|
-
pointerEvents:
|
|
174
|
+
paddingLeft: 0,
|
|
175
|
+
paddingRight: 0,
|
|
176
|
+
borderRightWidth: 0,
|
|
177
|
+
pointerEvents: "none"
|
|
177
178
|
},
|
|
178
|
-
inert:
|
|
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({
|
|
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:
|
|
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-
|
|
1710
|
-
//# sourceMappingURL=chunk-
|
|
1865
|
+
//# sourceMappingURL=chunk-YFY3TQ6Q.cjs.map
|
|
1866
|
+
//# sourceMappingURL=chunk-YFY3TQ6Q.cjs.map
|