{{.locale.Tr "repo.projects.deletion_desc"}}
Package.swift
file:
+swift.install2 = and run the following command:
+swift.documentation = For more information on the Swift registry, see the documentation.
vagrant.install = To add a Vagrant box, run the following command:
vagrant.documentation = For more information on the Vagrant registry, see the documentation.
settings.link = Link this package to a repository
@@ -3354,5 +3360,7 @@ runs.open_tab = %d Open
runs.closed_tab = %d Closed
runs.commit = Commit
runs.pushed_by = Pushed by
+runs.valid_workflow_helper = Workflow config file is valid.
+runs.invalid_workflow_helper = Workflow config file is invalid. Please check your config file: %s
need_approval_desc = Need approval to run workflows for fork pull request.
diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini
index f104d3c49d30..f67eb7ee9f98 100644
--- a/options/locale/locale_es-ES.ini
+++ b/options/locale/locale_es-ES.ini
@@ -3154,6 +3154,7 @@ rubygems.dependencies.development=Dependencias de desarrollo
rubygems.required.ruby=Requiere versión Ruby
rubygems.required.rubygems=Requiere la versión de RubyGem
rubygems.documentation=Para obtener más información sobre el registro de RubyGems, consulte la documentación.
+swift.registry=Configurar este registro desde la línea de comandos:
vagrant.install=Para añadir un paquete Vagrant, ejecuta el siguiente comando:
vagrant.documentation=Para más información sobre el registro de paquetes Vagrant, revisa la documentación.
settings.link=Vincular este paquete a un repositorio
diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini
index d77baee6e502..a4dfa501c5be 100644
--- a/options/locale/locale_it-IT.ini
+++ b/options/locale/locale_it-IT.ini
@@ -3121,6 +3121,7 @@ rubygems.dependencies.development=Dipendenze Di Sviluppo
rubygems.required.ruby=Richiede la versione di Ruby
rubygems.required.rubygems=Richiede la versione RubyGem
rubygems.documentation=Per ulteriori informazioni sul registro di RubyGems, vedere la documentazione.
+swift.registry=Configura questo registro dalla riga di comando:
settings.link=Collega questo pacchetto a un repository
settings.link.description=Se si collega un pacchetto a un repository, il pacchetto è elencato nell'elenco dei pacchetti del repository.
settings.link.select=Seleziona Repository
diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini
index 8e77329f5cc9..c0ff33b1e7eb 100644
--- a/options/locale/locale_ja-JP.ini
+++ b/options/locale/locale_ja-JP.ini
@@ -3232,6 +3232,7 @@ rubygems.dependencies.development=開発用依存関係
rubygems.required.ruby=必要なRubyバージョン
rubygems.required.rubygems=必要なRubyGemバージョン
rubygems.documentation=RubyGemsレジストリの詳細については、ドキュメント を参照してください。
+swift.registry=このレジストリをコマンドラインからセットアップします:
vagrant.install=Vagrant ボックスを追加するには、次のコマンドを実行します。
vagrant.documentation=Vagrantレジストリの詳細については ドキュメントを参照してください。
settings.link=このパッケージをリポジトリにリンク
diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini
index 0f7862f8a3de..2172c23f2152 100644
--- a/options/locale/locale_lv-LV.ini
+++ b/options/locale/locale_lv-LV.ini
@@ -3329,6 +3329,7 @@ rubygems.dependencies.development=Izstrādes atkarības
rubygems.required.ruby=Nepieciešamā Ruby versija
rubygems.required.rubygems=Nepieciešamā RubyGem versija
rubygems.documentation=Papildus informācija par RubyGems reģistru pieejama dokumentācijā.
+swift.registry=Konfigurējiet šo reģistru no komandrindas:
vagrant.install=Lai pievienotu Vagrant kasti, izpildiet sekojošu komandu:
vagrant.documentation=Papildus informācija par Vagrant reģistru pieejama dokumentācijā.
settings.link=Piesaistīt pakotni šim repozitorijam
diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini
index 55529df8829a..5ec3e084bf7f 100644
--- a/options/locale/locale_pt-BR.ini
+++ b/options/locale/locale_pt-BR.ini
@@ -247,6 +247,7 @@ default_enable_timetracking_popup=Habilitar o cronômetro para novos repositóri
no_reply_address=Domínio de e-mail oculto
no_reply_address_helper=Nome de domínio para usuários com um endereço de e-mail oculto. Por exemplo, o nome de usuário 'joe' será registrado no Git como 'joe@noreply.example.org' se o domínio de e-mail oculto estiver definido como 'noreply.example.org'.
password_algorithm=Algoritmo Hash de Senha
+invalid_password_algorithm=Algoritmo de hash de senha inválido
password_algorithm_helper=Escolha o algoritmo de hash para as senhas. Diferentes algoritmos têm requerimentos e forças diversos. O `Argon2` possui boa qualidade, porém usa muita memória e pode ser inapropriado para sistemas com menos recursos.
enable_update_checker=Habilitar Verificador de Atualizações
enable_update_checker_helper=Procura por novas versões periodicamente conectando-se ao gitea.io.
@@ -284,6 +285,7 @@ users=Usuários
organizations=Organizações
search=Pesquisar
code=Código
+search.type.tooltip=Tipo de pesquisa
search.fuzzy=Similar
search.fuzzy.tooltip=Incluir resultados que sejam próximos ao termo de busca
search.match=Correspondência
@@ -819,6 +821,7 @@ remove_account_link=Remover conta vinculada
remove_account_link_desc=A exclusão da chave SSH revogará o acesso à sua conta. Continuar?
remove_account_link_success=A conta vinculada foi removida.
+hooks.desc=Adicionar webhooks que serão acionados para todos os repositórios pertencentes a este usuário.
orgs_none=Você não é membro de nenhuma organização.
repos_none=Você não possui nenhum repositório
@@ -1231,6 +1234,7 @@ projects.column.color=Colorido
projects.open=Abrir
projects.close=Fechar
projects.column.assigned_to=Atribuído a
+projects.card_type.desc=Pré-visualizações de Cards
projects.card_type.images_and_text=Imagens e Texto
projects.card_type.text_only=Somente texto
@@ -1399,6 +1403,7 @@ issues.label_title=Nome da etiqueta
issues.label_description=Descrição da etiqueta
issues.label_color=Cor da etiqueta
issues.label_exclusive=Exclusivo
+issues.label_exclusive_desc=Nomeie o rótulo escopo/item
para torná-lo mutuamente exclusivo com outros rótulos do escopo/
.
issues.label_exclusive_warning=Quaisquer rótulos com escopo conflitantes serão removidos ao editar os rótulos de uma issue ou pull request.
issues.label_count=%d etiquetas
issues.label_open_issues=%d issues abertas
@@ -1655,6 +1660,7 @@ pulls.merge_instruction_hint=`Você também pode ver as *, eventos para todos os branches serão relatados. Veja github.com/gobwas/glob documentação da sintaxe. Exemplos: master
, {master,release*}
.
settings.authorization_header=Header de Autorização
+settings.authorization_header_desc=Será incluído como header de autorização para solicitações quando estiver presente. Exemplos: %s.
settings.active=Ativo
settings.active_helper=Informações sobre eventos disparados serão enviadas para esta URL do webhook.
settings.add_hook_success=O webhook foi adicionado.
@@ -2124,6 +2132,7 @@ settings.dismiss_stale_approvals=Descartar aprovações obsoletas
settings.dismiss_stale_approvals_desc=Quando novos commits que mudam o conteúdo do pull request são enviados para o branch, as antigas aprovações serão descartadas.
settings.require_signed_commits=Exibir commits assinados
settings.require_signed_commits_desc=Rejeitar pushes para este branch se não estiverem assinados ou não forem validáveis.
+settings.protect_branch_name_pattern=Padrão de Nome de Branch Protegida
settings.protect_protected_file_patterns=Padrões de arquivos protegidos (separados usando ponto e vírgula '\;'):
settings.protect_protected_file_patterns_desc=Arquivos protegidos que não têm permissão para serem alterados diretamente, mesmo se o usuário tiver permissão para adicionar, editar ou apagar arquivos neste branch. Vários padrões podem ser separados usando ponto e vírgula ('\;'). Veja github.com/gobwas/glob documentação para sintaxe de padrões. Exemplos: .drone.yml
, /docs/**/*.txt
.
settings.protect_unprotected_file_patterns=Padrões de arquivos desprotegidos (separados usando ponto e vírgula '\;'):
@@ -2132,6 +2141,7 @@ settings.add_protected_branch=Habilitar proteção
settings.delete_protected_branch=Desabilitar proteção
settings.update_protect_branch_success=Proteção do branch '%s' foi atualizada.
settings.remove_protected_branch_success=Proteção do branch '%s' foi desabilitada.
+settings.remove_protected_branch_failed=Removendo regra de proteção de branch '%s' falhou.
settings.protected_branch_deletion=Desabilitar proteção de branch
settings.protected_branch_deletion_desc=Desabilitar a proteção de branch permite que os usuários com permissão de escrita realizem push. Continuar?
settings.block_rejected_reviews=Bloquear merge em revisões rejeitadas
@@ -2146,6 +2156,8 @@ settings.default_merge_style_desc=Estilo de merge padrão para pull requests:
settings.choose_branch=Escolha um branch...
settings.no_protected_branch=Não há branches protegidos.
settings.edit_protected_branch=Editar
+settings.protected_branch_required_rule_name=Nome da regra é obrigatório
+settings.protected_branch_duplicate_rule_name=Regra com nome duplicado
settings.protected_branch_required_approvals_min=Aprovações necessárias não podem ser negativas.
settings.tags=Tags
settings.tags.protection=Proteção das Tags
@@ -2278,6 +2290,8 @@ release.edit_subheader=Lançamentos organizam versões do projeto.
release.tag_name=Nome da tag
release.target=Destino
release.tag_helper=Escolha uma tag existente, ou crie uma nova tag.
+release.tag_helper_new=Nova tag. Esta tag será criada a partir do alvo.
+release.tag_helper_existing=Tag existente.
release.title=Título
release.content=Conteúdo
release.prerelease_desc=Marcar como pré-lançamento
@@ -2570,6 +2584,10 @@ dashboard.delete_old_actions=Excluir todas as ações antigas do banco de dados
dashboard.delete_old_actions.started=A exclusão de todas as ações antigas do banco de dados foi iniciada.
dashboard.update_checker=Verificador de atualização
dashboard.delete_old_system_notices=Excluir todos os avisos de sistema antigos do banco de dados
+dashboard.gc_lfs=Coletar lixos dos meta-objetos LFS
+dashboard.stop_zombie_tasks=Parar tarefas zumbi
+dashboard.stop_endless_tasks=Parar tarefas infinitas
+dashboard.cancel_abandoned_jobs=Cancelar trabalhos abandonados
users.user_manage_panel=Gerenciamento de conta de usuário
users.new_account=Criar conta de usuário
@@ -2658,6 +2676,7 @@ repos.size=Tamanho
packages.package_manage_panel=Gerenciamento de Pacotes
packages.total_size=Tamanho Total: %s
+packages.unreferenced_size=Tamanho Não Referenciado: %s
packages.owner=Proprietário
packages.creator=Criador
packages.name=Nome
@@ -2751,6 +2770,8 @@ auths.oauth2_required_claim_value_helper=Defina este valor para permitir o login
auths.oauth2_group_claim_name=Nome do claim que fornece os nomes dos grupos para esta fonte. (Opcional)
auths.oauth2_admin_group=Valor do Claim de Grupo para os usuários administradores. (Opcional - requer nome do claim acima)
auths.oauth2_restricted_group=Valor do Claim de Grupo para os usuários restritos. (Opcional - requer nome do claim acima)
+auths.oauth2_map_group_to_team=Mapear grupos para Organizações. (Opcional - requer nome do claim acima)
+auths.oauth2_map_group_to_team_removal=Remover usuários de equipes sincronizadas se o usuário não pertence ao grupo correspondente.
auths.enable_auto_register=Habilitar cadastro automático
auths.sspi_auto_create_users=Criar usuários automaticamente
auths.sspi_auto_create_users_helper=Permitir que o método de autenticação SSPI crie automaticamente novas contas para usuários que fazem o login pela primeira vez
@@ -2791,6 +2812,8 @@ auths.still_in_used=A fonte de autenticação ainda está em uso. Converta ou ex
auths.deletion_success=A fonte de autenticação foi excluída.
auths.login_source_exist=A fonte de autenticação '%s' já existe.
auths.login_source_of_type_exist=Uma fonte de autenticação deste tipo já existe.
+auths.unable_to_initialize_openid=Não é possível inicializar o Provedor OpenID Connect: %s
+auths.invalid_openIdConnectAutoDiscoveryURL=URL do Auto Discovery inválida (deve ser uma URL válida, começando com http:// ou https://)
config.server_config=Configuração do servidor
config.app_name=Nome do servidor
@@ -3039,6 +3062,7 @@ reopen_pull_request=`reabriu o pull request %[3]s#%[2]s`
comment_issue=`comentou na issue %[3]s#%[2]s`
comment_pull=`comentou no pull request %[3]s#%[2]s`
merge_pull_request=`fez merge do pull request %[3]s#%[2]s`
+auto_merge_pull_request=`fez merge automático do pull request %[3]s#%[2]s`
transfer_repo=transferiu repositório de %s
para %s
push_tag=fez push da tag %[3]s to %[4]s
delete_tag=excluiu tag %[2]s de %[3]s
@@ -3148,10 +3172,12 @@ dependency.id=ID
dependency.version=Versão
cargo.registry=Configurar este registro no arquivo de configuração de Cargo (por exemplo ~/.cargo/config.toml
):
cargo.install=Para instalar o pacote usando Cargo, execute o seguinte comando:
+cargo.documentation=Para obter mais informações sobre o registro Cargo, consulte a documentação.
cargo.details.repository_site=Site do Repositório
cargo.details.documentation_site=Site da Documentação
chef.registry=Configure este registro em seu arquivo ~/.chef/config.rb
:
chef.install=Para instalar o pacote, execute o seguinte comando:
+chef.documentation=Para obter mais informações sobre o registro Chef, consulte a documentação.
composer.registry=Configure este registro em seu arquivo ~/.composer/config.json
:
composer.install=Para instalar o pacote usando o Composer, execute o seguinte comando:
composer.documentation=Para obter mais informações sobre o registro do Composer, consulte a documentação.
@@ -3211,6 +3237,7 @@ rubygems.dependencies.development=Dependências de Desenvolvimento
rubygems.required.ruby=Requer o Ruby versão
rubygems.required.rubygems=Requer o RubyGem versão
rubygems.documentation=Para obter mais informações sobre o registro do RubyGems, consulte a documentação.
+swift.registry=Configure este registro pela linha de comando:
vagrant.install=Para adicionar uma Vagrant box, execute o seguinte comando:
vagrant.documentation=Para obter mais informações sobre o registro do Vagrant, consulte a documentação.
settings.link=Vincular este pacote a um repositório
@@ -3224,6 +3251,15 @@ settings.delete.description=A exclusão de um pacote é permanente e não pode s
settings.delete.notice=Você está prestes a excluir %s (%s). Esta operação é irreversível, tem certeza?
settings.delete.success=O pacote foi excluído.
settings.delete.error=Falha ao excluir o pacote.
+owner.settings.cargo.title=Índice do Registro Cargo
+owner.settings.cargo.initialize=Iniciar Índice
+owner.settings.cargo.initialize.description=Para usar o registro Cargo é necessário um repositório git especial. Aqui você pode (re)criá-lo com a configuração necessária.
+owner.settings.cargo.initialize.error=Falha ao inicializar índice Cargo: %v
+owner.settings.cargo.initialize.success=O índice Cargo foi criado com sucesso.
+owner.settings.cargo.rebuild=Reconstruir Índice
+owner.settings.cargo.rebuild.description=Se o índice está fora de sincronia com os pacotes Cargo, você pode reconstruí-lo aqui.
+owner.settings.cargo.rebuild.error=Falha ao reconstruir índice Cargo: %v
+owner.settings.cargo.rebuild.success=O índice Cargo foi reconstruído com sucesso.
owner.settings.cleanuprules.title=Gerenciar Regras de Limpeza
owner.settings.cleanuprules.add=Adicionar Regra de Limpeza
owner.settings.cleanuprules.edit=Editar Regra de Limpeza
@@ -3232,6 +3268,7 @@ owner.settings.cleanuprules.preview=Pré-visualizar Regra de Limpeza
owner.settings.cleanuprules.preview.overview=%d pacotes agendados para serem removidos.
owner.settings.cleanuprules.preview.none=A regra de limpeza não corresponde a nenhum pacote.
owner.settings.cleanuprules.enabled=Habilitado
+owner.settings.cleanuprules.pattern_full_match=Aplicar padrão ao nome completo do pacote
owner.settings.cleanuprules.keep.title=Versões que correspondem a estas regras são mantidas, mesmo se corresponderem a uma regra de remoção abaixo.
owner.settings.cleanuprules.keep.count=Manter o mais recente
owner.settings.cleanuprules.keep.count.1=1 versão por pacote
@@ -3245,6 +3282,7 @@ owner.settings.cleanuprules.success.update=Regra de limpeza foi atualizada.
owner.settings.cleanuprules.success.delete=Regra de limpeza foi excluída.
owner.settings.chef.title=Registro Chef
owner.settings.chef.keypair=Gerar par de chaves
+owner.settings.chef.keypair.description=Gerar um par de chaves usado para autenticar no registro Chef. A chave anterior não pode ser usada depois.
[secrets]
secrets=Segredos
@@ -3253,6 +3291,8 @@ none=Não há segredos ainda.
value=Valor
name=Nome
creation=Adicionar Segredo
+creation.name_placeholder=apenas caracteres alfanuméricos ou underline (_), não pode começar com GITEA_ ou GITHUB_
+creation.value_placeholder=Insira qualquer conteúdo. Espaços em branco no início e no fim serão omitidos.
creation.success=O segredo '%s' foi adicionado.
creation.failed=Falha ao adicionar segredo.
deletion=Excluir segredo
@@ -3274,6 +3314,10 @@ status.cancelled=Cancelado
status.skipped=Ignorado
status.blocked=Bloqueado
+runners=Runners
+runners.runner_manage_panel=Gerenciamento de Runners
+runners.new=Criar novo Runner
+runners.new_notice=Como iniciar um runner
runners.status=Status
runners.id=ID
runners.name=Nome
@@ -3281,21 +3325,36 @@ runners.owner_type=Tipo
runners.description=Descrição
runners.labels=Rótulos
runners.last_online=Última Vez Online
+runners.agent_labels=Etiquetas do Agente
runners.custom_labels=Etiquetas Personalizadas
runners.custom_labels_helper=Etiquetas personalizadas são etiquetas que são adicionadas manualmente por um administrador. Separe as etiquetas com vírgula. Espaço em branco no começo ou no final de cada etiqueta é ignorado.
+runners.runner_title=Runner
+runners.task_list=Tarefas recentes neste runner
runners.task_list.run=Executar
runners.task_list.status=Status
runners.task_list.repository=Repositório
runners.task_list.commit=Commit
+runners.task_list.done_at=Feito em
+runners.edit_runner=Editar Runner
runners.update_runner=Atualizar as Alterações
+runners.update_runner_success=Runner atualizado com sucesso
+runners.update_runner_failed=Falha ao atualizar runner
+runners.delete_runner=Deletar esse runner
+runners.delete_runner_success=Runner excluído com sucesso
+runners.delete_runner_failed=Falha ao excluir runner
+runners.delete_runner_header=Confirme para excluir este runner
+runners.delete_runner_notice=Se uma tarefa estiver sendo executada neste runner, ela será encerrada e marcada como falha. Pode quebrar o workflow de construção.
+runners.none=Nenhum runner disponível
runners.status.unspecified=Desconhecido
runners.status.idle=Inativo
runners.status.active=Ativo
runners.status.offline=Offiline
+runs.all_workflows=Todos os Workflows
runs.open_tab=%d Aberto
runs.closed_tab=%d Fechado
runs.commit=Commit
runs.pushed_by=Push realizado por
+need_approval_desc=Precisa de aprovação para executar workflowa para pull request do fork.
diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini
index ef7a400ec8b8..ee36a0f4e64c 100644
--- a/options/locale/locale_pt-PT.ini
+++ b/options/locale/locale_pt-PT.ini
@@ -1357,8 +1357,8 @@ issues.opened_by_fake=%[1]s aberta(s) por %[2]s
issues.closed_by_fake=por %[2]s foi fechada %[1]s
issues.previous=Anterior
issues.next=Seguinte
-issues.open_title=Aberta
-issues.closed_title=Fechada
+issues.open_title=aberta(s)
+issues.closed_title=fechada(s)
issues.draft_title=Rascunho
issues.num_comments=%d comentários
issues.commented_at=`comentou %s`
@@ -1780,7 +1780,7 @@ activity.title.issues_1=%d questão
activity.title.issues_n=%d questões
activity.title.issues_closed_from=%s resolvida(s) de %s
activity.title.issues_created_by=%s criada por %s
-activity.closed_issue_label=Encerrada
+activity.closed_issue_label=Fechada
activity.new_issues_count_1=questão nova
activity.new_issues_count_n=questões novas
activity.new_issue_label=Em aberto
@@ -2934,6 +2934,8 @@ config.git_disable_diff_highlight=Desabilitar o realce de sintaxe no diff
config.git_max_diff_lines=Número máximo de linhas diff (por ficheiro)
config.git_max_diff_line_characters=Número máximos de caracteres diff (por linha)
config.git_max_diff_files=Número máximo de ficheiros diff a serem apresentados
+config.git_enable_reflogs=Habilitar reflogs
+config.git_reflog_expiry_time=Tempo de expiração
config.git_gc_args=Argumentos da recolha de lixo
config.git_migrate_timeout=Prazo da migração
config.git_mirror_timeout=Prazo para sincronização da réplica
@@ -3237,6 +3239,10 @@ rubygems.dependencies.development=Dependências de desenvolvimento
rubygems.required.ruby=Requer a versão do Ruby
rubygems.required.rubygems=Requer a versão do RubyGem
rubygems.documentation=Para obter mais informações sobre o registo do RubyGems, consulte a documentação.
+swift.registry=Configurar este registo usando a linha de comandos:
+swift.install=Adicione o pacote no seu ficheiro Package.swift
:
+swift.install2=e execute o seguinte comando:
+swift.documentation=Para obter mais informações sobre o registo do Swift, consulte a documentação.
vagrant.install=Para adicionar uma máquina virtual Vagrant, execute o seguinte comando:
vagrant.documentation=Para obter mais informações sobre o registo do Vagrant, consulte a documentação.
settings.link=Vincular este pacote a um repositório
diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini
index 131dfa69af19..ae5b42c7d834 100644
--- a/options/locale/locale_tr-TR.ini
+++ b/options/locale/locale_tr-TR.ini
@@ -57,6 +57,7 @@ new_mirror=Yeni Yansı
new_fork=Yeni Depo Çatalı
new_org=Yeni Organizasyon
new_project=Yeni Proje
+new_project_column=Yeni Sütun
manage_org=Organizasyonları Yönet
admin_panel=Site Yönetimi
account_settings=Hesap Ayarları
@@ -90,9 +91,11 @@ disabled=Devre Dışı
copy=Kopyala
copy_url=URL'yi kopyala
+copy_content=İçeriği kopyala
copy_branch=Dal adını kopyala
copy_success=Kopyalandı!
copy_error=Kopyalama başarısız oldu
+copy_type_unsupported=Bu dosya türü kopyalanamaz
write=Yaz
preview=Önizleme
@@ -109,6 +112,10 @@ never=Asla
rss_feed=RSS Beslemesi
[aria]
+navbar=Gezinti Çubuğu
+footer=Alt Bilgi
+footer.software=Yazılım Hakkında
+footer.links=Bağlantılar
[filter]
string.asc=A - Z
@@ -240,7 +247,10 @@ default_enable_timetracking_popup=Yeni depolar için zaman takibini varsayılan
no_reply_address=Gizlenecek E-Posta Alan Adı
no_reply_address_helper=Gizlenmiş e-posta adresine sahip kullanıcılar için alan adı. Örneğin 'ali' kullanıcı adı, gizlenmiş e-postalar için alan adı 'yanityok.ornek.org' olarak ayarlandığında Git günlüğüne 'ali@yanityok.ornek.org' olarak kaydedilecektir.
password_algorithm=Parola Hash Algoritması
+invalid_password_algorithm=Hatalı parola hash algoritması
password_algorithm_helper=Parola için hash algoritmasını ayarlayın. Algoritmalar değişen gereksinimlere ve güce sahiptirler. `argon2` iyi özelliklere sahip olmasına rağmen fazla miktarda bellek kullanır ve küçük sistemler için uygun olmayabilir.
+enable_update_checker=Güncelleme Denetleyicisini Etkinleştir
+enable_update_checker_helper=Düzenli olarak gitea.io'ya bağlanarak yeni yayınlanan sürümleri denetler.
[home]
uname_holder=Kullanıcı Adı veya E-Posta Adresi
@@ -290,14 +300,36 @@ code_last_indexed_at=Son endekslenen %s
relevant_repositories_tooltip=Çatal olan veya konusu, simgesi veya açıklaması olmayan depolar gizlenmiştir.
relevant_repositories=`Sadece ilişkili depolar gösteriliyor, belgeye bakabilirsiniz.
+swift.registry=Bu kütüğü komut satırını kullanarak kurun:
vagrant.install=Vagrant paketi eklemek için aşağıdaki komutu çalıştırın:
vagrant.documentation=Vagrant kütüğü hakkında daha fazla bilgi için, belgeye bakabilirsiniz.
settings.link=Bu paketi bir depoya bağlayın
diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini
index aa4cc4dde974..21836963f1ce 100644
--- a/options/locale/locale_zh-CN.ini
+++ b/options/locale/locale_zh-CN.ini
@@ -3232,6 +3232,7 @@ rubygems.dependencies.development=开发依赖
rubygems.required.ruby=需要 Ruby 版本
rubygems.required.rubygems=需要 RubyGem 版本
rubygems.documentation=关于 RubyGems 注册中心的更多信息,请参阅 文档。
+swift.registry=从命令行设置此注册中心:
vagrant.install=若要添加一个 Vagrant box,请运行以下命令:
vagrant.documentation=关于 Vagrant 注册中心的更多信息,请参阅 文档。
settings.link=将此软件包链接到仓库
diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini
index e98e55b77700..5ef7b96dee48 100644
--- a/options/locale/locale_zh-TW.ini
+++ b/options/locale/locale_zh-TW.ini
@@ -3232,6 +3232,7 @@ rubygems.dependencies.development=開發相依性
rubygems.required.ruby=需要的 Ruby 版本
rubygems.required.rubygems=需要的 RubyGem 版本
rubygems.documentation=關於 RubyGems registry 的詳情請參閱說明文件。
+swift.registry=透過下列命令設定此註冊中心:
vagrant.install=執行下列命令以新增 Vagrant box:
vagrant.documentation=關於 Vagrant registry 的詳情請參閱說明文件。
settings.link=連結此套件到儲存庫
diff --git a/package-lock.json b/package-lock.json
index 7ec6d09d1996..815b58c344e6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -28,8 +28,6 @@
"jquery": "3.6.3",
"jquery.are-you-sure": "1.9.0",
"katex": "0.16.4",
- "less": "4.1.3",
- "less-loader": "11.1.0",
"license-checker-webpack-plugin": "0.2.1",
"mermaid": "10.0.2",
"mini-css-extract-plugin": "2.7.2",
@@ -45,7 +43,7 @@
"vue-bar-graph": "2.0.0",
"vue-loader": "17.0.1",
"vue3-calendar-heatmap": "2.0.0",
- "webpack": "5.75.0",
+ "webpack": "5.76.0",
"webpack-cli": "5.0.1",
"workbox-routing": "6.5.4",
"workbox-strategies": "6.5.4",
@@ -64,7 +62,6 @@
"eslint-plugin-vue": "9.9.0",
"jsdom": "21.0.0",
"markdownlint-cli": "0.33.0",
- "postcss-less": "6.0.0",
"stylelint": "15.2.0",
"stylelint-declaration-strict-value": "1.9.2",
"svgo": "3.0.2",
@@ -2667,6 +2664,9 @@
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
"integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
"is-what": "^3.14.1"
},
@@ -3813,7 +3813,9 @@
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
"integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "dev": true,
"optional": true,
+ "peer": true,
"dependencies": {
"prr": "~1.0.1"
},
@@ -5240,7 +5242,9 @@
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
"integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+ "dev": true,
"optional": true,
+ "peer": true,
"bin": {
"image-size": "bin/image-size.js"
},
@@ -5675,7 +5679,10 @@
"node_modules/is-what": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
- "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA=="
+ "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"node_modules/isarray": {
"version": "0.0.1",
@@ -5933,14 +5940,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/klona": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
- "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/known-css-properties": {
"version": "0.26.0",
"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz",
@@ -5956,6 +5955,9 @@
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz",
"integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
"copy-anything": "^2.0.1",
"parse-node-version": "^1.0.1",
@@ -5977,25 +5979,6 @@
"source-map": "~0.6.0"
}
},
- "node_modules/less-loader": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz",
- "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==",
- "dependencies": {
- "klona": "^2.0.4"
- },
- "engines": {
- "node": ">= 14.15.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "less": "^3.5.0 || ^4.0.0",
- "webpack": "^5.0.0"
- }
- },
"node_modules/leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -6201,7 +6184,9 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
"integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
"optional": true,
+ "peer": true,
"dependencies": {
"pify": "^4.0.1",
"semver": "^5.6.0"
@@ -6214,7 +6199,9 @@
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true,
"optional": true,
+ "peer": true,
"bin": {
"semver": "bin/semver"
}
@@ -6505,7 +6492,9 @@
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
"optional": true,
+ "peer": true,
"bin": {
"mime": "cli.js"
},
@@ -6637,7 +6626,7 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "devOptional": true
+ "dev": true
},
"node_modules/nanoid": {
"version": "3.3.4",
@@ -6660,7 +6649,9 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz",
"integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==",
+ "dev": true,
"optional": true,
+ "peer": true,
"dependencies": {
"debug": "^3.2.6",
"iconv-lite": "^0.6.3",
@@ -6677,7 +6668,9 @@
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
"optional": true,
+ "peer": true,
"dependencies": {
"ms": "^2.1.1"
}
@@ -7047,6 +7040,9 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
"integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">= 0.10"
}
@@ -7148,7 +7144,9 @@
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
"optional": true,
+ "peer": true,
"engines": {
"node": ">=6"
}
@@ -7288,18 +7286,6 @@
"node": "^10 || ^12 || >=14"
}
},
- "node_modules/postcss-less": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-6.0.0.tgz",
- "integrity": "sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3.5"
- }
- },
"node_modules/postcss-media-query-parser": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
@@ -7481,7 +7467,9 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
"integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
- "optional": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"node_modules/psl": {
"version": "1.9.0",
@@ -7987,7 +7975,9 @@
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
- "optional": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"node_modules/saxes": {
"version": "6.0.0",
@@ -8917,7 +8907,8 @@
"node_modules/tslib": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
- "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
+ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
+ "dev": true
},
"node_modules/type-check": {
"version": "0.4.0",
@@ -9413,9 +9404,9 @@
}
},
"node_modules/webpack": {
- "version": "5.75.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz",
- "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==",
+ "version": "5.76.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz",
+ "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==",
"dependencies": {
"@types/eslint-scope": "^3.7.3",
"@types/estree": "^0.0.51",
@@ -11852,6 +11843,9 @@
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
"integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
"requires": {
"is-what": "^3.14.1"
}
@@ -12710,7 +12704,9 @@
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
"integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "dev": true,
"optional": true,
+ "peer": true,
"requires": {
"prr": "~1.0.1"
}
@@ -13783,7 +13779,9 @@
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
"integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
- "optional": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"immer": {
"version": "9.0.18",
@@ -14076,7 +14074,10 @@
"is-what": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
- "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA=="
+ "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"isarray": {
"version": "0.0.1",
@@ -14269,11 +14270,6 @@
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
},
- "klona": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
- "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="
- },
"known-css-properties": {
"version": "0.26.0",
"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz",
@@ -14289,6 +14285,9 @@
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz",
"integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
"requires": {
"copy-anything": "^2.0.1",
"errno": "^0.1.1",
@@ -14302,14 +14301,6 @@
"tslib": "^2.3.0"
}
},
- "less-loader": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz",
- "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==",
- "requires": {
- "klona": "^2.0.4"
- }
- },
"leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -14484,7 +14475,9 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
"integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
"optional": true,
+ "peer": true,
"requires": {
"pify": "^4.0.1",
"semver": "^5.6.0"
@@ -14494,7 +14487,9 @@
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "optional": true
+ "dev": true,
+ "optional": true,
+ "peer": true
}
}
},
@@ -14721,7 +14716,9 @@
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "optional": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"mime-db": {
"version": "1.52.0",
@@ -14817,7 +14814,7 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "devOptional": true
+ "dev": true
},
"nanoid": {
"version": "3.3.4",
@@ -14834,7 +14831,9 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz",
"integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==",
+ "dev": true,
"optional": true,
+ "peer": true,
"requires": {
"debug": "^3.2.6",
"iconv-lite": "^0.6.3",
@@ -14845,7 +14844,9 @@
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
"optional": true,
+ "peer": true,
"requires": {
"ms": "^2.1.1"
}
@@ -15127,7 +15128,10 @@
"parse-node-version": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
- "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA=="
+ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"parse5": {
"version": "7.1.2",
@@ -15198,7 +15202,9 @@
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
- "optional": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"pkg-dir": {
"version": "4.2.0",
@@ -15296,13 +15302,6 @@
"source-map-js": "^1.0.2"
}
},
- "postcss-less": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-6.0.0.tgz",
- "integrity": "sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==",
- "dev": true,
- "requires": {}
- },
"postcss-media-query-parser": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
@@ -15433,7 +15432,9 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
"integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
- "optional": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"psl": {
"version": "1.9.0",
@@ -15792,7 +15793,9 @@
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
- "optional": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"saxes": {
"version": "6.0.0",
@@ -16527,7 +16530,8 @@
"tslib": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
- "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
+ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
+ "dev": true
},
"type-check": {
"version": "0.4.0",
@@ -16847,9 +16851,9 @@
"dev": true
},
"webpack": {
- "version": "5.75.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz",
- "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==",
+ "version": "5.76.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz",
+ "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==",
"requires": {
"@types/eslint-scope": "^3.7.3",
"@types/estree": "^0.0.51",
diff --git a/package.json b/package.json
index c4457fe9708f..f10b331ed721 100644
--- a/package.json
+++ b/package.json
@@ -28,8 +28,6 @@
"jquery": "3.6.3",
"jquery.are-you-sure": "1.9.0",
"katex": "0.16.4",
- "less": "4.1.3",
- "less-loader": "11.1.0",
"license-checker-webpack-plugin": "0.2.1",
"mermaid": "10.0.2",
"mini-css-extract-plugin": "2.7.2",
@@ -45,7 +43,7 @@
"vue-bar-graph": "2.0.0",
"vue-loader": "17.0.1",
"vue3-calendar-heatmap": "2.0.0",
- "webpack": "5.75.0",
+ "webpack": "5.76.0",
"webpack-cli": "5.0.1",
"workbox-routing": "6.5.4",
"workbox-strategies": "6.5.4",
@@ -64,7 +62,6 @@
"eslint-plugin-vue": "9.9.0",
"jsdom": "21.0.0",
"markdownlint-cli": "0.33.0",
- "postcss-less": "6.0.0",
"stylelint": "15.2.0",
"stylelint-declaration-strict-value": "1.9.2",
"svgo": "3.0.2",
diff --git a/public/img/svg/fontawesome-save.svg b/public/img/svg/fontawesome-save.svg
new file mode 100644
index 000000000000..f7beb90d949e
--- /dev/null
+++ b/public/img/svg/fontawesome-save.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/img/svg/gitea-swift.svg b/public/img/svg/gitea-swift.svg
new file mode 100644
index 000000000000..ebfea951da33
--- /dev/null
+++ b/public/img/svg/gitea-swift.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/routers/api/packages/README.md b/routers/api/packages/README.md
new file mode 100644
index 000000000000..533a0d32f066
--- /dev/null
+++ b/routers/api/packages/README.md
@@ -0,0 +1,50 @@
+# Gitea Package Registry
+
+This document gives a brief overview how the package registry is organized in code.
+
+## Structure
+
+The package registry code is divided into multiple modules to split the functionality and make code reuse possible.
+
+| Module | Description |
+| - | - |
+| `models/packages` | Common methods and models used by all registry types |
+| `models/packages/{{.Git.GCArgs}}
{{.locale.Tr "admin.emails.change_email_text"}}
+{{.locale.Tr "admin.emails.change_email_text"}}
{{.locale.Tr "admin.users.purge_help"}}
-swift package-registry set
dependencies: [
+ .package(id: "{{.PackageDescriptor.Package.Name}}", from:"{{.PackageDescriptor.Version.Version}}")
+]
swift package resolve
{{.locale.Tr "repo.projects.deletion_desc"}}
{{.locale.Tr "repo.projects.deletion_desc"}}
{{.locale.Tr "repo.settings.deploy_key_deletion_desc"}}
{{.locale.Tr "repo.settings.webhook_deletion_desc"}}
{{.locale.Tr "settings.access_token_deletion_desc"}}
{{.locale.Tr "settings.twofa_not_enrolled"}}
diff --git a/tests/integration/api_packages_swift_test.go b/tests/integration/api_packages_swift_test.go new file mode 100644 index 000000000000..a3035ea60485 --- /dev/null +++ b/tests/integration/api_packages_swift_test.go @@ -0,0 +1,326 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package integration + +import ( + "archive/zip" + "bytes" + "fmt" + "io" + "mime/multipart" + "net/http" + "strings" + "testing" + + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + swift_module "code.gitea.io/gitea/modules/packages/swift" + "code.gitea.io/gitea/modules/setting" + swift_router "code.gitea.io/gitea/routers/api/packages/swift" + "code.gitea.io/gitea/tests" + + "github.com/stretchr/testify/assert" +) + +func TestPackageSwift(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + + packageScope := "test-scope" + packageName := "test_package" + packageID := packageScope + "." + packageName + packageVersion := "1.0.3" + packageAuthor := "KN4CK3R" + packageDescription := "Gitea Test Package" + packageRepositoryURL := "https://gitea.io/gitea/gitea" + contentManifest1 := "// swift-tools-version:5.7\n//\n// Package.swift" + contentManifest2 := "// swift-tools-version:5.6\n//\n// Package@swift-5.6.swift" + + url := fmt.Sprintf("/api/packages/%s/swift", user.Name) + + t.Run("CheckAcceptMediaType", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + for _, sub := range []string{ + "/scope/package", + "/scope/package.json", + "/scope/package/1.0.0", + "/scope/package/1.0.0.json", + "/scope/package/1.0.0.zip", + "/scope/package/1.0.0/Package.swift", + "/identifiers", + } { + req := NewRequest(t, "GET", url+sub) + req.Header.Add("Accept", "application/unknown") + resp := MakeRequest(t, req, http.StatusBadRequest) + + assert.Equal(t, "1", resp.Header().Get("Content-Version")) + assert.Equal(t, "application/problem+json", resp.Header().Get("Content-Type")) + } + + req := NewRequestWithBody(t, "PUT", url+"/scope/package/1.0.0", strings.NewReader("")) + req = AddBasicAuthHeader(req, user.Name) + req.Header.Add("Accept", "application/unknown") + resp := MakeRequest(t, req, http.StatusBadRequest) + + assert.Equal(t, "1", resp.Header().Get("Content-Version")) + assert.Equal(t, "application/problem+json", resp.Header().Get("Content-Type")) + }) + + t.Run("Upload", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + uploadPackage := func(t *testing.T, url string, expectedStatus int, sr io.Reader, metadata string) { + var body bytes.Buffer + mpw := multipart.NewWriter(&body) + + part, _ := mpw.CreateFormFile("source-archive", "source-archive.zip") + io.Copy(part, sr) + + if metadata != "" { + mpw.WriteField("metadata", metadata) + } + + mpw.Close() + + req := NewRequestWithBody(t, "PUT", url, &body) + req.Header.Add("Content-Type", mpw.FormDataContentType()) + req.Header.Add("Accept", swift_router.AcceptJSON) + req = AddBasicAuthHeader(req, user.Name) + MakeRequest(t, req, expectedStatus) + } + + createArchive := func(files map[string]string) *bytes.Buffer { + var buf bytes.Buffer + zw := zip.NewWriter(&buf) + for filename, content := range files { + w, _ := zw.Create(filename) + w.Write([]byte(content)) + } + zw.Close() + return &buf + } + + for _, triple := range []string{"/sc_ope/package/1.0.0", "/scope/pack~age/1.0.0", "/scope/package/1_0.0"} { + req := NewRequestWithBody(t, "PUT", url+triple, bytes.NewReader([]byte{})) + req = AddBasicAuthHeader(req, user.Name) + resp := MakeRequest(t, req, http.StatusBadRequest) + + assert.Equal(t, "1", resp.Header().Get("Content-Version")) + assert.Equal(t, "application/problem+json", resp.Header().Get("Content-Type")) + } + + uploadURL := fmt.Sprintf("%s/%s/%s/%s", url, packageScope, packageName, packageVersion) + + req := NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader([]byte{})) + MakeRequest(t, req, http.StatusUnauthorized) + + uploadPackage( + t, + uploadURL, + http.StatusCreated, + createArchive(map[string]string{ + "Package.swift": contentManifest1, + "Package@swift-5.6.swift": contentManifest2, + }), + `{"name":"`+packageName+`","version":"`+packageVersion+`","description":"`+packageDescription+`","codeRepository":"`+packageRepositoryURL+`","author":{"givenName":"`+packageAuthor+`"},"repositoryURLs":["`+packageRepositoryURL+`"]}`, + ) + + pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeSwift) + assert.NoError(t, err) + assert.Len(t, pvs, 1) + + pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0]) + assert.NoError(t, err) + assert.NotNil(t, pd.SemVer) + assert.Equal(t, packageID, pd.Package.Name) + assert.Equal(t, packageVersion, pd.Version.Version) + assert.IsType(t, &swift_module.Metadata{}, pd.Metadata) + metadata := pd.Metadata.(*swift_module.Metadata) + assert.Equal(t, packageDescription, metadata.Description) + assert.Len(t, metadata.Manifests, 2) + assert.Equal(t, contentManifest1, metadata.Manifests[""].Content) + assert.Equal(t, contentManifest2, metadata.Manifests["5.6"].Content) + assert.Len(t, pd.VersionProperties, 1) + assert.Equal(t, packageRepositoryURL, pd.VersionProperties.GetByName(swift_module.PropertyRepositoryURL)) + + pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID) + assert.NoError(t, err) + assert.Len(t, pfs, 1) + assert.Equal(t, fmt.Sprintf("%s-%s.zip", packageName, packageVersion), pfs[0].Name) + assert.True(t, pfs[0].IsLead) + + uploadPackage( + t, + uploadURL, + http.StatusConflict, + createArchive(map[string]string{ + "Package.swift": contentManifest1, + }), + "", + ) + }) + + t.Run("Download", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequest(t, "GET", fmt.Sprintf("%s/%s/%s/%s.zip", url, packageScope, packageName, packageVersion)) + req = AddBasicAuthHeader(req, user.Name) + req.Header.Add("Accept", swift_router.AcceptZip) + resp := MakeRequest(t, req, http.StatusOK) + + assert.Equal(t, "1", resp.Header().Get("Content-Version")) + assert.Equal(t, "application/zip", resp.Header().Get("Content-Type")) + + pv, err := packages.GetVersionByNameAndVersion(db.DefaultContext, user.ID, packages.TypeSwift, packageID, packageVersion) + assert.NotNil(t, pv) + assert.NoError(t, err) + + pd, err := packages.GetPackageDescriptor(db.DefaultContext, pv) + assert.NoError(t, err) + assert.Equal(t, "sha256="+pd.Files[0].Blob.HashSHA256, resp.Header().Get("Digest")) + }) + + t.Run("EnumeratePackageVersions", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequest(t, "GET", fmt.Sprintf("%s/%s/%s", url, packageScope, packageName)) + req = AddBasicAuthHeader(req, user.Name) + req.Header.Add("Accept", swift_router.AcceptJSON) + resp := MakeRequest(t, req, http.StatusOK) + + versionURL := setting.AppURL + url[1:] + fmt.Sprintf("/%s/%s/%s", packageScope, packageName, packageVersion) + + assert.Equal(t, "1", resp.Header().Get("Content-Version")) + assert.Equal(t, fmt.Sprintf(`<%s>; rel="latest-version"`, versionURL), resp.Header().Get("Link")) + + body := resp.Body.String() + + var result *swift_router.EnumeratePackageVersionsResponse + DecodeJSON(t, resp, &result) + + assert.Len(t, result.Releases, 1) + assert.Contains(t, result.Releases, packageVersion) + assert.Equal(t, versionURL, result.Releases[packageVersion].URL) + + req = NewRequest(t, "GET", fmt.Sprintf("%s/%s/%s.json", url, packageScope, packageName)) + req = AddBasicAuthHeader(req, user.Name) + resp = MakeRequest(t, req, http.StatusOK) + + assert.Equal(t, body, resp.Body.String()) + }) + + t.Run("PackageVersionMetadata", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequest(t, "GET", fmt.Sprintf("%s/%s/%s/%s", url, packageScope, packageName, packageVersion)) + req = AddBasicAuthHeader(req, user.Name) + req.Header.Add("Accept", swift_router.AcceptJSON) + resp := MakeRequest(t, req, http.StatusOK) + + assert.Equal(t, "1", resp.Header().Get("Content-Version")) + + body := resp.Body.String() + + var result *swift_router.PackageVersionMetadataResponse + DecodeJSON(t, resp, &result) + + pv, err := packages.GetVersionByNameAndVersion(db.DefaultContext, user.ID, packages.TypeSwift, packageID, packageVersion) + assert.NotNil(t, pv) + assert.NoError(t, err) + + pd, err := packages.GetPackageDescriptor(db.DefaultContext, pv) + assert.NoError(t, err) + + assert.Equal(t, packageID, result.ID) + assert.Equal(t, packageVersion, result.Version) + assert.Len(t, result.Resources, 1) + assert.Equal(t, "source-archive", result.Resources[0].Name) + assert.Equal(t, "application/zip", result.Resources[0].Type) + assert.Equal(t, pd.Files[0].Blob.HashSHA256, result.Resources[0].Checksum) + assert.Equal(t, "SoftwareSourceCode", result.Metadata.Type) + assert.Equal(t, packageName, result.Metadata.Name) + assert.Equal(t, packageVersion, result.Metadata.Version) + assert.Equal(t, packageDescription, result.Metadata.Description) + assert.Equal(t, "Swift", result.Metadata.ProgrammingLanguage.Name) + assert.Equal(t, packageAuthor, result.Metadata.Author.GivenName) + + req = NewRequest(t, "GET", fmt.Sprintf("%s/%s/%s/%s.json", url, packageScope, packageName, packageVersion)) + req = AddBasicAuthHeader(req, user.Name) + resp = MakeRequest(t, req, http.StatusOK) + + assert.Equal(t, body, resp.Body.String()) + }) + + t.Run("DownloadManifest", func(t *testing.T) { + manifestURL := fmt.Sprintf("%s/%s/%s/%s/Package.swift", url, packageScope, packageName, packageVersion) + + t.Run("Default", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequest(t, "GET", manifestURL) + req = AddBasicAuthHeader(req, user.Name) + req.Header.Add("Accept", swift_router.AcceptSwift) + resp := MakeRequest(t, req, http.StatusOK) + + assert.Equal(t, "1", resp.Header().Get("Content-Version")) + assert.Equal(t, "text/x-swift", resp.Header().Get("Content-Type")) + assert.Equal(t, contentManifest1, resp.Body.String()) + }) + + t.Run("DifferentVersion", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequest(t, "GET", manifestURL+"?swift-version=5.6") + req = AddBasicAuthHeader(req, user.Name) + resp := MakeRequest(t, req, http.StatusOK) + + assert.Equal(t, "1", resp.Header().Get("Content-Version")) + assert.Equal(t, "text/x-swift", resp.Header().Get("Content-Type")) + assert.Equal(t, contentManifest2, resp.Body.String()) + + req = NewRequest(t, "GET", manifestURL+"?swift-version=5.6.0") + req = AddBasicAuthHeader(req, user.Name) + MakeRequest(t, req, http.StatusOK) + }) + + t.Run("Redirect", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequest(t, "GET", manifestURL+"?swift-version=1.0") + req = AddBasicAuthHeader(req, user.Name) + resp := MakeRequest(t, req, http.StatusSeeOther) + + assert.Equal(t, "1", resp.Header().Get("Content-Version")) + assert.Equal(t, setting.AppURL+url[1:]+fmt.Sprintf("/%s/%s/%s/Package.swift", packageScope, packageName, packageVersion), resp.Header().Get("Location")) + }) + }) + + t.Run("LookupPackageIdentifiers", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequest(t, "GET", url+"/identifiers") + req.Header.Add("Accept", swift_router.AcceptJSON) + resp := MakeRequest(t, req, http.StatusBadRequest) + + assert.Equal(t, "1", resp.Header().Get("Content-Version")) + assert.Equal(t, "application/problem+json", resp.Header().Get("Content-Type")) + + req = NewRequest(t, "GET", url+"/identifiers?url=https://unknown.host/") + MakeRequest(t, req, http.StatusNotFound) + + req = NewRequest(t, "GET", url+"/identifiers?url="+packageRepositoryURL) + req.Header.Add("Accept", swift_router.AcceptJSON) + resp = MakeRequest(t, req, http.StatusOK) + + var result *swift_router.LookupPackageIdentifiersResponse + DecodeJSON(t, resp, &result) + + assert.Len(t, result.Identifiers, 1) + assert.Equal(t, packageID, result.Identifiers[0]) + }) +} diff --git a/tests/test_utils.go b/tests/test_utils.go index e3e5becfbedf..102dd3d298fb 100644 --- a/tests/test_utils.go +++ b/tests/test_utils.go @@ -201,7 +201,7 @@ func PrepareTestEnv(t testing.TB, skip ...int) func() { lfsFixtures, err := storage.NewStorage("", storage.LocalStorageConfig{Path: path.Join(filepath.Dir(setting.AppPath), "tests/gitea-lfs-meta")}) assert.NoError(t, err) assert.NoError(t, storage.Clean(storage.LFS)) - assert.NoError(t, lfsFixtures.IterateObjects(func(path string, _ storage.Object) error { + assert.NoError(t, lfsFixtures.IterateObjects("", func(path string, _ storage.Object) error { _, err := storage.Copy(storage.LFS, path, lfsFixtures, path) return err })) @@ -258,7 +258,7 @@ func ResetFixtures(t *testing.T) { lfsFixtures, err := storage.NewStorage("", storage.LocalStorageConfig{Path: path.Join(filepath.Dir(setting.AppPath), "tests/gitea-lfs-meta")}) assert.NoError(t, err) assert.NoError(t, storage.Clean(storage.LFS)) - assert.NoError(t, lfsFixtures.IterateObjects(func(path string, _ storage.Object) error { + assert.NoError(t, lfsFixtures.IterateObjects("", func(path string, _ storage.Object) error { _, err := storage.Copy(storage.LFS, path, lfsFixtures, path) return err })) diff --git a/web_src/css/admin.css b/web_src/css/admin.css new file mode 100644 index 000000000000..00ed675e2d57 --- /dev/null +++ b/web_src/css/admin.css @@ -0,0 +1,110 @@ +.admin.hooks .list > .item:not(:first-child) { + border-top: 1px solid var(--color-secondary); + padding: 0.25rem 1rem; + margin: 12px -1rem -1rem; +} + +.admin .table.segment { + padding: 0; + font-size: 13px; + overflow-x: auto; +} + +.admin .table.segment:not(.striped) thead th:last-child { + padding-right: 5px !important; +} + +.admin .table.segment th { + padding-top: 5px; + padding-bottom: 5px; +} + +.admin .table.segment:not(.select) th:first-of-type, +.admin .table.segment:not(.select) td:first-of-type { + padding-left: 15px !important; +} + +.admin .table.segment form tbody button[type="submit"] { + padding: 5px 8px; +} + +.admin .settings .button.adopt, +.admin .settings .button.delete { + margin-top: -15px; + margin-bottom: -15px; +} + +.admin .settings .button.adopt .label, +.admin .settings .button.delete .label { + vertical-align: middle; +} + +.admin.user .email { + max-width: 200px; +} + +.admin dl.admin-dl-horizontal { + padding: 20px; + margin: 0; +} + +.admin dl.admin-dl-horizontal dd { + margin-left: 275px; +} + +@media (max-width: 767px) { + .admin dl.admin-dl-horizontal dd { + margin-left: 5%; + } +} + +.admin dl.admin-dl-horizontal dt { + font-weight: 600; + float: left; + width: 285px; + clear: left; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +@media (max-width: 767px) { + .admin dl.admin-dl-horizontal dt { + width: auto; + margin-right: 0.5em; + } +} + +.admin.config #test-mail-btn { + margin-left: 5px; +} + +.admin code, +.admin pre { + white-space: pre-wrap; + word-wrap: break-word; +} + +@media (max-width: 767px) { + .admin #notice-table .notice-description { + max-width: 80vw; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .admin #notice-table .notice-description { + max-width: 360px; + } +} + +@media (min-width: 992px) and (max-width: 1200px) { + .admin #notice-table .notice-description { + max-width: 510px; + } +} + +@media (min-width: 1201px) { + .admin #notice-table .notice-description { + max-width: 640px; + } +} diff --git a/web_src/less/animations.less b/web_src/css/animations.css similarity index 100% rename from web_src/less/animations.less rename to web_src/css/animations.css diff --git a/web_src/less/_base.less b/web_src/css/base.css similarity index 77% rename from web_src/less/_base.less rename to web_src/css/base.css index 1cf65e784cd4..225359b765ce 100644 --- a/web_src/less/_base.less +++ b/web_src/css/base.css @@ -7,8 +7,8 @@ --checkbox-mask-checked: url('data:image/svg+xml;utf8,'); --checkbox-mask-indeterminate: url('data:image/svg+xml;utf8,'); /* non-color variables */ - --border-radius: .28571429rem; - --opacity-disabled: .55; + --border-radius: 0.28571429rem; + --opacity-disabled: 0.55; --height-loading: 12rem; /* base colors */ --color-primary: #4183c4; @@ -183,7 +183,6 @@ --color-accent: var(--color-primary-light-1); --color-small-accent: var(--color-primary-light-6); --color-active-line: #fffbdd; - accent-color: var(--color-accent); color-scheme: light; } @@ -200,7 +199,7 @@ pre, code, kbd, samp { - font-size: .9em; /* compensate for monospace fonts being usually slightly larger */ + font-size: 0.9em; /* compensate for monospace fonts being usually slightly larger */ font-family: var(--fonts-monospace); } @@ -226,7 +225,7 @@ body { @supports (overflow: overlay) { body { - overflow: overlay; // stylelint-disable-line + overflow: overlay; /* stylelint-disable-line */ scrollbar-gutter: stable; } } @@ -253,12 +252,15 @@ progress { border: none; overflow: hidden; } + progress::-webkit-progress-bar { background: var(--color-secondary-dark-1); } + progress::-webkit-progress-value { background-color: var(--color-accent); } + progress::-moz-progress-bar { background-color: var(--color-accent); } @@ -272,17 +274,21 @@ progress::-moz-progress-bar { width: 10px; height: 10px; } + ::-webkit-scrollbar-thumb { box-shadow: inset 0 0 0 6px var(--color-primary); border: 2px solid transparent; border-radius: 5px !important; } + ::-webkit-scrollbar-thumb:window-inactive { box-shadow: inset 0 0 0 6px var(--color-primary); } + ::-webkit-scrollbar-thumb:hover { box-shadow: inset 0 0 0 6px var(--color-primary-dark-2); } + ::-webkit-scrollbar-corner { background: transparent; } @@ -293,6 +299,7 @@ progress::-moz-progress-bar { background: var(--color-light); border-radius: var(--border-radius); } + ::file-selector-button:hover { color: var(--color-text); background: var(--color-hover); @@ -310,6 +317,17 @@ progress::-moz-progress-bar { opacity: 1 !important; } +.unselectable, +.button, +.lines-num, +.lines-commit, +.lines-commit .blame-info, +.ellipsis-button { + -webkit-touch-callout: none; + -webkit-user-select: none; + user-select: none; +} + a, .ui.breadcrumb a { color: var(--color-primary); @@ -350,15 +368,18 @@ a.label, .ui.red.buttons .button { background: var(--color-red); } + .ui.red.button:hover, .ui.red.buttons .button:hover { background: var(--color-red-light); } + .ui.basic.red.buttons .button, .ui.basic.red.button { color: var(--color-red); border-color: var(--color-red); } + .ui.basic.red.buttons .button:hover, .ui.basic.red.button:hover { color: var(--color-red-light); @@ -371,15 +392,18 @@ a.label, .ui.orange.buttons .button { background: var(--color-orange); } + .ui.orange.button:hover, .ui.orange.buttons .button:hover { background: var(--color-orange-light); } + .ui.basic.orange.buttons .button, .ui.basic.orange.button { color: var(--color-orange); border-color: var(--color-orange); } + .ui.basic.orange.buttons .button:hover, .ui.basic.orange.button:hover { color: var(--color-orange-light); @@ -392,15 +416,18 @@ a.label, .ui.yellow.buttons .button { background: var(--color-yellow); } + .ui.yellow.button:hover, .ui.yellow.buttons .button:hover { background: var(--color-yellow-light); } + .ui.basic.yellow.buttons .button, .ui.basic.yellow.button { color: var(--color-yellow); border-color: var(--color-yellow); } + .ui.basic.yellow.buttons .button:hover, .ui.basic.yellow.button:hover { color: var(--color-yellow-light); @@ -413,15 +440,18 @@ a.label, .ui.olive.buttons .button { background: var(--color-olive); } + .ui.olive.button:hover, .ui.olive.buttons .button:hover { background: var(--color-olive-light); } + .ui.basic.olive.buttons .button, .ui.basic.olive.button { color: var(--color-olive); border-color: var(--color-olive); } + .ui.basic.olive.buttons .button:hover, .ui.basic.olive.button:hover { color: var(--color-olive-light); @@ -434,15 +464,18 @@ a.label, .ui.green.buttons .button { background: var(--color-green); } + .ui.green.button:hover, .ui.green.buttons .button:hover { background: var(--color-green-light); } + .ui.basic.green.buttons .button, .ui.basic.green.button { color: var(--color-green); border-color: var(--color-green); } + .ui.basic.green.buttons .button:hover, .ui.basic.green.button:hover { color: var(--color-green-light); @@ -455,15 +488,18 @@ a.label, .ui.teal.buttons .button { background: var(--color-teal); } + .ui.teal.button:hover, .ui.teal.buttons .button:hover { background: var(--color-teal-light); } + .ui.basic.teal.buttons .button, .ui.basic.teal.button { color: var(--color-teal); border-color: var(--color-teal); } + .ui.basic.teal.buttons .button:hover, .ui.basic.teal.button:hover { color: var(--color-teal-light); @@ -476,15 +512,18 @@ a.label, .ui.blue.buttons .button { background: var(--color-blue); } + .ui.blue.button:hover, .ui.blue.buttons .button:hover { background: var(--color-blue-light); } + .ui.basic.blue.buttons .button, .ui.basic.blue.button { color: var(--color-blue); border-color: var(--color-blue); } + .ui.basic.blue.buttons .button:hover, .ui.basic.blue.button:hover { color: var(--color-blue-light); @@ -497,15 +536,18 @@ a.label, .ui.violet.buttons .button { background: var(--color-violet); } + .ui.violet.button:hover, .ui.violet.buttons .button:hover { background: var(--color-violet-light); } + .ui.basic.violet.buttons .button, .ui.basic.violet.button { color: var(--color-violet); border-color: var(--color-violet); } + .ui.basic.violet.buttons .button:hover, .ui.basic.violet.button:hover { color: var(--color-violet-light); @@ -518,15 +560,18 @@ a.label, .ui.purple.buttons .button { background: var(--color-purple); } + .ui.purple.button:hover, .ui.purple.buttons .button:hover { background: var(--color-purple-light); } + .ui.basic.purple.buttons .button, .ui.basic.purple.button { color: var(--color-purple); border-color: var(--color-purple); } + .ui.basic.purple.buttons .button:hover, .ui.basic.purple.button:hover { color: var(--color-purple-light); @@ -539,15 +584,18 @@ a.label, .ui.pink.buttons .button { background: var(--color-pink); } + .ui.pink.button:hover, .ui.pink.buttons .button:hover { background: var(--color-pink-light); } + .ui.basic.pink.buttons .button, .ui.basic.pink.button { color: var(--color-pink); border-color: var(--color-pink); } + .ui.basic.pink.buttons .button:hover, .ui.basic.pink.button:hover { color: var(--color-pink-light); @@ -560,15 +608,18 @@ a.label, .ui.brown.buttons .button { background: var(--color-brown); } + .ui.brown.button:hover, .ui.brown.buttons .button:hover { background: var(--color-brown-light); } + .ui.basic.brown.buttons .button, .ui.basic.brown.button { color: var(--color-brown); border-color: var(--color-brown); } + .ui.basic.brown.buttons .button:hover, .ui.basic.brown.button:hover { color: var(--color-brown-light); @@ -581,15 +632,18 @@ a.label, .ui.grey.buttons .button { background: var(--color-grey); } + .ui.grey.button:hover, .ui.grey.buttons .button:hover { background: var(--color-grey-light); } + .ui.basic.grey.buttons .button, .ui.basic.grey.button { color: var(--color-grey); border-color: var(--color-grey); } + .ui.basic.grey.buttons .button:hover, .ui.basic.grey.button:hover { color: var(--color-grey-light); @@ -602,15 +656,18 @@ a.label, .ui.black.buttons .button { background: var(--color-black); } + .ui.black.button:hover, .ui.black.buttons .button:hover { background: var(--color-black-light); } + .ui.basic.black.buttons .button, .ui.basic.black.button { color: var(--color-black); border-color: var(--color-black); } + .ui.basic.black.buttons .button:hover, .ui.basic.black.button:hover { color: var(--color-black-light); @@ -664,21 +721,12 @@ a.label, background: var(--color-hover); } -.unselectable { - -webkit-touch-callout: none; - -webkit-user-select: none; - user-select: none; -} - -.button { - &:extend(.unselectable); -} - .issue-title code { padding: 2px 4px; border-radius: 6px; background-color: var(--color-markup-code-block); } + /* try to match button with no icons in height */ .icon-button { padding-top: 7.42px !important; @@ -720,10 +768,10 @@ a.label, /* currently used for search bar dropdowns in repo search and explore code */ .ui.action.input:not([class*="left action"]) > .ui.dropdown.selection { min-width: 10em; +} - &:not(:focus,:hover) { - border-right-color: transparent; - } +.ui.action.input:not([class*="left action"]) > .ui.dropdown.selection:not(:focus,:hover) { + border-right-color: transparent; } .ui.action.input:not([class*="left action"]) > input:focus { @@ -738,10 +786,11 @@ a.label, .ui.menu .item { color: var(--color-text); + user-select: auto; +} - > .svg { - margin-right: .35em; - } +.ui.menu .item > .svg { + margin-right: 0.35em; } .ui.menu .item > .label { @@ -812,11 +861,12 @@ a.label, /* fix misaligned images in webhook dropdown */ .ui.dropdown .menu > .item > img { - margin-top: -.25rem; - margin-bottom: -.25rem; + margin-top: -0.25rem; + margin-bottom: -0.25rem; } + .ui.dropdown .menu > .item > svg.img { - margin-right: .78571429rem; + margin-right: 0.78571429rem; } .ui.selection.dropdown .menu > .item { @@ -871,8 +921,8 @@ a.label, } .ui.secondary.menu.tight .item { - padding-left: .85714286em; - padding-right: .85714286em; + padding-left: 0.85714286em; + padding-right: 0.85714286em; } .ui.menu .dropdown.item .menu { @@ -1179,7 +1229,7 @@ a.ui.card:hover, } /* enable fluid page widths for medium size viewports */ -@media @mediaMdAndUp and @mediaLgAndDown { +@media (min-width: 768px) and (max-width: 1200px) { .ui.ui.ui.container:not(.fluid) { width: calc(100vw - 3em); } @@ -1189,83 +1239,79 @@ a.ui.card:hover, z-index: 900; left: 0; margin: 0 !important; +} - &.light { - background: var(--color-header-bar); - border-bottom: 1px solid var(--color-secondary); - } +.following.bar.light { + background: var(--color-header-bar); + border-bottom: 1px solid var(--color-secondary); +} - .column .menu { - margin-top: 0; - } +.following.bar .column .menu { + margin-top: 0; +} - .top.menu a.item.brand { - padding-left: 0; - } +.following.bar .top.menu a.item.brand { + padding-left: 0; +} - .top.menu a.item:hover, - .top.menu .dropdown.item:hover, - .top.menu .dropdown.item.active { - background-color: transparent; - } +.following.bar .top.menu a.item:hover, +.following.bar .top.menu .dropdown.item:hover, +.following.bar .top.menu .dropdown.item.active { + background-color: transparent; +} - .top.menu a.item:hover { - color: rgba(0, 0, 0, .45); - } +.following.bar .top.menu a.item:hover { + color: rgba(0, 0, 0, 0.45); +} - .top.menu .menu { - z-index: 900; - } +.following.bar .top.menu .menu { + z-index: 900; +} - .fitted .svg { - margin-right: 0; - vertical-align: middle; - } +.following.bar .fitted .svg { + margin-right: 0; + vertical-align: middle; +} - .searchbox { - background-color: var(--color-input-background) !important; - } +.following.bar .searchbox { + background-color: var(--color-input-background) !important; +} - .text .svg { - width: 16px; - text-align: center; - } +.following.bar .text .svg { + width: 16px; + text-align: center; +} - #navbar { - width: 100vw; - min-height: 52px; - padding: 0 .5rem; - } +.following.bar #navbar { + width: 100vw; + min-height: 52px; + padding: 0 0.5rem; +} - #navbar .brand { - margin: 0; - } +.following.bar #navbar .brand { + margin: 0; +} - #navbar .dropdown .avatar { - margin-right: 0 !important; - } +.following.bar #navbar .dropdown .avatar { + margin-right: 0 !important; +} - @media @mediaSm { - #navbar:not(.shown) > *:not(:first-child) { - display: none; - } +@media (max-width: 767px) { + .following.bar #navbar:not(.shown) > *:not(:first-child) { + display: none; } } .right.stackable.menu { - // responsive fix: this makes sure that the right menu when the page - // is on mobile view will have elements stacked on top of each other. - // no, stackable won't work on right menus. + /* responsive fix: this makes sure that the right menu when the page */ + /* is on mobile view will have elements stacked on top of each other. */ + /* no, stackable won't work on right menus. */ margin-left: auto; display: flex; align-items: inherit; flex-direction: inherit; } -.ui.dropdown .menu { - border-color: var(--color-secondary); -} - .ui.pagination.menu .active.item { color: var(--color-text); background: var(--color-active); @@ -1282,7 +1328,7 @@ a.ui.card:hover, .ui.loading.form > *, .ui.loading.segment > * { - opacity: .35; + opacity: 0.35; } .ui.form .fields.error .field textarea, @@ -1358,8 +1404,8 @@ a.ui.card:hover, border-color: var(--color-error-border) !important; } -// A fix for text visibility issue in Chrome autofill in dark mode. -// It's a problem from Formatic UI, and this rule overrides it. +/* A fix for text visibility issue in Chrome autofill in dark mode. */ +/* It's a problem from Formatic UI, and this rule overrides it. */ .ui.form .field.field input:-webkit-autofill { -webkit-text-fill-color: var(--color-black) !important; } @@ -1372,372 +1418,384 @@ a.ui.card:hover, visibility: hidden; } -.text.primary { color: var(--color-primary) !important; } -.text.red { color: var(--color-red) !important; } -.text.orange { color: var(--color-orange) !important; } -.text.yellow { color: var(--color-yellow) !important; } -.text.olive { color: var(--color-olive) !important; } -.text.green { color: var(--color-green) !important; } -.text.teal { color: var(--color-teal) !important; } -.text.blue { color: var(--color-blue) !important; } -.text.violet { color: var(--color-violet) !important; } -.text.purple { color: var(--color-purple) !important; } -.text.pink { color: var(--color-pink) !important; } -.text.brown { color: var(--color-brown) !important; } -.text.black { color: var(--color-text) !important; } -.text.grey { color: var(--color-text-light) !important; } -.text.light.grey { color: var(--color-grey-light) !important; } -.text.gold { color: var(--color-gold) !important; } - -.ui { - &.left:not(.action) { - float: left; - } +.text.primary { + color: var(--color-primary) !important; +} - &.right:not(.action) { - float: right; - } +.text.red { + color: var(--color-red) !important; +} - &.menu .item { - user-select: auto; - } +.text.orange { + color: var(--color-orange) !important; +} - &.container { - &.fluid { - &.padded { - padding: 0 10px; - } - } - } +.text.yellow { + color: var(--color-yellow) !important; +} - &.form { - .ui.button { - font-weight: normal; - } - } +.text.olive { + color: var(--color-olive) !important; +} - &.floating.label { - z-index: 10; - } +.text.green { + color: var(--color-green) !important; +} - &.transparent.label { - background-color: transparent; - } +.text.teal { + color: var(--color-teal) !important; +} - &.menu, - &.vertical.menu, - &.segment { - box-shadow: none; - } +.text.blue { + color: var(--color-blue) !important; +} - /* Override semantic selector '.ui.menu:not(.vertical) .item > .button' */ - /* This fixes the commit graph button on the commits page */ +.text.violet { + color: var(--color-violet) !important; +} - .menu:not(.vertical) .item > .button.compact { - padding: .58928571em 1.125em; - } +.text.purple { + color: var(--color-purple) !important; +} - .menu:not(.vertical) .item > .button.small { - font-size: .92857143rem; - } +.text.pink { + color: var(--color-pink) !important; +} - &.menu .ui.dropdown.item .menu .item { - width: 100%; - } +.text.brown { + color: var(--color-brown) !important; +} - &.dropdown .menu > .item > .floating.label { - z-index: 11; - } +.text.black { + color: var(--color-text) !important; +} - &.dropdown .menu .menu > .item > .floating.label { - z-index: 21; - } +.text.grey { + color: var(--color-text-light) !important; +} - &.dropdown .menu > .header { - font-size: .8em; - } +.text.light.grey { + color: var(--color-grey-light) !important; +} - .text { - &.left { - text-align: left !important; - } - - &.right { - text-align: right !important; - } - - &.small { - font-size: .75em; - } - - &.normal { - font-weight: normal; - } - - &.italic { - font-style: italic; - } - - &.truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - display: inline-block; - } - - &.thin { - font-weight: normal; - } - - &.middle { - vertical-align: middle; - } - } +.text.gold { + color: var(--color-gold) !important; +} - .message { - text-align: center; - } +.ui.left:not(.action) { + float: left; +} - .message > ul { - margin-left: auto; - margin-right: auto; - display: table; - text-align: left; - } +.ui.right:not(.action) { + float: right; +} - .header > i + .content { - padding-left: .75rem; - vertical-align: middle; - } +.ui.container.fluid.padded { + padding: 0 10px; +} - .info { - &.segment { - &.top { - h3, - h4 { - margin-top: 0; - } - - h3:last-child { - margin-top: 4px; - } - - > :last-child { - margin-bottom: 0; - } - } - } - } +.ui.form .ui.button { + font-weight: normal; +} - .normal.header { - font-weight: normal; - } +.ui.floating.label { + z-index: 10; +} - .form { - .autofill-dummy { - position: absolute; - width: 1px; - height: 1px; - overflow: hidden; - z-index: -10000; - } - .sub.field { - margin-left: 25px; - } - } +.ui.transparent.label { + background-color: transparent; +} - .sha.label { - font-family: var(--fonts-monospace); - font-size: 13px; - padding: 6px 10px 4px; - font-weight: normal; - margin: 0 6px; - } +.ui.menu, +.ui.vertical.menu, +.ui.segment { + box-shadow: none; +} - .button.copy-commit-sha { - border: 1px solid var(--color-light-border); - margin-right: 3px; - padding: 6px 6px 4px; - background: var(--color-light); - } +/* Override semantic selector '.ui.menu:not(.vertical) .item > .button' */ +/* This fixes the commit graph button on the commits page */ +/* modal svg icons, copied from fomantic except width and height */ +/* center text in fomantic modal dialogs */ +.ui .menu:not(.vertical) .item > .button.compact { + padding: 0.58928571em 1.125em; +} - .button.truncate { - display: inline-block; - max-width: 100%; - overflow: hidden; - text-overflow: ellipsis; - vertical-align: top; - white-space: nowrap; - margin-right: 6px; - } +.ui .menu:not(.vertical) .item > .button.small { + font-size: 0.92857143rem; +} - &.status.buttons { - .svg { - margin-right: 4px; - } - } +.ui.menu .ui.dropdown.item .menu .item { + width: 100%; +} - &.inline.delete-button { - padding: 8px 15px; - font-weight: normal; - } +.ui.dropdown .menu > .item > .floating.label { + z-index: 11; +} - .background { - &.red { - background-color: var(--color-red) !important; - } +.ui.dropdown .menu .menu > .item > .floating.label { + z-index: 21; +} - &.blue { - background-color: var(--color-blue) !important; - } +.ui.dropdown .menu > .header { + font-size: 0.8em; +} - &.black { - background-color: var(--color-black) !important; - } +.ui .text.left { + text-align: left !important; +} - &.grey { - background-color: var(--color-grey) !important; - } +.ui .text.right { + text-align: right !important; +} - &.light.grey { - background-color: var(--color-grey) !important; - } +.ui .text.small { + font-size: 0.75em; +} - &.green { - background-color: var(--color-green) !important; - } +.ui .text.normal { + font-weight: normal; +} - &.purple { - background-color: var(--color-purple) !important; - } +.ui .text.italic { + font-style: italic; +} - &.yellow { - background-color: var(--color-yellow) !important; - } +.ui .text.truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: inline-block; +} - &.orange { - background-color: var(--color-orange) !important; - } +.ui .text.thin { + font-weight: normal; +} - &.gold { - background-color: var(--color-gold) !important; - } - } +.ui .text.middle { + vertical-align: middle; +} - .migrate { - color: var(--color-text-light-2) !important; +.ui .message { + text-align: center; +} - a { - color: var(--color-text-light) !important; +.ui .message > ul { + margin-left: auto; + margin-right: auto; + display: table; + text-align: left; +} - &:hover { - color: var(--color-text) !important; - } - } - } +.ui .header > i + .content { + padding-left: 0.75rem; + vertical-align: middle; +} - .border { - border: 1px solid; - &.red { - border-color: var(--color-red) !important; - } +.ui .info.segment.top h3, +.ui .info.segment.top h4 { + margin-top: 0; +} - &.blue { - border-color: var(--color-blue) !important; - } +.ui .info.segment.top h3:last-child { + margin-top: 4px; +} - &.black { - border-color: var(--color-black) !important; - } +.ui .info.segment.top > :last-child { + margin-bottom: 0; +} - &.grey { - border-color: var(--color-grey) !important; - } +.ui .normal.header { + font-weight: normal; +} - &.light.grey { - border-color: var(--color-grey) !important; - } +.ui .form .autofill-dummy { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + z-index: -10000; +} - &.green { - border-color: var(--color-green) !important; - } +.ui .form .sub.field { + margin-left: 25px; +} - &.purple { - border-color: var(--color-purple) !important; - } +.ui .sha.label { + font-family: var(--fonts-monospace); + font-size: 13px; + padding: 6px 10px 4px; + font-weight: normal; + margin: 0 6px; +} - &.yellow { - border-color: var(--color-yellow) !important; - } +.ui .button.copy-commit-sha { + border: 1px solid var(--color-light-border); + margin-right: 3px; + padding: 6px 6px 4px; + background: var(--color-light); +} - &.orange { - border-color: var(--color-orange) !important; - } +.ui .button.truncate { + display: inline-block; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + vertical-align: top; + white-space: nowrap; + margin-right: 6px; +} - &.gold { - border-color: var(--color-gold) !important; - } - } +.ui.status.buttons .svg { + margin-right: 4px; +} - .branch-tag-choice { - line-height: 20px; - } +.ui.inline.delete-button { + padding: 8px 15px; + font-weight: normal; +} - &.pagination.menu { - @media @mediaSm { - .item:not(.active,.navigation), - .item.navigation span.navigation_label { - display: none; - } - } - &.narrow .item { - padding-left: 8px; - padding-right: 8px; - min-width: 1em; - text-align: center; - .icon { - margin-right: 0; - } - } - } +.ui .background.red { + background-color: var(--color-red) !important; +} - /* modal svg icons, copied from fomantic except width and height */ - &.icon.header svg { - width: 3em; - height: 3em; - float: none; - display: block; - line-height: 1; - padding: 0; - margin: 0 auto .5rem; - opacity: 1; - } +.ui .background.blue { + background-color: var(--color-blue) !important; +} - /* center text in fomantic modal dialogs */ - &.modal > .content { - text-align: center; - } +.ui .background.black { + background-color: var(--color-black) !important; +} + +.ui .background.grey { + background-color: var(--color-grey) !important; +} + +.ui .background.light.grey { + background-color: var(--color-grey) !important; +} + +.ui .background.green { + background-color: var(--color-green) !important; +} + +.ui .background.purple { + background-color: var(--color-purple) !important; +} + +.ui .background.yellow { + background-color: var(--color-yellow) !important; } -.ui.floating.dropdown { - .overflow.menu { - .scrolling.menu.items { - border-radius: 0 !important; - box-shadow: none !important; - border-bottom: 1px solid var(--color-secondary); - } +.ui .background.orange { + background-color: var(--color-orange) !important; +} + +.ui .background.gold { + background-color: var(--color-gold) !important; +} + +.ui .migrate { + color: var(--color-text-light-2) !important; +} + +.ui .migrate a { + color: var(--color-text-light) !important; +} + +.ui .migrate a:hover { + color: var(--color-text) !important; +} + +.ui .border { + border: 1px solid; +} + +.ui .border.red { + border-color: var(--color-red) !important; +} + +.ui .border.blue { + border-color: var(--color-blue) !important; +} + +.ui .border.black { + border-color: var(--color-black) !important; +} + +.ui .border.grey { + border-color: var(--color-grey) !important; +} + +.ui .border.light.grey { + border-color: var(--color-grey) !important; +} + +.ui .border.green { + border-color: var(--color-green) !important; +} + +.ui .border.purple { + border-color: var(--color-purple) !important; +} + +.ui .border.yellow { + border-color: var(--color-yellow) !important; +} + +.ui .border.orange { + border-color: var(--color-orange) !important; +} + +.ui .border.gold { + border-color: var(--color-gold) !important; +} + +.ui .branch-tag-choice { + line-height: 20px; +} + +@media (max-width: 767px) { + .ui.pagination.menu .item:not(.active,.navigation), + .ui.pagination.menu .item.navigation span.navigation_label { + display: none; } } +.ui.pagination.menu.narrow .item { + padding-left: 8px; + padding-right: 8px; + min-width: 1em; + text-align: center; +} + +.ui.pagination.menu.narrow .item .icon { + margin-right: 0; +} + +.ui.icon.header svg { + width: 3em; + height: 3em; + float: none; + display: block; + line-height: 1; + padding: 0; + margin: 0 auto 0.5rem; + opacity: 1; +} + +.ui.floating.dropdown .overflow.menu .scrolling.menu.items { + border-radius: 0 !important; + box-shadow: none !important; + border-bottom: 1px solid var(--color-secondary); +} + .user-menu > .item { width: 100%; border-radius: 0 !important; } -.scrolling.menu { - .item.selected { - font-weight: 600 !important; - } +.scrolling.menu .item.selected { + font-weight: 600 !important; } .ui.dropdown .scrolling.menu { @@ -1746,10 +1804,10 @@ a.ui.card:hover, .color-preview { display: inline-block; - margin-left: .4em; - height: .67em; - width: .67em; - border-radius: .15em; + margin-left: 0.4em; + height: 0.67em; + width: 0.67em; + border-radius: 0.15em; } .attention-icon { @@ -1772,70 +1830,73 @@ footer { width: 100%; flex-basis: 40px; color: var(--color-text-light); +} - .container { - width: 100vw !important; - padding: 0 .5rem; - max-width: calc(100vw - 1rem) !important; +footer .container { + width: 100vw !important; + padding: 0 0.5rem; + max-width: calc(100vw - 1rem) !important; +} - .links > * { - border-left: 1px solid var(--color-secondary-dark-1); - padding-left: 8px; - margin-left: 5px; +footer .container .links > * { + border-left: 1px solid var(--color-secondary-dark-1); + padding-left: 8px; + margin-left: 5px; +} - &:first-child { - border-left: 0; - } - } - } +footer .container .links > *:first-child { + border-left: 0; +} - .ui.language { - .menu { - max-height: 500px; - overflow-y: auto; - margin-bottom: 7px; - } - - .svg { - margin-right: .15em; - vertical-align: top; - margin-top: calc(2em - 16px); - } - } +footer .ui.language .menu { + max-height: 500px; + overflow-y: auto; + margin-bottom: 7px; +} - .ui { - &.left, - &.right { - line-height: 39px; // there is a border-top on the footer, so make the line-height 1px less - } - } +footer .ui.language .svg { + margin-right: 0.15em; + vertical-align: top; + margin-top: calc(2em - 16px); +} + +footer .ui.left, +footer .ui.right { + line-height: 39px; /* there is a border-top on the footer, so make the line-height 1px less */ } .center:not(.popup) { text-align: center; } -// Conditional display -@media @mediaMdAndUp { +/* Conditional display */ +@media (min-width: 768px) { .mobile-only, .ui.button.mobile-only { display: none !important; } - // has the same behaviour of sr-only, hiding the content for - // non-screenreaders, but is shown on mobile devices. + /* has the same behaviour of sr-only, hiding the content for */ + /* non-screenreaders, but is shown on mobile devices. */ .sr-mobile-only { - .sr-only(); + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; } } -@media @mediaSm { +@media (max-width: 767px) { .not-mobile { display: none !important; } } -// Accessibility +/* Accessibility for screen readers */ .sr-only { position: absolute; width: 1px; @@ -1857,7 +1918,7 @@ footer { clip: auto; } -@media @mediaMd { +@media (min-width: 768px) and (max-width: 991px) { .ui.container { width: 95%; } @@ -1897,7 +1958,7 @@ footer { margin: 0 !important; } -@media @mediaSm { +@media (max-width: 767px) { .ui.menu.new-menu .item { width: auto !important; } @@ -1924,10 +1985,6 @@ footer { display: block; } -[v-cloak] { - display: none !important; -} - .repos-search { padding-bottom: 0 !important; } @@ -1937,7 +1994,6 @@ footer { border-bottom-width: 0 !important; margin-bottom: 2px !important; justify-content: space-evenly; - } .ui.secondary.pointing.menu.repos-filter .item { @@ -1952,19 +2008,19 @@ footer { flex: 1; word-break: break-all; color: var(--color-text-light); +} - .avatar { - width: 32px !important; - height: 32px !important; - } +.repo-title .avatar { + width: 32px !important; + height: 32px !important; +} - .labels { - margin-left: .5rem; +.repo-title .labels { + margin-left: 0.5rem; +} - > * + * { - margin-left: .5rem; - } - } +.repo-title .labels > * + * { + margin-left: 0.5rem; } .repo-icon { @@ -1992,16 +2048,16 @@ footer { .inline-grouped-list { display: inline-block; vertical-align: top; +} - > .ui { - display: block; - margin-top: 5px; - margin-bottom: 10px; +.inline-grouped-list > .ui { + display: block; + margin-top: 5px; + margin-bottom: 10px; +} - &:first-child { - margin-top: 1px; - } - } +.inline-grouped-list > .ui:first-child { + margin-top: 1px; } i.icons .icon:first-child { @@ -2013,7 +2069,7 @@ i.icon.centerlock { } .ui.label { - padding: .3em .5em; + padding: 0.3em 0.5em; background: var(--color-light); color: var(--color-text-light); } @@ -2026,7 +2082,7 @@ a.ui.label:hover { } .ui.label > .detail .icons { - margin-right: .25em; + margin-right: 0.25em; } .ui.label > .detail .icons .icon { @@ -2042,29 +2098,24 @@ a.ui.label:hover { } .lines-num { - &:extend(.unselectable); padding-left: 10px; padding-right: 10px; text-align: right !important; color: var(--color-text-light-1); width: 1%; font-family: var(--fonts-monospace); +} - span { - &.bottom-line { - &::after { - border-bottom: 1px solid var(--color-secondary); - } - } - - &::after { - content: attr(data-line-number); - line-height: 20px !important; - padding: 0 10px; - cursor: pointer; - display: block; - } - } +.lines-num span.bottom-line::after { + border-bottom: 1px solid var(--color-secondary); +} + +.lines-num span::after { + content: attr(data-line-number); + line-height: 20px !important; + padding: 0 10px; + cursor: pointer; + display: block; } .lines-type-marker { @@ -2079,19 +2130,24 @@ a.ui.label:hover { padding-top: 0; padding-bottom: 0; vertical-align: top; +} - pre, - ol { - background-color: inherit; - margin: 0; - padding: 0 !important; - - li { - display: block; - width: calc(100% - 1ch); - padding-left: 1ch; - } - } +.lines-num pre, +.lines-code pre, +.lines-num ol, +.lines-code ol { + background-color: inherit; + margin: 0; + padding: 0 !important; +} + +.lines-num pre li, +.lines-code pre li, +.lines-num ol li, +.lines-code ol li { + display: block; + width: calc(100% - 1ch); + padding-left: 1ch; } .lines-escape { @@ -2131,64 +2187,61 @@ a.ui.label:hover { } .lines-commit { - &:extend(.unselectable); vertical-align: top; color: var(--color-grey); padding: 0 !important; background: var(--color-code-sidebar-bg); width: 1%; +} - .blame-info { - &:extend(.unselectable); - width: 350px; - max-width: 350px; - display: block; - padding: 0 0 0 10px; - line-height: 20px; - box-sizing: content-box; - - .blame-data { - display: flex; - font-family: var(--fonts-regular); - - .blame-message { - flex-grow: 2; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - } - - .blame-time, - .blame-avatar { - flex-shrink: 0; - } - } - } +.lines-commit .blame-info { + width: 350px; + max-width: 350px; + display: block; + padding: 0 0 0 10px; + line-height: 20px; + box-sizing: content-box; +} - .ui.avatar { - height: 18px; - width: 18px; - display: block; - margin-top: 1px; - } +.lines-commit .blame-info .blame-data { + display: flex; + font-family: var(--fonts-regular); +} + +.lines-commit .blame-info .blame-data .blame-message { + flex-grow: 2; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.lines-commit .blame-info .blame-data .blame-time, +.lines-commit .blame-info .blame-data .blame-avatar { + flex-shrink: 0; +} + +.lines-commit .ui.avatar { + height: 18px; + width: 18px; + display: block; + margin-top: 1px; } .top-line-blame { border-top: 1px solid var(--color-secondary); } -.lines-code, -.lines-commit { - .bottom-line { - border-bottom: 1px solid var(--color-secondary); - } +.lines-code .bottom-line, +.lines-commit .bottom-line { + border-bottom: 1px solid var(--color-secondary); } + .code-view table { width: 100%; } .octicon-tiny { - font-size: .85714286rem; + font-size: 0.85714286rem; } .ui.button { @@ -2362,16 +2415,16 @@ a.ui.basic.label:hover { height: 2.1666em !important; } -.svg { - span.green & { - color: var(--color-green); - } - span.red & { - color: var(--color-red); - } - span.purple & { - color: var(--color-purple); - } +span.green .svg { + color: var(--color-green); +} + +span.red .svg { + color: var(--color-red); +} + +span.purple .svg { + color: var(--color-purple); } .migrate .svg.gitea-git { @@ -2414,17 +2467,17 @@ a.ui.basic.label:hover { position: relative; background: var(--color-box-header); border-color: var(--color-secondary); +} - .right .button { - padding: 8px 10px; - font-weight: normal; - } +.ui.attached.header .right .button { + padding: 8px 10px; + font-weight: normal; } /* fix misaligned right buttons on box headers */ .ui.attached.header .right:not(.dropdown) { position: absolute; - right: .78571429rem; + right: 0.78571429rem; top: 0; bottom: 0; height: 30px; @@ -2461,25 +2514,25 @@ a.ui.basic.label:hover { border-radius: 1em; font-size: 10px; font-weight: 700; - line-height: .7; + line-height: 0.7; } -table th[data-sortt-asc], -table th[data-sortt-desc] { - &:hover { - background: rgba(0, 0, 0, .1) !important; - cursor: pointer !important; - } - .svg { - margin-left: .25rem; - } +table th[data-sortt-asc]:hover, +table th[data-sortt-desc]:hover { + background: rgba(0, 0, 0, 0.1) !important; + cursor: pointer !important; +} + +table th[data-sortt-asc] .svg, +table th[data-sortt-desc] .svg { + margin-left: 0.25rem; } .ui.dropdown .svg.dropdown.icon, .svg.dropdown.icon { - margin-top: 0 !important; // reset the "ui.selection.dropdown > .dropdown.icon {margin-top}", for the Issue Dependencies dropdown - margin-right: -.5rem !important; // fix up SVG dropdown triangles because Fomantic thinks they are icon fonts - height: auto; // reset the ".ui.dropdown > .dropdown.icon {height}", otherwise the icon would be too small + margin-top: 0 !important; /* reset the "ui.selection.dropdown > .dropdown.icon {margin-top}", for the Issue Dependencies dropdown */ + margin-right: -0.5rem !important; /* fix up SVG dropdown triangles because Fomantic thinks they are icon fonts */ + height: auto; /* reset the ".ui.dropdown > .dropdown.icon {height}", otherwise the icon would be too small */ } .ui.selection.dropdown > .search.icon, @@ -2487,6 +2540,7 @@ table th[data-sortt-desc] { .ui.selection.dropdown > .dropdown.icon { top: 0 !important; } + .ui.dropdown.no-text > .dropdown.icon { margin-left: 0 !important; margin-right: 0 !important; @@ -2515,17 +2569,19 @@ table th[data-sortt-desc] { line-height: 1; font-style: normal !important; font-weight: normal !important; - vertical-align: -.075em; - - @supports (-webkit-hyphens:none) { - body:not(.safari-above125) & { - font-size: inherit; - vertical-align: inherit; - img { - font-size: 1.25em; - vertical-align: -.225em !important; - } - } + vertical-align: -0.075em; +} + +@supports (-webkit-hyphens:none) { + body:not(.safari-above125) .emoji, + body:not(.safari-above125) .reaction { + font-size: inherit; + vertical-align: inherit; + } + body:not(.safari-above125) .emoji img, + body:not(.safari-above125) .reaction img { + font-size: 1.25em; + vertical-align: -0.225em !important; } } @@ -2535,7 +2591,7 @@ table th[data-sortt-desc] { margin: 0 !important; width: 1em !important; height: 1em !important; - vertical-align: -.15em; + vertical-align: -0.15em; } .minicolors-panel { @@ -2545,38 +2601,38 @@ table th[data-sortt-desc] { .labelspage { list-style: none; padding-top: 0; +} - .item { - margin-top: 0; - margin-right: -14px; - margin-left: -14px; - padding: 10px; - border-bottom: 1px solid var(--color-secondary); - border-top: none; - - a { - font-size: 12px; - padding-right: 10px; - color: var(--color-text-light); - - &:hover { - color: var(--color-primary-light-2); - } - - &.open-issues { - margin-right: 30px; - } - } - } +.labelspage .item { + margin-top: 0; + margin-right: -14px; + margin-left: -14px; + padding: 10px; + border-bottom: 1px solid var(--color-secondary); + border-top: none; +} - .item:last-child { - border-bottom: none; - padding-bottom: 0; - } +.labelspage .item a { + font-size: 12px; + padding-right: 10px; + color: var(--color-text-light); +} - .orglabel { - opacity: .7; - } +.labelspage .item a:hover { + color: var(--color-primary-light-2); +} + +.labelspage .item a.open-issues { + margin-right: 30px; +} + +.labelspage .item:last-child { + border-bottom: none; + padding-bottom: 0; +} + +.labelspage .orglabel { + opacity: 0.7; } /* https://github.com/go-gitea/gitea/pull/11486 */ @@ -2631,7 +2687,7 @@ table th[data-sortt-desc] { } .ui.header .ui.label { - margin-left: .25rem; + margin-left: 0.25rem; } .ui.header > .ui.label.compact { @@ -2654,7 +2710,6 @@ table th[data-sortt-desc] { } .ellipsis-button { - &:extend(.unselectable); padding: 0 5px 8px !important; display: inline-block !important; font-weight: 600 !important; @@ -2667,8 +2722,8 @@ table th[data-sortt-desc] { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - margin-top: -.5em; - margin-bottom: -.5em; + margin-top: -0.5em; + margin-bottom: -0.5em; } .precolors { @@ -2676,32 +2731,29 @@ table th[data-sortt-desc] { padding-right: 0 !important; margin: 3px 10px auto !important; width: 120px !important; +} - .color { - float: left; - width: 15px; - height: 15px; - } +.precolors .color { + float: left; + width: 15px; + height: 15px; } -@media @mediaSm { +@media (max-width: 767px) { .ui.stackable.menu:not(.no-vertical-tabs) { overflow-y: hidden; overflow-x: auto; flex-direction: row; flex-wrap: nowrap !important; - - .item { - width: initial !important; - } - - > .dropdown.item { - position: initial; - } - - .menu { - flex-direction: row; - } + } + .ui.stackable.menu:not(.no-vertical-tabs) .item { + width: initial !important; + } + .ui.stackable.menu:not(.no-vertical-tabs) > .dropdown.item { + position: initial; + } + .ui.stackable.menu:not(.no-vertical-tabs) .menu { + flex-direction: row; } } diff --git a/web_src/less/chroma/base.less b/web_src/css/chroma/base.css similarity index 87% rename from web_src/less/chroma/base.less rename to web_src/css/chroma/base.css index 597ee2a72d05..bfd49db7a433 100644 --- a/web_src/less/chroma/base.less +++ b/web_src/css/chroma/base.css @@ -29,14 +29,14 @@ /* LineNumbersTable */ .chroma .lnt { - margin-right: .4em; - padding: 0 .4em; + margin-right: 0.4em; + padding: 0 0.4em; } /* LineNumbers */ .chroma .ln { - margin-right: .4em; - padding: 0 .4em; + margin-right: 0.4em; + padding: 0 0.4em; } /* GenericStrong */ diff --git a/web_src/less/chroma/dark.less b/web_src/css/chroma/dark.css similarity index 100% rename from web_src/less/chroma/dark.less rename to web_src/css/chroma/dark.css diff --git a/web_src/less/chroma/light.less b/web_src/css/chroma/light.css similarity index 100% rename from web_src/less/chroma/light.less rename to web_src/css/chroma/light.css diff --git a/web_src/less/code/linebutton.less b/web_src/css/code/linebutton.css similarity index 100% rename from web_src/less/code/linebutton.less rename to web_src/css/code/linebutton.css diff --git a/web_src/less/codemirror/base.less b/web_src/css/codemirror/base.css similarity index 71% rename from web_src/less/codemirror/base.less rename to web_src/css/codemirror/base.css index db0a93f4c74a..b435fb1342c0 100644 --- a/web_src/less/codemirror/base.less +++ b/web_src/css/codemirror/base.css @@ -1,5 +1,5 @@ .ui .field:not(:last-child) .EasyMDEContainer .editor-statusbar { - margin-bottom: -1em; // when there is a statusbar, the "margin-bottom: 1em" of the "field" is not needed, because the statusbar is likely a blank line + margin-bottom: -1em; /* when there is a statusbar, the "margin-bottom: 1em" of the "field" is not needed, because the statusbar is likely a blank line */ } .EasyMDEContainer .CodeMirror { @@ -7,15 +7,15 @@ background-color: var(--color-input-background); border-color: var(--color-secondary); font: 14px var(--fonts-monospace); +} - &.cm-s-default { - border-radius: var(--border-radius); - padding: 0 !important; - } +.EasyMDEContainer .CodeMirror.cm-s-default { + border-radius: var(--border-radius); + padding: 0 !important; +} - &.CodeMirror-fullscreen.CodeMirror-focused { - border-right: 1px solid var(--color-primary) !important; - } +.EasyMDEContainer .CodeMirror.CodeMirror-fullscreen.CodeMirror-focused { + border-right: 1px solid var(--color-primary) !important; } .CodeMirror-cursor { diff --git a/web_src/css/codemirror/dark.css b/web_src/css/codemirror/dark.css new file mode 100644 index 000000000000..8a20d1c00433 --- /dev/null +++ b/web_src/css/codemirror/dark.css @@ -0,0 +1,106 @@ +.CodeMirror.cm-s-default .cm-property, +.CodeMirror.cm-s-paper .cm-property { + color: #a0cc75; +} + +.CodeMirror.cm-s-default .cm-header, +.CodeMirror.cm-s-paper .cm-header { + color: #9daccc; +} + +.CodeMirror.cm-s-default .cm-quote, +.CodeMirror.cm-s-paper .cm-quote { + color: #009900; +} + +.CodeMirror.cm-s-default .cm-keyword, +.CodeMirror.cm-s-paper .cm-keyword { + color: #cc8a61; +} + +.CodeMirror.cm-s-default .cm-atom, +.CodeMirror.cm-s-paper .cm-atom { + color: #ef5e77; +} + +.CodeMirror.cm-s-default .cm-number, +.CodeMirror.cm-s-paper .cm-number { + color: #ff5656; +} + +.CodeMirror.cm-s-default .cm-def, +.CodeMirror.cm-s-paper .cm-def { + color: #e4e4e4; +} + +.CodeMirror.cm-s-default .cm-variable-2, +.CodeMirror.cm-s-paper .cm-variable-2 { + color: #00bdbf; +} + +.CodeMirror.cm-s-default .cm-variable-3, +.CodeMirror.cm-s-paper .cm-variable-3 { + color: #008855; +} + +.CodeMirror.cm-s-default .cm-comment, +.CodeMirror.cm-s-paper .cm-comment { + color: #8e9ab3; +} + +.CodeMirror.cm-s-default .cm-string, +.CodeMirror.cm-s-paper .cm-string { + color: #a77272; +} + +.CodeMirror.cm-s-default .cm-string-2, +.CodeMirror.cm-s-paper .cm-string-2 { + color: #ff5500; +} + +.CodeMirror.cm-s-default .cm-meta, +.CodeMirror.cm-s-paper .cm-meta, +.CodeMirror.cm-s-default .cm-qualifier, +.CodeMirror.cm-s-paper .cm-qualifier { + color: #ffb176; +} + +.CodeMirror.cm-s-default .cm-builtin, +.CodeMirror.cm-s-paper .cm-builtin { + color: #b7c951; +} + +.CodeMirror.cm-s-default .cm-bracket, +.CodeMirror.cm-s-paper .cm-bracket { + color: #999977; +} + +.CodeMirror.cm-s-default .cm-tag, +.CodeMirror.cm-s-paper .cm-tag { + color: #f1d273; +} + +.CodeMirror.cm-s-default .cm-attribute, +.CodeMirror.cm-s-paper .cm-attribute { + color: #bfcc70; +} + +.CodeMirror.cm-s-default .cm-hr, +.CodeMirror.cm-s-paper .cm-hr { + color: #999999; +} + +.CodeMirror.cm-s-default .cm-url, +.CodeMirror.cm-s-paper .cm-url { + color: #c5cfd0; +} + +.CodeMirror.cm-s-default .cm-link, +.CodeMirror.cm-s-paper .cm-link { + color: #d8c792; +} + +.CodeMirror.cm-s-default .cm-error, +.CodeMirror.cm-s-paper .cm-error { + color: #dbdbeb; +} diff --git a/web_src/less/codemirror/light.less b/web_src/css/codemirror/light.css similarity index 100% rename from web_src/less/codemirror/light.less rename to web_src/css/codemirror/light.css diff --git a/web_src/less/console/console.less b/web_src/css/console/console.css similarity index 98% rename from web_src/less/console/console.less rename to web_src/css/console/console.css index db25a35bacc8..b2d8439f8cae 100644 --- a/web_src/less/console/console.less +++ b/web_src/css/console/console.css @@ -1,4 +1,4 @@ -// Based on https://github.com/buildkite/terminal-to-html/blob/697ff23bd8dc48b9d23f11f259f5256dae2455f0/assets/terminal.css +/* Based on https://github.com/buildkite/terminal-to-html/blob/697ff23bd8dc48b9d23f11f259f5256dae2455f0/assets/terminal.css */ .console { background: var(--color-console-bg); diff --git a/web_src/css/dashboard.css b/web_src/css/dashboard.css new file mode 100644 index 000000000000..ced8b3a164aa --- /dev/null +++ b/web_src/css/dashboard.css @@ -0,0 +1,203 @@ +.dashboard.feeds .context.user.menu, +.dashboard.issues .context.user.menu { + z-index: 101; + min-width: 200px; +} + +.dashboard.feeds .context.user.menu .ui.header, +.dashboard.issues .context.user.menu .ui.header { + font-size: 1rem; + text-transform: none; +} + +.dashboard.feeds .filter.menu, +.dashboard.issues .filter.menu { + width: initial; +} + +.dashboard.feeds .filter.menu .item, +.dashboard.issues .filter.menu .item { + text-align: left; + display: flex; + align-items: center; + justify-content: space-between; +} + +.dashboard.feeds .filter.menu .item .text, +.dashboard.issues .filter.menu .item .text { + height: 16px; + vertical-align: middle; +} + +.dashboard.feeds .filter.menu .item .text.truncate, +.dashboard.issues .filter.menu .item .text.truncate { + width: 75%; +} + +.dashboard.feeds .filter.menu .item .floating.label, +.dashboard.issues .filter.menu .item .floating.label { + top: 7px; + left: 90%; + width: 15%; +} + +@media (max-width: 767px) { + .dashboard.feeds .filter.menu .item .floating.label, + .dashboard.issues .filter.menu .item .floating.label { + top: 10px; + left: auto; + width: auto; + right: 13px; + } +} + +/* Sort */ +.dashboard.feeds .filter.menu .jump.item, +.dashboard.issues .filter.menu .jump.item { + margin: 1px; + padding-right: 0; +} + +.dashboard.feeds .filter.menu .menu, +.dashboard.issues .filter.menu .menu { + max-height: 300px; + overflow-x: auto; + right: 0 !important; + left: auto !important; +} + +@media (max-width: 767px) { + .dashboard.feeds .filter.menu, + .dashboard.issues .filter.menu { + width: 100%; + } +} + +.dashboard.feeds .right.stackable.menu > .item.active, +.dashboard.issues .right.stackable.menu > .item.active { + color: var(--color-red); +} + +.dashboard .dashboard-repos, +.dashboard .dashboard-orgs { + margin: 0 1px; /* Accommodate for Semantic's 1px hacks on .attached elements */ +} + +.dashboard .dashboard-navbar { + width: 100vw; + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.dashboard .dashboard-navbar .org-visibility .label { + margin-left: 5px; +} + +.dashboard .dashboard-navbar .ui.dropdown { + max-width: 100%; +} + +@media (max-width: 767px) { + .dashboard .dashboard-navbar .ui.dropdown > .menu { + position: static; + } +} + +.feeds .news li { + display: flex; + align-items: baseline; + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +.feeds .news li img { + align-self: flex-start; +} + +.feeds .news li > * + * { + margin-left: 0.35rem; +} + +.feeds .news > .ui.grid { + margin-left: auto; + margin-right: auto; +} + +.feeds .news .left .ui.avatar { + margin-top: 13px; +} + +.feeds .news .time-since { + font-size: 13px; +} + +.feeds .news .issue.title { + width: 80%; + margin: 0 0 1em; +} + +.feeds .news .push.news .content ul { + line-height: 18px; + font-size: 13px; + list-style: none; + padding-left: 10px; +} + +.feeds .news .push.news .content ul .text.truncate { + width: 80%; +} + +.feeds .news .commit-id { + font-family: var(--fonts-monospace); +} + +.feeds .news code { + padding: 2px 4px; + border-radius: 3px; + background-color: var(--color-markup-code-block); + word-break: break-all; +} + +.feeds .news:last-of-type .divider { + display: none !important; +} + +.feeds .list ul { + list-style: none; + margin: 0; + padding-left: 0; +} + +.feeds .list ul li:not(:last-child) { + border-bottom: 1px solid var(--color-secondary); +} + +.feeds .list ul li.private { + background-color: var(--color-box-body-highlight); +} + +.feeds .list ul li .repo-list-link { + padding: 6px 1em; + display: block; +} + +.feeds .list ul li .repo-list-link .svg { + color: var(--color-text-light-2); +} + +.feeds .list ul li .repo-list-link .star-num { + font-size: 12px; +} + +.feeds .list #privateFilterCheckbox .svg { + color: var(--color-grey); + margin-right: 0.25rem; +} + +.feeds .list .repo-owner-name-list .item-name { + min-width: 0; +} + +.feeds .list .repo-owner-name-list .item-name svg { + min-width: 16px; +} diff --git a/web_src/less/_editor.less b/web_src/css/editor.css similarity index 100% rename from web_src/less/_editor.less rename to web_src/css/editor.css diff --git a/web_src/css/explore.css b/web_src/css/explore.css new file mode 100644 index 000000000000..854370225247 --- /dev/null +++ b/web_src/css/explore.css @@ -0,0 +1,88 @@ +.explore .navbar { + justify-content: center; + margin-bottom: 15px !important; + background-color: var(--color-navbar) !important; + border-width: 1px !important; +} + +.explore .navbar .svg { + width: 16px; + text-align: center; + margin-right: 5px; +} + +.ui.repository.list .item { + padding-bottom: 1.5rem; +} + +.ui.repository.list .item:not(:first-child) { + border-top: 1px solid var(--color-secondary); + padding-top: 1.5rem; +} + +.ui.repository.list .item .ui.header { + font-size: 1.5rem; + margin-bottom: 0.5rem; +} + +.ui.repository.list .item .ui.header .name { + word-break: break-all; +} + +.ui.repository.list .item .ui.header .metas { + font-size: 14px; +} + +.ui.repository.list .item .time { + font-size: 12px; +} + +.ui.repository.list .item .ui.tags { + margin-bottom: 0.5rem; +} + +.ui.repository.branches .info { + font-size: 12px; + color: var(--color-text-light); + display: flex; + white-space: pre; +} + +.ui.repository.branches .info .commit-message { + max-width: 72em; + overflow: hidden; + text-overflow: ellipsis; +} + +.ui.repository.branches .overflow-visible { + overflow: visible; +} + +/* fix alignment of PR popup in branches table */ +.ui.repository.branches table .ui.popup { + text-align: left; +} + +.ui.user.list .item { + padding-bottom: 25px; + display: flex; +} + +.ui.user.list .item:not(:first-child) { + border-top: 1px solid var(--color-secondary); + padding-top: 25px; +} + +.ui.user.list .item img.ui.avatar { + width: 40px; + height: 40px; + margin-right: 10px; +} + +.ui.user.list .item .description { + margin-top: 5px; +} + +.ui.user.list .item .description .svg:not(:first-child) { + margin-left: 5px; +} diff --git a/web_src/less/features/codeeditor.less b/web_src/css/features/codeeditor.css similarity index 100% rename from web_src/less/features/codeeditor.less rename to web_src/css/features/codeeditor.css diff --git a/web_src/less/features/dropzone.less b/web_src/css/features/dropzone.css similarity index 75% rename from web_src/less/features/dropzone.less rename to web_src/css/features/dropzone.css index ee7a5f1b65d4..0ce067ef30ec 100644 --- a/web_src/less/features/dropzone.less +++ b/web_src/css/features/dropzone.css @@ -1,15 +1,14 @@ -.ui .field { - .dropzone { - border: 2px dashed var(--color-secondary); - background: none; - box-shadow: none; - padding: 0; - border-radius: 4px; - min-height: 0; - .dz-message { - margin: 10px 0; - } - } +.ui .field .dropzone { + border: 2px dashed var(--color-secondary); + background: none; + box-shadow: none; + padding: 0; + border-radius: 4px; + min-height: 0; +} + +.ui .field .dropzone .dz-message { + margin: 10px 0; } .dropzone .dz-button { @@ -50,5 +49,5 @@ } .dropzone .dz-preview:hover .dz-image img { - filter: opacity(.5) !important; + filter: opacity(0.5) !important; } diff --git a/web_src/css/features/gitgraph.css b/web_src/css/features/gitgraph.css new file mode 100644 index 000000000000..f7477997fe0f --- /dev/null +++ b/web_src/css/features/gitgraph.css @@ -0,0 +1,317 @@ +#git-graph-container { + overflow-x: auto; + width: 100%; + min-height: 350px; +} + +#git-graph-container > .ui.segment.loading { + border: 0; + z-index: 1; + min-height: 246px; +} + +#git-graph-container h2 { + display: flex; + justify-content: space-between; + align-items: center; +} + +#git-graph-container .color-buttons { + margin-right: 0; +} + +#git-graph-container .ui.header.dividing { + padding-bottom: 10px; +} + +#git-graph-container #flow-select-refs-dropdown { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + min-width: 250px; + border-right: none; +} + +#git-graph-container #flow-select-refs-dropdown .ui.label { + max-width: 180px; + display: inline-flex !important; + align-items: center; +} + +#git-graph-container #flow-select-refs-dropdown .ui.label .truncate { + display: inline-block; + max-width: 140px; + overflow: hidden; + text-overflow: ellipsis; + vertical-align: top; + white-space: nowrap; +} + +#git-graph-container #flow-select-refs-dropdown .dropdown.icon { + display: none; +} + +#git-graph-container #flow-select-refs-dropdown .default.text { + padding-top: 4px; + padding-bottom: 4px; +} + +#git-graph-container #flow-select-refs-dropdown input.search { + position: relative; + top: 1px; +} + +#git-graph-container li { + list-style-type: none; + height: 24px; + line-height: 24px; + white-space: nowrap; + display: flex; + align-items: center; +} + +#git-graph-container li .node-relation { + font-family: var(--fonts-monospace); +} + +#git-graph-container li .author { + color: var(--color-text-light); +} + +#git-graph-container li .time { + color: var(--color-text-light-3); + font-size: 80%; +} + +#git-graph-container li a:not(.ui):hover { + text-decoration: underline; +} + +#git-graph-container li a em { + color: var(--color-red); + border-bottom: 1px dotted var(--color-secondary); + text-decoration: none; + font-style: normal; +} + +#git-graph-container #rel-container { + max-width: 30%; + overflow-x: auto; + float: left; +} + +#git-graph-container #rev-container { + width: 100%; +} + +#git-graph-container #rev-list { + margin: 0; + padding: 0; + width: 100%; +} + +#git-graph-container #rev-list li.highlight.hover { + background-color: var(--color-secondary-alpha-30); +} + +#git-graph-container #rev-list .tags a.button { + padding: 2px 4px; +} + +#git-graph-container #rev-list .sha.label { + padding-top: 5px; + padding-bottom: 3px; +} + +#git-graph-container #rev-list .sha.label .shortsha { + padding-top: 0; +} + +#git-graph-container #rev-list .sha.label .shortsha-pad { + padding-right: 10px; +} + +#git-graph-container #rev-list .sha.label .ui.detail.icon.button { + padding-top: 3px; + margin-top: -5px; + padding-bottom: 1px; +} + +#git-graph-container #rev-list .author img.ui.avatar { + width: auto; + height: 18px; + max-width: none; +} + +#git-graph-container #graph-raw-list { + margin: 0; +} + +#git-graph-container.monochrome #rel-container .flow-group { + stroke: var(--color-secondary-dark-5); + fill: var(--color-secondary-dark-5); +} + +#git-graph-container.monochrome #rel-container .flow-group.highlight { + stroke: var(--color-secondary-dark-12); + fill: var(--color-secondary-dark-12); +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-1 { + stroke: #499a37; + fill: #499a37; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-2 { + stroke: #ce4751; + fill: #ce4751; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-3 { + stroke: #8f9121; + fill: #8f9121; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-4 { + stroke: #ac32a6; + fill: #ac32a6; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-5 { + stroke: #7445e9; + fill: #7445e9; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-6 { + stroke: #c67d28; + fill: #c67d28; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-7 { + stroke: #4db392; + fill: #4db392; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-8 { + stroke: #aa4d30; + fill: #aa4d30; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-9 { + stroke: #2a6f84; + fill: #2a6f84; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-10 { + stroke: #c45327; + fill: #c45327; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-11 { + stroke: #3d965c; + fill: #3d965c; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-12 { + stroke: #792a93; + fill: #792a93; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-13 { + stroke: #439d73; + fill: #439d73; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-14 { + stroke: #103aad; + fill: #103aad; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-15 { + stroke: #982e85; + fill: #982e85; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-0 { + stroke: #7db233; + fill: #7db233; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-1 { + stroke: #5ac144; + fill: #5ac144; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-2 { + stroke: #ed5a8b; + fill: #ed5a8b; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-3 { + stroke: #ced049; + fill: #ced048; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-4 { + stroke: #db61d7; + fill: #db62d6; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-5 { + stroke: #8455f9; + fill: #8455f9; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-6 { + stroke: #e6a151; + fill: #e6a151; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-7 { + stroke: #44daaa; + fill: #44daaa; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-8 { + stroke: #dd7a5c; + fill: #dd7a5c; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-9 { + stroke: #38859c; + fill: #38859c; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-10 { + stroke: #d95520; + fill: #d95520; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-11 { + stroke: #42ae68; + fill: #42ae68; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-12 { + stroke: #9126b5; + fill: #9126b5; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-13 { + stroke: #4ab080; + fill: #4ab080; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-14 { + stroke: #284fb8; + fill: #284fb8; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-15 { + stroke: #971c80; + fill: #971c80; +} + +#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-0 { + stroke: #87ca28; + fill: #87ca28; +} diff --git a/web_src/css/features/heatmap.css b/web_src/css/features/heatmap.css new file mode 100644 index 000000000000..d0cd2b5734a5 --- /dev/null +++ b/web_src/css/features/heatmap.css @@ -0,0 +1,68 @@ +#user-heatmap { + width: 100%; + font-size: 9px; + position: relative; + min-height: 125px; +} + +#user-heatmap text { + fill: currentcolor !important; +} + +/* for the "Less" and "More" legend */ +#user-heatmap .vch__legend .vch__legend { + display: flex; + font-size: 11px; + align-items: center; + justify-content: right; +} + +#user-heatmap .vch__legend .vch__legend div:first-child, +#user-heatmap .vch__legend .vch__legend div:last-child { + display: inline-block; + padding: 0 5px; +} + +/* move the "? contributions in the last ? months" text from top to bottom */ +#user-heatmap .total-contributions { + font-size: 11px; + position: absolute; + bottom: 0; + left: 25px; +} + +@media (max-width: 1200px) { + #user-heatmap { + min-height: 105px; + } + #user-heatmap .total-contributions { + left: 21px; + } +} + +@media (max-width: 1000px) { + #user-heatmap { + min-height: 80px; + } + #user-heatmap .total-contributions { + font-size: 10px; + left: 17px; + bottom: -4px; + } +} + +.user.profile #user-heatmap { + min-height: 135px; +} + +@media (max-width: 1200px) { + .user.profile #user-heatmap { + min-height: 115px; + } +} + +@media (max-width: 1000px) { + .user.profile #user-heatmap { + min-height: 90px; + } +} diff --git a/web_src/css/features/imagediff.css b/web_src/css/features/imagediff.css new file mode 100644 index 000000000000..f796bc19aea2 --- /dev/null +++ b/web_src/css/features/imagediff.css @@ -0,0 +1,107 @@ +.image-diff-container { + text-align: center; + padding: 1em 0; +} + +.image-diff-container img { + border: 1px solid var(--color-primary-light-7); + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAG0lEQVQYlWN4+vTpf3SMDTAMBYXYBLFpHgoKAeiOf0SGE9kbAAAAAElFTkSuQmCC") right bottom var(--color-primary-light-7); +} + +.image-diff-container .before-container { + border: 1px solid var(--color-red); + display: block; +} + +.image-diff-container .after-container { + border: 1px solid var(--color-green); + display: block; +} + +.image-diff-container .diff-side-by-side .side { + display: inline-block; + line-height: 0; + vertical-align: top; + margin: 0 1em; +} + +.image-diff-container .diff-side-by-side .side .side-header { + font-weight: bold; +} + +.image-diff-container .diff-swipe { + margin: auto; +} + +.image-diff-container .diff-swipe .swipe-frame { + position: absolute; +} + +.image-diff-container .diff-swipe .swipe-frame .before-container { + position: absolute; +} + +.image-diff-container .diff-swipe .swipe-frame .swipe-container { + position: absolute; + right: 0; + display: block; + border-left: 2px solid var(--color-secondary-dark-8); + height: 100%; + overflow: hidden; +} + +.image-diff-container + .diff-swipe + .swipe-frame + .swipe-container + .after-container { + position: absolute; + right: 0; +} + +.image-diff-container .diff-swipe .swipe-frame .swipe-bar { + position: absolute; + height: 100%; + top: 0; + left: 0; +} + +.image-diff-container .diff-swipe .swipe-frame .swipe-bar .handle { + background: var(--color-secondary-dark-8); + left: -5px; + height: 12px; + width: 12px; + position: absolute; + transform: rotate(45deg); + box-sizing: border-box; + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; +} + +.image-diff-container .diff-swipe .swipe-frame .swipe-bar .top-handle { + top: -12px; +} + +.image-diff-container .diff-swipe .swipe-frame .swipe-bar .bottom-handle { + bottom: -14px; +} + +.image-diff-container .diff-overlay { + margin: 0 auto; +} + +.image-diff-container .diff-overlay .overlay-frame { + margin: 0 auto; + position: relative; +} + +.image-diff-container .diff-overlay .before-container, +.image-diff-container .diff-overlay .after-container { + position: absolute; +} + +.image-diff-container .diff-overlay input { + max-width: 300px; +} diff --git a/web_src/less/features/projects.less b/web_src/css/features/projects.css similarity index 67% rename from web_src/less/features/projects.less rename to web_src/css/features/projects.css index cbdb1a3c9f75..2bc68ccf0dc1 100644 --- a/web_src/less/features/projects.less +++ b/web_src/css/features/projects.css @@ -3,14 +3,14 @@ flex-direction: row; flex-wrap: nowrap; overflow-x: auto; - margin: 0 .5em; + margin: 0 0.5em; } .board-column { background-color: var(--color-project-board-bg) !important; border: 1px solid var(--color-secondary) !important; - margin: 0 .5rem !important; - padding: .5rem !important; + margin: 0 0.5rem !important; + padding: 0.5rem !important; width: 320px; height: calc(100vh - 450px); min-height: 60vh; @@ -24,21 +24,22 @@ .board-column-header { display: flex; justify-content: space-between; +} - &.dark-label { - color: var(--color-project-board-dark-label) !important; +.board-column-header.dark-label { + color: var(--color-project-board-dark-label) !important; +} - .board-label { - color: var(--color-project-board-dark-label) !important; - } - } - &.light-label { - color: var(--color-project-board-light-label) !important; +.board-column-header.dark-label .board-label { + color: var(--color-project-board-dark-label) !important; +} + +.board-column-header.light-label { + color: var(--color-project-board-light-label) !important; +} - .board-label { - color: var(--color-project-board-light-label) !important; - } - } +.board-column-header.light-label .board-label { + color: var(--color-project-board-light-label) !important; } .board-label { @@ -81,7 +82,7 @@ border-radius: 5px !important; cursor: move; width: calc(100% - 4px) !important; - padding: .5rem !important; + padding: 0.5rem !important; min-height: auto !important; } @@ -124,24 +125,23 @@ .color-field .minicolors.minicolors-theme-default { display: block; +} - .minicolors-input { - height: 38px; - padding-left: 2rem; - } +.color-field .minicolors.minicolors-theme-default .minicolors-input { + height: 38px; + padding-left: 2rem; +} - .minicolors-swatch { - top: 10px; - } +.color-field .minicolors.minicolors-theme-default .minicolors-swatch { + top: 10px; } -.edit-project-board, -.new-board-modal { - .color.picker.column { - display: flex; +.edit-project-board .color.picker.column, +.new-board-modal .color.picker.column { + display: flex; +} - .minicolors { - flex: 1; - } - } +.edit-project-board .color.picker.column .minicolors, +.new-board-modal .color.picker.column .minicolors { + flex: 1; } diff --git a/web_src/css/font_i18n.css b/web_src/css/font_i18n.css new file mode 100644 index 000000000000..e3de90653202 --- /dev/null +++ b/web_src/css/font_i18n.css @@ -0,0 +1,393 @@ +:root :lang(ja) { + --fonts-override: var(--fonts-default-override-ja); +} + +:root :lang(zh-CN) { + --fonts-override: var(--fonts-default-override-zh-cn); +} + +:root :lang(zh-TW) { + --fonts-override: var(--fonts-default-override-zh-tw); +} + +:root :lang(zh-HK) { + --fonts-override: var(--fonts-default-override-zh-hk); +} + +:root :lang(ko) { + --fonts-override: var(--fonts-default-override-ko); +} + +[lang] { + font-family: var(--fonts-regular); +} + +:root { + --fonts-default-override-ja: system-ui-ja, var(--fonts-proportional); + --fonts-default-override-zh-cn: system-ui-zh-cn, var(--fonts-proportional); + --fonts-default-override-zh-tw: system-ui-zh-tw, var(--fonts-proportional); + --fonts-default-override-zh-hk: system-ui-zh-hk, var(--fonts-proportional); + --fonts-default-override-ko: system-ui-ko, var(--fonts-proportional); +} + +/* Special handling for Firefox on Windows/Linux */ +@supports (-moz-appearance: none) { + :root { + --fonts-default-override-ja: var(--fonts-proportional), system-ui-ja; + --fonts-default-override-zh-cn: var(--fonts-proportional), system-ui-zh-cn; + --fonts-default-override-zh-tw: var(--fonts-proportional), system-ui-zh-tw; + --fonts-default-override-zh-hk: var(--fonts-proportional), system-ui-zh-hk; + --fonts-default-override-ko: var(--fonts-proportional), system-ui-ko; + } +} + +@font-face { + font-family: system-ui-ja; + src: local("HiraKakuProN-W3"), local("Hiragino Kaku Gothic ProN W3"), + local("HiraginoSans-W2"), local("Source Han Sans JP Light"), + local("SourceHanSansJP-Light"), local("Source Han Sans J Light"), + local("SourceHanSansJ-Light"), local("Noto Sans CJK JP Light"), + local("NotoSansCJKJP-Light"), local("Source Han Sans Light"), + local("SourceHanSans-Light"), local("Yu Gothic Regular"), + local("YuGothic Regular"), local("Droid Sans Japanese"), local("Meiryo"), + local("MS PGothic"); + font-weight: 300; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +@font-face { + font-family: system-ui-ja; + src: local("HiraKakuProN-W3"), local("Hiragino Kaku Gothic ProN W3"), + local("HiraginoSans-W4"), local("Source Han Sans JP Regular"), + local("SourceHanSansJP-Regular"), local("Source Han Sans J Regular"), + local("SourceHanSansJ-Regular"), local("Noto Sans CJK JP Regular"), + local("NotoSansCJKJP-Regular"), local("Source Han Sans Regular"), + local("SourceHanSans-Regular"), local("Yu Gothic Medium"), + local("YuGothic Medium"), local("Droid Sans Japanese"), local("Meiryo"), + local("MS PGothic"); + font-weight: 400; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +@font-face { + font-family: system-ui-ja; + src: local("HiraKakuProN-W3"), local("Hiragino Kaku Gothic ProN W3"), + local("HiraginoSans-W5"), local("Source Han Sans JP Medium"), + local("SourceHanSansJP-Medium"), local("Source Han Sans J Medium"), + local("SourceHanSansJ-Medium"), local("Noto Sans CJK JP Medium"), + local("NotoSansCJKJP-Medium"), local("Source Han Sans Medium"), + local("SourceHanSans-Medium"), local("Yu Gothic Medium"), + local("YuGothic Medium"), local("Droid Sans Japanese"), local("Meiryo"), + local("MS PGothic"); + font-weight: 500; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +@font-face { + font-family: system-ui-ja; + src: local("HiraKakuProN-W6"), local("Hiragino Kaku Gothic ProN W6"), + local("HiraginoSans-W6"), local("Source Han Sans JP Bold"), + local("SourceHanSansJP-Bold"), local("Source Han Sans J Bold"), + local("SourceHanSansJ-Bold"), local("Noto Sans CJK JP Bold"), + local("NotoSansCJKJP-Bold"), local("Source Han Sans Bold"), + local("SourceHanSans-Bold"), local("Yu Gothic Bold"), local("YuGothic Bold"), + local("Droid Sans Japanese"), local("Meiryo Bold"), local("MS PGothic"); + font-weight: 700; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +/* Safari on macOS/iOS */ +@font-face { + font-family: system-ui-ja; + src: local("HelveticaNeue"); + unicode-range: U+A0; +} + +/* Other browsers on macOS/iOS */ +@supports not (-webkit-hyphens: none) { + @font-face { + font-family: system-ui-ja; + src: local("HelveticaNeue"); + unicode-range: U+20; + } +} + +@font-face { + font-family: system-ui-zh-cn; + src: local("PingFangSC-Light"), local("Source Han Sans CN Light"), + local("SourceHanSansCN-Light"), local("Source Han Sans SC Light"), + local("SourceHanSansSC-Light"), local("Noto Sans CJK SC Light"), + local("NotoSansCJKSC-Light"), local("HiraginoSansGB-W3"), + local("Hiragino Sans GB W3"), local("Microsoft YaHei Light"), + local("Heiti SC Light"), local("SimHei"); + font-weight: 300; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +@font-face { + font-family: system-ui-zh-cn; + src: local("PingFangSC-Regular"), local("Source Han Sans CN Regular"), + local("SourceHanSansCN-Regular"), local("Source Han Sans SC Regular"), + local("SourceHanSansSC-Regular"), local("Noto Sans CJK SC Regular"), + local("NotoSansCJKSC-Regular"), local("HiraginoSansGB-W3"), + local("Hiragino Sans GB W3"), local("Microsoft YaHei"), + local("Heiti SC Light"), local("SimHei"); + font-weight: 400; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +@font-face { + font-family: system-ui-zh-cn; + src: local("PingFangSC-Medium"), local("Source Han Sans CN Medium"), + local("SourceHanSansCN-Medium"), local("Source Han Sans SC Medium"), + local("SourceHanSansSC-Medium"), local("Noto Sans CJK SC Medium"), + local("NotoSansCJKSC-Medium"), local("HiraginoSansGB-W3"), + local("Hiragino Sans GB W3"), local("Microsoft YaHei"), + local("Heiti SC Light"), local("SimHei"); + font-weight: 500; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +@font-face { + font-family: system-ui-zh-cn; + src: local("PingFangSC-Semibold"), local("Source Han Sans CN Bold"), + local("SourceHanSansCN-Bold"), local("Source Han Sans SC Bold"), + local("SourceHanSansSC-Bold"), local("Noto Sans CJK SC Bold"), + local("NotoSansCJKSC-Bold"), local("HiraginoSansGB-W6"), + local("Hiragino Sans GB W6"), local("Microsoft YaHei Bold"), + local("Heiti SC Medium"), local("SimHei"); + font-weight: 700; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +/* Safari on macOS/iOS */ +@font-face { + font-family: system-ui-zh-cn; + src: local("HelveticaNeue"); + unicode-range: U+A0; +} + +/* Other browsers on macOS/iOS */ +@supports not (-webkit-hyphens: none) { + @font-face { + font-family: system-ui-zh-cn; + src: local("HelveticaNeue"); + unicode-range: U+20; + } +} + +@font-face { + font-family: system-ui-zh-tw; + src: local("PingFangTC-Light"), local("Source Han Sans TW Light"), + local("SourceHanSansTW-Light"), local("Source Han Sans TC Light"), + local("SourceHanSansTC-Light"), local("Noto Sans CJK TC Light"), + local("NotoSansCJKTC-Light"), local("HiraginoSansTC-W3"), + local("Hiragino Sans TC W3"), local("Microsoft JhengHei Light"), + local("Heiti TC Light"), local("PMingLiU"); + font-weight: 300; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +@font-face { + font-family: system-ui-zh-tw; + src: local("PingFangTC-Regular"), local("Source Han Sans TW Regular"), + local("SourceHanSansTW-Regular"), local("Source Han Sans TC Regular"), + local("SourceHanSansTC-Regular"), local("Noto Sans CJK TC Regular"), + local("NotoSansCJKTC-Regular"), local("HiraginoSansTC-W3"), + local("Hiragino Sans TC W3"), local("Microsoft JhengHei"), + local("Heiti TC Light"), local("PMingLiU"); + font-weight: 400; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +@font-face { + font-family: system-ui-zh-tw; + src: local("PingFangTC-Medium"), local("Source Han Sans TW Medium"), + local("SourceHanSansTW-Medium"), local("Source Han Sans TC Medium"), + local("SourceHanSansTC-Medium"), local("Noto Sans CJK TC Medium"), + local("NotoSansCJKTC-Medium"), local("HiraginoSansTC-W3"), + local("Hiragino Sans TC W3"), local("Microsoft JhengHei"), + local("Heiti TC Light"), local("PMingLiU"); + font-weight: 500; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +@font-face { + font-family: system-ui-zh-tw; + src: local("PingFangTC-Semibold"), local("Source Han Sans TW Bold"), + local("SourceHanSansTW-Bold"), local("Source Han Sans TC Bold"), + local("SourceHanSansTC-Bold"), local("Noto Sans CJK TC Bold"), + local("NotoSansCJKTC-Bold"), local("HiraginoSansTC-W6"), + local("Hiragino Sans TC W6"), local("Microsoft JhengHei Bold"), + local("Heiti TC Medium"), local("PMingLiU"); + font-weight: 700; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +/* Safari on macOS/iOS */ +@font-face { + font-family: system-ui-zh-tw; + src: local("HelveticaNeue"); + unicode-range: U+A0; +} + +/* Other browsers on macOS/iOS */ +@supports not (-webkit-hyphens: none) { + @font-face { + font-family: system-ui-zh-tw; + src: local("HelveticaNeue"); + unicode-range: U+20; + } +} + +@font-face { + font-family: system-ui-zh-hk; + src: local("PingFangHK-Light"), local("Source Han Sans HK Light"), + local("SourceHanSansHK-Light"), local("Source Han Sans HC Light"), + local("SourceHanSansHC-Light"), local("Noto Sans CJK HK Light"), + local("NotoSansCJKHK-Light"), local("Source Han Sans TC Light"), + local("SourceHanSansTC-Light"), local("Noto Sans CJK TC Light"), + local("NotoSansCJKTC-Light"), local("HiraginoSansTC-W3"), + local("Hiragino Sans TC W3"), local("Microsoft JhengHei Light"), + local("Heiti TC Light"), local("PMingLiU_HKSCS"), local("PMingLiU"); + font-weight: 300; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +@font-face { + font-family: system-ui-zh-hk; + src: local("PingFangHK-Regular"), local("Source Han Sans HK Regular"), + local("SourceHanSansHK-Regular"), local("Source Han Sans HC Regular"), + local("SourceHanSansHC-Regular"), local("Noto Sans CJK HK Regular"), + local("NotoSansCJKHK-Regular"), local("Source Han Sans TC Regular"), + local("SourceHanSansTC-Regular"), local("Noto Sans CJK TC Regular"), + local("NotoSansCJKTC-Regular"), local("HiraginoSansTC-W3"), + local("Hiragino Sans TC W3"), local("Microsoft JhengHei"), + local("Heiti TC Light"), local("PMingLiU_HKSCS"), local("PMingLiU"); + font-weight: 400; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +@font-face { + font-family: system-ui-zh-hk; + src: local("PingFangHK-Medium"), local("Source Han Sans HK Medium"), + local("SourceHanSansHK-Medium"), local("Source Han Sans HC Medium"), + local("SourceHanSansHC-Medium"), local("Noto Sans CJK HK Medium"), + local("NotoSansCJKHK-Medium"), local("Source Han Sans TC Medium"), + local("SourceHanSansTC-Medium"), local("Noto Sans CJK TC Medium"), + local("NotoSansCJKTC-Medium"), local("HiraginoSansTC-W3"), + local("Hiragino Sans TC W3"), local("Microsoft JhengHei"), + local("Heiti TC Light"), local("PMingLiU_HKSCS"), local("PMingLiU"); + font-weight: 500; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +@font-face { + font-family: system-ui-zh-hk; + src: local("PingFangHK-Semibold"), local("Source Han Sans HK Bold"), + local("SourceHanSansHK-Bold"), local("Source Han Sans HC Bold"), + local("SourceHanSansHC-Bold"), local("Noto Sans CJK HK Bold"), + local("NotoSansCJKHK-Bold"), local("Source Han Sans TC Bold"), + local("SourceHanSansTC-Bold"), local("Noto Sans CJK TC Bold"), + local("NotoSansCJKTC-Bold"), local("HiraginoSansTC-W6"), + local("Hiragino Sans TC W6"), local("Microsoft JhengHei Bold"), + local("Heiti TC Medium"), local("PMingLiU_HKSCS"), local("PMingLiU"); + font-weight: 700; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +/* Safari on macOS/iOS */ +@font-face { + font-family: system-ui-zh-hk; + src: local("HelveticaNeue"); + unicode-range: U+A0; +} + +/* Other browsers on macOS/iOS */ +@supports not (-webkit-hyphens: none) { + @font-face { + font-family: system-ui-zh-hk; + src: local("HelveticaNeue"); + unicode-range: U+20; + } +} + +@font-face { + font-family: system-ui-ko; + src: local("AppleSDGothicNeo-Light"), local("Source Han Sans KR Light"), + local("SourceHanSansKR-Light"), local("Source Han Sans K Light"), + local("SourceHanSansK-Light"), local("Noto Sans CJK KR Light"), + local("NotoSansCJKKR-Light"), local("NanumBarunGothic Light"), + local("Malgun Gothic Semilight"), local("Nanum Gothic"), local("Dotum"); + font-weight: 300; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +@font-face { + font-family: system-ui-ko; + src: local("AppleSDGothicNeo-Regular"), local("Source Han Sans KR Regular"), + local("SourceHanSansKR-Regular"), local("Source Han Sans K Regular"), + local("SourceHanSansK-Regular"), local("Noto Sans CJK KR Regular"), + local("NotoSansCJKKR-Regular"), local("NanumBarunGothic"), + local("Malgun Gothic"), local("Nanum Gothic"), local("Dotum"); + font-weight: 400; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +@font-face { + font-family: system-ui-ko; + src: local("AppleSDGothicNeo-Medium"), local("Source Han Sans KR Medium"), + local("SourceHanSansKR-Medium"), local("Source Han Sans K Medium"), + local("SourceHanSansK-Medium"), local("Noto Sans CJK KR Medium"), + local("NotoSansCJKKR-Medium"), local("NanumBarunGothic"), + local("Malgun Gothic"), local("Nanum Gothic"), local("Dotum"); + font-weight: 500; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +@font-face { + font-family: system-ui-ko; + src: local("AppleSDGothicNeo-SemiBold"), local("Source Han Sans KR Bold"), + local("SourceHanSansKR-Bold"), local("Source Han Sans K Bold"), + local("SourceHanSansK-Bold"), local("Noto Sans CJK KR Bold"), + local("NotoSansCJKKR-Bold"), local("NanumBarunGothic Bold"), + local("Malgun Gothic Bold"), local("Nanum Gothic Bold"), local("Dotum"); + font-weight: 700; + unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, + U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; +} + +/* Safari on macOS/iOS */ +@font-face { + font-family: system-ui-ko; + src: local("HelveticaNeue"); + unicode-range: U+A0; +} + +/* Other browsers on macOS/iOS */ +@supports not (-webkit-hyphens: none) { + @font-face { + font-family: system-ui-ko; + src: local("HelveticaNeue"); + unicode-range: U+20; + } +} diff --git a/web_src/css/form.css b/web_src/css/form.css new file mode 100644 index 000000000000..e325a377f8d8 --- /dev/null +++ b/web_src/css/form.css @@ -0,0 +1,547 @@ +input, +textarea, +.ui.input > input, +.ui.form input:not([type]), +.ui.form select, +.ui.form textarea, +.ui.form input[type="date"], +.ui.form input[type="datetime-local"], +.ui.form input[type="email"], +.ui.form input[type="file"], +.ui.form input[type="number"], +.ui.form input[type="password"], +.ui.form input[type="search"], +.ui.form input[type="tel"], +.ui.form input[type="text"], +.ui.form input[type="time"], +.ui.form input[type="url"], +.ui.selection.dropdown, +.ui.checkbox label::before, +.ui.checkbox input:checked ~ label::before, +.ui.checkbox input:not([type="radio"]):indeterminate ~ label::before { + background: var(--color-input-background); + border-color: var(--color-input-border); + color: var(--color-input-text); +} + +input:hover, +textarea:hover, +.ui.input input:hover, +.ui.form input:not([type]):hover, +.ui.form select:hover, +.ui.form textarea:hover, +.ui.form input[type="date"]:hover, +.ui.form input[type="datetime-local"]:hover, +.ui.form input[type="email"]:hover, +.ui.form input[type="file"]:hover, +.ui.form input[type="number"]:hover, +.ui.form input[type="password"]:hover, +.ui.form input[type="search"]:hover, +.ui.form input[type="tel"]:hover, +.ui.form input[type="text"]:hover, +.ui.form input[type="time"]:hover, +.ui.form input[type="url"]:hover, +.ui.selection.dropdown:hover, +.ui.checkbox label:hover::before, +.ui.checkbox label:active::before, +.ui.radio.checkbox label::after, +.ui.radio.checkbox input:focus ~ label::before, +.ui.radio.checkbox input:checked ~ label::before { + background: var(--color-input-background); + border-color: var(--color-input-border-hover); + color: var(--color-input-text); +} + +input:focus, +textarea:focus, +.ui.input input:focus, +.ui.form input:not([type]):focus, +.ui.form select:focus, +.ui.form textarea:focus, +.ui.form input[type="date"]:focus, +.ui.form input[type="datetime-local"]:focus, +.ui.form input[type="email"]:focus, +.ui.form input[type="file"]:focus, +.ui.form input[type="number"]:focus, +.ui.form input[type="password"]:focus, +.ui.form input[type="search"]:focus, +.ui.form input[type="tel"]:focus, +.ui.form input[type="text"]:focus, +.ui.form input[type="time"]:focus, +.ui.form input[type="url"]:focus, +.ui.selection.dropdown:focus, +.ui.checkbox input:focus ~ label::before, +.ui.checkbox input:not([type="radio"]):indeterminate:focus ~ label::before, +.ui.checkbox input:checked:focus ~ label::before, +.ui.radio.checkbox input:focus:checked ~ label::before { + background: var(--color-input-background); + border-color: var(--color-primary); + color: var(--color-input-text); +} + +.ui.form .field > label, +.ui.form .inline.fields > label, +.ui.form .inline.fields .field > label, +.ui.form .inline.fields .field > p, +.ui.form .inline.field > label, +.ui.form .inline.field > p, +.ui.checkbox label, +.ui.checkbox + label, +.ui.checkbox label:hover, +.ui.checkbox + label:hover, +.ui.checkbox input:focus ~ label, +.ui.checkbox input:active ~ label { + color: var(--color-text); +} + +.ui.input, +.ui.checkbox input:focus ~ label::after, +.ui.checkbox input:checked ~ label::after, +.ui.checkbox label:active::after, +.ui.checkbox input:not([type="radio"]):indeterminate ~ label::after, +.ui.checkbox input:not([type="radio"]):indeterminate:focus ~ label::after, +.ui.checkbox input:checked:focus ~ label::after, +.ui.disabled.checkbox label, +.ui.checkbox input[disabled] ~ label { + color: var(--color-input-text); +} + +.ui.radio.checkbox input:focus ~ label::after, +.ui.radio.checkbox input:checked ~ label::after, +.ui.radio.checkbox input:focus:checked ~ label::after { + background: var(--color-input-text); +} + +.ui.toggle.checkbox label::before { + background: var(--color-input-toggle-background); +} + +.ui.toggle.checkbox label, +.ui.toggle.checkbox input:checked ~ label, +.ui.toggle.checkbox input:focus:checked ~ label { + color: var(--color-text) !important; +} + +.ui.toggle.checkbox input:checked ~ label::before, +.ui.toggle.checkbox input:focus:checked ~ label::before { + background: var(--color-primary) !important; +} + +/* match