mod: админка (03) ImageAdmin (03) fin (пропатчено, подключили стили)

This commit is contained in:
erjemin committed 2026-06-12 00:48:12 +03:00
1 parent c7049f7d8d
commit fed2a1c5a0
6 files changed
+196 -14

No files matched your search

+1 -1
View File
@@ -5,7 +5,7 @@
"private": true,
"type": "module",
"scripts": {
"build": "esbuild src/editor.js --bundle --format=esm --minify --outfile=${CM6_OUTPUT_DIR:-../public/static/codemirror}/editor.js"
"build": "esbuild src/editor.js --bundle --format=iife --minify --outfile=${CM6_OUTPUT_DIR:-../public/static/codemirror}/editor.js"
},
"devDependencies": {
"@babel/runtime": "7.29.7",
+55 -9
View File
@@ -2,6 +2,8 @@
# Регистрируем модели с удобным интерфейсом.
from django import forms
from django.db import models
from django.forms import TextInput, Textarea, URLField
from django.contrib import admin
from django.utils.html import format_html, mark_safe
from easy_thumbnails.files import get_thumbnailer
@@ -25,8 +27,6 @@ class TbImageAdminForm(forms.ModelForm):
required=False,
widget=forms.TextInput(attrs={
'placeholder': 'Введите alt-текст для картинки',
'class': 'vTextField',
'size': 200,
}),
label='ALT (новый)',
help_text='Текст для alt-атрибута картинки <tt>&lt;img alt="" .../&gt;</tt>.'
@@ -37,8 +37,6 @@ class TbImageAdminForm(forms.ModelForm):
required=False,
widget=forms.TextInput(attrs={
'placeholder': 'Введите title-описание картинки',
'class': 'vTextField',
'cols': 120,
}),
label='TITLE (новый)',
help_text='Текст для title-атрибута картинки <tt>&lt;img title="" .../&gt;</tt>.'
@@ -49,8 +47,6 @@ class TbImageAdminForm(forms.ModelForm):
required=False,
widget=forms.TextInput(attrs={
'placeholder': 'XXXX, Авторские права на изображение',
'class': 'vTextField',
'cols': 120,
}),
label='Copyright',
help_text='Авторские права на изображение (например: <tt>2025, Sergei Erjemin</tt>. Будет сохранён в filer_image.author'
@@ -64,6 +60,13 @@ class TbImageAdminForm(forms.ModelForm):
"""
При инициализации формы подгружаем текущие значения alt/caption из filer_image.
"""
# Атрибуты для активации CodeMirror редактора
codemirror_attrs = {
'data-codemirror-editor': '1',
'data-language': 'text',
'data-width': '100%', # Ширина для патча (100% займет полную ширину)
}
super().__init__(*args, **kwargs)
# Если редактируем существующую запись, получаем текущие значения из filer
@@ -71,27 +74,70 @@ class TbImageAdminForm(forms.ModelForm):
try:
filer_image = self.instance.image
# Получаем текущие значения из filer и заполняем виртуальные поля
# ALT-text
self.fields['filer_alt_text'].initial = filer_image.default_alt_text or ''
self.fields['filer_alt_text'].widget = Textarea(attrs={
'class': 'codemirror-width-m',
**codemirror_attrs,
})
self.fields['filer_caption'].initial = filer_image.default_caption or ''
self.fields['filer_caption'].widget = Textarea(attrs={
'class': 'codemirror-width-m',
**codemirror_attrs,
})
self.fields['filer_copyright'].initial = filer_image.author or ''
self.fields['filer_copyright'].widget = Textarea(attrs={
'class': 'codemirror-width-m',
**codemirror_attrs,
})
except Exception:
# Если ошибка при получении filer_image, просто оставляем пустые значения
pass
# s_img_src_url - поле URL источника (длинная строка)
self.fields['s_img_src_url'].widget = Textarea(attrs={
'class': 'codemirror-width-xl',
**codemirror_attrs,
})
# i_img_sort - поле сортировки (до четырех цифр)
self.fields['i_img_sort'].widget = Textarea(attrs={
'class': 'codemirror-width-s codemirror-no-lines',
**codemirror_attrs,
})
# f_img_confidence_score - поле confidence score (число с плавающей точкой)
self.fields['f_img_confidence_score'].widget = Textarea(attrs={
'class': 'codemirror-width-s codemirror-no-lines',
**codemirror_attrs,
})
class ImageAdmin(admin.ModelAdmin):
"""
Админ для изображений TbImage с поддержкой редактирования метаданных filer_image.
Позволяет пользователю заполнить default_alt_text и default_caption для картинки в filer
прямо в админке TbImage, без необходимости отдельного редактирования фiler.
прямо в админке TbImage, без необходимости отдельного редактирования filer.
"""
form = TbImageAdminForm # Используем кастомную форму с виртуальными полями
# Подключаем JS через Media (правильный способ!)
class Media:
css = {
'all': ('codemirror/codemirror-styles.css',) # Стили для CodeMirror
}
js = (
'codemirror/editor.js', # Основной CodeMirror
'codemirror/codemirror-patch.js', # Патч для управления высотой/шириной
)
list_display = ('id', 'image_thumbnail', 'image', '_display_filer_alt_text', 'i_img_sort', 't_img_created')
list_display_links = ('id', 'image_thumbnail', 'image')
list_filter = ('l_img_source', 'l_img_reality', 't_img_created')
ordering = ('image', 'i_img_sort')
readonly_fields = ('t_img_created', 't_img_updated', '_display_filer_alt_text', '_display_filer_caption')
fieldsets = (
('Изображение', {
'fields': ('image', 'l_img_source', 'l_img_reality', 's_img_src_url', 'i_img_sort',
@@ -101,8 +147,8 @@ class ImageAdmin(admin.ModelAdmin):
('Метаданные filer (SEO для картинок)', {
'fields': ('_display_filer_alt_text', '_display_filer_caption', 'filer_alt_text', 'filer_caption',
'filer_copyright'),
'description': 'Редактируемые поля для заполнения Alt текста и описания в filer. Если не заполнить,'
' текущие значения останутся без изменений (или не будут заполнены при создании).',
'description': 'Редактируемые поля для заполнения ALT-, TITLE- и ©-текста в filer. Если не заполнить,'
' текущие значения останутся без изменений (и не будут заполнены при создании).',
# 'classes': ('collapse',),
}),
('Служебная информация', {
+2 -2
View File
@@ -314,9 +314,9 @@ class TbImage(models.Model):
# Доверие данным (для парсеров и API)
null=True,
blank=True,
default=None,
default=10.0,
verbose_name='Достоверность',
help_text='Уверенность (для автоматических данных) 0.0 - 1.0, насколько уверены, что это правильное изображение',
help_text='Уверенность (для автоматических данных) 0.0 - 10.0, насколько уверены, что это правильное изображение',
)
s_img_copyright = models.CharField(
# Авторские права и лицензия (по идее -- ненужное поле. Можно в filer использовать `obj.image.author`.
@@ -0,0 +1,78 @@
/**
* CodeMirror 6 - Height Control Patch
*
* Этот патч перехватывает создание CodeMirror редакторов и копирует
* атрибут data-height с textarea на создаваемый wrapper div.
*
* Использование в admin.py:
* textarea widget: attrs={'data-height': '50px', 'data-codemirror-editor': '1'}
*
* Загружается ПОСЛЕ editor.js через Media в Admin класс.
*/
(function () {
'use strict';
/**
* Применяем высоту к уже созданным wrapper'ам
* (CodeMirror уже загрузился и создал обёртки)
*/
function applyHeightsToExistingWrappers() {
// Находим все textarea'ы с data-codemirror-editor
document.querySelectorAll('textarea[data-codemirror-editor]').forEach((textarea) => {
// Соседний div (wrapper, созданный CodeMirror)
const wrapper = textarea.previousElementSibling;
// Проверяем что это действительно wrapper CodeMirror
if (wrapper && wrapper.classList && wrapper.classList.contains('cm6-editor-wrapper')) {
// Копируем data-height на style если указано
if (textarea.dataset.height) {
wrapper.style.height = textarea.dataset.height;
}
// Копируем data-width на style если указано (для ширины)
if (textarea.dataset.width) {
wrapper.style.width = textarea.dataset.width;
wrapper.style.minWidth = textarea.dataset.width;
// Также устанавливаем ширину на сам .cm-editor внутри wrapper
// Используем !important чтобы переопределить flex: 1 1 auto из CSS
const cmEditor = wrapper.querySelector('.cm-editor');
// if (cmEditor) {
// cmEditor.style.cssText = `width: ${textarea.dataset.width} !important; flex: 0 0 auto;`;
// }
}
// Копируем классы с textarea если они есть
// (например cm6-editor-wrapper-xs, cm6-editor-wrapper-sm и т.д.)
if (textarea.className) {
// Добавляем классы из textarea (сохраняя cm6-editor-wrapper)
textarea.className.split(' ').forEach((cls) => {
if (cls && cls !== 'cm6-editor-wrapper') {
wrapper.classList.add(cls);
}
});
}
}
});
}
// Применяем высоты когда DOM готов
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', applyHeightsToExistingWrappers);
} else {
// DOM уже загружен
applyHeightsToExistingWrappers();
}
// Также применяем для динамически добавленных элементов (если загружают CodeMirror после инициализации)
const observer = new MutationObserver(() => {
applyHeightsToExistingWrappers();
});
observer.observe(document, {
childList: true,
subtree: true,
});
})();
@@ -0,0 +1,58 @@
/* CodeMirror 6 - Стили для правильного отображения */
:root {
color-scheme: light dark;
--brdr: light-dark(#333, #ccc);
--accent-mode-color: light-dark(#222, #eee);
}
.cm6-editor-wrapper {
/* Основной wrapper, созданный CodeMirror */
flex-direction: column;
overflow: hidden;
}
.cm-editor {
/* Сам редактор внутри wrapper - растягиваем на всю доступную высоту */
flex: 1 1 auto;
font-family: monospace;
line-height: 1;
border: 1px solid var(--brdr);;
}
/*
Утилитарные классы для управления шириной.
Мы ищем редактор .cm-editor ВНУТРИ элемента с нашим классом.
*/
.codemirror-width-s > .cm-editor {
/* Маленький (для чисел, коротких ID) */
max-width: 8em !important;
}
.codemirror-width-m .cm-editor {
/* Средний (для URL, коротких строк) */
max-width: calc(50% - 13em) !important;
}
.codemirror-width-l > .cm-editor {
/* Большой (для текста, JSON, HTML) */
max-width: calc(75% - 13em) !important;
}
.codemirror-width-xl > .cm-editor {
/* Во всю ширину контейнера */
max-width: calc(100% - 13em) !important;
}
/* --- Новое правило для скрытия номеров строк --- */
/* Если у обертки есть наш класс, находим внутри панель с номерами и скрываем ее */
.codemirror-no-lines .cm-gutters {
display: none !important;
}
/* Скрыть оригинальный textarea */
textarea[data-codemirror-editor] {
display: none !important;
}
+2 -2
View File
@@ -1,4 +1,4 @@
var Js=[],Vo=[];(()=>{let r="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,t=0;e<r.length;e++)(e%2?Vo:Js).push(t=t+r[e])})();function gc(r){if(r<768)return!1;for(let e=0,t=Js.length;;){let i=e+t>>1;if(r<Js[i])t=i;else if(r>=Vo[i])e=i+1;else return!0;if(e==t)return!1}}function zo(r){return r>=127462&&r<=127487}var _o=8205;function Eo(r,e,t=!0,i=!0){return(t?Wo:mc)(r,e,i)}function Wo(r,e,t){if(e==r.length)return e;e&&qo(r.charCodeAt(e))&&Do(r.charCodeAt(e-1))&&e--;let i=Ks(r,e);for(e+=Yo(i);e<r.length;){let s=Ks(r,e);if(i==_o||s==_o||t&&gc(s))e+=Yo(s),i=s;else if(zo(s)){let n=0,o=e-2;for(;o>=0&&zo(Ks(r,o));)n++,o-=2;if(n%2==0)break;e+=2}else break}return e}function mc(r,e,t){for(;e>0;){let i=Wo(r,e-2,t);if(i<e)return i;e--}return 0}function Ks(r,e){let t=r.charCodeAt(e);if(!Do(t)||e+1==r.length)return t;let i=r.charCodeAt(e+1);return qo(i)?(t-55296<<10)+(i-56320)+65536:t}function qo(r){return r>=56320&&r<57344}function Do(r){return r>=55296&&r<56320}function Yo(r){return r<65536?1:2}var M=class r{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,i){[e,t]=zt(this,e,t);let s=[];return this.decompose(0,e,s,2),i.length&&i.decompose(0,i.length,s,3),this.decompose(t,this.length,s,1),At.from(s,this.length-(t-e)+i.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=zt(this,e,t);let i=[];return this.decompose(e,t,i,0),At.from(i,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),i=this.length-this.scanIdentical(e,-1),s=new St(this),n=new St(e);for(let o=t,l=t;;){if(s.next(o),n.next(o),o=0,s.lineBreak!=n.lineBreak||s.done!=n.done||s.value!=n.value)return!1;if(l+=s.value.length,s.done||l>=i)return!0}}iter(e=1){return new St(this,e)}iterRange(e,t=this.length){return new Hi(this,e,t)}iterLines(e,t){let i;if(e==null)i=this.iter();else{t==null&&(t=this.lines+1);let s=this.line(e).from;i=this.iterRange(s,Math.max(s,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new Ki(i)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?r.empty:e.length<=32?new Oe(e):At.from(Oe.split(e,[]))}},Oe=class r extends M{constructor(e,t=Sc(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,i,s){for(let n=0;;n++){let o=this.text[n],l=s+o.length;if((t?i:l)>=e)return new tr(s,l,i,o);s=l+1,i++}}decompose(e,t,i,s){let n=e<=0&&t>=this.length?this:new r(Lo(this.text,e,t),Math.min(t,this.length)-Math.max(0,e));if(s&1){let o=i.pop(),l=Fi(n.text,o.text.slice(),0,n.length);if(l.length<=32)i.push(new r(l,o.length+n.length));else{let a=l.length>>1;i.push(new r(l.slice(0,a)),new r(l.slice(a)))}}else i.push(n)}replace(e,t,i){if(!(i instanceof r))return super.replace(e,t,i);[e,t]=zt(this,e,t);let s=Fi(this.text,Fi(i.text,Lo(this.text,0,e)),t),n=this.length+i.length-(t-e);return s.length<=32?new r(s,n):At.from(r.split(s,[]),n)}sliceString(e,t=this.length,i=`
(()=>{var Js=[],Vo=[];(()=>{let r="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,t=0;e<r.length;e++)(e%2?Vo:Js).push(t=t+r[e])})();function gc(r){if(r<768)return!1;for(let e=0,t=Js.length;;){let i=e+t>>1;if(r<Js[i])t=i;else if(r>=Vo[i])e=i+1;else return!0;if(e==t)return!1}}function zo(r){return r>=127462&&r<=127487}var _o=8205;function Eo(r,e,t=!0,i=!0){return(t?Wo:mc)(r,e,i)}function Wo(r,e,t){if(e==r.length)return e;e&&qo(r.charCodeAt(e))&&Do(r.charCodeAt(e-1))&&e--;let i=Ks(r,e);for(e+=Yo(i);e<r.length;){let s=Ks(r,e);if(i==_o||s==_o||t&&gc(s))e+=Yo(s),i=s;else if(zo(s)){let n=0,o=e-2;for(;o>=0&&zo(Ks(r,o));)n++,o-=2;if(n%2==0)break;e+=2}else break}return e}function mc(r,e,t){for(;e>0;){let i=Wo(r,e-2,t);if(i<e)return i;e--}return 0}function Ks(r,e){let t=r.charCodeAt(e);if(!Do(t)||e+1==r.length)return t;let i=r.charCodeAt(e+1);return qo(i)?(t-55296<<10)+(i-56320)+65536:t}function qo(r){return r>=56320&&r<57344}function Do(r){return r>=55296&&r<56320}function Yo(r){return r<65536?1:2}var M=class r{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,i){[e,t]=zt(this,e,t);let s=[];return this.decompose(0,e,s,2),i.length&&i.decompose(0,i.length,s,3),this.decompose(t,this.length,s,1),At.from(s,this.length-(t-e)+i.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=zt(this,e,t);let i=[];return this.decompose(e,t,i,0),At.from(i,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),i=this.length-this.scanIdentical(e,-1),s=new St(this),n=new St(e);for(let o=t,l=t;;){if(s.next(o),n.next(o),o=0,s.lineBreak!=n.lineBreak||s.done!=n.done||s.value!=n.value)return!1;if(l+=s.value.length,s.done||l>=i)return!0}}iter(e=1){return new St(this,e)}iterRange(e,t=this.length){return new Hi(this,e,t)}iterLines(e,t){let i;if(e==null)i=this.iter();else{t==null&&(t=this.lines+1);let s=this.line(e).from;i=this.iterRange(s,Math.max(s,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new Ki(i)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?r.empty:e.length<=32?new Oe(e):At.from(Oe.split(e,[]))}},Oe=class r extends M{constructor(e,t=Sc(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,i,s){for(let n=0;;n++){let o=this.text[n],l=s+o.length;if((t?i:l)>=e)return new tr(s,l,i,o);s=l+1,i++}}decompose(e,t,i,s){let n=e<=0&&t>=this.length?this:new r(Lo(this.text,e,t),Math.min(t,this.length)-Math.max(0,e));if(s&1){let o=i.pop(),l=Fi(n.text,o.text.slice(),0,n.length);if(l.length<=32)i.push(new r(l,o.length+n.length));else{let a=l.length>>1;i.push(new r(l.slice(0,a)),new r(l.slice(a)))}}else i.push(n)}replace(e,t,i){if(!(i instanceof r))return super.replace(e,t,i);[e,t]=zt(this,e,t);let s=Fi(this.text,Fi(i.text,Lo(this.text,0,e)),t),n=this.length+i.length-(t-e);return s.length<=32?new r(s,n):At.from(r.split(s,[]),n)}sliceString(e,t=this.length,i=`
`){[e,t]=zt(this,e,t);let s="";for(let n=0,o=0;n<=t&&o<this.text.length;o++){let l=this.text[o],a=n+l.length;n>e&&o&&(s+=i),e<a&&t>n&&(s+=l.slice(Math.max(0,e-n),t-n)),n=a+1}return s}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(e,t){let i=[],s=-1;for(let n of e)i.push(n),s+=n.length+1,i.length==32&&(t.push(new r(i,s)),i=[],s=-1);return s>-1&&t.push(new r(i,s)),t}},At=class r extends M{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let i of e)this.lines+=i.lines}lineInner(e,t,i,s){for(let n=0;;n++){let o=this.children[n],l=s+o.length,a=i+o.lines-1;if((t?a:l)>=e)return o.lineInner(e,t,i,s);s=l+1,i=a+1}}decompose(e,t,i,s){for(let n=0,o=0;o<=t&&n<this.children.length;n++){let l=this.children[n],a=o+l.length;if(e<=a&&t>=o){let h=s&((o<=e?1:0)|(a>=t?2:0));o>=e&&a<=t&&!h?i.push(l):l.decompose(e-o,t-o,i,h)}o=a+1}}replace(e,t,i){if([e,t]=zt(this,e,t),i.lines<this.lines)for(let s=0,n=0;s<this.children.length;s++){let o=this.children[s],l=n+o.length;if(e>=n&&t<=l){let a=o.replace(e-n,t-n,i),h=this.lines-o.lines+a.lines;if(a.lines<h>>4&&a.lines>h>>6){let c=this.children.slice();return c[s]=a,new r(c,this.length-(t-e)+i.length)}return super.replace(n,l,a)}n=l+1}return super.replace(e,t,i)}sliceString(e,t=this.length,i=`
`){[e,t]=zt(this,e,t);let s="";for(let n=0,o=0;n<this.children.length&&o<=t;n++){let l=this.children[n],a=o+l.length;o>e&&n&&(s+=i),e<a&&t>o&&(s+=l.sliceString(e-o,t-o,i)),o=a+1}return s}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(e,t){if(!(e instanceof r))return 0;let i=0,[s,n,o,l]=t>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;s+=t,n+=t){if(s==o||n==l)return i;let a=this.children[s],h=e.children[n];if(a!=h)return i+a.scanIdentical(h,t);i+=a.length+1}}static from(e,t=e.reduce((i,s)=>i+s.length+1,-1)){let i=0;for(let O of e)i+=O.lines;if(i<32){let O=[];for(let p of e)p.flatten(O);return new Oe(O,t)}let s=Math.max(32,i>>5),n=s<<1,o=s>>1,l=[],a=0,h=-1,c=[];function f(O){let p;if(O.lines>n&&O instanceof r)for(let g of O.children)f(g);else O.lines>o&&(a>o||!a)?(u(),l.push(O)):O instanceof Oe&&a&&(p=c[c.length-1])instanceof Oe&&O.lines+p.lines<=32?(a+=O.lines,h+=O.length+1,c[c.length-1]=new Oe(p.text.concat(O.text),p.length+1+O.length)):(a+O.lines>s&&u(),a+=O.lines,h+=O.length+1,c.push(O))}function u(){a!=0&&(l.push(c.length==1?c[0]:r.from(c,h)),h=-1,a=c.length=0)}for(let O of e)f(O);return u(),l.length==1?l[0]:new r(l,t)}};M.empty=new Oe([""],0);function Sc(r){let e=-1;for(let t of r)e+=t.length+1;return e}function Fi(r,e,t=0,i=1e9){for(let s=0,n=0,o=!0;n<r.length&&s<=i;n++){let l=r[n],a=s+l.length;a>=t&&(a>i&&(l=l.slice(0,i-s)),s<t&&(l=l.slice(t-s)),o?(e[e.length-1]+=l,o=!1):e.push(l)),s=a+1}return e}function Lo(r,e,t){return Fi(r,[""],e,t)}var St=class{constructor(e,t=1){this.dir=t,this.done=!1,this.lineBreak=!1,this.value="",this.nodes=[e],this.offsets=[t>0?1:(e instanceof Oe?e.text.length:e.children.length)<<1]}nextInner(e,t){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,s=this.nodes[i],n=this.offsets[i],o=n>>1,l=s instanceof Oe?s.text.length:s.children.length;if(o==(t>0?l:0)){if(i==0)return this.done=!0,this.value="",this;t>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((n&1)==(t>0?0:1)){if(this.offsets[i]+=t,e==0)return this.lineBreak=!0,this.value=`
`,this;e--}else if(s instanceof Oe){let a=s.text[o+(t<0?-1:0)];if(this.offsets[i]+=t,a.length>Math.max(0,e))return this.value=e==0?a:t>0?a.slice(e):a.slice(0,a.length-e),this;e-=a.length}else{let a=s.children[o+(t<0?-1:0)];e>a.length?(e-=a.length,this.offsets[i]+=t):(t<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(t>0?1:(a instanceof Oe?a.text.length:a.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}},Hi=class{constructor(e,t,i){this.value="",this.done=!1,this.cursor=new St(e,t>i?-1:1),this.pos=t>i?e.length:0,this.from=Math.min(t,i),this.to=Math.max(t,i)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let i=t<0?this.pos-this.from:this.to-this.pos;e>i&&(e=i),i-=e;let{value:s}=this.cursor.next(e);return this.pos+=(s.length+e)*t,this.value=s.length<=i?s:t<0?s.slice(s.length-i):s.slice(0,i),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},Ki=class{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:t,lineBreak:i,value:s}=this.inner.next(e);return t&&this.afterBreak?(this.value="",this.afterBreak=!1):t?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=s,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<"u"&&(M.prototype[Symbol.iterator]=function(){return this.iter()},St.prototype[Symbol.iterator]=Hi.prototype[Symbol.iterator]=Ki.prototype[Symbol.iterator]=function(){return this});var tr=class{constructor(e,t,i,s){this.from=e,this.to=t,this.number=i,this.text=s}get length(){return this.to-this.from}};function zt(r,e,t){return e=Math.max(0,Math.min(r.length,e)),[e,Math.max(e,Math.min(r.length,t))]}function Pe(r,e,t=!0,i=!0){return Eo(r,e,t,i)}function bc(r){return r>=56320&&r<57344}function Qc(r){return r>=55296&&r<56320}function dr(r,e){let t=r.charCodeAt(e);if(!Qc(t)||e+1==r.length)return t;let i=r.charCodeAt(e+1);return bc(i)?(t-55296<<10)+(i-56320)+65536:t}function pr(r){return r<65536?1:2}var ir=/\r\n?|\n/,te=(function(r){return r[r.Simple=0]="Simple",r[r.TrackDel=1]="TrackDel",r[r.TrackBefore=2]="TrackBefore",r[r.TrackAfter=3]="TrackAfter",r})(te||(te={})),bt=class r{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;t<this.sections.length;t+=2)e+=this.sections[t];return e}get newLength(){let e=0;for(let t=0;t<this.sections.length;t+=2){let i=this.sections[t+1];e+=i<0?this.sections[t]:i}return e}get empty(){return this.sections.length==0||this.sections.length==2&&this.sections[1]<0}iterGaps(e){for(let t=0,i=0,s=0;t<this.sections.length;){let n=this.sections[t++],o=this.sections[t++];o<0?(e(i,s,n),s+=n):s+=o,i+=n}}iterChangedRanges(e,t=!1){sr(this,e,t)}get invertedDesc(){let e=[];for(let t=0;t<this.sections.length;){let i=this.sections[t++],s=this.sections[t++];s<0?e.push(i,s):e.push(s,i)}return new r(e)}composeDesc(e){return this.empty?e:e.empty?this:Uo(this,e)}mapDesc(e,t=!1){return e.empty?this:rr(this,e,t)}mapPos(e,t=-1,i=te.Simple){let s=0,n=0;for(let o=0;o<this.sections.length;){let l=this.sections[o++],a=this.sections[o++],h=s+l;if(a<0){if(h>e)return n+(e-s);n+=l}else{if(i!=te.Simple&&h>=e&&(i==te.TrackDel&&s<e&&h>e||i==te.TrackBefore&&s<e||i==te.TrackAfter&&h>e))return null;if(h>e||h==e&&t<0&&!l)return e==s||t<0?n:n+a;n+=a}s=h}if(e>s)throw new RangeError(`Position ${e} is out of range for changeset of length ${s}`);return n}touchesRange(e,t=e){for(let i=0,s=0;i<this.sections.length&&s<=t;){let n=this.sections[i++],o=this.sections[i++],l=s+n;if(o>=0&&s<=t&&l>=e)return s<e&&l>t?"cover":!0;s=l}return!1}toString(){let e="";for(let t=0;t<this.sections.length;){let i=this.sections[t++],s=this.sections[t++];e+=(e?" ":"")+i+(s>=0?":"+s:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(t=>typeof t!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new r(e)}static create(e){return new r(e)}},de=class r extends bt{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return sr(this,(t,i,s,n,o)=>e=e.replace(s,s+(i-t),o),!1),e}mapDesc(e,t=!1){return rr(this,e,t,!0)}invert(e){let t=this.sections.slice(),i=[];for(let s=0,n=0;s<t.length;s+=2){let o=t[s],l=t[s+1];if(l>=0){t[s]=l,t[s+1]=o;let a=s>>1;for(;i.length<a;)i.push(M.empty);i.push(o?e.slice(n,n+o):M.empty)}n+=o}return new r(t,i)}compose(e){return this.empty?e:e.empty?this:Uo(this,e,!0)}map(e,t=!1){return e.empty?this:rr(this,e,t,!0)}iterChanges(e,t=!1){sr(this,e,t)}get desc(){return bt.create(this.sections)}filter(e){let t=[],i=[],s=[],n=new Qt(this);e:for(let o=0,l=0;;){let a=o==e.length?1e9:e[o++ Line truncated
@@ -19,4 +19,4 @@ var Js=[],Vo=[];(()=>{let r="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,
constructor(\${params}) {
\${}
}
}`,{label:"class",detail:"definition",type:"keyword"}),le('import {${names}} from "${module}"\n${}',{label:"import",detail:"named",type:"keyword"}),le('import ${name} from "${module}"\n${}',{label:"import",detail:"default",type:"keyword"})],Vd=Uh.concat([le("interface ${name} {\n ${}\n}",{label:"interface",detail:"definition",type:"keyword"}),le("type ${name} = ${type}",{label:"type",detail:"definition",type:"keyword"}),le("enum ${name} {\n ${}\n}",{label:"enum",detail:"definition",type:"keyword"})]),Ih=new Ht,Fh=new Set(["Script","Block","FunctionExpression","FunctionDeclaration","ArrowFunction","MethodDeclaration","ForStatement"]);function Di(r){return(e,t)=>{let i=e.node.getChild("VariableDefinition");return i&&t(i,r),!0}}var Ed=["FunctionDeclaration"],Wd={FunctionDeclaration:Di("function"),ClassDeclaration:Di("class"),ClassExpression:()=>!0,EnumDeclaration:Di("constant"),TypeAliasDeclaration:Di("type"),NamespaceDeclaration:Di("namespace"),VariableDefinition(r,e){r.matchContext(Ed)||e(r,"variable")},TypeDefinition(r,e){e(r,"type")},__proto__:null};function Hh(r,e){let t=Ih.get(e);if(t)return t;let i=[],s=!0;function n(o,l){let a=r.sliceString(o.from,o.to);i.push({label:a,type:l})}return e.cursor(j.IncludeAnonymous).iterate(o=>{if(s)s=!1;else if(o.name){let l=Wd[o.name];if(l&&l(o,n)||Fh.has(o.name))return!1}else if(o.to-o.from>8192){for(let l of Hh(r,o.node))i.push(l);return!1}}),Ih.set(e,i),i}var Nh=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,Kh=["TemplateString","String","RegExp","LineComment","BlockComment","VariableDefinition","TypeDefinition","Label","PropertyDefinition","PropertyName","PrivatePropertyDefinition","PrivatePropertyName","JSXText","JSXAttributeValue","JSXOpenTag","JSXCloseTag","JSXSelfClosingTag",".","?."];function qd(r){let e=oe(r.state).resolveInner(r.pos,-1);if(Kh.indexOf(e.name)>-1)return null;let t=e.name=="VariableName"||e.to-e.from<20&&Nh.test(r.state.sliceDoc(e.from,e.to));if(!t&&!r.explicit)return null;let i=[];for(let s=e;s;s=s.parent)Fh.has(s.name)&&(i=i.concat(Hh(r.state.doc,s)));return{options:i,from:t?e.from:r.pos,validFor:Nh}}var Me=ht.define({name:"javascript",parser:Vh.configure({props:[ii.add({IfStatement:si({except:/^\s*({|else\b)/}),TryStatement:si({except:/^\s*({|catch\b|finally\b)/}),LabeledStatement:Ka,SwitchBody:r=>{let e=r.textAfter,t=/^\s*\}/.test(e),i=/^\s*(case|default)\b/.test(e);return r.baseIndent+(t?0:i?1:2)*r.unit},Block:Ha({closing:"}"}),ArrowFunction:r=>r.baseIndent+r.unit,"TemplateString BlockComment":()=>null,"Statement Property":si({except:/^\s*{/}),JSXElement(r){let e=/^\s*<\//.test(r.textAfter);return r.lineIndent(r.node.from)+(e?0:r.unit)},JSXEscape(r){let e=/\s*\}/.test(r.textAfter);return r.lineIndent(r.node.from)+(e?0:r.unit)},"JSXOpenTag JSXSelfClosingTag"(r){return r.column(r.node.from)+r.unit}}),ri.add({"Block ClassBody SwitchBody EnumBody ObjectExpression ArrayExpression ObjectType":Ds,BlockComment(r){return{from:r.from+2,to:r.to-2}},JSXElement(r){let e=r.firstChild;if(!e||e.name=="JSXSelfClosingTag")return null;let t=r.lastChild;return{from:e.to,to:t.type.isError?r.to:t.from}},"JSXSelfClosingTag JSXOpenTag"(r){var e;let t=(e=r.firstChild)===null||e===void 0?void 0:e.nextSibling,i=r.lastChild;return!t||t.type.isError?null:{from:t.to,to:i.type.isError?r.to:i.from}}})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"`"]},commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case |default:|\{|\}|<\/)$/,wordChars:"$"}}),Jh={test:r=>/^JSX/.test(r.name),facet:Gn({commentTokens:{block:{open:"{/*",close:"*/}"}}})},$o=Me.configure({dialect:"ts"},"typescript"),ko=Me.configure({dialect:"jsx",props:[qs.add(r=>r.isTop?[Jh]:void 0)]}),vo=Me.configure({dialect:"jsx ts",props:[qs.add(r=>r.isTop?[Jh]:void 0)]},"typescript"),ec=r=>({label:r,type:"keyword"}),tc="break case const continue default delete export extends false finally in instanceof let new return static super switch this throw true typeof var yield".split(" ").map(ec),Dd=tc.concat(["declare","implements","private","protected","public"].map(ec));function Us(r={}){let e=r.jsx?r.typescript?vo:ko:r.typescript?$o:Me,t=r.typescript?Vd.concat(Dd):Uh.concat(tc);return new ct(e,[Me.data.of({autocomplete:Dh(Kh,qh(t))}),Me.data.of({autocomplete:qd}),r.jsx?Id:[]])}function Ld(r){for(;;){if(r.name=="JSXOpenTag"||r.name=="JSXSelfClosingTag"||r.name=="JSXFragmentTag")return r;if(r.name=="JSXEscape"||!r.parent)return null;r=r.parent}}function Gh(r,e,t=r.length){for(let i=e?.firstChild;i;i=i.nextSibling)if(i.name=="JSXIdentifier"||i.name=="JSXBuiltin"||i.name=="JSXNamespacedName"||i.name=="JSXMemberExpression")return r.sliceString(i.from,Math.min(i.to,t));return""}var Bd=typeof navigator=="object"&&/Android\b/.test(navigator.userAgent),Id=T.inputHandler.of((r,e,t,i,s)=>{if((Bd?r.composing:r.compositionStarted)||r.state.readOnly||e!=t||i!=">"&&i!="/"||!Me.isActiveAt(r.state,e,-1))return!1;let n=s(),{state:o}=n,l=o.changeByRange(a=>{var h;let{head:c}=a,f=oe(o).resolveInner(c-1,-1) Line truncated
}`,{label:"class",detail:"definition",type:"keyword"}),le('import {${names}} from "${module}"\n${}',{label:"import",detail:"named",type:"keyword"}),le('import ${name} from "${module}"\n${}',{label:"import",detail:"default",type:"keyword"})],Vd=Uh.concat([le("interface ${name} {\n ${}\n}",{label:"interface",detail:"definition",type:"keyword"}),le("type ${name} = ${type}",{label:"type",detail:"definition",type:"keyword"}),le("enum ${name} {\n ${}\n}",{label:"enum",detail:"definition",type:"keyword"})]),Ih=new Ht,Fh=new Set(["Script","Block","FunctionExpression","FunctionDeclaration","ArrowFunction","MethodDeclaration","ForStatement"]);function Di(r){return(e,t)=>{let i=e.node.getChild("VariableDefinition");return i&&t(i,r),!0}}var Ed=["FunctionDeclaration"],Wd={FunctionDeclaration:Di("function"),ClassDeclaration:Di("class"),ClassExpression:()=>!0,EnumDeclaration:Di("constant"),TypeAliasDeclaration:Di("type"),NamespaceDeclaration:Di("namespace"),VariableDefinition(r,e){r.matchContext(Ed)||e(r,"variable")},TypeDefinition(r,e){e(r,"type")},__proto__:null};function Hh(r,e){let t=Ih.get(e);if(t)return t;let i=[],s=!0;function n(o,l){let a=r.sliceString(o.from,o.to);i.push({label:a,type:l})}return e.cursor(j.IncludeAnonymous).iterate(o=>{if(s)s=!1;else if(o.name){let l=Wd[o.name];if(l&&l(o,n)||Fh.has(o.name))return!1}else if(o.to-o.from>8192){for(let l of Hh(r,o.node))i.push(l);return!1}}),Ih.set(e,i),i}var Nh=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,Kh=["TemplateString","String","RegExp","LineComment","BlockComment","VariableDefinition","TypeDefinition","Label","PropertyDefinition","PropertyName","PrivatePropertyDefinition","PrivatePropertyName","JSXText","JSXAttributeValue","JSXOpenTag","JSXCloseTag","JSXSelfClosingTag",".","?."];function qd(r){let e=oe(r.state).resolveInner(r.pos,-1);if(Kh.indexOf(e.name)>-1)return null;let t=e.name=="VariableName"||e.to-e.from<20&&Nh.test(r.state.sliceDoc(e.from,e.to));if(!t&&!r.explicit)return null;let i=[];for(let s=e;s;s=s.parent)Fh.has(s.name)&&(i=i.concat(Hh(r.state.doc,s)));return{options:i,from:t?e.from:r.pos,validFor:Nh}}var Me=ht.define({name:"javascript",parser:Vh.configure({props:[ii.add({IfStatement:si({except:/^\s*({|else\b)/}),TryStatement:si({except:/^\s*({|catch\b|finally\b)/}),LabeledStatement:Ka,SwitchBody:r=>{let e=r.textAfter,t=/^\s*\}/.test(e),i=/^\s*(case|default)\b/.test(e);return r.baseIndent+(t?0:i?1:2)*r.unit},Block:Ha({closing:"}"}),ArrowFunction:r=>r.baseIndent+r.unit,"TemplateString BlockComment":()=>null,"Statement Property":si({except:/^\s*{/}),JSXElement(r){let e=/^\s*<\//.test(r.textAfter);return r.lineIndent(r.node.from)+(e?0:r.unit)},JSXEscape(r){let e=/\s*\}/.test(r.textAfter);return r.lineIndent(r.node.from)+(e?0:r.unit)},"JSXOpenTag JSXSelfClosingTag"(r){return r.column(r.node.from)+r.unit}}),ri.add({"Block ClassBody SwitchBody EnumBody ObjectExpression ArrayExpression ObjectType":Ds,BlockComment(r){return{from:r.from+2,to:r.to-2}},JSXElement(r){let e=r.firstChild;if(!e||e.name=="JSXSelfClosingTag")return null;let t=r.lastChild;return{from:e.to,to:t.type.isError?r.to:t.from}},"JSXSelfClosingTag JSXOpenTag"(r){var e;let t=(e=r.firstChild)===null||e===void 0?void 0:e.nextSibling,i=r.lastChild;return!t||t.type.isError?null:{from:t.to,to:i.type.isError?r.to:i.from}}})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"`"]},commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case |default:|\{|\}|<\/)$/,wordChars:"$"}}),Jh={test:r=>/^JSX/.test(r.name),facet:Gn({commentTokens:{block:{open:"{/*",close:"*/}"}}})},$o=Me.configure({dialect:"ts"},"typescript"),ko=Me.configure({dialect:"jsx",props:[qs.add(r=>r.isTop?[Jh]:void 0)]}),vo=Me.configure({dialect:"jsx ts",props:[qs.add(r=>r.isTop?[Jh]:void 0)]},"typescript"),ec=r=>({label:r,type:"keyword"}),tc="break case const continue default delete export extends false finally in instanceof let new return static super switch this throw true typeof var yield".split(" ").map(ec),Dd=tc.concat(["declare","implements","private","protected","public"].map(ec));function Us(r={}){let e=r.jsx?r.typescript?vo:ko:r.typescript?$o:Me,t=r.typescript?Vd.concat(Dd):Uh.concat(tc);return new ct(e,[Me.data.of({autocomplete:Dh(Kh,qh(t))}),Me.data.of({autocomplete:qd}),r.jsx?Id:[]])}function Ld(r){for(;;){if(r.name=="JSXOpenTag"||r.name=="JSXSelfClosingTag"||r.name=="JSXFragmentTag")return r;if(r.name=="JSXEscape"||!r.parent)return null;r=r.parent}}function Gh(r,e,t=r.length){for(let i=e?.firstChild;i;i=i.nextSibling)if(i.name=="JSXIdentifier"||i.name=="JSXBuiltin"||i.name=="JSXNamespacedName"||i.name=="JSXMemberExpression")return r.sliceString(i.from,Math.min(i.to,t));return""}var Bd=typeof navigator=="object"&&/Android\b/.test(navigator.userAgent),Id=T.inputHandler.of((r,e,t,i,s)=>{if((Bd?r.composing:r.compositionStarted)||r.state.readOnly||e!=t||i!=">"&&i!="/"||!Me.isActiveAt(r.state,e,-1))return!1;let n=s(),{state:o}=n,l=o.changeByRange(a=>{var h;let{head:c}=a,f=oe(o).resolveInner(c-1,-1) Line truncated