@powerhousedao/design-system 6.2.3-dev.66 → 6.2.3-dev.68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{add-local-drive-form.impl-B5rVul7f.js → add-local-drive-form.impl-xsC6R634.js} +3 -3
- package/dist/{add-local-drive-form.impl-B5rVul7f.js.map → add-local-drive-form.impl-xsC6R634.js.map} +1 -1
- package/dist/{add-remote-drive-form.impl-D7zuqHJC.js → add-remote-drive-form.impl-B2DxdWGF.js} +3 -3
- package/dist/{add-remote-drive-form.impl-D7zuqHJC.js.map → add-remote-drive-form.impl-B2DxdWGF.js.map} +1 -1
- package/dist/{address-DsZy0bjk.js → address-DfZqD6IM.js} +2 -2
- package/dist/{address-DsZy0bjk.js.map → address-DfZqD6IM.js.map} +1 -1
- package/dist/{checkbox-DmRYkN10.d.ts → checkbox-BIhO-KB2.d.ts} +2 -2
- package/dist/{checkbox-DmRYkN10.d.ts.map → checkbox-BIhO-KB2.d.ts.map} +1 -1
- package/dist/{combobox.impl-C2oszOl2.js → combobox.impl-EqgAawKJ.js} +2 -2
- package/dist/{combobox.impl-C2oszOl2.js.map → combobox.impl-EqgAawKJ.js.map} +1 -1
- package/dist/connect/components/toast/toast.js +2 -2
- package/dist/connect/index.d.ts +5 -2
- package/dist/connect/index.d.ts.map +1 -1
- package/dist/connect/index.js +9 -9
- package/dist/{content-L3OINRSY.d.ts → content-Ch3oDYCL.d.ts} +2 -2
- package/dist/{content-L3OINRSY.d.ts.map → content-Ch3oDYCL.d.ts.map} +1 -1
- package/dist/{document-timeline.impl-DRmIHFaI.js → document-timeline.impl-CCkyXpt5.js} +2 -2
- package/dist/{document-timeline.impl-DRmIHFaI.js.map → document-timeline.impl-CCkyXpt5.js.map} +1 -1
- package/dist/{drive-settings-form.impl-4yBGaTxe.js → drive-settings-form.impl-Bwam9-CG.js} +3 -3
- package/dist/{drive-settings-form.impl-4yBGaTxe.js.map → drive-settings-form.impl-Bwam9-CG.js.map} +1 -1
- package/dist/{enum-field-CSeQE4Ss.d.ts → enum-field-DsyC0ml7.d.ts} +3 -3
- package/dist/{enum-field-CSeQE4Ss.d.ts.map → enum-field-DsyC0ml7.d.ts.map} +1 -1
- package/dist/{formatted-json-viewer.impl-C198BZt5.js → formatted-json-viewer.impl-DadZ5uvb.js} +2 -2
- package/dist/{formatted-json-viewer.impl-C198BZt5.js.map → formatted-json-viewer.impl-DadZ5uvb.js.map} +1 -1
- package/dist/{icon-CR_tC1gc.js → icon-CHR45tj_.js} +2 -2
- package/dist/{icon-CR_tC1gc.js.map → icon-CHR45tj_.js.map} +1 -1
- package/dist/{icon-components-BZ_bQZmJ.js → icon-components-CJ4I3Y6Y.js} +3 -3
- package/dist/{icon-components-BZ_bQZmJ.js.map → icon-components-CJ4I3Y6Y.js.map} +1 -1
- package/dist/{id-autocomplete-0bhU6VQG.d.ts → id-autocomplete-Cr7p129s.d.ts} +2 -2
- package/dist/id-autocomplete-Cr7p129s.d.ts.map +1 -0
- package/dist/{id-autocomplete-input-container-xg9lrpSK.d.ts → id-autocomplete-input-container-iTw9wYZn.d.ts} +2 -2
- package/dist/{id-autocomplete-input-container-xg9lrpSK.d.ts.map → id-autocomplete-input-container-iTw9wYZn.d.ts.map} +1 -1
- package/dist/{id-autocomplete-list-Da3FbpJ1.d.ts → id-autocomplete-list-BIC3RxOp.d.ts} +2 -2
- package/dist/{id-autocomplete-list-Da3FbpJ1.d.ts.map → id-autocomplete-list-BIC3RxOp.d.ts.map} +1 -1
- package/dist/{id-autocomplete-list-option-D7JgEK6E.d.ts → id-autocomplete-list-option-DlpZer-2.d.ts} +2 -2
- package/dist/{id-autocomplete-list-option-D7JgEK6E.d.ts.map → id-autocomplete-list-option-DlpZer-2.d.ts.map} +1 -1
- package/dist/{index-D99twPFI.d.ts → index-Ck34z7kD.d.ts} +5 -1
- package/dist/index-Ck34z7kD.d.ts.map +1 -0
- package/dist/index-DoZfvvTr.d.ts +3 -0
- package/dist/index-Ds9-qjjC.d.ts +30 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/{radio-group-field-Bsf4waat.d.ts → radio-group-field-0-cC_e65.d.ts} +2 -2
- package/dist/{radio-group-field-Bsf4waat.d.ts.map → radio-group-field-0-cC_e65.d.ts.map} +1 -1
- package/dist/{revision-history.impl-uogo6xDI.js → revision-history.impl-CrtSnhXQ.js} +10 -6
- package/dist/revision-history.impl-CrtSnhXQ.js.map +1 -0
- package/dist/{select-field-DbFd1YiC.d.ts → select-field-VZPf666l.d.ts} +2 -2
- package/dist/{select-field-DbFd1YiC.d.ts.map → select-field-VZPf666l.d.ts.map} +1 -1
- package/dist/{selected-content-VMVPoru4.d.ts → selected-content-D6NWiceG.d.ts} +2 -2
- package/dist/{selected-content-VMVPoru4.d.ts.map → selected-content-D6NWiceG.d.ts.map} +1 -1
- package/dist/{splitted-input-diff-BKRMH7vI.d.ts → splitted-input-diff-Bkoi0Odc.d.ts} +2 -2
- package/dist/{splitted-input-diff-BKRMH7vI.d.ts.map → splitted-input-diff-Bkoi0Odc.d.ts.map} +1 -1
- package/dist/{src-B2s8MAp7.js → src-CohvVFnR.js} +17 -7
- package/dist/src-CohvVFnR.js.map +1 -0
- package/dist/style.css +3 -0
- package/dist/{text-field-CtatgqNu.d.ts → text-field-CDYSwanK.d.ts} +3 -3
- package/dist/{text-field-CtatgqNu.d.ts.map → text-field-CDYSwanK.d.ts.map} +1 -1
- package/dist/{text-input-BSxhvnyx.d.ts → text-input-CFRCPYq6.d.ts} +2 -2
- package/dist/{text-input-BSxhvnyx.d.ts.map → text-input-CFRCPYq6.d.ts.map} +1 -1
- package/dist/{text-input-diff-CaZoFDjA.d.ts → text-input-diff-BgJAxPQV.d.ts} +2 -2
- package/dist/{text-input-diff-CaZoFDjA.d.ts.map → text-input-diff-BgJAxPQV.d.ts.map} +1 -1
- package/dist/ui/components/checkbox/checkbox.d.ts +1 -1
- package/dist/ui/components/command/command.js +1 -1
- package/dist/ui/components/enum-field/enum-field.d.ts +1 -1
- package/dist/ui/components/enum-field/types.d.ts +1 -1
- package/dist/ui/components/form-label/form-label.js +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete-input-container.d.ts +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete-input-container.js +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete-list-option.d.ts +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete-list-option.js +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete-list.d.ts +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete.d.ts +1 -1
- package/dist/ui/components/id-autocomplete/types.d.ts +1 -1
- package/dist/ui/components/id-autocomplete/use-id-autocomplete.d.ts +1 -1
- package/dist/ui/components/index.d.ts +17 -17
- package/dist/ui/components/input/splitted-input-diff.d.ts +1 -1
- package/dist/ui/components/input/splitted-input-diff.js +1 -1
- package/dist/ui/components/input/subcomponent/text-diff.d.ts +1 -1
- package/dist/ui/components/radio-group-field/radio-group-field.d.ts +1 -1
- package/dist/ui/components/select-field/content.d.ts +1 -1
- package/dist/ui/components/select-field/content.js +1 -1
- package/dist/ui/components/select-field/select-field.d.ts +1 -1
- package/dist/ui/components/select-field/selected-content.d.ts +1 -1
- package/dist/ui/components/select-field/selected-content.js +1 -1
- package/dist/ui/components/select-field/subcomponents/CommandItemList.d.ts +1 -1
- package/dist/ui/components/select-field/subcomponents/CommandItemList.js +1 -1
- package/dist/ui/components/select-field/use-select-field.d.ts +1 -1
- package/dist/ui/components/sidebar/sidebar.js +1 -1
- package/dist/ui/components/sidebar/subcomponents/sidebar-content-area.js +1 -1
- package/dist/ui/components/sidebar/subcomponents/sidebar-item.js +1 -1
- package/dist/ui/components/text-field/text-field.d.ts +1 -1
- package/dist/ui/components/text-input/text-input-diff.d.ts +1 -1
- package/dist/ui/components/text-input/text-input.d.ts +1 -1
- package/dist/ui/components/types.d.ts +1 -1
- package/dist/ui/components/value-transformer/value-transformer.d.ts +1 -1
- package/dist/ui/components/with-field-validation/with-field-validation.d.ts +1 -1
- package/dist/ui/index.d.ts +18 -18
- package/dist/ui/types.d.ts +1 -1
- package/dist/{use-id-autocomplete-DSRXA4Wt.d.ts → use-id-autocomplete-WH2ROfQn.d.ts} +2 -2
- package/dist/{use-id-autocomplete-DSRXA4Wt.d.ts.map → use-id-autocomplete-WH2ROfQn.d.ts.map} +1 -1
- package/dist/{value-transformer-Dv-10UyC.d.ts → value-transformer-Cg5TEYP2.d.ts} +2 -2
- package/dist/{value-transformer-Dv-10UyC.d.ts.map → value-transformer-Cg5TEYP2.d.ts.map} +1 -1
- package/dist/{with-field-validation-WiD_NFDk.d.ts → with-field-validation-CObZoT4r.d.ts} +2 -2
- package/dist/{with-field-validation-WiD_NFDk.d.ts.map → with-field-validation-CObZoT4r.d.ts.map} +1 -1
- package/package.json +10 -6
- package/tailwind.css +180 -0
- package/vendor.css +3 -0
- package/dist/id-autocomplete-0bhU6VQG.d.ts.map +0 -1
- package/dist/index-D99twPFI.d.ts.map +0 -1
- package/dist/index-D9nAoDks.d.ts +0 -30
- package/dist/index-FfMAMBu7.d.ts +0 -3
- package/dist/revision-history.impl-uogo6xDI.js.map +0 -1
- package/dist/src-B2s8MAp7.js.map +0 -1
package/dist/ui/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as SelectProps, S as SelectOption, _ as WithDifference, a as AmountInputPropsGeneric, b as RadioGroupProps, c as Currency, d as ErrorMessage, f as FieldErrorHandling, g as ViewMode, h as ValidatorResult, i as AmountFiat, l as CurrencyTicker, m as ValidatorHandler, n as AmountCrypto, o as AmountPercentage, p as InputBaseProps, r as AmountCurrency, s as AmountValue, t as Amount, u as DiffMode, v as IdAutocompleteOption, x as SelectBaseProps, y as IdAutocompleteProps } from "../index-
|
|
1
|
+
import { C as SelectProps, S as SelectOption, _ as WithDifference, a as AmountInputPropsGeneric, b as RadioGroupProps, c as Currency, d as ErrorMessage, f as FieldErrorHandling, g as ViewMode, h as ValidatorResult, i as AmountFiat, l as CurrencyTicker, m as ValidatorHandler, n as AmountCrypto, o as AmountPercentage, p as InputBaseProps, r as AmountCurrency, s as AmountValue, t as Amount, u as DiffMode, v as IdAutocompleteOption, x as SelectBaseProps, y as IdAutocompleteProps } from "../index-Ck34z7kD.js";
|
|
2
2
|
import { a as TransformerType, c as WeekStartDayNumber, i as TransformerTrigger, n as DatePickerView, o as ValueTransformerFn, r as TransformerObject, s as ValueTransformerProps, t as DateFieldValue } from "../types-CpFPFB1a.js";
|
|
3
3
|
export { Amount, AmountCrypto, AmountCurrency, AmountFiat, AmountInputPropsGeneric, AmountPercentage, AmountValue, Currency, CurrencyTicker, type DateFieldValue, type DatePickerView, DiffMode, ErrorMessage, FieldErrorHandling, type IdAutocompleteOption, type IdAutocompleteProps, InputBaseProps, type RadioGroupProps, type SelectBaseProps, type SelectOption, type SelectProps, type TransformerObject, type TransformerTrigger, type TransformerType, ValidatorHandler, ValidatorResult, type ValueTransformerFn, type ValueTransformerProps, ViewMode, type WeekStartDayNumber, WithDifference };
|
|
4
4
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { v as IdAutocompleteOption, y as IdAutocompleteProps } from "./index-
|
|
1
|
+
import { v as IdAutocompleteOption, y as IdAutocompleteProps } from "./index-Ck34z7kD.js";
|
|
2
2
|
//#region src/ui/components/id-autocomplete/use-id-autocomplete.d.ts
|
|
3
3
|
interface UseIdAutocompleteParams {
|
|
4
4
|
autoComplete: IdAutocompleteProps["autoComplete"];
|
|
@@ -33,4 +33,4 @@ declare function useIdAutocomplete({ autoComplete, defaultValue, value, isOpenBy
|
|
|
33
33
|
//#endregion
|
|
34
34
|
export { useIdAutocomplete as t };
|
|
35
35
|
export {};
|
|
36
|
-
//# sourceMappingURL=use-id-autocomplete-
|
|
36
|
+
//# sourceMappingURL=use-id-autocomplete-WH2ROfQn.d.ts.map
|
package/dist/{use-id-autocomplete-DSRXA4Wt.d.ts.map → use-id-autocomplete-WH2ROfQn.d.ts.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-id-autocomplete-
|
|
1
|
+
{"version":3,"file":"use-id-autocomplete-WH2ROfQn.d.ts","names":[],"sources":["../src/ui/components/id-autocomplete/use-id-autocomplete.ts"],"mappings":";;UAKU;EACR,cAAc;EACd;EACA;EACA,iBAAiB;EACjB,gBAAgB;EAChB,WAAW;EACX,SAAS,MAAM,kBAAkB;EACjC,cAAc;EACd,qBAAqB;;iBAGP,oBACd,cACA,cACA,OACA,iBACA,gBACA,UACA,QACA,cACA,uBACC;;;;;;;;;;;EAuIe,eAAA;EAVP,mBAAA;EAqCH,gBAAA,GAAA,MAAM,WAAW;EAfjB,eAAA,GAAA,MAAM,YAAY;EAUuB,qBAAA;EAjFrC,4BAAA;EA+FJ,cAAA,GAAA,MAAM,eAAe"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import "./index-
|
|
1
|
+
import "./index-Ck34z7kD.js";
|
|
2
2
|
import { s as ValueTransformerProps } from "./types-CpFPFB1a.js";
|
|
3
3
|
import React from "react";
|
|
4
4
|
//#region src/ui/components/value-transformer/value-transformer.d.ts
|
|
@@ -40,4 +40,4 @@ declare function ValueTransformer({ transformers, children }: ValueTransformerPr
|
|
|
40
40
|
//#endregion
|
|
41
41
|
export { ValueTransformer as t };
|
|
42
42
|
export {};
|
|
43
|
-
//# sourceMappingURL=value-transformer-
|
|
43
|
+
//# sourceMappingURL=value-transformer-Cg5TEYP2.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"value-transformer-
|
|
1
|
+
{"version":3,"file":"value-transformer-Cg5TEYP2.d.ts","names":[],"sources":["../src/ui/components/value-transformer/value-transformer.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2FgB,mBACd,cACA,YACC,wBAAqB,MAAA,+BAAA,MAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { f as FieldErrorHandling, m as ValidatorHandler, p as InputBaseProps } from "./index-
|
|
1
|
+
import { f as FieldErrorHandling, m as ValidatorHandler, p as InputBaseProps } from "./index-Ck34z7kD.js";
|
|
2
2
|
import { ComponentType, ElementRef, ForwardRefExoticComponent, PropsWithoutRef, RefAttributes } from "react";
|
|
3
3
|
//#region src/ui/components/with-field-validation/with-field-validation.d.ts
|
|
4
4
|
interface PossibleProps extends InputBaseProps<unknown>, FieldErrorHandling {
|
|
@@ -16,4 +16,4 @@ declare const withFieldValidation: <T extends PossibleProps, R extends ElementRe
|
|
|
16
16
|
//#endregion
|
|
17
17
|
export { withFieldValidation as n, ValidationOptions as t };
|
|
18
18
|
export {};
|
|
19
|
-
//# sourceMappingURL=with-field-validation-
|
|
19
|
+
//# sourceMappingURL=with-field-validation-CObZoT4r.d.ts.map
|
package/dist/{with-field-validation-WiD_NFDk.d.ts.map → with-field-validation-CObZoT4r.d.ts.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-field-validation-
|
|
1
|
+
{"version":3,"file":"with-field-validation-CObZoT4r.d.ts","names":[],"sources":["../src/ui/components/with-field-validation/with-field-validation.tsx"],"mappings":";;;UAiBU,sBAAsB,yBAAyB;EACvD,UAAU;EACV;EACA;EACA;EACA;;UAQe,kBAAkB;EACjC,cAAc,gBAAgB,aAAa,MAAM;EACjD,kBAAkB;;cAGP,sBACX,UAAU,eACV,UAAU,kBAAkB,iBAAe,WAEhC,cAAc,IAAE,UACjB,kBAAkB,OAC3B,0BAA0B,gBAAgB,KAAK,cAAc"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/design-system",
|
|
3
|
-
"version": "6.2.3-dev.
|
|
3
|
+
"version": "6.2.3-dev.68",
|
|
4
4
|
"description": "Powerhouse document-engineering design system — GraphQL scalar UI components for building consistent Powerhouse editors.",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
7
|
-
"theme.css"
|
|
7
|
+
"theme.css",
|
|
8
|
+
"tailwind.css",
|
|
9
|
+
"vendor.css"
|
|
8
10
|
],
|
|
9
11
|
"type": "module",
|
|
10
12
|
"repository": {
|
|
@@ -56,6 +58,8 @@
|
|
|
56
58
|
"import": "./dist/connect/components/toast/toast.js"
|
|
57
59
|
},
|
|
58
60
|
"./style.css": "./dist/style.css",
|
|
61
|
+
"./tailwind.css": "./tailwind.css",
|
|
62
|
+
"./vendor.css": "./vendor.css",
|
|
59
63
|
"./theme.css": "./theme.css"
|
|
60
64
|
},
|
|
61
65
|
"author": {
|
|
@@ -70,7 +74,7 @@
|
|
|
70
74
|
"@babel/core": "^7.29.0",
|
|
71
75
|
"@babel/plugin-transform-react-pure-annotations": "^7.27.1",
|
|
72
76
|
"@babel/preset-typescript": "^7.28.5",
|
|
73
|
-
"@powerhousedao/config": "6.2.3-dev.
|
|
77
|
+
"@powerhousedao/config": "6.2.3-dev.68",
|
|
74
78
|
"@prettier/sync": "^0.5.2",
|
|
75
79
|
"@rollup/plugin-babel": "^7.0.0",
|
|
76
80
|
"@storybook/addon-actions": "^8.6.18",
|
|
@@ -104,7 +108,6 @@
|
|
|
104
108
|
"react-dom": "19.2.6",
|
|
105
109
|
"storybook": "^8.6.18",
|
|
106
110
|
"storybook-addon-pseudo-states": "^4.0.4",
|
|
107
|
-
"tailwind-scrollbar": "^4.0.1",
|
|
108
111
|
"tailwindcss": "4.2.2",
|
|
109
112
|
"tsdown": "0.23.0",
|
|
110
113
|
"tsx": "4.23.13",
|
|
@@ -116,8 +119,8 @@
|
|
|
116
119
|
"react-dom": ">=19.0.0"
|
|
117
120
|
},
|
|
118
121
|
"dependencies": {
|
|
119
|
-
"@powerhousedao/reactor-browser": "6.2.3-dev.
|
|
120
|
-
"@powerhousedao/shared": "6.2.3-dev.
|
|
122
|
+
"@powerhousedao/reactor-browser": "6.2.3-dev.68",
|
|
123
|
+
"@powerhousedao/shared": "6.2.3-dev.68",
|
|
121
124
|
"@radix-ui/react-checkbox": "^1.1.2",
|
|
122
125
|
"@radix-ui/react-dialog": "^1.1.2",
|
|
123
126
|
"@radix-ui/react-dropdown-menu": "^2.1.5",
|
|
@@ -143,6 +146,7 @@
|
|
|
143
146
|
"react-virtualized": "^9.22.6",
|
|
144
147
|
"remeda": "2.33.7",
|
|
145
148
|
"tailwind-merge": "3.4.0",
|
|
149
|
+
"tailwind-scrollbar": "^4.0.1",
|
|
146
150
|
"type-fest": "5.6.0",
|
|
147
151
|
"usehooks-ts": "^3.1.1"
|
|
148
152
|
},
|
package/tailwind.css
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/* The design system for a Tailwind host: its tokens, its components' rules and
|
|
2
|
+
the classes its code uses. Third-party CSS is in vendor.css. */
|
|
3
|
+
@import "./theme.css";
|
|
4
|
+
@source "./dist";
|
|
5
|
+
@plugin "tailwind-scrollbar";
|
|
6
|
+
|
|
7
|
+
@plugin 'tailwind-scrollbar' {
|
|
8
|
+
nocompatible: true;
|
|
9
|
+
preferredstrategy: "pseudoelements";
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
@custom-variant dark (&:where(.dark, .dark *));
|
|
13
|
+
|
|
14
|
+
:root {
|
|
15
|
+
/* Toastify */
|
|
16
|
+
--toastify-toast-min-height: 48px;
|
|
17
|
+
--toastify-toast-bd-radius: 8px;
|
|
18
|
+
--toastify-text-color-light: var(--color-gray-800);
|
|
19
|
+
|
|
20
|
+
--toastify-color-progress-info: var(--color-gray-300);
|
|
21
|
+
--toastify-color-progress-success: var(--color-gray-300);
|
|
22
|
+
--toastify-color-progress-warning: var(--color-gray-300);
|
|
23
|
+
--toastify-color-progress-error: var(--color-gray-300);
|
|
24
|
+
--toastify-color-progress-light: var(--color-gray-300);
|
|
25
|
+
/* Toastify end */
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
html:has(dialog[open]) {
|
|
29
|
+
overflow: hidden;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.checkbox-container input[type="checkbox"] {
|
|
33
|
+
accent-color: var(--color-gray-900);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* React Multi Select */
|
|
37
|
+
.rmsc {
|
|
38
|
+
--rmsc-main: var(--color-gray-300) !important;
|
|
39
|
+
--rmsc-hover: var(--color-gray-100) !important;
|
|
40
|
+
--rmsc-selected: var(--color-gray-300) !important;
|
|
41
|
+
}
|
|
42
|
+
/* React Multi Select end */
|
|
43
|
+
|
|
44
|
+
/* Toastify */
|
|
45
|
+
.Toastify__toast-body {
|
|
46
|
+
padding: 0;
|
|
47
|
+
margin: 0;
|
|
48
|
+
font-size: 14px;
|
|
49
|
+
font-weight: 600;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.Toastify__toast {
|
|
53
|
+
box-shadow: 0px 8px 32px 0px rgba(0, 0, 0, 0.32);
|
|
54
|
+
padding: 12px 16px 12px 16px;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.Toastify__progress-bar--wrp {
|
|
58
|
+
height: 2px;
|
|
59
|
+
}
|
|
60
|
+
/* Toastify end */
|
|
61
|
+
|
|
62
|
+
input[type="number"]::-webkit-inner-spin-button,
|
|
63
|
+
input[type="number"]::-webkit-outer-spin-button {
|
|
64
|
+
-webkit-appearance: none;
|
|
65
|
+
-moz-appearance: none;
|
|
66
|
+
appearance: none;
|
|
67
|
+
margin: 0;
|
|
68
|
+
}
|
|
69
|
+
/* Remove the increment/decrement buttons in Firefox */
|
|
70
|
+
input[type="number"] {
|
|
71
|
+
-moz-appearance: textfield;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.hover-bg-transparent:hover {
|
|
75
|
+
background-color: rgba(0, 0, 0, 0.05);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
@layer base {
|
|
79
|
+
/* The theme's text colour, so content outside the app's root (portals) follows dark mode. */
|
|
80
|
+
body {
|
|
81
|
+
@apply text-foreground;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
button {
|
|
85
|
+
@apply cursor-pointer;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.ph-default-styles h1 {
|
|
89
|
+
@apply mb-4 mt-6 font-sans text-3xl font-bold leading-tight text-foreground;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.ph-default-styles h2 {
|
|
93
|
+
@apply mb-3 mt-5 font-sans text-2xl font-bold leading-tight text-foreground;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.ph-default-styles h3 {
|
|
97
|
+
@apply mb-2 mt-4 font-sans text-xl font-bold leading-tight text-foreground;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.ph-default-styles p {
|
|
101
|
+
@apply font-sans text-base font-normal leading-tight text-foreground;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.ph-default-styles small {
|
|
105
|
+
@apply font-sans text-sm font-normal leading-none text-foreground;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* Default styles for text input fields and textareas based on Storybook */
|
|
109
|
+
.ph-default-styles input[type="text"],
|
|
110
|
+
.ph-default-styles input[type="email"],
|
|
111
|
+
.ph-default-styles input[type="password"],
|
|
112
|
+
.ph-default-styles input[type="search"],
|
|
113
|
+
.ph-default-styles input[type="tel"],
|
|
114
|
+
.ph-default-styles input[type="url"],
|
|
115
|
+
.ph-default-styles input[type="number"],
|
|
116
|
+
.ph-default-styles textarea {
|
|
117
|
+
/* Consistent with other defaults, Tailwind uses font-sans */
|
|
118
|
+
/* text-sm, font-normal, leading-5 */
|
|
119
|
+
/* text-gray-900 is #1a202c, using established default */
|
|
120
|
+
/* bg-white */
|
|
121
|
+
/* border border-gray-300 (#d1d5db), using established default */
|
|
122
|
+
/* rounded-md */
|
|
123
|
+
/* py-[7px] (textarea) / py-2 (input), px-3 */
|
|
124
|
+
/* w-full */
|
|
125
|
+
/* For some default spacing */
|
|
126
|
+
@apply mb-2.5 box-border w-full rounded-md border border-input bg-card px-3 py-1.75 font-sans text-sm font-normal leading-5 text-foreground;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.ph-default-styles textarea {
|
|
130
|
+
/* min-h-9 from textarea styles */
|
|
131
|
+
/* resize-y from textarea styles */
|
|
132
|
+
@apply min-h-9 resize-y;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.ph-default-styles input[type="text"]:is([readonly], [disabled]),
|
|
136
|
+
.ph-default-styles input[type="email"]:is([readonly], [disabled]),
|
|
137
|
+
.ph-default-styles input[type="password"]:is([readonly], [disabled]),
|
|
138
|
+
.ph-default-styles input[type="search"]:is([readonly], [disabled]),
|
|
139
|
+
.ph-default-styles input[type="tel"]:is([readonly], [disabled]),
|
|
140
|
+
.ph-default-styles input[type="url"]:is([readonly], [disabled]),
|
|
141
|
+
.ph-default-styles input[type="number"]:is([readonly], [disabled]),
|
|
142
|
+
.ph-default-styles textarea:is([readonly], [disabled]) {
|
|
143
|
+
@apply bg-background text-muted-foreground;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/* Default styles for anchor/links */
|
|
147
|
+
.ph-default-styles a {
|
|
148
|
+
/* Example link color - match your design system */
|
|
149
|
+
@apply text-info no-underline;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.ph-default-styles a:hover {
|
|
153
|
+
/* Darker shade for hover */
|
|
154
|
+
@apply text-info brightness-50 underline;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.ph-default-styles a:focus {
|
|
158
|
+
/* Example focus ring */
|
|
159
|
+
@apply outline-none ring-2 ring-ring/50 ring-offset-2;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/* Default styles for lists */
|
|
163
|
+
.ph-default-styles ul,
|
|
164
|
+
.ph-default-styles ol {
|
|
165
|
+
@apply mb-0 mt-0 pl-0;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/* Default styles for labels */
|
|
169
|
+
.ph-default-styles label {
|
|
170
|
+
/* font-medium or similar */
|
|
171
|
+
/* Match other text colors */
|
|
172
|
+
@apply block font-sans font-medium text-foreground;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/* Default styles for horizontal rules */
|
|
176
|
+
.ph-default-styles hr {
|
|
177
|
+
/* A common light grey border color */
|
|
178
|
+
@apply my-4 h-px border-0 bg-border;
|
|
179
|
+
}
|
|
180
|
+
}
|
package/vendor.css
ADDED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"id-autocomplete-0bhU6VQG.d.ts","names":[],"sources":["../src/ui/components/id-autocomplete/id-autocomplete.tsx"],"mappings":";;;cAkBM,gBAAc,MAAA,0BAAA,sBAAA,MAAA,cAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-D99twPFI.d.ts","names":[],"sources":["../src/connect/constants/syncing.ts","../src/connect/components/types.ts","../src/connect/types.ts","../src/powerhouse/components/button/button.tsx","../src/powerhouse/components/dropdown-menu/dropdown-menu.tsx","../src/powerhouse/components/icon/icon-components.tsx","../src/powerhouse/components/icon/icon.tsx","../src/powerhouse/components/modal/modal.tsx","../src/powerhouse/components/package-animation/package-animation.tsx","../src/powerhouse/hooks/usePagination.ts","../src/powerhouse/components/pagination/pagination.tsx","../src/powerhouse/components/sidebar/sidebar-panel.tsx","../src/powerhouse/components/sidebar/sidebar.tsx","../src/powerhouse/hooks/animation.ts","../src/powerhouse/hooks/useWindowSize.ts","../src/powerhouse/utils/getDimensions.ts","../src/ui/components/enum-field/types.ts","../src/ui/components/id-autocomplete/types.ts","../src/ui/types.ts"],"mappings":"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"}
|
package/dist/index-D9nAoDks.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import "./button-BYcXvZXr.js";
|
|
2
|
-
import "./checkbox-base-Bm0GPWgm.js";
|
|
3
|
-
import "./checkbox-DmRYkN10.js";
|
|
4
|
-
import "./command-DHHTsHfH.js";
|
|
5
|
-
import "./radio-group-field-Bsf4waat.js";
|
|
6
|
-
import "./select-field-DbFd1YiC.js";
|
|
7
|
-
import "./enum-field-CSeQE4Ss.js";
|
|
8
|
-
import "./form-Brj5AQNr.js";
|
|
9
|
-
import "./id-autocomplete-input-container-xg9lrpSK.js";
|
|
10
|
-
import "./id-autocomplete-list-option-D7JgEK6E.js";
|
|
11
|
-
import "./id-autocomplete-list-Da3FbpJ1.js";
|
|
12
|
-
import "./id-autocomplete-0bhU6VQG.js";
|
|
13
|
-
import "./use-id-autocomplete-DSRXA4Wt.js";
|
|
14
|
-
import "./input-WDvjJFqf.js";
|
|
15
|
-
import "./splitted-input-diff-BKRMH7vI.js";
|
|
16
|
-
import "./json-viewer-Kg0IBIt-.js";
|
|
17
|
-
import "./popover-TvQxa0RU.js";
|
|
18
|
-
import "./radio-group-CROIwgYz.js";
|
|
19
|
-
import "./radio-CTS4WsNy.js";
|
|
20
|
-
import "./index-D6Zk5OLV.js";
|
|
21
|
-
import "./content-L3OINRSY.js";
|
|
22
|
-
import "./selected-content-VMVPoru4.js";
|
|
23
|
-
import "./text-input-BSxhvnyx.js";
|
|
24
|
-
import "./text-field-CtatgqNu.js";
|
|
25
|
-
import "./text-input-diff-CaZoFDjA.js";
|
|
26
|
-
import "./index-C-Tup7Br.js";
|
|
27
|
-
import "./tooltip-B4uQJPUm.js";
|
|
28
|
-
import "./value-transformer-Dv-10UyC.js";
|
|
29
|
-
import "./with-field-validation-WiD_NFDk.js";
|
|
30
|
-
export {};
|
package/dist/index-FfMAMBu7.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"revision-history.impl-uogo6xDI.js","names":["Icon","Branch","props","branch","Icon","useCopyToClipboard","DocId","props","docId","onCopy","copy","handleCopy","text","then","catch","error","console","Icon","useCopyToClipboard","DocumentState","props","documentState","onCopyState","copy","handleCopy","jsonState","JSON","stringify","then","catch","error","console","ConnectSelect","labelFor","scope","charAt","toUpperCase","slice","Scope","props","scopes","value","onChange","items","map","displayValue","Icon","twMerge","Branch","DocId","DocumentState","Scope","Header","props","title","docId","scope","scopes","onChangeScope","onClose","className","documentState","onCopyState","onCopyDocId","divProps","Anchor","Content","Portal","Root","Trigger","useState","funnel","CodePopover","props","content","trigger","anchor","isOpen","setIsOpen","opener","triggerAt","minQuietPeriodMs","closer","open","cancel","call","close","changedIsOpen","e","preventDefault","top","right","bottom","left","useEns","formatEthAddress","CodePopover","ENSAvatar","FormattedJsonViewer","Address","props","address","chainId","data","ensData","shortenedAddress","avatar_url","undefined","Icon","twMerge","CodePopover","FormattedJsonViewer","Errors","props","errors","hasErrors","length","color","icon","text","content","Icon","CodePopover","FormattedJsonViewer","Operation","props","operationType","operationInput","Icon","CodePopover","FormattedJsonViewer","RevisionNumber","props","operationIndex","eventId","stateHash","revisionNumber","Icon","twMerge","CodePopover","FormattedJsonViewer","Signature","props","signatures","length","VerificationStatus","signatureCount","verifiedSignaturesCount","filter","signature","isVerified","signatureText","verificationStatusText","format","CodePopover","FormattedJsonViewer","Timestamp","props","timestampUtcMs","timestamp","timestampNumber","includes","parseInt","date","Date","shortDate","longDate","timestampFormatted","memo","Address","Errors","Operation","RevisionNumber","Signature","Timestamp","_Revision","props","Revision","Skip","props","operationIndex","skipCount","revisionNumber","skippedRevisions","makeRows","operations","revisionsAndSkips","seenDays","Set","operation","timestampUtcMs","day","split","has","add","push","type","height","operationIndex","index","eventId","id","stateHash","hash","operationType","action","operationInput","input","address","context","signer","user","chainId","signatures","makeSignatures","errors","error","undefined","skip","skipCount","getUniqueDatesInOrder","dates","date","Array","from","sort","a","b","Date","getTime","makeSignatureFromSignatureArray","signatureArray","signerAddress","prevStateHash","signatureBytes","isVerified","signaturesArray","map","Icon","format","Day","props","timestampUtcMs","timestamp","formattedDate","useVirtualizer","useMemo","useRef","Revision","Skip","makeRows","Day","ROW_INSET","DAY_MARKER_PULL","DAY_MARKER_OVERHANG","Timeline","props","operations","maxHeight","rows","parentRef","rowVirtualizer","count","length","getScrollElement","current","estimateSize","i","height","gap","overscan","overflowY","width","position","getTotalSize","marginLeft","getVirtualItems","map","virtualRow","row","index","key","top","left","right","size","transform","start","type","Pagination","usePagination","garbageCollect","sortOperations","useEffect","useMemo","useState","ConnectTooltipProvider","Header","Timeline","ScopedRevisionHistory","props","documentTitle","documentId","operations","isLoading","hasNextPage","onLoadNextPage","scopes","scope","onScopeChange","onClose","itemsPerPage","documentState","onCopyState","onCopyDocId","error","handle","window","setTimeout","clearTimeout","isWalking","length","visibleOperations","sort","a","b","index","pageItems","pages","goToPage","goToNextPage","goToPreviousPage","goToFirstPage","goToLastPage","hiddenNextPages","isNextPageAvailable","isPreviousPageAvailable","onChangeScope","nextScope","showPagination","PaginationComponent","hasOperations","message","LEGACY_SCOPES","noop","LegacyRevisionHistory","globalOperations","localOperations","common","setScope","RevisionHistory"],"sources":["../src/connect/components/revision-history/header/branch.tsx","../src/connect/components/revision-history/header/doc-id.tsx","../src/connect/components/revision-history/header/document-state.tsx","../src/connect/components/revision-history/header/scope.tsx","../src/connect/components/revision-history/header/header.tsx","../src/connect/components/code-popover.tsx","../src/connect/components/revision-history/revision/address.tsx","../src/connect/components/revision-history/revision/errors.tsx","../src/connect/components/revision-history/revision/operation.tsx","../src/connect/components/revision-history/revision/revision-number.tsx","../src/connect/components/revision-history/revision/signature.tsx","../src/connect/components/revision-history/revision/timestamp.tsx","../src/connect/components/revision-history/revision/revision.tsx","../src/connect/components/revision-history/skip/skip.tsx","../src/connect/components/revision-history/utils.ts","../src/connect/components/revision-history/timeline/day.tsx","../src/connect/components/revision-history/timeline/timeline.tsx","../src/connect/components/revision-history/revision-history.impl.tsx"],"sourcesContent":["import { Icon } from \"#design-system\";\n\ntype Props = {\n readonly branch?: string;\n};\nexport function Branch(props: Props) {\n const { branch = \"main\" } = props;\n\n return (\n <button className=\"flex h-8 w-fit items-center gap-1 rounded-lg bg-background pr-2 pl-1 text-xs text-foreground\">\n <Icon name=\"Branch\" />\n <span>BRANCH</span>\n <span className=\"text-foreground\">{branch}</span>\n </button>\n );\n}\n","import { Icon } from \"#design-system\";\nimport { useCopyToClipboard } from \"usehooks-ts\";\n\ntype Props = {\n readonly docId: string;\n readonly onCopy?: () => void;\n};\nexport function DocId(props: Props) {\n const { docId, onCopy } = props;\n const [, copy] = useCopyToClipboard();\n\n function handleCopy(text: string) {\n return () => {\n copy(text)\n .then(() => {\n onCopy?.();\n })\n .catch((error) => {\n console.error(\"Failed to copy!\", error);\n });\n };\n }\n\n return (\n <button\n className=\"flex h-8 w-fit items-center gap-1 rounded-lg bg-background pr-2 pl-1 text-xs text-foreground\"\n onClick={handleCopy(docId)}\n >\n <Icon name=\"Link\" />\n DOC ID\n <span className=\"text-foreground\">{docId}</span>\n </button>\n );\n}\n","import { Icon } from \"#design-system\";\nimport { useCopyToClipboard } from \"usehooks-ts\";\n\nexport type DocumentStateProps = {\n readonly documentState: object;\n readonly onCopyState?: () => void;\n};\n\nexport const DocumentState = (props: DocumentStateProps) => {\n const { documentState, onCopyState } = props;\n const [, copy] = useCopyToClipboard();\n\n function handleCopy() {\n const jsonState = JSON.stringify(documentState, null, 2);\n copy(jsonState)\n .then(() => {\n onCopyState?.();\n })\n .catch((error) => {\n console.error(\"Failed to copy document state!\", error);\n });\n }\n\n return (\n <button\n className=\"rounded-lg bg-background p-1 text-foreground\"\n onClick={handleCopy}\n >\n <Icon name=\"CurlyBrackets\" />\n </button>\n );\n};\n","import { ConnectSelect } from \"../../select/select.js\";\n\ntype Props = {\n readonly scopes: readonly string[];\n readonly value: string;\n readonly onChange: (value: string) => void;\n};\n\nfunction labelFor(scope: string) {\n return `${scope.charAt(0).toUpperCase()}${scope.slice(1)} scope`;\n}\n\nexport function Scope(props: Props) {\n const { scopes, value, onChange } = props;\n const items = scopes.map((scope) => ({\n displayValue: labelFor(scope),\n value: scope,\n }));\n\n return (\n <ConnectSelect\n absolutePositionMenu\n containerClassName=\"z-10 w-fit rounded-lg bg-background text-xs text-muted-foreground\"\n id=\"scope select\"\n itemClassName=\"grid grid-cols-[auto,auto] gap-1 py-2 text-muted-foreground\"\n items={items}\n menuClassName=\"min-w-0 text-muted-foreground\"\n onChange={onChange}\n value={value}\n />\n );\n}\n","import { Icon } from \"#design-system\";\nimport type { ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Branch } from \"./branch.js\";\nimport { DocId } from \"./doc-id.js\";\nimport { DocumentState } from \"./document-state.js\";\nimport { Scope } from \"./scope.js\";\n\ninterface Props extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n readonly title: ReactNode;\n readonly docId: string;\n readonly scope: string;\n readonly scopes: readonly string[];\n readonly onChangeScope: (scope: string) => void;\n readonly onClose: () => void;\n readonly documentState?: object;\n readonly onCopyState?: () => void;\n readonly onCopyDocId?: () => void;\n}\n\nexport function Header(props: Props) {\n const {\n title,\n docId,\n scope,\n scopes,\n onChangeScope,\n onClose,\n className,\n documentState,\n onCopyState,\n onCopyDocId,\n ...divProps\n } = props;\n return (\n <header\n className={twMerge(\n \"flex items-center justify-between bg-transparent\",\n className,\n )}\n {...divProps}\n >\n <div className=\"flex items-center gap-3\">\n <button\n name=\"close-revision-history\"\n className=\"rounded-lg bg-background p-1 text-foreground shadow-button\"\n onClick={onClose}\n >\n <Icon name=\"VariantArrowLeft\" />\n </button>\n <h1 className=\"text-xs text-foreground\">{title}</h1>\n </div>\n <div className=\"flex items-center gap-2\">\n <DocId docId={docId} onCopy={onCopyDocId} />\n {documentState && (\n <DocumentState\n documentState={documentState}\n onCopyState={onCopyState}\n />\n )}\n <Branch />\n <Scope onChange={onChangeScope} scopes={scopes} value={scope} />\n </div>\n </header>\n );\n}\n","import {\n Anchor,\n Content,\n Portal,\n Root,\n Trigger,\n} from \"@radix-ui/react-popover\";\nimport { useState, type ReactNode } from \"react\";\nimport { funnel } from \"remeda\";\n\n/* A hybrid popover / tooltip component intended for showing data that needs\n to show / hide on hover, while also being able to stay open so that the user can\n interact with its contents.\n\n Uses these rules:\n\n When the user hover's the trigger, show the tooltip / popover.\n Immediately place the content under the user's cursor.\n Then let the responsibility of closing the tooltip / popover be transferred _to the content_.\n When the user leaves _the contents_ or interacts elsewhere, only then close.\n*/\nexport function CodePopover(props: {\n content: ReactNode;\n trigger: ReactNode;\n anchor?: ReactNode;\n}) {\n const { content, trigger, anchor } = props;\n const [isOpen, setIsOpen] = useState(false);\n\n /* debounce calls to open by 300ms */\n const opener = funnel(() => setIsOpen(true), {\n triggerAt: \"start\",\n minQuietPeriodMs: 300,\n });\n\n /* debounce calls to close by 100ms */\n const closer = funnel(() => setIsOpen(false), {\n triggerAt: \"start\",\n minQuietPeriodMs: 100,\n });\n\n /* If we are in the process of closing, cancel that operation.\n Then call the opener.\n */\n function open() {\n closer.cancel();\n opener.call();\n }\n\n /* If we are in the process of opening, cancel that operation.\n Then call the closer.\n */\n function close() {\n opener.cancel();\n closer.call();\n }\n\n return (\n <Root\n /* This component combines internal state with the existing accessibility behaviors from the radix popover */\n open={isOpen}\n onOpenChange={(changedIsOpen) => (changedIsOpen ? open() : close())}\n >\n {/* Trigger only manages opening */}\n <Trigger onMouseEnter={open}>{trigger}</Trigger>\n {!!anchor && <Anchor asChild>{anchor}</Anchor>}\n <Portal>\n <Content\n /* We need to force mount so that the events are fired as expected */\n forceMount\n /* content only manages closing */\n onMouseLeave={close}\n /* Offset the position to ensure that we open under the user's cursor */\n sideOffset={-28}\n /* Do not focus the trigger after closing since that item is not interactive */\n onCloseAutoFocus={(e) => e.preventDefault()}\n /* Set an arbitrarily large bottom collision detection padding so that very long content flows below the fold */\n collisionPadding={{\n top: 24,\n right: 24,\n bottom: -10_000,\n left: 24,\n }}\n className=\"z-50 rounded-lg border border-border bg-popover p-2 text-xs text-popover-foreground shadow-tooltip outline-none\"\n >\n {content}\n </Content>\n </Portal>\n </Root>\n );\n}\n","import { useEns } from \"../../../hooks/use-ens.js\";\nimport { formatEthAddress } from \"../../../utils/address.js\";\nimport { CodePopover } from \"../../code-popover.js\";\nimport { ENSAvatar } from \"../../ens-avatar/ens-avatar.js\";\nimport { FormattedJsonViewer } from \"../../formatted-json-viewer.js\";\n\nexport type AddressProps = {\n readonly address: `0x${string}` | undefined;\n readonly chainId: number | undefined;\n};\n\nexport function Address(props: AddressProps) {\n const { address, chainId } = props;\n const { data: ensData } = useEns(address);\n\n if (!address) return null;\n\n const shortenedAddress = formatEthAddress(address);\n\n return (\n <CodePopover\n content={<FormattedJsonViewer value={{ address }} />}\n trigger={\n <span className=\"flex w-fit cursor-pointer items-center gap-1 rounded-lg bg-muted p-1 text-xs text-muted-foreground\">\n <ENSAvatar\n address={address}\n chainId={chainId}\n avatarUrl={ensData?.avatar_url ?? undefined}\n />\n {shortenedAddress}\n </span>\n }\n />\n );\n}\n","import { Icon } from \"#design-system\";\nimport { twMerge } from \"tailwind-merge\";\nimport { CodePopover } from \"../../code-popover.js\";\nimport { FormattedJsonViewer } from \"../../formatted-json-viewer.js\";\n\nexport type ErrorsProps = {\n readonly errors: string[] | undefined;\n};\n\nexport function Errors(props: ErrorsProps) {\n const { errors } = props;\n\n const hasErrors = !!errors?.length;\n\n const color = hasErrors ? \"text-destructive\" : \"text-success\";\n\n const icon = hasErrors ? (\n <Icon name=\"Exclamation\" size={16} />\n ) : (\n <Icon name=\"Check\" size={16} />\n );\n\n const text = hasErrors ? `Error: ${errors[0]}` : \"No errors\";\n\n const content = (\n <span\n className={twMerge(\n \"flex w-fit items-center rounded-lg border border-border bg-background px-2 py-1 text-xs\",\n color,\n hasErrors && \"cursor-pointer\",\n )}\n >\n {icon}\n <span className={twMerge(\"inline-block max-w-36 truncate\")}>{text}</span>\n </span>\n );\n\n if (hasErrors)\n return (\n <CodePopover\n content={<FormattedJsonViewer value={errors} />}\n trigger={content}\n />\n );\n\n return content;\n}\n","import { Icon } from \"#design-system\";\nimport { CodePopover } from \"../../code-popover.js\";\nimport { FormattedJsonViewer } from \"../../formatted-json-viewer.js\";\nexport type OperationProps = {\n readonly operationType: string;\n readonly operationInput: Record<string, any>;\n};\n\nexport function Operation(props: OperationProps) {\n const { operationType, operationInput } = props;\n return (\n <CodePopover\n content={<FormattedJsonViewer value={operationInput} />}\n trigger={\n <span className=\"flex cursor-pointer items-center gap-2 text-xs text-foreground\">\n {operationType}\n <Icon className=\"text-foreground\" name=\"Braces\" size={16} />\n </span>\n }\n />\n );\n}\n","import { Icon } from \"#design-system\";\nimport { CodePopover } from \"../../code-popover.js\";\nimport { FormattedJsonViewer } from \"../../formatted-json-viewer.js\";\n\nexport type RevisionNumberProps = {\n readonly operationIndex: number;\n readonly eventId: string;\n readonly stateHash: string;\n};\nexport function RevisionNumber(props: RevisionNumberProps) {\n const { operationIndex, eventId, stateHash } = props;\n const revisionNumber = operationIndex + 1;\n\n return (\n <CodePopover\n content={\n <FormattedJsonViewer\n value={{\n revisionNumber,\n eventId,\n stateHash,\n }}\n />\n }\n trigger={\n <span className=\"flex cursor-pointer items-center gap-2 text-xs text-foreground\">\n Revision {revisionNumber}.\n <a>\n <Icon\n className=\"cursor-pointer text-foreground\"\n name=\"Ellipsis\"\n size={14}\n />\n </a>\n </span>\n }\n />\n );\n}\n","import { Icon } from \"#design-system\";\nimport { twMerge } from \"tailwind-merge\";\nimport { CodePopover } from \"../../code-popover.js\";\nimport { FormattedJsonViewer } from \"../../formatted-json-viewer.js\";\nimport type { Signature } from \"../types.js\";\n\nexport type SignatureProps = {\n readonly signatures: Signature[] | undefined;\n};\nexport function Signature(props: SignatureProps) {\n const { signatures } = props;\n\n if (!signatures?.length) return null;\n\n return (\n <CodePopover\n trigger={\n <span className=\"flex w-fit cursor-pointer items-center gap-1 rounded-lg border border-border bg-background px-2 py-1\">\n <VerificationStatus signatures={signatures} />{\" \"}\n <Icon className=\"text-foreground\" name=\"InfoSquare\" size={16} />\n </span>\n }\n content={<FormattedJsonViewer value={signatures} collapsed={1} />}\n />\n );\n}\n\nfunction VerificationStatus(props: SignatureProps) {\n const { signatures } = props;\n\n if (!signatures?.length) return null;\n\n const signatureCount = signatures.length;\n\n const verifiedSignaturesCount = signatures.filter(\n (signature) => signature.isVerified,\n ).length;\n const signatureText = signatureCount === 1 ? \"signature\" : \"signatures\";\n const verificationStatusText = `${verifiedSignaturesCount}/${signatureCount} ${signatureText} verified`;\n\n return (\n <span\n className={twMerge(\n `text-xs`,\n verifiedSignaturesCount === 0\n ? \"text-destructive\"\n : verifiedSignaturesCount === signatureCount\n ? \"text-success\"\n : \"text-warning\",\n )}\n >\n {verificationStatusText}\n </span>\n );\n}\n","import { format } from \"date-fns\";\nimport { CodePopover } from \"../../code-popover.js\";\nimport { FormattedJsonViewer } from \"../../formatted-json-viewer.js\";\n\nexport type TimestampProps = {\n readonly timestampUtcMs: number | string;\n};\n\nexport function Timestamp(props: TimestampProps) {\n const { timestampUtcMs: timestamp } = props;\n\n const timestampNumber =\n typeof timestamp === \"string\" && !timestamp.includes(\"-\")\n ? parseInt(timestamp)\n : timestamp;\n\n const date = new Date(timestampNumber);\n const shortDate = format(date, \"HH:mm 'UTC'\");\n const longDate = format(date, \"eee, dd MMM yyyy HH:mm:ss 'UTC'\");\n\n return (\n <CodePopover\n content={\n <FormattedJsonViewer\n value={{ timestampFormatted: longDate, timestampUtcMs: timestamp }}\n />\n }\n trigger={\n <span className=\"cursor-pointer text-xs text-foreground\">\n committed at {shortDate}\n </span>\n }\n />\n );\n}\n","import { memo } from \"react\";\nimport type { Revision as RevisionProps } from \"../types.js\";\nimport { Address } from \"./address.js\";\nimport { Errors } from \"./errors.js\";\nimport { Operation } from \"./operation.js\";\nimport { RevisionNumber } from \"./revision-number.js\";\nimport { Signature } from \"./signature.js\";\nimport { Timestamp } from \"./timestamp.js\";\n\nexport function _Revision(props: RevisionProps) {\n return (\n <article className=\"flex items-center justify-between rounded-xl border border-border bg-background px-4 py-2\">\n <div className=\"flex items-center gap-2\">\n <RevisionNumber {...props} />\n <Operation {...props} />\n <Address {...props} />\n <Timestamp {...props} />\n </div>\n <div className=\"flex items-center gap-1\">\n <Signature {...props} />\n <Errors {...props} />\n </div>\n </article>\n );\n}\n\nexport const Revision = memo(_Revision);\n","export type SkipProps = {\n readonly operationIndex: number;\n readonly skipCount: number;\n};\n\nexport function Skip(props: SkipProps) {\n const { operationIndex, skipCount } = props;\n const revisionNumber = operationIndex;\n\n const skippedRevisions =\n skipCount === 1\n ? `${revisionNumber}`\n : `${revisionNumber} - ${revisionNumber + 1 - skipCount}`;\n\n return (\n <article className=\"grid grid-cols-[1fr,auto,1fr] items-center py-2\">\n <div className=\"h-px rounded-full bg-muted\" />\n <div className=\"mx-3 text-xs text-foreground\">\n [Skipped Revision {skippedRevisions}]\n </div>\n <div className=\"h-px rounded-full bg-muted\" />\n </article>\n );\n}\n","import type { Operation } from \"@powerhousedao/shared/document-model\";\nimport type { Day, Revision, Signature, Skip } from \"./types.js\";\n\nexport function makeRows(operations: Operation[]) {\n const revisionsAndSkips: (Revision | Skip | Day)[] = [];\n const seenDays = new Set<string>();\n\n for (const operation of operations) {\n if (!operation.timestampUtcMs) continue;\n const day = operation.timestampUtcMs.split(\"T\")[0];\n\n if (!seenDays.has(day)) {\n seenDays.add(day);\n revisionsAndSkips.push({\n type: \"day\",\n height: 32,\n timestampUtcMs: day,\n });\n }\n\n revisionsAndSkips.push({\n type: \"revision\",\n height: 46,\n operationIndex: operation.index,\n eventId: operation.id ?? \"EVENT_ID_NOT_FOUND\",\n stateHash: operation.hash,\n operationType: operation.action.type,\n operationInput: operation.action.input ?? {},\n address: operation.action?.context?.signer?.user.address as\n | `0x${string}`\n | undefined,\n chainId: operation.action?.context?.signer?.user.chainId,\n timestampUtcMs: operation.timestampUtcMs,\n signatures: makeSignatures(\n (operation.action?.context?.signer?.signatures as\n | string[][]\n | undefined) ?? [],\n ),\n errors: operation.error ? [operation.error] : undefined,\n });\n\n if (operation.skip > 0) {\n revisionsAndSkips.push({\n type: \"skip\",\n height: 34,\n operationIndex: operation.index,\n skipCount: operation.skip,\n timestampUtcMs: operation.timestampUtcMs,\n });\n }\n }\n\n return revisionsAndSkips;\n}\n\nexport function getUniqueDatesInOrder(operations: Operation[]) {\n const dates = new Set<string>();\n\n for (const operation of operations) {\n if (!operation.timestampUtcMs) continue;\n const date = operation.timestampUtcMs.split(\"T\")[0];\n dates.add(date);\n }\n\n return Array.from(dates).sort(\n (a, b) => new Date(b).getTime() - new Date(a).getTime(),\n );\n}\n\nfunction makeSignatureFromSignatureArray(signatureArray: string[]): Signature {\n const [signerAddress, hash, prevStateHash, signatureBytes] = signatureArray;\n\n return {\n signerAddress,\n hash,\n prevStateHash,\n signatureBytes,\n isVerified: true,\n };\n}\n\nfunction makeSignatures(signaturesArray: string[][] | undefined) {\n return signaturesArray?.map(makeSignatureFromSignatureArray);\n}\n","import { Icon } from \"#design-system\";\nimport { format } from \"date-fns\";\n\nexport function Day(props: { readonly timestampUtcMs: string }) {\n const { timestampUtcMs: timestamp } = props;\n const formattedDate = format(timestamp, \"MMM dd, yyyy\");\n return (\n <h2 className=\"-ml-6 flex items-center gap-1 bg-background py-2 text-xs text-foreground\">\n <Icon name=\"Ring\" size={16} /> Changes on {formattedDate}\n </h2>\n );\n}\n","import type { Operation } from \"@powerhousedao/shared/document-model\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { useMemo, useRef } from \"react\";\nimport { Revision } from \"../revision/revision.js\";\nimport { Skip } from \"../skip/skip.js\";\nimport { makeRows } from \"../utils.js\";\nimport { Day } from \"./day.js\";\n\n/** How far each row is indented from the timeline's vertical line. */\nconst ROW_INSET = 16;\n\n/**\n * How far the day header is pulled back out again, so its ring sits centred\n * on the line rather than beside it: the `-ml-6` in `Day`.\n */\nconst DAY_MARKER_PULL = 24;\n\n/**\n * How far the line is inset from the scroll container's clip edge -- exactly\n * the amount the day marker hangs past it (24 pulled back from a 16 inset\n * leaves 8 on the wrong side of zero). Without this the ring is sliced in\n * half, since a scrolling box clips on both axes.\n */\nconst DAY_MARKER_OVERHANG = DAY_MARKER_PULL - ROW_INSET;\n\nexport type TimelineProps = {\n readonly operations: readonly Operation[];\n /**\n * Height cap for the scroll area. The virtualizer needs a viewport it can\n * scroll within; any CSS length works, and the default keeps the panel's\n * header and pagination reachable without scrolling past the timeline.\n */\n readonly maxHeight?: number | string;\n};\n\n/**\n * The revision timeline, windowed by row.\n *\n * The scroll element and the content are deliberately two different\n * elements. A virtualizer decides what is visible by comparing its scroll\n * element's viewport against the total content size, so a scroll element\n * sized to the content is a viewport that shows everything at once: it never\n * scrolls, every row is \"visible\", and the whole page renders while still\n * paying the virtualizer's bookkeeping. The outer element here is therefore\n * bounded and scrollable, and the inner sizer carries the full height that\n * the absolutely positioned rows are placed within.\n */\nexport function Timeline(props: TimelineProps) {\n const { operations, maxHeight = \"70vh\" } = props;\n const rows = useMemo(() => makeRows([...operations]), [operations]);\n\n const parentRef = useRef<HTMLDivElement>(null);\n\n const rowVirtualizer = useVirtualizer({\n count: rows.length,\n getScrollElement: () => parentRef.current,\n // Optional chaining, not rows[i].height: a shrinking list re-renders\n // before the virtualizer has re-measured, so this can be asked about an\n // index the new array no longer has.\n estimateSize: (i) => rows[i]?.height ?? 0,\n gap: 8,\n // A few rows either side so scrolling reveals rendered content rather\n // than blank space.\n overscan: 8,\n });\n\n return (\n <div\n data-testid=\"revision-timeline\"\n ref={parentRef}\n style={{\n maxHeight,\n overflowY: \"auto\",\n width: \"100%\",\n position: \"relative\",\n }}\n >\n {/*\n * The vertical line lives here rather than on the scroll container, and\n * is inset by the day marker's overhang. A scroll container clips at its\n * padding box on both axes -- setting overflow-y to auto forces\n * overflow-x from visible to auto -- so anything hanging off the line's\n * left would be cut, which is exactly what the day marker does.\n */}\n <div\n className=\"border-l border-border dark:border-none\"\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n marginLeft: DAY_MARKER_OVERHANG,\n position: \"relative\",\n }}\n >\n {rowVirtualizer.getVirtualItems().map((virtualRow) => {\n const row = rows[virtualRow.index];\n if (!row) return null;\n\n return (\n <div\n key={virtualRow.key}\n style={{\n position: \"absolute\",\n top: 0,\n left: ROW_INSET,\n // `right`, not `width: 100%`: a full-width row offset by\n // ROW_INSET runs that far past the line's right edge, which\n // the same clipping turns into a horizontal scrollbar.\n right: 0,\n height: `${virtualRow.size}px`,\n transform: `translateY(${virtualRow.start}px)`,\n }}\n >\n {row.type === \"revision\" && <Revision {...row} />}\n {row.type === \"skip\" && <Skip {...row} />}\n {row.type === \"day\" && <Day {...row} />}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { Pagination, usePagination } from \"#design-system\";\nimport type { Operation } from \"@powerhousedao/shared/document-model\";\nimport {\n garbageCollect,\n sortOperations,\n} from \"@powerhousedao/shared/document-model\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { ConnectTooltipProvider } from \"../tooltip/tooltip.js\";\nimport { Header } from \"./header/header.js\";\nimport { Timeline } from \"./timeline/timeline.js\";\n\ntype CommonProps = {\n readonly documentTitle: string;\n readonly documentId: string;\n readonly onClose: () => void;\n readonly itemsPerPage?: number;\n readonly documentState?: object;\n readonly onCopyState?: () => void;\n readonly onCopyDocId?: () => void;\n};\n\n/** The current, scoped props. */\nexport type RevisionHistoryScopedProps = CommonProps & {\n /** The operations of the selected scope loaded so far, in any order. */\n readonly operations: readonly Operation[];\n /** A page of operations is being fetched. */\n readonly isLoading: boolean;\n /** More operations exist beyond the loaded ones. */\n readonly hasNextPage: boolean;\n /**\n * Called by the component whenever it can take the next page.\n * Must be referentially stable (for example the hook's `fetchNextPage`);\n * an inline arrow re-fires the effect every render.\n */\n readonly onLoadNextPage: () => void;\n /** The scopes offered in the selector, for example the keys of `document.header.revision`. */\n readonly scopes: readonly string[];\n /** The selected scope. */\n readonly scope: string;\n readonly onScopeChange: (scope: string) => void;\n /**\n * The last page failed. Operations loaded so far are still shown, and the\n * walk stops asking for more; there is no retry from inside the component.\n */\n readonly error?: Error;\n};\n\n/**\n * Legacy props: the whole global and local history, toggled inside the\n * component.\n * @deprecated Pass one scope's `operations` with `scopes`/`scope`/`onScopeChange` and the loading props. Removed in the next major.\n */\nexport type RevisionHistoryLegacyProps = CommonProps & {\n readonly globalOperations: readonly Operation[];\n readonly localOperations: readonly Operation[];\n};\n\nexport type RevisionHistoryProps =\n | RevisionHistoryScopedProps\n | RevisionHistoryLegacyProps;\n\n/**\n * The revision history panel. Pages arrive oldest first while the timeline\n * renders newest first, so rendering progressively would show operations in\n * the wrong order until the last page landed and would repaint the whole\n * timeline on every page in between. Instead the component keeps asking for\n * the next page, showing \"Loading operations…\" and a running count, until\n * the walk completes, then renders the pagination and timeline once.\n */\nfunction ScopedRevisionHistory(props: RevisionHistoryScopedProps) {\n const {\n documentTitle,\n documentId,\n operations,\n isLoading,\n hasNextPage,\n onLoadNextPage,\n scopes,\n scope,\n onScopeChange,\n onClose,\n itemsPerPage = 100,\n documentState,\n onCopyState,\n onCopyDocId,\n error,\n } = props;\n\n useEffect(() => {\n if (!hasNextPage || isLoading || error) return;\n // Deferred: the cache's fetch and the useSyncExternalStore-driven render\n // it triggers are both synchronous, so calling onLoadNextPage here\n // directly would chain fetch -> render -> effect -> fetch into one\n // uninterrupted task; setTimeout(0) yields so the status line paints and\n // the close button stays responsive between pages.\n const handle = window.setTimeout(onLoadNextPage, 0);\n return () => window.clearTimeout(handle);\n }, [hasNextPage, isLoading, onLoadNextPage, error]);\n\n // The history is incomplete: still fetching pages, or waiting on the very\n // first one. While true, nothing is rendered but the progress status. A\n // failed page ends the walk instead of latching this forever: we render\n // what loaded and a short failure line rather than spinning with no retry.\n const isWalking =\n !error && (hasNextPage || (isLoading && operations.length === 0));\n\n const visibleOperations = useMemo(\n () =>\n isWalking\n ? []\n : garbageCollect(sortOperations([...operations])).sort(\n (a, b) => b.index - a.index,\n ),\n [operations, isWalking],\n );\n\n const {\n pageItems,\n pages,\n goToPage,\n goToNextPage,\n goToPreviousPage,\n goToFirstPage,\n goToLastPage,\n hiddenNextPages,\n isNextPageAvailable,\n isPreviousPageAvailable,\n } = usePagination(visibleOperations, {\n itemsPerPage,\n });\n\n function onChangeScope(nextScope: string) {\n goToFirstPage();\n onScopeChange(nextScope);\n }\n\n const showPagination = visibleOperations.length > itemsPerPage;\n\n const PaginationComponent = showPagination ? (\n <div className=\"mt-4 flex w-full justify-end\">\n <Pagination\n firstPageLabel=\"First Page\"\n goToFirstPage={goToFirstPage}\n goToLastPage={goToLastPage}\n goToNextPage={goToNextPage}\n goToPage={goToPage}\n goToPreviousPage={goToPreviousPage}\n hiddenNextPages={hiddenNextPages}\n isNextPageAvailable={isNextPageAvailable}\n isPreviousPageAvailable={isPreviousPageAvailable}\n lastPageLabel=\"Last Page\"\n nextPageLabel=\"Next\"\n pages={pages}\n previousPageLabel=\"Previous\"\n />\n </div>\n ) : (\n <hr className=\"h-12 border-none\" />\n );\n\n const hasOperations = visibleOperations.length > 0;\n\n return (\n <ConnectTooltipProvider>\n <div className=\"p-6\">\n <Header\n docId={documentId}\n onChangeScope={onChangeScope}\n onClose={onClose}\n scope={scope}\n scopes={scopes}\n title={documentTitle}\n documentState={documentState}\n onCopyState={onCopyState}\n onCopyDocId={onCopyDocId}\n />\n {isWalking ? (\n <div className=\"mt-4 flex flex-col items-center rounded-md bg-background p-4\">\n <h3 className=\"my-40 text-foreground\">Loading operations…</h3>\n {operations.length > 0 && (\n <p className=\"text-xs text-muted-foreground\">\n {operations.length} loaded so far\n </p>\n )}\n </div>\n ) : (\n <>\n {PaginationComponent}\n <div className=\"mt-4 flex flex-col items-center rounded-md bg-background p-4\">\n {error && (\n <p className=\"mb-2 text-xs text-destructive\">\n Could not load the rest of the history: {error.message}\n </p>\n )}\n {hasOperations ? (\n <div className=\"grid grid-cols-[minmax(min-content,1018px)]\">\n <Timeline operations={pageItems} />\n </div>\n ) : error ? null : (\n <h3 className=\"my-40 text-foreground\">\n This document has no recorded operations yet.\n </h3>\n )}\n </div>\n {PaginationComponent}\n </>\n )}\n </div>\n </ConnectTooltipProvider>\n );\n}\n\nconst LEGACY_SCOPES = [\"global\", \"local\"] as const;\nconst noop = () => {\n /* the legacy form has already loaded the whole history */\n};\n\n/** Toggles between the whole global and local history loaded up front. */\nfunction LegacyRevisionHistory(props: RevisionHistoryLegacyProps) {\n const { globalOperations, localOperations, ...common } = props;\n const [scope, setScope] = useState<string>(\"global\");\n return (\n <ScopedRevisionHistory\n {...common}\n operations={scope === \"local\" ? localOperations : globalOperations}\n isLoading={false}\n hasNextPage={false}\n onLoadNextPage={noop}\n scopes={LEGACY_SCOPES}\n scope={scope}\n onScopeChange={setScope}\n />\n );\n}\n\n/**\n * The revision history panel. Pages arrive oldest first while the timeline\n * renders newest first, so it waits for the whole history to load before\n * rendering the timeline, showing \"Loading operations…\" and a running count\n * in the meantime.\n *\n * Also accepts the deprecated `globalOperations`/`localOperations` pair\n * (see `RevisionHistoryLegacyProps`), toggling between them internally.\n */\nexport function RevisionHistory(props: RevisionHistoryProps) {\n return \"globalOperations\" in props ? (\n <LegacyRevisionHistory {...props} />\n ) : (\n <ScopedRevisionHistory {...props} />\n );\n}\n"],"mappings":"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"}
|