@treenity/react 3.0.1 → 3.0.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.
Files changed (100) hide show
  1. package/README.md +1 -1
  2. package/dist/App.d.ts.map +1 -1
  3. package/dist/App.js +33 -7
  4. package/dist/App.js.map +1 -1
  5. package/dist/ComponentSection.js +1 -1
  6. package/dist/ComponentSection.js.map +1 -1
  7. package/dist/ErrorBoundary.d.ts.map +1 -1
  8. package/dist/ErrorBoundary.js +2 -1
  9. package/dist/ErrorBoundary.js.map +1 -1
  10. package/dist/Treenity.d.ts +15 -0
  11. package/dist/Treenity.d.ts.map +1 -0
  12. package/dist/Treenity.js +17 -0
  13. package/dist/Treenity.js.map +1 -0
  14. package/dist/cache.d.ts.map +1 -1
  15. package/dist/cache.js +5 -0
  16. package/dist/cache.js.map +1 -1
  17. package/dist/client-tree.d.ts.map +1 -1
  18. package/dist/client-tree.js +2 -2
  19. package/dist/client-tree.js.map +1 -1
  20. package/dist/components/ui/button.d.ts +2 -2
  21. package/dist/components/ui/button.d.ts.map +1 -1
  22. package/dist/components/ui/button.js +3 -3
  23. package/dist/components/ui/button.js.map +1 -1
  24. package/dist/components/ui/pagination.d.ts +2 -2
  25. package/dist/components/ui/pagination.d.ts.map +1 -1
  26. package/dist/components/ui/pagination.js +3 -3
  27. package/dist/components/ui/pagination.js.map +1 -1
  28. package/dist/components/ui/textarea.js +1 -1
  29. package/dist/components/ui/textarea.js.map +1 -1
  30. package/dist/events.d.ts +2 -0
  31. package/dist/events.d.ts.map +1 -1
  32. package/dist/events.js +47 -2
  33. package/dist/events.js.map +1 -1
  34. package/dist/fiber-tree.d.ts.map +1 -1
  35. package/dist/fiber-tree.js.map +1 -1
  36. package/dist/hooks.d.ts +9 -0
  37. package/dist/hooks.d.ts.map +1 -1
  38. package/dist/hooks.js +80 -5
  39. package/dist/hooks.js.map +1 -1
  40. package/dist/lib/minimd.d.ts.map +1 -1
  41. package/dist/lib/minimd.js +8 -1
  42. package/dist/lib/minimd.js.map +1 -1
  43. package/dist/lib/sanitize-href.d.ts +3 -0
  44. package/dist/lib/sanitize-href.d.ts.map +1 -0
  45. package/dist/lib/sanitize-href.js +14 -0
  46. package/dist/lib/sanitize-href.js.map +1 -0
  47. package/dist/main.d.ts +2 -0
  48. package/dist/main.d.ts.map +1 -1
  49. package/dist/main.js +14 -5
  50. package/dist/main.js.map +1 -1
  51. package/dist/mods/editor-ui/FieldLabel.d.ts.map +1 -1
  52. package/dist/mods/editor-ui/FieldLabel.js +2 -1
  53. package/dist/mods/editor-ui/FieldLabel.js.map +1 -1
  54. package/dist/mods/editor-ui/default-edit.js +4 -2
  55. package/dist/mods/editor-ui/default-edit.js.map +1 -1
  56. package/dist/mods/editor-ui/form-field.d.ts.map +1 -1
  57. package/dist/mods/editor-ui/form-field.js +3 -2
  58. package/dist/mods/editor-ui/form-field.js.map +1 -1
  59. package/dist/mods/editor-ui/type-picker.d.ts.map +1 -1
  60. package/dist/mods/editor-ui/type-picker.js +2 -1
  61. package/dist/mods/editor-ui/type-picker.js.map +1 -1
  62. package/dist/mods/treenity/preview.d.ts.map +1 -1
  63. package/dist/mods/treenity/preview.js +2 -3
  64. package/dist/mods/treenity/preview.js.map +1 -1
  65. package/dist/mods/treenity/ref-view.js +2 -1
  66. package/dist/mods/treenity/ref-view.js.map +1 -1
  67. package/dist/mods/treenity/seed.js +3 -2
  68. package/dist/mods/treenity/seed.js.map +1 -1
  69. package/dist/symbols.d.ts.map +1 -1
  70. package/dist/symbols.js +11 -5
  71. package/dist/symbols.js.map +1 -1
  72. package/package.json +4 -2
  73. package/src/App.tsx +29 -1
  74. package/src/ComponentSection.tsx +1 -1
  75. package/src/ErrorBoundary.tsx +6 -3
  76. package/src/Treenity.tsx +32 -0
  77. package/src/cache.ts +7 -0
  78. package/src/client-tree.ts +7 -7
  79. package/src/components/ui/button.tsx +4 -5
  80. package/src/components/ui/pagination.tsx +4 -9
  81. package/src/components/ui/textarea.tsx +1 -1
  82. package/src/events.ts +46 -6
  83. package/src/fiber-tree.ts +3 -3
  84. package/src/hooks.ts +73 -4
  85. package/src/lib/minimd.ts +7 -1
  86. package/src/lib/sanitize-href.ts +13 -0
  87. package/src/main.tsx +23 -11
  88. package/src/mods/editor-ui/FieldLabel.tsx +5 -4
  89. package/src/mods/editor-ui/default-edit.tsx +6 -4
  90. package/src/mods/editor-ui/form-field.tsx +4 -2
  91. package/src/mods/editor-ui/type-picker.tsx +3 -2
  92. package/src/mods/treenity/preview.tsx +6 -7
  93. package/src/mods/treenity/ref-view.tsx +11 -6
  94. package/src/mods/treenity/seed.ts +3 -2
  95. package/src/symbols.ts +12 -5
  96. package/src/bind/bind.test.ts +0 -316
  97. package/src/cache.test.ts +0 -139
  98. package/src/client-tree.test.ts +0 -116
  99. package/src/optimistic.test.ts +0 -111
  100. package/src/remote-tree.test.ts +0 -142
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Button } from '#components/ui/button';
3
3
  import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '#components/ui/command';
4
4
  import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '#components/ui/dialog';
5
+ import { Input } from '#components/ui/input';
5
6
  import { trpc } from '#trpc';
6
7
  import { isOfType } from '@treenity/core';
7
8
  import { useEffect, useRef, useState } from 'react';
@@ -61,7 +62,7 @@ export function TypePicker({ onSelect, onCancel, title = 'Create Node', nameLabe
61
62
  }
62
63
  const groups = groupByNamespace(types);
63
64
  return (_jsx(Dialog, { open: true, onOpenChange: (open) => { if (!open)
64
- onCancel(); }, children: _jsxs(DialogContent, { className: "p-0 gap-0 max-w-[380px]", showCloseButton: false, children: [_jsx(DialogHeader, { className: "px-4 pt-4 pb-2", children: _jsx(DialogTitle, { className: "text-[15px]", children: title }) }), _jsxs(Command, { className: "rounded-none border-none", shouldFilter: true, children: [_jsx(CommandInput, { placeholder: "Search types..." }), _jsxs(CommandList, { className: "max-h-[280px]", children: [loading && _jsx("div", { className: "p-3 text-muted-foreground text-[13px]", children: "Loading types..." }), error && _jsx("div", { className: "p-3 text-destructive text-[13px]", children: error }), _jsx(CommandEmpty, { children: "No types found" }), [...groups.entries()].map(([ns, items]) => (_jsx(CommandGroup, { heading: ns, children: items.map((t) => (_jsx(CommandItem, { value: `${t.type} ${t.label} ${t.description}`, onSelect: () => handleSelectType(t.type), className: selectedType === t.type ? 'bg-accent text-accent-foreground' : '', children: _jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-mono text-[13px]", children: t.type }), t.label !== t.type && _jsx("span", { className: "text-muted-foreground text-[12px]", children: t.label })] }), t.description && (_jsx("span", { className: "text-[11px] text-muted-foreground/60 leading-tight", children: t.description }))] }) }, t.type))) }, ns)))] })] }), _jsx("div", { className: "px-4 py-3 border-t border-border", children: _jsx("input", { ref: nameRef, className: "w-full", placeholder: nameLabel, value: name, onChange: (e) => { setName(e.target.value); setNameManual(true); }, onKeyDown: (e) => { if (e.key === 'Enter') {
65
+ onCancel(); }, children: _jsxs(DialogContent, { className: "p-0 gap-0 max-w-[380px]", showCloseButton: false, children: [_jsx(DialogHeader, { className: "px-4 pt-4 pb-2", children: _jsx(DialogTitle, { className: "text-[15px]", children: title }) }), _jsxs(Command, { className: "rounded-none border-none", shouldFilter: true, children: [_jsx(CommandInput, { placeholder: "Search types..." }), _jsxs(CommandList, { className: "max-h-[280px]", children: [loading && _jsx("div", { className: "p-3 text-muted-foreground text-[13px]", children: "Loading types..." }), error && _jsx("div", { className: "p-3 text-destructive text-[13px]", children: error }), _jsx(CommandEmpty, { children: "No types found" }), [...groups.entries()].map(([ns, items]) => (_jsx(CommandGroup, { heading: ns, children: items.map((t) => (_jsx(CommandItem, { value: `${t.type} ${t.label} ${t.description}`, onSelect: () => handleSelectType(t.type), className: selectedType === t.type ? 'bg-accent text-accent-foreground' : '', children: _jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-mono text-[13px]", children: t.type }), t.label !== t.type && _jsx("span", { className: "text-muted-foreground text-[12px]", children: t.label })] }), t.description && (_jsx("span", { className: "text-[11px] text-muted-foreground/60 leading-tight", children: t.description }))] }) }, t.type))) }, ns)))] })] }), _jsx("div", { className: "px-4 py-3 border-t border-border", children: _jsx(Input, { ref: nameRef, className: "h-8 text-sm", placeholder: nameLabel, value: name, onChange: (e) => { setName(e.target.value); setNameManual(true); }, onKeyDown: (e) => { if (e.key === 'Enter') {
65
66
  e.preventDefault();
66
67
  handleSubmit();
67
68
  } } }) }), _jsxs(DialogFooter, { className: "px-4 pb-4", children: [_jsx(Button, { variant: "outline", onClick: onCancel, children: "Cancel" }), _jsxs(Button, { disabled: !name || !selectedType, onClick: handleSubmit, children: [action, name ? ` "${name}"` : '', selectedType ? ` as ${selectedType}` : ''] })] })] }) }));
@@ -1 +1 @@
1
- {"version":3,"file":"type-picker.js","sourceRoot":"","sources":["../../../src/mods/editor-ui/type-picker.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"type-picker.js","sourceRoot":"","sources":["../../../src/mods/editor-ui/type-picker.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../src/mods/treenity/preview.tsx"],"names":[],"mappings":"AA8DA,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIvG;AAID,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACrD,kDA2DA"}
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../src/mods/treenity/preview.tsx"],"names":[],"mappings":"AA+DA,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIvG;AAID,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACrD,kDAyDA"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // Reusable type preview — Storybook-like: context switcher + live render + schema form editor
3
+ import { Button } from '#components/ui/button';
3
4
  import { Render, RenderContext } from '#context';
4
5
  import { getContextsForType } from '@treenity/core';
5
6
  import { useMemo, useState } from 'react';
@@ -88,8 +89,6 @@ export function TypePreview({ typeName, properties }) {
88
89
  const handleFormChange = (next) => {
89
90
  setNode({ ...next, $path: initial.$path, $type: initial.$type });
90
91
  };
91
- return (_jsxs("div", { children: [_jsx("div", { className: "flex gap-1.5 mb-2", children: reactContexts.map(c => (_jsx("button", { onClick: () => setPreviewCtx(prev => prev === c ? null : c), className: `px-2.5 py-0.5 rounded-full text-xs font-mono border cursor-pointer transition-colors ${previewCtx === c
92
- ? 'bg-primary text-primary-foreground border-primary'
93
- : 'bg-muted border-border text-muted-foreground hover:border-primary/50'}`, children: c }, c))) }), previewCtx && (_jsxs("div", { className: "flex flex-col gap-3", children: [_jsx("div", { className: "border border-border rounded-lg p-3 bg-background/50", children: _jsx(RenderContext, { name: previewCtx, children: _jsx(Render, { value: node }) }) }), _jsxs("details", { className: "group", children: [_jsx("summary", { className: "text-xs text-muted-foreground cursor-pointer select-none hover:text-foreground transition-colors", children: "Edit data" }), _jsx("div", { className: "mt-2 border border-border rounded-lg p-3 bg-muted/30", children: _jsx(RenderContext, { name: "react:form", children: _jsx(Render, { value: node, onChange: handleFormChange }) }) })] })] }))] }));
92
+ return (_jsxs("div", { children: [_jsx("div", { className: "flex gap-1.5 mb-2", children: reactContexts.map(c => (_jsx(Button, { variant: previewCtx === c ? 'default' : 'outline', size: "sm", className: "h-auto rounded-full px-2.5 py-0.5 text-xs font-mono", onClick: () => setPreviewCtx(prev => prev === c ? null : c), children: c }, c))) }), previewCtx && (_jsxs("div", { className: "flex flex-col gap-3", children: [_jsx("div", { className: "border border-border rounded-lg p-3 bg-background/50", children: _jsx(RenderContext, { name: previewCtx, children: _jsx(Render, { value: node }) }) }), _jsxs("details", { className: "group", children: [_jsx("summary", { className: "text-xs text-muted-foreground cursor-pointer select-none hover:text-foreground transition-colors", children: "Edit data" }), _jsx("div", { className: "mt-2 border border-border rounded-lg p-3 bg-muted/30", children: _jsx(RenderContext, { name: "react:form", children: _jsx(Render, { value: node, onChange: handleFormChange }) }) })] })] }))] }));
94
93
  }
95
94
  //# sourceMappingURL=preview.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/mods/treenity/preview.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/mods/treenity/preview.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  // Ref node/component view — shows target path, resolve button, inline preview
3
+ import { Button } from '#components/ui/button';
3
4
  import { Render } from '#context';
4
5
  import { usePath } from '#hooks';
5
6
  import { register } from '@treenity/core';
@@ -21,7 +22,7 @@ function RefListItem({ value }) {
21
22
  function RefDisplay({ target, onSelect }) {
22
23
  const [resolved, setResolved] = useState(false);
23
24
  const targetNode = usePath(resolved ? target : null);
24
- return (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground text-sm", children: "ref" }), _jsx("span", { className: "text-sm font-mono text-primary", children: target }), onSelect && (_jsx("button", { className: "text-xs px-2 py-0.5 rounded bg-muted hover:bg-muted/80 text-foreground border border-border", onClick: () => onSelect(target), children: "Go to" })), _jsx("button", { className: "text-xs px-2 py-0.5 rounded bg-muted hover:bg-muted/80 text-foreground border border-border", onClick: () => setResolved(!resolved), children: resolved ? 'Collapse' : 'Resolve' })] }), resolved && (_jsx("div", { className: "border border-border rounded p-3 bg-muted/30", children: targetNode ? (_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground mb-2", children: [_jsx("span", { className: "font-mono", children: targetNode.$type }), _jsx("span", { children: targetNode.$path })] }), _jsx(Render, { value: targetNode })] })) : (_jsx("div", { className: "text-sm text-muted-foreground", children: "Loading..." })) }))] }));
25
+ return (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground text-sm", children: "ref" }), _jsx("span", { className: "text-sm font-mono text-primary", children: target }), onSelect && (_jsx(Button, { variant: "outline", size: "sm", className: "h-auto px-2 py-0.5 text-xs", onClick: () => onSelect(target), children: "Go to" })), _jsx(Button, { variant: "outline", size: "sm", className: "h-auto px-2 py-0.5 text-xs", onClick: () => setResolved(!resolved), children: resolved ? 'Collapse' : 'Resolve' })] }), resolved && (_jsx("div", { className: "border border-border rounded p-3 bg-muted/30", children: targetNode ? (_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground mb-2", children: [_jsx("span", { className: "font-mono", children: targetNode.$type }), _jsx("span", { children: targetNode.$path })] }), _jsx(Render, { value: targetNode })] })) : (_jsx("div", { className: "text-sm text-muted-foreground", children: "Loading..." })) }))] }));
25
26
  }
26
27
  // ── Registration ──
27
28
  register('ref', 'react', RefNodeView);
@@ -1 +1 @@
1
- {"version":3,"file":"ref-view.js","sourceRoot":"","sources":["../../../src/mods/treenity/ref-view.tsx"],"names":[],"mappings":";AAAA,8EAA8E;AAE9E,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAiB,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,gEAAgE;AAEhE,SAAS,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAuD;IAC3F,MAAM,GAAG,GAAI,KAAa,CAAC,IAA0B,CAAC;IACtD,IAAI,CAAC,GAAG;QAAE,OAAO,cAAK,SAAS,EAAC,+BAA+B,sCAA4B,CAAC;IAE5F,OAAO,KAAC,UAAU,IAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC;AACzD,CAAC;AAED,oDAAoD;AAEpD,SAAS,WAAW,CAAC,EAAE,KAAK,EAAuB;IACjD,MAAM,GAAG,GAAI,KAAa,CAAC,IAA0B,CAAC;IACtD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;IAE1D,OAAO,CACL,8BACE,eAAM,SAAS,EAAC,YAAY,6BAAiB,EAC7C,eAAK,SAAS,EAAC,YAAY,aACzB,eAAM,SAAS,EAAC,YAAY,YAAE,IAAI,GAAQ,EAC1C,eAAM,SAAS,EAAC,YAAY,YAAE,GAAG,IAAI,KAAK,GAAQ,IAC9C,IACL,CACJ,CAAC;AACJ,CAAC;AAED,uBAAuB;AAEvB,SAAS,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAsD;IAC1F,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAErD,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aAExB,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAM,SAAS,EAAC,+BAA+B,oBAAW,EAC1D,eAAM,SAAS,EAAC,gCAAgC,YAAE,MAAM,GAAQ,EAE/D,QAAQ,IAAI,CACX,iBACE,SAAS,EAAC,6FAA6F,EACvG,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,sBAGxB,CACV,EAED,iBACE,SAAS,EAAC,6FAA6F,EACvG,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,YAEpC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,GAC3B,IACL,EAGL,QAAQ,IAAI,CACX,cAAK,SAAS,EAAC,8CAA8C,YAC1D,UAAU,CAAC,CAAC,CAAC,CACZ,eAAK,SAAS,EAAC,WAAW,aACxB,eAAK,SAAS,EAAC,4DAA4D,aACzE,eAAM,SAAS,EAAC,WAAW,YAAE,UAAU,CAAC,KAAK,GAAQ,EACrD,yBAAO,UAAU,CAAC,KAAK,GAAQ,IAC3B,EACN,KAAC,MAAM,IAAC,KAAK,EAAE,UAAU,GAAI,IACzB,CACP,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,+BAA+B,2BAAiB,CAChE,GACG,CACP,IACG,CACP,CAAC;AACJ,CAAC;AAED,qBAAqB;AAErB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,WAAkB,CAAC,CAAC;AAC7C,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,WAAkB,CAAC,CAAC"}
1
+ {"version":3,"file":"ref-view.js","sourceRoot":"","sources":["../../../src/mods/treenity/ref-view.tsx"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { R, S } from '@treenity/core';
1
+ import { A, R, S, W } from '@treenity/core';
2
2
  import { registerPrefab } from '@treenity/core/mod';
3
3
  registerPrefab('core', 'seed', [
4
4
  { $path: 'sys', $type: 'treenity.system' },
5
- { $path: 'auth', $type: 'dir' },
5
+ { $path: 'auth', $type: 'dir', $acl: [{ g: 'admins', p: R | W | A | S }, { g: 'public', p: 0 }] },
6
6
  { $path: 'auth/users', $type: 'mount-point',
7
7
  connection: { $type: 'connection', db: 'treenity', collection: 'users' },
8
8
  mount: { $type: 't.mount.mongo' },
@@ -19,6 +19,7 @@ registerPrefab('core', 'seed', [
19
19
  { $path: 'auth/sessions', $type: 'mount-point',
20
20
  connection: { $type: 'connection', db: 'treenity', collection: 'sessions' },
21
21
  mount: { $type: 't.mount.mongo' },
22
+ $acl: [{ g: 'admins', p: R | W | A | S }, { g: 'authenticated', p: 0 }, { g: 'public', p: 0 }],
22
23
  },
23
24
  { $path: 'mnt', $type: 'dir' },
24
25
  { $path: 'mnt/orders', $type: 't.mount.mongo',
@@ -1 +1 @@
1
- {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../src/mods/treenity/seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE;IAC7B,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE;IAC1C,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE;IAC/B,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa;QACzC,UAAU,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE;QACxE,KAAK,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE;QACjC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;KAChE;IACD,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa;QACxC,KAAK,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE;QACjC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;KAC9B;IACD,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa;QACvC,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE;QAChC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;KAC9B;IACD,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa;QAC5C,UAAU,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE;QAC3E,KAAK,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE;KAClC;IACD,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IAC9B,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe;QAC3C,UAAU,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE;KAC1E;IACD,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE;IACnC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;QAC3B,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,qBAAqB,EAAE;QACvF,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;QAC3C,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE;KACxC;IACD,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;IAChC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE;IAClD,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,sBAAsB;QACpD,KAAK,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE;KACnC;IACD,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,eAAe,EAAE;IACtD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa;QACnC,KAAK,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE;QAClC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;KAC9B;IACD,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,EAAE;IAC9C,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE;IAC/D,EAAE,KAAK,EAAE,8BAA8B,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,EAAE;IACnF,EAAE,KAAK,EAAE,wBAAwB,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE;CAC3D,EAAE,CAAC,KAAK,EAAE,EAAE;IACzB,oBAAoB;IACpB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;IACrD,IAAI,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACzB,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CACpD,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../src/mods/treenity/seed.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE5D,eAAO,MAAM,IAAI,eAA8B,CAAC;AAChD,eAAO,MAAM,KAAK,eAA+B,CAAC;AAElD,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAS9C"}
1
+ {"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAIA,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE5D,eAAO,MAAM,IAAI,eAA8B,CAAC;AAChD,eAAO,MAAM,KAAK,eAA+B,CAAC;AAMlD,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAW9C"}
package/dist/symbols.js CHANGED
@@ -1,16 +1,22 @@
1
1
  // Symbol-based component location metadata.
2
- // Stamped on deserialization (cache.put). Survive spread, invisible to JSON/keys/entries.
2
+ // Stamped on deserialization (cache.put). Non-enumerable so they're
3
+ // invisible to structuredClone, spread, and JSON/keys/entries.
3
4
  import { isComponent } from '@treenity/core';
4
5
  export const $key = Symbol.for('treenity.$key');
5
6
  export const $node = Symbol.for('treenity.$node');
7
+ function hide(obj, sym, value) {
8
+ Object.defineProperty(obj, sym, { value, enumerable: false, writable: false, configurable: true });
9
+ }
6
10
  export function stampNode(node) {
7
- node[$key] = '';
8
- node[$node] = node;
11
+ if (node[$node] === node)
12
+ return;
13
+ hide(node, $key, '');
14
+ hide(node, $node, node);
9
15
  for (const [k, v] of Object.entries(node)) {
10
16
  if (k.startsWith('$') || !isComponent(v))
11
17
  continue;
12
- v[$key] = k;
13
- v[$node] = node;
18
+ hide(v, $key, k);
19
+ hide(v, $node, node);
14
20
  }
15
21
  }
16
22
  //# sourceMappingURL=symbols.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"symbols.js","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,0FAA0F;AAE1F,OAAO,EAAE,WAAW,EAAiB,MAAM,gBAAgB,CAAC;AAE5D,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAElD,MAAM,UAAU,SAAS,CAAC,IAAc;IACrC,IAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACxB,IAAY,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAE5B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YAAE,SAAS;QAClD,CAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC3B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"symbols.js","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,oEAAoE;AACpE,+DAA+D;AAE/D,OAAO,EAAE,WAAW,EAAiB,MAAM,gBAAgB,CAAC;AAE5D,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAElD,SAAS,IAAI,CAAC,GAAW,EAAE,GAAW,EAAE,KAAc;IACpD,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,IAAK,IAAY,CAAC,KAAK,CAAC,KAAK,IAAI;QAAE,OAAO;IAE1C,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACrB,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAExB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YAAE,SAAS;QACnD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACjB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@treenity/react",
3
- "version": "3.0.1",
3
+ "version": "3.0.3",
4
4
  "description": "React binding for Treenity — reactive hooks, admin UI, and context-based component rendering.",
5
5
  "type": "module",
6
6
  "publishConfig": {
7
7
  "access": "public"
8
8
  },
9
- "license": "AGPL-3.0",
9
+ "license": "FSL-1.1-MIT",
10
10
  "author": "Treenity <hello@treenity.ai> (https://treenity.ai)",
11
11
  "homepage": "https://github.com/treenity-ai/treenity",
12
12
  "repository": {
@@ -73,6 +73,8 @@
73
73
  "files": [
74
74
  "dist",
75
75
  "src",
76
+ "!src/**/*.test.ts",
77
+ "!src/**/*.test.tsx",
76
78
  "LICENSE",
77
79
  "README.md"
78
80
  ],
package/src/App.tsx CHANGED
@@ -17,7 +17,7 @@ import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from '
17
17
  import { toast } from 'sonner';
18
18
  import * as cache from './cache';
19
19
  import { tree } from './client';
20
- import { startEvents, stopEvents } from './events';
20
+ import { SSE_CONNECTED, SSE_DISCONNECTED, startEvents, stopEvents } from './events';
21
21
  import { NavigateProvider } from './hooks';
22
22
  import { Inspector } from './Inspector';
23
23
  import { LoginModal, LoginScreen } from './Login';
@@ -109,6 +109,29 @@ export function App() {
109
109
  const [filter, setFilter] = useState('');
110
110
  const [showHidden, setShowHidden] = useState(false);
111
111
  const [toastMsg, setToastMsg] = useState<{ text: string; type: 'success' | 'error' } | null>(null);
112
+ const [sseDown, setSseDown] = useState(false);
113
+ const sseDownTimer = useRef<ReturnType<typeof setTimeout>>(undefined);
114
+
115
+ // TODO: remove debounce, extract from App code, remove debounce
116
+ // SSE connection indicator — debounce disconnect by 2s to avoid flicker
117
+ useEffect(() => {
118
+ const onConnect = () => {
119
+ if (sseDownTimer.current) { clearTimeout(sseDownTimer.current); sseDownTimer.current = undefined; }
120
+ setSseDown(false);
121
+ };
122
+ const onDisconnect = () => {
123
+ if (!sseDownTimer.current) {
124
+ sseDownTimer.current = setTimeout(() => { sseDownTimer.current = undefined; setSseDown(true); }, 2000);
125
+ }
126
+ };
127
+ window.addEventListener(SSE_CONNECTED, onConnect);
128
+ window.addEventListener(SSE_DISCONNECTED, onDisconnect);
129
+ return () => {
130
+ window.removeEventListener(SSE_CONNECTED, onConnect);
131
+ window.removeEventListener(SSE_DISCONNECTED, onDisconnect);
132
+ if (sseDownTimer.current) clearTimeout(sseDownTimer.current);
133
+ };
134
+ }, []);
112
135
 
113
136
  // Granular: only re-render App when root node appears/disappears
114
137
  const hasRootNode = useSyncExternalStore(
@@ -438,6 +461,11 @@ export function App() {
438
461
 
439
462
  return (
440
463
  <NavigateProvider value={navigate}>
464
+ {sseDown && (
465
+ <div className="fixed top-0 inset-x-0 z-50 bg-yellow-500 text-black text-center text-sm py-1">
466
+ Reconnecting to server…
467
+ </div>
468
+ )}
441
469
  <div className="flex h-screen bg-background text-foreground overflow-hidden">
442
470
  <ResizablePanelGroup orientation="horizontal" className="h-full">
443
471
  <ResizablePanel
@@ -59,7 +59,7 @@ export function ComponentSection({
59
59
  toast,
60
60
  onActionComplete,
61
61
  }: ComponentSectionProps) {
62
- const isMain = !onToggle;
62
+ const isMain = !name;
63
63
 
64
64
  return (
65
65
  <div className="border-t border-border mt-2 pt-0.5 first:border-t-0 first:mt-0 first:pt-0">
@@ -1,3 +1,4 @@
1
+ import { Button } from '#components/ui/button';
1
2
  import { Component, type ReactNode } from 'react';
2
3
 
3
4
  type Props = {
@@ -10,12 +11,14 @@ type State = { error: string | null };
10
11
  const defaultFallback = (error: string, reset: () => void) => (
11
12
  <div className="rounded border border-destructive/30 bg-destructive/5 p-2 text-[11px]">
12
13
  <div className="text-destructive font-mono break-all">{error}</div>
13
- <button
14
- className="mt-1 text-[10px] text-muted-foreground hover:text-foreground underline"
14
+ <Button
15
+ variant="link"
16
+ size="sm"
17
+ className="mt-1 h-auto p-0 text-[10px] text-muted-foreground hover:text-foreground underline"
15
18
  onClick={reset}
16
19
  >
17
20
  Retry
18
- </button>
21
+ </Button>
19
22
  </div>
20
23
  );
21
24
 
@@ -0,0 +1,32 @@
1
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
2
+ import { enablePatches } from 'immer'
3
+ import { type ReactNode } from 'react'
4
+ import { App } from './App'
5
+ import './load-client'
6
+ import { Toaster } from './components/ui/sonner'
7
+ import './root.css'
8
+
9
+ enablePatches()
10
+
11
+ const queryClient = new QueryClient()
12
+
13
+ export interface TreenityProps {
14
+ /** Override initial path */
15
+ path?: string
16
+ /** Wrap with custom providers */
17
+ children?: ReactNode
18
+ }
19
+
20
+ /**
21
+ * Treenity as a single React component.
22
+ * Includes all providers, auth, SSE, cache.
23
+ */
24
+ export function Treenity({ children }: TreenityProps) {
25
+ return (
26
+ <QueryClientProvider client={queryClient}>
27
+ <App />
28
+ <Toaster />
29
+ {children}
30
+ </QueryClientProvider>
31
+ )
32
+ }
package/src/cache.ts CHANGED
@@ -6,6 +6,10 @@ import type { NodeData } from '@treenity/core';
6
6
  import * as idb from './idb';
7
7
  import { stampNode } from './symbols';
8
8
 
9
+ /** Shallow-freeze in dev mode to catch accidental cache mutation at the source */
10
+ const devFreeze: (node: NodeData) => void =
11
+ import.meta.env?.DEV ? (node) => Object.freeze(node) : () => {};
12
+
9
13
  type Sub = () => void;
10
14
 
11
15
  const nodes = new Map<string, NodeData>();
@@ -112,6 +116,7 @@ export function removeFromParent(path: string, parent: string) {
112
116
  export function put(node: NodeData, virtualParent?: string) {
113
117
  stampNode(node);
114
118
  nodes.set(node.$path, node);
119
+ devFreeze(node);
115
120
  const p = virtualParent ?? parentOf(node.$path);
116
121
  if (p !== null) {
117
122
  if (!parentIndex.has(p)) parentIndex.set(p, new Set());
@@ -139,6 +144,7 @@ export function putMany(items: NodeData[], virtualParent?: string) {
139
144
  for (const n of items) {
140
145
  stampNode(n);
141
146
  nodes.set(n.$path, n);
147
+ devFreeze(n);
142
148
  lastUpdated.set(n.$path, ts);
143
149
  fire(pathSubs, n.$path);
144
150
  const p = virtualParent ?? parentOf(n.$path);
@@ -230,6 +236,7 @@ export async function hydrate(): Promise<void> {
230
236
  for (const { data, lastUpdated: ts, virtualParent } of entries) {
231
237
  stampNode(data);
232
238
  nodes.set(data.$path, data);
239
+ devFreeze(data);
233
240
  lastUpdated.set(data.$path, ts);
234
241
  const p = virtualParent ?? parentOf(data.$path);
235
242
  if (p !== null) {
@@ -2,13 +2,13 @@
2
2
  // FilterTree: /local/* → memory+mounts, everything else → remote.
3
3
  // Reads merge both — /local visible alongside server nodes.
4
4
 
5
- import type { NodeData } from '@treenity/core'
6
- import { createFilterTree, createMemoryTree } from '@treenity/core/tree'
7
- import { withCache } from '@treenity/core/tree/cache'
8
- import { withMounts } from '@treenity/core/server/mount'
9
- import './fiber-tree' // registers t.mount.react
10
- import { createRemoteTree } from './remote-tree'
11
- import type { trpc } from './trpc'
5
+ import type { NodeData } from '@treenity/core';
6
+ import { withMounts } from '@treenity/core/server/mount';
7
+ import './fiber-tree'; // registers t.mount.react
8
+ import { createFilterTree, createMemoryTree } from '@treenity/core/tree';
9
+ import { withCache } from '@treenity/core/tree/cache';
10
+ import { createRemoteTree } from './remote-tree';
11
+ import type { trpc } from './trpc';
12
12
 
13
13
  type TrpcClient = typeof trpc
14
14
 
@@ -1,8 +1,7 @@
1
- import * as React from "react"
2
- import { cva, type VariantProps } from "class-variance-authority"
3
- import { Slot } from "radix-ui"
4
-
5
- import { cn } from "#components/lib/utils"
1
+ import { cn } from '#components/lib/utils';
2
+ import { cva, type VariantProps } from 'class-variance-authority';
3
+ import { Slot } from 'radix-ui';
4
+ import * as React from 'react';
6
5
 
7
6
  const buttonVariants = cva(
8
7
  "inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
@@ -1,12 +1,7 @@
1
- import * as React from "react"
2
- import {
3
- ChevronLeftIcon,
4
- ChevronRightIcon,
5
- MoreHorizontalIcon,
6
- } from "lucide-react"
7
-
8
- import { cn } from "#components/lib/utils"
9
- import { buttonVariants, type Button } from "#components/ui/button"
1
+ import { cn } from '#components/lib/utils';
2
+ import { type Button, buttonVariants } from '#components/ui/button';
3
+ import { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from 'lucide-react';
4
+ import * as React from 'react';
10
5
 
11
6
  function Pagination({ className, ...props }: React.ComponentProps<"nav">) {
12
7
  return (
@@ -6,7 +6,7 @@ function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
6
6
  <textarea
7
7
  data-slot="textarea"
8
8
  className={cn(
9
- "border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
9
+ "border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 max-h-64 overflow-y-auto w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
10
10
  className
11
11
  )}
12
12
  {...props}
package/src/events.ts CHANGED
@@ -14,14 +14,44 @@ interface EventsConfig {
14
14
  getSelected: () => string | null;
15
15
  }
16
16
 
17
+ // ── SSE connection events (consumed by App.tsx) ──
18
+
19
+ export const SSE_CONNECTED = 'sse-connected';
20
+ export const SSE_DISCONNECTED = 'sse-disconnected';
21
+
17
22
  let unsub: (() => void) | null = null;
23
+ let reconnectTimer: ReturnType<typeof setTimeout> | null = null;
24
+ let lastConfig: EventsConfig | null = null;
18
25
 
19
26
  export function startEvents(config: EventsConfig) {
20
27
  stopEvents();
28
+ lastConfig = config;
21
29
 
22
30
  const { loadChildren, getExpanded, getSelected } = config;
23
31
 
24
32
  const sub = trpc.events.subscribe(undefined as void, {
33
+ onStarted() {
34
+ window.dispatchEvent(new Event(SSE_CONNECTED));
35
+ },
36
+ onConnectionStateChange(state: { state: string }) {
37
+ if (state.state === 'connecting') {
38
+ window.dispatchEvent(new Event(SSE_DISCONNECTED));
39
+ } else if (state.state === 'pending') {
40
+ // 'pending' = connected and waiting for data — SSE is alive
41
+ window.dispatchEvent(new Event(SSE_CONNECTED));
42
+ }
43
+ },
44
+ onError(err: unknown) {
45
+ console.error('[sse] subscription error (non-retryable):', err);
46
+ window.dispatchEvent(new Event(SSE_DISCONNECTED));
47
+ // tRPC exhausted retries — schedule a single delayed re-subscribe
48
+ scheduleResubscribe();
49
+ },
50
+ onStopped() {
51
+ // Server closed the stream — schedule re-subscribe
52
+ window.dispatchEvent(new Event(SSE_DISCONNECTED));
53
+ scheduleResubscribe();
54
+ },
25
55
  onData(event) {
26
56
  if (event.type === 'reconnect') {
27
57
  if (!event.preserved) {
@@ -45,8 +75,9 @@ export function startEvents(config: EventsConfig) {
45
75
  const existing = cache.get(event.path);
46
76
  if (existing && event.patches) {
47
77
  try {
48
- applyPatch(existing, event.patches as Operation[]);
49
- cache.put(existing);
78
+ const patched = structuredClone(existing);
79
+ applyPatch(patched, event.patches as Operation[]);
80
+ cache.put(patched);
50
81
  } catch (e) {
51
82
  console.error('Failed to apply patches, fetching full node:', e);
52
83
  trpc.get.query({ path: event.path }).then((n) => {
@@ -73,9 +104,18 @@ export function startEvents(config: EventsConfig) {
73
104
  unsub = () => sub.unsubscribe();
74
105
  }
75
106
 
107
+ const RESUBSCRIBE_DELAY = 5_000;
108
+
109
+ function scheduleResubscribe() {
110
+ if (reconnectTimer || !lastConfig) return;
111
+ console.log(`[sse] will re-subscribe in ${RESUBSCRIBE_DELAY}ms`);
112
+ reconnectTimer = setTimeout(() => {
113
+ reconnectTimer = null;
114
+ if (lastConfig) startEvents(lastConfig);
115
+ }, RESUBSCRIBE_DELAY);
116
+ }
117
+
76
118
  export function stopEvents() {
77
- if (unsub) {
78
- unsub();
79
- unsub = null;
80
- }
119
+ if (reconnectTimer) { clearTimeout(reconnectTimer); reconnectTimer = null; }
120
+ if (unsub) { unsub(); unsub = null; }
81
121
  }
package/src/fiber-tree.ts CHANGED
@@ -2,9 +2,9 @@
2
2
  // Walks the live Fiber tree on each query — no state, no tracking.
3
3
  // Registered as t.mount.react — isomorphic mount, same as server-side mounts.
4
4
 
5
- import type { NodeData } from '@treenity/core'
6
- import { register } from '@treenity/core'
7
- import type { Tree } from '@treenity/core/tree'
5
+ import type { NodeData } from '@treenity/core';
6
+ import { register } from '@treenity/core';
7
+ import type { Tree } from '@treenity/core/tree';
8
8
 
9
9
  const PREFIX = '/local/react'
10
10