The package adds the functionality of hanging hints on map elements
The package is located in the dist
folder:
-
dist/types
TypeScript types -
dist/esm
es6 modules for direct connection in your project -
dist/index.js
Yandex JS Module
to use Yandex JS Module you need to add your module loading handler to JS API
ymaps3.import.loaders.unshift(async (pkg) => {
if (!pkg.includes('ymaps3-hint')) {
return;
}
if (location.href.includes('localhost')) {
await ymaps3.import.script(`/dist/index.js`);
} else {
// You can use another CDN
await ymaps3.import.script(`https://unpkg.com/${pkg}/dist/index.js`);
}
const [_, pkgName] = pkg.split('@');
Object.assign(ymaps3, window[`@${pkgName}`]);
return window[`@${pkgName}`];
});
and in your final code just use ymaps3.import
const LOCATION = {center: [25.205247, 25.077816], zoom: 10};
async function main() {
const {YMapHint, YMapHintContext} = await ymaps3.import('@yandex/ymaps3-hint@0.0.1');
const map = new ymaps3.YMap(document.getElementById('app'), {location: LOCATION});
map.addChild(new YMapDefaultSchemeLayer());
const defaultFeatures = new YMapDefaultFeaturesLayer();
map.addChild(defaultFeatures);
const hint = new YMapHint({
layers: [defaultFeatures.layer],
hint: (object) => object?.properties?.hint
});
map.addChild(hint);
hint.addChild(
new (class MyHint extends ymaps3.YMapEntity {
_onAttach() {
this._element = document.createElement('div');
this._element.className = 'my-hint';
this._detachDom = ymaps3.useDomContext(this, this._element);
this._watchContext(
YMapHintContext,
() => {
this._element.textContent = this._consumeContext(YMapHintContext)?.hint;
},
{immediate: true}
);
}
_onDetach() {
this._detachDom();
}
})()
);
map.addChild(new YMapMarker({coordinates: LOCATION.center, properties: {hint: 'Some hint'}}));
}
main();
const {YMapHint, YMapHintContext} = reactify.module(await ymaps3.import('@yandex/ymaps3-hint@0.0.1'));
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('app')
);
function App() {
const [location, setLocation] = useState(LOCATION);
const getHint = useCallback((object) => object && object.properties && object.properties.hint, []);
return (
<YMap location={location} ref={(x) => (map = x)}>
<YMapDefaultSchemeLayer />
<YMapDefaultFeaturesLayer />
<YMapControls position="right">
<YMapZoomControl />
</YMapControls>
<YMapHint hint={getHint}>
<MyHint />
</YMapHint>
<MyMarker coordinates={LOCATION.center} properties={{hint: 'Some text'}} color={'#ff00ff'} />
</YMap>
);
}
function MyMarker({coordinates, properties, color}) {
return (
<YMapMarker properties={properties} coordinates={coordinates}>
<div
dangerouslySetInnerHTML={{__html: '<svg>...</svg>'}}
style={{transform: 'translate(-15px, -33px)', position: 'absolute'}}
></div>
</YMapMarker>
);
}
function MyHint() {
const ctx = React.useContext(YMapHintContext);
return <div className="my-hint">{ctx && ctx.hint}</div>;
}