@oanda/labs-crowd-view-widget 1.0.3 → 1.0.4

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 (33) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/main/CrowdViewWidget/Main.js +5 -1
  3. package/dist/main/CrowdViewWidget/Main.js.map +1 -1
  4. package/dist/main/CrowdViewWidget/components/Legend/Legend.js +32 -0
  5. package/dist/main/CrowdViewWidget/components/Legend/Legend.js.map +1 -0
  6. package/dist/main/CrowdViewWidget/components/Legend/LegendBar.js +41 -0
  7. package/dist/main/CrowdViewWidget/components/Legend/LegendBar.js.map +1 -0
  8. package/dist/main/CrowdViewWidget/components/Legend/index.js +28 -0
  9. package/dist/main/CrowdViewWidget/components/Legend/index.js.map +1 -0
  10. package/dist/main/CrowdViewWidget/components/index.js +17 -0
  11. package/dist/main/CrowdViewWidget/components/index.js.map +1 -0
  12. package/dist/module/CrowdViewWidget/Main.js +5 -1
  13. package/dist/module/CrowdViewWidget/Main.js.map +1 -1
  14. package/dist/module/CrowdViewWidget/components/Legend/Legend.js +24 -0
  15. package/dist/module/CrowdViewWidget/components/Legend/Legend.js.map +1 -0
  16. package/dist/module/CrowdViewWidget/components/Legend/LegendBar.js +33 -0
  17. package/dist/module/CrowdViewWidget/components/Legend/LegendBar.js.map +1 -0
  18. package/dist/module/CrowdViewWidget/components/Legend/index.js +3 -0
  19. package/dist/module/CrowdViewWidget/components/Legend/index.js.map +1 -0
  20. package/dist/module/CrowdViewWidget/components/index.js +2 -0
  21. package/dist/module/CrowdViewWidget/components/index.js.map +1 -0
  22. package/dist/types/CrowdViewWidget/components/Legend/Legend.d.ts +7 -0
  23. package/dist/types/CrowdViewWidget/components/Legend/LegendBar.d.ts +9 -0
  24. package/dist/types/CrowdViewWidget/components/Legend/index.d.ts +2 -0
  25. package/dist/types/CrowdViewWidget/components/index.d.ts +1 -0
  26. package/package.json +3 -3
  27. package/src/CrowdViewWidget/Main.tsx +6 -0
  28. package/src/CrowdViewWidget/components/Legend/Legend.tsx +20 -0
  29. package/src/CrowdViewWidget/components/Legend/LegendBar.tsx +48 -0
  30. package/src/CrowdViewWidget/components/Legend/index.ts +2 -0
  31. package/src/CrowdViewWidget/components/index.ts +1 -0
  32. package/test/components/Legend.test.tsx +26 -0
  33. package/test/components/LegendBar.test.tsx +34 -0
package/CHANGELOG.md CHANGED
@@ -3,6 +3,26 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## 1.0.4 (2025-04-10)
7
+
8
+
9
+
10
+ ## 1.0.185 (2025-04-09)
11
+
12
+
13
+
14
+ ## 1.0.184 (2025-04-08)
15
+
16
+
17
+
18
+ ## 1.0.183 (2025-04-04)
19
+
20
+ **Note:** Version bump only for package @oanda/labs-crowd-view-widget
21
+
22
+
23
+
24
+
25
+
6
26
  ## 1.0.3 (2025-04-09)
7
27
 
8
28
 
@@ -8,6 +8,7 @@ var _labsWidgetCommon = require("@oanda/labs-widget-common");
8
8
  var _monoI18n = require("@oanda/mono-i18n");
9
9
  var _react = _interopRequireWildcard(require("react"));
10
10
  var _graphql = require("../gql/types/graphql");
11
+ var _components = require("./components");
11
12
  var _config = require("./config");
12
13
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
13
14
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
@@ -59,7 +60,10 @@ const Main = _ref => {
59
60
  selectLabel: lang('granularity'),
60
61
  selectedOption: granularity,
61
62
  setSelectedOption: val => setGranularity(val)
62
- }))), _react.default.createElement(_labsWidgetCommon.WidgetError, null)));
63
+ }))), _react.default.createElement(_labsWidgetCommon.WidgetError, null), _react.default.createElement(_components.Legend, {
64
+ longValues: [0.15, 0.25, 0.4, 0.55],
65
+ shortValues: [0.15, 0.25, 0.4, 0.55]
66
+ })));
63
67
  };
64
68
  exports.Main = Main;
65
69
  //# sourceMappingURL=Main.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Main.js","names":["_labsWidgetCommon","require","_monoI18n","_react","_interopRequireWildcard","_graphql","_config","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","Main","_ref","division","instrumentSelectConfigWithDivision","Division","Oc","instrumentSelectConfigOC","instrumentSelectConfig","size","useLayoutProvider","isDesktop","Size","DESKTOP","bookType","setBookType","useState","BookType","Order","instrument","setInstrument","granularity","setGranularity","granularitySelectConfig","lang","useLocale","createElement","Fragment","className","Tabs","mobileFullWidth","activeTab","handleClick","currentTarget","value","items","navigationConfig","labelCallback","cn","Select","options","searchPlaceholder","selectLabel","selectedOption","setSelectedOption","val","WidgetError","exports"],"sources":["../../../src/CrowdViewWidget/Main.tsx"],"sourcesContent":["import {\n cn,\n Select,\n Size,\n Tabs,\n useLayoutProvider,\n WidgetError,\n} from '@oanda/labs-widget-common';\nimport { useLocale } from '@oanda/mono-i18n';\nimport React, { useState } from 'react';\n\nimport { BookType, Division } from '../gql/types/graphql';\nimport {\n granularitySelectConfig,\n instrumentSelectConfig,\n instrumentSelectConfigOC,\n navigationConfig,\n} from './config';\nimport type { GranularityId, InstrumentId, MainProps } from './types';\n\nconst Main = ({ division }: MainProps) => {\n const instrumentSelectConfigWithDivision =\n division === Division.Oc\n ? instrumentSelectConfigOC\n : instrumentSelectConfig;\n\n const { size } = useLayoutProvider();\n const isDesktop = size === Size.DESKTOP;\n const [bookType, setBookType] = useState(BookType.Order);\n const [instrument, setInstrument] = useState(\n instrumentSelectConfigWithDivision[0]\n );\n const [granularity, setGranularity] = useState(granularitySelectConfig[0]);\n const { lang } = useLocale();\n\n return (\n <>\n {size && (\n <div\n className=\"lw-text-sm lw-tracking-normal\"\n data-testid=\"crowd-view-widget\"\n >\n <Tabs\n mobileFullWidth\n activeTab={bookType}\n handleClick={(e) => setBookType(e.currentTarget.value as BookType)}\n items={navigationConfig}\n labelCallback={lang}\n />\n <div className=\"lw-mb-6 lw-mt-12 lw-flex\">\n <div\n className={cn('lw-mr-2', {\n 'lw-w-full': !isDesktop,\n 'lw-w-[280px]': isDesktop,\n })}\n >\n <Select\n options={instrumentSelectConfigWithDivision}\n searchPlaceholder={lang('search')}\n selectLabel={lang('instrument')}\n selectedOption={instrument}\n setSelectedOption={(val) =>\n setInstrument(val as { id: InstrumentId; label: string })\n }\n />\n </div>\n <div\n className={cn({\n 'lw-w-full': !isDesktop,\n 'lw-w-[280px]': isDesktop,\n })}\n >\n <Select\n options={granularitySelectConfig}\n searchPlaceholder={lang('search')}\n selectLabel={lang('granularity')}\n selectedOption={granularity}\n setSelectedOption={(val) =>\n setGranularity(val as { id: GranularityId; label: string })\n }\n />\n </div>\n </div>\n <WidgetError />\n </div>\n )}\n </>\n );\n};\n\nexport { Main };\n"],"mappings":";;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA;AAQA,IAAAC,SAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAC,uBAAA,CAAAH,OAAA;AAEA,IAAAI,QAAA,GAAAJ,OAAA;AACA,IAAAK,OAAA,GAAAL,OAAA;AAKkB,SAAAM,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAJ,wBAAAI,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAGlB,MAAMW,IAAI,GAAGC,IAAA,IAA6B;EAAA,IAA5B;IAAEC;EAAoB,CAAC,GAAAD,IAAA;EACnC,MAAME,kCAAkC,GACtCD,QAAQ,KAAKE,iBAAQ,CAACC,EAAE,GACpBC,gCAAwB,GACxBC,8BAAsB;EAE5B,MAAM;IAAEC;EAAK,CAAC,GAAG,IAAAC,mCAAiB,EAAC,CAAC;EACpC,MAAMC,SAAS,GAAGF,IAAI,KAAKG,sBAAI,CAACC,OAAO;EACvC,MAAM,CAACC,QAAQ,EAAEC,WAAW,CAAC,GAAG,IAAAC,eAAQ,EAACC,iBAAQ,CAACC,KAAK,CAAC;EACxD,MAAM,CAACC,UAAU,EAAEC,aAAa,CAAC,GAAG,IAAAJ,eAAQ,EAC1CZ,kCAAkC,CAAC,CAAC,CACtC,CAAC;EACD,MAAM,CAACiB,WAAW,EAAEC,cAAc,CAAC,GAAG,IAAAN,eAAQ,EAACO,+BAAuB,CAAC,CAAC,CAAC,CAAC;EAC1E,MAAM;IAAEC;EAAK,CAAC,GAAG,IAAAC,mBAAS,EAAC,CAAC;EAE5B,OACEhD,MAAA,CAAAU,OAAA,CAAAuC,aAAA,CAAAjD,MAAA,CAAAU,OAAA,CAAAwC,QAAA,QACGlB,IAAI,IACHhC,MAAA,CAAAU,OAAA,CAAAuC,aAAA;IACEE,SAAS,EAAC,+BAA+B;IACzC,eAAY;EAAmB,GAE/BnD,MAAA,CAAAU,OAAA,CAAAuC,aAAA,CAACpD,iBAAA,CAAAuD,IAAI;IACHC,eAAe;IACfC,SAAS,EAAEjB,QAAS;IACpBkB,WAAW,EAAGlD,CAAC,IAAKiC,WAAW,CAACjC,CAAC,CAACmD,aAAa,CAACC,KAAiB,CAAE;IACnEC,KAAK,EAAEC,wBAAiB;IACxBC,aAAa,EAAEb;EAAK,CACrB,CAAC,EACF/C,MAAA,CAAAU,OAAA,CAAAuC,aAAA;IAAKE,SAAS,EAAC;EAA0B,GACvCnD,MAAA,CAAAU,OAAA,CAAAuC,aAAA;IACEE,SAAS,EAAE,IAAAU,oBAAE,EAAC,SAAS,EAAE;MACvB,WAAW,EAAE,CAAC3B,SAAS;MACvB,cAAc,EAAEA;IAClB,CAAC;EAAE,GAEHlC,MAAA,CAAAU,OAAA,CAAAuC,aAAA,CAACpD,iBAAA,CAAAiE,MAAM;IACLC,OAAO,EAAEpC,kCAAmC;IAC5CqC,iBAAiB,EAAEjB,IAAI,CAAC,QAAQ,CAAE;IAClCkB,WAAW,EAAElB,IAAI,CAAC,YAAY,CAAE;IAChCmB,cAAc,EAAExB,UAAW;IAC3ByB,iBAAiB,EAAGC,GAAG,IACrBzB,aAAa,CAACyB,GAA0C;EACzD,CACF,CACE,CAAC,EACNpE,MAAA,CAAAU,OAAA,CAAAuC,aAAA;IACEE,SAAS,EAAE,IAAAU,oBAAE,EAAC;MACZ,WAAW,EAAE,CAAC3B,SAAS;MACvB,cAAc,EAAEA;IAClB,CAAC;EAAE,GAEHlC,MAAA,CAAAU,OAAA,CAAAuC,aAAA,CAACpD,iBAAA,CAAAiE,MAAM;IACLC,OAAO,EAAEjB,+BAAwB;IACjCkB,iBAAiB,EAAEjB,IAAI,CAAC,QAAQ,CAAE;IAClCkB,WAAW,EAAElB,IAAI,CAAC,aAAa,CAAE;IACjCmB,cAAc,EAAEtB,WAAY;IAC5BuB,iBAAiB,EAAGC,GAAG,IACrBvB,cAAc,CAACuB,GAA2C;EAC3D,CACF,CACE,CACF,CAAC,EACNpE,MAAA,CAAAU,OAAA,CAAAuC,aAAA,CAACpD,iBAAA,CAAAwE,WAAW,MAAE,CACX,CAEP,CAAC;AAEP,CAAC;AAACC,OAAA,CAAA9C,IAAA,GAAAA,IAAA","ignoreList":[]}
1
+ {"version":3,"file":"Main.js","names":["_labsWidgetCommon","require","_monoI18n","_react","_interopRequireWildcard","_graphql","_components","_config","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","Main","_ref","division","instrumentSelectConfigWithDivision","Division","Oc","instrumentSelectConfigOC","instrumentSelectConfig","size","useLayoutProvider","isDesktop","Size","DESKTOP","bookType","setBookType","useState","BookType","Order","instrument","setInstrument","granularity","setGranularity","granularitySelectConfig","lang","useLocale","createElement","Fragment","className","Tabs","mobileFullWidth","activeTab","handleClick","currentTarget","value","items","navigationConfig","labelCallback","cn","Select","options","searchPlaceholder","selectLabel","selectedOption","setSelectedOption","val","WidgetError","Legend","longValues","shortValues","exports"],"sources":["../../../src/CrowdViewWidget/Main.tsx"],"sourcesContent":["import {\n cn,\n Select,\n Size,\n Tabs,\n useLayoutProvider,\n WidgetError,\n} from '@oanda/labs-widget-common';\nimport { useLocale } from '@oanda/mono-i18n';\nimport React, { useState } from 'react';\n\nimport { BookType, Division } from '../gql/types/graphql';\nimport { Legend } from './components';\nimport {\n granularitySelectConfig,\n instrumentSelectConfig,\n instrumentSelectConfigOC,\n navigationConfig,\n} from './config';\nimport type { GranularityId, InstrumentId, MainProps } from './types';\n\nconst Main = ({ division }: MainProps) => {\n const instrumentSelectConfigWithDivision =\n division === Division.Oc\n ? instrumentSelectConfigOC\n : instrumentSelectConfig;\n\n const { size } = useLayoutProvider();\n const isDesktop = size === Size.DESKTOP;\n const [bookType, setBookType] = useState(BookType.Order);\n const [instrument, setInstrument] = useState(\n instrumentSelectConfigWithDivision[0]\n );\n const [granularity, setGranularity] = useState(granularitySelectConfig[0]);\n const { lang } = useLocale();\n\n return (\n <>\n {size && (\n <div\n className=\"lw-text-sm lw-tracking-normal\"\n data-testid=\"crowd-view-widget\"\n >\n <Tabs\n mobileFullWidth\n activeTab={bookType}\n handleClick={(e) => setBookType(e.currentTarget.value as BookType)}\n items={navigationConfig}\n labelCallback={lang}\n />\n <div className=\"lw-mb-6 lw-mt-12 lw-flex\">\n <div\n className={cn('lw-mr-2', {\n 'lw-w-full': !isDesktop,\n 'lw-w-[280px]': isDesktop,\n })}\n >\n <Select\n options={instrumentSelectConfigWithDivision}\n searchPlaceholder={lang('search')}\n selectLabel={lang('instrument')}\n selectedOption={instrument}\n setSelectedOption={(val) =>\n setInstrument(val as { id: InstrumentId; label: string })\n }\n />\n </div>\n <div\n className={cn({\n 'lw-w-full': !isDesktop,\n 'lw-w-[280px]': isDesktop,\n })}\n >\n <Select\n options={granularitySelectConfig}\n searchPlaceholder={lang('search')}\n selectLabel={lang('granularity')}\n selectedOption={granularity}\n setSelectedOption={(val) =>\n setGranularity(val as { id: GranularityId; label: string })\n }\n />\n </div>\n </div>\n <WidgetError />\n\n <Legend\n longValues={[0.15, 0.25, 0.4, 0.55]}\n shortValues={[0.15, 0.25, 0.4, 0.55]}\n />\n </div>\n )}\n </>\n );\n};\n\nexport { Main };\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Legend = void 0;
7
+ var _monoI18n = require("@oanda/mono-i18n");
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _LegendBar = require("./LegendBar");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ const Legend = _ref => {
12
+ let {
13
+ longValues,
14
+ shortValues
15
+ } = _ref;
16
+ const {
17
+ lang
18
+ } = (0, _monoI18n.useLocale)();
19
+ return _react.default.createElement("div", {
20
+ className: "lw-mx-auto lw-flex lw-w-full lw-flex-col lw-items-center lw-space-y-4 lw-py-6 sm:lw-max-w-md lg:lw-max-w-xl"
21
+ }, _react.default.createElement(_LegendBar.LegendBar, {
22
+ label: lang('long'),
23
+ type: "long",
24
+ values: longValues
25
+ }), _react.default.createElement(_LegendBar.LegendBar, {
26
+ label: lang('short'),
27
+ type: "short",
28
+ values: shortValues
29
+ }));
30
+ };
31
+ exports.Legend = Legend;
32
+ //# sourceMappingURL=Legend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Legend.js","names":["_monoI18n","require","_react","_interopRequireDefault","_LegendBar","e","__esModule","default","Legend","_ref","longValues","shortValues","lang","useLocale","createElement","className","LegendBar","label","type","values","exports"],"sources":["../../../../../src/CrowdViewWidget/components/Legend/Legend.tsx"],"sourcesContent":["import { useLocale } from '@oanda/mono-i18n';\nimport React from 'react';\n\nimport { LegendBar } from './LegendBar';\n\ninterface LegendProps {\n longValues: number[];\n shortValues: number[];\n}\n\nexport const Legend = ({ longValues, shortValues }: LegendProps) => {\n const { lang } = useLocale();\n\n return (\n <div className=\"lw-mx-auto lw-flex lw-w-full lw-flex-col lw-items-center lw-space-y-4 lw-py-6 sm:lw-max-w-md lg:lw-max-w-xl\">\n <LegendBar label={lang('long')} type=\"long\" values={longValues} />\n <LegendBar label={lang('short')} type=\"short\" values={shortValues} />\n </div>\n );\n};\n"],"mappings":";;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AAEA,IAAAG,UAAA,GAAAH,OAAA;AAAwC,SAAAE,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAOjC,MAAMG,MAAM,GAAGC,IAAA,IAA8C;EAAA,IAA7C;IAAEC,UAAU;IAAEC;EAAyB,CAAC,GAAAF,IAAA;EAC7D,MAAM;IAAEG;EAAK,CAAC,GAAG,IAAAC,mBAAS,EAAC,CAAC;EAE5B,OACEX,MAAA,CAAAK,OAAA,CAAAO,aAAA;IAAKC,SAAS,EAAC;EAA6G,GAC1Hb,MAAA,CAAAK,OAAA,CAAAO,aAAA,CAACV,UAAA,CAAAY,SAAS;IAACC,KAAK,EAAEL,IAAI,CAAC,MAAM,CAAE;IAACM,IAAI,EAAC,MAAM;IAACC,MAAM,EAAET;EAAW,CAAE,CAAC,EAClER,MAAA,CAAAK,OAAA,CAAAO,aAAA,CAACV,UAAA,CAAAY,SAAS;IAACC,KAAK,EAAEL,IAAI,CAAC,OAAO,CAAE;IAACM,IAAI,EAAC,OAAO;IAACC,MAAM,EAAER;EAAY,CAAE,CACjE,CAAC;AAEV,CAAC;AAACS,OAAA,CAAAZ,MAAA,GAAAA,MAAA","ignoreList":[]}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.LegendBar = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ const colorMap = {
10
+ long: ['#00857333', '#00715F99', '#00857399', '#008573CC'],
11
+ short: ['#DA632566', '#DA632599', '#DA6325CC', '#DA6325']
12
+ };
13
+ const LegendBar = _ref => {
14
+ let {
15
+ values,
16
+ type,
17
+ label
18
+ } = _ref;
19
+ const colors = colorMap[type];
20
+ return _react.default.createElement("div", {
21
+ className: "lw-flex lw-w-full lw-flex-col lw-space-y-1 lw-border-border-primary"
22
+ }, _react.default.createElement("div", {
23
+ className: "lw-flex lw-h-2 lw-w-full lw-overflow-hidden lw-border lw-border-border-primary"
24
+ }, values.map((_, index) => _react.default.createElement("div", {
25
+ key: `${label}_${colors[index]}__color`,
26
+ className: "lw-h-full lw-flex-1",
27
+ "data-testid": "legend-bar-segment",
28
+ style: {
29
+ backgroundColor: colors[index]
30
+ }
31
+ }))), _react.default.createElement("div", {
32
+ className: "lw-flex lw-w-full"
33
+ }, values.map(value => _react.default.createElement("div", {
34
+ key: `${value}_${type}`,
35
+ className: "lw-flex lw-w-1/4 lw-justify-center"
36
+ }, _react.default.createElement("span", {
37
+ className: "lw-whitespace-nowrap lw-font-sans lw-text-xs lw-text-text-primary"
38
+ }, value.toFixed(2), "% ", label)))));
39
+ };
40
+ exports.LegendBar = LegendBar;
41
+ //# sourceMappingURL=LegendBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LegendBar.js","names":["_react","_interopRequireDefault","require","e","__esModule","default","colorMap","long","short","LegendBar","_ref","values","type","label","colors","createElement","className","map","_","index","key","style","backgroundColor","value","toFixed","exports"],"sources":["../../../../../src/CrowdViewWidget/components/Legend/LegendBar.tsx"],"sourcesContent":["import React from 'react';\n\ntype LegendType = 'long' | 'short';\n\ninterface LegendBarProps {\n values: number[];\n type: LegendType;\n label: string;\n}\n\nconst colorMap: Record<LegendType, string[]> = {\n long: ['#00857333', '#00715F99', '#00857399', '#008573CC'],\n short: ['#DA632566', '#DA632599', '#DA6325CC', '#DA6325'],\n};\n\nexport const LegendBar = ({ values, type, label }: LegendBarProps) => {\n const colors = colorMap[type];\n\n return (\n <div className=\"lw-flex lw-w-full lw-flex-col lw-space-y-1 lw-border-border-primary\">\n <div className=\"lw-flex lw-h-2 lw-w-full lw-overflow-hidden lw-border lw-border-border-primary\">\n {values.map((_, index) => (\n <div\n key={`${label}_${colors[index]}__color`}\n className=\"lw-h-full lw-flex-1\"\n data-testid=\"legend-bar-segment\"\n style={{\n backgroundColor: colors[index],\n }}\n />\n ))}\n </div>\n\n <div className=\"lw-flex lw-w-full\">\n {values.map((value) => (\n <div\n key={`${value}_${type}`}\n className=\"lw-flex lw-w-1/4 lw-justify-center\"\n >\n <span className=\"lw-whitespace-nowrap lw-font-sans lw-text-xs lw-text-text-primary\">\n {value.toFixed(2)}% {label}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA0B,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAU1B,MAAMG,QAAsC,GAAG;EAC7CC,IAAI,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;EAC1DC,KAAK,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS;AAC1D,CAAC;AAEM,MAAMC,SAAS,GAAGC,IAAA,IAA6C;EAAA,IAA5C;IAAEC,MAAM;IAAEC,IAAI;IAAEC;EAAsB,CAAC,GAAAH,IAAA;EAC/D,MAAMI,MAAM,GAAGR,QAAQ,CAACM,IAAI,CAAC;EAE7B,OACEZ,MAAA,CAAAK,OAAA,CAAAU,aAAA;IAAKC,SAAS,EAAC;EAAqE,GAClFhB,MAAA,CAAAK,OAAA,CAAAU,aAAA;IAAKC,SAAS,EAAC;EAAgF,GAC5FL,MAAM,CAACM,GAAG,CAAC,CAACC,CAAC,EAAEC,KAAK,KACnBnB,MAAA,CAAAK,OAAA,CAAAU,aAAA;IACEK,GAAG,EAAE,GAAGP,KAAK,IAAIC,MAAM,CAACK,KAAK,CAAC,SAAU;IACxCH,SAAS,EAAC,qBAAqB;IAC/B,eAAY,oBAAoB;IAChCK,KAAK,EAAE;MACLC,eAAe,EAAER,MAAM,CAACK,KAAK;IAC/B;EAAE,CACH,CACF,CACE,CAAC,EAENnB,MAAA,CAAAK,OAAA,CAAAU,aAAA;IAAKC,SAAS,EAAC;EAAmB,GAC/BL,MAAM,CAACM,GAAG,CAAEM,KAAK,IAChBvB,MAAA,CAAAK,OAAA,CAAAU,aAAA;IACEK,GAAG,EAAE,GAAGG,KAAK,IAAIX,IAAI,EAAG;IACxBI,SAAS,EAAC;EAAoC,GAE9ChB,MAAA,CAAAK,OAAA,CAAAU,aAAA;IAAMC,SAAS,EAAC;EAAmE,GAChFO,KAAK,CAACC,OAAO,CAAC,CAAC,CAAC,EAAC,IAAE,EAACX,KACjB,CACH,CACN,CACE,CACF,CAAC;AAEV,CAAC;AAACY,OAAA,CAAAhB,SAAA,GAAAA,SAAA","ignoreList":[]}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _Legend = require("./Legend");
7
+ Object.keys(_Legend).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _Legend[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _Legend[key];
14
+ }
15
+ });
16
+ });
17
+ var _LegendBar = require("./LegendBar");
18
+ Object.keys(_LegendBar).forEach(function (key) {
19
+ if (key === "default" || key === "__esModule") return;
20
+ if (key in exports && exports[key] === _LegendBar[key]) return;
21
+ Object.defineProperty(exports, key, {
22
+ enumerable: true,
23
+ get: function () {
24
+ return _LegendBar[key];
25
+ }
26
+ });
27
+ });
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["_Legend","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_LegendBar"],"sources":["../../../../../src/CrowdViewWidget/components/Legend/index.ts"],"sourcesContent":["export * from './Legend';\nexport * from './LegendBar';\n"],"mappings":";;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,OAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,OAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,OAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAK,UAAA,GAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,UAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,UAAA,CAAAL,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,UAAA,CAAAL,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _Legend = require("./Legend");
7
+ Object.keys(_Legend).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _Legend[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _Legend[key];
14
+ }
15
+ });
16
+ });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["_Legend","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get"],"sources":["../../../../src/CrowdViewWidget/components/index.ts"],"sourcesContent":["export * from './Legend';\n"],"mappings":";;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,OAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,OAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,OAAA,CAAAK,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
@@ -2,6 +2,7 @@ import { cn, Select, Size, Tabs, useLayoutProvider, WidgetError } from '@oanda/l
2
2
  import { useLocale } from '@oanda/mono-i18n';
3
3
  import React, { useState } from 'react';
4
4
  import { BookType, Division } from '../gql/types/graphql';
5
+ import { Legend } from './components';
5
6
  import { granularitySelectConfig, instrumentSelectConfig, instrumentSelectConfigOC, navigationConfig } from './config';
6
7
  const Main = _ref => {
7
8
  let {
@@ -51,7 +52,10 @@ const Main = _ref => {
51
52
  selectLabel: lang('granularity'),
52
53
  selectedOption: granularity,
53
54
  setSelectedOption: val => setGranularity(val)
54
- }))), React.createElement(WidgetError, null)));
55
+ }))), React.createElement(WidgetError, null), React.createElement(Legend, {
56
+ longValues: [0.15, 0.25, 0.4, 0.55],
57
+ shortValues: [0.15, 0.25, 0.4, 0.55]
58
+ })));
55
59
  };
56
60
  export { Main };
57
61
  //# sourceMappingURL=Main.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Main.js","names":["cn","Select","Size","Tabs","useLayoutProvider","WidgetError","useLocale","React","useState","BookType","Division","granularitySelectConfig","instrumentSelectConfig","instrumentSelectConfigOC","navigationConfig","Main","_ref","division","instrumentSelectConfigWithDivision","Oc","size","isDesktop","DESKTOP","bookType","setBookType","Order","instrument","setInstrument","granularity","setGranularity","lang","createElement","Fragment","className","mobileFullWidth","activeTab","handleClick","e","currentTarget","value","items","labelCallback","options","searchPlaceholder","selectLabel","selectedOption","setSelectedOption","val"],"sources":["../../../src/CrowdViewWidget/Main.tsx"],"sourcesContent":["import {\n cn,\n Select,\n Size,\n Tabs,\n useLayoutProvider,\n WidgetError,\n} from '@oanda/labs-widget-common';\nimport { useLocale } from '@oanda/mono-i18n';\nimport React, { useState } from 'react';\n\nimport { BookType, Division } from '../gql/types/graphql';\nimport {\n granularitySelectConfig,\n instrumentSelectConfig,\n instrumentSelectConfigOC,\n navigationConfig,\n} from './config';\nimport type { GranularityId, InstrumentId, MainProps } from './types';\n\nconst Main = ({ division }: MainProps) => {\n const instrumentSelectConfigWithDivision =\n division === Division.Oc\n ? instrumentSelectConfigOC\n : instrumentSelectConfig;\n\n const { size } = useLayoutProvider();\n const isDesktop = size === Size.DESKTOP;\n const [bookType, setBookType] = useState(BookType.Order);\n const [instrument, setInstrument] = useState(\n instrumentSelectConfigWithDivision[0]\n );\n const [granularity, setGranularity] = useState(granularitySelectConfig[0]);\n const { lang } = useLocale();\n\n return (\n <>\n {size && (\n <div\n className=\"lw-text-sm lw-tracking-normal\"\n data-testid=\"crowd-view-widget\"\n >\n <Tabs\n mobileFullWidth\n activeTab={bookType}\n handleClick={(e) => setBookType(e.currentTarget.value as BookType)}\n items={navigationConfig}\n labelCallback={lang}\n />\n <div className=\"lw-mb-6 lw-mt-12 lw-flex\">\n <div\n className={cn('lw-mr-2', {\n 'lw-w-full': !isDesktop,\n 'lw-w-[280px]': isDesktop,\n })}\n >\n <Select\n options={instrumentSelectConfigWithDivision}\n searchPlaceholder={lang('search')}\n selectLabel={lang('instrument')}\n selectedOption={instrument}\n setSelectedOption={(val) =>\n setInstrument(val as { id: InstrumentId; label: string })\n }\n />\n </div>\n <div\n className={cn({\n 'lw-w-full': !isDesktop,\n 'lw-w-[280px]': isDesktop,\n })}\n >\n <Select\n options={granularitySelectConfig}\n searchPlaceholder={lang('search')}\n selectLabel={lang('granularity')}\n selectedOption={granularity}\n setSelectedOption={(val) =>\n setGranularity(val as { id: GranularityId; label: string })\n }\n />\n </div>\n </div>\n <WidgetError />\n </div>\n )}\n </>\n );\n};\n\nexport { Main };\n"],"mappings":"AAAA,SACEA,EAAE,EACFC,MAAM,EACNC,IAAI,EACJC,IAAI,EACJC,iBAAiB,EACjBC,WAAW,QACN,2BAA2B;AAClC,SAASC,SAAS,QAAQ,kBAAkB;AAC5C,OAAOC,KAAK,IAAIC,QAAQ,QAAQ,OAAO;AAEvC,SAASC,QAAQ,EAAEC,QAAQ,QAAQ,sBAAsB;AACzD,SACEC,uBAAuB,EACvBC,sBAAsB,EACtBC,wBAAwB,EACxBC,gBAAgB,QACX,UAAU;AAGjB,MAAMC,IAAI,GAAGC,IAAA,IAA6B;EAAA,IAA5B;IAAEC;EAAoB,CAAC,GAAAD,IAAA;EACnC,MAAME,kCAAkC,GACtCD,QAAQ,KAAKP,QAAQ,CAACS,EAAE,GACpBN,wBAAwB,GACxBD,sBAAsB;EAE5B,MAAM;IAAEQ;EAAK,CAAC,GAAGhB,iBAAiB,CAAC,CAAC;EACpC,MAAMiB,SAAS,GAAGD,IAAI,KAAKlB,IAAI,CAACoB,OAAO;EACvC,MAAM,CAACC,QAAQ,EAAEC,WAAW,CAAC,GAAGhB,QAAQ,CAACC,QAAQ,CAACgB,KAAK,CAAC;EACxD,MAAM,CAACC,UAAU,EAAEC,aAAa,CAAC,GAAGnB,QAAQ,CAC1CU,kCAAkC,CAAC,CAAC,CACtC,CAAC;EACD,MAAM,CAACU,WAAW,EAAEC,cAAc,CAAC,GAAGrB,QAAQ,CAACG,uBAAuB,CAAC,CAAC,CAAC,CAAC;EAC1E,MAAM;IAAEmB;EAAK,CAAC,GAAGxB,SAAS,CAAC,CAAC;EAE5B,OACEC,KAAA,CAAAwB,aAAA,CAAAxB,KAAA,CAAAyB,QAAA,QACGZ,IAAI,IACHb,KAAA,CAAAwB,aAAA;IACEE,SAAS,EAAC,+BAA+B;IACzC,eAAY;EAAmB,GAE/B1B,KAAA,CAAAwB,aAAA,CAAC5B,IAAI;IACH+B,eAAe;IACfC,SAAS,EAAEZ,QAAS;IACpBa,WAAW,EAAGC,CAAC,IAAKb,WAAW,CAACa,CAAC,CAACC,aAAa,CAACC,KAAiB,CAAE;IACnEC,KAAK,EAAE1B,gBAAiB;IACxB2B,aAAa,EAAEX;EAAK,CACrB,CAAC,EACFvB,KAAA,CAAAwB,aAAA;IAAKE,SAAS,EAAC;EAA0B,GACvC1B,KAAA,CAAAwB,aAAA;IACEE,SAAS,EAAEjC,EAAE,CAAC,SAAS,EAAE;MACvB,WAAW,EAAE,CAACqB,SAAS;MACvB,cAAc,EAAEA;IAClB,CAAC;EAAE,GAEHd,KAAA,CAAAwB,aAAA,CAAC9B,MAAM;IACLyC,OAAO,EAAExB,kCAAmC;IAC5CyB,iBAAiB,EAAEb,IAAI,CAAC,QAAQ,CAAE;IAClCc,WAAW,EAAEd,IAAI,CAAC,YAAY,CAAE;IAChCe,cAAc,EAAEnB,UAAW;IAC3BoB,iBAAiB,EAAGC,GAAG,IACrBpB,aAAa,CAACoB,GAA0C;EACzD,CACF,CACE,CAAC,EACNxC,KAAA,CAAAwB,aAAA;IACEE,SAAS,EAAEjC,EAAE,CAAC;MACZ,WAAW,EAAE,CAACqB,SAAS;MACvB,cAAc,EAAEA;IAClB,CAAC;EAAE,GAEHd,KAAA,CAAAwB,aAAA,CAAC9B,MAAM;IACLyC,OAAO,EAAE/B,uBAAwB;IACjCgC,iBAAiB,EAAEb,IAAI,CAAC,QAAQ,CAAE;IAClCc,WAAW,EAAEd,IAAI,CAAC,aAAa,CAAE;IACjCe,cAAc,EAAEjB,WAAY;IAC5BkB,iBAAiB,EAAGC,GAAG,IACrBlB,cAAc,CAACkB,GAA2C;EAC3D,CACF,CACE,CACF,CAAC,EACNxC,KAAA,CAAAwB,aAAA,CAAC1B,WAAW,MAAE,CACX,CAEP,CAAC;AAEP,CAAC;AAED,SAASU,IAAI","ignoreList":[]}
1
+ {"version":3,"file":"Main.js","names":["cn","Select","Size","Tabs","useLayoutProvider","WidgetError","useLocale","React","useState","BookType","Division","Legend","granularitySelectConfig","instrumentSelectConfig","instrumentSelectConfigOC","navigationConfig","Main","_ref","division","instrumentSelectConfigWithDivision","Oc","size","isDesktop","DESKTOP","bookType","setBookType","Order","instrument","setInstrument","granularity","setGranularity","lang","createElement","Fragment","className","mobileFullWidth","activeTab","handleClick","e","currentTarget","value","items","labelCallback","options","searchPlaceholder","selectLabel","selectedOption","setSelectedOption","val","longValues","shortValues"],"sources":["../../../src/CrowdViewWidget/Main.tsx"],"sourcesContent":["import {\n cn,\n Select,\n Size,\n Tabs,\n useLayoutProvider,\n WidgetError,\n} from '@oanda/labs-widget-common';\nimport { useLocale } from '@oanda/mono-i18n';\nimport React, { useState } from 'react';\n\nimport { BookType, Division } from '../gql/types/graphql';\nimport { Legend } from './components';\nimport {\n granularitySelectConfig,\n instrumentSelectConfig,\n instrumentSelectConfigOC,\n navigationConfig,\n} from './config';\nimport type { GranularityId, InstrumentId, MainProps } from './types';\n\nconst Main = ({ division }: MainProps) => {\n const instrumentSelectConfigWithDivision =\n division === Division.Oc\n ? instrumentSelectConfigOC\n : instrumentSelectConfig;\n\n const { size } = useLayoutProvider();\n const isDesktop = size === Size.DESKTOP;\n const [bookType, setBookType] = useState(BookType.Order);\n const [instrument, setInstrument] = useState(\n instrumentSelectConfigWithDivision[0]\n );\n const [granularity, setGranularity] = useState(granularitySelectConfig[0]);\n const { lang } = useLocale();\n\n return (\n <>\n {size && (\n <div\n className=\"lw-text-sm lw-tracking-normal\"\n data-testid=\"crowd-view-widget\"\n >\n <Tabs\n mobileFullWidth\n activeTab={bookType}\n handleClick={(e) => setBookType(e.currentTarget.value as BookType)}\n items={navigationConfig}\n labelCallback={lang}\n />\n <div className=\"lw-mb-6 lw-mt-12 lw-flex\">\n <div\n className={cn('lw-mr-2', {\n 'lw-w-full': !isDesktop,\n 'lw-w-[280px]': isDesktop,\n })}\n >\n <Select\n options={instrumentSelectConfigWithDivision}\n searchPlaceholder={lang('search')}\n selectLabel={lang('instrument')}\n selectedOption={instrument}\n setSelectedOption={(val) =>\n setInstrument(val as { id: InstrumentId; label: string })\n }\n />\n </div>\n <div\n className={cn({\n 'lw-w-full': !isDesktop,\n 'lw-w-[280px]': isDesktop,\n })}\n >\n <Select\n options={granularitySelectConfig}\n searchPlaceholder={lang('search')}\n selectLabel={lang('granularity')}\n selectedOption={granularity}\n setSelectedOption={(val) =>\n setGranularity(val as { id: GranularityId; label: string })\n }\n />\n </div>\n </div>\n <WidgetError />\n\n <Legend\n longValues={[0.15, 0.25, 0.4, 0.55]}\n shortValues={[0.15, 0.25, 0.4, 0.55]}\n />\n </div>\n )}\n </>\n );\n};\n\nexport { Main };\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,24 @@
1
+ import { useLocale } from '@oanda/mono-i18n';
2
+ import React from 'react';
3
+ import { LegendBar } from './LegendBar';
4
+ export const Legend = _ref => {
5
+ let {
6
+ longValues,
7
+ shortValues
8
+ } = _ref;
9
+ const {
10
+ lang
11
+ } = useLocale();
12
+ return React.createElement("div", {
13
+ className: "lw-mx-auto lw-flex lw-w-full lw-flex-col lw-items-center lw-space-y-4 lw-py-6 sm:lw-max-w-md lg:lw-max-w-xl"
14
+ }, React.createElement(LegendBar, {
15
+ label: lang('long'),
16
+ type: "long",
17
+ values: longValues
18
+ }), React.createElement(LegendBar, {
19
+ label: lang('short'),
20
+ type: "short",
21
+ values: shortValues
22
+ }));
23
+ };
24
+ //# sourceMappingURL=Legend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Legend.js","names":["useLocale","React","LegendBar","Legend","_ref","longValues","shortValues","lang","createElement","className","label","type","values"],"sources":["../../../../../src/CrowdViewWidget/components/Legend/Legend.tsx"],"sourcesContent":["import { useLocale } from '@oanda/mono-i18n';\nimport React from 'react';\n\nimport { LegendBar } from './LegendBar';\n\ninterface LegendProps {\n longValues: number[];\n shortValues: number[];\n}\n\nexport const Legend = ({ longValues, shortValues }: LegendProps) => {\n const { lang } = useLocale();\n\n return (\n <div className=\"lw-mx-auto lw-flex lw-w-full lw-flex-col lw-items-center lw-space-y-4 lw-py-6 sm:lw-max-w-md lg:lw-max-w-xl\">\n <LegendBar label={lang('long')} type=\"long\" values={longValues} />\n <LegendBar label={lang('short')} type=\"short\" values={shortValues} />\n </div>\n );\n};\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,kBAAkB;AAC5C,OAAOC,KAAK,MAAM,OAAO;AAEzB,SAASC,SAAS,QAAQ,aAAa;AAOvC,OAAO,MAAMC,MAAM,GAAGC,IAAA,IAA8C;EAAA,IAA7C;IAAEC,UAAU;IAAEC;EAAyB,CAAC,GAAAF,IAAA;EAC7D,MAAM;IAAEG;EAAK,CAAC,GAAGP,SAAS,CAAC,CAAC;EAE5B,OACEC,KAAA,CAAAO,aAAA;IAAKC,SAAS,EAAC;EAA6G,GAC1HR,KAAA,CAAAO,aAAA,CAACN,SAAS;IAACQ,KAAK,EAAEH,IAAI,CAAC,MAAM,CAAE;IAACI,IAAI,EAAC,MAAM;IAACC,MAAM,EAAEP;EAAW,CAAE,CAAC,EAClEJ,KAAA,CAAAO,aAAA,CAACN,SAAS;IAACQ,KAAK,EAAEH,IAAI,CAAC,OAAO,CAAE;IAACI,IAAI,EAAC,OAAO;IAACC,MAAM,EAAEN;EAAY,CAAE,CACjE,CAAC;AAEV,CAAC","ignoreList":[]}
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ const colorMap = {
3
+ long: ['#00857333', '#00715F99', '#00857399', '#008573CC'],
4
+ short: ['#DA632566', '#DA632599', '#DA6325CC', '#DA6325']
5
+ };
6
+ export const LegendBar = _ref => {
7
+ let {
8
+ values,
9
+ type,
10
+ label
11
+ } = _ref;
12
+ const colors = colorMap[type];
13
+ return React.createElement("div", {
14
+ className: "lw-flex lw-w-full lw-flex-col lw-space-y-1 lw-border-border-primary"
15
+ }, React.createElement("div", {
16
+ className: "lw-flex lw-h-2 lw-w-full lw-overflow-hidden lw-border lw-border-border-primary"
17
+ }, values.map((_, index) => React.createElement("div", {
18
+ key: `${label}_${colors[index]}__color`,
19
+ className: "lw-h-full lw-flex-1",
20
+ "data-testid": "legend-bar-segment",
21
+ style: {
22
+ backgroundColor: colors[index]
23
+ }
24
+ }))), React.createElement("div", {
25
+ className: "lw-flex lw-w-full"
26
+ }, values.map(value => React.createElement("div", {
27
+ key: `${value}_${type}`,
28
+ className: "lw-flex lw-w-1/4 lw-justify-center"
29
+ }, React.createElement("span", {
30
+ className: "lw-whitespace-nowrap lw-font-sans lw-text-xs lw-text-text-primary"
31
+ }, value.toFixed(2), "% ", label)))));
32
+ };
33
+ //# sourceMappingURL=LegendBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LegendBar.js","names":["React","colorMap","long","short","LegendBar","_ref","values","type","label","colors","createElement","className","map","_","index","key","style","backgroundColor","value","toFixed"],"sources":["../../../../../src/CrowdViewWidget/components/Legend/LegendBar.tsx"],"sourcesContent":["import React from 'react';\n\ntype LegendType = 'long' | 'short';\n\ninterface LegendBarProps {\n values: number[];\n type: LegendType;\n label: string;\n}\n\nconst colorMap: Record<LegendType, string[]> = {\n long: ['#00857333', '#00715F99', '#00857399', '#008573CC'],\n short: ['#DA632566', '#DA632599', '#DA6325CC', '#DA6325'],\n};\n\nexport const LegendBar = ({ values, type, label }: LegendBarProps) => {\n const colors = colorMap[type];\n\n return (\n <div className=\"lw-flex lw-w-full lw-flex-col lw-space-y-1 lw-border-border-primary\">\n <div className=\"lw-flex lw-h-2 lw-w-full lw-overflow-hidden lw-border lw-border-border-primary\">\n {values.map((_, index) => (\n <div\n key={`${label}_${colors[index]}__color`}\n className=\"lw-h-full lw-flex-1\"\n data-testid=\"legend-bar-segment\"\n style={{\n backgroundColor: colors[index],\n }}\n />\n ))}\n </div>\n\n <div className=\"lw-flex lw-w-full\">\n {values.map((value) => (\n <div\n key={`${value}_${type}`}\n className=\"lw-flex lw-w-1/4 lw-justify-center\"\n >\n <span className=\"lw-whitespace-nowrap lw-font-sans lw-text-xs lw-text-text-primary\">\n {value.toFixed(2)}% {label}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAUzB,MAAMC,QAAsC,GAAG;EAC7CC,IAAI,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;EAC1DC,KAAK,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS;AAC1D,CAAC;AAED,OAAO,MAAMC,SAAS,GAAGC,IAAA,IAA6C;EAAA,IAA5C;IAAEC,MAAM;IAAEC,IAAI;IAAEC;EAAsB,CAAC,GAAAH,IAAA;EAC/D,MAAMI,MAAM,GAAGR,QAAQ,CAACM,IAAI,CAAC;EAE7B,OACEP,KAAA,CAAAU,aAAA;IAAKC,SAAS,EAAC;EAAqE,GAClFX,KAAA,CAAAU,aAAA;IAAKC,SAAS,EAAC;EAAgF,GAC5FL,MAAM,CAACM,GAAG,CAAC,CAACC,CAAC,EAAEC,KAAK,KACnBd,KAAA,CAAAU,aAAA;IACEK,GAAG,EAAE,GAAGP,KAAK,IAAIC,MAAM,CAACK,KAAK,CAAC,SAAU;IACxCH,SAAS,EAAC,qBAAqB;IAC/B,eAAY,oBAAoB;IAChCK,KAAK,EAAE;MACLC,eAAe,EAAER,MAAM,CAACK,KAAK;IAC/B;EAAE,CACH,CACF,CACE,CAAC,EAENd,KAAA,CAAAU,aAAA;IAAKC,SAAS,EAAC;EAAmB,GAC/BL,MAAM,CAACM,GAAG,CAAEM,KAAK,IAChBlB,KAAA,CAAAU,aAAA;IACEK,GAAG,EAAE,GAAGG,KAAK,IAAIX,IAAI,EAAG;IACxBI,SAAS,EAAC;EAAoC,GAE9CX,KAAA,CAAAU,aAAA;IAAMC,SAAS,EAAC;EAAmE,GAChFO,KAAK,CAACC,OAAO,CAAC,CAAC,CAAC,EAAC,IAAE,EAACX,KACjB,CACH,CACN,CACE,CACF,CAAC;AAEV,CAAC","ignoreList":[]}
@@ -0,0 +1,3 @@
1
+ export * from './Legend';
2
+ export * from './LegendBar';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../../src/CrowdViewWidget/components/Legend/index.ts"],"sourcesContent":["export * from './Legend';\nexport * from './LegendBar';\n"],"mappings":"AAAA,cAAc,UAAU;AACxB,cAAc,aAAa","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export * from './Legend';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/CrowdViewWidget/components/index.ts"],"sourcesContent":["export * from './Legend';\n"],"mappings":"AAAA,cAAc,UAAU","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ interface LegendProps {
3
+ longValues: number[];
4
+ shortValues: number[];
5
+ }
6
+ export declare const Legend: ({ longValues, shortValues }: LegendProps) => React.JSX.Element;
7
+ export {};
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ type LegendType = 'long' | 'short';
3
+ interface LegendBarProps {
4
+ values: number[];
5
+ type: LegendType;
6
+ label: string;
7
+ }
8
+ export declare const LegendBar: ({ values, type, label }: LegendBarProps) => React.JSX.Element;
9
+ export {};
@@ -0,0 +1,2 @@
1
+ export * from './Legend';
2
+ export * from './LegendBar';
@@ -0,0 +1 @@
1
+ export * from './Legend';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oanda/labs-crowd-view-widget",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "Labs Crowd View Widget",
5
5
  "main": "dist/main/index.js",
6
6
  "module": "dist/module/index.js",
@@ -12,7 +12,7 @@
12
12
  "author": "OANDA",
13
13
  "license": "UNLICENSED",
14
14
  "dependencies": {
15
- "@oanda/labs-widget-common": "^1.0.185",
15
+ "@oanda/labs-widget-common": "^1.0.186",
16
16
  "@oanda/mono-i18n": "10.0.1",
17
17
  "graphql": "16.8.1"
18
18
  },
@@ -20,5 +20,5 @@
20
20
  "@graphql-codegen/cli": "5.0.0",
21
21
  "@graphql-codegen/client-preset": "4.1.0"
22
22
  },
23
- "gitHead": "ec2489a54e2b10868edeb392c78d5f6987d03e09"
23
+ "gitHead": "62a1f7b8fc3926956c1cad4d38b365ad4a42c40a"
24
24
  }
@@ -10,6 +10,7 @@ import { useLocale } from '@oanda/mono-i18n';
10
10
  import React, { useState } from 'react';
11
11
 
12
12
  import { BookType, Division } from '../gql/types/graphql';
13
+ import { Legend } from './components';
13
14
  import {
14
15
  granularitySelectConfig,
15
16
  instrumentSelectConfig,
@@ -82,6 +83,11 @@ const Main = ({ division }: MainProps) => {
82
83
  </div>
83
84
  </div>
84
85
  <WidgetError />
86
+
87
+ <Legend
88
+ longValues={[0.15, 0.25, 0.4, 0.55]}
89
+ shortValues={[0.15, 0.25, 0.4, 0.55]}
90
+ />
85
91
  </div>
86
92
  )}
87
93
  </>
@@ -0,0 +1,20 @@
1
+ import { useLocale } from '@oanda/mono-i18n';
2
+ import React from 'react';
3
+
4
+ import { LegendBar } from './LegendBar';
5
+
6
+ interface LegendProps {
7
+ longValues: number[];
8
+ shortValues: number[];
9
+ }
10
+
11
+ export const Legend = ({ longValues, shortValues }: LegendProps) => {
12
+ const { lang } = useLocale();
13
+
14
+ return (
15
+ <div className="lw-mx-auto lw-flex lw-w-full lw-flex-col lw-items-center lw-space-y-4 lw-py-6 sm:lw-max-w-md lg:lw-max-w-xl">
16
+ <LegendBar label={lang('long')} type="long" values={longValues} />
17
+ <LegendBar label={lang('short')} type="short" values={shortValues} />
18
+ </div>
19
+ );
20
+ };
@@ -0,0 +1,48 @@
1
+ import React from 'react';
2
+
3
+ type LegendType = 'long' | 'short';
4
+
5
+ interface LegendBarProps {
6
+ values: number[];
7
+ type: LegendType;
8
+ label: string;
9
+ }
10
+
11
+ const colorMap: Record<LegendType, string[]> = {
12
+ long: ['#00857333', '#00715F99', '#00857399', '#008573CC'],
13
+ short: ['#DA632566', '#DA632599', '#DA6325CC', '#DA6325'],
14
+ };
15
+
16
+ export const LegendBar = ({ values, type, label }: LegendBarProps) => {
17
+ const colors = colorMap[type];
18
+
19
+ return (
20
+ <div className="lw-flex lw-w-full lw-flex-col lw-space-y-1 lw-border-border-primary">
21
+ <div className="lw-flex lw-h-2 lw-w-full lw-overflow-hidden lw-border lw-border-border-primary">
22
+ {values.map((_, index) => (
23
+ <div
24
+ key={`${label}_${colors[index]}__color`}
25
+ className="lw-h-full lw-flex-1"
26
+ data-testid="legend-bar-segment"
27
+ style={{
28
+ backgroundColor: colors[index],
29
+ }}
30
+ />
31
+ ))}
32
+ </div>
33
+
34
+ <div className="lw-flex lw-w-full">
35
+ {values.map((value) => (
36
+ <div
37
+ key={`${value}_${type}`}
38
+ className="lw-flex lw-w-1/4 lw-justify-center"
39
+ >
40
+ <span className="lw-whitespace-nowrap lw-font-sans lw-text-xs lw-text-text-primary">
41
+ {value.toFixed(2)}% {label}
42
+ </span>
43
+ </div>
44
+ ))}
45
+ </div>
46
+ </div>
47
+ );
48
+ };
@@ -0,0 +1,2 @@
1
+ export * from './Legend';
2
+ export * from './LegendBar';
@@ -0,0 +1 @@
1
+ export * from './Legend';
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @jest-environment jsdom
3
+ */
4
+
5
+ import { render } from '@testing-library/react';
6
+ import React from 'react';
7
+
8
+ import { Legend } from '../../src/CrowdViewWidget/components';
9
+
10
+ describe('Crowd View Widget', () => {
11
+ describe('components', () => {
12
+ describe('<Legend />', () => {
13
+ it('renders two LegendBar components', () => {
14
+ const { getAllByText } = render(
15
+ <Legend
16
+ longValues={[0.15, 0.25, 0.4, 0.55]}
17
+ shortValues={[0.15, 0.25, 0.4, 0.55]}
18
+ />
19
+ );
20
+
21
+ expect(getAllByText(/long/)).toHaveLength(4);
22
+ expect(getAllByText(/short/)).toHaveLength(4);
23
+ });
24
+ });
25
+ });
26
+ });
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @jest-environment jsdom
3
+ */
4
+
5
+ import { render } from '@testing-library/react';
6
+ import React from 'react';
7
+
8
+ import { LegendBar } from '../../src/CrowdViewWidget/components';
9
+
10
+ describe('Crowd View Widget', () => {
11
+ describe('components', () => {
12
+ describe('<LegendBar />', () => {
13
+ const mockValues = [0.15, 0.25, 0.4, 0.55];
14
+
15
+ it('renders two LegendBar components', () => {
16
+ const { getByText } = render(
17
+ <LegendBar label="long" type="long" values={mockValues} />
18
+ );
19
+ mockValues.forEach((value) => {
20
+ const label = `${value.toFixed(2)}% long`;
21
+ expect(getByText(label)).toBeInTheDocument();
22
+ });
23
+ });
24
+
25
+ it('renders exactly 4 segments', () => {
26
+ const { getAllByTestId } = render(
27
+ <LegendBar label="short" type="short" values={mockValues} />
28
+ );
29
+ const segments = getAllByTestId('legend-bar-segment');
30
+ expect(segments.length).toBe(4);
31
+ });
32
+ });
33
+ });
34
+ });