How to use *ngFor to show rows of data in Angular - html

I am trying to use * ngFor to create new "rows" as new categories are being added.
The problem is that when running the program, I do not receive any error but also do not get the intended. I've tried to add a few things, but everything under in * ngFor not "running" ... can anyone help me?
GetCategory() {
var self = this;
this.Global.refreshToken().subscribe(function (result) {
self.uploadService.getCategory().then(function (resultado) {
if (resultado) {
// self.category = resultado;
var categories = JSON.parse(resultado);
// console.log(categories);
} else {
}
}).catch();
});
}
<div class="bodyPermCardDam">
<div *ngFor="let category of categories; let i = index">
<ng-template>
<div class="categoryChoosedName catParm{{category.ID}}" (click)="SelectCategoryPerm(category.ID,1)">
<svg class="folder" id="folder{{category.ID}}" xmlns="http://www.w3.org/2000/svg" width="24" height="19.2" viewBox="0 0 24 19.2">
<style type="text/css">
.folder:hover .stSpecial,
.folder:active .stSpecial {
fill: #4981C2 !important;
}
.stSpecial {
transition: all 0.3s ease 0s;
}
</style>
<g transform="translate(-32 -92)">
<g transform="translate(28 84)">
<path class="stSpecial" d="M13.6,8H6.4a2.389,2.389,0,0,0-2.388,2.4L4,24.8a2.4,2.4,0,0,0,2.4,2.4H25.6A2.4,2.4,0,0,0,28,24.8v-12a2.4,2.4,0,0,0-2.4-2.4H16Z" fill="#caced5" />
</g>
</g>
</svg> {{category.Name}}
</div>
</ng-template>
</div>
</div>

Remove ng-template and your code should show results inside *ngFor. That's how <ng-template> works.
You need ng-container to render ng-template. Check this out
<div class="bodyPermCardDam">
<div *ngFor="let category of categories; let i = index">
<div class="categoryChoosedName catParm{{category.ID}}" (click)="SelectCategoryPerm(category.ID,1)">
<svg class="folder" id="folder{{category.ID}}" xmlns="http://www.w3.org/2000/svg" width="24" height="19.2" viewBox="0 0 24 19.2">
<style type="text/css">
.folder:hover .stSpecial,
.folder:active .stSpecial {
fill: #4981C2 !important;
}
.stSpecial {
transition: all 0.3s ease 0s;
}
</style>
<g transform="translate(-32 -92)">
<g transform="translate(28 84)">
<path class="stSpecial" d="M13.6,8H6.4a2.389,2.389,0,0,0-2.388,2.4L4,24.8a2.4,2.4,0,0,0,2.4,2.4H25.6A2.4,2.4,0,0,0,28,24.8v-12a2.4,2.4,0,0,0-2.4-2.4H16Z" fill="#caced5" />
</g>
</g>
</svg> {{category.Name}}
</div>
</div>
</div>

you need to declare a public list of categories in the component :
public categories : any[];
GetCategory() {
var self = this;
this.Global.refreshToken().subscribe(function (result) {
self.uploadService.getCategory().then(function (resultado) {
if (resultado) {
this.categories = JSON.parse(resultado);
} else {
}
}).catch();
});
}
and in the view wait for the data by adding an *ngIf :
<div class="bodyPermCardDam" *ngIf="categories">
<div *ngFor="let category of categories; let i = index">
...
</div>
</div>

Related

Cropped SVG with Clip-path changes Height on zooming in and out [duplicate]

I wanted a cylindrical container containing liquid and this liquid changes color and its amount in that container, So I used SVG for this purpose (SVG is used for liquid in a cylindrical container).
Here is the source code along with SVG
function changeCol(col) {
document.querySelector('path').style.setProperty('fill', col, '!important');
document.querySelector('ellipse').style.setProperty('fill', col, '!important');
//Its not working I dont know why.
}
function changeHeight(vol) {
//Some Code to change its height.
}
.container {
width: fit-content;
border: solid red;
}
.liquid {
width: 200px;
}
.liquid svg * {
fill: red !important;
}
<div class="container">
<div class="liquid">
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 216.66 325.25">
<title>liquid_RBt</title>
<path d="M216.66,28V297.25c0,15.47-48.5,28-108.33,28S0,312.72,0,297.25V28C0,43.46,48.5,56,108.33,56S216.66,43.46,216.66,28Z" style="fill:#fff;stroke:#fff;stroke-miterlimit:10;opacity:0.7000000000000001"/>
<ellipse cx="108.33" cy="28" rx="108.33" ry="28" style="fill:#fff;stroke:#fff;stroke-miterlimit:10;opacity:0.8"/>
</svg>
</div>
</div>
<div class="controller">
<div class="color-change">
<button class="col-btn" onclick="changeCol('red');">Red</button>
<button class="col-btn" onclick="changeCol('blue');">Blue</button>
<button class="col-btn" onclick="changeCol('green');">green</button>
</div>
<div class="change-amount">
<input type="number" id="amountInp" onchange='changeHeight(this.value)' placeholder="(in ml)">
</div>
</div>
I've clipped the path with a clipPath that I then move about to hide the parts of the polygon that need to disappear.
I don't know the volume of the cylinder either so you might want to scale the number.
I also fixed the colouring.
function changeCol(col) {
document.querySelector('path').style.setProperty('fill', col);
document.querySelector('ellipse').style.setProperty('fill', col);
}
function changeHeight(vol) {
// not sure how much 100ml is supposed to fill up
document.querySelector('ellipse').cy.baseVal.value = 300 - vol;
document.querySelector('rect').y.baseVal.value = 300-vol;
}
.container {
width: fit-content;
border: solid red;
}
.liquid {
width: 200px;
}
<div class="container">
<div class="liquid">
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 216.66 325.25">
<title>liquid_RBt</title>
<defs>
<clipPath id="cp">
<rect x="0" y="0" width="230" height="400"/>
</clipPath>
</defs>
<path d="M216.66,28V297.25c0,15.47-48.5,28-108.33,28S0,312.72,0,297.25V28C0,43.46,48.5,56,108.33,56S216.66,43.46,216.66,28Z" style="fill:red;stroke:#fff;stroke-miterlimit:10;opacity:0.7000000000000001;clip-path: url(#cp)"/>
<ellipse cx="108.33" cy="28" rx="108.33" ry="28" style="fill:red;stroke:#fff;stroke-miterlimit:10"/>
</svg>
</div>
</div>
<div class="controller">
<div class="color-change">
<button class="col-btn" onclick="changeCol('red');">Red</button>
<button class="col-btn" onclick="changeCol('blue');">Blue</button>
<button class="col-btn" onclick="changeCol('green');">green</button>
</div>
<div class="change-amount">
<input type="number" id="amountInp" onchange='changeHeight(this.value)' placeholder="(in ml)">
</div>
</div>
Set the preserve aspect ratio to none.
<svg preserveAspectRatio="none" /* here are your other attributes */>

Pause video on slide

I want to pause the VIDEO when I slide by dragging or using slide next, prev buttons.
It doesn't matter which slider. it can be useful-swiper or owl-carousel
I'm using ngx-useful-swiper as my Carousel.
I can use ngx-owl-carousel-o instead, But if it worked with anyone
My HTML
<swiper [config]="heroSlider" #usefulSwiper>
<div class="swiper-wrapper">
<div class="swiper-slide text-center" *ngFor="let item of sections.about_video; index as i">
<video
poster="{{ fileUrl + item.thumbnail }}"
playsinline
autoplay="false"
muted
controls="false"
onloadedmetadata="this.muted = true"
src="{{ fileUrl + item.video }}"
id="video"
#video
></video>
</div>
</div>
<button class="btn p-0 btn-prev" (click)="previousSlide()">
<svg
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 26 43"
style="enable-background: new 0 0 26 43"
xml:space="preserve"
>
<path
id="Path_3540"
class="st0"
d="M21.5,43c2.5,0,4.5-2,4.5-4.5c0-1.2-0.5-2.4-1.3-3.2L10.9,21.5L24.7,7.7
c1.7-1.8,1.7-4.7-0.1-6.4c-1.8-1.7-4.5-1.7-6.3,0l-16.9,17c-1.8,1.8-1.8,4.6,0,6.4l16.9,17C19.1,42.5,20.3,43,21.5,43z"
/>
</svg>
</button>
<button class="btn p-0 btn-next" (click)="nextSlide()">
<svg
class="icon"
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 26 43"
style="enable-background: new 0 0 26 43"
xml:space="preserve"
>
<path
id="Path_3539"
class="st0"
d="M4.5,43C2,43,0,41,0,38.5c0-1.2,0.5-2.4,1.3-3.2l13.7-13.8L1.3,7.7c-1.7-1.8-1.7-4.7,0.1-6.4c1.8-1.7,4.5-1.7,6.3,0l16.9,17c1.8,1.8,1.8,4.6,0,6.4l-16.9,17C6.9,42.5,5.7,43,4.5,43z"
/>
</svg>
</button>
</swiper>
My TS
heroSlider: SwiperOptions = {
loop: false,
slidesPerView: 1,
on: {
transitionEnd: function (Swiper) {
console.log(Swiper);
},
},
};
If you simply mean you want to pause video when you click the next or previous buttons, you can add a listener for those buttons and in that listener pause the video.
Some example below showing adding an ID to the button and then using this to find the button in your Javascript and add a listener.
You can add a resume button also or just have the user click play on the video.
<button id="btnNext" class="btn p-0 btn-prev" (click)="previousSlide()">
var vid1 = document.getElementById("YourVideoID");
var btnNext = document.getElementById("NextButton");
var btnPrev = document.getElementById("PrevButton");
var btnResume = document.getElementById("PrevButton");
btnNext.addEventListener("click", function() {
vid1.pause()
});
btnPrev.addEventListener("click", function() {
vid1.pause()
});
btnResume.addEventListener("click", function() {
vid1.play()
});

my addEventListener click function isnt working

Second click function wont run and i am unsure why. The first one runs fine and does what it should but the second should allow the user to click on the circle that appears and have an info box show up, but nothing will click im assuming to make said info box appear! I did not add all the html ass there is a lot of paths. Im confused as to why the first one woukd work fne but the second doesnt.
<head>
<meta charset="UTF-8">
<title>POLLENATORS PRESENTATION INFOGRAPHIC APP</title>
<!-- main css -->
<link href="css/main.css" rel="stylesheet" type="text/css">
<!-- load jquery -->
<script src="js/jquery-latest.min.js"></script>
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1367 769">
<title>pollen</title>
<!-- BACKGROUND -->
<g id="background">
</g>
<!-- CLOUDS -->
<g id="clouds">
</g>
<!-- FLOWER ANIMATION AND CLICK -->
<g id="flower">
</g>
<!-- FLOWER PETAL INFO -->
<g id="flowerPetal">
</g>
<!-- FLOWER PETAL INFO BUTTON -->
<g id="petalBut">
</g>
<!-- FLOWER LEAVES INFO -->
<g id="flowerLeaves">
</g>
<!-- FLOWER LEAVES INFO BUTTON -->
<g id="leafBut">
</g>
<!-- FLOWER FRUIT INFO -->
<g id="flowerFruit">
</g>
<!-- FLOWER FRUIT INFO BUTTON -->
<g id="fruitBut">
</g>
<!-- FLOWER STEM INFO -->
<g id="flowerStem">
</g>
<!-- FLOWER STEM INFO BUTTON -->
<g id="stemBut">
</g>
<!-- FLOWER SEEDS INFO -->
<g id="flowerSeeds">
</g>
<!-- FLOWR SEED INFO BUTTON -->
<g id="seedBut">
</g>
<!-- FLOWER ROOTS INFO -->
<g id="flowerRoots">
</g>
<!-- FLOWER ROOTS INFO BUTTON -->
<g id="rootBut">
</g>
<!-- BEE ANIMATION -->
<g id="bee">
</g>
<!-- BAT ANIMATION -->
<g id="bat">
</g>
<!-- BUTTERFLY ANIMATION -->
<g id="butterfly">
</g>
<!-- TEXT SPEECH -->
<g id="textSpeech">
</g>
<!-- SPIDER ANIMATION AND CLICK -->
<g id="spider">
</g>
<!-- MAIN FLOWER INFO -->
<g id="flowerInfo">
</g>
<!-- SNAIL ANIMATION -->
<g id="snail">
</g>
<!-- CLICK FLOWER INSTRUCTIONS -->
<g id="clickFlower">
</g>
<!-- TEXT SPEECH 1 -->
<g id="textSpeech1">
</g>
<!-- TEXT SPEECH 2 -->
<g id="textSpeech2">
</g>
<!-- TEXT SPEECH 3 -->
<g id="textSpeech3">
</g>
<!-- TEXT SPEECH 4 -->
<g id="textSpeech4">
</g>
<!-- TEXT SPEECH 5 -->
<g id="textSpeech5">
</g>
<!-- TEXT SPEECH 6 -->
<g id="textSpeech6">
</g>
<!-- TEXT SPEECH 7 -->
<g id="textSpeech7">
</g>
</svg>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.0.2/TweenMax.min.js"></script>
<script src="js/main.js"></script>
</body>
</html>
window.onload = function ()
{
"use strict"
var myBee = document.getElementById('bee');
var myBat = document.getElementById('bat');
var mySpider = document.getElementById('spider');
var myFlower = document.getElementById('flower');
var flowerPetal = document.getElementById('flowerPetal');
var petalButton = document.getElementById('petalBut');
var flowerLeaves = document.getElementById('flowerLeaves');
var leafButton = document.getElementById('leafBut');
var flowerFruit = document.getElementById('flowerFruit');
var fruitBut = document.getElementById('fruitBut');
var flowerStem = document.getElementById('flowerStem');
var stemBut = document.getElementById('stemBut');
var flowerSeeds = document.getElementById('flowerSeeds');
var seedBut = document.getElementById('seedBut');
var flowerRoots = document.getElementById('flowerRoots');
var rootBut = document.getElementById('rootBut');
var mySnail = document.getElementById('snail');
var myButter = document.getElementById('butterfly');
var textSpeech = document.getElementById('textSpeech');
var textSpeech1 = document.getElementById('textSpeech1');
var textSpeech2 = document.getElementById('textSpeech2');
var textSpeech3 = document.getElementById('textSpeech3');
var textSpeech4 = document.getElementById('textSpeech4');
var textSpeech5 = document.getElementById('textSpeech5');
var textSpeech6 = document.getElementById('textSpeech6');
var textSpeech7 = document.getElementById('textSpeech7');
var flowerClick = document.getElementById('clickFlower');
var flowerInfo = document.getElementById('flowerInfo');
TweenMax.to(myBee, 0, {
opacity: 0
});
TweenMax.to(myFlower, 0, {
opacity: 0
});
TweenMax.to(flowerPetal, 0, {
opacity: 0
});
TweenMax.to(petalButton, 0, {
opacity: 0
});
TweenMax.to(flowerLeaves, 0, {
opacity: 0
});
TweenMax.to(leafButton, 0, {
opacity: 0
});
TweenMax.to(flowerFruit, 0, {
opacity: 0
});
TweenMax.to(fruitBut, 0, {
opacity: 0
});
TweenMax.to(flowerStem, 0, {
opacity: 0
});
TweenMax.to(stemBut, 0, {
opacity: 0
});
TweenMax.to(flowerSeeds, 0, {
opacity: 0
});
TweenMax.to(seedBut, 0, {
opacity: 0
});
TweenMax.to(flowerRoots, 0, {
opacity: 0
});
TweenMax.to(rootBut, 0, {
opacity: 0
});
TweenMax.to(myBat, 0, {
opacity: 0
});
TweenMax.to(myButter, 0, {
opacity: 0
});
TweenMax.to(textSpeech, 0, {
opacity: 0
});
TweenMax.to(textSpeech1, 0, {
opacity: 0
});
TweenMax.to(textSpeech2, 0, {
opacity: 0
});
TweenMax.to(textSpeech3, 0, {
opacity: 0
});
TweenMax.to(textSpeech4, 0, {
opacity: 0
});
TweenMax.to(textSpeech5, 0, {
opacity: 0
});
TweenMax.to(textSpeech6, 0, {
opacity: 0
});
TweenMax.to(textSpeech7, 0, {
opacity: 0
});
TweenMax.to(flowerClick, 0, {
opacity: 0
});
TweenMax.to(mySnail, 0, {
opacity: 0
});
TweenMax.from(mySpider, 4, {
y: -100
});
TweenMax.to(mySpider, 4, {
y: 0
});
TweenMax.from(flowerInfo, 4, {
y: -100
});
TweenMax.to(flowerInfo, 4, {
y: 0
});
mySpider.addEventListener("click", function () {
TweenMax.to(mySpider, 3, {
opacity: 0
});
TweenMax.to(flowerInfo, 3, {
opacity: 0
});
TweenMax.from(myFlower, 3, {
y: 800
});
TweenMax.to(myFlower, 3, {
y: -10,
opacity: 1
});
TweenMax.from(mySnail, 3, {
x: 300,
opacity: 1,
delay: 2
});
TweenMax.to(mySnail, 3, {
x: 20,
opacity: 1,
delay: 2
});
TweenMax.from(flowerClick, 3, {
opacity: 0,
delay: 3
});
TweenMax.to(flowerClick, 3, {
opacity: 1,
delay: 3
});
TweenMax.to(petalButton, 3, {
opacity: 1,
delay: 3.5,
x: 75
});
TweenMax.to(leafButton, 3, {
opacity: 1,
delay: 3.5,
x: 50
});
TweenMax.to(rootBut, 3, {
opacity: 1,
delay: 3.5,
x: 100
});
TweenMax.to(fruitBut, 3, {
opacity: 1,
delay: 3.5,
x: 100
});
TweenMax.to(seedBut, 3, {
opacity: 1,
delay: 3.5,
x: 30
});
TweenMax.to(stemBut, 3, {
opacity: 1,
delay: 3.5,
x: 40
});
});
petalButton.addEventListener("click", function () {
TweenMax.to(flowerPetal, 3, {
opacity: 1
});
});
};

How to create a clickable grid of triangles using html, svg?

I have already created a grid of triangles like so:
svg {
margin-left: 0px;
margin-right: -60px;
padding: 0;
}
<div data-bind="foreach: Grid">
<div data-bind="foreach: $data.rowData">
<!-- ko if: $data.owner() === 0 && ($data.pos[0] + $data.pos[1])%2 === 0-->
<svg height="103.92" width="120">
<polygon class="" points="60,0 0,103.92 120,103.92" style="fill:grey;" data-bind="click: $root.test.bind($data, $data)" />
</svg>
<!-- /ko -->
<!-- ko if: $data.owner() === 0 && ($data.pos[0] + $data.pos[1])%2 === 1-->
<svg height="103.92" width="120">
<polygon class="" points="0,0 120,0 60,103.92" style="fill:grey;" data-bind="click: $root.test.bind($data, $data)" />
</svg>
<!-- /ko -->
</div>
</div>
My problem is that only the left half of the triangles is clickable. I think this is due to the (still rectangular) shape of the svg-element. But I have no idea how to fix this. Is there any way to make every triangle clickable in its whole area?
At the moment, all your individual SVGs are overlapping one another and any click that misses a triangle will be swallowed by the parent <svg> element.
The cleanest solution would be to put all your polygons in one big SVG. However there is another way around your problem using the pointer-events property.
Set pointer-events="none" on your <svg> elements so that clicks will pass through them. But you'll also need to set an explicit pointer-events="fill" on your polygons, since otherwise they'll inherit the "none" from their parent SVGs.
var output = document.getElementById("output");
document.getElementById("red").addEventListener("click", function(e) {
output.textContent = "red";
});
document.getElementById("green").addEventListener("click", function(e) {
output.textContent = "green";
});
svg {
position: absolute;
top: 0;
left: 0;
pointer-events: none;
}
polygon {
pointer-events: fill;
}
#output {
margin-top: 120px;
}
<svg width="100px" height="100px">
<polygon points="0,0,100,0,100,100" fill="red" id="red"/>
</svg>
<svg width="100px" height="100px">
<polygon points="0,0,100,100,0,100" fill="green" id="green"/>
</svg>
<div id="output"></div>
You should use one svg tag with both polygons inside it. This way the Square svg elements won't overlap each other:
polygon {
fill: grey;
}
polygon:hover {
fill: #000;
}
<svg height="103.92" width="185">
<polygon points="60,0 0,103.92 120,103.92" />
<polygon points="65,0 185,0 125,103.92" />
</svg>

i have Multiple svg elements when mouseover on 1 element all element must be show text hover at a same time

I have Multiple SVG elements when mouseover on 1 element all element must be show text hover at a same time..
How i can do this?
Here is my code...
<html>
<head>
<title>conservedClusters_FRAAL_16</title>
</head>
<body>
<svg width="1500" height="500" xmlns="http://www.w3.org/2000/svg" version="1.1">
<style>
.tooltip{
font-size: 16px;
font-family: Times New Roman;
}
.tooltip_bg{
fill: white;
stroke: black;
stroke-width: 1;
opacity: 0.9;
}
</style>
<script type="text/ecmascript">
<![CDATA[
function init(evt)
{
if ( window.svgDocument == null )
{
svgDocument = evt.target.ownerDocument;
}
tooltip = svgDocument.getElementById('tooltip');
tooltip_bg = svgDocument.getElementById('tooltip_bg');
}
function ShowTooltip(evt, mouseovertext, xpos, ypos)
{
tooltip.firstChild.data = mouseovertext;
length = tooltip.getComputedTextLength();
if (length + xpos > 1500)
{
xpos=1500-length-10;
}
tooltip.setAttributeNS(null,"x",xpos+3);
tooltip.setAttributeNS(null,"y",ypos+13);
tooltip.setAttributeNS(null,"visibility","visible");
length = tooltip.getComputedTextLength();
tooltip_bg.setAttributeNS(null,"width",length+8);
tooltip_bg.setAttributeNS(null,"x",xpos);
tooltip_bg.setAttributeNS(null,"y",ypos);
tooltip_bg.setAttributeNS(null,"visibility","visibile");
}
function HideTooltip(evt)
{
tooltip.setAttributeNS(null,"visibility","hidden");
tooltip_bg.setAttributeNS(null,"visibility","hidden");
}
function writeConsole(content,linkaddress,linktext,winTitle) {
top.consoleRef=window.open('','myconsole',
'',//'width=350,height=250'
+',menubar=0'
+',toolbar=1'
+',status=0'
+',scrollbars=1'
+',resizable=1')
top.consoleRef.document.writeln(
'<html><head><title>'+winTitle+'</title></head>'
+'<body bgcolor=white onLoad="self.focus()">'
+''+linktext+''+
'<p><font face="courier">'+content+'</font></p>'
+'</body></html>'
)
top.consoleRef.document.close()
}
function onGeneMouseOver(evt,strokecolor,colorval)
{
var gene = evt.target;
var parent = gene.parentNode;
var others = parent.getElementsByTagName('path');
for (var i=0,len=others.length;i<len;++i)
{
others[i].style.stroke=strokecolor;
others[i].style.fill=colorval;
//others[i].setAttribute("style", "stroke-linecap: square; stroke-linejoin: miter; fill:"+colorval+"; stroke:"+strokecolor+"; stroke-width:1");
}
}
]]>
</script>
<g class="all1303" onmouseover="onGeneMouseOver(evt,'red','pink')" onmouseout="onGeneMouseOver(evt,'black','#cf0f78')">
<path id="all" d=" M487 73L423 73L423 63L403 83L423 103L423 93L487 93 L487 73 " style="stroke-linecap: square; stroke-linejoin: miter; fill:#cf0f78; fill-opacity:1.00; stroke:black; stroke-width:1" onmousemove="ShowTooltip(evt, 'FraEuI1c_4753, 1.00, Beta-ketoacyl synthase', 492, 93)" onmouseout="HideTooltip(evt)" />
<path id="all" d=" M257 156L324 156L324 146L344 166L324 186L324 176L257 176 L257 156 " style="stroke-linecap: square; stroke-linejoin: miter; fill:#cf0f78; fill-opacity:1.00; stroke:black; stroke-width:1" onmousemove="ShowTooltip(evt, 'Franean1_2393, 1.00, Beta-ketoacyl synthase', 349, 176)" onmouseout="HideTooltip(evt)" />
</g>
<rect class="tooltip_bg" id="tooltip_bg"
x="0" y="0" rx="4" ry="4"
width="55" height="17" visibility="hidden"/>
<text class="tooltip" id="tooltip"
x="0" y="0" visibility="hidden">Tooltip</text>
</svg>
</body>
</html>