@dxos/react-ui-table 0.8.4-main.3eb6e50203 → 0.8.4-main.4a85c3132b

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 (80) hide show
  1. package/dist/lib/browser/{chunk-OZBLY7XM.mjs → chunk-DSR2MRZB.mjs} +10 -6
  2. package/dist/lib/browser/chunk-DSR2MRZB.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-GTGYBRJA.mjs → chunk-PTHMYAAM.mjs} +25 -22
  4. package/dist/lib/browser/chunk-PTHMYAAM.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +179 -175
  6. package/dist/lib/browser/index.mjs.map +4 -4
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/testing/index.mjs +2 -2
  9. package/dist/lib/browser/testing/index.mjs.map +1 -1
  10. package/dist/lib/browser/types/index.mjs +1 -1
  11. package/dist/lib/node-esm/{chunk-DPNSZHU5.mjs → chunk-GI72MQSG.mjs} +25 -22
  12. package/dist/lib/node-esm/chunk-GI72MQSG.mjs.map +7 -0
  13. package/dist/lib/node-esm/{chunk-WNZSKIRF.mjs → chunk-HTZJSULI.mjs} +10 -6
  14. package/dist/lib/node-esm/chunk-HTZJSULI.mjs.map +7 -0
  15. package/dist/lib/node-esm/index.mjs +179 -175
  16. package/dist/lib/node-esm/index.mjs.map +4 -4
  17. package/dist/lib/node-esm/meta.json +1 -1
  18. package/dist/lib/node-esm/testing/index.mjs +2 -2
  19. package/dist/lib/node-esm/testing/index.mjs.map +1 -1
  20. package/dist/lib/node-esm/types/index.mjs +1 -1
  21. package/dist/types/src/components/Table/ColumnSettings.d.ts.map +1 -1
  22. package/dist/types/src/components/Table/DynamicTable.d.ts +2 -2
  23. package/dist/types/src/components/Table/DynamicTable.d.ts.map +1 -1
  24. package/dist/types/src/components/Table/DynamicTable.stories.d.ts +1 -1
  25. package/dist/types/src/components/Table/Relations.stories.d.ts.map +1 -1
  26. package/dist/types/src/components/Table/Table.d.ts +7 -7
  27. package/dist/types/src/components/Table/Table.d.ts.map +1 -1
  28. package/dist/types/src/components/Table/Table.stories.d.ts.map +1 -1
  29. package/dist/types/src/components/TableCellEditor/FormCellEditor.d.ts +3 -3
  30. package/dist/types/src/components/TableCellEditor/FormCellEditor.d.ts.map +1 -1
  31. package/dist/types/src/components/TableCellEditor/TableCellEditor.d.ts +2 -2
  32. package/dist/types/src/components/TableCellEditor/TableCellEditor.d.ts.map +1 -1
  33. package/dist/types/src/components/TableCellEditor/TableCellEditor.stories.d.ts.map +1 -1
  34. package/dist/types/src/components/TableToolbar/TableToolbar.d.ts +1 -1
  35. package/dist/types/src/components/TableToolbar/TableToolbar.d.ts.map +1 -1
  36. package/dist/types/src/hooks/useAddRow.d.ts +1 -1
  37. package/dist/types/src/hooks/useAddRow.d.ts.map +1 -1
  38. package/dist/types/src/hooks/useProjectionModel.d.ts +1 -1
  39. package/dist/types/src/hooks/useProjectionModel.d.ts.map +1 -1
  40. package/dist/types/src/model/table-model.d.ts +2 -1
  41. package/dist/types/src/model/table-model.d.ts.map +1 -1
  42. package/dist/types/src/model/table-presentation.d.ts.map +1 -1
  43. package/dist/types/src/testing/useTestTableModel.d.ts +2 -2
  44. package/dist/types/src/testing/useTestTableModel.d.ts.map +1 -1
  45. package/dist/types/src/types/Table.d.ts +1 -1
  46. package/dist/types/src/types/Table.d.ts.map +1 -1
  47. package/dist/types/src/util/dynamic-table.d.ts +2 -2
  48. package/dist/types/src/util/dynamic-table.d.ts.map +1 -1
  49. package/dist/types/src/util/query-ast.d.ts.map +1 -1
  50. package/dist/types/tsconfig.tsbuildinfo +1 -1
  51. package/package.json +36 -36
  52. package/src/components/Table/ColumnSettings.tsx +3 -4
  53. package/src/components/Table/DynamicTable.stories.tsx +2 -2
  54. package/src/components/Table/DynamicTable.tsx +7 -7
  55. package/src/components/Table/Relations.stories.tsx +12 -9
  56. package/src/components/Table/Table.stories.tsx +34 -25
  57. package/src/components/Table/Table.tsx +53 -57
  58. package/src/components/TableCellEditor/CellValidationMessage.tsx +4 -4
  59. package/src/components/TableCellEditor/FormCellEditor.tsx +11 -5
  60. package/src/components/TableCellEditor/TableCellEditor.stories.tsx +3 -2
  61. package/src/components/TableCellEditor/TableCellEditor.tsx +3 -3
  62. package/src/components/TableToolbar/TableToolbar.tsx +6 -6
  63. package/src/hooks/useAddRow.ts +1 -1
  64. package/src/hooks/useProjectionModel.ts +3 -3
  65. package/src/model/table-model.test.ts +4 -4
  66. package/src/model/table-model.ts +2 -1
  67. package/src/model/table-presentation.test.ts +4 -4
  68. package/src/model/table-presentation.ts +12 -11
  69. package/src/playwright/playwright.config.ts +1 -1
  70. package/src/testing/useTestTableModel.ts +2 -2
  71. package/src/types/Table.ts +9 -4
  72. package/src/util/dynamic-table.test.ts +2 -2
  73. package/src/util/dynamic-table.ts +7 -6
  74. package/src/util/query-ast.ts +3 -0
  75. package/src/util/table-buttons.ts +1 -1
  76. package/src/util/table-controls.ts +2 -2
  77. package/dist/lib/browser/chunk-GTGYBRJA.mjs.map +0 -7
  78. package/dist/lib/browser/chunk-OZBLY7XM.mjs.map +0 -7
  79. package/dist/lib/node-esm/chunk-DPNSZHU5.mjs.map +0 -7
  80. package/dist/lib/node-esm/chunk-WNZSKIRF.mjs.map +0 -7
@@ -17,10 +17,10 @@ import {
17
17
  useAddRow,
18
18
  useProjectionModel,
19
19
  useTableModel
20
- } from "./chunk-DPNSZHU5.mjs";
20
+ } from "./chunk-GI72MQSG.mjs";
21
21
  import {
22
22
  Table_exports
23
- } from "./chunk-WNZSKIRF.mjs";
23
+ } from "./chunk-HTZJSULI.mjs";
24
24
 
25
25
  // src/translations.ts
26
26
  var translationKey = "@dxos/react-ui-table";
@@ -55,29 +55,29 @@ var translations = [
55
55
  ];
56
56
 
57
57
  // src/components/Table/Table.tsx
58
- import { Atom as Atom2, RegistryContext, useAtomValue as useAtomValue4 } from "@effect-atom/atom-react";
58
+ import { Atom as Atom3, RegistryContext as RegistryContext2, useAtomValue as useAtomValue4 } from "@effect-atom/atom-react";
59
59
  import * as String2 from "effect/String";
60
- import React7, { forwardRef, useCallback as useCallback4, useContext, useEffect as useEffect3, useImperativeHandle, useMemo as useMemo4, useState as useState4 } from "react";
60
+ import React8, { forwardRef, useCallback as useCallback4, useContext as useContext2, useEffect as useEffect4, useImperativeHandle, useMemo as useMemo5, useState as useState4 } from "react";
61
61
  import { log } from "@dxos/log";
62
62
  import { useAttention } from "@dxos/react-ui-attention";
63
63
  import { Grid, closestCell, gridSeparatorBlockEnd, gridSeparatorInlineEnd } from "@dxos/react-ui-grid";
64
64
  import { DxEditRequest } from "@dxos/react-ui-grid";
65
- import { mx } from "@dxos/ui-theme";
65
+ import { mx, useComposableProps } from "@dxos/ui-theme";
66
66
 
67
67
  // src/util/dynamic-table.ts
68
- import { Filter, Obj, Order, Query, Ref, Type } from "@dxos/echo";
69
- import { ProjectionModel, View, createEchoChangeCallback as createEchoChangeCallback2, getSchemaFromPropertyDefinitions } from "@dxos/schema";
68
+ import { Filter, JsonSchema, Obj, Order, Query, Ref, Type } from "@dxos/echo";
69
+ import { ProjectionModel, ViewModel, createEchoChangeCallback as createEchoChangeCallback2, getSchemaFromPropertyDefinitions } from "@dxos/schema";
70
70
  var getBaseSchema = ({ schema, typename, properties, jsonSchema }) => {
71
71
  if (typename && properties) {
72
72
  const schema2 = getSchemaFromPropertyDefinitions(typename, properties);
73
73
  return {
74
74
  typename: schema2.typename,
75
- jsonSchema: Type.toJsonSchema(schema2)
75
+ jsonSchema: JsonSchema.toJsonSchema(schema2)
76
76
  };
77
77
  } else if (schema) {
78
78
  return {
79
79
  typename: Type.getTypename(schema),
80
- jsonSchema: Type.toJsonSchema(schema)
80
+ jsonSchema: JsonSchema.toJsonSchema(schema)
81
81
  };
82
82
  } else if (typename && jsonSchema) {
83
83
  return {
@@ -89,7 +89,7 @@ var getBaseSchema = ({ schema, typename, properties, jsonSchema }) => {
89
89
  }
90
90
  };
91
91
  var makeDynamicTable = ({ registry, jsonSchema, properties }) => {
92
- const view = View.make({
92
+ const view = ViewModel.make({
93
93
  query: Query.select(Filter.everything()),
94
94
  jsonSchema,
95
95
  ...properties && {
@@ -254,14 +254,14 @@ var CellValidationMessage = ({ __gridScope, validationError, variant = "error" }
254
254
  if (!editing || !validationError) {
255
255
  return null;
256
256
  }
257
- const bgClass = variant === "error" ? "bg-errorSurface" : "bg-warningSurface";
258
- const textClass = variant === "error" ? "text-errorSurfaceText" : "text-warningSurfaceText";
257
+ const bgClass = variant === "error" ? "bg-error-surface" : "bg-warning-surface";
258
+ const textClass = variant === "error" ? "text-error-surface-text" : "text-warning-surface-text";
259
259
  return /* @__PURE__ */ React.createElement("div", {
260
260
  role: "none",
261
- className: `absolute ${bgClass} ${textClass} rounded-bs-sm text-xs p-1`,
261
+ className: `absolute ${bgClass} ${textClass} rounded-h-sm text-xs p-1`,
262
262
  style: {
263
263
  ...{
264
- "--dx-gridCellWidth": `${box?.inlineSize ?? 200}px`
264
+ "--dx-grid-cell-width": `${box?.inlineSize ?? 200}px`
265
265
  },
266
266
  zIndex: 10,
267
267
  insetBlockEnd: `calc(100% - ${box.insetBlockStart}px)`,
@@ -347,9 +347,13 @@ var FormCellEditor = ({ __gridScope, schema, model, fieldProjection, onSave, onC
347
347
  model,
348
348
  contextEditing
349
349
  ]);
350
- const formValues = useMemo(() => originalRow ? JSON.parse(JSON.stringify(originalRow)) : {}, [
350
+ const initialFormValues = useMemo(() => originalRow ? JSON.parse(JSON.stringify(originalRow)) : {}, [
351
351
  originalRow
352
352
  ]);
353
+ const [formValues, setFormValues] = useState(initialFormValues);
354
+ const handleValuesChanged = useCallback((values) => {
355
+ setFormValues(values);
356
+ }, []);
353
357
  const handleOpenChange = useCallback((nextOpen) => {
354
358
  if (nextOpen === false) {
355
359
  setEditing(null);
@@ -434,12 +438,14 @@ var FormCellEditor = ({ __gridScope, schema, model, fieldProjection, onSave, onC
434
438
  virtualRef: anchorRef
435
439
  }), /* @__PURE__ */ React2.createElement(Popover.Portal, null, /* @__PURE__ */ React2.createElement(Popover.Content, {
436
440
  tabIndex: -1,
437
- classNames: "popover-card-width density-fine"
441
+ classNames: "dx-card-popover-width dx-density-fine"
438
442
  }, /* @__PURE__ */ React2.createElement(Popover.Arrow, null), /* @__PURE__ */ React2.createElement(Popover.Viewport, null, /* @__PURE__ */ React2.createElement(Form.Root, {
439
443
  ...formProps,
440
444
  autoFocus: true,
441
445
  schema: narrowedSchema,
442
446
  values: formValues,
447
+ onValuesChanged: handleValuesChanged,
448
+ projection: model?.projection,
443
449
  createInitialValuePath: fieldProjection.field.referencePath,
444
450
  createOptionIcon: "ph--plus--regular",
445
451
  createOptionLabel,
@@ -454,7 +460,7 @@ var FormCellEditor = ({ __gridScope, schema, model, fieldProjection, onSave, onC
454
460
  var __dxlog_file2 = "/__w/dxos/dxos/packages/ui/react-ui-table/src/components/TableCellEditor/TableCellEditor.tsx";
455
461
  var editorSlots = {
456
462
  scroll: {
457
- className: "!plb-[--dx-grid-cell-editor-padding-block]"
463
+ className: "!py-(--dx-grid-cell-editor-padding-block)"
458
464
  }
459
465
  };
460
466
  var TableValueEditor = ({ __gridScope, schema, model, modals, onFocus, onSave, onCreate }) => {
@@ -683,9 +689,98 @@ var determineNavigationDelta = ({ key, shift }) => {
683
689
  return shift ? -1 : 1;
684
690
  };
685
691
 
692
+ // src/components/TableToolbar/TableToolbar.tsx
693
+ import { Atom as Atom2, RegistryContext } from "@effect-atom/atom-react";
694
+ import React4, { useContext, useEffect as useEffect2, useMemo as useMemo3 } from "react";
695
+ import { Menu, createGapSeparator, createMenuAction, useMenuActions } from "@dxos/react-ui-menu";
696
+ var createTableToolbarActions = ({ stateAtom, onAdd, onSave, customActions }) => Atom2.make((get) => {
697
+ const nodes = [];
698
+ if (onAdd) {
699
+ const add = createMenuAction("add-row", onAdd, {
700
+ type: "add-row",
701
+ icon: "ph--plus--regular",
702
+ label: [
703
+ "add row label",
704
+ {
705
+ ns: translationKey
706
+ }
707
+ ],
708
+ testId: "table.toolbar.add-row"
709
+ });
710
+ nodes.push(add);
711
+ }
712
+ if (onSave) {
713
+ const state = get(stateAtom);
714
+ const save = createMenuAction("save-view", onSave, {
715
+ type: "save-view",
716
+ icon: "ph--floppy-disk--regular",
717
+ label: [
718
+ "save view label",
719
+ {
720
+ ns: translationKey
721
+ }
722
+ ],
723
+ testId: "table.toolbar.save-view",
724
+ iconOnly: false,
725
+ hidden: !state.viewDirty
726
+ });
727
+ nodes.push(save);
728
+ }
729
+ const gap = createGapSeparator();
730
+ nodes.push(...gap.nodes);
731
+ const edges = nodes.map(({ id: target }) => ({
732
+ source: "root",
733
+ target,
734
+ relation: "child"
735
+ }));
736
+ if (customActions) {
737
+ const custom = get(customActions);
738
+ nodes.push(...custom.nodes);
739
+ edges.push(...custom.edges);
740
+ }
741
+ return {
742
+ nodes,
743
+ edges
744
+ };
745
+ });
746
+ var TableToolbar = ({ classNames, viewDirty, attendableId, onAdd, onSave, customActions, ...props }) => {
747
+ const registry = useContext(RegistryContext);
748
+ const stateAtom = useMemo3(() => Atom2.make({
749
+ viewDirty
750
+ }), []);
751
+ useEffect2(() => {
752
+ registry.set(stateAtom, {
753
+ viewDirty
754
+ });
755
+ }, [
756
+ registry,
757
+ stateAtom,
758
+ viewDirty
759
+ ]);
760
+ const actionsCreator = useMemo3(() => createTableToolbarActions({
761
+ stateAtom,
762
+ onAdd,
763
+ onSave,
764
+ customActions
765
+ }), [
766
+ stateAtom,
767
+ onAdd,
768
+ onSave,
769
+ customActions
770
+ ]);
771
+ const menu = useMenuActions(actionsCreator);
772
+ return /* @__PURE__ */ React4.createElement(Menu.Root, {
773
+ ...menu,
774
+ attendableId
775
+ }, /* @__PURE__ */ React4.createElement(Menu.Toolbar, {
776
+ ...props,
777
+ classNames
778
+ }));
779
+ };
780
+
686
781
  // src/components/Table/ColumnActionsMenu.tsx
687
782
  import { useAtomValue } from "@effect-atom/atom-react";
688
- import React4 from "react";
783
+ import React5 from "react";
689
784
  import { DropdownMenu, useTranslation } from "@dxos/react-ui";
690
785
  var ColumnActionsMenu = ({ model, modals }) => {
691
786
  const { t } = useTranslation(translationKey);
@@ -695,39 +790,39 @@ var ColumnActionsMenu = ({ model, modals }) => {
695
790
  }
696
791
  const currentSort = model.getSorting();
697
792
  const isCurrentColumnSorted = currentSort?.fieldId === state.fieldId;
698
- return /* @__PURE__ */ React4.createElement(DropdownMenu.Root, {
793
+ return /* @__PURE__ */ React5.createElement(DropdownMenu.Root, {
699
794
  modal: false,
700
795
  open: true,
701
796
  onOpenChange: modals.close
702
- }, /* @__PURE__ */ React4.createElement(DropdownMenu.VirtualTrigger, {
797
+ }, /* @__PURE__ */ React5.createElement(DropdownMenu.VirtualTrigger, {
703
798
  virtualRef: modals.trigger
704
- }), /* @__PURE__ */ React4.createElement(DropdownMenu.Portal, null, /* @__PURE__ */ React4.createElement(DropdownMenu.Content, null, /* @__PURE__ */ React4.createElement(DropdownMenu.Viewport, null, (!isCurrentColumnSorted || currentSort?.direction === "asc") && /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
799
+ }), /* @__PURE__ */ React5.createElement(DropdownMenu.Portal, null, /* @__PURE__ */ React5.createElement(DropdownMenu.Content, null, /* @__PURE__ */ React5.createElement(DropdownMenu.Viewport, null, (!isCurrentColumnSorted || currentSort?.direction === "asc") && /* @__PURE__ */ React5.createElement(DropdownMenu.Item, {
705
800
  "data-testid": "column-sort-descending",
706
801
  onClick: () => model.setSort(state.fieldId, "desc")
707
- }, t("column action sort descending")), (!isCurrentColumnSorted || currentSort?.direction === "desc") && /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
802
+ }, t("column action sort descending")), (!isCurrentColumnSorted || currentSort?.direction === "desc") && /* @__PURE__ */ React5.createElement(DropdownMenu.Item, {
708
803
  "data-testid": "column-sort-ascending",
709
804
  onClick: () => model.setSort(state.fieldId, "asc")
710
- }, t("column action sort ascending")), isCurrentColumnSorted && /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
805
+ }, t("column action sort ascending")), isCurrentColumnSorted && /* @__PURE__ */ React5.createElement(DropdownMenu.Item, {
711
806
  "data-testid": "column-clear-sort",
712
807
  onClick: () => model.clearSort()
713
- }, t("column action clear sorting")), model.getColumnCount() > 1 && model.features.schemaEditable && /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
808
+ }, t("column action clear sorting")), model.getColumnCount() > 1 && model.features.schemaEditable && /* @__PURE__ */ React5.createElement(DropdownMenu.Item, {
714
809
  "data-testid": "column-delete",
715
810
  onClick: () => model.deleteColumn(state.fieldId)
716
- }, t("column action delete")), model.features.schemaEditable && /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
811
+ }, t("column action delete")), model.features.schemaEditable && /* @__PURE__ */ React5.createElement(DropdownMenu.Item, {
717
812
  "data-testid": "column-settings",
718
813
  onClick: () => modals.openColumnSettings()
719
- }, t("column action settings"))), /* @__PURE__ */ React4.createElement(DropdownMenu.Arrow, null))));
814
+ }, t("column action settings"))), /* @__PURE__ */ React5.createElement(DropdownMenu.Arrow, null))));
720
815
  };
721
816
 
722
817
  // src/components/Table/ColumnSettings.tsx
723
818
  import { useAtomValue as useAtomValue2 } from "@effect-atom/atom-react";
724
- import React5, { useCallback as useCallback3, useEffect as useEffect2, useMemo as useMemo3, useState as useState3 } from "react";
819
+ import React6, { useCallback as useCallback3, useEffect as useEffect3, useMemo as useMemo4, useState as useState3 } from "react";
725
820
  import { Popover as Popover2 } from "@dxos/react-ui";
726
821
  import { FieldEditor } from "@dxos/react-ui-form";
727
822
  var ColumnSettings = ({ registry, model, modals, onNewColumn }) => {
728
823
  const [newField, setNewField] = useState3();
729
824
  const state = useAtomValue2(modals.state);
730
- useEffect2(() => {
825
+ useEffect3(() => {
731
826
  if (state?.type === "columnSettings" && state.mode.type === "create" && model?.projection) {
732
827
  setNewField(model.projection.createFieldProjection());
733
828
  requestAnimationFrame(() => {
@@ -740,7 +835,7 @@ var ColumnSettings = ({ registry, model, modals, onNewColumn }) => {
740
835
  model?.projection,
741
836
  state
742
837
  ]);
743
- const existingField = useMemo3(() => {
838
+ const existingField = useMemo4(() => {
744
839
  if (state?.type === "columnSettings") {
745
840
  const { mode } = state;
746
841
  if (mode.type === "edit") {
@@ -770,25 +865,25 @@ var ColumnSettings = ({ registry, model, modals, onNewColumn }) => {
770
865
  if (!model?.projection || !field) {
771
866
  return null;
772
867
  }
773
- return /* @__PURE__ */ React5.createElement(Popover2.Root, {
868
+ return /* @__PURE__ */ React6.createElement(Popover2.Root, {
774
869
  modal: false,
775
870
  open: state?.type === "columnSettings"
776
- }, /* @__PURE__ */ React5.createElement(Popover2.VirtualTrigger, {
871
+ }, /* @__PURE__ */ React6.createElement(Popover2.VirtualTrigger, {
777
872
  virtualRef: modals.trigger
778
- }), /* @__PURE__ */ React5.createElement(Popover2.Portal, null, /* @__PURE__ */ React5.createElement(Popover2.Content, {
779
- classNames: "md:is-64"
780
- }, /* @__PURE__ */ React5.createElement(Popover2.Viewport, null, /* @__PURE__ */ React5.createElement(FieldEditor, {
873
+ }), /* @__PURE__ */ React6.createElement(Popover2.Portal, null, /* @__PURE__ */ React6.createElement(Popover2.Content, {
874
+ classNames: "md:w-64"
875
+ }, /* @__PURE__ */ React6.createElement(Popover2.Viewport, null, /* @__PURE__ */ React6.createElement(FieldEditor, {
781
876
  projection: model.projection,
782
877
  field,
783
878
  registry,
784
879
  onSave: handleSave,
785
880
  onCancel: handleCancel
786
- })), /* @__PURE__ */ React5.createElement(Popover2.Arrow, null))));
881
+ })), /* @__PURE__ */ React6.createElement(Popover2.Arrow, null))));
787
882
  };
788
883
 
789
884
  // src/components/Table/RowActionsMenu.tsx
790
885
  import { useAtomValue as useAtomValue3 } from "@effect-atom/atom-react";
791
- import React6 from "react";
886
+ import React7 from "react";
792
887
  import { DropdownMenu as DropdownMenu2, toLocalizedString, useTranslation as useTranslation2 } from "@dxos/react-ui";
793
888
  var RowActionsMenu = ({ model, modals }) => {
794
889
  const { t } = useTranslation2(translationKey);
@@ -797,23 +892,23 @@ var RowActionsMenu = ({ model, modals }) => {
797
892
  if (state?.type !== "row") {
798
893
  return null;
799
894
  }
800
- return /* @__PURE__ */ React6.createElement(DropdownMenu2.Root, {
895
+ return /* @__PURE__ */ React7.createElement(DropdownMenu2.Root, {
801
896
  modal: false,
802
897
  open: true,
803
898
  onOpenChange: modals.close
804
- }, /* @__PURE__ */ React6.createElement(DropdownMenu2.VirtualTrigger, {
899
+ }, /* @__PURE__ */ React7.createElement(DropdownMenu2.VirtualTrigger, {
805
900
  virtualRef: modals.trigger
806
- }), /* @__PURE__ */ React6.createElement(DropdownMenu2.Content, null, /* @__PURE__ */ React6.createElement(DropdownMenu2.Viewport, null, model.rowActions?.length > 0 && /* @__PURE__ */ React6.createElement(React6.Fragment, null, /* @__PURE__ */ React6.createElement(DropdownMenu2.Group, null, model.rowActions?.map((action) => /* @__PURE__ */ React6.createElement(DropdownMenu2.Item, {
901
+ }), /* @__PURE__ */ React7.createElement(DropdownMenu2.Content, null, /* @__PURE__ */ React7.createElement(DropdownMenu2.Viewport, null, model.rowActions?.length > 0 && /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement(DropdownMenu2.Group, null, model.rowActions?.map((action) => /* @__PURE__ */ React7.createElement(DropdownMenu2.Item, {
807
902
  key: action.id,
808
903
  "data-testid": `row-action-${action.id}`,
809
904
  onClick: () => {
810
905
  modals.close();
811
906
  model.handleRowAction(action.id, state.rowIndex);
812
907
  }
813
- }, toLocalizedString(action.label, t)))), /* @__PURE__ */ React6.createElement(DropdownMenu2.Separator, null)), model.features.dataEditable !== false && /* @__PURE__ */ React6.createElement(DropdownMenu2.Item, {
908
+ }, toLocalizedString(action.label, t)))), /* @__PURE__ */ React7.createElement(DropdownMenu2.Separator, null)), model.features.dataEditable !== false && /* @__PURE__ */ React7.createElement(DropdownMenu2.Item, {
814
909
  "data-testid": "row-menu-delete",
815
910
  onClick: () => model.deleteRow(state.rowIndex)
816
- }, t(hasSelection ? "bulk delete row label" : "delete row label"))), /* @__PURE__ */ React6.createElement(DropdownMenu2.Arrow, null)));
911
+ }, t(hasSelection ? "bulk delete row label" : "delete row label"))), /* @__PURE__ */ React7.createElement(DropdownMenu2.Arrow, null)));
817
912
  };
818
913
 
819
914
  // src/components/Table/Table.tsx
@@ -830,29 +925,19 @@ var rowDefault = {
830
925
  focusUnfurl: false
831
926
  }
832
927
  };
833
- var emptyColumnMeta = Atom2.make({
928
+ var emptyColumnMeta = Atom3.make({
834
929
  grid: {}
835
930
  });
836
- var TableRoot = ({ children, role = "article" }) => {
837
- return /* @__PURE__ */ React7.createElement("div", {
838
- role: "none",
839
- className: mx("relative !border-separator [&_.dx-grid]:max-is-[--dx-grid-content-inline-size] [&_.dx-grid]:max-bs-[--dx-grid-content-block-size]", role === "card--popover" && "popover-card-height", role === "section" && "attention-surface", role === "card--intrinsic" && "[&_.dx-grid]:bs-[--dx-grid-content-block-size]", [
840
- "card--popover",
841
- "section",
842
- "card--extrinsic"
843
- ].includes(role) && "overflow-hidden", [
844
- "article",
845
- "slide"
846
- ].includes(role) && "flex flex-col [&_.dx-grid]:grow [&_.dx-grid]:bs-0")
847
- }, children);
931
+ var TableRoot = ({ children }) => {
932
+ return /* @__PURE__ */ React8.createElement(React8.Fragment, null, children);
848
933
  };
849
- var emptyRowsAtom = Atom2.make([]);
850
- var emptyCellUpdateAtom = Atom2.make(0);
851
- var TableMainInner = ({ schema, model, presentation, ignoreAttention, onCreate, onRowClick, testId }, forwardedRef) => {
852
- const registry = useContext(RegistryContext);
934
+ var emptyRowsAtom = Atom3.make([]);
935
+ var emptyCellUpdateAtom = Atom3.make(0);
936
+ var TableMainInner = ({ schema, model, presentation, ignoreAttention, onCreate, onRowClick, testId, ...props }, forwardedRef) => {
937
+ const registry = useContext2(RegistryContext2);
853
938
  const [dxGrid, setDxGrid] = useState4(null);
854
939
  const { hasAttention } = useAttention(model?.id ?? "table");
855
- const modals = useMemo4(() => new ModalController(registry), [
940
+ const modals = useMemo5(() => new ModalController(registry), [
856
941
  registry
857
942
  ]);
858
943
  const columnMeta = useAtomValue4(model?.columnMeta ?? emptyColumnMeta);
@@ -860,7 +945,7 @@ var TableMainInner = ({ schema, model, presentation, ignoreAttention, onCreate,
860
945
  const cellUpdateCounter = useAtomValue4(model?.cellUpdate ?? emptyCellUpdateAtom);
861
946
  const columnCount = Object.keys(columnMeta.grid).length || model?.projection.getFields().length || 0;
862
947
  const draftRowCount = model?.getDraftRowCount() ?? 0;
863
- const frozen = useMemo4(() => {
948
+ const frozen = useMemo5(() => {
864
949
  const noActionColumn = model?.features.dataEditable === false && model?.features.schemaEditable === false && model.rowActions.length === 0;
865
950
  return {
866
951
  frozenRowsStart: 1,
@@ -875,7 +960,7 @@ var TableMainInner = ({ schema, model, presentation, ignoreAttention, onCreate,
875
960
  const getCells = useCallback4((range, plane) => presentation?.getCells(range, plane) ?? {}, [
876
961
  presentation
877
962
  ]);
878
- useEffect3(() => {
963
+ useEffect4(() => {
879
964
  if (!dxGrid || !presentation) {
880
965
  return;
881
966
  }
@@ -885,7 +970,7 @@ var TableMainInner = ({ schema, model, presentation, ignoreAttention, onCreate,
885
970
  presentation,
886
971
  getCells
887
972
  ]);
888
- useEffect3(() => {
973
+ useEffect4(() => {
889
974
  if (!dxGrid) {
890
975
  return;
891
976
  }
@@ -1058,7 +1143,7 @@ var TableMainInner = ({ schema, model, presentation, ignoreAttention, onCreate,
1058
1143
  } catch (error) {
1059
1144
  log.catch(error, void 0, {
1060
1145
  F: __dxlog_file3,
1061
- L: 322,
1146
+ L: 310,
1062
1147
  S: void 0,
1063
1148
  C: (f, a) => f(...a)
1064
1149
  });
@@ -1157,22 +1242,27 @@ var TableMainInner = ({ schema, model, presentation, ignoreAttention, onCreate,
1157
1242
  presentation
1158
1243
  ]);
1159
1244
  if (!model || !modals) {
1160
- return /* @__PURE__ */ React7.createElement("span", {
1245
+ return /* @__PURE__ */ React8.createElement("span", {
1161
1246
  role: "none",
1162
- className: "attention-surface"
1247
+ className: "dx-attention-surface"
1163
1248
  });
1164
1249
  }
1165
- return /* @__PURE__ */ React7.createElement(Grid.Root, {
1250
+ const { className, ...rest } = useComposableProps(props);
1251
+ return /* @__PURE__ */ React8.createElement("div", {
1252
+ ...rest,
1253
+ role: "none",
1254
+ className: mx("dx-container relative", className)
1255
+ }, /* @__PURE__ */ React8.createElement(Grid.Root, {
1166
1256
  id: model.id ?? "table-grid"
1167
- }, /* @__PURE__ */ React7.createElement(TableValueEditor, {
1257
+ }, /* @__PURE__ */ React8.createElement(TableValueEditor, {
1168
1258
  model,
1169
1259
  modals,
1170
1260
  schema,
1171
1261
  onFocus: handleFocus,
1172
1262
  onSave: handleSave,
1173
1263
  onCreate
1174
- }), /* @__PURE__ */ React7.createElement(Grid.Content, {
1175
- className: mx("[--dx-grid-base:var(--baseSurface)]", gridSeparatorInlineEnd, gridSeparatorBlockEnd),
1264
+ }), /* @__PURE__ */ React8.createElement(Grid.Content, {
1265
+ className: mx("[--dx-grid-base:var(--base-surface)]", gridSeparatorInlineEnd, gridSeparatorBlockEnd),
1176
1266
  frozen,
1177
1267
  columns: columnMeta,
1178
1268
  columnDefault,
@@ -1188,44 +1278,45 @@ var TableMainInner = ({ schema, model, presentation, ignoreAttention, onCreate,
1188
1278
  "data-testid": testId
1189
1279
  },
1190
1280
  ref: setDxGrid
1191
- }), /* @__PURE__ */ React7.createElement(RowActionsMenu, {
1281
+ }), /* @__PURE__ */ React8.createElement(RowActionsMenu, {
1192
1282
  model,
1193
1283
  modals
1194
- }), /* @__PURE__ */ React7.createElement(ColumnActionsMenu, {
1284
+ }), /* @__PURE__ */ React8.createElement(ColumnActionsMenu, {
1195
1285
  model,
1196
1286
  modals
1197
- }), /* @__PURE__ */ React7.createElement(ColumnSettings, {
1287
+ }), /* @__PURE__ */ React8.createElement(ColumnSettings, {
1198
1288
  model,
1199
1289
  modals,
1200
1290
  onNewColumn: handleNewColumn
1201
- }));
1291
+ })));
1202
1292
  };
1203
1293
  var TableMain = /* @__PURE__ */ forwardRef(TableMainInner);
1204
1294
  var Table = {
1205
1295
  Root: TableRoot,
1206
- Main: TableMain
1296
+ Main: TableMain,
1297
+ Toolbar: TableToolbar
1207
1298
  };
1208
1299
 
1209
1300
  // src/components/Table/DynamicTable.tsx
1210
- import { RegistryContext as RegistryContext2 } from "@effect-atom/atom-react";
1211
- import React8, { useCallback as useCallback5, useContext as useContext2, useEffect as useEffect4, useMemo as useMemo5, useRef as useRef3, useState as useState5 } from "react";
1301
+ import { RegistryContext as RegistryContext3 } from "@effect-atom/atom-react";
1302
+ import React9, { useCallback as useCallback5, useContext as useContext3, useEffect as useEffect5, useMemo as useMemo6, useRef as useRef3, useState as useState5 } from "react";
1212
1303
  import { useDefaultValue } from "@dxos/react-ui";
1213
1304
  import { mx as mx2 } from "@dxos/ui-theme";
1214
- var DynamicTable = ({ classNames, schema, name = "example.com/dynamic-table", rows, properties, jsonSchema: _jsonSchema, rowActions, onRowClick, onRowAction, ...props }) => {
1215
- const registry = useContext2(RegistryContext2);
1305
+ var DynamicTable = ({ classNames, schema, name = "example.com/dynamic-table", rows, properties, jsonSchema: jsonSchemaProp, rowActions, onRowClick, onRowAction, ...props }) => {
1306
+ const registry = useContext3(RegistryContext3);
1216
1307
  const [dynamicTable, setDynamicTable] = useState5();
1217
- const { jsonSchema } = useMemo5(() => getBaseSchema({
1308
+ const { jsonSchema } = useMemo6(() => getBaseSchema({
1218
1309
  typename: name,
1219
1310
  properties,
1220
- jsonSchema: _jsonSchema,
1311
+ jsonSchema: jsonSchemaProp,
1221
1312
  schema
1222
1313
  }), [
1223
1314
  name,
1224
1315
  properties,
1225
- _jsonSchema,
1316
+ jsonSchemaProp,
1226
1317
  schema
1227
1318
  ]);
1228
- useEffect4(() => {
1319
+ useEffect5(() => {
1229
1320
  setDynamicTable(makeDynamicTable({
1230
1321
  registry,
1231
1322
  jsonSchema,
@@ -1259,7 +1350,7 @@ var DynamicTable = ({ classNames, schema, name = "example.com/dynamic-table", ro
1259
1350
  onRowOrderChange: handleRowOrderChange,
1260
1351
  onRowAction
1261
1352
  });
1262
- const presentation = useMemo5(() => {
1353
+ const presentation = useMemo6(() => {
1263
1354
  if (model) {
1264
1355
  return new TablePresentation(registry, model);
1265
1356
  }
@@ -1267,13 +1358,13 @@ var DynamicTable = ({ classNames, schema, name = "example.com/dynamic-table", ro
1267
1358
  registry,
1268
1359
  model
1269
1360
  ]);
1270
- return /* @__PURE__ */ React8.createElement("div", {
1361
+ return /* @__PURE__ */ React9.createElement("div", {
1271
1362
  role: "none",
1272
- className: mx2("is-full bs-full grow grid", classNames)
1273
- }, /* @__PURE__ */ React8.createElement("div", {
1363
+ className: mx2("w-full h-full grow grid", classNames)
1364
+ }, /* @__PURE__ */ React9.createElement("div", {
1274
1365
  role: "none",
1275
- className: "grid min-bs-0 overflow-hidden"
1276
- }, /* @__PURE__ */ React8.createElement(Table.Root, null, /* @__PURE__ */ React8.createElement(Table.Main, {
1366
+ className: "grid min-h-0 overflow-hidden"
1367
+ }, /* @__PURE__ */ React9.createElement(Table.Root, null, /* @__PURE__ */ React9.createElement(Table.Main, {
1277
1368
  ref: tableRef,
1278
1369
  model,
1279
1370
  presentation,
@@ -1281,93 +1372,6 @@ var DynamicTable = ({ classNames, schema, name = "example.com/dynamic-table", ro
1281
1372
  onRowClick
1282
1373
  }))));
1283
1374
  };
1284
-
1285
- // src/components/TableToolbar/TableToolbar.tsx
1286
- import { Atom as Atom3, RegistryContext as RegistryContext3 } from "@effect-atom/atom-react";
1287
- import React9, { useContext as useContext3, useEffect as useEffect5, useMemo as useMemo6 } from "react";
1288
- import { MenuProvider, ToolbarMenu, createGapSeparator, createMenuAction, useMenuActions } from "@dxos/react-ui-menu";
1289
- var createTableToolbarActions = ({ stateAtom, onAdd, onSave, customActions }) => Atom3.make((get) => {
1290
- const nodes = [];
1291
- if (onAdd) {
1292
- const add = createMenuAction("add-row", onAdd, {
1293
- type: "add-row",
1294
- icon: "ph--plus--regular",
1295
- label: [
1296
- "add row label",
1297
- {
1298
- ns: translationKey
1299
- }
1300
- ],
1301
- testId: "table.toolbar.add-row"
1302
- });
1303
- nodes.push(add);
1304
- }
1305
- if (onSave) {
1306
- const state = get(stateAtom);
1307
- const save = createMenuAction("save-view", onSave, {
1308
- type: "save-view",
1309
- icon: "ph--floppy-disk--regular",
1310
- label: [
1311
- "save view label",
1312
- {
1313
- ns: translationKey
1314
- }
1315
- ],
1316
- testId: "table.toolbar.save-view",
1317
- iconOnly: false,
1318
- hidden: !state.viewDirty
1319
- });
1320
- nodes.push(save);
1321
- }
1322
- const gap = createGapSeparator();
1323
- nodes.push(...gap.nodes);
1324
- const edges = nodes.map(({ id: target }) => ({
1325
- source: "root",
1326
- target
1327
- }));
1328
- if (customActions) {
1329
- const custom = get(customActions);
1330
- nodes.push(...custom.nodes);
1331
- edges.push(...custom.edges);
1332
- }
1333
- return {
1334
- nodes,
1335
- edges
1336
- };
1337
- });
1338
- var TableToolbar = ({ classNames, viewDirty, attendableId, onAdd, onSave, customActions }) => {
1339
- const registry = useContext3(RegistryContext3);
1340
- const stateAtom = useMemo6(() => Atom3.make({
1341
- viewDirty
1342
- }), []);
1343
- useEffect5(() => {
1344
- registry.set(stateAtom, {
1345
- viewDirty
1346
- });
1347
- }, [
1348
- registry,
1349
- stateAtom,
1350
- viewDirty
1351
- ]);
1352
- const actionsCreator = useMemo6(() => createTableToolbarActions({
1353
- stateAtom,
1354
- onAdd,
1355
- onSave,
1356
- customActions
1357
- }), [
1358
- stateAtom,
1359
- onAdd,
1360
- onSave,
1361
- customActions
1362
- ]);
1363
- const menu = useMenuActions(actionsCreator);
1364
- return /* @__PURE__ */ React9.createElement(MenuProvider, {
1365
- ...menu,
1366
- attendableId
1367
- }, /* @__PURE__ */ React9.createElement(ToolbarMenu, {
1368
- classNames
1369
- }));
1370
- };
1371
1375
  export {
1372
1376
  BUTTON_IDENTIFIERS,
1373
1377
  CONTROL_IDENTIFIERS,