Грамотное javascript-дерево за 7 шагов
В этой статье описана DOM/CSS-структура дерева, которую я в свое время разработал для dojo toolkit.
Основные особенности:
- Семантическая удобная CSS-разметка.
Внешний вид дерева определяется исключительно CSS.
- Скрытие/раскрытие узлов
- Структура дерева обозначена линиями
- Допускает многострочное HTML-содержимое в узлах
- Оптимизация по количеству HTML-тагов
- Легко дополняется новыми фишками
Например:
Root
-
Item 1
-
Item 2 title long yeah
-
Item 3
Основной строительный блок дерева - его узел.
Каждый узел имеет класс Node и состоит из иконки Expand , заголовка Content и контейнера для детей Container .
Визуальное представление узла:
Например, вот так выглядит разметка просто корневого узла Root , без детей:
<ul class="Container">
<li class="Node IsRoot ExpandOpen">
<div class="Expand"></div>
<div class="Content">Root</div>
</li>
</ul>
- Класс
IsRoot
- говорит о том, что узел является корнем дерева
- Класс
ExpandOpen
- Обозначает, что узел раскрыт
Обратите внимание - вся используемая разметка является исключительно семантической. В данном случае CSS-класс говорит не "каким образом следует выделить элемент", а "что элемент обозначает".
А вот - внутри узла появился Container с (пока) одним потомком Item 1 .
<ul class="Container">
<li class="Node IsRoot ExpandOpen">
<div class="Expand"></div>
<div class="Content">Root</div>
<ul class="Container">
<li class="Node ExpandLeaf">
<div class="Expand"></div>
<div class="Content">Item 1</div>
</li>
</ul>
</li>
</ul>
Семантические элементы:
- Контейнер
Container
- В контейнере содержатся все дети, т.е 1 или больше
Node . Это удобно, ведь чтобы скрыть/показать потомков - достаточно обратиться к контейнеру.
Перебрать всех детей можно, используя Container.childNodes .
- Класс
ExpandLeaf
- Обозначает, что узел является листом дерева.
Узел-потомок уже не имеет класса IsRoot .
Для начала - немного почистим стили для UL и LI : обнулим по умолчанию заданные значения margin, padding и list-style-type .
/* контейнер просто содержит узлы.
Узел сам будет отвечать за свой отступ */
.Container {
padding: 0;
margin: 0;
}
.Container li {
list-style-type: none; /* убрать кружочки/точечки */
}
Самым базовым является стиль для собственно узла Node .
Он задает иерархическую структуру за счет свойства margin-left , которое отодвигает узел-потомок от левой стенки контейнера.
/* узел отодвинут от левой стенки контейнера на 18px
благодаря этим отступам вложенные узлы формируют иерархию
*/
.Node {
margin-left: 18px;
zoom: 1; /* спецсвойство против багов IE6,7. Ставит hasLayout */
}
/* Корневой узел от родительского контейнера не отодвинут.
Ему же не надо демонстрировать отступом, чей он сын.
Это правило идет после .Node, поэтому имеет более высокий приоритет
Так что class="Node IsRoot" дает margin-left:0
*/
.IsRoot {
margin-left: 0;
}
Для того, чтобы иконка Expand находилась слева от содержания - использован принцип двухколоночной верстки.
Левая колонка с фиксированной шириной - Expand , правая колонка - Content .
/* иконка скрытого/раскрытого поддерева или листа
сами иконки идут дальше, здесь общие свойства
*/
.Expand {
width: 18px;
height: 18px;
/* принцип двухколоночной верстки. */
/* float:left и width дива Expand + margin-left дива Content */
float: left;
}
/* содержание (заголовок) узла */
.Content {
/* чтобы не налезать на Expand */
margin-left:18px;
/* высота заголовка - как минимум равна Expand
Т.е правая колонка всегда выше или равна левой.
Иначе нижний float будет пытаться разместиться на получившейся ступеньке
*/
min-height: 18px;
}
/* все правила после * html выполняет только IE6 */
* html .Content {
height: 18px; /* аналог min-height для IE6 */
}
Получившаяся структура допускает любые данные внутри Content , включая многострочные и т.п.
/* открытое поддерево */
.ExpandOpen .Expand {
background-image: url(/forum/img/minus.gif);
}
/* закрытое поддерево */
.ExpandClosed .Expand {
background-image: url(/forum/img/plus.gif);
}
/* лист */
.ExpandLeaf .Expand {
background-image: url(/forum/img/leaf.gif);
}
Здесь очень важен порядок, в котором следуют определения.
Поддеревья вложены, из-за этого получается такая конструкция:
<li class="...Node ExpandOpen...">
...
<li class="...Node ExpandClosed...">
<div class="Expand"></div>
..
</li>
</li>
Внутренний див Expand подходит под оба CSS-правила: и под ExpandOpen .Expand и под .ExpandClosed .Expand .
Правило .ExpandClosed .Expand идет позже, поэтому имеет более высокий приоритет, и будет (правильно) показана иконка закрытого раздела.
Структурные линии обрисовывают дерево, делая иерархию более наглядной.
В некоторых javascript-деревьях они пунктирные и используют кучу лишних тагов из-за неудачно выбранной DOM/CSS-модели.
Метод построения линий, который будем использовать мы, позволяет сделать линии гладкие, растягивающиеся при изменении размера деревьев.
Впрочем, пунктир добавить тоже никто не помешает.
И все это без добавления дополнительных тагов, исключительно средствами CSS.
Наша цель - получить дерево, которое выглядит так:
Info
-
Root
-
Item 1 Multiline test
-
Item 2
<div>Info</div>
<ul class="Container">
<li class="Node IsRoot IsLast ExpandOpen">
<div class="Expand"></div>
<div class="Content">Root</div>
<ul class="Container">
<li class="Node ExpandOpen">
<div class="Expand"></div>
<div class="Content">Item 1<br/>Multiline test</div>
<ul class="Container">
<li class="Node ExpandLeaf IsLast">
<div class="Expand"></div>
<div class="Content">Item 1.1</div>
</li>
</ul>
</li>
<li class="Node ExpandLeaf IsLast">
<div class="Expand"></div>
<div class="Content">Item 2</div>
</li>
</ul>
</li>
</ul>
Каркас из линий образуется дополнительными CSS-правилами.
- Узел
Node поддерживает вертикальную линию к своему следующему соседу
.Node {
margin-left: 18px;
zoom: 1;
/* линия слева образуется повторяющимся фоновым рисунком */
background-image : url(/forum/img/i.gif);
background-position : top left;
background-repeat : repeat-y;
}
- Если соседа ниже нет, то линию вниз продолжать не надо:
/* это правило - ниже .Node, поэтому имеет больший приоритет */
.IsLast {
/* добавить соединительную черточку наверх */
background-image: url(/forum/img/i_half.gif);
background-repeat : no-repeat;
}
Получается, что все узлы на одном уровне соединены вертикальной чертой.
Размер рисунков для фоновых черточек сделан такой, чтобы вертикальная черта проходила строго посередине иконок Expand .
Поэтому получается, что эти иконки автоматически "нанизываются" на вертикальную линию.
Чтобы получить более целостную картину, можно обновить иконки Expand , добавив к ним соединительную черту для подключения заголовка к вертикальной линии.
Вот такие новые иконки для Expand* -классов.
Закрытый узел ExpandClosed
Горизонтальные коннекторы готовы.
Вертикальные линии образуют каркас, а новые иконки Expand* присоединяют узлы к каркасу. Структурные линии построены .
Для скрытия-раскрытия добавим два CSS-правила.
.ExpandOpen .Container {
display: block;
}
.ExpandClosed .Container {
display: none;
}
Как всегда, важен порядок. ExpandClosed идет после ExpandOpen , поэтому имеет больший приоритет, и вложенные закрытые узлы отображаются закрытыми.
Для скрытия-раскрытия javascript-функция всего лишь меняет класс узла. Остальное делает CSS.
Чтобы в дереве поддерживалось скрытие-раскрытие - достаточно повесить обработчик на самый внешний div .
И для красоты - обязательно поправить курсор при наведении на иконки скрытия/раскрытия:
.ExpandOpen .Expand, .ExpandClosed .Expand {
cursor: pointer; /* иконки скрытия-раскрытия */
}
.ExpandLeaf .Expand {
cursor: auto; /* листовой узел */
}
Обязательно задать определение для листового узла тоже, иначе курсор на нем тоже станет pointer (почему? - из-за вложенности div 'ов).
Root
-
Item 1
-
Item 2 title long yeah
-
Item 3
<div onclick="tree_toggle(arguments[0])">
<div>Root</div>
<ul class="Container">
<li class="Node IsRoot ExpandClosed">
<div class="Expand"></div>
<div class="Content">Item 1</div>
<ul class="Container">
<li class="Node ExpandClosed">
<div class="Expand"></div>
<div class="Content">Item 1.1</div>
<ul class="Container">
<li class="Node ExpandLeaf IsLast">
<div class="Expand"></div>
<div class="Content">Item 1.1.2</div>
</li>
</ul>
</li>
<li class="Node ExpandLeaf IsLast">
<div class="Expand"></div>
<div class="Content">Item 1.2</div>
</li>
</ul>
</li>
<li class="Node IsRoot ExpandClosed">
<div class="Expand"></div>
<div class="Content">Item 2<br/>title long yeah</div>
<ul class="Container">
<li class="Node ExpandLeaf IsLast">
<div class="Expand"></div>
<div class="Content">Item 2.1</div>
</li>
</ul>
</li>
<li class="Node ExpandOpen IsRoot IsLast">
<div class="Expand"></div>
<div class="Content">Item 3</div>
<ul class="Container">
<li class="Node ExpandLeaf IsLast">
<div class="Expand"></div>
<div class="Content">Item 3.1</div>
</li>
</ul>
</li>
</ul>
</div>
А вот и сам обработчик события onclick . После правил CSS делать ему осталось всего ничего:
- Определить, произошел ли клик на иконке
Expand , используя event.target(или event.srcElement для IE)
- Получить узел
Node для иконки
- Если узел - не лист, то поменять класс
ExpandOpen <-> ExpandClosed
function tree_toggle(event) {
event = event || window.event
var clickedElem = event.target || event.srcElement
if (!hasClass(clickedElem, 'Expand')) {
return // клик не там
}
// Node, на который кликнули
var node = clickedElem.parentNode
if (hasClass(node, 'ExpandLeaf')) {
return // клик на листе
}
// определить новый класс для узла
var newClass = hasClass(node, 'ExpandOpen') ? 'ExpandClosed' : 'ExpandOpen'
// заменить текущий класс на newClass
// регексп находит отдельно стоящий open|close и меняет на newClass
var re = /(^|\s)(ExpandOpen|ExpandClosed)(\s|$)/
node.className = node.className.replace(re, '$1'+newClass+'$3')
}
function hasClass(elem, className) {
return new RegExp("(^|\\s)"+className+"(\\s|$)").test(elem.className)
}
Пока что мы строили дерево исключительно из HTML-разметки.
Полностью аналогично дерево работает при создании разметки при помощи Javascript. Как загружать данные с сервера в формате JSON, и многое другое Вы можете прочитать в цикле статей AJAX.
Здесь мы посмотрим, как добавить в дерево индикаторы обработки узла: .
Индикатор обработки, вообще говоря, может обозначать любые асинхронные операции. Начиная от загрузки детей и заканчивая удалением всего этого узла с сервера.
Опишем его CSS-правилом:
.ExpandLoading {
width: 18px;
height: 18px;
float: left;
background-image: url(/forum/img/expand_loading.gif);
}
Класс ExpandLoading на время операции будет заменять обычный класс Expand .
Почему нельзя добавить класс ExpandLoading к ExpandOpen/Closed/.. ?
Индикатор может понадобиться в любом месте. Среди потомков "активного" узла могут быть "неактивные" узлы, и среди его родителей - тоже.
Если поставить класс ExpandLoading в один ряд с ExpandOpen/Closed/.. , то он будет либо более приоритетен - и тогда все узлы под ним получат часики, либо менее приоритетен - тогда вообще ничего не будет видно.
И тот и другой варианты - не подходят, когда индикация нужна на одном-единственном узле посередине, например, после редактирования названия узла.
Например, так может выглядеть участок дерева с активным узлом Item 1.1 :
<ul class="Container">
<li class="Node IsRoot IsLast ExpandOpen">
<div class="Expand"></div>
<div class="Content">Item 1</div>
<ul class="Container">
<li class="Node ExpandOpen IsLast">
<div class="ExpandLoading"></div>
<div class="Content">Item 1.1</div>
<ul class="Container">
<li class="Node ExpandOpen">
<div class="Expand"></div>
<div class="Content">Item 1.1.1</div>
</li>
</ul>
</li>
</ul>
</li>
</ul>
Вы можете пожелать добавить в дерево дополнительные элементы. Например, чекбоксы или иконки с типом узла.
Для добавления, например, чекбокса <input type="checkbox"> после иконки Expand , нужно для начала вставить его в структуру сразу после иконки открытия/закрытия.
Указываем размеры, отступ и float: left :
/* Общий размер 14+2+2 = 18 - такой же как Expand */
.Node input {
width: 14px;
height: 14px;
float: left;
margin: 2px;
}
Теперь, сохраняя двухколоночную верстку, нужно отодвинуть Content вправо уже не на 18, а на общую ширину двух float 'ов - 36px.
После того как сдвинулся заголовок Content - естественно сдвинуть и сам узел Node , чтобы структурная линия шла от заголовка.
Все это осуществляется добавлением пары правил:
/* подвинем за оба float'а Node, Content */
.Node, .Content {
margin-left: 36px;
}
/* заново переопределим .IsRoot */
.IsRoot { margin-left: 0; }
<div onclick="tree_toggle(arguments[0])">
<div>Root</div>
<ul class="Container">
<li class="Node IsRoot ExpandOpen">
<div class="Expand"></div>
<input type="checkbox"/>
<div class="Content">Item 1</div>
<ul class="Container">
<li class="Node ExpandOpen">
<div class="Expand"></div>
<input type="checkbox"/>
<div class="Content">Item 1.1 </div>
<ul class="Container">
<li class="Node ExpandLeaf IsLast">
<div class="Expand"></div>
<input type="checkbox"/>
<div class="Content">Item 1.1.2</div>
</li>
</ul>
</li>
<li class="Node ExpandLeaf IsLast">
<div class="Expand"></div>
<input type="checkbox"/>
<div class="Content">Item 1.2</div>
</li>
</ul>
</li>
<li class="Node IsRoot ExpandOpen">
<div class="Expand"></div>
<input type="checkbox"/>
<div class="Content">Item 2<br/>title long yeah</div>
<ul class="Container">
<li class="Node ExpandLeaf IsLast">
<div class="Expand"></div>
<input type="checkbox"/>
<div class="Content">Item 2.1</div>
</li>
</ul>
</li>
<li class="Node ExpandOpen IsRoot IsLast">
<div class="Expand"></div>
<input type="checkbox"/>
<div class="Content">Item 3</div>
<ul class="Container">
<li class="Node ExpandLeaf IsLast">
<div class="Expand"></div>
<input type="checkbox"/>
<div class="Content">Item 3.1</div>
</li>
</ul>
</li>
</ul>
</div>
В принципе, можно использовать и CSS/JS/картинки напрямую со страницы, но они содержат некоторое количество лишних классов.
Для удобства дерево все-в-одном с JS/CSS/HTML находится на отдельной странице. В этом примере полностью расписано дерево без AJAX-индикации и чекбоксов.
Кроме того, можно скачать материалы по статье:
При использовании в своем окружении Вы, наверное, захотите удлинить все классы. добавив какой-то префикс. Например, TreeContainer , TreeNode , и т.п.
Другой вариант, возможно, более удобный - ограничить классы внешним селектором. Например, .Tree .Container , .Tree .Node , * html .Tree .Content и т.п.
|
https://royalhoneyturkey.com/ # Best Male and Female Potency Enhancement online store
طراحی سایت در قزوین
سئو در قزوین
Werther’s Original
Sprinklez Candy Apple Cannabis Strain
Köp / Beställ Ritalin online utan recept
KÖP Concerta 54 mg i Sverige till salu
KÖP adderall 20mg svenska online
Xanor till salu i Sverige utan recept
KÖP I SVERIGE prometazin actavis 25 mg
Rybelsus viktnedgång Sverige (Semaglutid)
Koop Testogel zonder recept
Köp Testogel utan recept
Sitka Gear Equinox Turkey Vest
Blackhorn 209 Powder
Diamondback db15 5.56 NATO Semi Auto Rifle FDE
Buy AR-15s
Buy Hodgdon H1000 Powder
Sig Sauer MCX Spear Semi-Automatic
CZ 527 Carbine 7.62×39 18.5 inch ba…
Sitka Gear Equinox Turkey Vest
Fantastic Funfetti
Froot Loops Ice Cream
Neapolitan Cookies
Rainbow Cookies Bubblegum
White Chocolate Strawberry
Bubblegum Gelato Strain
Orange Creamsicle Strain
Cookies & Cream Milkshake
Original Torchiez
Dulce de Leche
Kiwi Strawberry Splash
Rainbow sherbet Cotton Candy
Deep Fried Oreo Cookies
Strawberry Banana strain Pudding
Cookies Monster
M&M Cookie Bars Dough Cream
Rainbow Confetti Birthday cake
S'mores Stuffed Cookies French Toast
Red Velvet Cheesecake
Fresas Con Crema Near Me
Strawberry Frosted Flakes Milkshake
Juicy Yellow Watermelon
Mississipi Mud Pie
Gumdropz Wild Berry
Gumdropz Berry Bonanza
Gumdropz Island Punch
Gumdropz Strawberry Splash
Key Lime Marshmallow
Fruity Pebblez Marshmallow
Sprinklez Takeover
Torchiez Chili Mango
Sprinklez Pumpkin strain
Lemon Blueberry Cheesecake Bar
Werther’s Original
Torchiez Red Hotz
Grapefruit Cooler
Sprinklez Creamy Peanut Butter
Sprinklez Marshmallow Madness
Sprinklez Peach Perfection
Sprinklez Sweet Tartz
Sprinklez Cherry Lemonade
Sprinklez Candy Apple Cannabis Strain
Sprinklez Cotton Candy
Sprinklez Candy Apple Cannabis Strain
Hot Honey Butter Blondies
Twisted Caribbean
Confetti Cookies Dough Cream
Cherry Ripe Bars Marshmallow
Peach Cobbler Near Me
Brooklyn Blackout Cake
Hot Fudge Sundae Near Me
Caramel Apple Cheesecake
Hagelslag
Blackhorn 209 Powder
Diamondback db15 5.56 NATO Semi Auto Rifle FDE
Fantastic Funfetti
Froot Loops Ice Cream
Neapolitan Cookies
Rainbow Cookies Bubblegum
White Chocolate Strawberry
Bubblegum Gelato Strain
Orange Creamsicle Strain
Cookies & Cream Milkshake
Original Torchiez
Dulce de Leche
Kiwi Strawberry Splash
Rainbow sherbet Cotton Candy
Deep Fried Oreo Cookies
Strawberry Banana strain Pudding
Cookies Monster
M&M Cookie Bars Dough Cream
Rainbow Confetti Birthday cake
S'mores Stuffed Cookies French Toast
Red Velvet Cheesecake
Fresas Con Crema Near Me
Strawberry Frosted Flakes Milkshake
Juicy Yellow Watermelon
Mississipi Mud Pie
Gumdropz Wild Berry
Gumdropz Berry Bonanza
Gumdropz Island Punch
Gumdropz Strawberry Splash
Key Lime Marshmallow
Fruity Pebblez Marshmallow
Sprinklez Takeover
Torchiez Chili Mango
Sprinklez Pumpkin strain
Lemon Blueberry Cheesecake Bar
Werther’s Original
Torchiez Red Hotz
Grapefruit Cooler
Sprinklez Creamy Peanut Butter
Sprinklez Marshmallow Madness
Sprinklez Peach Perfection
Sprinklez Sweet Tartz
Sprinklez Cherry Lemonade
Sprinklez Candy Apple Cannabis Strain
Sprinklez Cotton Candy
Sprinklez Candy Apple Cannabis Strain
Hot Honey Butter Blondies
Twisted Caribbean
Confetti Cookies Dough Cream
Cherry Ripe Bars Marshmallow
Peach Cobbler Near Me
Brooklyn Blackout Cake
Hot Fudge Sundae Near Me
Caramel Apple Cheesecake
Buy AR-15s
Buy Hodgdon H1000 Powder
Oxycodon
Adderall 20mg
temazepam kopen etos
Nolvadex
tylenol kruidvat
Doxycycline 50 mg
Adderall 30mg
Imovane
oxazepam kruidvat
Codeïne
Methadon Kopen
Vyvanse Nederland
Omnadren 250 mg
diazepam kruidvat
Rohypnol 1/2 mg
OxyContin 40 mg
Fentanyl Pleister
Diazepam 10 mg
rohypnol
ritalin snuiven
Sig Sauer MCX Spear Semi-Automatic
CZ 527 Carbine 7.62×39 18.5 inch barrel
CZ 457 American Bolt Action Rimfire Rifle
CZ-USA 457 Premium Bolt Action
Big Boy Steel Side Gate .44 Mag/Spl
LabRadar Chronograph with Bluetooth
Benelli Super Black Eagle 3 Semi-Automatic Shotgun
Bergara Rifles Premier Mountain 2.0 Bolt Action
adderall svenska
rybelsus viktnedgång
tylenol sverige
varning för lyrica
mounjaro sverige
mdpv shop sverige
maxdos imovane
Koop dmt online in nederland
Lsd kopen online
Mdma kopen
OG Kush Wiet kopen
Gelato wiet kopen
Shiitake Mushroom
Rybelsus (Semaglutide) weight loss tablets online
Köp APAURIN DIAZEPAM 10MG Online
Adderall svenska 30mg
Beställa imovane 7.5mg online
Clenbuterol köpa 20mcg i sverige
Gabapentin biverkningar 300mg att köpa
Kodein Apotek 60mg syrup sverige
Köp Fentanyl Drog 100mcg utan kvitto
KÖP Metamfetamin i online
Köp Xanor 2mg i sverige till salu
Köp Rivotril 2mg i sverige
Köp / Beställ Petidin online i sverige
Köp / Beställ Ritalin online utan recept
KÖP adderall 20mg svenska online
Köp Ambien (Zolpidem) 10mg Online
Köp Attentin 5 mg i SVERIGE
Köp Citodon online i sverige utan recept
KÖP Concerta 54 mg i Sverige till salu
köp treo comp 500mg/ 50mg
Köp Dildos online i svenska
KÖP elvanse till salu i Sverige
Köp flytande oxynorm i Sverige
KÖP I SVERIGE Cialis online
Köp i sverige concerta första veckan
Köp i sverige gabapentin 300 mg till salu
KÖP I SVERIGE hydrokodon till salu
Köp Stilnoct 10mg online
KÖP I SVERIGE xanax till salu
Köp Xenical i sverige
KÖP lorazepam sömn
Köp mdpv i sverige
Köp Morfin 60mg i Sverige
Köp mounjaro online i sverige
Köp Naproxen utan recept
Köp Ozempic online utan recept
Köp Rohypnol 2mg online i Sverige
Köp saxenda online utan recept
Köp Sobril online i sverige
Köp Stesolid online i Sverige
Köp Stilnoct 10mg online
Köp stilnoct online i sverige
Köp Suboxone 8mg online i svenska
KÖP subutex 8mg i Sverige
Köp Tramadol 100mg kapsel online
Köp vyvanse 70mg online
Köp Wegovy online i sverige
KÖp Xanax Svenska utan recept
Köp Xenical i sverige
köpa bensodiazepiner in Sverige Pharms
köpa Ketamin till salu online i sverige
köpa sexleksaker
Köpa Viagra I SVERIGE utan recept online
Lyrica 300mg til salg
Metadon 40mg til salg
Naproxen 500 mg online
Oxazepam till salu i Sverige
Oxikodon actavis online
Oxikodon actavis 5 mg Till salu
Oxycontin 80mg till salu i Sverige
Oxynorm till salu i sverige
Paracetamol alvedon / Percocert
Sobril 25 mg
Tylenol svenska 500mg
Xanor till salu i Sverige utan recept
Oxynorm i sverige utan recept
Rybelsus (Semaglutide) weight loss tablets online
Buy Ozempic Online
research chemicals for sale, you may find many websites or research chemicals vendors who are selling chemical planet. But you need to be sure about the quality and price. To research chemicals for sale at an affordable range and high quality products, you are at right place.
nep
mdphp
a-pihp
5-mmpa
4-cec
34-dmmc
3-mec
3-fmc
3-cec
2-mmc 250mg pellets
2-mmc 220mg pellets
newphoria 2-3-fea 35-mg 100mg pellets
3-mma
4f-mph 30mg pellets
4f-mph 15mg pellets
4-me-tmp
4-fma pure
4-fma 60mg pellets
4-fma 150mg pellets
4-fma 100mg pellets
4-fluorine 4-fma 120mg pellets
3-fpm 50mg pellets
3-fpm
3-fa 3-fluoroamphetamine
2-fpm
2-fma 30mg pellets
2-fma
2-fea
2-fa
maxtc
benzo fury 6-apb 100mg pellets
6-apb 130mg pellets
5-eapb/
4f-mar
4c-mar
buy 4b-mar
flunitrazolam 0-25mg blotters
pyrazolam 3mg pellets
buy pyrazolam 2-5-mg pellets
norflurazepam for sale
buy gidazepam pellets 3mg
buy flubrotizolam 0-5 mg pellets
fanax bars
buy flubromazepam pure
flubromazepam 10mg pellets
buy deschloroetizolam online
buy deschloroetizolam
buy clonazolam
buy bromonordiazepam
buy ativan 1mg
buy alprazolam 0-25mg blotters
5-meo-mipt hcl
4-ho-mipt fumarate
amt succinate
5-meo-mipt fumarate 10mg pellets
5-meo-dmt hcl
5-meo-dmt fumarate
5-meo-dmt freebase
5-meo-dalt freebase
4-ho-mipt fumarate 20mg pellets
4-ho-met fumarate spray bottle
4-ho-met fumarate 20mg pellets
4-ho-met fumarate
4-aco-met fumarate 20mg pellets
4-aco-met fumarate
6-apb succinate
5-mapb fumarate
3bk-2c-b hcl
pink star pellets blue bliss pellets
2c-b-fly 10mg pellets
mephedrene 5-mmpa
lsz 150mcg blotters
1b-lsd 125mcg blotters
amicro 1p-lsd 20mcg blotters
1p-lsd 150mcg blotters
1p-lsd 100mcg blotters
1cp-lsd 150mcg pellets
1cp-lsd 10mcg micro pellets
micro 1cp-lsd 20mcg blotters
1cp-lsd 150mcg art design blotters
1cp-lsd 100mcg blotters
1v-lsd 225mcg pellets
i1v-lsd 10mcg micro pellets
1v-lsd 225mcg art design blotters
1v-lsd 150mcg blotters
1d-al-lad 100mcg blotters
1d-lsd 100mcg dropper bottle
1d lsd 225mcg pellets
1d-lsd 10mcg micro pellets
d-lsd 150mcg blotters
mxipr hcl
mxpr hcl
hxe hydrochloride
dck hcl spray bottle
3-methyl-pcp
3-ho-pce hcl
3-ho-pcp hcl
3-cl-pcp hcl
o-pce-hcl
dmxe 40mg pellets
dmxe hcl
dck hcl
3-me-pcpy hcl
3-meo-pce hcl
2 fdck hcl
aminorex
buy benzodiazepines
benzofuran
cathinones
dissociatives
fluorinated
buy lysergamides
phenethylaminestryptamines
buy sulbutiamine online
reduced glutathione
buy phenylpiracetam
buy noopept
5-htp
sgt 507
mdmb-butinaca
adb-butinaca
7-aff powder
7-adb
buy 6tp-sgt
blue bliss pellets pink stars
4f-mph hcl pellets 15mg
4-fpm hcl
3-mma
4-ho-met spray bottle
2c-e hcl
5-meo-mipt hcl
5-meo-dmt freebase powder
5-meo-dipt hcl
5-meo dalt
5-br-dmt
4-ho-mpt
4-ho-mipt
4-ho-met pellets 20mg
buy 4-ho-met powder
4-ho-ept
4-aco-mipt
4-aco-met pellets 20mg
buy 4-aco-met powder
lsz blotters 150mcg
1v-lsd blotters 150mcg
1p-lsd blotters 150mcg
1p-lsd blotters 20mcg
1p-lsd blotters 100mcg
1d-lsd pellets 225mcg
1d-lsd blotters 150mcg
1d-lsd pellets 10mg
1cp-lsd blotters 10mcg
1cp-lsd blotters 20mcg
1cp-lsd blotters 100mcg
1cp-lsd pellet 150mcg
methallylescaline-fumarate
buy amt succinate
6-apb powder
5-mapb fumarate
4-fma hcl powder
buy 3-fma powder
2-fma pellet 30mg
2-fma hcl powder
2-fea hcl
buy dibutylone crystal online
buy a-pihp-s liquid
4-mpd crystal
buy 3-cmc powder
3 cmc crystals
buy nep
buy mephedrene
buy mdphp
2-mmc
pyrazolam pellets 3mg
norflurazepam
2-fdck hcl
2-fdck spray bottle
3-me-pcpy hcl powder
3-meo-pce hcl
3-methyl-pcp hcl powder
dck-hcl powder
dmxe hcl powder
hxe hcl powder
mxpr hcl powder
o-pce hcl powder
dck hcl spray bottle
buy bromazolam
deschloroetizolam pellets 5mg
fanax
flubromazepam
fluetizolam
flunitrazolam pellet 0-25mg
buy benzodiazepines online
c-liquid
synthetic cannabinoids
buy synthetic cathinones
herbal incense
buy lysergamides online
buy phenylethylamine hcl
buy tryptamines online
buy zolpidem, you may find many websites or medicine vendors who are selling buy zolpidem without a prescription. But you need to be sure about the quality and price. To buy zolpidem online at an affordable range and high quality products, you are at right place.
buy zolpidem online
buy lorazepam 2-5mg
buy temazepam online
buy diazepam online
buy bromazepam 6mg online
buy clonazepam 2mg online
buy xanax online overnight
buy tramadol 200mg online
Parking lotnisko chopina to zdecydowanie najlepszy pakring
Trans Annunci Roma is probably the best web platform for free chat with local girls in Italy, so check out and enjoy
Discover top-tier cannabis shopping with our legit online dispensaries ship all 50 states reviews. Glowing reviews attest to our commitment to quality and reliability. Explore our extensive selection, from worldwide weed shipping to premium products. Join satisfied customers who trust our USA-based online dispensary for a discreet and exceptional experience. Buy weed online confidently with our renowned service.
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.