diff --git a/components/BarGraph.module.css b/components/BarGraph.module.css index 025976a..7ccdc8b 100644 --- a/components/BarGraph.module.css +++ b/components/BarGraph.module.css @@ -9,7 +9,7 @@ .barText { visibility: hidden; - font-family: "Inconsolata", "monospace"; + font-family: "Inconsolata", monospace; font-weight: 800; fill: var(--label); } @@ -24,13 +24,13 @@ } .tickLabel { - font-family: "Inconsolata", "monospace"; + font-family: "Inconsolata", monospace; font-weight: 800; fill: var(--label); } .axisLabel { - font-family: "Inconsolata", "monospace"; + font-family: "Inconsolata", monospace; font-weight: 800; fill: var(--label); } diff --git a/components/ColorPalette.module.css b/components/ColorPalette.module.css index 01bc6a5..b605f28 100644 --- a/components/ColorPalette.module.css +++ b/components/ColorPalette.module.css @@ -16,6 +16,6 @@ flex-direction: column; align-items: center; text-align: center; - margin: calc(10rem / 16); + margin: calc(10rem / 16) calc(60rem / 16); width: calc(150rem / 16); } \ No newline at end of file diff --git a/components/WordCloud.module.css b/components/WordCloud.module.css new file mode 100644 index 0000000..728094a --- /dev/null +++ b/components/WordCloud.module.css @@ -0,0 +1,20 @@ +.word:hover { + text-shadow: var(--primary-accent) 0 0 calc(20rem / 16); + text-anchor: "middle"; + cursor: default; +} + +.tooltip { + font-family: "Inconsolata", monospace; + font-weight: bold; + top: 0; + left: 0; + position: absolute; + background-color: var(--label); + color: var(--primary-background); + box-shadow: 0px calc(1rem / 16) calc(2rem / 16) var(--card-background); + pointer-events: none; + padding: calc(10rem / 16); + font-size: calc(18rem / 16); + border-radius: calc(10rem / 16); +} \ No newline at end of file diff --git a/components/WordCloud.tsx b/components/WordCloud.tsx new file mode 100644 index 0000000..9591dac --- /dev/null +++ b/components/WordCloud.tsx @@ -0,0 +1,210 @@ +import { localPoint } from "@visx/event"; +import { Point } from "@visx/point"; +import { scaleLog } from "@visx/scale"; +import { Text } from "@visx/text"; +import { TooltipWithBounds, useTooltip, withTooltip } from "@visx/tooltip"; +import { Wordcloud as VisxWordcloud } from "@visx/wordcloud"; +import React from "react"; +import { Color } from "utils/Color"; + +import styles from "./WordCloud.module.css"; + +interface WordCloudProps { + data: Array; + /** Width of the graph, in px */ + width?: number; + /** Height of the graph, in px */ + height?: number; + /** Minimum padding between words, in px */ + wordPadding?: number; + /** Weight of the font of the words */ + fontWeight?: number; + /** The desired font size of the smallest word, in px.*/ + minFontSize?: number; + /** The desired font size of the largest word, in px. */ + maxFontSize?: number; + /** A random seed in the range [0, 1) used for placing the words, change this value to get an alternate placement of words */ + randomSeed?: number; + /** Type of spiral used for rendering the words, either rectangular or archimedean */ + spiral?: "rectangular" | "archimedean"; + /** ClassName of the wrapper of the wordcloud */ + className?: string; +} + +interface WordData { + text: string; + value: number; +} + +const wordColors = [Color.primaryAccent, Color.primaryAccentLight]; +const TOOLTIP_HORIZONTAL_SHIFT_SCALER = 12.0; + +export const WordCloud = withTooltip( + ({ + data, + width, + height, + wordPadding, + fontWeight, + minFontSize, + maxFontSize, + randomSeed, + spiral, + className, + }: WordCloudProps) => { + const { + tooltipData, + tooltipLeft, + tooltipTop, + tooltipOpen, + showTooltip, + hideTooltip, + } = useTooltip(); + + return ( +
+ { + showTooltip({ + tooltipData: data, + tooltipLeft: left, + tooltipTop: top, + }); + }} + hideTooltip={hideTooltip} + tooltipLeft={tooltipLeft} + tooltipTop={tooltipTop} + randomSeed={randomSeed} + spiral={spiral} + /> + + {tooltipOpen && tooltipData ? ( + + {tooltipData.text} ({tooltipData.value}) + + ) : null} +
+ ); + } +); + +/** The internal wordcloud component that actually lays out the word needs to be separate from the tooltip to prevent extra rerendering. */ +type WordCloudWordsProps = Omit & { + showTooltip: ( + data: WordData, + tooltipLeft: number, + tooltipTop: number + ) => void; + hideTooltip: () => void; + // tooltipLeft and tooltipTop are used for preventing unnessary renders + tooltipLeft?: number; + tooltipTop?: number; +}; +const WordCloudWords: React.FC = ({ + data, + width = 1000, + height = 500, + wordPadding = 30, + fontWeight = 500, + minFontSize = 20, + maxFontSize = 150, + randomSeed = 0.5, + spiral = "rectangular", + showTooltip, + hideTooltip, +}) => { + const fontScale = scaleLog({ + domain: [ + Math.min(...data.map((w) => w.value)), + Math.max(...data.map((w) => w.value)), + ], + range: [minFontSize, maxFontSize], + }); + const fontSizeSetter = (datum: WordData) => fontScale(datum.value); + const fixedValueGenerator = () => randomSeed; + return ( + + {(cloudWords) => + cloudWords.map((word, index) => { + return ( + ) => { + const eventSvgCoords = localPoint( + // ownerSVGElement is given by visx docs but not recognized by typescript + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + e.target.ownerSVGElement as Element, + e + ) as Point; + + if (word.text) { + showTooltip( + { text: word.text, value: data[index].value }, + eventSvgCoords.x - + word.text.length * TOOLTIP_HORIZONTAL_SHIFT_SCALER, + eventSvgCoords.y + ); + } + }) as React.MouseEventHandler + } + onMouseLeave={(_) => hideTooltip()} + > + {word.text} + + ); + }) + } + + ); +}; + +const shouldNotRerender = ( + prevProps: WordCloudWordsProps, + nextProps: WordCloudWordsProps +) => { + if ( + prevProps.tooltipLeft !== nextProps.tooltipLeft || + prevProps.tooltipTop !== nextProps.tooltipTop || + nextProps.tooltipLeft === undefined || + nextProps.tooltipTop === undefined + ) { + return true; // do not re-render + } + return false; // will re-render +}; + +const WordCloudWordsMemoized = React.memo(WordCloudWords, shouldNotRerender); diff --git a/data/mocks.ts b/data/mocks.ts index c6e8f2b..3f8b07e 100644 --- a/data/mocks.ts +++ b/data/mocks.ts @@ -50,3 +50,32 @@ export const mockPieData = [ value: 10, }, ]; + +export const moreMockCategoricalData = [ + { key: "Python", value: 29.53 }, + { key: "Java", value: 17.06 }, + { key: "JavaScript", value: 8.56 }, + { key: "C", value: 6.49 }, + { key: "Assembly", value: 6.31 }, + { key: "R", value: 5.83 }, + { key: "Objective C", value: 4.43 }, + { key: "Swift", value: 3.89 }, + { key: "PHP", value: 3.85 }, + { key: "Rust", value: 3.33 }, + { key: "Ruby", value: 3.25 }, + { key: "Matlab", value: 3.06 }, + { key: "TypeScript", value: 3.98 }, + { key: "Go", value: 3.85 }, + { key: "Haskell", value: 3.28 }, + { key: "VBA", value: 3.11 }, + { key: "Scala", value: 2.79 }, + { key: "Lua", value: 2.79 }, + { key: "Julia", value: 2.77 }, + { key: "Kotlin", value: 2.7 }, + { key: "Perl", value: 2.41 }, + { key: "Groovy", value: 2.4 }, + { key: "Abap", value: 2.24 }, + { key: "Cobol", value: 2.23 }, + { key: "Ada", value: 2.21 }, + { key: "Dart", value: 2.21 }, +]; diff --git a/package-lock.json b/package-lock.json index 0cdcde4..d0d5fd0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,11 +8,14 @@ "version": "0.1.0", "dependencies": { "@visx/axis": "^2.10.0", + "@visx/event": "^2.6.0", "@visx/grid": "^2.10.0", "@visx/group": "^2.10.0", "@visx/scale": "^2.2.2", "@visx/shape": "^2.10.0", "@visx/text": "^2.10.0", + "@visx/tooltip": "^2.10.0", + "@visx/wordcloud": "^2.10.0", "next": "12.1.6", "react": "18.1.0", "react-dom": "18.1.0" @@ -573,6 +576,19 @@ "integrity": "sha512-WiBSI6JBIhC6LRIsB2Kwh8DsGTlbBU+mLRxJmAe3LjHTdkDpwIbEOZgoXBbZilk/vlfjK8i6nKRAvIRn1XaIMw==", "dev": true }, + "node_modules/@types/d3": { + "version": "3.5.47", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.47.tgz", + "integrity": "sha512-VkWIQoZXLFdcBGe5pdBKJmTU3fmpXvo/KV6ixvTzOMl1yJ2hbTXpfvsziag0kcaerPDwas2T0vxojwQG3YwivQ==" + }, + "node_modules/@types/d3-cloud": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/d3-cloud/-/d3-cloud-1.2.5.tgz", + "integrity": "sha512-vEIER9DsEBUOdpRiwCh3n1qE+cV6h4e1LhxhY2sLt+m8LPNAIkOOhTlqk0JDiBwD+ZPM8ynFAOU3AuPuVYBFBA==", + "dependencies": { + "@types/d3": "^3" + } + }, "node_modules/@types/d3-color": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.4.2.tgz", @@ -654,7 +670,6 @@ "version": "18.0.5", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.5.tgz", "integrity": "sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==", - "dev": true, "dependencies": { "@types/react": "*" } @@ -888,6 +903,20 @@ "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0" } }, + "node_modules/@visx/bounds": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@visx/bounds/-/bounds-2.10.0.tgz", + "integrity": "sha512-rY7WFTIjQaXA8tFL45O2qbtSRkyF4yF75HiWz06F7BVmJ9UjF2qlomB3Y1z6gk6ZiFhwQ4zxABjOVjAQPLn7nQ==", + "dependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "prop-types": "^15.5.10" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0", + "react-dom": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, "node_modules/@visx/curve": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@visx/curve/-/curve-2.1.0.tgz", @@ -897,6 +926,15 @@ "d3-shape": "^1.0.6" } }, + "node_modules/@visx/event": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@visx/event/-/event-2.6.0.tgz", + "integrity": "sha512-WGp91g82s727g3NAnENF1ppC3ZAlvWg+Y+GG0WFg34NmmOZbvPI/PTOqTqZE3x6B8EUn8NJiMxRjxIMbi+IvRw==", + "dependencies": { + "@types/react": "*", + "@visx/point": "2.6.0" + } + }, "node_modules/@visx/grid": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/@visx/grid/-/grid-2.10.0.tgz", @@ -984,6 +1022,35 @@ "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0" } }, + "node_modules/@visx/tooltip": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@visx/tooltip/-/tooltip-2.10.0.tgz", + "integrity": "sha512-6Zrd79MIEfyuLBcZ1ypSeAkpQc8oLRNB7FQnegzl3Lje4LK5lJtuf5ST0mwK6G2Uv+GlOW9REJ6VK4gfAGkq9A==", + "dependencies": { + "@types/react": "*", + "@visx/bounds": "2.10.0", + "classnames": "^2.3.1", + "prop-types": "^15.5.10", + "react-use-measure": "^2.0.4" + }, + "peerDependencies": { + "react": "^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0", + "react-dom": "^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/wordcloud": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@visx/wordcloud/-/wordcloud-2.10.0.tgz", + "integrity": "sha512-SN3W9VbnU/qYofPG5xlN0jJWFTMo5v9jlJtWFLgTy9aHV3CtclyyEAQ6/+VPrKWuNR5bgtOSegiE8EJdobrStg==", + "dependencies": { + "@types/d3-cloud": "1.2.5", + "@visx/group": "2.10.0", + "d3-cloud": "^1.2.5" + }, + "peerDependencies": { + "react": "^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, "node_modules/acorn": { "version": "8.7.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", @@ -1431,11 +1498,24 @@ "internmap": "^1.0.0" } }, + "node_modules/d3-cloud": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-cloud/-/d3-cloud-1.2.5.tgz", + "integrity": "sha512-4s2hXZgvs0CoUIw31oBAGrHt9Kt/7P9Ik5HIVzISFiWkD0Ga2VLAuO/emO/z1tYIpE7KG2smB4PhMPfFMJpahw==", + "dependencies": { + "d3-dispatch": "^1.0.3" + } + }, "node_modules/d3-color": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" }, + "node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, "node_modules/d3-format": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", @@ -1496,6 +1576,11 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3864,6 +3949,18 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-use-measure": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", + "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==", + "dependencies": { + "debounce": "^1.2.1" + }, + "peerDependencies": { + "react": ">=16.13", + "react-dom": ">=16.13" + } + }, "node_modules/reduce-css-calc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", @@ -4661,6 +4758,19 @@ "integrity": "sha512-WiBSI6JBIhC6LRIsB2Kwh8DsGTlbBU+mLRxJmAe3LjHTdkDpwIbEOZgoXBbZilk/vlfjK8i6nKRAvIRn1XaIMw==", "dev": true }, + "@types/d3": { + "version": "3.5.47", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.47.tgz", + "integrity": "sha512-VkWIQoZXLFdcBGe5pdBKJmTU3fmpXvo/KV6ixvTzOMl1yJ2hbTXpfvsziag0kcaerPDwas2T0vxojwQG3YwivQ==" + }, + "@types/d3-cloud": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/d3-cloud/-/d3-cloud-1.2.5.tgz", + "integrity": "sha512-vEIER9DsEBUOdpRiwCh3n1qE+cV6h4e1LhxhY2sLt+m8LPNAIkOOhTlqk0JDiBwD+ZPM8ynFAOU3AuPuVYBFBA==", + "requires": { + "@types/d3": "^3" + } + }, "@types/d3-color": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.4.2.tgz", @@ -4742,7 +4852,6 @@ "version": "18.0.5", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.5.tgz", "integrity": "sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==", - "dev": true, "requires": { "@types/react": "*" } @@ -4880,6 +4989,16 @@ "prop-types": "^15.6.0" } }, + "@visx/bounds": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@visx/bounds/-/bounds-2.10.0.tgz", + "integrity": "sha512-rY7WFTIjQaXA8tFL45O2qbtSRkyF4yF75HiWz06F7BVmJ9UjF2qlomB3Y1z6gk6ZiFhwQ4zxABjOVjAQPLn7nQ==", + "requires": { + "@types/react": "*", + "@types/react-dom": "*", + "prop-types": "^15.5.10" + } + }, "@visx/curve": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@visx/curve/-/curve-2.1.0.tgz", @@ -4889,6 +5008,15 @@ "d3-shape": "^1.0.6" } }, + "@visx/event": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@visx/event/-/event-2.6.0.tgz", + "integrity": "sha512-WGp91g82s727g3NAnENF1ppC3ZAlvWg+Y+GG0WFg34NmmOZbvPI/PTOqTqZE3x6B8EUn8NJiMxRjxIMbi+IvRw==", + "requires": { + "@types/react": "*", + "@visx/point": "2.6.0" + } + }, "@visx/grid": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/@visx/grid/-/grid-2.10.0.tgz", @@ -4964,6 +5092,28 @@ "reduce-css-calc": "^1.3.0" } }, + "@visx/tooltip": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@visx/tooltip/-/tooltip-2.10.0.tgz", + "integrity": "sha512-6Zrd79MIEfyuLBcZ1ypSeAkpQc8oLRNB7FQnegzl3Lje4LK5lJtuf5ST0mwK6G2Uv+GlOW9REJ6VK4gfAGkq9A==", + "requires": { + "@types/react": "*", + "@visx/bounds": "2.10.0", + "classnames": "^2.3.1", + "prop-types": "^15.5.10", + "react-use-measure": "^2.0.4" + } + }, + "@visx/wordcloud": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@visx/wordcloud/-/wordcloud-2.10.0.tgz", + "integrity": "sha512-SN3W9VbnU/qYofPG5xlN0jJWFTMo5v9jlJtWFLgTy9aHV3CtclyyEAQ6/+VPrKWuNR5bgtOSegiE8EJdobrStg==", + "requires": { + "@types/d3-cloud": "1.2.5", + "@visx/group": "2.10.0", + "d3-cloud": "^1.2.5" + } + }, "acorn": { "version": "8.7.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", @@ -5256,11 +5406,24 @@ "internmap": "^1.0.0" } }, + "d3-cloud": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-cloud/-/d3-cloud-1.2.5.tgz", + "integrity": "sha512-4s2hXZgvs0CoUIw31oBAGrHt9Kt/7P9Ik5HIVzISFiWkD0Ga2VLAuO/emO/z1tYIpE7KG2smB4PhMPfFMJpahw==", + "requires": { + "d3-dispatch": "^1.0.3" + } + }, "d3-color": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, "d3-format": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", @@ -5321,6 +5484,11 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, + "debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -6997,6 +7165,14 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "react-use-measure": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", + "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==", + "requires": { + "debounce": "^1.2.1" + } + }, "reduce-css-calc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", diff --git a/package.json b/package.json index fc11697..6358840 100644 --- a/package.json +++ b/package.json @@ -16,10 +16,13 @@ }, "dependencies": { "@visx/axis": "^2.10.0", + "@visx/event": "^2.6.0", "@visx/grid": "^2.10.0", "@visx/group": "^2.10.0", "@visx/scale": "^2.2.2", "@visx/shape": "^2.10.0", + "@visx/tooltip": "^2.10.0", + "@visx/wordcloud": "^2.10.0", "@visx/text": "^2.10.0", "next": "12.1.6", "react": "18.1.0", diff --git a/pages/_app.css b/pages/_app.css index 92ef010..0c34108 100644 --- a/pages/_app.css +++ b/pages/_app.css @@ -64,7 +64,7 @@ body { background-color: var(--primary-background); color: var(--primary-text); - font-family: "Inconsolata", "monospace"; + font-family: "Inconsolata", monospace; margin: 0; } @@ -109,4 +109,4 @@ a:hover { --card-background: var(--dark--card-background); --label: var(--dark--label); } -} +} \ No newline at end of file diff --git a/pages/font.css b/pages/font.css index c6ea327..f8229d1 100644 --- a/pages/font.css +++ b/pages/font.css @@ -77,4 +77,4 @@ src: local(''), url('../public/fonts/inconsolata-v30-latin-900.woff2') format('woff2'), url('../public/fonts/inconsolata-v30-latin-900.woff') format('woff'); -} +} \ No newline at end of file diff --git a/pages/playground.tsx b/pages/playground.tsx index 6c1b881..c23fd9f 100644 --- a/pages/playground.tsx +++ b/pages/playground.tsx @@ -1,10 +1,15 @@ import { BarGraphHorizontal, BarGraphVertical } from "components/BarGraph"; -import { mockPieData, mockCategoricalData } from "data/mocks"; +import { + mockPieData, + mockCategoricalData, + moreMockCategoricalData, +} from "data/mocks"; import React from "react"; import { PieChart } from "@/components/PieChart"; import { ColorPalette } from "../components/ColorPalette"; +import { WordCloud } from "../components/WordCloud"; import styles from "./playground.module.css"; @@ -12,7 +17,7 @@ export default function Home() { return (

Playground

-

Show off your components here!

+

Show off your components here!

``

{""}

@@ -20,7 +25,6 @@ export default function Home() {
-

{""}

@@ -36,7 +40,6 @@ export default function Home() { right: 20, }} /> -

{""}

@@ -56,6 +59,15 @@ export default function Home() { right: 20, }} /> +

+ {""} +

+ ({ + text: word.key, + value: word.value, + }))} + /> ); }