Compare commits

...

15 commits

Author SHA1 Message Date
Daniel James
7ec322b982
Merge bd77b30372 into b7db1b0844 2025-05-03 17:48:53 +01:00
Marc Alexander
b7db1b0844
Merge pull request #6803 from rxu/ticket/17496
[ticket/17496] Fix Implicitly marking parameters as nullable PHP deprecations
2025-05-02 20:20:57 +02:00
rxu
0066d53c08
[ticket/17496] Fix recently added changes
PHPBB-17496
2025-05-02 22:48:59 +07:00
rxu
1b08a74508
[ticket/17496] Sniffer to support question mark nullable type syntax
PHPBB-17496
2025-05-02 22:48:59 +07:00
rxu
a5113d7cd3
[ticket/17496] Correctly restore willReturn()
PHPBB-17496
2025-05-02 22:48:59 +07:00
rxu
0f94e1cb13
[ticket/17496] Fix tests
PHPBB-17496
2025-05-02 22:48:58 +07:00
rxu
c6dcf474d3
[ticket/17496] Upgrade to the most recent GuzzleHTTP 7.9
PHPBB-17496
2025-05-02 22:48:58 +07:00
rxu
d0cb7d6389
[ticket/17496] Fix tests
PHPUnit will automatically create a test double
of required return type to be returned

PHPBB-17496
2025-05-02 22:48:57 +07:00
rxu
118ab73c37
[ticket/17496] Upgrade to GuzzleHTTP 7.8 as PHP 8.4-compatible
PHPBB-17496
2025-05-02 22:48:57 +07:00
rxu
91aaadbc6d
[ticket/17496] Unused use statements sniffer to check union types
PHPBB-17496
2025-05-02 22:48:57 +07:00
rxu
7d1ae5bf19
[ticket/17496] Fix Implicitly marking parameters as nullable PHP deprecations
Also use union types consistently instead of question marks.
Fixed with php-cs-fixer.

PHPBB-17496
2025-05-02 22:48:46 +07:00
Daniel James
bd77b30372 [ticket/17437] Add prosilver2 dir to repo
PHPBB-17437
2024-11-22 17:36:46 +00:00
Daniel James
dc260ea9c8 [ticket/17437] Undo changes and create prosilver2 style
PHPBB-17437
2024-11-22 17:35:01 +00:00
Daniel James
b263906387 [ticket/17437] Update style name in overall_header
PHPBB-17437
2024-11-22 17:16:41 +00:00
Daniel James
b4f3878845 [ticket/17437] Begin changes on the prosilver v2 redesign
PHPBB-17437
2024-11-22 10:41:17 +00:00
243 changed files with 19617 additions and 170 deletions

View file

@ -49,9 +49,20 @@ class phpbb_Sniffs_Namespaces_UnusedUseSniff implements Sniff
$phpcsFile->addError($error, $stack_pointer, 'FullName'); $phpcsFile->addError($error, $stack_pointer, 'FullName');
} }
if ($found_name === $short_name) /*
* Check for possible union types (like string|MyType|null)
* and question mark nullable type syntax (like ?MyType)
*/
$types = explode('|', $found_name);
foreach ($types as $type)
{ {
return true; // Nullable type syntax
$type = (strpos($type, '?') === 0) ? substr($type, 1) : $type;
if ($short_name === $type)
{
return true;
}
} }
return false; return false;

View file

@ -39,7 +39,7 @@
"composer/package-versions-deprecated": "^1.11", "composer/package-versions-deprecated": "^1.11",
"doctrine/dbal": "~3.3.6", "doctrine/dbal": "~3.3.6",
"google/recaptcha": "~1.1", "google/recaptcha": "~1.1",
"guzzlehttp/guzzle": "~6.3", "guzzlehttp/guzzle": " ^7.0",
"marc1706/fast-image-size": "^1.1", "marc1706/fast-image-size": "^1.1",
"minishlink/web-push": "^8.0", "minishlink/web-push": "^8.0",
"s9e/text-formatter": "^2.0", "s9e/text-formatter": "^2.0",

124
phpBB/composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "96d8bdaa91db532b0a0bf5e1b6c0ec31", "content-hash": "5ed4369e5ba29297443f428dd3001fae",
"packages": [ "packages": [
{ {
"name": "bantu/ini-get-wrapper", "name": "bantu/ini-get-wrapper",
@ -1700,37 +1700,47 @@
}, },
{ {
"name": "guzzlehttp/guzzle", "name": "guzzlehttp/guzzle",
"version": "6.5.8", "version": "7.9.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/guzzle.git", "url": "https://github.com/guzzle/guzzle.git",
"reference": "a52f0440530b54fa079ce76e8c5d196a42cad981" "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981", "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77",
"reference": "a52f0440530b54fa079ce76e8c5d196a42cad981", "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-json": "*", "ext-json": "*",
"guzzlehttp/promises": "^1.0", "guzzlehttp/promises": "^1.5.3 || ^2.0.3",
"guzzlehttp/psr7": "^1.9", "guzzlehttp/psr7": "^2.7.0",
"php": ">=5.5", "php": "^7.2.5 || ^8.0",
"symfony/polyfill-intl-idn": "^1.17" "psr/http-client": "^1.0",
"symfony/deprecation-contracts": "^2.2 || ^3.0"
},
"provide": {
"psr/http-client-implementation": "1.0"
}, },
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
"ext-curl": "*", "ext-curl": "*",
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", "guzzle/client-integration-tests": "3.0.2",
"psr/log": "^1.1" "php-http/message-factory": "^1.1",
"phpunit/phpunit": "^8.5.39 || ^9.6.20",
"psr/log": "^1.1 || ^2.0 || ^3.0"
}, },
"suggest": { "suggest": {
"ext-curl": "Required for CURL handler support",
"ext-intl": "Required for Internationalized Domain Name (IDN) support",
"psr/log": "Required for using the Log middleware" "psr/log": "Required for using the Log middleware"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "bamarni-bin": {
"dev-master": "6.5-dev" "bin-links": true,
"forward-command": false
} }
}, },
"autoload": { "autoload": {
@ -1783,19 +1793,20 @@
} }
], ],
"description": "Guzzle is a PHP HTTP client library", "description": "Guzzle is a PHP HTTP client library",
"homepage": "http://guzzlephp.org/",
"keywords": [ "keywords": [
"client", "client",
"curl", "curl",
"framework", "framework",
"http", "http",
"http client", "http client",
"psr-18",
"psr-7",
"rest", "rest",
"web service" "web service"
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/guzzle/issues", "issues": "https://github.com/guzzle/guzzle/issues",
"source": "https://github.com/guzzle/guzzle/tree/6.5.8" "source": "https://github.com/guzzle/guzzle/tree/7.9.3"
}, },
"funding": [ "funding": [
{ {
@ -1811,33 +1822,37 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-06-20T22:16:07+00:00" "time": "2025-03-27T13:37:11+00:00"
}, },
{ {
"name": "guzzlehttp/promises", "name": "guzzlehttp/promises",
"version": "1.5.3", "version": "2.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/promises.git", "url": "https://github.com/guzzle/promises.git",
"reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e" "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e", "url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c",
"reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e", "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=5.5" "php": "^7.2.5 || ^8.0"
}, },
"require-dev": { "require-dev": {
"symfony/phpunit-bridge": "^4.4 || ^5.1" "bamarni/composer-bin-plugin": "^1.8.2",
"phpunit/phpunit": "^8.5.39 || ^9.6.20"
}, },
"type": "library", "type": "library",
"extra": {
"bamarni-bin": {
"bin-links": true,
"forward-command": false
}
},
"autoload": { "autoload": {
"files": [
"src/functions_include.php"
],
"psr-4": { "psr-4": {
"GuzzleHttp\\Promise\\": "src/" "GuzzleHttp\\Promise\\": "src/"
} }
@ -1874,7 +1889,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/promises/issues", "issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/1.5.3" "source": "https://github.com/guzzle/promises/tree/2.2.0"
}, },
"funding": [ "funding": [
{ {
@ -1890,42 +1905,48 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-05-21T12:31:43+00:00" "time": "2025-03-27T13:27:01+00:00"
}, },
{ {
"name": "guzzlehttp/psr7", "name": "guzzlehttp/psr7",
"version": "1.9.1", "version": "2.7.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/psr7.git", "url": "https://github.com/guzzle/psr7.git",
"reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b" "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/e4490cabc77465aaee90b20cfc9a770f8c04be6b", "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16",
"reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b", "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=5.4.0", "php": "^7.2.5 || ^8.0",
"psr/http-message": "~1.0", "psr/http-factory": "^1.0",
"ralouphie/getallheaders": "^2.0.5 || ^3.0.0" "psr/http-message": "^1.1 || ^2.0",
"ralouphie/getallheaders": "^3.0"
}, },
"provide": { "provide": {
"psr/http-factory-implementation": "1.0",
"psr/http-message-implementation": "1.0" "psr/http-message-implementation": "1.0"
}, },
"require-dev": { "require-dev": {
"ext-zlib": "*", "bamarni/composer-bin-plugin": "^1.8.2",
"phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" "http-interop/http-factory-tests": "0.9.0",
"phpunit/phpunit": "^8.5.39 || ^9.6.20"
}, },
"suggest": { "suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
}, },
"type": "library", "type": "library",
"extra": {
"bamarni-bin": {
"bin-links": true,
"forward-command": false
}
},
"autoload": { "autoload": {
"files": [
"src/functions_include.php"
],
"psr-4": { "psr-4": {
"GuzzleHttp\\Psr7\\": "src/" "GuzzleHttp\\Psr7\\": "src/"
} }
@ -1964,6 +1985,11 @@
"name": "Tobias Schultze", "name": "Tobias Schultze",
"email": "webmaster@tubo-world.de", "email": "webmaster@tubo-world.de",
"homepage": "https://github.com/Tobion" "homepage": "https://github.com/Tobion"
},
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com",
"homepage": "https://sagikazarmark.hu"
} }
], ],
"description": "PSR-7 message implementation that also provides common utility methods", "description": "PSR-7 message implementation that also provides common utility methods",
@ -1979,7 +2005,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/psr7/issues", "issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/1.9.1" "source": "https://github.com/guzzle/psr7/tree/2.7.1"
}, },
"funding": [ "funding": [
{ {
@ -1995,7 +2021,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-04-17T16:00:37+00:00" "time": "2025-03-27T12:30:47+00:00"
}, },
{ {
"name": "justinrainbow/json-schema", "name": "justinrainbow/json-schema",
@ -2802,16 +2828,16 @@
}, },
{ {
"name": "psr/http-message", "name": "psr/http-message",
"version": "1.1", "version": "2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-fig/http-message.git", "url": "https://github.com/php-fig/http-message.git",
"reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
"reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2820,7 +2846,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.1.x-dev" "dev-master": "2.0.x-dev"
} }
}, },
"autoload": { "autoload": {
@ -2835,7 +2861,7 @@
"authors": [ "authors": [
{ {
"name": "PHP-FIG", "name": "PHP-FIG",
"homepage": "http://www.php-fig.org/" "homepage": "https://www.php-fig.org/"
} }
], ],
"description": "Common interface for HTTP messages", "description": "Common interface for HTTP messages",
@ -2849,9 +2875,9 @@
"response" "response"
], ],
"support": { "support": {
"source": "https://github.com/php-fig/http-message/tree/1.1" "source": "https://github.com/php-fig/http-message/tree/2.0"
}, },
"time": "2023-04-04T09:50:52+00:00" "time": "2023-04-04T09:54:51+00:00"
}, },
{ {
"name": "psr/log", "name": "psr/log",

View file

@ -130,7 +130,7 @@ function phpbb_gmgetdate($time = false)
* *
* @return array|string data array if $string_only is false * @return array|string data array if $string_only is false
*/ */
function get_formatted_filesize($value, bool $string_only = true, array $allowed_units = null) function get_formatted_filesize($value, bool $string_only = true, array|null $allowed_units = null)
{ {
global $user; global $user;
@ -253,7 +253,7 @@ function still_on_time($extra_time = 15)
* @return mixed Boolean (true, false) if comparison operator is specified. * @return mixed Boolean (true, false) if comparison operator is specified.
* Integer (-1, 0, 1) otherwise. * Integer (-1, 0, 1) otherwise.
*/ */
function phpbb_version_compare(string $version1, string $version2, string $operator = null) function phpbb_version_compare(string $version1, string $version2, string|null $operator = null)
{ {
$version1 = strtolower($version1); $version1 = strtolower($version1);
$version2 = strtolower($version2); $version2 = strtolower($version2);

View file

@ -215,7 +215,7 @@ function adm_back_link($u_action)
* *
* @return array * @return array
*/ */
function build_select(array $options_ary, int|string|bool $option_default = false): array function build_select(array $options_ary, bool|int|string $option_default = false): array
{ {
global $language; global $language;

View file

@ -82,7 +82,7 @@ abstract class driver implements \phpbb\avatar\driver\driver_interface
* @param \phpbb\path_helper $path_helper phpBB path helper * @param \phpbb\path_helper $path_helper phpBB path helper
* @param \phpbb\cache\driver\driver_interface|null $cache Cache driver * @param \phpbb\cache\driver\driver_interface|null $cache Cache driver
*/ */
public function __construct(\phpbb\config\config $config, \FastImageSize\FastImageSize $imagesize, $phpbb_root_path, $php_ext, \phpbb\path_helper $path_helper, \phpbb\cache\driver\driver_interface $cache = null) public function __construct(\phpbb\config\config $config, \FastImageSize\FastImageSize $imagesize, $phpbb_root_path, $php_ext, \phpbb\path_helper $path_helper, \phpbb\cache\driver\driver_interface|null $cache = null)
{ {
$this->config = $config; $this->config = $config;
$this->imagesize = $imagesize; $this->imagesize = $imagesize;

View file

@ -28,7 +28,7 @@ class email extends base
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
public function get_user_column(): ?string public function get_user_column(): string|null
{ {
return 'user_email'; return 'user_email';
} }

View file

@ -31,7 +31,7 @@ class ip extends base
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function get_user_column(): ?string public function get_user_column(): string|null
{ {
return null; return null;
} }

View file

@ -33,7 +33,7 @@ interface type_interface
* *
* @return string|null * @return string|null
*/ */
public function get_user_column(): ?string; public function get_user_column(): string|null;
/** /**
* Sets a user object to the ban type to have it excluded * Sets a user object to the ban type to have it excluded

View file

@ -48,7 +48,7 @@ class class_loader
* @param string $php_ext The file extension for PHP files * @param string $php_ext The file extension for PHP files
* @param \phpbb\cache\driver\driver_interface|null $cache An implementation of the phpBB cache interface. * @param \phpbb\cache\driver\driver_interface|null $cache An implementation of the phpBB cache interface.
*/ */
public function __construct($namespace, $path, $php_ext = 'php', \phpbb\cache\driver\driver_interface $cache = null) public function __construct($namespace, $path, $php_ext = 'php', \phpbb\cache\driver\driver_interface|null $cache = null)
{ {
if ($namespace[0] !== '\\') if ($namespace[0] !== '\\')
{ {
@ -69,7 +69,7 @@ class class_loader
* *
* @param \phpbb\cache\driver\driver_interface|null $cache An implementation of the phpBB cache interface. * @param \phpbb\cache\driver\driver_interface|null $cache An implementation of the phpBB cache interface.
*/ */
public function set_cache(\phpbb\cache\driver\driver_interface $cache = null) public function set_cache(\phpbb\cache\driver\driver_interface|null $cache = null)
{ {
if ($cache) if ($cache)
{ {

View file

@ -29,7 +29,7 @@ class runtime_exception extends base
* @param \Exception|null $previous The previous runtime_exception used for the runtime_exception chaining. * @param \Exception|null $previous The previous runtime_exception used for the runtime_exception chaining.
* @param integer $code The Exception code. * @param integer $code The Exception code.
*/ */
public function __construct($prefix, $message = '', array $parameters = [], \Exception $previous = null, $code = 0) public function __construct($prefix, $message = '', array $parameters = [], \Exception|null $previous = null, $code = 0)
{ {
parent::__construct($prefix . $message, $parameters, $previous, $code); parent::__construct($prefix . $message, $parameters, $previous, $code);
} }

View file

@ -68,7 +68,7 @@ class extension_manager extends manager
* @param string $root_path phpBB root path * @param string $root_path phpBB root path
* @param config|null $config Config object * @param config|null $config Config object
*/ */
public function __construct(installer $installer, driver_interface $cache, ext_manager $extension_manager, filesystem $filesystem, $package_type, $exception_prefix, $root_path, config $config = null) public function __construct(installer $installer, driver_interface $cache, ext_manager $extension_manager, filesystem $filesystem, $package_type, $exception_prefix, $root_path, config|null $config = null)
{ {
$this->extension_manager = $extension_manager; $this->extension_manager = $extension_manager;
$this->filesystem = $filesystem; $this->filesystem = $filesystem;
@ -86,7 +86,7 @@ class extension_manager extends manager
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function pre_install(array $packages, IOInterface $io = null) public function pre_install(array $packages, IOInterface|null $io = null)
{ {
$installed_manually = array_intersect(array_keys($this->extension_manager->all_available()), array_keys($packages)); $installed_manually = array_intersect(array_keys($this->extension_manager->all_available()), array_keys($packages));
if (count($installed_manually) !== 0) if (count($installed_manually) !== 0)
@ -98,7 +98,7 @@ class extension_manager extends manager
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function post_install(array $packages, IOInterface $io = null) public function post_install(array $packages, IOInterface|null $io = null)
{ {
if ($this->enable_on_install) if ($this->enable_on_install)
{ {
@ -127,7 +127,7 @@ class extension_manager extends manager
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
protected function pre_update(array $packages, IOInterface $io = null) protected function pre_update(array $packages, IOInterface|null $io = null)
{ {
/** @psalm-suppress InvalidArgument */ /** @psalm-suppress InvalidArgument */
$io->writeError([['DISABLING_EXTENSIONS', [], 1]]); $io->writeError([['DISABLING_EXTENSIONS', [], 1]]);
@ -158,7 +158,7 @@ class extension_manager extends manager
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
protected function post_update(array $packages, IOInterface $io = null) protected function post_update(array $packages, IOInterface|null $io = null)
{ {
/** @psalm-suppress InvalidArgument */ /** @psalm-suppress InvalidArgument */
$io->writeError([['ENABLING_EXTENSIONS', [], 1]]); $io->writeError([['ENABLING_EXTENSIONS', [], 1]]);
@ -184,7 +184,7 @@ class extension_manager extends manager
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function remove(array $packages, IOInterface $io = null) public function remove(array $packages, IOInterface|null $io = null)
{ {
$packages = $this->normalize_version($packages); $packages = $this->normalize_version($packages);
@ -200,7 +200,7 @@ class extension_manager extends manager
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function pre_remove(array $packages, IOInterface $io = null) public function pre_remove(array $packages, IOInterface|null $io = null)
{ {
if ($this->purge_on_remove) if ($this->purge_on_remove)
{ {

View file

@ -101,7 +101,7 @@ class installer
* @param request $request phpBB request object * @param request $request phpBB request object
* @param config|null $config Config object * @param config|null $config Config object
*/ */
public function __construct($root_path, filesystem $filesystem, request $request, config $config = null) public function __construct($root_path, filesystem $filesystem, request $request, config|null $config = null)
{ {
if ($config) if ($config)
{ {
@ -135,7 +135,7 @@ class installer
* *
* @throws runtime_exception * @throws runtime_exception
*/ */
public function install(array $packages, $whitelist, IOInterface $io = null) public function install(array $packages, $whitelist, IOInterface|null $io = null)
{ {
$this->wrap(function() use ($packages, $whitelist, $io) { $this->wrap(function() use ($packages, $whitelist, $io) {
$this->do_install($packages, $whitelist, $io); $this->do_install($packages, $whitelist, $io);
@ -155,7 +155,7 @@ class installer
* @throws runtime_exception * @throws runtime_exception
* @throws JsonValidationException * @throws JsonValidationException
*/ */
protected function do_install(array $packages, $whitelist, io\io_interface $io = null) protected function do_install(array $packages, $whitelist, io\io_interface|null $io = null)
{ {
if (!$io) if (!$io)
{ {
@ -232,7 +232,7 @@ class installer
* @return Composer|PartialComposer * @return Composer|PartialComposer
* @throws JsonValidationException * @throws JsonValidationException
*/ */
protected function get_composer(?string $config_file): PartialComposer protected function get_composer(string|null $config_file): PartialComposer
{ {
static $composer_factory; static $composer_factory;
if (!$composer_factory) if (!$composer_factory)

View file

@ -46,7 +46,7 @@ class html_output_formatter extends \Composer\Console\HtmlOutputFormatter
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function format(?string $message): ?string public function format(string|null $message): string|null
{ {
$formatted = parent::format($message); $formatted = parent::format($message);

View file

@ -28,7 +28,7 @@ class web_io extends BufferIO implements io_interface
* @param int $verbosity Verbosity level * @param int $verbosity Verbosity level
* @param OutputFormatterInterface|null $formatter Output formatter * @param OutputFormatterInterface|null $formatter Output formatter
*/ */
public function __construct(language $language, $input = '', $verbosity = StreamOutput::VERBOSITY_NORMAL, OutputFormatterInterface $formatter = null) public function __construct(language $language, $input = '', $verbosity = StreamOutput::VERBOSITY_NORMAL, OutputFormatterInterface|null $formatter = null)
{ {
$this->language = $language; $this->language = $language;

View file

@ -74,7 +74,7 @@ class manager implements manager_interface
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function install(array $packages, IOInterface $io = null) public function install(array $packages, IOInterface|null $io = null)
{ {
$packages = $this->normalize_version($packages); $packages = $this->normalize_version($packages);
@ -103,7 +103,7 @@ class manager implements manager_interface
* Each entry may be a name or an array associating a version constraint to a name * Each entry may be a name or an array associating a version constraint to a name
* @param IOInterface|null $io IO object used for the output * @param IOInterface|null $io IO object used for the output
*/ */
protected function pre_install(array $packages, IOInterface $io = null) protected function pre_install(array $packages, IOInterface|null $io = null)
{ {
} }
@ -114,14 +114,14 @@ class manager implements manager_interface
* Each entry may be a name or an array associating a version constraint to a name * Each entry may be a name or an array associating a version constraint to a name
* @param IOInterface|null $io IO object used for the output * @param IOInterface|null $io IO object used for the output
*/ */
protected function post_install(array $packages, IOInterface $io = null) protected function post_install(array $packages, IOInterface|null $io = null)
{ {
} }
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function update(array $packages, IOInterface $io = null) public function update(array $packages, IOInterface|null $io = null)
{ {
$packages = $this->normalize_version($packages); $packages = $this->normalize_version($packages);
@ -148,7 +148,7 @@ class manager implements manager_interface
* Each entry may be a name or an array associating a version constraint to a name * Each entry may be a name or an array associating a version constraint to a name
* @param IOInterface|null $io IO object used for the output * @param IOInterface|null $io IO object used for the output
*/ */
protected function pre_update(array $packages, IOInterface $io = null) protected function pre_update(array $packages, IOInterface|null $io = null)
{ {
} }
@ -159,14 +159,14 @@ class manager implements manager_interface
* Each entry may be a name or an array associating a version constraint to a name * Each entry may be a name or an array associating a version constraint to a name
* @param IOInterface|null $io IO object used for the output * @param IOInterface|null $io IO object used for the output
*/ */
protected function post_update(array $packages, IOInterface $io = null) protected function post_update(array $packages, IOInterface|null $io = null)
{ {
} }
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function remove(array $packages, IOInterface $io = null) public function remove(array $packages, IOInterface|null $io = null)
{ {
$packages = $this->normalize_version($packages); $packages = $this->normalize_version($packages);
@ -195,7 +195,7 @@ class manager implements manager_interface
* Each entry may be a name or an array associating a version constraint to a name * Each entry may be a name or an array associating a version constraint to a name
* @param IOInterface|null $io IO object used for the output * @param IOInterface|null $io IO object used for the output
*/ */
protected function pre_remove(array $packages, IOInterface $io = null) protected function pre_remove(array $packages, IOInterface|null $io = null)
{ {
} }
@ -206,7 +206,7 @@ class manager implements manager_interface
* Each entry may be a name or an array associating a version constraint to a name * Each entry may be a name or an array associating a version constraint to a name
* @param IOInterface|null $io IO object used for the output * @param IOInterface|null $io IO object used for the output
*/ */
protected function post_remove(array $packages, IOInterface $io = null) protected function post_remove(array $packages, IOInterface|null $io = null)
{ {
} }

View file

@ -30,7 +30,7 @@ interface manager_interface
* *
* @throws runtime_exception * @throws runtime_exception
*/ */
public function install(array $packages, IOInterface $io = null); public function install(array $packages, IOInterface|null $io = null);
/** /**
* Updates or installs a set of packages * Updates or installs a set of packages
@ -41,7 +41,7 @@ interface manager_interface
* *
* @throws runtime_exception * @throws runtime_exception
*/ */
public function update(array $packages, IOInterface $io = null); public function update(array $packages, IOInterface|null $io = null);
/** /**
* Removes a set of packages * Removes a set of packages
@ -52,7 +52,7 @@ interface manager_interface
* *
* @throws runtime_exception * @throws runtime_exception
*/ */
public function remove(array $packages, IOInterface $io = null); public function remove(array $packages, IOInterface|null $io = null);
/** /**
* Tells whether or not a package is managed by Composer. * Tells whether or not a package is managed by Composer.

View file

@ -53,7 +53,7 @@ class resolver implements ControllerResolverInterface
* @param string $phpbb_root_path Relative path to phpBB root * @param string $phpbb_root_path Relative path to phpBB root
* @param \phpbb\template\template|null $template * @param \phpbb\template\template|null $template
*/ */
public function __construct(ContainerInterface $container, $phpbb_root_path, \phpbb\template\template $template = null) public function __construct(ContainerInterface $container, $phpbb_root_path, \phpbb\template\template|null $template = null)
{ {
$this->container = $container; $this->container = $container;
$this->template = $template; $this->template = $template;

View file

@ -42,7 +42,7 @@ class datetime extends \DateTime
* @param string $time String in a format accepted by strtotime(). * @param string $time String in a format accepted by strtotime().
* @param \DateTimeZone|null $timezone Time zone of the time. * @param \DateTimeZone|null $timezone Time zone of the time.
*/ */
public function __construct($user, $time = 'now', \DateTimeZone $timezone = null) public function __construct($user, $time = 'now', \DateTimeZone|null $timezone = null)
{ {
$this->user = $user; $this->user = $user;
$timezone = $timezone ?: $this->user->timezone; $timezone = $timezone ?: $this->user->timezone;

View file

@ -73,10 +73,10 @@ class connection_factory
public static function get_connection_from_params( public static function get_connection_from_params(
string $driver, string $driver,
string $host, string $host,
?string $user = null, string|null $user = null,
?string $password = null, string|null $password = null,
?string $name = null, string|null $name = null,
?string $port = null): Connection string|null $port = null): Connection
{ {
$available_drivers = DriverManager::getAvailableDrivers(); $available_drivers = DriverManager::getAvailableDrivers();
if (!in_array($driver, $available_drivers)) if (!in_array($driver, $available_drivers))

View file

@ -37,11 +37,11 @@ class connection_parameter_factory
*/ */
public static function get_configuration( public static function get_configuration(
string $driver, string $driver,
?string $host = null, string|null $host = null,
?string $user = null, string|null $user = null,
?string $password = null, string|null $password = null,
?string $name = null, string|null $name = null,
?string $port = null) : array string|null $port = null) : array
{ {
$params = [ $params = [
'driver' => $driver, 'driver' => $driver,
@ -73,11 +73,11 @@ class connection_parameter_factory
*/ */
private static function build_connection_parameters( private static function build_connection_parameters(
array $params, array $params,
?string $host = null, string|null $host = null,
?string $user = null, string|null $user = null,
?string $password = null, string|null $password = null,
?string $name = null, string|null $name = null,
?string $port = null) : array string|null $port = null) : array
{ {
if ($params['driver'] === 'pdo_sqlite') if ($params['driver'] === 'pdo_sqlite')
{ {
@ -120,7 +120,7 @@ class connection_parameter_factory
* *
* @return array Doctrine's DBAL configuration for SQLite. * @return array Doctrine's DBAL configuration for SQLite.
*/ */
private static function build_sqlite_parameters(array $params, string $path, ?string $user, ?string $password) : array private static function build_sqlite_parameters(array $params, string $path, string|null $user, string|null $password) : array
{ {
$params['path'] = $path; $params['path'] = $path;

View file

@ -29,7 +29,7 @@ abstract class container_aware_migration extends migration implements ContainerA
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function setContainer(ContainerInterface $container = null) public function setContainer(ContainerInterface|null $container = null)
{ {
$this->container = $container; $this->container = $container;
} }

View file

@ -101,7 +101,7 @@ class remove_jabber extends migration
]; ];
} }
public function move_jabber_to_email_notifications(?int $start) public function move_jabber_to_email_notifications(int|null $start)
{ {
$limit = 1000; $limit = 1000;

View file

@ -240,7 +240,7 @@ class schema_generator
* @param mixed $data Array of values to be set. * @param mixed $data Array of values to be set.
* @param callable|null $value_transform Callback to transform the value being set. * @param callable|null $value_transform Callback to transform the value being set.
*/ */
private static function set_all(&$schema, $data, ?callable $value_transform = null) private static function set_all(&$schema, $data, callable|null $value_transform = null)
{ {
$data = (!is_array($data)) ? [$data] : $data; $data = (!is_array($data)) ? [$data] : $data;
foreach ($data as $key => $change) foreach ($data as $key => $change)
@ -317,7 +317,7 @@ class schema_generator
* *
* @return Closure|null The value transformation callback or null if it is not needed. * @return Closure|null The value transformation callback or null if it is not needed.
*/ */
private static function get_value_transform(string $change_type, string $schema_type) : ?Closure private static function get_value_transform(string $change_type, string $schema_type) : Closure|null
{ {
if ($change_type !== 'add') if ($change_type !== 'add')
{ {

View file

@ -24,7 +24,7 @@ class error_handler extends ErrorHandler
/** /**
* @psalm-suppress MethodSignatureMismatch * @psalm-suppress MethodSignatureMismatch
*/ */
public function __construct(BufferingLogger $bootstrappingLogger = null, private readonly bool $debug = false) // phpcs:ignore Generic.CodeAnalysis.UselessOverridingMethod.Found public function __construct(BufferingLogger|null $bootstrappingLogger = null, private readonly bool $debug = false) // phpcs:ignore Generic.CodeAnalysis.UselessOverridingMethod.Found
{ {
parent::__construct($bootstrappingLogger, $debug); parent::__construct($bootstrappingLogger, $debug);
} }

View file

@ -52,7 +52,7 @@ class dispatcher extends EventDispatcher implements dispatcher_interface
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function dispatch(object $event, string $eventName = null) : object public function dispatch(object $event, string|null $eventName = null) : object
{ {
if ($this->disabled) if ($this->disabled)
{ {

View file

@ -39,7 +39,7 @@ class recursive_event_filter_iterator extends \RecursiveFilterIterator
* *
* @return recursive_event_filter_iterator * @return recursive_event_filter_iterator
*/ */
public function getChildren(): ?\RecursiveFilterIterator public function getChildren(): \RecursiveFilterIterator|null
{ {
$inner_iterator = $this->getInnerIterator(); $inner_iterator = $this->getInnerIterator();
assert($inner_iterator instanceof \RecursiveIterator); assert($inner_iterator instanceof \RecursiveIterator);

View file

@ -44,7 +44,7 @@ class http_exception extends runtime_exception implements HttpExceptionInterface
* @param array $headers Additional headers to set in the response. * @param array $headers Additional headers to set in the response.
* @param integer $code The Exception code. * @param integer $code The Exception code.
*/ */
public function __construct($status_code, $message = "", array $parameters = array(), \Exception $previous = null, array $headers = array(), $code = 0) public function __construct($status_code, $message = "", array $parameters = array(), \Exception|null $previous = null, array $headers = array(), $code = 0)
{ {
$this->status_code = $status_code; $this->status_code = $status_code;
$this->headers = $headers; $this->headers = $headers;

View file

@ -35,7 +35,7 @@ class runtime_exception extends \RuntimeException implements exception_interface
* @param \Exception|null $previous The previous runtime_exception used for the runtime_exception chaining. * @param \Exception|null $previous The previous runtime_exception used for the runtime_exception chaining.
* @param integer $code The Exception code. * @param integer $code The Exception code.
*/ */
public function __construct($message = "", array $parameters = array(), \Exception $previous = null, $code = 0) public function __construct($message = "", array $parameters = array(), \Exception|null $previous = null, $code = 0)
{ {
$this->parameters = $parameters; $this->parameters = $parameters;

View file

@ -47,7 +47,7 @@ class manager
* @param \phpbb\cache\service|null $cache A cache instance or null * @param \phpbb\cache\service|null $cache A cache instance or null
* @param string $cache_name The name of the cache variable, defaults to _ext * @param string $cache_name The name of the cache variable, defaults to _ext
*/ */
public function __construct(ContainerInterface $container, \phpbb\db\driver\driver_interface $db, \phpbb\config\config $config, finder_factory $finder_factory, $extension_table, $phpbb_root_path, \phpbb\cache\service $cache = null, $cache_name = '_ext') public function __construct(ContainerInterface $container, \phpbb\db\driver\driver_interface $db, \phpbb\config\config $config, finder_factory $finder_factory, $extension_table, $phpbb_root_path, \phpbb\cache\service|null $cache = null, $cache_name = '_ext')
{ {
$this->cache = $cache; $this->cache = $cache;
$this->cache_name = $cache_name; $this->cache_name = $cache_name;

View file

@ -15,7 +15,7 @@ namespace phpbb\feed\exception;
class no_feed_exception extends feed_unavailable_exception class no_feed_exception extends feed_unavailable_exception
{ {
public function __construct(\Exception $previous = null, $code = 0) public function __construct(\Exception|null $previous = null, $code = 0)
{ {
parent::__construct('NO_FEED', array(), $previous, $code); parent::__construct('NO_FEED', array(), $previous, $code);
} }

View file

@ -15,7 +15,7 @@ namespace phpbb\feed\exception;
class no_forum_exception extends feed_unavailable_exception class no_forum_exception extends feed_unavailable_exception
{ {
public function __construct($forum_id, \Exception $previous = null, $code = 0) public function __construct($forum_id, \Exception|null $previous = null, $code = 0)
{ {
parent::__construct('NO_FORUM', array($forum_id), $previous, $code); parent::__construct('NO_FORUM', array($forum_id), $previous, $code);
} }

View file

@ -15,7 +15,7 @@ namespace phpbb\feed\exception;
class no_topic_exception extends feed_unavailable_exception class no_topic_exception extends feed_unavailable_exception
{ {
public function __construct($topic_id, \Exception $previous = null, $code = 0) public function __construct($topic_id, \Exception|null $previous = null, $code = 0)
{ {
parent::__construct('NO_TOPIC', array($topic_id), $previous, $code); parent::__construct('NO_TOPIC', array($topic_id), $previous, $code);
} }

View file

@ -15,7 +15,7 @@ namespace phpbb\feed\exception;
class unauthorized_forum_exception extends unauthorized_exception class unauthorized_forum_exception extends unauthorized_exception
{ {
public function __construct($forum_id, \Exception $previous = null, $code = 0) public function __construct($forum_id, \Exception|null $previous = null, $code = 0)
{ {
parent::__construct('SORRY_AUTH_READ', array($forum_id), $previous, $code); parent::__construct('SORRY_AUTH_READ', array($forum_id), $previous, $code);
} }

View file

@ -15,7 +15,7 @@ namespace phpbb\feed\exception;
class unauthorized_topic_exception extends unauthorized_exception class unauthorized_topic_exception extends unauthorized_exception
{ {
public function __construct($topic_id, \Exception $previous = null, $code = 0) public function __construct($topic_id, \Exception|null $previous = null, $code = 0)
{ {
parent::__construct('SORRY_AUTH_READ_TOPIC', array($topic_id), $previous, $code); parent::__construct('SORRY_AUTH_READ_TOPIC', array($topic_id), $previous, $code);
} }

View file

@ -103,7 +103,7 @@ class filespec
* @param \phpbb\mimetype\guesser|null $mimetype_guesser Mime type guesser * @param \phpbb\mimetype\guesser|null $mimetype_guesser Mime type guesser
* @param \phpbb\plupload\plupload|null $plupload Plupload * @param \phpbb\plupload\plupload|null $plupload Plupload
*/ */
public function __construct(\phpbb\filesystem\filesystem_interface $phpbb_filesystem, language $language, \bantu\IniGetWrapper\IniGetWrapper $php_ini, \FastImageSize\FastImageSize $imagesize, $phpbb_root_path, \phpbb\mimetype\guesser $mimetype_guesser = null, \phpbb\plupload\plupload $plupload = null) public function __construct(\phpbb\filesystem\filesystem_interface $phpbb_filesystem, language $language, \bantu\IniGetWrapper\IniGetWrapper $php_ini, \FastImageSize\FastImageSize $imagesize, $phpbb_root_path, \phpbb\mimetype\guesser|null $mimetype_guesser = null, \phpbb\plupload\plupload|null $plupload = null)
{ {
$this->filesystem = $phpbb_filesystem; $this->filesystem = $phpbb_filesystem;
$this->language = $language; $this->language = $language;

View file

@ -86,7 +86,7 @@ class filespec_storage
* @param \phpbb\mimetype\guesser|null $mimetype_guesser Mime type guesser * @param \phpbb\mimetype\guesser|null $mimetype_guesser Mime type guesser
* @param \phpbb\plupload\plupload|null $plupload Plupload * @param \phpbb\plupload\plupload|null $plupload Plupload
*/ */
public function __construct(language $language, \FastImageSize\FastImageSize $imagesize, \phpbb\mimetype\guesser $mimetype_guesser = null, \phpbb\plupload\plupload $plupload = null) public function __construct(language $language, \FastImageSize\FastImageSize $imagesize, \phpbb\mimetype\guesser|null $mimetype_guesser = null, \phpbb\plupload\plupload|null $plupload = null)
{ {
$this->language = $language; $this->language = $language;
$this->imagesize = $imagesize; $this->imagesize = $imagesize;

View file

@ -26,7 +26,7 @@ class filesystem_exception extends runtime_exception
* @param \Exception|null $previous The previous runtime_exception used for the runtime_exception chaining. * @param \Exception|null $previous The previous runtime_exception used for the runtime_exception chaining.
* @param integer $code The Exception code. * @param integer $code The Exception code.
*/ */
public function __construct($message = '', $filename = '', $parameters = array(), \Exception $previous = null, $code = 0) public function __construct($message = '', $filename = '', $parameters = array(), \Exception|null $previous = null, $code = 0)
{ {
parent::__construct($message, array_merge(array('filename' => $filename), $parameters), $previous, $code); parent::__construct($message, array_merge(array('filename' => $filename), $parameters), $previous, $code);
} }

View file

@ -293,7 +293,7 @@ class filesystem implements filesystem_interface
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function mirror($origin_dir, $target_dir, \Traversable $iterator = null, $options = array()) public function mirror($origin_dir, $target_dir, \Traversable|null $iterator = null, $options = array())
{ {
try try
{ {

View file

@ -190,7 +190,7 @@ interface filesystem_interface
* The filename which triggered the error can be * The filename which triggered the error can be
* retrieved by filesystem_exception::get_filename() * retrieved by filesystem_exception::get_filename()
*/ */
public function mirror($origin_dir, $target_dir, \Traversable $iterator = null, $options = array()); public function mirror($origin_dir, $target_dir, \Traversable|null $iterator = null, $options = array());
/** /**
* Creates a directory recursively. * Creates a directory recursively.

View file

@ -33,7 +33,7 @@ class factory
* @param string $phpbb_root_path Path to the phpbb root directory * @param string $phpbb_root_path Path to the phpbb root directory
* @param string $php_ext php file extension * @param string $php_ext php file extension
*/ */
public function __construct(?service $cache, bool $use_cache, string $phpbb_root_path, string $php_ext) public function __construct(service|null $cache, bool $use_cache, string $phpbb_root_path, string $php_ext)
{ {
$this->cache = $cache; $this->cache = $cache;
$this->use_cache = $use_cache; $this->use_cache = $use_cache;

View file

@ -58,7 +58,7 @@ class finder
* @param string $cache_name The name of the cache variable, defaults to * @param string $cache_name The name of the cache variable, defaults to
* _ext_finder * _ext_finder
*/ */
public function __construct(?service $cache, bool $use_cache, string $phpbb_root_path, string $php_ext, string $cache_name = '_ext_finder') public function __construct(service|null $cache, bool $use_cache, string $phpbb_root_path, string $php_ext, string $cache_name = '_ext_finder')
{ {
$this->phpbb_root_path = $phpbb_root_path; $this->phpbb_root_path = $phpbb_root_path;
$this->cache = $cache; $this->cache = $cache;

View file

@ -52,7 +52,7 @@ class form_helper
* *
* @return array Array containing form_token and creation_time of form token * @return array Array containing form_token and creation_time of form token
*/ */
public function get_form_tokens(string $form_name, ?int &$now = 0, ?string &$token_sid = '', ?string &$token = ''): array public function get_form_tokens(string $form_name, int|null &$now = 0, string|null &$token_sid = '', string|null &$token = ''): array
{ {
$now = time(); $now = time();
$token_sid = ($this->user->data['user_id'] == ANONYMOUS && !empty($this->config['form_token_sid_guests'])) ? $this->user->session_id : ''; $token_sid = ($this->user->data['user_id'] == ANONYMOUS && !empty($this->config['form_token_sid_guests'])) ? $this->user->session_id : '';
@ -71,7 +71,7 @@ class form_helper
* @param int|null $timespan Lifetime of token or null if default value should be used * @param int|null $timespan Lifetime of token or null if default value should be used
* @return bool True if form token is valid, false if not * @return bool True if form token is valid, false if not
*/ */
public function check_form_tokens(string $form_name, ?int $timespan = null): bool public function check_form_tokens(string $form_name, int|null $timespan = null): bool
{ {
if ($timespan === null) if ($timespan === null)
{ {

View file

@ -74,7 +74,7 @@ abstract class database_task extends task_base
* *
* @return Result|null Result of the query. * @return Result|null Result of the query.
*/ */
protected function query(string $sql) : ?Result protected function query(string $sql) : Result|null
{ {
try try
{ {
@ -95,7 +95,7 @@ abstract class database_task extends task_base
* *
* @return Statement|null The prepared statement object or null if preparing failed * @return Statement|null The prepared statement object or null if preparing failed
*/ */
protected function create_prepared_stmt(string $sql): ?Statement protected function create_prepared_stmt(string $sql): Statement|null
{ {
try try
{ {
@ -155,7 +155,7 @@ abstract class database_task extends task_base
* *
* @return int|null The last insert ID. * @return int|null The last insert ID.
*/ */
protected function get_last_insert_id() : ?int protected function get_last_insert_id() : int|null
{ {
try try
{ {

View file

@ -38,7 +38,7 @@ trait sequential_task
* *
* @throws resource_limit_reached_exception When resources are exhausted. * @throws resource_limit_reached_exception When resources are exhausted.
*/ */
protected function execute(config $config, array $data, ?string $counter_name = null) : void protected function execute(config $config, array $data, string|null $counter_name = null) : void
{ {
if ($counter_name === null) if ($counter_name === null)
{ {

View file

@ -119,8 +119,8 @@ abstract class base implements messenger_interface
user $user, user $user,
string $phpbb_root_path, string $phpbb_root_path,
string $template_cache_path, string $template_cache_path,
?manager $ext_manager = null, manager|null $ext_manager = null,
?log_interface $log = null log_interface|null $log = null
) )
{ {
$this->assets_bag = $assets_bag; $this->assets_bag = $assets_bag;
@ -469,7 +469,7 @@ abstract class base implements messenger_interface
* *
* @return void * @return void
*/ */
protected function set_template_paths(string|array $path_name, string|array $paths): void protected function set_template_paths(array|string $path_name, array|string $paths): void
{ {
$this->setup_template(); $this->setup_template();
$this->template->set_custom_style($path_name, $paths); $this->template->set_custom_style($path_name, $paths);

View file

@ -91,7 +91,7 @@ class email extends messenger_base
* method additionally checks if the type provides an email template. * method additionally checks if the type provides an email template.
* @return bool * @return bool
*/ */
public function is_available(type_interface $notification_type = null) public function is_available(type_interface|null $notification_type = null)
{ {
return parent::is_available($notification_type) && $this->config['email_enable'] && !empty($this->user->data['user_email']); return parent::is_available($notification_type) && $this->config['email_enable'] && !empty($this->user->data['user_email']);
} }

View file

@ -59,7 +59,7 @@ abstract class messenger_base extends \phpbb\notification\method\base
* only if the type is provided and if it doesn't provide an email template. * only if the type is provided and if it doesn't provide an email template.
* @return bool * @return bool
*/ */
public function is_available(type_interface $notification_type = null) public function is_available(type_interface|null $notification_type = null)
{ {
return $notification_type === null || $notification_type->get_email_template() !== false; return $notification_type === null || $notification_type->get_email_template() !== false;
} }

View file

@ -101,7 +101,7 @@ class webpush extends base implements extended_method_interface
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
public function is_available(type_interface $notification_type = null): bool public function is_available(type_interface|null $notification_type = null): bool
{ {
return $this->config['webpush_enable'] return $this->config['webpush_enable']
&& $this->config['webpush_vapid_public'] && $this->config['webpush_vapid_public']

View file

@ -57,7 +57,7 @@ class request implements request_interface
* Initialises the request class, that means it stores all input data in {@link $input input} * Initialises the request class, that means it stores all input data in {@link $input input}
* and then calls {@link \phpbb\request\deactivated_super_global \phpbb\request\deactivated_super_global} * and then calls {@link \phpbb\request\deactivated_super_global \phpbb\request\deactivated_super_global}
*/ */
public function __construct(\phpbb\request\type_cast_helper_interface $type_cast_helper = null, $disable_super_globals = true) public function __construct(\phpbb\request\type_cast_helper_interface|null $type_cast_helper = null, $disable_super_globals = true)
{ {
if ($type_cast_helper) if ($type_cast_helper)
{ {

View file

@ -48,7 +48,7 @@ class default_resources_locator implements resources_locator_interface
* @param string $environment Name of the current environment * @param string $environment Name of the current environment
* @param manager|null $extension_manager Extension manager * @param manager|null $extension_manager Extension manager
*/ */
public function __construct($phpbb_root_path, $environment, manager $extension_manager = null) public function __construct($phpbb_root_path, $environment, manager|null $extension_manager = null)
{ {
$this->phpbb_root_path = $phpbb_root_path; $this->phpbb_root_path = $phpbb_root_path;
$this->environment = $environment; $this->environment = $environment;

View file

@ -316,7 +316,7 @@ abstract class base implements search_backend_interface
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function create_index(int &$post_counter = 0): ?array public function create_index(int &$post_counter = 0): array|null
{ {
$max_post_id = $this->get_max_post_id(); $max_post_id = $this->get_max_post_id();
$forums_indexing_enabled = $this->forum_ids_with_indexing_enabled(); $forums_indexing_enabled = $this->forum_ids_with_indexing_enabled();
@ -377,7 +377,7 @@ abstract class base implements search_backend_interface
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function delete_index(int &$post_counter = null): ?array public function delete_index(int|null &$post_counter = null): array|null
{ {
$max_post_id = $this->get_max_post_id(); $max_post_id = $this->get_max_post_id();

View file

@ -912,7 +912,7 @@ class fulltext_mysql extends base implements search_backend_interface
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function create_index(int &$post_counter = 0): ?array public function create_index(int &$post_counter = 0): array|null
{ {
// Make sure we can actually use MySQL with fulltext indexes // Make sure we can actually use MySQL with fulltext indexes
if ($error = $this->init()) if ($error = $this->init())
@ -984,7 +984,7 @@ class fulltext_mysql extends base implements search_backend_interface
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function delete_index(int &$post_counter = null): ?array public function delete_index(int|null &$post_counter = null): array|null
{ {
// Make sure we can actually use MySQL with fulltext indexes // Make sure we can actually use MySQL with fulltext indexes
if ($error = $this->init()) if ($error = $this->init())

View file

@ -1621,7 +1621,7 @@ class fulltext_native extends base implements search_backend_interface
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function delete_index(int &$post_counter = null): ?array public function delete_index(int|null &$post_counter = null): array|null
{ {
$truncate_tables = [ $truncate_tables = [
$this->search_wordlist_table, $this->search_wordlist_table,

View file

@ -867,7 +867,7 @@ class fulltext_postgres extends base implements search_backend_interface
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function create_index(int &$post_counter = 0): ?array public function create_index(int &$post_counter = 0): array|null
{ {
// Make sure we can actually use PostgreSQL with fulltext indexes // Make sure we can actually use PostgreSQL with fulltext indexes
if ($error = $this->init()) if ($error = $this->init())
@ -926,7 +926,7 @@ class fulltext_postgres extends base implements search_backend_interface
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function delete_index(int &$post_counter = null): ?array public function delete_index(int|null &$post_counter = null): array|null
{ {
// Make sure we can actually use PostgreSQL with fulltext indexes // Make sure we can actually use PostgreSQL with fulltext indexes
if ($error = $this->init()) if ($error = $this->init())

View file

@ -629,7 +629,7 @@ class fulltext_sphinx implements search_backend_interface
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function create_index(int &$post_counter = 0): ?array public function create_index(int &$post_counter = 0): array|null
{ {
if (!$this->index_created()) if (!$this->index_created())
{ {
@ -656,7 +656,7 @@ class fulltext_sphinx implements search_backend_interface
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function delete_index(int &$post_counter = null): ?array public function delete_index(int|null &$post_counter = null): array|null
{ {
if ($this->index_created()) if ($this->index_created())
{ {

View file

@ -163,7 +163,7 @@ interface search_backend_interface
* @param int $post_counter * @param int $post_counter
* @return array|null array with current status or null if finished * @return array|null array with current status or null if finished
*/ */
public function create_index(int &$post_counter = 0): ?array; public function create_index(int &$post_counter = 0): array|null;
/** /**
* Drop fulltext index * Drop fulltext index
@ -171,7 +171,7 @@ interface search_backend_interface
* @param int $post_counter * @param int $post_counter
* @return array|null array with current status or null if finished * @return array|null array with current status or null if finished
*/ */
public function delete_index(int &$post_counter = 0): ?array; public function delete_index(int &$post_counter = 0): array|null;
/** /**
* Returns true if both FULLTEXT indexes exist * Returns true if both FULLTEXT indexes exist

View file

@ -28,7 +28,7 @@ class config
* @param string $name The name of the section that shall be returned * @param string $name The name of the section that shall be returned
* @return config_section|null The section object or null if none was found * @return config_section|null The section object or null if none was found
*/ */
public function get_section_by_name(string $name): ?config_section public function get_section_by_name(string $name): config_section|null
{ {
for ($i = 0, $size = count($this->sections); $i < $size; $i++) for ($i = 0, $size = count($this->sections); $i < $size; $i++)
{ {

View file

@ -60,7 +60,7 @@ class config_section extends config_item
* @return config_variable|null The first variable object from this section with the * @return config_variable|null The first variable object from this section with the
* given name or null if none was found * given name or null if none was found
*/ */
public function get_variable_by_name(string $name): ?config_variable public function get_variable_by_name(string $name): config_variable|null
{ {
for ($i = 0, $size = count($this->variables); $i < $size; $i++) for ($i = 0, $size = count($this->variables); $i < $size; $i++)
{ {

View file

@ -26,7 +26,7 @@ class storage_exception extends runtime_exception
* @param \Exception|null $previous The previous runtime_exception used for the runtime_exception chaining * @param \Exception|null $previous The previous runtime_exception used for the runtime_exception chaining
* @param integer $code The Exception code * @param integer $code The Exception code
*/ */
public function __construct($message = '', $filename = '', $parameters = [], \Exception $previous = null, $code = 0) public function __construct($message = '', $filename = '', $parameters = [], \Exception|null $previous = null, $code = 0)
{ {
parent::__construct($message, array_merge(array('filename' => $filename), $parameters), $previous, $code); parent::__construct($message, array_merge(array('filename' => $filename), $parameters), $previous, $code);
} }

View file

@ -66,7 +66,7 @@ class environment extends \Twig\Environment
* @param dispatcher_interface|null $phpbb_dispatcher Event dispatcher object * @param dispatcher_interface|null $phpbb_dispatcher Event dispatcher object
* @param array $options Array of options to pass to Twig * @param array $options Array of options to pass to Twig
*/ */
public function __construct(assets_bag $assets_bag, config $phpbb_config, filesystem $filesystem, path_helper $path_helper, $cache_path, manager $extension_manager = null, LoaderInterface $loader = null, dispatcher_interface $phpbb_dispatcher = null, $options = array()) public function __construct(assets_bag $assets_bag, config $phpbb_config, filesystem $filesystem, path_helper $path_helper, $cache_path, manager|null $extension_manager = null, LoaderInterface|null $loader = null, dispatcher_interface|null $phpbb_dispatcher = null, $options = array())
{ {
$this->phpbb_config = $phpbb_config; $this->phpbb_config = $phpbb_config;
@ -271,7 +271,7 @@ class environment extends \Twig\Environment
* @return \Twig\Template A template instance representing the given template name * @return \Twig\Template A template instance representing the given template name
* @throws \Twig\Error\LoaderError * @throws \Twig\Error\LoaderError
*/ */
public function loadTemplate(string $cls, string $name, int $index = null) : \Twig\Template public function loadTemplate(string $cls, string $name, int|null $index = null) : \Twig\Template
{ {
if (strpos($name, '@') === false) if (strpos($name, '@') === false)
{ {

View file

@ -70,7 +70,7 @@ class avatar extends AbstractExtension
* *
* @return string The avatar HTML for the specified mode * @return string The avatar HTML for the specified mode
*/ */
public function get_avatar(environment $environment, string $mode, array $row, ?string $alt, ?bool $ignore_config, ?bool $lazy): string public function get_avatar(environment $environment, string $mode, array $row, string|null $alt, bool|null $ignore_config, bool|null $lazy): string
{ {
$alt = $alt ?? false; $alt = $alt ?? false;
$ignore_config = $ignore_config ?? false; $ignore_config = $ignore_config ?? false;

View file

@ -70,9 +70,9 @@ class twig extends \phpbb\template\base
\phpbb\template\context $context, \phpbb\template\context $context,
environment $twig_environment, environment $twig_environment,
$cache_path, $cache_path,
\phpbb\user $user = null, \phpbb\user|null $user = null,
$extensions = [], $extensions = [],
\phpbb\extension\manager $extension_manager = null \phpbb\extension\manager|null $extension_manager = null
) )
{ {
$this->path_helper = $path_helper; $this->path_helper = $path_helper;

View file

@ -709,7 +709,7 @@ class user extends \phpbb\session
* @param ?\DateTimeZone $timezone Time zone of the time. * @param ?\DateTimeZone $timezone Time zone of the time.
* @return \phpbb\datetime Date time object linked to the current users locale * @return \phpbb\datetime Date time object linked to the current users locale
*/ */
public function create_datetime(string $time = 'now', ?\DateTimeZone $timezone = null) public function create_datetime(string $time = 'now', \DateTimeZone|null $timezone = null)
{ {
$timezone = $timezone ?: $this->create_timezone(); $timezone = $timezone ?: $this->create_timezone();
return new $this->datetime($this, $time, $timezone); return new $this->datetime($this, $time, $timezone);
@ -723,7 +723,7 @@ class user extends \phpbb\session
* @param ?\DateTimeZone $timezone Timezone of the date/time, falls back to timezone of current user * @param ?\DateTimeZone $timezone Timezone of the date/time, falls back to timezone of current user
* @return string|false Returns the unix timestamp or false if date is invalid * @return string|false Returns the unix timestamp or false if date is invalid
*/ */
public function get_timestamp_from_format($format, $time, ?\DateTimeZone $timezone = null) public function get_timestamp_from_format($format, $time, \DateTimeZone|null $timezone = null)
{ {
$timezone = $timezone ?: $this->create_timezone(); $timezone = $timezone ?: $this->create_timezone();
$date = \DateTime::createFromFormat($format, $time, $timezone); $date = \DateTime::createFromFormat($format, $time, $timezone);

View file

@ -0,0 +1,25 @@
{
"name": "phpbb/phpbb-style-prosilver-2",
"description": "phpBB Forum Software default style",
"type": "phpbb-style",
"version": "4.0.0-a1-dev",
"homepage": "https://www.phpbb.com",
"license": "GPL-2.0",
"authors": [
{
"name": "phpBB Limited",
"email": "operations@phpbb.com",
"homepage": "https://www.phpbb.com/go/authors"
}
],
"support": {
"issues": "https://tracker.phpbb.com",
"forum": "https://www.phpbb.com/community/",
"irc": "irc://irc.freenode.org/phpbb"
},
"extra": {
"display-name": "prosilver2",
"phpbb-version": "4.0.0-a1-dev",
"parent-style": ""
}
}

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M4 15V9h8V4.16L19.84 12L12 19.84V15z"/></svg>

After

Width:  |  Height:  |  Size: 159 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M480 32c0-12.9-7.8-24.6-19.8-29.6s-25.7-2.2-34.9 6.9L381.7 53c-48 48-113.1 75-181 75H192 160 64c-35.3 0-64 28.7-64 64v96c0 35.3 28.7 64 64 64l0 128c0 17.7 14.3 32 32 32h64c17.7 0 32-14.3 32-32V352l8.7 0c67.9 0 133 27 181 75l43.6 43.6c9.2 9.2 22.9 11.9 34.9 6.9s19.8-16.6 19.8-29.6V300.4c18.6-8.8 32-32.5 32-60.4s-13.4-51.6-32-60.4V32zm-64 76.7V240 371.3C357.2 317.8 280.5 288 200.7 288H192V192h8.7c79.8 0 156.5-29.8 215.3-83.3z"/></svg>

After

Width:  |  Height:  |  Size: 659 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M9 22a1 1 0 0 1-1-1v-3H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-6.1l-3.7 3.71c-.2.19-.45.29-.7.29zm1-6v3.08L13.08 16H20V4H4v12zM6 7h12v2H6zm0 4h9v2H6z"/></svg>

After

Width:  |  Height:  |  Size: 299 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M16 15H9v-2h7zm3-4H9V9h10zm0-4H9V5h10zM3 5v16h16v2H3a2 2 0 0 1-2-2V5zm18-4a2 2 0 0 1 2 2v14c0 1.11-.89 2-2 2H7a2 2 0 0 1-2-2V3c0-1.11.89-2 2-2zM7 3v14h14V3z"/></svg>

After

Width:  |  Height:  |  Size: 279 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M5 3c-1.11 0-2 .89-2 2v14c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2V5c0-1.11-.89-2-2-2zm0 2h14v14H5zm2 2v2h10V7zm0 4v2h10v-2zm0 4v2h7v-2z"/></svg>

After

Width:  |  Height:  |  Size: 254 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M6 2a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6zm0 2h7v5h5v11H6zm2 8v2h8v-2zm0 4v2h5v-2z"/></svg>

After

Width:  |  Height:  |  Size: 224 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M17.66 11.2c-.23-.3-.51-.56-.77-.82c-.67-.6-1.43-1.03-2.07-1.66C13.33 7.26 13 4.85 13.95 3c-.95.23-1.78.75-2.49 1.32c-2.59 2.08-3.61 5.75-2.39 8.9c.04.1.08.2.08.33c0 .22-.15.42-.35.5c-.23.1-.47.04-.66-.12a.58.58 0 0 1-.14-.17c-1.13-1.43-1.31-3.48-.55-5.12C5.78 10 4.87 12.3 5 14.47c.06.5.12 1 .29 1.5c.14.6.41 1.2.71 1.73c1.08 1.73 2.95 2.97 4.96 3.22c2.14.27 4.43-.12 6.07-1.6c1.83-1.66 2.47-4.32 1.53-6.6l-.13-.26c-.21-.46-.77-1.26-.77-1.26m-3.16 6.3c-.28.24-.74.5-1.1.6c-1.12.4-2.24-.16-2.9-.82c1.19-.28 1.9-1.16 2.11-2.05c.17-.8-.15-1.46-.28-2.23c-.12-.74-.1-1.37.17-2.06c.19.38.39.76.63 1.06c.77 1 1.98 1.44 2.24 2.8c.04.14.06.28.06.43c.03.82-.33 1.72-.93 2.27"/></svg>

After

Width:  |  Height:  |  Size: 788 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.3c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64H348.7c2.2 20.4 3.3 41.8 3.3 64zm28.8-64H503.9c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64zm112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6c78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7c10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5c11.6 26 20.9 58.2 27 94.7zm-209 0H18.6C48.6 85.9 112.2 29.1 190.6 8.4C165.1 42.6 145.3 96.1 135.3 160zM8.1 192H131.2c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64zM194.7 446.6c-11.6-26-20.9-58.2-27-94.6H344.3c-6.1 36.4-15.5 68.6-27 94.6c-10.5 23.6-22.2 40.7-33.5 51.5C272.6 508.8 263.3 512 256 512s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6C112.2 482.9 48.6 426.1 18.6 352H135.3zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6c25.5-34.2 45.2-87.7 55.3-151.6H493.4z"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M13.5 4A1.5 1.5 0 0 0 12 5.5A1.5 1.5 0 0 0 13.5 7A1.5 1.5 0 0 0 15 5.5A1.5 1.5 0 0 0 13.5 4m-.36 4.77c-1.19.1-4.44 2.69-4.44 2.69c-.2.15-.14.14.02.42c.16.27.14.29.33.16c.2-.13.53-.34 1.08-.68c2.12-1.36.34 1.78-.57 7.07c-.36 2.62 2 1.27 2.61.87c.6-.39 2.21-1.5 2.37-1.61c.22-.15.06-.27-.11-.52c-.12-.17-.24-.05-.24-.05c-.65.43-1.84 1.33-2 .76c-.19-.57 1.03-4.48 1.7-7.17c.11-.64.41-2.04-.75-1.94"/></svg>

After

Width:  |  Height:  |  Size: 517 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.982 2.982 0 0 0 0-4.24a2.982 2.982 0 0 0-4.24 0l-3.53 3.53a2.982 2.982 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.982 2.982 0 0 0 0 4.24a2.982 2.982 0 0 0 4.24 0l3.53-3.53a2.982 2.982 0 0 0 0-4.24a.973.973 0 0 1 0-1.42"/></svg>

After

Width:  |  Height:  |  Size: 663 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M12 17a2 2 0 0 0 2-2a2 2 0 0 0-2-2a2 2 0 0 0-2 2a2 2 0 0 0 2 2m6-9a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V10a2 2 0 0 1 2-2h1V6a5 5 0 0 1 5-5a5 5 0 0 1 5 5v2zm-6-5a3 3 0 0 0-3 3v2h6V6a3 3 0 0 0-3-3"/></svg>

After

Width:  |  Height:  |  Size: 327 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.62L12 2L9.19 8.62L2 9.24l5.45 4.73L5.82 21z"/></svg>

After

Width:  |  Height:  |  Size: 211 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M32 32C32 14.3 46.3 0 64 0H320c17.7 0 32 14.3 32 32s-14.3 32-32 32H290.5l11.4 148.2c36.7 19.9 65.7 53.2 79.5 94.7l1 3c3.3 9.8 1.6 20.5-4.4 28.8s-15.7 13.3-26 13.3H32c-10.3 0-19.9-4.9-26-13.3s-7.7-19.1-4.4-28.8l1-3c13.8-41.5 42.8-74.8 79.5-94.7L93.5 64H64C46.3 64 32 49.7 32 32zM160 384h64v96c0 17.7-14.3 32-32 32s-32-14.3-32-32V384z"/></svg>

After

Width:  |  Height:  |  Size: 564 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 32 32"><path fill="currentColor" d="M9 7c-.621 0-1.227.066-1.813.188a9.238 9.238 0 0 0-.875.218A9.073 9.073 0 0 0 .72 12.5c-.114.27-.227.531-.313.813A8.848 8.848 0 0 0 0 16c0 .93.145 1.813.406 2.656c.004.008-.004.024 0 .032A9.073 9.073 0 0 0 5.5 24.28c.27.114.531.227.813.313A8.83 8.83 0 0 0 9 24.999h14c4.957 0 9-4.043 9-9s-4.043-9-9-9zm0 2c3.879 0 7 3.121 7 7s-3.121 7-7 7s-7-3.121-7-7c0-.242.008-.484.031-.719A6.985 6.985 0 0 1 9 9m5.625 0H23c3.879 0 7 3.121 7 7s-3.121 7-7 7h-8.375C16.675 21.348 18 18.828 18 16c0-2.828-1.324-5.348-3.375-7"/></svg>

After

Width:  |  Height:  |  Size: 630 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 32 32"><path fill="currentColor" d="M9 7c-4.96 0-9 4.035-9 9s4.04 9 9 9h14c4.957 0 9-4.043 9-9s-4.043-9-9-9zm14 2c3.879 0 7 3.121 7 7s-3.121 7-7 7s-7-3.121-7-7s3.121-7 7-7"/></svg>

After

Width:  |  Height:  |  Size: 258 B

View file

@ -0,0 +1,405 @@
/* global phpbb */
(function($) { // Avoid conflicts with other libraries
'use strict';
// This callback will mark all forum icons read
phpbb.addAjaxCallback('mark_forums_read', function(res) {
var readTitle = res.NO_UNREAD_POSTS;
var unreadTitle = res.UNREAD_POSTS;
var iconsArray = {
forum_unread: 'forum_read',
forum_unread_subforum: 'forum_read_subforum',
forum_unread_locked: 'forum_read_locked'
};
$('li.row').find('dl[class*="forum_unread"]').each(function() {
var $this = $(this);
$.each(iconsArray, function(unreadClass, readClass) {
if ($this.hasClass(unreadClass)) {
$this.removeClass(unreadClass).addClass(readClass);
}
});
$this.children('dt[title="' + unreadTitle + '"]').attr('title', readTitle);
});
// Mark subforums read
$('a.subforum[class*="unread"]').removeClass('unread').addClass('read').children('.icon.icon-red').removeClass('icon-red').addClass('icon-blue');
// Mark topics read if we are watching a category and showing active topics
if ($('#active_topics').length) {
phpbb.ajaxCallbacks.mark_topics_read.call(this, res, false);
}
// Update mark forums read links
$('[data-ajax="mark_forums_read"]').attr('href', res.U_MARK_FORUMS);
phpbb.closeDarkenWrapper(3000);
});
/**
* This callback will mark all topic icons read
*
* @param {bool} [update_topic_links=true] Whether "Mark topics read" links
* should be updated. Defaults to true.
*/
phpbb.addAjaxCallback('mark_topics_read', function(res, updateTopicLinks) {
var readTitle = res.NO_UNREAD_POSTS;
var unreadTitle = res.UNREAD_POSTS;
var iconsArray = {
global_unread: 'global_read',
announce_unread: 'announce_read',
sticky_unread: 'sticky_read',
topic_unread: 'topic_read'
};
var iconsState = ['', '_hot', '_hot_mine', '_locked', '_locked_mine', '_mine'];
var unreadClassSelectors;
var classMap = {};
var classNames = [];
if (typeof updateTopicLinks === 'undefined') {
updateTopicLinks = true;
}
$.each(iconsArray, function(unreadClass, readClass) {
$.each(iconsState, function(key, value) {
// Only topics can be hot
if ((value === '_hot' || value === '_hot_mine') && unreadClass !== 'topic_unread') {
return true;
}
classMap[unreadClass + value] = readClass + value;
classNames.push(unreadClass + value);
});
});
unreadClassSelectors = '.' + classNames.join(',.');
$('li.row').find(unreadClassSelectors).each(function() {
var $this = $(this);
$.each(classMap, function(unreadClass, readClass) {
if ($this.hasClass(unreadClass)) {
$this.removeClass(unreadClass).addClass(readClass);
}
});
$this.children('dt[title="' + unreadTitle + '"]').attr('title', readTitle);
});
// Remove link to first unread post
$('a.unread').has('.icon-red').remove();
// Update mark topics read links
if (updateTopicLinks) {
$('[data-ajax="mark_topics_read"]').attr('href', res.U_MARK_TOPICS);
}
phpbb.closeDarkenWrapper(3000);
});
// This callback will mark all notifications read
phpbb.addAjaxCallback('notification.mark_all_read', function(res) {
if (typeof res.success !== 'undefined') {
phpbb.markNotifications($('[data-notification-unread="true"]'), 0);
phpbb.toggleDropdown.call($('#notification-button'));
phpbb.closeDarkenWrapper(3000);
}
});
// This callback will mark a notification read
phpbb.addAjaxCallback('notification.mark_read', function(res) {
if (typeof res.success !== 'undefined') {
var unreadCount = Number($('#notification-button strong').html()) - 1;
phpbb.markNotifications($(this).parent('[data-notification-unread="true"]'), unreadCount);
}
});
/**
* Mark notification popup rows as read.
*
* @param {jQuery} $popup jQuery object(s) to mark read.
* @param {int} unreadCount The new unread notifications count.
*/
phpbb.markNotifications = function($popup, unreadCount) {
// Remove the unread status.
$popup.removeClass('bg2');
$popup.find('a.mark_read').remove();
// Update the notification link to the real URL.
$popup.each(function() {
var link = $(this).find('a');
link.attr('href', link.attr('data-real-url'));
});
// Update the unread count.
$('strong', '#notification-button').html(unreadCount);
// Remove the Mark all read link and hide notification count if there are no unread notifications.
if (!unreadCount) {
$('#mark_all_notifications').remove();
$('#notification-button > strong').addClass('hidden');
}
// Update page title
var $title = $('title');
var originalTitle = $title.text().replace(/(\((\d+)\))/, '');
$title.text((unreadCount ? '(' + unreadCount + ')' : '') + originalTitle);
};
// This callback finds the post from the delete link, and removes it.
phpbb.addAjaxCallback('post_delete', function() {
var $this = $(this),
postId;
if ($this.attr('data-refresh') === undefined) {
postId = $this[0].href.split('&p=')[1];
var post = $this.parents('#p' + postId).css('pointer-events', 'none');
if (post.hasClass('bg1') || post.hasClass('bg2')) {
var posts1 = post.nextAll('.bg1');
post.nextAll('.bg2').removeClass('bg2').addClass('bg1');
posts1.removeClass('bg1').addClass('bg2');
}
post.fadeOut(function() {
$(this).remove();
});
}
});
// This callback removes the approve / disapprove div or link.
phpbb.addAjaxCallback('post_visibility', function(res) {
var remove = (res.visible) ? $(this) : $(this).parents('.post');
$(remove).css('pointer-events', 'none').fadeOut(function() {
$(this).remove();
});
if (res.visible) {
// Remove the "Deleted by" message from the post on restoring.
remove.parents('.post').find('.post_deleted_msg').css('pointer-events', 'none').fadeOut(function() {
$(this).remove();
});
}
});
// This removes the parent row of the link or form that fired the callback.
phpbb.addAjaxCallback('row_delete', function() {
$(this).parents('tr').remove();
});
// This handles friend / foe additions removals.
phpbb.addAjaxCallback('zebra', function(res) {
var zebra;
if (res.success) {
zebra = $('.zebra');
zebra.first().html(res.MESSAGE_TEXT);
zebra.not(':first').html('&nbsp;').prev().html('&nbsp;');
}
});
/**
* This callback updates the poll results after voting.
*/
phpbb.addAjaxCallback('vote_poll', function(res) {
if (typeof res.success !== 'undefined') {
var poll = $(this).closest('.topic_poll');
var panel = poll.find('.panel');
var resultsVisible = poll.find('dl:first-child .resultbar').is(':visible');
var mostVotes = 0;
// Set min-height to prevent the page from jumping when the content changes
var updatePanelHeight = function (height) {
height = (typeof height === 'undefined') ? panel.find('.inner').outerHeight() : height;
panel.css('min-height', height);
};
updatePanelHeight();
// Remove the View results link
if (!resultsVisible) {
poll.find('.poll_view_results').hide(500);
}
if (!res.can_vote) {
poll.find('.polls, .poll_max_votes, .poll_vote, .poll_option_select').fadeOut(500, function () {
poll.find('.resultbar, .poll_option_percent, .poll_total_votes').show();
});
} else {
// If the user can still vote, simply slide down the results
poll.find('.resultbar, .poll_option_percent, .poll_total_votes').show(500);
}
// Get the votes count of the highest poll option
poll.find('[data-poll-option-id]').each(function() {
var option = $(this);
var optionId = option.attr('data-poll-option-id');
mostVotes = (res.vote_counts[optionId] >= mostVotes) ? res.vote_counts[optionId] : mostVotes;
});
// Update the total votes count
poll.find('.poll_total_vote_cnt').html(res.total_votes);
// Update each option
poll.find('[data-poll-option-id]').each(function() {
var $this = $(this);
var optionId = $this.attr('data-poll-option-id');
var voted = (typeof res.user_votes[optionId] !== 'undefined');
var mostVoted = (res.vote_counts[optionId] === mostVotes);
var percent = (!res.total_votes) ? 0 : Math.round((res.vote_counts[optionId] / res.total_votes) * 100);
var percentRel = (mostVotes === 0) ? 0 : Math.round((res.vote_counts[optionId] / mostVotes) * 100);
var altText;
altText = $this.attr('data-alt-text');
if (voted) {
$this.attr('title', $.trim(altText));
} else {
$this.attr('title', '');
};
$this.toggleClass('voted', voted);
$this.toggleClass('most-votes', mostVoted);
// Update the bars
var bar = $this.find('.resultbar div');
var barTimeLapse = (res.can_vote) ? 500 : 1500;
var newBarClass = (percent === 100) ? 'pollbar5' : 'pollbar' + (Math.floor(percent / 20) + 1);
setTimeout(function () {
bar.animate({ width: percentRel + '%' }, 500)
.removeClass('pollbar1 pollbar2 pollbar3 pollbar4 pollbar5')
.addClass(newBarClass)
.html(res.vote_counts[optionId]);
var percentText = percent ? percent + '%' : res.NO_VOTES;
$this.find('.poll_option_percent').html(percentText);
}, barTimeLapse);
});
if (!res.can_vote) {
poll.find('.polls').delay(400).fadeIn(500);
}
// Display "Your vote has been cast." message. Disappears after 5 seconds.
var confirmationDelay = (res.can_vote) ? 300 : 900;
poll.find('.vote-submitted').delay(confirmationDelay).slideDown(200, function() {
if (resultsVisible) {
updatePanelHeight();
}
$(this).delay(5000).fadeOut(500, function() {
resizePanel(300);
});
});
// Remove the gap resulting from removing options
setTimeout(function() {
resizePanel(500);
}, 1500);
var resizePanel = function (time) {
var panelHeight = panel.height();
var innerHeight = panel.find('.inner').outerHeight();
if (panelHeight !== innerHeight) {
panel.css({ minHeight: '', height: panelHeight })
.animate({ height: innerHeight }, time, function () {
panel.css({ minHeight: innerHeight, height: '' });
});
}
};
}
});
/**
* Show poll results when clicking View results link.
*/
$('.poll_view_results a').click(function(e) {
// Do not follow the link
e.preventDefault();
var $poll = $(this).parents('.topic_poll');
$poll.find('.resultbar, .poll_option_percent, .poll_total_votes').show(500);
$poll.find('.poll_view_results').hide(500);
});
$('[data-ajax]').each(function() {
var $this = $(this);
var ajax = $this.attr('data-ajax');
var filter = $this.attr('data-filter');
if (ajax !== 'false') {
var fn = (ajax !== 'true') ? ajax : null;
filter = (filter !== undefined) ? phpbb.getFunctionByName(filter) : null;
phpbb.ajaxify({
selector: this,
refresh: $this.attr('data-refresh') !== undefined,
filter: filter,
callback: fn
});
}
});
/**
* This simply appends #preview to the action of the
* QR action when you click the Full Editor & Preview button
*/
$('#qr_full_editor').click(function() {
$('#qr_postform').attr('action', function(i, val) {
return val + '#preview';
});
});
/**
* Make the display post links to use JS
*/
$('.display_post').click(function(e) {
// Do not follow the link
e.preventDefault();
var postId = $(this).attr('data-post-id');
$('#post_content' + postId).show();
$('#profile' + postId).show();
$('#post_hidden' + postId).hide();
});
/**
* Display hidden post on post review page
*/
$('.display_post_review').on('click', function(e) {
e.preventDefault();
let $displayPostLink = $(this);
$displayPostLink.closest('.post-ignore').removeClass('post-ignore');
$displayPostLink.hide();
});
/**
* Toggle the member search panel in memberlist.php.
*
* If user returns to search page after viewing results the search panel is automatically displayed.
* In any case the link will toggle the display status of the search panel and link text will be
* appropriately changed based on the status of the search panel.
*/
$('#member_search').click(function () {
var $memberlistSearch = $('#memberlist_search');
$memberlistSearch.slideToggle('fast');
phpbb.ajaxCallbacks.alt_text.call(this);
// Focus on the username textbox if it's available and displayed
if ($memberlistSearch.is(':visible')) {
$('#username').focus();
}
return false;
});
/**
* Automatically resize textarea
*/
$(function() {
var $textarea = $('textarea:not(#message-box textarea, .no-auto-resize)');
phpbb.resizeTextArea($textarea, { minHeight: 75, maxHeight: 250 });
phpbb.resizeTextArea($('textarea', '#message-box'));
});
})(jQuery); // Avoid conflicts with other libraries

View file

@ -0,0 +1,75 @@
<!-- EVENT attachment_file_before -->
<!-- BEGIN _file -->
<!-- IF _file.S_DENIED -->
<p>[{_file.DENIED_MESSAGE}]</p>
<!-- ELSE -->
<!-- EVENT attachment_file_prepend -->
<!-- IF _file.S_THUMBNAIL -->
<dl class="thumbnail">
<dt><a href="{_file.U_DOWNLOAD_LINK}"><img src="{_file.THUMB_IMAGE}" class="postimage" alt="{% if _file.COMMENT %}{{ _file.COMMENT|e('html') }}{% else %}{{ _file.DOWNLOAD_NAME }}{% endif %}" title="{_file.DOWNLOAD_NAME} ({_file.FILESIZE} {_file.SIZE_LANG}) {_file.L_DOWNLOAD_COUNT}" /></a></dt>
<!-- IF _file.COMMENT --><dd> {_file.COMMENT}</dd><!-- ENDIF -->
</dl>
<!-- ENDIF -->
<!-- IF _file.S_IMAGE -->
<dl class="file">
<dt class="attach-image"><img src="{_file.U_INLINE_LINK}" class="postimage" alt="{% if _file.COMMENT %}{{ _file.COMMENT|e('html') }}{% else %}{{ _file.DOWNLOAD_NAME }}{% endif %}" onclick="viewableArea(this);" /></dt>
<!-- IF _file.COMMENT --><dd><em>{_file.COMMENT}</em></dd><!-- ENDIF -->
<dd>{_file.DOWNLOAD_NAME} ({_file.FILESIZE} {_file.SIZE_LANG}) {_file.L_DOWNLOAD_COUNT}</dd>
</dl>
<!-- ENDIF -->
<!-- IF _file.S_FILE -->
<dl class="file">
<dt><!-- IF _file.UPLOAD_ICON -->{_file.UPLOAD_ICON} <!-- ENDIF --><a class="postlink" href="{_file.U_DOWNLOAD_LINK}">{_file.DOWNLOAD_NAME}</a></dt>
<!-- IF _file.COMMENT --><dd><em>{_file.COMMENT}</em></dd><!-- ENDIF -->
<dd>({_file.FILESIZE} {_file.SIZE_LANG}) {_file.L_DOWNLOAD_COUNT}</dd>
</dl>
<!-- ENDIF -->
{% if _file.S_AUDIO_FILE %}
<dl class="file">
<dt class="c-file-header">
<audio class="c-file-audio-controls" controls="controls" preload="metadata">
<source class="c-file-audio-source" src="{{ _file.U_DOWNLOAD_LINK }}" type="{{ _file.MIMETYPE }}">
</audio>
</dt>
{% if _file.COMMENT %}
<dd class="c-file-comment">{{ _file.COMMENT }}</dd>
{% endif %}
<dd class="c-file-actions">
{% if _file.UPLOAD_ICON %}
<span class="o-icon c-file-icon">{{ _file.UPLOAD_ICON }}</span>
{% endif %}
<a class="c-file-actions-link postlink" href="{{ _file.U_DOWNLOAD_LINK }}" download>{{ _file.DOWNLOAD_NAME }}</a>
<span class="c-file-actions-meta">({{ _file.FILESIZE }} {{ _file.SIZE_LANG }}) {{ _file.L_DOWNLOAD_COUNT }}</span>
</dd>
</dl>
{% endif %}
{% if _file.S_VIDEO_FILE %}
<dl class="file">
<dt class="c-file-header">
<video class="c-file-video-controls" controls="controls" preload="metadata">
<source class="c-file-video-source" src="{{ _file.U_DOWNLOAD_LINK }}" type="{{ _file.MIMETYPE }}">
</video>
</dt>
{% if _file.COMMENT %}
<dd class="c-file-comment">{{ _file.COMMENT }}</dd>
{% endif %}
<dd class="c-file-actions">
{% if _file.UPLOAD_ICON %}
<span class="o-icon c-file-icon">{{ _file.UPLOAD_ICON }}</span>
{% endif %}
<a class="c-file-actions-link postlink" href="{{ _file.U_DOWNLOAD_LINK }}" download>{{ _file.DOWNLOAD_NAME }}</a>
<span class="c-file-actions-meta">({{ _file.FILESIZE }} {{ _file.SIZE_LANG }}) {{ _file.L_DOWNLOAD_COUNT }}</span>
</dd>
</dl>
{% endif %}
<!-- EVENT attachment_file_append -->
<!-- ENDIF -->
<!-- END _file -->
<!-- EVENT attachment_file_after -->

View file

@ -0,0 +1,93 @@
<!-- BEGIN ulist_open --><ul style="list-style-type: {LIST_TYPE}"><!-- END ulist_open -->
<!-- BEGIN ulist_open_default --><ul><!-- END ulist_open_default -->
<!-- BEGIN ulist_close --></ul><!-- END ulist_close -->
<!-- BEGIN olist_open --><ol style="list-style-type: {LIST_TYPE}"><!-- END olist_open -->
<!-- BEGIN olist_close --></ol><!-- END olist_close -->
<!-- BEGIN listitem --><li><!-- END listitem -->
<!-- BEGIN listitem_close --></li><!-- END listitem_close -->
<!-- BEGIN quote_username_open --><blockquote><div><cite>{USERNAME} {L_WROTE}{L_COLON}</cite><!-- END quote_username_open -->
<!-- BEGIN quote_open --><blockquote class="uncited"><div><!-- END quote_open -->
<!-- BEGIN quote_close --></div></blockquote><!-- END quote_close -->
<!-- BEGIN quote_extended -->
<blockquote>
<xsl:if test="@post_url">
<xsl:attribute name="cite"><xsl:value-of select="@post_url"/></xsl:attribute>
</xsl:if>
<xsl:if test="not(@author)">
<xsl:attribute name="class">uncited</xsl:attribute>
</xsl:if>
<div>
<xsl:if test="@author">
<cite>
<xsl:choose>
<xsl:when test="@url">
<a href="{@url}" class="postlink"><xsl:value-of select="@author"/></a>
</xsl:when>
<xsl:when test="@profile_url">
<a href="{@profile_url}"><xsl:value-of select="@author"/></a>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@author"/>
</xsl:otherwise>
</xsl:choose>
<xsl:text> </xsl:text>
<xsl:value-of select="$L_WROTE"/>
<xsl:value-of select="$L_COLON"/>
<xsl:if test="@post_url">
<xsl:text> </xsl:text>
<a href="{@post_url}" aria-label="{L_VIEW_QUOTED_POST}" data-post-id="{@post_id}" onclick="if(document.getElementById(hash.substr(1)))href=hash"><i class="icon fa-arrow-circle-up fa-fw" aria-hidden="true"></i></a>
</xsl:if>
<xsl:if test="@msg_url">
<xsl:text> </xsl:text>
<a href="{@msg_url}" aria-label="{L_VIEW_QUOTED_POST}" data-msg-id="{@msg_id}"><i class="icon fa-arrow-circle-up fa-fw" aria-hidden="true"></i></a>
</xsl:if>
<xsl:if test="@date">
<span class="responsive-hide"><xsl:value-of select="@date"/></span>
</xsl:if>
</cite>
</xsl:if>
<xsl:apply-templates/>
</div>
</blockquote>
<!-- END quote_extended -->
<!-- BEGIN code_open --><div class="codebox"><p>{L_CODE}{L_COLON} <a href="#" onclick="selectCode(this); return false;">{L_SELECT_ALL_CODE}</a></p><pre><code><!-- END code_open -->
<!-- BEGIN code_close --></code></pre></div><!-- END code_close -->
<!-- BEGIN inline_attachment_open --><div class="inline-attachment"><!-- END inline_attachment_open -->
<!-- BEGIN inline_attachment_close --></div><!-- END inline_attachment_close -->
<!-- BEGIN b_open --><strong class="text-strong"><!-- END b_open -->
<!-- BEGIN b_close --></strong><!-- END b_close -->
<!-- BEGIN u_open --><span style="text-decoration: underline"><!-- END u_open -->
<!-- BEGIN u_close --></span><!-- END u_close -->
<!-- BEGIN i_open --><em class="text-italics"><!-- END i_open -->
<!-- BEGIN i_close --></em><!-- END i_close -->
<!-- BEGIN color --><span style="color: {COLOR}">{TEXT}</span><!-- END color -->
<!-- BEGIN size --><span style="font-size: {SIZE}%; line-height: 116%;">{TEXT}</span><!-- END size -->
<!-- BEGIN img --><img src="{URL}" class="postimage" alt="{L_IMAGE}" /><!-- END img -->
<!-- BEGIN url --><a href="{URL}" class="postlink">{DESCRIPTION}</a><!-- END url -->
<!-- BEGIN email -->
<a>
<xsl:attribute name="href">
<xsl:text>mailto:</xsl:text>
<xsl:value-of select="@email"/>
<xsl:if test="@subject or @body">
<xsl:text>?</xsl:text>
<xsl:if test="@subject">subject=<xsl:value-of select="@subject"/></xsl:if>
<xsl:if test="@body"><xsl:if test="@subject">&amp;</xsl:if>body=<xsl:value-of select="@body"/></xsl:if>
</xsl:if>
</xsl:attribute>
<xsl:apply-templates/>
</a>
<!-- END email -->

View file

@ -0,0 +1,24 @@
<!-- IF S_TYPE == 1 -->
<div class="panel captcha-panel">
<div class="inner">
<h3 class="captcha-title">{L_CONFIRMATION}</h3>
<p>{L_CONFIRM_EXPLAIN}</p>
<fieldset class="fields2">
<!-- ENDIF -->
<dl>
<dt><label for="confirm_code">{L_CONFIRM_CODE}{L_COLON}</label></dt>
<dd class="captcha captcha-image"><img src="{CONFIRM_IMAGE_LINK}" alt="{L_CONFIRM_CODE}" /></dd>
<dd><input type="text" name="confirm_code" id="confirm_code" size="8" maxlength="8" tabindex="{$CAPTCHA_TAB_INDEX}" class="inputbox narrow" title="{L_CONFIRM_CODE}" />
<!-- IF S_CONFIRM_REFRESH --><input type="submit" name="refresh_vc" id="refresh_vc" class="button1 button button-form-bold" value="{L_VC_REFRESH}" /><!-- ENDIF -->
<input type="hidden" name="confirm_id" id="confirm_id" value="{CONFIRM_ID}" /></dd>
<dd>{L_CONFIRM_CODE_EXPLAIN}</dd>
</dl>
<!-- IF S_TYPE == 1 -->
</fieldset>
</div>
</div>
<!-- ENDIF -->

View file

@ -0,0 +1,7 @@
<div class="panel captcha-panel">
<div class="inner">
<h3 class="captcha-title">{{ lang('CONFIRM_CODE') }}</h3>
<p class="error">{{ lang(CONFIRM_LANG, '<a href="' ~ CONTACT_LINK ~ '">', '</a>') }}</p>
</div>
</div>

View file

@ -0,0 +1,21 @@
<!-- IF S_TYPE == 1 -->
<div class="panel captcha-panel">
<div class="inner">
<h3 class="captcha-title">{L_CONFIRMATION}</h3>
<fieldset class="fields2">
<!-- ENDIF -->
<dl>
<dt><label>{QA_CONFIRM_QUESTION}{L_COLON}</label><br /><span>{L_CONFIRM_QUESTION_EXPLAIN}</span></dt>
<dd class="captcha">
<input type="text" tabindex="{$CAPTCHA_TAB_INDEX}" name="qa_answer" id="answer" size="45" class="inputbox autowidth" title="{L_ANSWER}" />
<input type="hidden" name="qa_confirm_id" id="qa_confirm_id" value="{QA_CONFIRM_ID}" />
</dd>
</dl>
<!-- IF S_TYPE == 1 -->
</fieldset>
</div>
</div>
<!-- ENDIF -->

View file

@ -0,0 +1,10 @@
<!-- IF S_RECAPTCHA_AVAILABLE -->
<noscript>
<div>{L_RECAPTCHA_NOSCRIPT}</div>
</noscript>
{% INCLUDEJS RECAPTCHA_SERVER ~ '.js?onload=phpbbRecaptchaOnLoad&hl=' ~ lang('RECAPTCHA_LANG') %}
{# The g-recaptcha class is used in JavaScript #}
<div class="g-recaptcha" data-sitekey="{RECAPTCHA_PUBKEY}" data-callback="phpbbRecaptchaOnSubmit" data-size="invisible" data-tabindex="<!-- IF $CAPTCHA_TAB_INDEX -->{$CAPTCHA_TAB_INDEX}<!-- ELSE -->10<!-- ENDIF -->"></div>
<!-- ELSE -->
{L_RECAPTCHA_NOT_AVAILABLE}
<!-- ENDIF -->

View file

@ -0,0 +1,13 @@
{% if S_RECAPTCHA_AVAILABLE %}
<noscript>
<div>{{ lang('RECAPTCHA_NOSCRIPT') }}</div>
</noscript>
<script src="{{ U_RECAPTCHA_SCRIPT }}" async defer></script>
{# The g-recaptcha class is used in JavaScript #}
<input class="g-recaptcha" type="hidden" name="recaptcha_action" value="{{ RECAPTCHA_ACTION }}" data-recaptcha-v3="{{ RECAPTCHA_KEY }}">
<input type="hidden" name="recaptcha_token" value="">
{% else %}
{{ lang('RECAPTCHA_NOT_AVAILABLE') }}
{% endif %}

View file

@ -0,0 +1,23 @@
{% if CONFIRM_TYPE_REGISTRATION %}
<div class="panel captcha-panel">
<div class="inner">
<h3 class="captcha-title">{{ lang('CONFIRMATION') }}</h3>
<fieldset class="fields2">
{% endif %}
{% if S_TURNSTILE_AVAILABLE %}
<noscript>
<div>{{ lang('CAPTCHA_TURNSTILE_NOSCRIPT') }}</div>
</noscript>
<script src="{{ U_TURNSTILE_SCRIPT }}" async defer></script>
{# The cf-turnstile class is used in JavaScript #}
<div class="cf-turnstile" data-language="{{ lang('TURNSTILE_LANG') }}" data-sitekey="{{ TURNSTILE_SITEKEY }}"{% if TURNSTILE_THEME %} data-theme="{{ TURNSTILE_THEME }}"{% endif %}></div>
{% else %}
{{ lang('CAPTCHA_TURNSTILE_NOT_AVAILABLE') }}
{% endif %}
{% if CONFIRM_TYPE_REGISTRATION %}
</fieldset>
</div>
</div>
{% endif %}

View file

@ -0,0 +1,35 @@
<!-- IF S_AJAX_REQUEST -->
<form action="{S_CONFIRM_ACTION}" method="post">
<h3>{MESSAGE_TITLE}</h3>
<p>{MESSAGE_TEXT}</p>
<fieldset class="submit-buttons">
<input type="button" name="confirm" value="{L_YES}" class="button1 button button-form-bold" />&nbsp;
<input type="button" name="cancel" value="{L_NO}" class="button1 button button-form-bold" />
</fieldset>
</form>
<!-- ELSE -->
<!-- INCLUDE overall_header.html -->
<form id="confirm" action="{S_CONFIRM_ACTION}" method="post">
<div class="panel">
<div class="inner">
<h2 class="message-title">{MESSAGE_TITLE}</h2>
<p>{MESSAGE_TEXT}</p>
<fieldset class="submit-buttons">
{S_HIDDEN_FIELDS}
<input type="submit" name="confirm" value="{L_YES}" class="button1 button button-form-bold" />&nbsp;
<input type="submit" name="cancel" value="{L_NO}" class="button1 button button-form-bold" />
</fieldset>
</div>
</div>
</form>
<!-- INCLUDE overall_footer.html -->
<!-- ENDIF -->

View file

@ -0,0 +1,72 @@
<!-- IF S_AJAX_REQUEST -->
<form action="{S_CONFIRM_ACTION}" method="post">
<p>{MESSAGE_TEXT}</p>
<!-- IF not S_SHADOW_TOPICS -->
<!-- IF not S_SOFTDELETED and S_ALLOWED_DELETE and S_ALLOWED_SOFTDELETE -->
<label>
<strong>{L_DELETE_PERMANENTLY}{L_COLON}</strong>
<input id="delete_permanent" name="delete_permanent" type="checkbox" value="1" {S_CHECKED_PERMANENT} />
<!-- IF S_TOPIC_MODE -->{DELETE_TOPIC_PERMANENTLY_EXPLAIN}<!-- ELSE -->{DELETE_POST_PERMANENTLY_EXPLAIN}<!-- ENDIF -->
</label>
<!-- ENDIF -->
<label for="delete_reason">
<strong>{L_DELETE_REASON}{L_COLON}</strong><br /><span>{L_DELETE_REASON_EXPLAIN}</span><br />
<input type="text" name="delete_reason" value="" class="inputbox autowidth" maxlength="120" size="45" />
</label>
<!-- ENDIF -->
<fieldset class="submit-buttons">
<input type="button" name="confirm" value="{L_YES}" class="button1 button button-form" />&nbsp;
<input type="button" name="cancel" value="{L_NO}" class="button1 button button-form-bold" />
</fieldset>
</form>
<!-- ELSE -->
<!-- INCLUDE overall_header.html -->
<form id="confirm" action="{S_CONFIRM_ACTION}" method="post">
<div class="panel">
<div class="inner">
<h2 class="message-title">{MESSAGE_TITLE}</h2>
<p>{MESSAGE_TEXT}</p>
<!-- IF not S_SHADOW_TOPICS -->
<fieldset class="fields1">
<!-- IF not S_SOFTDELETED and S_ALLOWED_DELETE and S_ALLOWED_SOFTDELETE -->
<dl>
<dt><label for="delete_permanent">{L_DELETE_PERMANENTLY}{L_COLON}</label></dt>
<dd>
<label for="delete_permanent">
<input id="delete_permanent" name="delete_permanent" type="checkbox" value="1" {S_CHECKED_PERMANENT} />
<!-- IF S_TOPIC_MODE -->{DELETE_TOPIC_PERMANENTLY_EXPLAIN}<!-- ELSE -->{DELETE_POST_PERMANENTLY_EXPLAIN}<!-- ENDIF -->
</label>
</dd>
</dl>
<!-- ENDIF -->
{% EVENT confirm_delete_body_delete_reason_before %}
<dl>
<dt><label for="delete_reason">{L_DELETE_REASON}{L_COLON}</label><br /><span>{L_DELETE_REASON_EXPLAIN}</span></dt>
<dd><input type="text" name="delete_reason" id="delete_reason" value="" class="inputbox autowidth" maxlength="120" size="45" /></dd>
</dl>
</fieldset>
<!-- ENDIF -->
<fieldset class="submit-buttons">
{S_HIDDEN_FIELDS}
<input type="submit" name="confirm" value="{L_YES}" class="button1 button button-form" />&nbsp;
<input type="submit" name="cancel" value="{L_NO}" class="button1 button button-form-bold" />
</fieldset>
</div>
</div>
</form>
<!-- INCLUDE overall_footer.html -->
<!-- ENDIF -->

View file

@ -0,0 +1,29 @@
<div class="dropdown-container dropdown-container-left dropdown-button-control sort-tools">
<span title="{L_SORT_OPTIONS}" class="button button-secondary dropdown-trigger dropdown-select">
{{ Icon('font', 'arrow-down-short-wide', '', true, 'fas c-button-icon') }}
<span class="caret">
{{ Icon('font', 'caret-down', '', true, 'fas c-button-icon') }}
</span>
</span>
<div class="dropdown hidden">
<div class="pointer"><div class="pointer-inner"></div></div>
<div class="dropdown-contents">
<fieldset class="display-options">
<!-- IF S_SORT_OPTIONS -->
<label>{L_SORT_BY}{L_COLON} <select name="sk" id="sk">{S_SORT_OPTIONS}</select></label>
<label>{L_SORT_DIRECTION}{L_COLON} <select name="sd" id="sd">{S_ORDER_SELECT}</select></label>
<hr class="dashed" />
<input type="submit" class="button1 button button-form-bold" name="sort" value="{L_SORT}" />
<!-- ELSE -->
<label>{L_DISPLAY}{L_COLON} {S_SELECT_SORT_DAYS}</label>
<!-- IF S_SELECT_SORT_KEY -->
<label>{L_SORT_BY}{L_COLON} {S_SELECT_SORT_KEY}</label>
<label>{L_SORT_DIRECTION}{L_COLON} {S_SELECT_SORT_DIR}</label>
<!-- ENDIF -->
<hr class="dashed" />
<input type="submit" class="button1 button button-form-bold" name="sort" value="{L_GO}" />
<!-- ENDIF -->
</fieldset>
</div>
</div>
</div>

View file

@ -0,0 +1,49 @@
<!-- IF .draftrow -->
<div class="panel">
<div class="inner">
<h3 class="draft-title">{L_LOAD_DRAFT}</h3>
<p>{L_LOAD_DRAFT_EXPLAIN}</p>
</div>
</div>
<div class="<!-- IF not S_PRIVMSGS -->forumbg<!-- ELSE -->panel<!-- ENDIF -->">
<div class="inner">
<ul class="topiclist two-long-columns">
<li class="header">
<dl>
<dt>{L_LOAD_DRAFT}</dt>
<dd class="info">{L_SAVE_DATE}</dd>
</dl>
</li>
</ul>
<ul class="topiclist two-long-columns<!-- IF not S_PRIVMSGS --> topics<!-- ELSE --> cplist<!-- ENDIF -->">
<!-- BEGIN draftrow -->
<li class="row<!-- IF draftrow.S_ROW_COUNT is even --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
<dl>
<dt>
<div class="list-inner">
<a href="{draftrow.U_INSERT}" title="{L_LOAD_DRAFT}" class="topictitle">{draftrow.DRAFT_SUBJECT}</a><br />
<!-- IF not S_PRIVMSGS --><!-- IF draftrow.S_LINK_TOPIC -->{L_TOPIC}{L_COLON} <a href="{draftrow.U_VIEW}">{draftrow.TITLE}</a>
<!-- ELSEIF draftrow.S_LINK_FORUM -->{L_FORUM}{L_COLON} <a href="{draftrow.U_VIEW}">{draftrow.TITLE}</a>
<!-- ELSE -->{L_NO_TOPIC_FORUM}<!-- ENDIF --><!-- ENDIF -->
<div class="responsive-show" style="display: none;">
{L_SAVE_DATE}{L_COLON} <strong>{draftrow.DATE}</strong>
</div>
</div>
</dt>
<dd class="info"><span>{draftrow.DATE}</span></dd>
</dl>
</li>
<!-- END draftrow -->
</ul>
</div>
</div>
<!-- ENDIF -->

View file

@ -0,0 +1,50 @@
<!-- INCLUDE overall_header.html -->
<h2 class="faq-title">{L_FAQ_TITLE}</h2>
<div class="panel bg1" id="faqlinks">
<div class="inner">
<div class="column1">
<!-- BEGIN faq_block -->
<!-- IF faq_block.SWITCH_COLUMN or (SWITCH_COLUMN_MANUALLY and faq_block.S_ROW_COUNT == 4) -->
</div>
<div class="column2">
<!-- ENDIF -->
<dl class="faq">
<dt><strong>{faq_block.BLOCK_TITLE}</strong></dt>
<!-- BEGIN faq_row -->
<dd><a href="#f{faq_block.S_ROW_COUNT}r{faq_block.faq_row.S_ROW_COUNT}">{faq_block.faq_row.FAQ_QUESTION}</a></dd>
<!-- END faq_row -->
</dl>
<!-- END faq_block -->
</div>
</div>
</div>
<!-- BEGIN faq_block -->
<div class="panel <!-- IF faq_block.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
<div class="inner">
<div class="content">
<h2 class="faq-title">{faq_block.BLOCK_TITLE}</h2>
<!-- BEGIN faq_row -->
<dl class="faq">
<dt id="f{faq_block.S_ROW_COUNT}r{faq_block.faq_row.S_ROW_COUNT}"><strong>{faq_block.faq_row.FAQ_QUESTION}</strong></dt>
<dd>{faq_block.faq_row.FAQ_ANSWER}</dd>
</dl>
<a href="#faqlinks" class="top">
{{ Icon('font', 'circle-chevron-up', lang('BACK_TO_TOP'), false) }}
</a>
<!-- IF not faq_block.faq_row.S_LAST_ROW --><hr class="dashed" /><!-- ENDIF -->
<!-- END faq_row -->
</div>
</div>
</div>
<!-- END faq_block -->
<!-- INCLUDE jumpbox.html -->
<!-- INCLUDE overall_footer.html -->

View file

@ -0,0 +1,752 @@
/* global phpbb */
/**
* phpBB3 forum functions
*/
/**
* Find a member
*/
function find_username(url) {
'use strict';
popup(url, 760, 570, '_usersearch');
return false;
}
/**
* Window popup
*/
function popup(url, width, height, name) {
'use strict';
if (!name) {
name = '_popup';
}
window.open(url.replace(/&amp;/g, '&'), name, 'height=' + height + ',resizable=yes,scrollbars=yes, width=' + width);
return false;
}
/**
* Jump to page
*/
function pageJump(item) {
'use strict';
var page = parseInt(item.val(), 10),
perPage = item.attr('data-per-page'),
baseUrl = item.attr('data-base-url'),
startName = item.attr('data-start-name');
if (page !== null && !isNaN(page) && page === Math.floor(page) && page > 0) {
if (baseUrl.indexOf('?') === -1) {
document.location.href = baseUrl + '?' + startName + '=' + ((page - 1) * perPage);
} else {
document.location.href = baseUrl.replace(/&amp;/g, '&') + '&' + startName + '=' + ((page - 1) * perPage);
}
}
}
/**
* Mark/unmark checklist
* id = ID of parent container, name = name prefix, state = state [true/false]
*/
function marklist(id, name, state) {
'use strict';
jQuery('#' + id + ' input[type=checkbox][name]').each(function() {
var $this = jQuery(this);
if ($this.attr('name').substr(0, name.length) === name && !$this.prop('disabled')) {
$this.prop('checked', state);
}
});
}
/**
* Resize viewable area for attached image or topic review panel (possibly others to come)
* e = element
*/
function viewableArea(e, itself) {
'use strict';
if (!e) {
return;
}
if (!itself) {
e = e.parentNode;
}
if (!e.vaHeight) {
// Store viewable area height before changing style to auto
e.vaHeight = e.offsetHeight;
e.vaMaxHeight = e.style.maxHeight;
e.style.height = 'auto';
e.style.maxHeight = 'none';
e.style.overflow = 'visible';
} else {
// Restore viewable area height to the default
e.style.height = e.vaHeight + 'px';
e.style.overflow = 'auto';
e.style.maxHeight = e.vaMaxHeight;
e.vaHeight = false;
}
}
/**
* Alternate display of subPanels
*/
jQuery(function($) {
'use strict';
$('.sub-panels').each(function() {
var $childNodes = $('a[data-subpanel]', this),
panels = $childNodes.map(function () {
return this.getAttribute('data-subpanel');
}),
showPanel = this.getAttribute('data-show-panel');
if (panels.length) {
activateSubPanel(showPanel, panels);
$childNodes.click(function () {
activateSubPanel(this.getAttribute('data-subpanel'), panels);
return false;
});
}
});
});
/**
* Activate specific subPanel
*/
function activateSubPanel(p, panels) {
'use strict';
var i, showPanel;
if (typeof p === 'string') {
showPanel = p;
}
$('input[name="show_panel"]').val(showPanel);
if (typeof panels === 'undefined') {
panels = jQuery('.sub-panels a[data-subpanel]').map(function() {
return this.getAttribute('data-subpanel');
});
}
for (i = 0; i < panels.length; i++) {
jQuery('#' + panels[i]).css('display', panels[i] === showPanel ? 'block' : 'none');
jQuery('#' + panels[i] + '-tab').toggleClass('activetab', panels[i] === showPanel);
}
}
function selectCode(a) {
'use strict';
// Get ID of code block
var e = a.parentNode.parentNode.getElementsByTagName('CODE')[0];
var s, r;
// Not IE and IE9+
if (window.getSelection) {
s = window.getSelection();
// Safari and Chrome
if (s.setBaseAndExtent) {
var l = (e.innerText.length > 1) ? e.innerText.length - 1 : 1;
try {
s.setBaseAndExtent(e, 0, e, l);
} catch (error) {
r = document.createRange();
r.selectNodeContents(e);
s.removeAllRanges();
s.addRange(r);
}
}
// Firefox and Opera
else {
// workaround for bug # 42885
if (window.opera && e.innerHTML.substring(e.innerHTML.length - 4) === '<BR>') {
e.innerHTML = e.innerHTML + '&nbsp;';
}
r = document.createRange();
r.selectNodeContents(e);
s.removeAllRanges();
s.addRange(r);
}
}
// Some older browsers
else if (document.getSelection) {
s = document.getSelection();
r = document.createRange();
r.selectNodeContents(e);
s.removeAllRanges();
s.addRange(r);
}
// IE
else if (document.selection) {
r = document.body.createTextRange();
r.moveToElementText(e);
r.select();
}
}
var inAutocomplete = false;
var lastKeyEntered = '';
/**
* Check event key
*/
function phpbbCheckKey(event) {
'use strict';
// Keycode is array down or up?
if (event.keyCode && (event.keyCode === 40 || event.keyCode === 38)) {
inAutocomplete = true;
}
// Make sure we are not within an "autocompletion" field
if (inAutocomplete) {
// If return pressed and key changed we reset the autocompletion
if (!lastKeyEntered || lastKeyEntered === event.which) {
inAutocomplete = false;
return true;
}
}
// Keycode is not return, then return. ;)
if (event.which !== 13) {
lastKeyEntered = event.which;
return true;
}
return false;
}
/**
* Apply onkeypress event for forcing default submit button on ENTER key press
*/
jQuery(function($) {
'use strict';
$('form input[type=text], form input[type=password]').on('keypress', function (e) {
var defaultButton = $(this).parents('form').find('input[type=submit].default-submit-action');
if (!defaultButton || defaultButton.length <= 0) {
return true;
}
if (phpbbCheckKey(e)) {
return true;
}
if ((e.which && e.which === 13) || (e.keyCode && e.keyCode === 13)) {
defaultButton.click();
return false;
}
return true;
});
});
/**
* Functions for user search popup
*/
function insertUser(formId, value) {
'use strict';
var $form = jQuery(formId),
formName = $form.attr('data-form-name'),
fieldName = $form.attr('data-field-name'),
item = opener.document.forms[formName][fieldName];
if (item.value.length && item.type === 'textarea') {
value = item.value + '\n' + value;
}
item.value = value;
}
function insert_marked_users(formId, users) {
'use strict';
$(users).filter(':checked').each(function() {
insertUser(formId, this.value);
});
window.close();
}
function insert_single_user(formId, user) {
'use strict';
insertUser(formId, user);
window.close();
}
/**
* Parse document block
*/
function parseDocument($container) {
'use strict';
var test = document.createElement('div'),
oldBrowser = (typeof test.style.borderRadius === 'undefined'),
$body = $('body');
/**
* Reset avatar dimensions when changing URL or EMAIL
*/
$container.find('input[data-reset-on-edit]').on('keyup', function() {
$(this.getAttribute('data-reset-on-edit')).val('');
});
/**
* Pagination
*/
$container.find('.pagination .page-jump-form :button').click(function() {
var $input = $(this).siblings('input.inputbox');
pageJump($input);
});
$container.find('.pagination .page-jump-form input.inputbox').on('keypress', function(event) {
if (event.which === 13 || event.keyCode === 13) {
event.preventDefault();
pageJump($(this));
}
});
$container.find('.pagination .dropdown-trigger').click(function() {
var $dropdownContainer = $(this).parent();
// Wait a little bit to make sure the dropdown has activated
setTimeout(function() {
if ($dropdownContainer.hasClass('dropdown-visible')) {
$dropdownContainer.find('input.inputbox').focus();
}
}, 100);
});
/**
* Resize navigation (breadcrumbs) block to keep all links on same line
*/
$container.find('.navlinks').each(function() {
var $this = $(this),
$left = $this.children().not('.rightside'),
$right = $this.children('.rightside');
if ($left.length !== 1 || !$right.length) {
return;
}
function resize() {
var width = 0,
diff = $left.outerWidth(true) - $left.width(),
minWidth = Math.max($this.width() / 3, 240),
maxWidth;
$right.each(function() {
var $this = $(this);
if ($this.is(':visible')) {
width += $this.outerWidth(true);
}
});
maxWidth = $this.width() - width - diff;
$left.css('max-width', Math.floor(Math.max(maxWidth, minWidth)) + 'px');
}
resize();
$(window).resize(resize);
});
/**
* Makes breadcrumbs responsive
*/
$container.find('.breadcrumbs:not([data-skip-responsive])').each(function() {
var $this = $(this),
$links = $this.find('.crumb'),
length = $links.length,
classes = ['wrapped-max', 'wrapped-wide', 'wrapped-medium', 'wrapped-small', 'wrapped-tiny'],
classesLength = classes.length,
maxHeight = 0,
lastWidth = false,
wrapped = false;
// Set tooltips
$this.find('a').each(function() {
var $link = $(this);
$link.attr('title', $link.text());
});
// Function that checks breadcrumbs
function check() {
var height = $this.height(),
width;
// Test max-width set in code for .navlinks above
width = parseInt($this.css('max-width'), 10);
if (!width) {
width = $body.width();
}
maxHeight = parseInt($this.css('line-height'), 10);
$links.each(function() {
if ($(this).height() > 0) {
maxHeight = Math.max(maxHeight, $(this).outerHeight(true));
}
});
if (height <= maxHeight) {
if (!wrapped || lastWidth === false || lastWidth >= width) {
return;
}
}
lastWidth = width;
if (wrapped) {
$this.removeClass('wrapped').find('.crumb.wrapped').removeClass('wrapped ' + classes.join(' '));
if ($this.height() <= maxHeight) {
return;
}
}
wrapped = true;
$this.addClass('wrapped');
if ($this.height() <= maxHeight) {
return;
}
for (var i = 0; i < classesLength; i++) {
for (var j = length - 1; j >= 0; j--) {
$links.eq(j).addClass('wrapped ' + classes[i]);
if ($this.height() <= maxHeight) {
return;
}
}
}
}
// Run function and set event
check();
$(window).resize(check);
});
/**
* Do not run functions below for old browsers
*/
if (oldBrowser) {
return;
}
/**
* Adjust topiclist lists with check boxes
*/
$container.find('ul.topiclist dd.mark').siblings('dt').children('.list-inner').addClass('with-mark');
/**
* Appends contents of all extra columns to first column in
* .topiclist lists for mobile devices. Copies contents as is.
*
* To add that functionality to .topiclist list simply add
* responsive-show-all to list of classes
*/
$container.find('.topiclist.responsive-show-all > li > dl').each(function() {
var $this = $(this),
$block = $this.find('dt .responsive-show:last-child'),
first = true;
// Create block that is visible only on mobile devices
if (!$block.length) {
$this.find('dt > .list-inner').append('<div class="responsive-show" style="display:none;" />');
$block = $this.find('dt .responsive-show:last-child');
} else {
first = ($.trim($block.text()).length === 0);
}
// Copy contents of each column
$this.find('dd').not('.mark').each(function() {
var column = $(this),
$children = column.children(),
html = column.html();
if ($children.length === 1 && $children.text() === column.text()) {
html = $children.html();
}
$block.append((first ? '' : '<br />') + html);
first = false;
});
});
/**
* Same as above, but prepends text from header to each
* column before contents of that column.
*
* To add that functionality to .topiclist list simply add
* responsive-show-columns to list of classes
*/
$container.find('.topiclist.responsive-show-columns').each(function() {
var $list = $(this),
headers = [],
headersLength = 0;
// Find all headers, get contents
$list.prev('.topiclist').find('li.header dd').not('.mark').each(function() {
headers.push($(this).text());
headersLength++;
});
if (!headersLength) {
return;
}
// Parse each row
$list.find('dl').each(function() {
var $this = $(this),
$block = $this.find('dt .responsive-show:last-child'),
first = true;
// Create block that is visible only on mobile devices
if (!$block.length) {
$this.find('dt > .list-inner').append('<div class="responsive-show" style="display:none;" />');
$block = $this.find('dt .responsive-show:last-child');
} else {
first = ($.trim($block.text()).length === 0);
}
// Copy contents of each column
$this.find('dd').not('.mark').each(function(i) {
var column = $(this),
children = column.children(),
html = column.html();
if (children.length === 1 && children.text() === column.text()) {
html = children.html();
}
// Prepend contents of matching header before contents of column
if (i < headersLength) {
html = headers[i] + ': <strong>' + html + '</strong>';
}
$block.append((first ? '' : '<br />') + html);
first = false;
});
});
});
/**
* Responsive tables
*/
$container.find('table.table1').not('.not-responsive').each(function() {
var $this = $(this),
$th = $this.find('thead > tr > th'),
headers = [],
totalHeaders = 0,
i, headersLength;
// Find each header
$th.each(function(column) {
var cell = $(this),
colspan = parseInt(cell.attr('colspan'), 10),
dfn = cell.attr('data-dfn'),
text = dfn ? dfn : cell.text();
colspan = isNaN(colspan) || colspan < 1 ? 1 : colspan;
for (i = 0; i < colspan; i++) {
headers.push(text);
}
totalHeaders++;
if (dfn && !column) {
$this.addClass('show-header');
}
});
headersLength = headers.length;
// Add header text to each cell as <dfn>
$this.addClass('responsive');
if (totalHeaders < 2) {
$this.addClass('show-header');
return;
}
$this.find('tbody > tr').each(function() {
var row = $(this),
cells = row.children('td'),
column = 0;
if (cells.length === 1) {
row.addClass('big-column');
return;
}
cells.each(function() {
var cell = $(this),
colspan = parseInt(cell.attr('colspan'), 10),
text = $.trim(cell.text());
if (headersLength <= column) {
return;
}
if ((text.length && text !== '-') || cell.children().length) {
cell.prepend('<dfn style="display: none;">' + headers[column] + '</dfn>');
} else {
cell.addClass('empty');
}
colspan = isNaN(colspan) || colspan < 1 ? 1 : colspan;
column += colspan;
});
});
});
/**
* Hide empty responsive tables
*/
$container.find('table.responsive > tbody').not('.responsive-skip-empty').each(function() {
var $items = $(this).children('tr');
if (!$items.length) {
$(this).parent('table:first').addClass('responsive-hide');
}
});
/**
* Responsive tabs
*/
$container.find('#tabs, #minitabs').not('[data-skip-responsive]').each(function() {
var $this = $(this),
$ul = $this.children(),
$tabs = $ul.children().not('[data-skip-responsive]'),
$links = $tabs.children('a'),
$item = $ul.append('<li class="tab responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link">&nbsp;</a><div class="dropdown tab-dropdown" style="display: none;"><div class="pointer"><div class="pointer-inner"></div></div><ul class="dropdown-contents" /></div></li>').find('li.responsive-tab'),
$menu = $item.find('.dropdown-contents'),
maxHeight = 0,
lastWidth = false,
responsive = false;
$links.each(function() {
var $this = $(this);
maxHeight = Math.max(maxHeight, Math.max($this.outerHeight(true), $this.parent().outerHeight(true)));
});
function check() {
var width = $body.width(),
height = $this.height();
if (!arguments.length && (!responsive || width <= lastWidth) && height <= maxHeight) {
return;
}
$tabs.show();
$item.hide();
lastWidth = width;
height = $this.height();
if (height <= maxHeight) {
if ($item.hasClass('dropdown-visible')) {
phpbb.toggleDropdown.call($item.find('a.responsive-tab-link').get(0));
}
return;
}
responsive = true;
$item.show();
$menu.html('');
var $availableTabs = $tabs.filter(':not(.activetab, .responsive-tab)'),
total = $availableTabs.length,
i, $tab;
for (i = total - 1; i >= 0; i--) {
$tab = $availableTabs.eq(i);
$menu.prepend($tab.clone(true).removeClass('tab'));
$tab.hide();
if ($this.height() <= maxHeight) {
$menu.find('a').click(function() {
check(true);
});
return;
}
}
$menu.find('a').click(function() {
check(true);
});
}
var $tabLink = $item.find('a.responsive-tab-link');
phpbb.registerDropdown($tabLink, $item.find('.dropdown'), {
visibleClass: 'activetab'
});
check(true);
$(window).resize(check);
});
/**
* Hide UCP/MCP navigation if there is only 1 item
*/
$container.find('#navigation').each(function() {
var $items = $(this).children('ol, ul').children('li');
if ($items.length === 1) {
$(this).addClass('responsive-hide');
}
});
/**
* Replace responsive text
*/
$container.find('[data-responsive-text]').each(function() {
var $this = $(this),
fullText = $this.text(),
responsiveText = $this.attr('data-responsive-text'),
responsive = false;
function check() {
if ($(window).width() > 700) {
if (!responsive) {
return;
}
$this.text(fullText);
responsive = false;
return;
}
if (responsive) {
return;
}
$this.text(responsiveText);
responsive = true;
}
check();
$(window).resize(check);
});
}
/**
* Run onload functions
*/
jQuery(function($) {
'use strict';
// Swap .nojs and .hasjs
$('#phpbb.nojs').toggleClass('nojs hasjs');
$('#phpbb').toggleClass('hastouch', phpbb.isTouch);
$('#phpbb.hastouch').removeClass('notouch');
// Focus forms
$('form[data-focus]:first').each(function() {
$('#' + this.getAttribute('data-focus')).focus();
});
parseDocument($('body'));
});

View file

@ -0,0 +1,153 @@
<!-- BEGIN forumrow -->
<!-- IF (forumrow.S_IS_CAT and not forumrow.S_FIRST_ROW) or forumrow.S_NO_CAT -->
</ul>
</div>
</div>
<!-- ENDIF -->
<!-- EVENT forumlist_body_category_header_before -->
<!-- IF forumrow.S_IS_CAT or forumrow.S_FIRST_ROW or forumrow.S_NO_CAT -->
<div class="forabg">
<div class="inner">
<ul class="topiclist">
<li class="header">
<!-- EVENT forumlist_body_category_header_row_prepend -->
<dl class="row-item">
<dt><div class="list-inner"><!-- IF forumrow.S_IS_CAT --><a href="{forumrow.U_VIEWFORUM}">{forumrow.FORUM_NAME}</a><!-- ELSE -->{L_FORUM}<!-- ENDIF --></div></dt>
<dd class="topics">{L_TOPICS}</dd>
<dd class="posts">{L_POSTS}</dd>
<dd class="lastpost"><span>{L_LAST_POST}</span></dd>
</dl>
<!-- EVENT forumlist_body_category_header_row_append -->
</li>
</ul>
<ul class="topiclist forums">
<!-- ENDIF -->
<!-- EVENT forumlist_body_category_header_after -->
<!-- IF not forumrow.S_IS_CAT -->
<!-- EVENT forumlist_body_forum_row_before -->
<li class="row">
<!-- EVENT forumlist_body_forum_row_prepend -->
<dl class="row-item">
<dt title="{% if forumrow.S_IS_LINK %}{{ lang('FORUM_LINK') }}{% else %}{{ forumrow.FORUM_FOLDER_IMG_ALT }}{% endif %}">
<a class="row-item-link{% if forumrow.S_UNREAD_FORUM %} unread{% else %} read{% endif %}" href="{forumrow.U_VIEWFORUM}">
{{ Icon('svg', {
'link-variant' : forumrow.S_IS_LINK,
'lock' : forumrow.S_LOCKED_FORUM,
'file-document-box-multiple-outline' : forumrow.S_SUBFORUMS,
'file-document-box-outline' : true,
}, '', true, 'c-forum-row-icon') }}
</a>
<div class="list-inner">
<!-- IF S_ENABLE_FEEDS and forumrow.S_FEED_ENABLED -->
<!--
<a class="feed-icon-forum" title="{L_FEED} - {forumrow.FORUM_NAME}" href="{U_FEED}?f={forumrow.FORUM_ID}">
{{ Icon('font', 'square-rss', '', true, 'fas c-feed-icon') }}<span class="sr-only">{L_FEED} - {forumrow.FORUM_NAME}</span>
</a>
-->
<!-- ENDIF -->
<!-- IF forumrow.FORUM_IMAGE -->
<!-- EVENT forumlist_body_forum_image_before -->
<span class="forum-image"><!-- EVENT forumlist_body_forum_image_prepend -->{forumrow.FORUM_IMAGE}<!-- EVENT forumlist_body_forum_image_append --></span>
<!-- EVENT forumlist_body_forum_image_after -->
<!-- ENDIF -->
<a href="{forumrow.U_VIEWFORUM}" class="forumtitle">{forumrow.FORUM_NAME}</a>
<!-- IF forumrow.FORUM_DESC --><span class="forum-desc">{forumrow.FORUM_DESC}</span><!-- ENDIF -->
<!-- IF forumrow.MODERATORS -->
<span class="forum-mods"><strong>{forumrow.L_MODERATOR_STR}{L_COLON}</strong> {forumrow.MODERATORS}</span>
<!-- ENDIF -->
<!-- IF .forumrow.subforum and forumrow.S_LIST_SUBFORUMS -->
<!-- EVENT forumlist_body_subforums_before -->
<span class="forum-subs">
<strong>{forumrow.L_SUBFORUM_STR}{L_COLON}</strong>
<!-- BEGIN subforum -->
<!-- EVENT forumlist_body_subforum_link_prepend -->
<a href="{forumrow.subforum.U_SUBFORUM}" class="subforum<!-- IF forumrow.subforum.S_UNREAD --> unread<!-- ELSE --> read<!-- ENDIF -->" title="{% if forumrow.subforum.IS_LINK %}{{ lang('FORUM_LINK') }}{% elseif forumrow.subforum.S_UNREAD %}{{ lang('UNREAD_POSTS') }}{% else %}{{ lang('NO_UNREAD_POSTS') }}{% endif %}">
{% if forumrow.subforum.IS_LINK %}
{{ Icon('font', 'arrow-up-right-from-square', forumrow.subforum.SUBFORUM_NAME, false, 'fas c-subforum-icon') }}
{% else %}
{{ Icon('font', 'file', forumrow.subforum.SUBFORUM_NAME, false, 'far c-subforum-icon') }}
{% endif %}
</a>{% if not forumrow.subforum.S_LAST_ROW %}{L_COMMA_SEPARATOR}{% endif %}
<!-- EVENT forumlist_body_subforum_link_append -->
<!-- END subforum -->
</span>
<!-- EVENT forumlist_body_subforums_after -->
<!-- ENDIF -->
<!-- IF not S_IS_BOT -->
<div class="responsive-show" style="display: none;">
<!-- IF forumrow.CLICKS -->
{L_REDIRECTS}{L_COLON} <strong>{forumrow.CLICKS}</strong>
<!-- ELSEIF not forumrow.S_IS_LINK and forumrow.TOPICS -->
{L_TOPICS}{L_COLON} <strong>{forumrow.TOPICS}</strong>
<!-- ENDIF -->
</div>
<!-- ENDIF -->
</div>
</dt>
<!-- IF forumrow.CLICKS -->
<dd class="redirect"><span>{L_REDIRECTS}{L_COLON} {forumrow.CLICKS}</span></dd>
<!-- ELSEIF not forumrow.S_IS_LINK -->
<dd class="topics">{forumrow.TOPICS} <dfn>{L_TOPICS}</dfn></dd>
<dd class="posts">{forumrow.POSTS} <dfn>{L_POSTS}</dfn></dd>
<dd class="lastpost">
<span>
<!-- IF forumrow.U_UNAPPROVED_TOPICS -->
<a href="{forumrow.U_UNAPPROVED_TOPICS}" title="{L_TOPICS_UNAPPROVED}">
{{ Icon('font', 'circle-question', lang('TOPICS_UNAPPROVED'), true, 'fas c-unapproved-icon') }}
</a>
<!-- ELSEIF forumrow.U_UNAPPROVED_POSTS -->
<a href="{forumrow.U_UNAPPROVED_POSTS}" title="{L_POSTS_UNAPPROVED_FORUM}">
{{ Icon('font', 'circle-question', lang('POSTS_UNAPPROVED_FORUM'), true, 'fas c-unapproved-icon') }}
</a>
<!-- ENDIF -->
<!-- IF forumrow.LAST_POST_TIME_RFC3339 -->
<dfn>{L_LAST_POST}</dfn>
<!-- IF forumrow.S_DISPLAY_SUBJECT -->
<!-- EVENT forumlist_body_last_post_title_prepend -->
<a href="{forumrow.U_LAST_POST}" title="{forumrow.LAST_POST_SUBJECT}" class="lastsubject">{forumrow.LAST_POST_SUBJECT_TRUNCATED}</a> <br />
<!-- ENDIF -->
{L_POST_BY_AUTHOR} <!-- EVENT forumlist_body_last_poster_username_prepend -->{forumrow.LAST_POSTER_FULL}<!-- EVENT forumlist_body_last_poster_username_append -->
<!-- IF not S_IS_BOT -->
<a href="{forumrow.U_LAST_POST}" title="{L_VIEW_LATEST_POST}">
{{ Icon('font', 'arrow-up-right-from-square', lang('VIEW_LATEST_POST'), true, 'fas c-last-post-icon') }}
</a>
<!-- ENDIF -->
<br /><time datetime="{forumrow.LAST_POST_TIME_RFC3339}">{forumrow.LAST_POST_TIME}</time>
<!-- ELSE -->
{% if forumrow.U_UNAPPROVED_TOPICS %}
{{ lang('TOPIC_UNAPPROVED_FORUM', forumrow.TOPICS) }}
{% else %}
{{ lang('NO_POSTS') }}
{% endif %}
<!-- ENDIF -->
</span>
</dd>
<!-- ELSE -->
<dd>&nbsp;</dd>
<!-- ENDIF -->
</dl>
<!-- EVENT forumlist_body_forum_row_append -->
</li>
<!-- EVENT forumlist_body_forum_row_after -->
<!-- ENDIF -->
<!-- IF forumrow.S_LAST_ROW -->
</ul>
</div>
</div>
<!-- EVENT forumlist_body_last_row_after -->
<!-- ENDIF -->
<!-- BEGINELSE -->
<div class="panel">
<div class="inner">
<strong>{L_NO_FORUMS}</strong>
</div>
</div>
<!-- END forumrow -->

View file

@ -0,0 +1,94 @@
<!-- INCLUDE overall_header.html -->
<p class="{S_CONTENT_FLOW_END} responsive-center time<!-- IF S_USER_LOGGED_IN --> rightside<!-- ENDIF -->"><!-- IF S_USER_LOGGED_IN -->{LAST_VISIT_DATE}<!-- ELSE -->{CURRENT_TIME}<!-- ENDIF --></p>
<!-- IF S_USER_LOGGED_IN --><p class="responsive-center time">{CURRENT_TIME}</p><!-- ENDIF -->
<!-- EVENT index_body_markforums_before -->
<!-- IF U_MARK_FORUMS -->
<div class="action-bar compact">
<a href="{U_MARK_FORUMS}" class="mark-read rightside" accesskey="m" data-ajax="mark_forums_read">{L_MARK_FORUMS_READ}</a>
</div>
<!-- ENDIF -->
<!-- EVENT index_body_markforums_after -->
<!-- INCLUDE forumlist_body.html -->
<!-- EVENT index_body_forumlist_body_after -->
<!-- IF not S_USER_LOGGED_IN and not S_IS_BOT -->
<form method="post" action="{S_LOGIN_ACTION}" class="headerspace">
<h3><a href="{U_LOGIN_LOGOUT}">{L_LOGIN_LOGOUT}</a><!-- IF S_REGISTER_ENABLED -->&nbsp; &bull; &nbsp;<a href="{U_REGISTER}">{L_REGISTER}</a><!-- ENDIF --></h3>
<fieldset class="quick-login">
<label for="username"><span>{L_USERNAME}{L_COLON}</span> <input type="text" tabindex="1" name="username" id="username" size="10" class="inputbox" title="{L_USERNAME}" autocomplete="username" /></label>
<label for="password"><span>{L_PASSWORD}{L_COLON}</span> <input type="password" tabindex="2" name="password" id="password" size="10" class="inputbox" title="{L_PASSWORD}" autocomplete="current-password" /></label>
<!-- IF U_SEND_PASSWORD -->
<a href="{U_SEND_PASSWORD}">{L_FORGOT_PASS}</a>
<!-- ENDIF -->
<!-- IF S_AUTOLOGIN_ENABLED -->
<span class="responsive-hide">|</span> <label for="autologin">{L_LOG_ME_IN} <input type="checkbox" tabindex="4" name="autologin" id="autologin" checked /></label>
<!-- ENDIF -->
<input type="submit" tabindex="5" name="login" value="{L_LOGIN}" class="button1 button button-form-bold" />
{S_LOGIN_REDIRECT}
{S_FORM_TOKEN_LOGIN}
</fieldset>
</form>
<!-- ENDIF -->
<!-- EVENT index_body_stat_blocks_before -->
<!-- IF S_DISPLAY_ONLINE_LIST -->
<div class="stat-block online-list">
<!-- IF U_VIEWONLINE --><h3><a href="{U_VIEWONLINE}">{L_WHO_IS_ONLINE}</a></h3><!-- ELSE --><h3>{L_WHO_IS_ONLINE}</h3><!-- ENDIF -->
<p>
<!-- EVENT index_body_block_online_prepend -->
{TOTAL_USERS_ONLINE} ({L_ONLINE_EXPLAIN})<br />{RECORD_USERS}<br />
<!-- IF U_VIEWONLINE -->
<br />{LOGGED_IN_USER_LIST}
{% if LEGEND|length > 0 %}
{% apply spaceless %}
<br>
<em>
{{ lang('LEGEND') ~ lang('COLON') }}
{% for group in LEGEND %}
{% if group.GROUP_URL %}
<a style="color:#{{ group.GROUP_COLOR }}" href="{{ group.GROUP_URL }}" alt="{{ group.GROUP_NAME }}">{{ group.GROUP_NAME }}</a>{% if not loop.last %}, {% endif %}
{% else %}
<span style="color:#{{ group.GROUP_COLOR }}">{{ group.GROUP_NAME }}</span>{% if not loop.last %}, {% endif %}
{% endif %}
{% endfor %}
</em>
{% endapply %}
{% endif %}
<!-- ENDIF -->
<!-- EVENT index_body_block_online_append -->
</p>
</div>
<!-- ENDIF -->
<!-- EVENT index_body_birthday_block_before -->
<!-- IF S_DISPLAY_BIRTHDAY_LIST -->
<div class="stat-block birthday-list">
<h3>{L_BIRTHDAYS}</h3>
<p>
<!-- EVENT index_body_block_birthday_prepend -->
<!-- IF .birthdays -->{L_CONGRATULATIONS}{L_COLON} <strong><!-- BEGIN birthdays -->{birthdays.USERNAME}<!-- IF birthdays.AGE !== '' --> ({birthdays.AGE})<!-- ENDIF --><!-- IF not birthdays.S_LAST_ROW -->, <!-- ENDIF --><!-- END birthdays --></strong><!-- ELSE -->{L_NO_BIRTHDAYS}<!-- ENDIF -->
<!-- EVENT index_body_block_birthday_append -->
</p>
</div>
<!-- ENDIF -->
<!-- IF NEWEST_USER -->
<div class="stat-block statistics">
<h3>{L_STATISTICS}</h3>
<p>
<!-- EVENT index_body_block_stats_prepend -->
{TOTAL_POSTS} &bull; {TOTAL_TOPICS} &bull; {TOTAL_USERS} &bull; {NEWEST_USER}
<!-- EVENT index_body_block_stats_append -->
</p>
</div>
<!-- ENDIF -->
<!-- EVENT index_body_stat_blocks_after -->
<!-- INCLUDE overall_footer.html -->

View file

@ -0,0 +1,50 @@
<div class="action-bar actions-jump">
<!-- IF S_VIEWTOPIC -->
<p class="jumpbox-return">
<a href="{U_VIEW_FORUM}" class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
{{ Icon('font', 'angle-' ~ S_CONTENT_FLOW_BEGIN, lang('RETURN_TO_FORUM'), false, 'fas c-return-arrow-icon') }}
</a>
</p>
<!-- ELSEIF S_VIEWFORUM -->
<p class="jumpbox-return">
<a href="{U_INDEX}" class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
{{ Icon('font', 'angle-' ~ S_CONTENT_FLOW_BEGIN, lang('RETURN_TO_INDEX'), false, 'fas c-return-arrow-icon') }}
</a>
</p>
<!-- ELSEIF SEARCH_TOPIC -->
<p class="jumpbox-return">
<a class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH_TOPIC}" accesskey="r">
{{ Icon('font', 'angle-' ~ S_CONTENT_FLOW_BEGIN, lang('RETURN_TO_TOPIC'), false, 'fas c-return-arrow-icon') }}
</a>
</p>
<!-- ELSEIF S_SEARCH_ACTION -->
<p class="jumpbox-return">
<a class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH}" title="{L_SEARCH_ADV}" accesskey="r">
{{ Icon('font', 'angle-' ~ S_CONTENT_FLOW_BEGIN, lang('GO_TO_SEARCH_ADV'), false, 'fas c-return-arrow-icon') }}
</a>
</p>
<!-- ENDIF -->
<!-- IF S_DISPLAY_JUMPBOX -->
<div class="jumpbox dropdown-container dropdown-container-right<!-- IF not S_IN_MCP --> dropdown-up<!-- ENDIF --> dropdown-{S_CONTENT_FLOW_BEGIN} dropdown-button-control" id="jumpbox">
<span title="<!-- IF S_IN_MCP and S_MERGE_SELECT -->{L_SELECT_TOPICS_FROM}<!-- ELSEIF S_IN_MCP -->{L_MODERATE_FORUM}<!-- ELSE -->{L_JUMP_TO}<!-- ENDIF -->" class="button button-secondary dropdown-trigger dropdown-select">
<span><!-- IF S_IN_MCP and S_MERGE_SELECT -->{L_SELECT_TOPICS_FROM}<!-- ELSEIF S_IN_MCP -->{L_MODERATE_FORUM}<!-- ELSE -->{L_JUMP_TO}<!-- ENDIF --></span>
<span class="caret">{{ Icon('font', 'caret-down', '', true) }}</span>
</span>
<div class="dropdown">
<div class="pointer"><div class="pointer-inner"></div></div>
<ul class="dropdown-contents">
<!-- BEGIN jumpbox_forums -->
<!-- IF jumpbox_forums.FORUM_ID neq -1 -->
<li><a href="{jumpbox_forums.LINK}" class="<!-- IF jumpbox_forums.level -->jumpbox-sub-link<!-- ELSEIF jumpbox_forums.S_IS_CAT -->jumpbox-cat-link<!-- ELSE -->jumpbox-forum-link<!-- ENDIF -->"><!-- BEGIN level --><span class="spacer"></span><!-- END level --> <span><!-- IF jumpbox_forums.level --><!-- IF S_CONTENT_DIRECTION eq 'rtl' -->&#8626;<!-- ELSE -->&#8627;<!-- ENDIF --> &nbsp;<!-- ENDIF --> {jumpbox_forums.FORUM_NAME}</span></a></li>
<!-- ENDIF -->
<!-- END jumpbox_forums -->
</ul>
</div>
</div>
<!-- ELSE -->
<br /><br />
<!-- ENDIF -->
</div>

View file

@ -0,0 +1,70 @@
<!-- INCLUDE overall_header.html -->
<form action="{S_LOGIN_ACTION}" method="post" id="login" data-focus="<!-- IF S_ADMIN_AUTH -->{PASSWORD_CREDENTIAL}<!-- ELSE -->{USERNAME_CREDENTIAL}<!-- ENDIF -->">
<div class="panel">
<div class="inner">
<div class="content">
<h2 class="login-title"><!-- IF LOGIN_EXPLAIN -->{LOGIN_EXPLAIN}<!-- ELSE -->{L_LOGIN}<!-- ENDIF --></h2>
<fieldset <!-- IF not S_CONFIRM_CODE -->class="fields1"<!-- ELSE -->class="fields2"<!-- ENDIF -->>
<!-- IF LOGIN_ERROR --><div class="error">{LOGIN_ERROR}</div><!-- ENDIF -->
<dl>
<dt><label for="{USERNAME_CREDENTIAL}">{L_USERNAME}{L_COLON}</label></dt>
<dd><input type="text" tabindex="1" name="{USERNAME_CREDENTIAL}" id="{USERNAME_CREDENTIAL}" size="25" value="{USERNAME}" class="inputbox autowidth" autocomplete="username" /></dd>
</dl>
<dl>
<dt><label for="{PASSWORD_CREDENTIAL}">{L_PASSWORD}{L_COLON}</label></dt>
<dd><input type="password" tabindex="2" id="{PASSWORD_CREDENTIAL}" name="{PASSWORD_CREDENTIAL}" size="25" class="inputbox autowidth" autocomplete="current-password" /></dd>
<!-- IF S_DISPLAY_FULL_LOGIN and (U_SEND_PASSWORD or U_RESEND_ACTIVATION) -->
<!-- IF U_SEND_PASSWORD --><dd><a href="{U_SEND_PASSWORD}">{L_FORGOT_PASS}</a></dd><!-- ENDIF -->
<!-- IF U_RESEND_ACTIVATION --><dd><a href="{U_RESEND_ACTIVATION}">{L_RESEND_ACTIVATION}</a></dd><!-- ENDIF -->
<!-- ENDIF -->
</dl>
<!-- IF CAPTCHA_TEMPLATE and S_CONFIRM_CODE -->
<!-- DEFINE $CAPTCHA_TAB_INDEX = 3 -->
<!-- INCLUDE {CAPTCHA_TEMPLATE} -->
<!-- ENDIF -->
<!-- IF S_DISPLAY_FULL_LOGIN -->
<dl>
<dt>&nbsp;</dt>
<!-- IF S_AUTOLOGIN_ENABLED --><dd><label for="autologin"><input type="checkbox" name="autologin" id="autologin" tabindex="4" checked /> {L_LOG_ME_IN}</label></dd><!-- ENDIF -->
<dd><label for="viewonline"><input type="checkbox" name="viewonline" id="viewonline" tabindex="5" /> {L_HIDE_ME}</label></dd>
</dl>
<!-- ENDIF -->
{S_LOGIN_REDIRECT}
{S_FORM_TOKEN_LOGIN}
<dl>
<dt>&nbsp;</dt>
<dd>{S_HIDDEN_FIELDS}<input type="submit" name="login" tabindex="6" value="{L_LOGIN}" class="button1 button button-form" /></dd>
</dl>
</fieldset>
</div>
<!-- IF not S_ADMIN_AUTH and PROVIDER_TEMPLATE_FILE -->
<!-- INCLUDE {PROVIDER_TEMPLATE_FILE} -->
<!-- ENDIF -->
</div>
</div>
<!-- IF not S_ADMIN_AUTH and S_REGISTER_ENABLED -->
<div class="panel">
<div class="inner">
<div class="content">
<h3>{L_REGISTER}</h3>
<p>{L_LOGIN_INFO}</p>
<p><strong><a href="{U_TERMS_USE}">{L_TERMS_USE}</a> | <a href="{U_PRIVACY}">{L_PRIVACY}</a></strong></p>
<hr class="dashed" />
<p><a href="{U_REGISTER}" class="button1 button button-form-bold">{L_REGISTER}</a></p>
</div>
</div>
</div>
<!-- ENDIF -->
</form>
<!-- INCLUDE overall_footer.html -->

Some files were not shown because too many files have changed in this diff Show more