djgentelella 0.3.26__py3-none-any.whl → 0.3.28__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- djgentelella/__init__.py +1 -1
- djgentelella/blog/tests/test_entry_forms.py +4 -4
- djgentelella/fields/drfdatetime.py +14 -2
- djgentelella/gtselects.py +23 -0
- djgentelella/management/commands/createbasejs.py +2 -1
- djgentelella/management/commands/loaddevstatic.py +2 -3
- djgentelella/static/djgentelella.vendors.min.css +7 -1
- djgentelella/static/djgentelella.vendors.min.js +32 -23
- djgentelella/static/gentelella/css/custom.css +6 -1
- djgentelella/static/gentelella/js/base/form.common.js +6 -5
- djgentelella/static/gentelella/js/base/tagify.js +45 -0
- djgentelella/static/gentelella/js/base.js +53 -5
- djgentelella/static/gentelella/js/datatables.js +26 -2
- djgentelella/static/gentelella/js/obj_api_management.js +26 -0
- djgentelella/static/gentelella/js/widgets.js +5 -4
- djgentelella/static/vendors/tagify/tagify.min.css +7 -1
- djgentelella/static/vendors/tagify/tagify.min.js +35 -1
- djgentelella/templates/gentelella/blocks/listcard_template.html +2 -2
- djgentelella/templates/gentelella/widgets/tagifyselect.html +1 -0
- djgentelella/tests/Calendar_Test.py +3 -3
- djgentelella/tests/Notification_Test.py +13 -18
- djgentelella/tests/fields/files.py +3 -5
- djgentelella/views/listAreaViewset.py +17 -1
- djgentelella/widgets/tagging.py +20 -0
- {djgentelella-0.3.26.dist-info → djgentelella-0.3.28.dist-info}/METADATA +1 -3
- {djgentelella-0.3.26.dist-info → djgentelella-0.3.28.dist-info}/RECORD +30 -28
- {djgentelella-0.3.26.dist-info → djgentelella-0.3.28.dist-info}/WHEEL +1 -1
- djgentelella/static/vendors/tagify/jQuery.tagify.min.js +0 -25
- {djgentelella-0.3.26.dist-info → djgentelella-0.3.28.dist-info}/AUTHORS +0 -0
- {djgentelella-0.3.26.dist-info → djgentelella-0.3.28.dist-info}/LICENSE.txt +0 -0
- {djgentelella-0.3.26.dist-info → djgentelella-0.3.28.dist-info}/top_level.txt +0 -0
|
@@ -15,7 +15,9 @@ html , body{
|
|
|
15
15
|
height:100%;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
.checkableall{
|
|
19
|
+
width: unset;
|
|
20
|
+
}
|
|
19
21
|
|
|
20
22
|
|
|
21
23
|
.daterangepicker .ranges li {
|
|
@@ -2557,6 +2559,9 @@ span.tag a {
|
|
|
2557
2559
|
width: 100%;
|
|
2558
2560
|
height: 0px
|
|
2559
2561
|
}
|
|
2562
|
+
.tagify {
|
|
2563
|
+
width: 100%;
|
|
2564
|
+
}
|
|
2560
2565
|
.not_valid {
|
|
2561
2566
|
background: #FBD8DB !important;
|
|
2562
2567
|
color: #90111A !important
|
|
@@ -213,6 +213,7 @@ function updateInstanceValuesForm(form, name, value) {
|
|
|
213
213
|
done = true;
|
|
214
214
|
}
|
|
215
215
|
|
|
216
|
+
|
|
216
217
|
// New code for testing (*** start ***)
|
|
217
218
|
// data loading in select, autocompleteselect, autocompletemultiselect
|
|
218
219
|
else if (inputfield.is('select') && inputfield.data().widget === "Select") {
|
|
@@ -220,12 +221,12 @@ function updateInstanceValuesForm(form, name, value) {
|
|
|
220
221
|
done = true;
|
|
221
222
|
} else if (inputfield.is('select') && inputfield.data().widget === "AutocompleteSelect") {
|
|
222
223
|
let data = value;
|
|
223
|
-
|
|
224
|
-
if (
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
});
|
|
224
|
+
|
|
225
|
+
if (data) {
|
|
226
|
+
let newOption = new Option(data.text, data.id, true, true);
|
|
227
|
+
inputfield.append(newOption).trigger('change');
|
|
228
228
|
}
|
|
229
|
+
|
|
229
230
|
done = true;
|
|
230
231
|
} else if (inputfield.is('select') && inputfield.data().widget === "AutocompleteSelectMultiple") {
|
|
231
232
|
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
function build_tagginginput(instances){
|
|
2
|
+
instances.each(function(index, element){
|
|
3
|
+
let tagify = new Tagify(element, {});
|
|
4
|
+
//element.dataset.tagify = JSON.stringify(tagify);
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
function build_tagging_email(instances){
|
|
8
|
+
instances.each(function(index, element){
|
|
9
|
+
let p = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
|
10
|
+
let tagify = new Tagify(element, {
|
|
11
|
+
pattern: p
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function build_remote_tagify_email(inputs){
|
|
17
|
+
inputs.each(function(index, element){
|
|
18
|
+
let url = element.dataset['url'];
|
|
19
|
+
|
|
20
|
+
let tagify = new Tagify(element, {whitelist:[],
|
|
21
|
+
pattern: /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})*$/,
|
|
22
|
+
dropdown: {
|
|
23
|
+
searchKeys: ["value", "name"] // fuzzy-search matching for those whitelist items' properties
|
|
24
|
+
}
|
|
25
|
+
}),
|
|
26
|
+
controller;
|
|
27
|
+
|
|
28
|
+
function onInput( e ){
|
|
29
|
+
var value = e.detail.value
|
|
30
|
+
tagify.whitelist = null // reset the whitelist
|
|
31
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/AbortController/abort
|
|
32
|
+
controller && controller.abort()
|
|
33
|
+
controller = new AbortController()
|
|
34
|
+
// show loading animation and hide the suggestions dropdown
|
|
35
|
+
tagify.loading(true);
|
|
36
|
+
fetch(url+'?value=' + value, {signal:controller.signal})
|
|
37
|
+
.then(RES => RES.json())
|
|
38
|
+
.then(function(newWhitelist){
|
|
39
|
+
tagify.whitelist = newWhitelist // update whitelist Array in-place
|
|
40
|
+
tagify.loading(false); // render the suggestions dropdown
|
|
41
|
+
})
|
|
42
|
+
}
|
|
43
|
+
tagify.on('input', onInput)
|
|
44
|
+
})
|
|
45
|
+
}
|
|
@@ -914,6 +914,7 @@ function updateInstanceValuesForm(form, name, value) {
|
|
|
914
914
|
done = true;
|
|
915
915
|
}
|
|
916
916
|
|
|
917
|
+
|
|
917
918
|
// New code for testing (*** start ***)
|
|
918
919
|
// data loading in select, autocompleteselect, autocompletemultiselect
|
|
919
920
|
else if (inputfield.is('select') && inputfield.data().widget === "Select") {
|
|
@@ -921,12 +922,12 @@ function updateInstanceValuesForm(form, name, value) {
|
|
|
921
922
|
done = true;
|
|
922
923
|
} else if (inputfield.is('select') && inputfield.data().widget === "AutocompleteSelect") {
|
|
923
924
|
let data = value;
|
|
924
|
-
|
|
925
|
-
if (
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
});
|
|
925
|
+
|
|
926
|
+
if (data) {
|
|
927
|
+
let newOption = new Option(data.text, data.id, true, true);
|
|
928
|
+
inputfield.append(newOption).trigger('change');
|
|
929
929
|
}
|
|
930
|
+
|
|
930
931
|
done = true;
|
|
931
932
|
} else if (inputfield.is('select') && inputfield.data().widget === "AutocompleteSelectMultiple") {
|
|
932
933
|
|
|
@@ -2383,3 +2384,50 @@ class CardList {
|
|
|
2383
2384
|
}
|
|
2384
2385
|
}
|
|
2385
2386
|
|
|
2387
|
+
|
|
2388
|
+
function build_tagginginput(instances){
|
|
2389
|
+
instances.each(function(index, element){
|
|
2390
|
+
let tagify = new Tagify(element, {});
|
|
2391
|
+
//element.dataset.tagify = JSON.stringify(tagify);
|
|
2392
|
+
});
|
|
2393
|
+
}
|
|
2394
|
+
function build_tagging_email(instances){
|
|
2395
|
+
instances.each(function(index, element){
|
|
2396
|
+
let p = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
|
2397
|
+
let tagify = new Tagify(element, {
|
|
2398
|
+
pattern: p
|
|
2399
|
+
});
|
|
2400
|
+
});
|
|
2401
|
+
}
|
|
2402
|
+
|
|
2403
|
+
function build_remote_tagify_email(inputs){
|
|
2404
|
+
inputs.each(function(index, element){
|
|
2405
|
+
let url = element.dataset['url'];
|
|
2406
|
+
|
|
2407
|
+
let tagify = new Tagify(element, {whitelist:[],
|
|
2408
|
+
pattern: /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})*$/,
|
|
2409
|
+
dropdown: {
|
|
2410
|
+
searchKeys: ["value", "name"] // fuzzy-search matching for those whitelist items' properties
|
|
2411
|
+
}
|
|
2412
|
+
}),
|
|
2413
|
+
controller;
|
|
2414
|
+
|
|
2415
|
+
function onInput( e ){
|
|
2416
|
+
var value = e.detail.value
|
|
2417
|
+
tagify.whitelist = null // reset the whitelist
|
|
2418
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/AbortController/abort
|
|
2419
|
+
controller && controller.abort()
|
|
2420
|
+
controller = new AbortController()
|
|
2421
|
+
// show loading animation and hide the suggestions dropdown
|
|
2422
|
+
tagify.loading(true);
|
|
2423
|
+
fetch(url+'?value=' + value, {signal:controller.signal})
|
|
2424
|
+
.then(RES => RES.json())
|
|
2425
|
+
.then(function(newWhitelist){
|
|
2426
|
+
tagify.whitelist = newWhitelist // update whitelist Array in-place
|
|
2427
|
+
tagify.loading(false); // render the suggestions dropdown
|
|
2428
|
+
})
|
|
2429
|
+
}
|
|
2430
|
+
tagify.on('input', onInput)
|
|
2431
|
+
})
|
|
2432
|
+
}
|
|
2433
|
+
|
|
@@ -31,6 +31,16 @@ function formatDataTableParams(dataTableParams, settings){
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
var default_table_columns_display = {}
|
|
34
|
+
function toggle_select_all(e){
|
|
35
|
+
let tinstance = $(e.target);
|
|
36
|
+
if(tinstance[0].checked){
|
|
37
|
+
tinstance.closest('table').find('.gtcheckable').prop('checked', true);
|
|
38
|
+
tinstance.closest('table').find('.checkableall').prop('checked', true);
|
|
39
|
+
}else{
|
|
40
|
+
tinstance.closest('table').find('.gtcheckable').prop('checked', false);
|
|
41
|
+
tinstance.closest('table').find('.checkableall').prop('checked', false);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
34
44
|
function addSearchInputsAndFooterDataTable(dataTable, tableId, columns) {
|
|
35
45
|
// takes care of adding the search inputs to each of the columns of the datatable, it will
|
|
36
46
|
// hide/display them according to how the table changes in the responsive mode
|
|
@@ -45,7 +55,7 @@ function addSearchInputsAndFooterDataTable(dataTable, tableId, columns) {
|
|
|
45
55
|
if($(tableId + ' thead tr').length < 2){ // clone the tr only if it wasn't cloned before
|
|
46
56
|
$(tableId + ' thead tr').clone(false).appendTo(tableId + ' thead');
|
|
47
57
|
}
|
|
48
|
-
|
|
58
|
+
let checkable_count=0;
|
|
49
59
|
$(tableId + ' thead tr:eq(1) th').each(function (i) { // add search fields if they are not there already and the column is visible
|
|
50
60
|
var currentColumn = dataTable.column(i);
|
|
51
61
|
var is_display = true
|
|
@@ -54,7 +64,7 @@ function addSearchInputsAndFooterDataTable(dataTable, tableId, columns) {
|
|
|
54
64
|
}
|
|
55
65
|
var columnType = dataTable.settings()[0].aoColumns[i].type; // get the field type
|
|
56
66
|
//currentColumn.responsiveHidden()
|
|
57
|
-
if (is_display && currentColumn.visible() && columnType !== 'actions') { // column is visible
|
|
67
|
+
if (is_display && currentColumn.visible() && columnType !== 'actions' ) { // column is visible
|
|
58
68
|
$(this).css('display', ''); // when it was cloned it might have had display:none specified
|
|
59
69
|
if($(this).find('input').length === 0 && $(this).find('select').length === 0) { // add the input/select just if it doesn't exist already
|
|
60
70
|
var title = currentColumn.header().textContent; // get the field name
|
|
@@ -127,10 +137,24 @@ function addSearchInputsAndFooterDataTable(dataTable, tableId, columns) {
|
|
|
127
137
|
$(this).css('display', 'none');
|
|
128
138
|
}
|
|
129
139
|
|
|
140
|
+
if(columnType === 'checkable'){
|
|
141
|
+
$(this).html("");
|
|
142
|
+
checkable_count=1;
|
|
143
|
+
if($(dataTable.context[0].nTable).data()['checkable']==undefined){
|
|
144
|
+
$(dataTable.context[0].nTable).find('.checkableall').click(toggle_select_all);
|
|
145
|
+
$(dataTable.context[0].nTable).data()['checkable']=true;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
|
|
130
150
|
});
|
|
131
151
|
// add the footer to the table according to the current header - delete previous one before
|
|
132
152
|
$(tableId).find('tfoot').remove();
|
|
133
153
|
$(tableId).append($('<tfoot/>').append( $(tableId + " thead tr:eq(0)").clone()));
|
|
154
|
+
if(checkable_count>0){
|
|
155
|
+
$(tableId).children().last().find('.checkableall').click(toggle_select_all);
|
|
156
|
+
$(tableId).children().last().find('.checkableall').prop('width', 'unset');
|
|
157
|
+
}
|
|
134
158
|
}
|
|
135
159
|
|
|
136
160
|
function clearDataTableFilters(dataTable, tableId){
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
function get_selected_items(dt, table){
|
|
2
|
+
let values = [];
|
|
3
|
+
$(table).find(".gtcheckable:checked").each(function() {
|
|
4
|
+
values.push(this.value);
|
|
5
|
+
});
|
|
6
|
+
return values;
|
|
7
|
+
}
|
|
1
8
|
function gt_show_actions(crud_name){
|
|
2
9
|
return function(data, type, row, meta){
|
|
3
10
|
var html="";
|
|
@@ -352,6 +359,7 @@ function ObjectCRUD(uniqueid, objconfig={}){
|
|
|
352
359
|
uls: null,
|
|
353
360
|
datatable_element: null,
|
|
354
361
|
modal_ids: null,
|
|
362
|
+
checkable: false,
|
|
355
363
|
events: {
|
|
356
364
|
'update_data': function(data){ return data; }
|
|
357
365
|
},
|
|
@@ -406,6 +414,7 @@ function ObjectCRUD(uniqueid, objconfig={}){
|
|
|
406
414
|
"can_update": config.modal_ids.hasOwnProperty("update"),
|
|
407
415
|
"use_get_values_for_update": config.urls.hasOwnProperty("get_values_for_update_url"),
|
|
408
416
|
"create_btn_class": config.btn_class.create,
|
|
417
|
+
"checkable": config.checkable,
|
|
409
418
|
"datatable": null,
|
|
410
419
|
"create_form": null,
|
|
411
420
|
"update_form": null,
|
|
@@ -566,6 +575,23 @@ function ObjectCRUD(uniqueid, objconfig={}){
|
|
|
566
575
|
}
|
|
567
576
|
}
|
|
568
577
|
]
|
|
578
|
+
if(this.checkable){
|
|
579
|
+
config.datatable_inits['columnDefs'].push(
|
|
580
|
+
{
|
|
581
|
+
targets: 0,
|
|
582
|
+
title: "Checkable",
|
|
583
|
+
type: 'checkable',
|
|
584
|
+
className: "no-export-col",
|
|
585
|
+
orderable: false,
|
|
586
|
+
render: function(data, type, full, meta){
|
|
587
|
+
return '<input type="checkbox" class="gtcheckable" name="checkable" value="'+full.id+'" title="'+full.name+'"/>'
|
|
588
|
+
}
|
|
589
|
+
})
|
|
590
|
+
|
|
591
|
+
config.datatable_inits.columns.unshift(
|
|
592
|
+
{data: "id", name: "checkable", title: '<input type="checkbox" class="checkableall"> ', type: "checkable", visible: true}
|
|
593
|
+
)
|
|
594
|
+
}
|
|
569
595
|
}
|
|
570
596
|
this.datatable = gtCreateDataTable(this.config.datatable_element, this.config.urls.list_url,
|
|
571
597
|
this.config.datatable_inits);
|
|
@@ -260,12 +260,10 @@ document.gtwidgets = {
|
|
|
260
260
|
},
|
|
261
261
|
|
|
262
262
|
TaggingInput: function (instance) {
|
|
263
|
-
instance
|
|
263
|
+
build_tagginginput(instance);
|
|
264
264
|
},
|
|
265
265
|
EmailTaggingInput: function (instance) {
|
|
266
|
-
instance
|
|
267
|
-
pattern: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
|
|
268
|
-
});
|
|
266
|
+
build_tagging_email(instance);
|
|
269
267
|
},
|
|
270
268
|
DJGraph: function (instance) {
|
|
271
269
|
instance.gentelella_chart();
|
|
@@ -291,6 +289,9 @@ document.gtwidgets = {
|
|
|
291
289
|
},
|
|
292
290
|
UrlStoryLineInput: function (instance) {
|
|
293
291
|
build_storyline(instance)
|
|
292
|
+
},
|
|
293
|
+
RemoteAutocompleteEmailTagifyWidget: function(instance){
|
|
294
|
+
build_remote_tagify_email(instance)
|
|
294
295
|
}
|
|
295
296
|
}
|
|
296
297
|
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Skipped minification because the original files appears to be already minified.
|
|
3
|
+
* Original file: /npm/@yaireo/tagify@4.33.2/dist/tagify.css
|
|
4
|
+
*
|
|
5
|
+
* Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
|
|
6
|
+
*/
|
|
7
|
+
@charset "UTF-8";:root{--tagify-dd-color-primary:rgb(53,149,246);--tagify-dd-text-color:black;--tagify-dd-bg-color:white;--tagify-dd-item-pad:.3em .5em;--tagify-dd-max-height:300px}.tagify{--tags-disabled-bg:#F1F1F1;--tags-border-color:#DDD;--tags-hover-border-color:#CCC;--tags-focus-border-color:#3595f6;--tag-border-radius:3px;--tag-bg:#E5E5E5;--tag-hover:#D3E2E2;--tag-text-color:black;--tag-text-color--edit:black;--tag-pad:0.3em 0.5em;--tag-inset-shadow-size:1.2em;--tag-invalid-color:#D39494;--tag-invalid-bg:rgba(211, 148, 148, 0.5);--tag--min-width:1ch;--tag--max-width:100%;--tag-hide-transition:0.3s;--tag-remove-bg:rgba(211, 148, 148, 0.3);--tag-remove-btn-color:black;--tag-remove-btn-bg:none;--tag-remove-btn-bg--hover:#c77777;--input-color:inherit;--placeholder-color:rgba(0, 0, 0, 0.4);--placeholder-color-focus:rgba(0, 0, 0, 0.25);--loader-size:.8em;--readonly-striped:1;display:inline-flex;align-items:flex-start;flex-wrap:wrap;border:1px solid var(--tags-border-color);padding:0;line-height:0;outline:0;position:relative;box-sizing:border-box;transition:.1s}@keyframes tags--bump{30%{transform:scale(1.2)}}@keyframes rotateLoader{to{transform:rotate(1turn)}}.tagify:has([contenteditable=true]){cursor:text}.tagify:hover:not(.tagify--focus):not(.tagify--invalid){--tags-border-color:var(--tags-hover-border-color)}.tagify[disabled]{background:var(--tags-disabled-bg);filter:saturate(0);opacity:.5;pointer-events:none}.tagify[disabled].tagify--select,.tagify[readonly].tagify--select{pointer-events:none}.tagify[disabled]:not(.tagify--mix):not(.tagify--select),.tagify[readonly]:not(.tagify--mix):not(.tagify--select){cursor:default}.tagify[disabled]:not(.tagify--mix):not(.tagify--select)>.tagify__input,.tagify[readonly]:not(.tagify--mix):not(.tagify--select)>.tagify__input{visibility:hidden;width:0;margin:5px 0}.tagify[disabled]:not(.tagify--mix):not(.tagify--select) .tagify__tag>div,.tagify[readonly]:not(.tagify--mix):not(.tagify--select) .tagify__tag>div{padding:var(--tag-pad)}.tagify[disabled]:not(.tagify--mix):not(.tagify--select) .tagify__tag>div::before,.tagify[readonly]:not(.tagify--mix):not(.tagify--select) .tagify__tag>div::before{animation:readonlyStyles 1s calc(-1s * (var(--readonly-striped) - 1)) paused}@keyframes readonlyStyles{0%{background:linear-gradient(45deg,var(--tag-bg) 25%,transparent 25%,transparent 50%,var(--tag-bg) 50%,var(--tag-bg) 75%,transparent 75%,transparent) 0/5px 5px;box-shadow:none;filter:brightness(.95)}}.tagify[disabled] .tagify__tag__removeBtn,.tagify[readonly] .tagify__tag__removeBtn{display:none}.tagify--loading .tagify__input>br:last-child{display:none}.tagify--loading .tagify__input::before{content:none}.tagify--loading .tagify__input::after{content:"";vertical-align:middle;opacity:1;width:.7em;height:.7em;width:var(--loader-size);height:var(--loader-size);min-width:0;border:3px solid;border-color:#eee #bbb #888 transparent;border-radius:50%;animation:rotateLoader .4s infinite linear;content:""!important;margin:-2px 0 -2px .5em}.tagify--loading .tagify__input:empty::after{margin-left:0}.tagify+input,.tagify+textarea{position:absolute!important;left:-9999em!important;transform:scale(0)!important}.tagify__tag{display:inline-flex;align-items:center;max-width:var(--tag--max-width);margin-inline:5px 0;margin-block:5px;position:relative;z-index:1;outline:0;line-height:normal;cursor:default;transition:.13s ease-out}.tagify__tag>div{display:flex;flex:1;vertical-align:top;box-sizing:border-box;max-width:100%;padding:var(--tag-pad);color:var(--tag-text-color);line-height:inherit;border-radius:var(--tag-border-radius);white-space:nowrap;transition:.13s ease-out}.tagify__tag>div>*{white-space:pre-wrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;vertical-align:top;min-width:var(--tag--min-width);max-width:var(--tag--max-width);transition:.8s ease,.1s color}.tagify__tag>div>[contenteditable]{display:block;outline:0;-webkit-user-select:text;user-select:text;cursor:text;margin:-2px;padding:2px;max-width:350px}.tagify__tag>div>:only-child{width:100%}.tagify__tag>div::before{content:"";position:absolute;border-radius:inherit;inset:var(--tag-bg-inset,0);z-index:-1;pointer-events:none;transition:120ms ease;animation:tags--bump .3s ease-out 1;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-bg) inset}.tagify__tag:focus div::before,.tagify__tag:hover:not([readonly]) div::before{--tag-bg-inset:-2.5px;--tag-bg:var(--tag-hover)}.tagify__tag--loading{pointer-events:none}.tagify__tag--loading .tagify__tag__removeBtn{display:none}.tagify__tag--loading::after{--loader-size:.4em;content:"";vertical-align:middle;opacity:1;width:.7em;height:.7em;width:var(--loader-size);height:var(--loader-size);min-width:0;border:3px solid;border-color:#eee #bbb #888 transparent;border-radius:50%;animation:rotateLoader .4s infinite linear;margin:0 .5em 0 -.1em}.tagify__tag--flash div::before{animation:none}.tagify__tag--hide{width:0!important;padding-left:0;padding-right:0;margin-left:0;margin-right:0;opacity:0;transform:scale(0);transition:var(--tag-hide-transition);pointer-events:none}.tagify__tag--hide>div>*{white-space:nowrap}.tagify__tag.tagify--noAnim>div::before{animation:none}.tagify__tag.tagify--notAllowed:not(.tagify__tag--editable) div>span{opacity:.5}.tagify__tag.tagify--notAllowed:not(.tagify__tag--editable) div::before{--tag-bg:var(--tag-invalid-bg);transition:.2s}.tagify__tag[readonly] .tagify__tag__removeBtn{display:none}.tagify__tag[readonly]>div::before{animation:readonlyStyles 1s calc(-1s * (var(--readonly-striped) - 1)) paused}@keyframes readonlyStyles{0%{background:linear-gradient(45deg,var(--tag-bg) 25%,transparent 25%,transparent 50%,var(--tag-bg) 50%,var(--tag-bg) 75%,transparent 75%,transparent) 0/5px 5px;box-shadow:none;filter:brightness(.95)}}.tagify__tag--editable>div{color:var(--tag-text-color--edit)}.tagify__tag--editable>div::before{box-shadow:0 0 0 2px var(--tag-hover) inset!important}.tagify__tag--editable>.tagify__tag__removeBtn{pointer-events:none;opacity:0;transform:translateX(100%) translateX(5px)}.tagify__tag--editable.tagify--invalid>div::before{box-shadow:0 0 0 2px var(--tag-invalid-color) inset!important}.tagify__tag__removeBtn{order:5;display:inline-flex;align-items:center;justify-content:center;border-radius:50px;cursor:pointer;font:14px/1 Arial;background:var(--tag-remove-btn-bg);color:var(--tag-remove-btn-color);width:14px;height:14px;margin-inline:auto 4.6666666667px;overflow:hidden;transition:.2s ease-out}.tagify__tag__removeBtn::after{content:"×";transition:.3s,color 0s}.tagify__tag__removeBtn:hover{color:#fff;background:var(--tag-remove-btn-bg--hover)}.tagify__tag__removeBtn:hover+div>span{opacity:.5}.tagify__tag__removeBtn:hover+div::before{box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-remove-bg,rgba(211,148,148,.3)) inset!important;transition:box-shadow .2s}.tagify:not(.tagify--mix) .tagify__input br{display:none}.tagify:not(.tagify--mix) .tagify__input *{display:inline;white-space:nowrap}.tagify__input{flex-grow:1;display:inline-block;min-width:110px;margin:5px;padding:var(--tag-pad);line-height:normal;position:relative;white-space:pre-wrap;color:var(--input-color);box-sizing:inherit;overflow:hidden}.tagify__input:focus{outline:0}.tagify__input:focus::before{transition:.2s ease-out;opacity:0;transform:translatex(6px)}@supports (-ms-ime-align:auto){.tagify__input:focus::before{display:none}}.tagify__input:focus:empty::before{transition:.2s ease-out;opacity:1;transform:none;color:rgba(0,0,0,.25);color:var(--placeholder-color-focus)}@-moz-document url-prefix(){.tagify__input:focus:empty::after{display:none}}.tagify__input::before{content:attr(data-placeholder);width:100%;height:100%;margin:auto 0;z-index:1;color:var(--placeholder-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden;pointer-events:none;opacity:0;position:absolute}.tagify__input::after{content:attr(data-suggest);display:inline-block;vertical-align:middle;position:absolute;min-width:calc(100% - 1.5em);text-overflow:ellipsis;overflow:hidden;white-space:pre;color:var(--tag-text-color);opacity:.3;pointer-events:none;max-width:100px}.tagify__input .tagify__tag{margin:0 1px}.tagify--mix{display:block}.tagify--mix .tagify__input{padding:5px;margin:0;width:100%;height:100%;line-height:1.5;display:block}.tagify--mix .tagify__input::before{height:auto;display:none;line-height:inherit}.tagify--mix .tagify__input::after{content:none}.tagify--select{cursor:default}.tagify--select::after{content:">";opacity:.5;position:absolute;top:50%;right:0;bottom:0;font:16px monospace;line-height:8px;height:8px;pointer-events:none;transform:translate(-150%,-50%) scaleX(1.2) rotate(90deg);transition:.2s ease-in-out}.tagify--select[aria-expanded=true]::after{transform:translate(-150%,-50%) rotate(270deg) scaleY(1.2)}.tagify--select[aria-expanded=true] .tagify__tag__removeBtn{pointer-events:none;opacity:0;transform:translateX(100%) translateX(5px)}.tagify--select .tagify__tag{flex:1;max-width:none;margin-inline-end:2em;margin-block:0;padding-block:5px;cursor:text}.tagify--select .tagify__tag div::before{display:none}.tagify--select .tagify__tag+.tagify__input{display:none}.tagify--empty .tagify__input::before{transition:.2s ease-out;opacity:1;transform:none;display:inline-block;width:auto}.tagify--mix .tagify--empty .tagify__input::before{display:inline-block}.tagify--focus{--tags-border-color:var(--tags-focus-border-color);transition:0s}.tagify--invalid{--tags-border-color:#D39494}.tagify__dropdown{position:absolute;z-index:9999;transform:translateY(-1px);border-top:1px solid var(--tagify-dd-color-primary);overflow:hidden}.tagify__dropdown[dir=rtl]{transform:translate(-100%,-1px)}.tagify__dropdown[placement=top]{margin-top:0;transform:translateY(-100%)}.tagify__dropdown[placement=top] .tagify__dropdown__wrapper{border-top-width:1.1px;border-bottom-width:0}.tagify__dropdown[position=text]{box-shadow:0 0 0 3px rgba(var(--tagify-dd-color-primary),.1);font-size:.9em}.tagify__dropdown[position=text] .tagify__dropdown__wrapper{border-width:1px}.tagify__dropdown__wrapper{scroll-behavior:auto;max-height:var(--tagify-dd-max-height);overflow:hidden;overflow-x:hidden;color:var(--tagify-dd-text-color);background:var(--tagify-dd-bg-color);border:1px solid;border-color:var(--tagify-dd-color-primary);border-bottom-width:1.5px;border-top-width:0;box-shadow:0 2px 4px -2px rgba(0,0,0,.2);transition:.3s cubic-bezier(.5,0,.3,1),transform .15s;animation:dd-wrapper-show 0s .3s forwards}@keyframes dd-wrapper-show{to{overflow-y:auto}}.tagify__dropdown__header:empty{display:none}.tagify__dropdown__footer{display:inline-block;margin-top:.5em;padding:var(--tagify-dd-item-pad);font-size:.7em;font-style:italic;opacity:.5}.tagify__dropdown__footer:empty{display:none}.tagify__dropdown--initial .tagify__dropdown__wrapper{max-height:20px;transform:translateY(-1em)}.tagify__dropdown--initial[placement=top] .tagify__dropdown__wrapper{transform:translateY(2em)}.tagify__dropdown__item{box-sizing:border-box;padding:var(--tagify-dd-item-pad);margin:1px;white-space:pre-wrap;cursor:pointer;border-radius:2px;position:relative;outline:0;max-height:60px;max-width:100%;line-height:normal;position:relative}.tagify__dropdown__item--active{background:var(--tagify-dd-color-primary);color:#fff}.tagify__dropdown__item:active{filter:brightness(105%)}.tagify__dropdown__item--hidden{padding-top:0;padding-bottom:0;margin:0 1px;pointer-events:none;overflow:hidden;max-height:0;transition:var(--tagify-dd-item--hidden-duration,.3s)!important}.tagify__dropdown__item--hidden>*{transform:translateY(-100%);opacity:0;transition:inherit}.tagify__dropdown__item--selected::before{content:"✓";font-family:monospace;position:absolute;inset-inline-start:6px;text-indent:0;line-height:1.1}.tagify__dropdown:has(.tagify__dropdown__item--selected) .tagify__dropdown__item{text-indent:1em}
|