@macrostrat/column-components
Version:
React rendering primitives for stratigraphic columns
1 lines • 4.27 kB
Source Map (JSON)
{"version":3,"file":"column-patterns.cjs","sources":["../../src/lithology/column-patterns.ts"],"sourcesContent":["import {\n useContext,\n createContext,\n useState,\n useCallback,\n useEffect,\n useMemo,\n PropsWithChildren,\n} from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport { GeologicPattern, GeologicPatternContext } from \"./patterns\";\nimport { UUIDProvider, useUUID } from \"../frame\";\n\ninterface PatternDefsCtx {\n trackPattern(id: string): void;\n}\n\nconst PatternDefsContext = createContext<PatternDefsCtx | null>(null);\n\ninterface GeologicPatternProps {\n patternIDs: Set<string | -1>;\n scalePattern?(_: string): number;\n UUID?: string;\n}\n\nconst GeologicPatternDefs = function (props: GeologicPatternProps) {\n let { patternIDs, scalePattern } = props;\n const UUID = props.UUID ?? useUUID();\n\n return h(\n \"defs\",\n Array.from(patternIDs).map(function (id, i) {\n if (id === -1) {\n return null;\n }\n let sz = 100;\n if (scalePattern != null) {\n sz *= scalePattern(id);\n }\n return h(GeologicPattern, {\n key: i,\n prefix: UUID,\n id,\n width: sz,\n height: sz,\n });\n }),\n );\n};\n\ntype LithologySymbolCtx = any;\n\ntype LithProviderProps = PropsWithChildren<LithologySymbolCtx>;\n\nfunction PatternDefsProvider(props: LithProviderProps) {\n /** A next-generation provider for lithology patterns in the context of an SVG.\n * We should consider generalizing this further to work without needing the \"resolveID\" function.\n */\n const { scalePattern, children } = props;\n const [patternIDs, setPatternIDs] = useState<Set<string>>(new Set());\n\n const trackPattern = useCallback(\n (p: string) => {\n if (patternIDs.has(p)) return;\n let newSet = new Set(patternIDs);\n newSet.add(p);\n setPatternIDs(newSet);\n },\n [patternIDs],\n );\n\n const value = useMemo(() => {\n return { trackPattern };\n }, [trackPattern]);\n\n return h(\n UUIDProvider,\n h(\n PatternDefsContext.Provider,\n { value },\n h(\"g.patterns\", [\n h(GeologicPatternDefs, { scalePattern, patternIDs }),\n children,\n ]),\n ),\n );\n}\n\nfunction useGeologicPattern(patternID: string, fallback: string = \"#aaa\") {\n const ctx1 = useContext(GeologicPatternContext);\n const ctx = useContext(PatternDefsContext);\n const UUID = useUUID();\n useEffect(() => {\n ctx?.trackPattern(patternID);\n }, [patternID, ctx]);\n let v = ctx1?.resolvePattern(patternID);\n if (v == null) return fallback;\n\n return `url(#${UUID}-${patternID})`;\n}\n\nexport { PatternDefsProvider, useGeologicPattern };\n"],"names":["createContext","useUUID","h","GeologicPattern","useState","useCallback","useMemo","UUIDProvider","useContext","GeologicPatternContext","useEffect"],"mappings":";;;;;;;;AAiBA,MAAM,qBAAqBA,MAAAA,cAAqC,IAAI;AAQpE,MAAM,sBAAsB,SAAU,OAA6B;AACjE,MAAI,EAAE,YAAY,aAAA,IAAiB;AACnC,QAAM,OAAO,MAAM,QAAQC,cAAA;AAE3B,SAAOC,WAAAA;AAAAA,IACL;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,IAAI,SAAU,IAAI,GAAG;AAC1C,UAAI,OAAO,IAAI;AACb,eAAO;AAAA,MACT;AACA,UAAI,KAAK;AACT,UAAI,gBAAgB,MAAM;AACxB,cAAM,aAAa,EAAE;AAAA,MACvB;AACA,aAAOA,WAAAA,QAAEC,SAAAA,iBAAiB;AAAA,QACxB,KAAK;AAAA,QACL,QAAQ;AAAA,QACR;AAAA,QACA,OAAO;AAAA,QACP,QAAQ;AAAA,MAAA,CACT;AAAA,IACH,CAAC;AAAA,EAAA;AAEL;AAMA,SAAS,oBAAoB,OAA0B;AAIrD,QAAM,EAAE,cAAc,SAAA,IAAa;AACnC,QAAM,CAAC,YAAY,aAAa,IAAIC,MAAAA,SAAsB,oBAAI,KAAK;AAEnE,QAAM,eAAeC,MAAAA;AAAAA,IACnB,CAAC,MAAc;AACb,UAAI,WAAW,IAAI,CAAC,EAAG;AACvB,UAAI,SAAS,IAAI,IAAI,UAAU;AAC/B,aAAO,IAAI,CAAC;AACZ,oBAAc,MAAM;AAAA,IACtB;AAAA,IACA,CAAC,UAAU;AAAA,EAAA;AAGb,QAAM,QAAQC,MAAAA,QAAQ,MAAM;AAC1B,WAAO,EAAE,aAAA;AAAA,EACX,GAAG,CAAC,YAAY,CAAC;AAEjB,SAAOJ,WAAAA;AAAAA,IACLK,MAAAA;AAAAA,IACAL,WAAAA;AAAAA,MACE,mBAAmB;AAAA,MACnB,EAAE,MAAA;AAAA,MACFA,WAAAA,QAAE,cAAc;AAAA,QACdA,WAAAA,QAAE,qBAAqB,EAAE,cAAc,YAAY;AAAA,QACnD;AAAA,MAAA,CACD;AAAA,IAAA;AAAA,EACH;AAEJ;AAEA,SAAS,mBAAmB,WAAmB,WAAmB,QAAQ;AACxE,QAAM,OAAOM,MAAAA,WAAWC,+BAAsB;AAC9C,QAAM,MAAMD,MAAAA,WAAW,kBAAkB;AACzC,QAAM,OAAOP,MAAAA,QAAA;AACbS,QAAAA,UAAU,MAAM;AACd,SAAK,aAAa,SAAS;AAAA,EAC7B,GAAG,CAAC,WAAW,GAAG,CAAC;AACnB,MAAI,IAAI,MAAM,eAAe,SAAS;AACtC,MAAI,KAAK,KAAM,QAAO;AAEtB,SAAO,QAAQ,IAAI,IAAI,SAAS;AAClC;;;"}