@powerhousedao/design-system 6.2.3-dev.61 → 6.2.3-dev.62

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 (144) hide show
  1. package/dist/PinFilled-cSbUqZCA.js +41 -0
  2. package/dist/PinFilled-cSbUqZCA.js.map +1 -0
  3. package/dist/add-local-drive-form.impl-B5rVul7f.js +75 -0
  4. package/dist/add-local-drive-form.impl-B5rVul7f.js.map +1 -0
  5. package/dist/add-remote-drive-form.impl-D7zuqHJC.js +114 -0
  6. package/dist/add-remote-drive-form.impl-D7zuqHJC.js.map +1 -0
  7. package/dist/address-DsZy0bjk.js +92 -0
  8. package/dist/address-DsZy0bjk.js.map +1 -0
  9. package/dist/{checkbox-BmTXBcCE.d.ts → checkbox-DmRYkN10.d.ts} +2 -2
  10. package/dist/{checkbox-BmTXBcCE.d.ts.map → checkbox-DmRYkN10.d.ts.map} +1 -1
  11. package/dist/combobox.impl-C2oszOl2.js +144 -0
  12. package/dist/combobox.impl-C2oszOl2.js.map +1 -0
  13. package/dist/connect/components/toast/toast.js +2 -2
  14. package/dist/connect/index.d.ts +81 -33
  15. package/dist/connect/index.d.ts.map +1 -1
  16. package/dist/connect/index.js +184 -1608
  17. package/dist/connect/index.js.map +1 -1
  18. package/dist/{content-BMXLcwWY.d.ts → content-L3OINRSY.d.ts} +2 -2
  19. package/dist/{content-BMXLcwWY.d.ts.map → content-L3OINRSY.d.ts.map} +1 -1
  20. package/dist/default-editor.impl-a6EOuEme.js +30 -0
  21. package/dist/default-editor.impl-a6EOuEme.js.map +1 -0
  22. package/dist/document-timeline.impl-DRmIHFaI.js +254 -0
  23. package/dist/document-timeline.impl-DRmIHFaI.js.map +1 -0
  24. package/dist/drive-settings-form.impl-4yBGaTxe.js +171 -0
  25. package/dist/drive-settings-form.impl-4yBGaTxe.js.map +1 -0
  26. package/dist/{enum-field-qgV9wsyI.d.ts → enum-field-CSeQE4Ss.d.ts} +3 -3
  27. package/dist/{enum-field-qgV9wsyI.d.ts.map → enum-field-CSeQE4Ss.d.ts.map} +1 -1
  28. package/dist/formatted-json-viewer.impl-C198BZt5.js +58 -0
  29. package/dist/formatted-json-viewer.impl-C198BZt5.js.map +1 -0
  30. package/dist/icon-CR_tC1gc.js +358 -0
  31. package/dist/icon-CR_tC1gc.js.map +1 -0
  32. package/dist/{icon-01W_S_9A.js → icon-components-BZ_bQZmJ.js} +5 -479
  33. package/dist/icon-components-BZ_bQZmJ.js.map +1 -0
  34. package/dist/{id-autocomplete-CHvGhffo.d.ts → id-autocomplete-0bhU6VQG.d.ts} +2 -2
  35. package/dist/id-autocomplete-0bhU6VQG.d.ts.map +1 -0
  36. package/dist/{id-autocomplete-input-container-BqRQGpcs.d.ts → id-autocomplete-input-container-xg9lrpSK.d.ts} +2 -2
  37. package/dist/{id-autocomplete-input-container-BqRQGpcs.d.ts.map → id-autocomplete-input-container-xg9lrpSK.d.ts.map} +1 -1
  38. package/dist/{id-autocomplete-list-ChQsiJDg.d.ts → id-autocomplete-list-Da3FbpJ1.d.ts} +2 -2
  39. package/dist/{id-autocomplete-list-ChQsiJDg.d.ts.map → id-autocomplete-list-Da3FbpJ1.d.ts.map} +1 -1
  40. package/dist/{id-autocomplete-list-option-MsqKeLXD.d.ts → id-autocomplete-list-option-D7JgEK6E.d.ts} +3 -2
  41. package/dist/id-autocomplete-list-option-D7JgEK6E.d.ts.map +1 -0
  42. package/dist/index-C-Tup7Br.d.ts +4 -0
  43. package/dist/{index-C05uhexJ.d.ts → index-D99twPFI.d.ts} +6 -15
  44. package/dist/index-D99twPFI.d.ts.map +1 -0
  45. package/dist/index-D9nAoDks.d.ts +30 -0
  46. package/dist/index-FfMAMBu7.d.ts +3 -0
  47. package/dist/index-jfVVOU-H.d.ts +2 -0
  48. package/dist/index.d.ts +2 -1
  49. package/dist/index.js +2 -2
  50. package/dist/label-nH2HoKfI.js +15 -0
  51. package/dist/label-nH2HoKfI.js.map +1 -0
  52. package/dist/location-info-C3YbSsV0.js +47 -0
  53. package/dist/location-info-C3YbSsV0.js.map +1 -0
  54. package/dist/{radio-group-field-CjX_Zt0C.d.ts → radio-group-field-Bsf4waat.d.ts} +2 -2
  55. package/dist/{radio-group-field-CjX_Zt0C.d.ts.map → radio-group-field-Bsf4waat.d.ts.map} +1 -1
  56. package/dist/revision-history.impl-uogo6xDI.js +638 -0
  57. package/dist/revision-history.impl-uogo6xDI.js.map +1 -0
  58. package/dist/{select-field-BuXjM43L.d.ts → select-field-DbFd1YiC.d.ts} +2 -2
  59. package/dist/{select-field-BuXjM43L.d.ts.map → select-field-DbFd1YiC.d.ts.map} +1 -1
  60. package/dist/{selected-content-C49jmTLU.d.ts → selected-content-VMVPoru4.d.ts} +2 -2
  61. package/dist/{selected-content-C49jmTLU.d.ts.map → selected-content-VMVPoru4.d.ts.map} +1 -1
  62. package/dist/{sidebar-4juLhREX.d.ts → sidebar-DFqreKf1.d.ts} +2 -2
  63. package/dist/{sidebar-4juLhREX.d.ts.map → sidebar-DFqreKf1.d.ts.map} +1 -1
  64. package/dist/{sidebar-provider-CMG6WQWo.d.ts → sidebar-provider-CZHhqW5n.d.ts} +2 -2
  65. package/dist/{sidebar-provider-CMG6WQWo.d.ts.map → sidebar-provider-CZHhqW5n.d.ts.map} +1 -1
  66. package/dist/{splitted-input-diff-DBkgDh9Q.d.ts → splitted-input-diff-BKRMH7vI.d.ts} +2 -2
  67. package/dist/{splitted-input-diff-DBkgDh9Q.d.ts.map → splitted-input-diff-BKRMH7vI.d.ts.map} +1 -1
  68. package/dist/{src-CrUksCLW.js → src-B2s8MAp7.js} +148 -5
  69. package/dist/src-B2s8MAp7.js.map +1 -0
  70. package/dist/{text-field-3j4fLJ-7.d.ts → text-field-CtatgqNu.d.ts} +3 -3
  71. package/dist/{text-field-3j4fLJ-7.d.ts.map → text-field-CtatgqNu.d.ts.map} +1 -1
  72. package/dist/{text-input-tkqggbWx.d.ts → text-input-BSxhvnyx.d.ts} +2 -2
  73. package/dist/{text-input-tkqggbWx.d.ts.map → text-input-BSxhvnyx.d.ts.map} +1 -1
  74. package/dist/{text-input-diff-B7iFyzTK.d.ts → text-input-diff-CaZoFDjA.d.ts} +2 -2
  75. package/dist/{text-input-diff-B7iFyzTK.d.ts.map → text-input-diff-CaZoFDjA.d.ts.map} +1 -1
  76. package/dist/{types-DDSmPhHp.d.ts → types-FTqFl5du.d.ts} +2 -2
  77. package/dist/{types-DDSmPhHp.d.ts.map → types-FTqFl5du.d.ts.map} +1 -1
  78. package/dist/types-TZijOYrE.d.ts +17 -0
  79. package/dist/types-TZijOYrE.d.ts.map +1 -0
  80. package/dist/ui/components/checkbox/checkbox.d.ts +1 -1
  81. package/dist/ui/components/command/command.js +1 -1
  82. package/dist/ui/components/enum-field/enum-field.d.ts +1 -1
  83. package/dist/ui/components/enum-field/types.d.ts +1 -1
  84. package/dist/ui/components/form-label/form-label.js +1 -1
  85. package/dist/ui/components/id-autocomplete/id-autocomplete-input-container.d.ts +1 -1
  86. package/dist/ui/components/id-autocomplete/id-autocomplete-input-container.js +1 -1
  87. package/dist/ui/components/id-autocomplete/id-autocomplete-list-option.d.ts +1 -1
  88. package/dist/ui/components/id-autocomplete/id-autocomplete-list-option.js +1 -1
  89. package/dist/ui/components/id-autocomplete/id-autocomplete-list.d.ts +1 -1
  90. package/dist/ui/components/id-autocomplete/id-autocomplete.d.ts +1 -1
  91. package/dist/ui/components/id-autocomplete/types.d.ts +1 -1
  92. package/dist/ui/components/id-autocomplete/use-id-autocomplete.d.ts +1 -1
  93. package/dist/ui/components/index.d.ts +20 -20
  94. package/dist/ui/components/input/splitted-input-diff.d.ts +1 -1
  95. package/dist/ui/components/input/splitted-input-diff.js +1 -1
  96. package/dist/ui/components/input/subcomponent/text-diff.d.ts +1 -1
  97. package/dist/ui/components/radio-group-field/radio-group-field.d.ts +1 -1
  98. package/dist/ui/components/select-field/content.d.ts +1 -1
  99. package/dist/ui/components/select-field/content.js +1 -1
  100. package/dist/ui/components/select-field/select-field.d.ts +1 -1
  101. package/dist/ui/components/select-field/selected-content.d.ts +1 -1
  102. package/dist/ui/components/select-field/selected-content.js +1 -1
  103. package/dist/ui/components/select-field/subcomponents/CommandItemList.d.ts +1 -1
  104. package/dist/ui/components/select-field/subcomponents/CommandItemList.js +1 -1
  105. package/dist/ui/components/select-field/use-select-field.d.ts +1 -1
  106. package/dist/ui/components/sidebar/index.d.ts +4 -4
  107. package/dist/ui/components/sidebar/sidebar.d.ts +1 -1
  108. package/dist/ui/components/sidebar/sidebar.js +1 -1
  109. package/dist/ui/components/sidebar/subcomponents/sidebar-content-area.js +1 -1
  110. package/dist/ui/components/sidebar/subcomponents/sidebar-item.d.ts +1 -1
  111. package/dist/ui/components/sidebar/subcomponents/sidebar-item.js +2 -1
  112. package/dist/ui/components/sidebar/subcomponents/sidebar-item.js.map +1 -1
  113. package/dist/ui/components/sidebar/subcomponents/sidebar-provider/index.d.ts +2 -2
  114. package/dist/ui/components/sidebar/subcomponents/sidebar-provider/sidebar-provider.d.ts +1 -1
  115. package/dist/ui/components/sidebar/subcomponents/sidebar-provider/sidebar-reducer.d.ts +1 -1
  116. package/dist/ui/components/sidebar/subcomponents/sidebar-search/sidebar-search.js +1 -1
  117. package/dist/ui/components/sidebar/subcomponents/status-icon.d.ts +1 -1
  118. package/dist/ui/components/sidebar/subcomponents/status-icon.js +1 -1
  119. package/dist/ui/components/sidebar/types.d.ts +1 -1
  120. package/dist/ui/components/sidebar/utils.d.ts +1 -1
  121. package/dist/ui/components/text-field/text-field.d.ts +1 -1
  122. package/dist/ui/components/text-input/text-input-diff.d.ts +1 -1
  123. package/dist/ui/components/text-input/text-input.d.ts +1 -1
  124. package/dist/ui/components/types.d.ts +1 -1
  125. package/dist/ui/components/value-transformer/value-transformer.d.ts +1 -1
  126. package/dist/ui/components/with-field-validation/with-field-validation.d.ts +1 -1
  127. package/dist/ui/index.d.ts +21 -21
  128. package/dist/ui/types.d.ts +1 -1
  129. package/dist/{use-id-autocomplete-wdw3CfYc.d.ts → use-id-autocomplete-DSRXA4Wt.d.ts} +2 -2
  130. package/dist/{use-id-autocomplete-wdw3CfYc.d.ts.map → use-id-autocomplete-DSRXA4Wt.d.ts.map} +1 -1
  131. package/dist/{value-transformer-BAD6r8Ol.d.ts → value-transformer-Dv-10UyC.d.ts} +2 -2
  132. package/dist/{value-transformer-BAD6r8Ol.d.ts.map → value-transformer-Dv-10UyC.d.ts.map} +1 -1
  133. package/dist/{with-field-validation-Bt02MQn2.d.ts → with-field-validation-WiD_NFDk.d.ts} +2 -2
  134. package/dist/{with-field-validation-Bt02MQn2.d.ts.map → with-field-validation-WiD_NFDk.d.ts.map} +1 -1
  135. package/package.json +4 -4
  136. package/dist/icon-01W_S_9A.js.map +0 -1
  137. package/dist/id-autocomplete-CHvGhffo.d.ts.map +0 -1
  138. package/dist/id-autocomplete-list-option-MsqKeLXD.d.ts.map +0 -1
  139. package/dist/index-C05uhexJ.d.ts.map +0 -1
  140. package/dist/index-CpSqVZKp.d.ts +0 -2
  141. package/dist/index-DSknqh8u.d.ts +0 -30
  142. package/dist/index-DU-WgcAh.d.ts +0 -4
  143. package/dist/index-DaRBrjZI.d.ts +0 -3
  144. package/dist/src-CrUksCLW.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { C as SelectProps } from "./index-C05uhexJ.js";
1
+ import { C as SelectProps } from "./index-D99twPFI.js";
2
2
  import React from "react";
3
3
  //#region src/ui/components/select-field/content.d.ts
4
4
  interface ContentProps {
@@ -17,4 +17,4 @@ declare const Content: React.FC<ContentProps>;
17
17
  //#endregion
18
18
  export { Content as t };
19
19
  export {};
20
- //# sourceMappingURL=content-BMXLcwWY.d.ts.map
20
+ //# sourceMappingURL=content-L3OINRSY.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-BMXLcwWY.d.ts","names":[],"sources":["../src/ui/components/select-field/content.tsx"],"mappings":";;;UAaU;EACR;EACA,gBAAgB,MAAM,UAAU;EAChC;EACA;EACA;EACA;EACA,SAAS;EACT,kBAAkB;EAClB;EACA,eAAe;;cAGJ,SAAS,MAAM,GAAG"}
1
+ {"version":3,"file":"content-L3OINRSY.d.ts","names":[],"sources":["../src/ui/components/select-field/content.tsx"],"mappings":";;;UAaU;EACR;EACA,gBAAgB,MAAM,UAAU;EAChC;EACA;EACA;EACA;EACA,SAAS;EACT,kBAAkB;EAClB;EACA,eAAe;;cAGJ,SAAS,MAAM,GAAG"}
@@ -0,0 +1,30 @@
1
+ import { SelectFieldRaw } from "./ui/components/select-field/select-field.js";
2
+ import { twMerge } from "tailwind-merge";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/connect/components/modal/settings-modal-v2/default-editor.impl.tsx
5
+ function DefaultEditor(props) {
6
+ const { className, ...rest } = props;
7
+ return /* @__PURE__ */ jsx("div", {
8
+ className: twMerge("rounded-lg bg-background p-3", className),
9
+ children: /* @__PURE__ */ jsx(DefaultEditorSelect, { ...rest })
10
+ });
11
+ }
12
+ function DefaultEditorSelect(props) {
13
+ const { documentModelEditor, setDocumentModelEditor, documentModelEditorOptions, className } = props;
14
+ return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h3", {
15
+ className: "mb-4 font-semibold text-foreground",
16
+ children: "Default Editor Selection"
17
+ }), /* @__PURE__ */ jsx(SelectFieldRaw, {
18
+ className: twMerge("max-w-fit min-w-36", className),
19
+ name: "default-editor",
20
+ required: true,
21
+ value: documentModelEditor,
22
+ options: documentModelEditorOptions,
23
+ multiple: false,
24
+ onChange: (value) => setDocumentModelEditor(value)
25
+ })] });
26
+ }
27
+ //#endregion
28
+ export { DefaultEditor, DefaultEditorSelect };
29
+
30
+ //# sourceMappingURL=default-editor.impl-a6EOuEme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-editor.impl-a6EOuEme.js","names":["SelectFieldRaw","twMerge","DefaultEditor","props","className","rest","DefaultEditorSelect","documentModelEditor","setDocumentModelEditor","documentModelEditorOptions","value"],"sources":["../src/connect/components/modal/settings-modal-v2/default-editor.impl.tsx"],"sourcesContent":["import type { SelectOption } from \"#design-system/ui\";\nimport { SelectFieldRaw } from \"#design-system/ui\";\nimport { twMerge } from \"tailwind-merge\";\n\ntype Props = {\n documentModelEditor: string;\n setDocumentModelEditor: (value: string) => void;\n documentModelEditorOptions: SelectOption[];\n className?: string;\n};\n\nexport function DefaultEditor(props: Props) {\n const { className, ...rest } = props;\n return (\n <div className={twMerge(\"rounded-lg bg-background p-3\", className)}>\n <DefaultEditorSelect {...rest} />\n </div>\n );\n}\n\nexport function DefaultEditorSelect(props: Props) {\n const {\n documentModelEditor,\n setDocumentModelEditor,\n documentModelEditorOptions,\n className,\n } = props;\n\n return (\n <div>\n <h3 className=\"mb-4 font-semibold text-foreground\">\n Default Editor Selection\n </h3>\n <SelectFieldRaw\n className={twMerge(\"max-w-fit min-w-36\", className)}\n name=\"default-editor\"\n required\n value={documentModelEditor}\n options={documentModelEditorOptions}\n multiple={false}\n onChange={(value) => setDocumentModelEditor(value as string)}\n />\n </div>\n );\n}\n"],"mappings":";;;;AAWA,SAAgBE,cAAcC,OAAc;CAC1C,MAAM,EAAEC,WAAW,GAAGC,SAASF;CAC/B,OACE,oBAAC,OAAD;EAAK,WAAWF,QAAQ,gCAAgCG,SAAS;EAC/D,UAAA,oBAAC,qBAAD,EAAqB,GAAIC,KAAK,CAAA;CAC3B,CAAA;AAET;AAEA,SAAgBC,oBAAoBH,OAAc;CAChD,MAAM,EACJI,qBACAC,wBACAC,4BACAL,cACED;CAEJ,OACE,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,MAAD;EAAI,WAAU;EAAoC,UAAA;CAE9C,CAAA,GACJ,oBAAC,gBAAD;EACE,WAAWF,QAAQ,sBAAsBG,SAAS;EAClD,MAAK;EACL,UAAA;EACA,OAAOG;EACP,SAASE;EACT,UAAU;EACV,WAAWC,UAAUF,uBAAuBE,KAAe;CAAE,CAAA,CAE5D,EAAA,CAAA;AAET"}
@@ -0,0 +1,254 @@
1
+ import { t as Icon } from "./icon-CR_tC1gc.js";
2
+ import { ConnectTooltip, ConnectTooltipProvider } from "./connect/index.js";
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
+ import { twMerge } from "tailwind-merge";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { format, formatDistanceToNow, parseISO } from "date-fns";
7
+ //#region src/connect/components/document-timeline/components/h-divider.tsx
8
+ const HDivider = (props) => {
9
+ const { className, timestampUtcMs: timestamp, title, subtitle, onClick, isSelected = false } = props;
10
+ const [open, setOpen] = useState(false);
11
+ const hasContent = !!title || !!subtitle || !!timestamp;
12
+ useEffect(() => {
13
+ if (open) {
14
+ setOpen(false);
15
+ setTimeout(() => hasContent && setOpen(true), 50);
16
+ }
17
+ }, [
18
+ title,
19
+ subtitle,
20
+ timestamp,
21
+ hasContent
22
+ ]);
23
+ const formatTimestamp = (isoString) => {
24
+ if (!isoString) return "";
25
+ try {
26
+ return formatDistanceToNow(new Date(isoString), { addSuffix: true });
27
+ } catch {
28
+ return isoString;
29
+ }
30
+ };
31
+ const tooltipContent = /* @__PURE__ */ jsxs("div", {
32
+ className: "flex flex-col text-xs",
33
+ children: [
34
+ !!title && /* @__PURE__ */ jsx("div", { children: title }),
35
+ !!subtitle && /* @__PURE__ */ jsx("div", {
36
+ className: "text-foreground",
37
+ children: subtitle
38
+ }),
39
+ !!timestamp && /* @__PURE__ */ jsx("div", { children: formatTimestamp(timestamp) })
40
+ ]
41
+ });
42
+ const handleMouseEnter = () => {
43
+ if (hasContent) setOpen(true);
44
+ };
45
+ const handleMouseLeave = () => {
46
+ setOpen(false);
47
+ };
48
+ return /* @__PURE__ */ jsxs("div", {
49
+ className: "relative",
50
+ onMouseEnter: handleMouseEnter,
51
+ onMouseLeave: handleMouseLeave,
52
+ children: [isSelected && /* @__PURE__ */ jsx(Icon, {
53
+ name: "TimelineCaret",
54
+ color: "#4EA9FF",
55
+ size: 10,
56
+ className: "absolute top-[-11px] z-40"
57
+ }), /* @__PURE__ */ jsx(ConnectTooltip, {
58
+ className: "rounded-md bg-primary text-primary-foreground",
59
+ content: tooltipContent,
60
+ open: open && hasContent,
61
+ onOpenChange: setOpen,
62
+ delayDuration: 0,
63
+ side: "bottom",
64
+ sideOffset: 5,
65
+ children: /* @__PURE__ */ jsx("div", {
66
+ className: twMerge("mx-0.5 flex h-6.25 w-1.5 cursor-pointer flex-col items-center justify-center rounded-xs hover:hover-effect", isSelected && "bg-info/10", className),
67
+ onClick,
68
+ "data-title": title,
69
+ "data-subtitle": subtitle,
70
+ "data-timestamp": timestamp,
71
+ children: /* @__PURE__ */ jsx("div", { className: "h-0.5 w-1 rounded-full bg-muted" })
72
+ })
73
+ })]
74
+ });
75
+ };
76
+ //#endregion
77
+ //#region src/connect/components/document-timeline/components/timeline-bar.tsx
78
+ const getBarHeight = (size = 0) => {
79
+ switch (true) {
80
+ case size <= 0: return "h-[1px]";
81
+ case size === 1: return "h-[3px]";
82
+ case size === 2: return "h-[6px]";
83
+ case size === 3: return "h-[9px]";
84
+ case size >= 4: return "h-[12px]";
85
+ default: return "h-[1px]";
86
+ }
87
+ };
88
+ const formatTimestamp = (isoString) => {
89
+ if (!isoString) return "";
90
+ try {
91
+ const date = parseISO(isoString);
92
+ return format(date, "HH:mm, dd, MMMM");
93
+ } catch {
94
+ return isoString;
95
+ }
96
+ };
97
+ const TimelineBar = ({ onClick, className, timestampUtcMs: timestamp, additions, deletions, addSize = 0, delSize = 0, isSelected = false }) => {
98
+ const [open, setOpen] = useState(false);
99
+ const noChanges = addSize === 0 && delSize === 0;
100
+ const addBarHeight = getBarHeight(addSize);
101
+ const delBarHeight = getBarHeight(delSize);
102
+ const tooltipContent = /* @__PURE__ */ jsxs("div", {
103
+ className: "flex flex-col text-xs",
104
+ children: [
105
+ /* @__PURE__ */ jsx("div", { children: formatTimestamp(timestamp) }),
106
+ /* @__PURE__ */ jsx("div", {
107
+ className: "text-success",
108
+ children: `${additions} additions +`
109
+ }),
110
+ /* @__PURE__ */ jsx("div", {
111
+ className: "text-destructive",
112
+ children: `${deletions} deletions -`
113
+ })
114
+ ]
115
+ });
116
+ const handleMouseEnter = () => {
117
+ if (!noChanges) setOpen(true);
118
+ };
119
+ const handleMouseLeave = () => {
120
+ setOpen(false);
121
+ };
122
+ return /* @__PURE__ */ jsxs("div", {
123
+ className: "relative",
124
+ onMouseEnter: handleMouseEnter,
125
+ onMouseLeave: handleMouseLeave,
126
+ children: [isSelected && /* @__PURE__ */ jsx(Icon, {
127
+ name: "TimelineCaret",
128
+ color: "#4EA9FF",
129
+ size: 10,
130
+ className: "absolute top-[-11px] left-[-2px] z-40"
131
+ }), noChanges ? /* @__PURE__ */ jsx("div", {
132
+ className: twMerge("flex h-[25px] w-1.5 cursor-pointer flex-col items-center justify-center rounded-[2px] hover:hover-effect", className),
133
+ "data-timestamp": timestamp,
134
+ onClick,
135
+ children: /* @__PURE__ */ jsx("div", { className: "size-[3px] rounded-full bg-muted-foreground" })
136
+ }) : /* @__PURE__ */ jsx(ConnectTooltip, {
137
+ className: "rounded-md bg-primary text-primary-foreground",
138
+ content: tooltipContent,
139
+ open,
140
+ onOpenChange: setOpen,
141
+ delayDuration: 0,
142
+ side: "bottom",
143
+ sideOffset: 5,
144
+ children: /* @__PURE__ */ jsxs("div", {
145
+ className: twMerge("flex h-[25px] w-1.5 cursor-pointer flex-col items-center justify-center rounded-[2px] hover:hover-effect", className, isSelected && "bg-info/10"),
146
+ "data-timestamp": timestamp,
147
+ onClick,
148
+ children: [/* @__PURE__ */ jsx("div", {
149
+ className: "flex h-3 w-0.5 items-end",
150
+ children: /* @__PURE__ */ jsx("div", { className: twMerge("h-3 w-0.5 rounded-t-full bg-success", addBarHeight) })
151
+ }), /* @__PURE__ */ jsx("div", {
152
+ className: "flex h-3 w-0.5 items-start",
153
+ children: /* @__PURE__ */ jsx("div", { className: twMerge("h-3 w-0.5 rounded-b-full bg-destructive", delBarHeight) })
154
+ })]
155
+ })
156
+ })]
157
+ });
158
+ };
159
+ //#endregion
160
+ //#region src/connect/components/document-timeline/document-timeline.impl.tsx
161
+ const defaultTimeLineItem = {
162
+ id: "default",
163
+ type: "bar",
164
+ addSize: 0,
165
+ delSize: 0
166
+ };
167
+ const DocumentTimeline = (props) => {
168
+ const { timeline = [], onItemClick } = props;
169
+ const [selectedItem, setSelectedItem] = useState(null);
170
+ const scrollContainerRef = useRef(null);
171
+ const handleClick = (item) => {
172
+ if (item.id === selectedItem || item.id === defaultTimeLineItem.id) {
173
+ onItemClick?.(null);
174
+ setSelectedItem(null);
175
+ } else {
176
+ onItemClick?.(item);
177
+ setSelectedItem(item.id);
178
+ }
179
+ };
180
+ const mergedTimelineItems = [...timeline, defaultTimeLineItem];
181
+ const [unselectedItems, selectedItems] = useMemo(() => {
182
+ const indexSelected = mergedTimelineItems.findIndex((item) => item.id === selectedItem);
183
+ return indexSelected === -1 ? [mergedTimelineItems, []] : [mergedTimelineItems.slice(0, indexSelected), mergedTimelineItems.slice(indexSelected)];
184
+ }, [mergedTimelineItems, selectedItem]);
185
+ const renderTimelineItems = useCallback((items) => {
186
+ return items.map((item) => {
187
+ if (item.type === "divider") {
188
+ const { timestampUtcMs, title, subtitle } = item;
189
+ return /* @__PURE__ */ jsx(HDivider, {
190
+ timestampUtcMs,
191
+ title,
192
+ subtitle,
193
+ onClick: () => handleClick(item),
194
+ isSelected: item.id === selectedItem
195
+ }, item.id);
196
+ }
197
+ return /* @__PURE__ */ jsx(TimelineBar, {
198
+ timestampUtcMs: item.timestampUtcMs,
199
+ addSize: item.addSize,
200
+ delSize: item.delSize,
201
+ additions: item.additions,
202
+ deletions: item.deletions,
203
+ isSelected: item.id === selectedItem,
204
+ onClick: () => handleClick(item)
205
+ }, item.id);
206
+ });
207
+ }, [handleClick, selectedItem]);
208
+ const unselectedContent = useMemo(() => renderTimelineItems(unselectedItems), [unselectedItems, renderTimelineItems]);
209
+ const selectedContent = useMemo(() => renderTimelineItems(selectedItems), [selectedItems, renderTimelineItems]);
210
+ useEffect(() => {
211
+ if (scrollContainerRef.current) scrollContainerRef.current.scrollLeft = scrollContainerRef.current.scrollWidth;
212
+ }, []);
213
+ return /* @__PURE__ */ jsx(ConnectTooltipProvider, {
214
+ delayDuration: 0,
215
+ skipDelayDuration: 0,
216
+ children: /* @__PURE__ */ jsxs("div", {
217
+ className: "relative h-[36px] w-full",
218
+ children: [
219
+ /* @__PURE__ */ jsx("div", {
220
+ className: "absolute left-0 z-20 h-[17px] w-[6px] bg-background",
221
+ children: /* @__PURE__ */ jsx("div", { className: "mt-[11px] h-[6px] w-[6px] rounded-tl-md bg-background" })
222
+ }),
223
+ /* @__PURE__ */ jsx("div", {
224
+ className: "absolute top-[11px] right-0 z-20 h-[6px] w-[6px] bg-background",
225
+ children: /* @__PURE__ */ jsx("div", { className: "h-[6px] w-[6px] rounded-tr-md bg-background" })
226
+ }),
227
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-x-0 bottom-0 h-[25px] rounded-md bg-background" }),
228
+ /* @__PURE__ */ jsx("div", {
229
+ className: "absolute inset-x-0 bottom-0 h-[36px]",
230
+ children: /* @__PURE__ */ jsx("div", {
231
+ ref: scrollContainerRef,
232
+ className: "h-full overflow-x-auto rounded-md",
233
+ children: /* @__PURE__ */ jsxs("div", {
234
+ className: "ml-auto flex h-[36px] w-max items-end px-2 pb-0",
235
+ children: [/* @__PURE__ */ jsx("div", {
236
+ className: "flex",
237
+ children: unselectedContent
238
+ }), /* @__PURE__ */ jsx("div", {
239
+ className: "flex rounded-sm bg-info/10",
240
+ children: selectedContent
241
+ })]
242
+ })
243
+ })
244
+ }),
245
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute bottom-0 left-0 z-10 h-[25px] w-2 rounded-l-md bg-background" }),
246
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute right-0 bottom-0 z-10 h-[25px] w-2 rounded-r-md bg-background" })
247
+ ]
248
+ })
249
+ });
250
+ };
251
+ //#endregion
252
+ export { DocumentTimeline };
253
+
254
+ //# sourceMappingURL=document-timeline.impl-DRmIHFaI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-timeline.impl-DRmIHFaI.js","names":["Icon","formatDistanceToNow","useEffect","useState","twMerge","ConnectTooltip","HDivider","props","className","timestampUtcMs","timestamp","title","subtitle","onClick","isSelected","open","setOpen","hasContent","setTimeout","formatTimestamp","isoString","Date","addSuffix","tooltipContent","handleMouseEnter","handleMouseLeave","Icon","format","parseISO","useState","twMerge","ConnectTooltip","getBarHeight","size","formatTimestamp","isoString","date","TimelineBar","onClick","className","timestampUtcMs","timestamp","additions","deletions","addSize","delSize","isSelected","open","setOpen","noChanges","addBarHeight","delBarHeight","tooltipContent","handleMouseEnter","handleMouseLeave","useCallback","useEffect","useMemo","useRef","useState","ConnectTooltipProvider","HDivider","TimelineBar","defaultTimeLineItem","id","type","addSize","delSize","DocumentTimeline","props","timeline","onItemClick","selectedItem","setSelectedItem","scrollContainerRef","handleClick","item","mergedTimelineItems","unselectedItems","selectedItems","indexSelected","findIndex","slice","renderTimelineItems","items","map","timestampUtcMs","title","subtitle","additions","deletions","unselectedContent","selectedContent","current","scrollLeft","scrollWidth"],"sources":["../src/connect/components/document-timeline/components/h-divider.tsx","../src/connect/components/document-timeline/components/timeline-bar.tsx","../src/connect/components/document-timeline/document-timeline.impl.tsx"],"sourcesContent":["import { Icon } from \"#design-system\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport { useEffect, useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { ConnectTooltip } from \"../../tooltip/tooltip.js\";\n\nexport interface HDividerProps {\n className?: string;\n timestampUtcMs?: string;\n title?: string;\n subtitle?: string;\n onClick?: () => void;\n isSelected?: boolean;\n}\n\nexport const HDivider = (props: HDividerProps) => {\n const {\n className,\n timestampUtcMs: timestamp,\n title,\n subtitle,\n onClick,\n isSelected = false,\n } = props;\n const [open, setOpen] = useState<boolean>(false);\n const hasContent = !!title || !!subtitle || !!timestamp;\n\n // Force update tooltips when props change\n useEffect(() => {\n // Force close and re-open if already open to refresh content\n if (open) {\n // eslint-disable-next-line react-hooks-extra/set-state-in-effect\n setOpen(false);\n setTimeout(() => hasContent && setOpen(true), 50);\n }\n }, [title, subtitle, timestamp, hasContent]);\n\n const formatTimestamp = (isoString?: string) => {\n if (!isoString) return \"\";\n try {\n return formatDistanceToNow(new Date(isoString), { addSuffix: true });\n } catch {\n return isoString;\n }\n };\n\n const tooltipContent = (\n <div className=\"flex flex-col text-xs\">\n {!!title && <div>{title}</div>}\n {!!subtitle && <div className=\"text-foreground\">{subtitle}</div>}\n {!!timestamp && <div>{formatTimestamp(timestamp)}</div>}\n </div>\n );\n\n const handleMouseEnter = () => {\n if (hasContent) {\n setOpen(true);\n }\n };\n\n const handleMouseLeave = () => {\n setOpen(false);\n };\n\n return (\n <div\n className=\"relative\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {isSelected && (\n <Icon\n name=\"TimelineCaret\"\n color=\"#4EA9FF\"\n size={10}\n className=\"absolute top-[-11px] z-40\"\n />\n )}\n <ConnectTooltip\n className=\"rounded-md bg-primary text-primary-foreground\"\n content={tooltipContent}\n open={open && hasContent}\n onOpenChange={setOpen}\n delayDuration={0}\n side=\"bottom\"\n sideOffset={5}\n >\n <div\n className={twMerge(\n \"mx-0.5 flex h-6.25 w-1.5 cursor-pointer flex-col items-center justify-center rounded-xs hover:hover-effect\",\n isSelected && \"bg-info/10\",\n className,\n )}\n onClick={onClick}\n data-title={title}\n data-subtitle={subtitle}\n data-timestamp={timestamp}\n >\n <div className=\"h-0.5 w-1 rounded-full bg-muted\" />\n </div>\n </ConnectTooltip>\n </div>\n );\n};\n","import { Icon } from \"#design-system\";\nimport type { TimelineBarItem } from \"@powerhousedao/reactor-browser\";\nimport { format, parseISO } from \"date-fns\";\nimport { useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { ConnectTooltip } from \"../../tooltip/tooltip.js\";\n\nexport interface TimelineBarProps extends Omit<\n TimelineBarItem,\n \"id\" | \"type\" | \"revision\" | \"startDate\" | \"endDate\"\n> {\n readonly className?: string;\n onClick?: () => void;\n isSelected?: boolean;\n}\n\nconst getBarHeight = (size = 0) => {\n switch (true) {\n case size <= 0:\n return \"h-[1px]\";\n case size === 1:\n return \"h-[3px]\";\n case size === 2:\n return \"h-[6px]\";\n case size === 3:\n return \"h-[9px]\";\n case size >= 4:\n return \"h-[12px]\";\n default:\n return \"h-[1px]\";\n }\n};\n\nconst formatTimestamp = (isoString?: string) => {\n if (!isoString) return \"\";\n try {\n const date = parseISO(isoString);\n return format(date, \"HH:mm, dd, MMMM\");\n } catch {\n return isoString;\n }\n};\n\nexport const TimelineBar: React.FC<TimelineBarProps> = ({\n onClick,\n className,\n timestampUtcMs: timestamp,\n additions,\n deletions,\n addSize = 0,\n delSize = 0,\n isSelected = false,\n}) => {\n const [open, setOpen] = useState<boolean>(false);\n const noChanges = addSize === 0 && delSize === 0;\n\n const addBarHeight = getBarHeight(addSize);\n const delBarHeight = getBarHeight(delSize);\n\n const tooltipContent = (\n <div className=\"flex flex-col text-xs\">\n <div>{formatTimestamp(timestamp)}</div>\n <div className=\"text-success\">{`${additions} additions +`}</div>\n <div className=\"text-destructive\">{`${deletions} deletions -`}</div>\n </div>\n );\n\n const handleMouseEnter = () => {\n if (!noChanges) {\n setOpen(true);\n }\n };\n\n const handleMouseLeave = () => {\n setOpen(false);\n };\n\n return (\n <div\n className=\"relative\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {isSelected && (\n <Icon\n name=\"TimelineCaret\"\n color=\"#4EA9FF\"\n size={10}\n className=\"absolute top-[-11px] left-[-2px] z-40\"\n />\n )}\n {noChanges ? (\n <div\n className={twMerge(\n \"flex h-[25px] w-1.5 cursor-pointer flex-col items-center justify-center rounded-[2px] hover:hover-effect\",\n className,\n )}\n data-timestamp={timestamp}\n onClick={onClick}\n >\n <div className=\"size-[3px] rounded-full bg-muted-foreground\" />\n </div>\n ) : (\n <ConnectTooltip\n className=\"rounded-md bg-primary text-primary-foreground\"\n content={tooltipContent}\n open={open}\n onOpenChange={setOpen}\n delayDuration={0}\n side=\"bottom\"\n sideOffset={5}\n >\n <div\n className={twMerge(\n \"flex h-[25px] w-1.5 cursor-pointer flex-col items-center justify-center rounded-[2px] hover:hover-effect\",\n className,\n isSelected && \"bg-info/10\",\n )}\n data-timestamp={timestamp}\n onClick={onClick}\n >\n <div className=\"flex h-3 w-0.5 items-end\">\n <div\n className={twMerge(\n \"h-3 w-0.5 rounded-t-full bg-success\",\n addBarHeight,\n )}\n ></div>\n </div>\n <div className=\"flex h-3 w-0.5 items-start\">\n <div\n className={twMerge(\n \"h-3 w-0.5 rounded-b-full bg-destructive\",\n delBarHeight,\n )}\n ></div>\n </div>\n </div>\n </ConnectTooltip>\n )}\n </div>\n );\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { ConnectTooltipProvider } from \"../tooltip/tooltip.js\";\nimport { HDivider } from \"./components/h-divider.js\";\nimport { TimelineBar } from \"./components/timeline-bar.js\";\n\nexport type TimelineBarItem = {\n id: string;\n type: \"bar\";\n addSize?: 0 | 1 | 2 | 3 | 4;\n delSize?: 0 | 1 | 2 | 3 | 4;\n timestampUtcMs?: string;\n additions?: number;\n deletions?: number;\n revision?: number;\n startDate?: Date;\n endDate?: Date;\n};\n\nexport type TimelineDividerItem = {\n id: string;\n type: \"divider\";\n timestampUtcMs?: string;\n title?: string;\n subtitle?: string;\n revision?: number;\n startDate?: Date;\n endDate?: Date;\n};\n\nexport type TimelineItem = TimelineBarItem | TimelineDividerItem;\n\nexport interface DocumentTimelineProps {\n onItemClick?: (item: TimelineItem | null) => void;\n timeline?: Array<TimelineItem>;\n}\n\nconst defaultTimeLineItem: TimelineBarItem = {\n id: \"default\",\n type: \"bar\",\n addSize: 0,\n delSize: 0,\n};\n\nexport const DocumentTimeline = (props: DocumentTimelineProps) => {\n const { timeline = [], onItemClick } = props;\n const [selectedItem, setSelectedItem] = useState<null | string>(null);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n\n const handleClick = (item: TimelineItem) => {\n if (item.id === selectedItem || item.id === defaultTimeLineItem.id) {\n onItemClick?.(null);\n setSelectedItem(null);\n } else {\n onItemClick?.(item);\n setSelectedItem(item.id);\n }\n };\n\n const mergedTimelineItems = [...timeline, defaultTimeLineItem];\n const [unselectedItems, selectedItems] = useMemo(() => {\n const indexSelected = mergedTimelineItems.findIndex(\n (item) => item.id === selectedItem,\n );\n\n return indexSelected === -1\n ? [mergedTimelineItems, []]\n : [\n mergedTimelineItems.slice(0, indexSelected),\n mergedTimelineItems.slice(indexSelected),\n ];\n }, [mergedTimelineItems, selectedItem]);\n\n const renderTimelineItems = useCallback(\n (items: Array<TimelineBarItem | TimelineDividerItem>) => {\n return items.map((item) => {\n if (item.type === \"divider\") {\n const { timestampUtcMs, title, subtitle } = item;\n return (\n <HDivider\n key={item.id}\n timestampUtcMs={timestampUtcMs}\n title={title}\n subtitle={subtitle}\n onClick={() => handleClick(item)}\n isSelected={item.id === selectedItem}\n />\n );\n }\n\n return (\n <TimelineBar\n key={item.id}\n timestampUtcMs={item.timestampUtcMs}\n addSize={item.addSize}\n delSize={item.delSize}\n additions={item.additions}\n deletions={item.deletions}\n isSelected={item.id === selectedItem}\n onClick={() => handleClick(item)}\n />\n );\n });\n },\n [handleClick, selectedItem],\n );\n\n const unselectedContent = useMemo(\n () => renderTimelineItems(unselectedItems),\n [unselectedItems, renderTimelineItems],\n );\n\n const selectedContent = useMemo(\n () => renderTimelineItems(selectedItems),\n [selectedItems, renderTimelineItems],\n );\n\n // Scroll to the end by default\n useEffect(() => {\n if (scrollContainerRef.current) {\n scrollContainerRef.current.scrollLeft =\n scrollContainerRef.current.scrollWidth;\n }\n }, []);\n\n return (\n <ConnectTooltipProvider delayDuration={0} skipDelayDuration={0}>\n <div className=\"relative h-[36px] w-full\">\n <div className=\"absolute left-0 z-20 h-[17px] w-[6px] bg-background\">\n <div className=\"mt-[11px] h-[6px] w-[6px] rounded-tl-md bg-background\" />\n </div>\n\n <div className=\"absolute top-[11px] right-0 z-20 h-[6px] w-[6px] bg-background\">\n <div className=\"h-[6px] w-[6px] rounded-tr-md bg-background\" />\n </div>\n <div className=\"absolute inset-x-0 bottom-0 h-[25px] rounded-md bg-background\" />\n\n <div className=\"absolute inset-x-0 bottom-0 h-[36px]\">\n <div\n ref={scrollContainerRef}\n className=\"h-full overflow-x-auto rounded-md\"\n >\n <div className=\"ml-auto flex h-[36px] w-max items-end px-2 pb-0\">\n <div className=\"flex\">{unselectedContent}</div>\n <div className=\"flex rounded-sm bg-info/10\">\n {selectedContent}\n </div>\n </div>\n </div>\n </div>\n <div className=\"pointer-events-none absolute bottom-0 left-0 z-10 h-[25px] w-2 rounded-l-md bg-background\" />\n <div className=\"pointer-events-none absolute right-0 bottom-0 z-10 h-[25px] w-2 rounded-r-md bg-background\" />\n </div>\n </ConnectTooltipProvider>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,171 @@
1
+ import { b as PowerhouseButton } from "./src-B2s8MAp7.js";
2
+ import { t as Icon } from "./icon-CR_tC1gc.js";
3
+ import { t as Label } from "./label-nH2HoKfI.js";
4
+ import { ConnectSelect, Disclosure, Divider, FormInput, sharingTypeOptions } from "./connect/index.js";
5
+ import { n as AvailableOfflineToggle, t as LocationInfo } from "./location-info-C3YbSsV0.js";
6
+ import { forwardRef, useState } from "react";
7
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
8
+ import { Controller, useForm } from "react-hook-form";
9
+ //#region src/connect/components/form/inputs/drive-name-input.tsx
10
+ const DriveNameInput = /*#__PURE__*/ forwardRef(function DriveNameInput(props, ref) {
11
+ return /* @__PURE__ */ jsx(FormInput, {
12
+ ...props,
13
+ icon: props.icon ?? /* @__PURE__ */ jsx(Icon, { name: "Drive" }),
14
+ id: "driveName",
15
+ placeholder: "Drive name",
16
+ ref
17
+ });
18
+ });
19
+ //#endregion
20
+ //#region src/connect/components/form/inputs/delete-drive.tsx
21
+ function DeleteDrive(props) {
22
+ const { drive, handleDeleteDrive, onCancel } = props;
23
+ const [driveNameInput, setDriveNameInput] = useState("");
24
+ const isAllowedToDelete = driveNameInput === drive.header.name;
25
+ function deleteDrive() {
26
+ if (isAllowedToDelete) handleDeleteDrive();
27
+ }
28
+ return /* @__PURE__ */ jsxs("div", { children: [
29
+ /* @__PURE__ */ jsx("p", {
30
+ className: "mb-2 rounded-md bg-background p-4 text-center text-foreground",
31
+ children: "Are you sure you want to delete this drive? All files and subfolders within it will be removed. Do you want to proceed?"
32
+ }),
33
+ /* @__PURE__ */ jsx(DriveNameInput, {
34
+ icon: /* @__PURE__ */ jsx(Icon, { name: "Lock" }),
35
+ onChange: (event) => setDriveNameInput(event.target.value),
36
+ placeholder: "Enter drive name...",
37
+ value: driveNameInput
38
+ }),
39
+ /* @__PURE__ */ jsxs("div", {
40
+ className: "flex gap-3",
41
+ children: [/* @__PURE__ */ jsx(PowerhouseButton, {
42
+ className: "w-full",
43
+ color: "light",
44
+ onClick: onCancel,
45
+ children: "Cancel"
46
+ }), /* @__PURE__ */ jsx(PowerhouseButton, {
47
+ className: "w-full",
48
+ color: "red",
49
+ disabled: !isAllowedToDelete,
50
+ onClick: deleteDrive,
51
+ children: "Delete"
52
+ })]
53
+ })
54
+ ] });
55
+ }
56
+ //#endregion
57
+ //#region src/connect/components/form/inputs/sharing-type-form-input.tsx
58
+ function SharingTypeFormInput(props) {
59
+ const { control, ...delegatedProps } = props;
60
+ return /* @__PURE__ */ jsx(Controller, {
61
+ control,
62
+ name: "sharingType",
63
+ render: ({ field }) => /* @__PURE__ */ jsx(ConnectSelect, {
64
+ ...delegatedProps,
65
+ ...field,
66
+ id: "sharingType",
67
+ items: sharingTypeOptions
68
+ })
69
+ });
70
+ }
71
+ //#endregion
72
+ //#region src/connect/components/form/drive-settings-form.impl.tsx
73
+ function DriveSettingsForm(props) {
74
+ const { drive, sharingType, availableOffline, systemInfo, onSubmit, handleDeleteDrive } = props;
75
+ const name = drive.header.name;
76
+ const [showLocationSettings, setShowLocationSettings] = useState(false);
77
+ const [showAbout, setShowAbout] = useState(false);
78
+ const [showDangerZone, setShowDangerZone] = useState(false);
79
+ const [showDeleteDrive, setShowDeleteDrive] = useState(false);
80
+ const { register, handleSubmit, control } = useForm({
81
+ mode: "onBlur",
82
+ defaultValues: {
83
+ name,
84
+ sharingType,
85
+ availableOffline
86
+ }
87
+ });
88
+ const location = sharingType === "PUBLIC" ? "SWITCHBOARD" : sharingType;
89
+ return /* @__PURE__ */ jsxs("form", {
90
+ onSubmit: (e) => void handleSubmit(onSubmit)(e),
91
+ children: [
92
+ /* @__PURE__ */ jsx(DriveNameInput, { ...register("name") }),
93
+ /* @__PURE__ */ jsx(Divider, { className: "my-4" }),
94
+ /* @__PURE__ */ jsx(Label, {
95
+ htmlFor: "sharingType",
96
+ children: "Sharing settings"
97
+ }),
98
+ /* @__PURE__ */ jsx(SharingTypeFormInput, { control }),
99
+ /* @__PURE__ */ jsx(Divider, { className: "my-3" }),
100
+ /* @__PURE__ */ jsxs(Disclosure, {
101
+ isOpen: showLocationSettings,
102
+ onOpenChange: () => setShowLocationSettings(!showLocationSettings),
103
+ title: "Location",
104
+ children: [/* @__PURE__ */ jsx(LocationInfo, { location }), /* @__PURE__ */ jsx(AvailableOfflineToggle, { ...register("availableOffline") })]
105
+ }),
106
+ /* @__PURE__ */ jsx(Divider, { className: "my-3" }),
107
+ /* @__PURE__ */ jsxs(Disclosure, {
108
+ isOpen: showAbout,
109
+ onOpenChange: () => setShowAbout(!showAbout),
110
+ title: "About this drive",
111
+ children: [
112
+ systemInfo.status === "local" && /* @__PURE__ */ jsx("p", {
113
+ className: "py-2 text-sm text-muted-foreground",
114
+ children: "Local drive — N/A"
115
+ }),
116
+ systemInfo.status === "loading" && /* @__PURE__ */ jsx("p", {
117
+ className: "py-2 text-sm text-muted-foreground",
118
+ children: "Loading…"
119
+ }),
120
+ systemInfo.status === "error" && /* @__PURE__ */ jsx("p", {
121
+ className: "py-2 text-sm text-destructive",
122
+ children: "Could not load system info"
123
+ }),
124
+ systemInfo.status === "ready" && /* @__PURE__ */ jsxs("div", {
125
+ className: "py-2 text-sm text-foreground",
126
+ children: [/* @__PURE__ */ jsxs("div", { children: [
127
+ /* @__PURE__ */ jsx("span", {
128
+ className: "font-medium",
129
+ children: "Version:"
130
+ }),
131
+ " ",
132
+ systemInfo.version
133
+ ] }), /* @__PURE__ */ jsxs("div", { children: [
134
+ /* @__PURE__ */ jsx("span", {
135
+ className: "font-medium",
136
+ children: "Git hash:"
137
+ }),
138
+ " ",
139
+ systemInfo.gitHash
140
+ ] })]
141
+ })
142
+ ]
143
+ }),
144
+ /* @__PURE__ */ jsx(Divider, { className: "my-3" }),
145
+ /* @__PURE__ */ jsx(Disclosure, {
146
+ isOpen: showDangerZone,
147
+ onOpenChange: () => setShowDangerZone(!showDangerZone),
148
+ title: "Danger zone",
149
+ children: /* @__PURE__ */ jsxs("button", {
150
+ className: "flex gap-2 py-3 font-semibold text-destructive transition hover:hover-effect",
151
+ onClick: () => setShowDeleteDrive(true),
152
+ type: "button",
153
+ children: [/* @__PURE__ */ jsx(Icon, { name: "Trash" }), "Delete drive"]
154
+ })
155
+ }),
156
+ showDeleteDrive && showDangerZone ? /* @__PURE__ */ jsx(DeleteDrive, {
157
+ drive,
158
+ handleDeleteDrive,
159
+ onCancel: () => setShowDeleteDrive(false)
160
+ }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Divider, { className: "my-3" }), /* @__PURE__ */ jsx(PowerhouseButton, {
161
+ className: "mb-4 w-full",
162
+ type: "submit",
163
+ children: "Confirm"
164
+ })] })
165
+ ]
166
+ });
167
+ }
168
+ //#endregion
169
+ export { DriveSettingsForm };
170
+
171
+ //# sourceMappingURL=drive-settings-form.impl-4yBGaTxe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive-settings-form.impl-4yBGaTxe.js","names":["Icon","forwardRef","FormInput","DriveNameInput","props","ref","icon","Icon","PowerhouseButton","useState","DriveNameInput","DeleteDrive","props","drive","handleDeleteDrive","onCancel","driveNameInput","setDriveNameInput","isAllowedToDelete","header","name","deleteDrive","event","target","value","Controller","ConnectSelect","sharingTypeOptions","SharingTypeFormInput","props","control","delegatedProps","field","Icon","PowerhouseButton","useState","useForm","Disclosure","Divider","AvailableOfflineToggle","DeleteDrive","DriveNameInput","Label","LocationInfo","SharingTypeFormInput","DriveSettingsForm","props","drive","sharingType","availableOffline","systemInfo","onSubmit","handleDeleteDrive","name","header","showLocationSettings","setShowLocationSettings","showAbout","setShowAbout","showDangerZone","setShowDangerZone","showDeleteDrive","setShowDeleteDrive","register","handleSubmit","control","mode","defaultValues","location","e","status","version","gitHash"],"sources":["../src/connect/components/form/inputs/drive-name-input.tsx","../src/connect/components/form/inputs/delete-drive.tsx","../src/connect/components/form/inputs/sharing-type-form-input.tsx","../src/connect/components/form/drive-settings-form.impl.tsx"],"sourcesContent":["import { Icon } from \"#design-system\";\nimport type { ComponentPropsWithRef, ForwardedRef } from \"react\";\nimport { forwardRef } from \"react\";\nimport { FormInput } from \"../../form-input/form-input.js\";\n\ntype DriveNameInputProps = Omit<\n ComponentPropsWithRef<typeof FormInput>,\n \"icon\" | \"id\"\n> & {\n readonly icon?: React.JSX.Element;\n};\n\nexport const DriveNameInput = forwardRef(function DriveNameInput(\n props: DriveNameInputProps,\n ref: ForwardedRef<HTMLInputElement>,\n) {\n return (\n <FormInput\n {...props}\n icon={props.icon ?? <Icon name=\"Drive\" />}\n id=\"driveName\"\n placeholder=\"Drive name\"\n ref={ref}\n />\n );\n});\n","import { Icon, PowerhouseButton } from \"#design-system\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport { useState } from \"react\";\nimport { DriveNameInput } from \"./drive-name-input.js\";\n\nexport type DeleteDriveProps = {\n drive: DocumentDriveDocument;\n handleDeleteDrive: () => void;\n onCancel: () => void;\n};\n\nexport function DeleteDrive(props: DeleteDriveProps) {\n const { drive, handleDeleteDrive, onCancel } = props;\n const [driveNameInput, setDriveNameInput] = useState(\"\");\n\n const isAllowedToDelete = driveNameInput === drive.header.name;\n\n function deleteDrive() {\n if (isAllowedToDelete) {\n handleDeleteDrive();\n }\n }\n\n return (\n <div>\n <p className=\"mb-2 rounded-md bg-background p-4 text-center text-foreground\">\n Are you sure you want to delete this drive? All files and subfolders\n within it will be removed. Do you want to proceed?\n </p>\n <DriveNameInput\n icon={<Icon name=\"Lock\" />}\n onChange={(event) => setDriveNameInput(event.target.value)}\n placeholder=\"Enter drive name...\"\n value={driveNameInput}\n />\n <div className=\"flex gap-3\">\n <PowerhouseButton className=\"w-full\" color=\"light\" onClick={onCancel}>\n Cancel\n </PowerhouseButton>\n <PowerhouseButton\n className=\"w-full\"\n color=\"red\"\n disabled={!isAllowedToDelete}\n onClick={deleteDrive}\n >\n Delete\n </PowerhouseButton>\n </div>\n </div>\n );\n}\n","import type { SharingType } from \"@powerhousedao/shared/document-drive\";\nimport type { ComponentPropsWithRef } from \"react\";\nimport type { Control, Path } from \"react-hook-form\";\nimport { Controller } from \"react-hook-form\";\nimport { ConnectSelect } from \"../../select/select.js\";\nimport { sharingTypeOptions } from \"../../../constants/options.js\";\n\ntype SharingTypeFormInputProps<T extends { sharingType: SharingType }> = Omit<\n ComponentPropsWithRef<typeof ConnectSelect>,\n \"id\" | \"items\" | \"value\" | \"onChange\"\n> & {\n readonly control: Control<T>;\n};\nexport function SharingTypeFormInput<T extends { sharingType: SharingType }>(\n props: SharingTypeFormInputProps<T>,\n) {\n const { control, ...delegatedProps } = props;\n\n return (\n <Controller\n control={control}\n name={\"sharingType\" as Path<T>}\n render={({ field }) => (\n <ConnectSelect\n {...delegatedProps}\n {...field}\n id=\"sharingType\"\n items={sharingTypeOptions}\n />\n )}\n />\n );\n}\n","import { Icon, PowerhouseButton } from \"#design-system\";\nimport type { DriveSystemInfoState } from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport type { SharingType } from \"@powerhousedao/shared/document-drive\";\nimport { useState } from \"react\";\nimport type { SubmitHandler } from \"react-hook-form\";\nimport { useForm } from \"react-hook-form\";\nimport { Disclosure } from \"../disclosure/disclosure.js\";\nimport { Divider } from \"../divider/divider.js\";\nimport { AvailableOfflineToggle } from \"./inputs/available-offline-toggle.js\";\nimport { DeleteDrive } from \"./inputs/delete-drive.js\";\nimport { DriveNameInput } from \"./inputs/drive-name-input.js\";\nimport { Label } from \"./inputs/label.js\";\nimport { LocationInfo } from \"./inputs/location-info.js\";\nimport { SharingTypeFormInput } from \"./inputs/sharing-type-form-input.js\";\n\ntype Inputs = {\n name: string;\n sharingType: SharingType;\n availableOffline: boolean;\n};\n\ntype DriveSettingsFormProps = {\n drive: DocumentDriveDocument;\n sharingType: SharingType;\n availableOffline: boolean;\n systemInfo: DriveSystemInfoState;\n onSubmit: DriveSettingsFormSubmitHandler;\n handleCancel: () => void;\n handleDeleteDrive: () => void;\n};\n\nexport type DriveSettingsFormSubmitHandler = SubmitHandler<Inputs>;\n\nexport function DriveSettingsForm(props: DriveSettingsFormProps) {\n const {\n drive,\n sharingType,\n availableOffline,\n systemInfo,\n onSubmit,\n handleDeleteDrive,\n } = props;\n const name = drive.header.name;\n\n const [showLocationSettings, setShowLocationSettings] = useState(false);\n const [showAbout, setShowAbout] = useState(false);\n const [showDangerZone, setShowDangerZone] = useState(false);\n const [showDeleteDrive, setShowDeleteDrive] = useState(false);\n\n const { register, handleSubmit, control } = useForm<Inputs>({\n mode: \"onBlur\",\n defaultValues: {\n name,\n sharingType,\n availableOffline,\n },\n });\n\n const location = sharingType === \"PUBLIC\" ? \"SWITCHBOARD\" : sharingType;\n\n return (\n <form onSubmit={(e) => void handleSubmit(onSubmit)(e)}>\n <DriveNameInput {...register(\"name\")} />\n <Divider className=\"my-4\" />\n <Label htmlFor=\"sharingType\">Sharing settings</Label>\n <SharingTypeFormInput control={control} />\n <Divider className=\"my-3\" />\n <Disclosure\n isOpen={showLocationSettings}\n onOpenChange={() => setShowLocationSettings(!showLocationSettings)}\n title=\"Location\"\n >\n <LocationInfo location={location} />\n <AvailableOfflineToggle {...register(\"availableOffline\")} />\n </Disclosure>\n <Divider className=\"my-3\" />\n <Disclosure\n isOpen={showAbout}\n onOpenChange={() => setShowAbout(!showAbout)}\n title=\"About this drive\"\n >\n {systemInfo.status === \"local\" && (\n <p className=\"py-2 text-sm text-muted-foreground\">\n Local drive — N/A\n </p>\n )}\n {systemInfo.status === \"loading\" && (\n <p className=\"py-2 text-sm text-muted-foreground\">Loading…</p>\n )}\n {systemInfo.status === \"error\" && (\n <p className=\"py-2 text-sm text-destructive\">\n Could not load system info\n </p>\n )}\n {systemInfo.status === \"ready\" && (\n <div className=\"py-2 text-sm text-foreground\">\n <div>\n <span className=\"font-medium\">Version:</span> {systemInfo.version}\n </div>\n <div>\n <span className=\"font-medium\">Git hash:</span>{\" \"}\n {systemInfo.gitHash}\n </div>\n </div>\n )}\n </Disclosure>\n <Divider className=\"my-3\" />\n <Disclosure\n isOpen={showDangerZone}\n onOpenChange={() => setShowDangerZone(!showDangerZone)}\n title=\"Danger zone\"\n >\n <button\n className=\"flex gap-2 py-3 font-semibold text-destructive transition hover:hover-effect\"\n onClick={() => setShowDeleteDrive(true)}\n type=\"button\"\n >\n <Icon name=\"Trash\" />\n Delete drive\n </button>\n </Disclosure>\n {showDeleteDrive && showDangerZone ? (\n <DeleteDrive\n drive={drive}\n handleDeleteDrive={handleDeleteDrive}\n onCancel={() => setShowDeleteDrive(false)}\n />\n ) : (\n <>\n <Divider className=\"my-3\" />\n <PowerhouseButton className=\"mb-4 w-full\" type=\"submit\">\n Confirm\n </PowerhouseButton>\n </>\n )}\n </form>\n );\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { n as RadioGroupFieldProps } from "./radio-group-field-CjX_Zt0C.js";
2
- import { n as SelectFieldProps } from "./select-field-BuXjM43L.js";
1
+ import { n as RadioGroupFieldProps } from "./radio-group-field-Bsf4waat.js";
2
+ import { n as SelectFieldProps } from "./select-field-DbFd1YiC.js";
3
3
  import React from "react";
4
4
  //#region src/ui/components/enum-field/enum-field.d.ts
5
5
  type EnumFieldProps = ({
@@ -13,4 +13,4 @@ declare const EnumField: React.ForwardRefExoticComponent<EnumFieldProps & React.
13
13
  //#endregion
14
14
  export { EnumFieldProps as n, EnumField as t };
15
15
  export {};
16
- //# sourceMappingURL=enum-field-qgV9wsyI.d.ts.map
16
+ //# sourceMappingURL=enum-field-CSeQE4Ss.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"enum-field-qgV9wsyI.d.ts","names":[],"sources":["../src/ui/components/enum-field/enum-field.tsx"],"mappings":";;;;KAUY;EAEN;KACG,uBAAuB;EAE1B;IACE;EAEF;IACE;cAEK,WAAS,MAAA,0BAAA,iBAAA,MAAA,cAAA,oBAAA"}
1
+ {"version":3,"file":"enum-field-CSeQE4Ss.d.ts","names":[],"sources":["../src/ui/components/enum-field/enum-field.tsx"],"mappings":";;;;KAUY;EAEN;KACG,uBAAuB;EAE1B;IACE;EAEF;IACE;cAEK,WAAS,MAAA,0BAAA,iBAAA,MAAA,cAAA,oBAAA"}
@@ -0,0 +1,58 @@
1
+ import { t as Icon } from "./icon-CR_tC1gc.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useTheme } from "@powerhousedao/reactor-browser";
4
+ import { isStrictEqual, isString } from "remeda";
5
+ import { JsonView } from "@uiw/react-json-view";
6
+ import { darkTheme } from "@uiw/react-json-view/dark";
7
+ import { lightTheme } from "@uiw/react-json-view/light";
8
+ //#region src/connect/components/formatted-json-viewer.impl.tsx
9
+ function FormattedJsonViewer(props) {
10
+ const { theme } = useTheme();
11
+ return /* @__PURE__ */ jsxs(JsonView, {
12
+ displayDataTypes: false,
13
+ displayObjectSize: false,
14
+ style: theme === "light" ? lightTheme : darkTheme,
15
+ ...props,
16
+ children: [/* @__PURE__ */ jsx(JsonView.Copied, { render: ({ onClick, ...props }) => {
17
+ if (props["data-copied"]) return /* @__PURE__ */ jsx(Icon, {
18
+ ...props,
19
+ className: "inline-block text-success",
20
+ name: "FilesEarmark",
21
+ size: 16
22
+ });
23
+ return /* @__PURE__ */ jsx(Icon, {
24
+ ...props,
25
+ onClick,
26
+ className: "inline-block cursor-pointer text-foreground",
27
+ name: "FilesEarmark",
28
+ size: 16
29
+ });
30
+ } }), /* @__PURE__ */ jsx(JsonView.String, { render: ({ children, ...rest }, { value, keyName }) => {
31
+ if (isString(children) && isString(value) && isStrictEqual(children, value) && value.length > 30) return /* @__PURE__ */ jsx("span", {
32
+ ...rest,
33
+ className: "inline-grid",
34
+ children: /* @__PURE__ */ jsxs("span", {
35
+ className: "pl-[1ch] indent-[-1ch] wrap-anywhere hyphens-none",
36
+ style: { maxWidth: `${60 - keyName.toString().length}ch` },
37
+ children: [
38
+ "\"",
39
+ children,
40
+ "\""
41
+ ]
42
+ })
43
+ });
44
+ return /* @__PURE__ */ jsxs("span", {
45
+ ...rest,
46
+ children: [
47
+ "\"",
48
+ children,
49
+ "\""
50
+ ]
51
+ });
52
+ } })]
53
+ });
54
+ }
55
+ //#endregion
56
+ export { FormattedJsonViewer };
57
+
58
+ //# sourceMappingURL=formatted-json-viewer.impl-C198BZt5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatted-json-viewer.impl-C198BZt5.js","names":["useTheme","JsonView","darkTheme","lightTheme","isStrictEqual","isString","Icon","FormattedJsonViewer","props","theme","style","onClick","children","rest","value","keyName","maxLength","length","maxWidth","toString"],"sources":["../src/connect/components/formatted-json-viewer.impl.tsx"],"sourcesContent":["import { useTheme } from \"@powerhousedao/reactor-browser\";\nimport { JsonView, type JsonViewProps } from \"@uiw/react-json-view\";\nimport { darkTheme } from \"@uiw/react-json-view/dark\";\nimport { lightTheme } from \"@uiw/react-json-view/light\";\nimport { isStrictEqual, isString } from \"remeda\";\nimport { Icon } from \"../../powerhouse/index.js\";\n\n/* Shows arbitrary JSON content in a nicely formatted viewer.\n * Takes all the same props as the JSON view React component.\n * Provides some quality of life improvements:\n *\n * allows expand and collapse of any / all of the rendered fields\n * Allows copy-paste of the whole object as well as individual fields, with a success indicator\n * Formats very long text fields so that they are first truncated, and then if expanded word wrap applies\n */\nexport function FormattedJsonViewer(props: JsonViewProps<object>) {\n const { theme } = useTheme();\n const style = theme === \"light\" ? lightTheme : darkTheme;\n return (\n <JsonView\n displayDataTypes={false}\n displayObjectSize={false}\n style={style}\n {...props}\n >\n <JsonView.Copied\n render={({ onClick, ...props }) => {\n if ((props as { \"data-copied\": boolean })[\"data-copied\"]) {\n return (\n <Icon\n {...props}\n className=\"inline-block text-success\"\n name=\"FilesEarmark\"\n size={16}\n />\n );\n }\n return (\n <Icon\n {...props}\n onClick={onClick}\n className=\"inline-block cursor-pointer text-foreground\"\n name=\"FilesEarmark\"\n size={16}\n />\n );\n }}\n />\n <JsonView.String\n render={({ children, ...rest }, { value, keyName }) => {\n // strings are truncated with ellipsis at 30 chars in this component by default\n const maxLength = 30;\n if (\n // if the children are a plain string, we know this is a text node\n isString(children) &&\n // the value should therefore also be a string\n isString(value) &&\n // when the content is truncated, the children will be the truncated content\n // and the value will be the original content\n // we know that the content is not truncated if the value and the children are the same\n isStrictEqual(children, value) &&\n // if the string is long then apply word wrap to avoid letting the parent component put everything\n // on one line\n value.length > maxLength\n ) {\n return (\n /* use inline grid so that this text is still aligned with the field name */\n <span {...rest} className=\"inline-grid\">\n <span\n // We must wrap anywhere because data can be of any length\n // do not use hyphens, show the raw content\n // apply one character of left padding and negative indent because of the string quotation mark\n className=\"pl-[1ch] indent-[-1ch] wrap-anywhere hyphens-none\"\n style={{\n // calculate the line width from the width of the key in the json\n maxWidth: `${60 - keyName.toString().length}ch`,\n }}\n >\n \"{children}\"\n </span>\n </span>\n );\n }\n return <span {...rest}>\"{children}\"</span>;\n }}\n />\n </JsonView>\n );\n}\n"],"mappings":";;;;;;;;AAeA,SAAgBO,oBAAoBC,OAA8B;CAChE,MAAM,EAAEC,UAAUT,SAAS;CAE3B,OACE,qBAAC,UAAD;EACE,kBAAkB;EAClB,mBAAmB;EACnB,OALUS,UAAU,UAAUN,aAAaD;EAM3C,GAAIM;EAJN,UAAA,CAME,oBAAC,SAAS,QAAV,EACE,SAAS,EAAEG,SAAS,GAAGH,YAAY;GACjC,IAAKA,MAAqC,gBACxC,OACE,oBAAC,MAAD;IACE,GAAIA;IACJ,WAAU;IACV,MAAK;IACL,MAAM;GAAG,CAAA;GAIf,OACE,oBAAC,MAAD;IACE,GAAIA;IACKG;IACT,WAAU;IACV,MAAK;IACL,MAAM;GAAG,CAAA;EAGf,EAAE,CAAA,GAEJ,oBAAC,SAAS,QAAV,EACE,SAAS,EAAEC,UAAU,GAAGC,QAAQ,EAAEC,OAAOC,cAAc;GAGrD,IAEEV,SAASO,QAAQ,KAEjBP,SAASS,KAAK,KAIdV,cAAcQ,UAAUE,KAAK,KAG7BA,MAAMG,SAASD,IAEf,OAEE,oBAAC,QAAD;IAAM,GAAIH;IAAM,WAAU;IACxB,UAAA,qBAAC,QAAD;KAIE,WAAU;KACV,OAAO,EAELK,UAAU,GAAG,KAAKH,QAAQI,SAAS,CAAC,CAACF,OAAM,IAC7C;KARF,UAAA;MAQI;MAEAL;MAAS;KACP;;GACF,CAAA;GAGV,OAAO,qBAAC,QAAD;IAAM,GAAIC;IAAV,UAAA;KAAgB;KAAED;KAAS;IAAO;;EAC3C,EAAE,CAAA,CAEI;;AAEd"}