Commit Graph

59297 Commits

Author SHA1 Message Date
76e1373b04 FIX: N+1 in admin themes page (#32763)
`strict_loading` was added to prevent it happening in the future. Few
adjustments had to be made:
- include color_scheme and color_scheme_colors, also for parent and
child themes;
- internal translations were using preload_fields, but it was too deep
to correctly use preloaded tables. I had to pass
`preloaded_locale_fields` manually;
- include theme in color_scheme.

Before:
<img width="663" alt="Screenshot 2025-05-15 at 3 43 47 pm"
src="https://github.com/user-attachments/assets/b55ce11e-80cb-43eb-8e31-940b0e9859f3"
/>

After:
<img width="665" alt="Screenshot 2025-05-16 at 11 29 00 am"
src="https://github.com/user-attachments/assets/f00bac19-f64b-4048-b220-4d0a9d90a929"
/>
2025-05-19 11:05:23 +08:00
b823fb297f FIX: skip flaky specs (#32786)
The proper fix was to apply what has been reverted in
7558e2c7cd
but we would have to break the API to apply this fix so I will just skip
these specs for now.
2025-05-19 09:47:37 +08:00
746c332df3 DEV: simplify test to remove flaky part (#32790)
This test is about testing that we can set notification_level, which it
does correctly. The rest of the spec was testing some undefined behavior
which is flaky.
2025-05-19 09:47:12 +08:00
8784a42940 Build(deps): Bump ember-resolver from 13.1.0 to 13.1.1 (#32793)
Bumps [ember-resolver](https://github.com/ember-cli/ember-resolver) from
13.1.0 to 13.1.1.
- [Release notes](https://github.com/ember-cli/ember-resolver/releases)
-
[Changelog](https://github.com/ember-cli/ember-resolver/blob/main/CHANGELOG.md)
-
[Commits](https://github.com/ember-cli/ember-resolver/compare/v13.1.0...v13.1.1)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-19 09:46:59 +08:00
63be73730a Build(deps-dev): Bump rubocop-rails from 2.31.0 to 2.32.0 (#32791)
Bumps [rubocop-rails](https://github.com/rubocop/rubocop-rails) from
2.31.0 to 2.32.0.
- [Release notes](https://github.com/rubocop/rubocop-rails/releases)
-
[Changelog](https://github.com/rubocop/rubocop-rails/blob/master/CHANGELOG.md)
-
[Commits](https://github.com/rubocop/rubocop-rails/compare/v2.31.0...v2.32.0)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-19 09:34:30 +08:00
c6369b4386 Build(deps-dev): Bump lefthook from 1.11.12 to 1.11.13 (#32794)
Bumps [lefthook](https://github.com/evilmartians/lefthook) from 1.11.12
to 1.11.13.
- [Release notes](https://github.com/evilmartians/lefthook/releases)
-
[Changelog](https://github.com/evilmartians/lefthook/blob/master/CHANGELOG.md)
-
[Commits](https://github.com/evilmartians/lefthook/compare/v1.11.12...v1.11.13)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-19 09:33:39 +08:00
ae074f0c90 FIX: rely on capybara waiters (#32789) 2025-05-18 23:08:19 +02:00
920efb7fa7 FIX: uses correct capybara waiter (#32788) 2025-05-18 22:57:35 +02:00
ce03fff375 FIX: attempts to fix flaky in review media (#32787)
I suspect the within is doing a memoization of the preview at a moment
where the emoji has not been rendered yet, when we render the emoji we
might have a different instance of the preview in the within which
doesn't have the emoji.

Im not super confident about this theory, but the within is useless here
so it seems like a good thing to try first.

The error we have is:

```
Failure/Error: super

Playwright::Error:
  TypeError: Cannot read properties of null (reading 'namespaceURI')
      at eval (eval at evaluate (:313:29), <anonymous>:17:12)
      at UtilityScript.evaluate (<anonymous>:320:18)
      at UtilityScript.<anonymous> (<anonymous>:1:44)
  Call log:

[Screenshot Image]: /__w/discourse/discourse/tmp/capybara/failures_r_spec_example_groups_composer_using_review_media_does_not_flag_a_post_with_an_emoji_250.png

~~~~~~~ JS LOGS ~~~~~~~
ℹ️ Discourse v3.5.0.beta5-dev — https://github.com/discourse/discourse/commits/94932de163 — Ember v5.12.0
DEBUG: For more advanced debugging, install the Ember Inspector from https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi
Failed to load resource: net::ERR_CONNECTION_REFUSED
~~~~~ END JS LOGS ~~~~~

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:1268:in `raise'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:1268:in `wait_until_resolved!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:1482:in `value!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/playwright-ruby-client-1.52.0/lib/playwright/connection.rb:121:in `send_message_to_server'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/playwright-ruby-client-1.52.0/lib/playwright/channel.rb:35:in `block in send_message_to_server_result'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/playwright-ruby-client-1.52.0/lib/playwright/channel.rb:67:in `with_logging'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/playwright-ruby-client-1.52.0/lib/playwright/channel.rb:34:in `send_message_to_server_result'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/playwright-ruby-client-1.52.0/lib/playwright/channel.rb:20:in `send_message_to_server'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/playwright-ruby-client-1.52.0/lib/playwright/javascript/expression.rb:10:in `evaluate'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/playwright-ruby-client-1.52.0/lib/playwright/channel_owners/js_handle.rb:19:in `evaluate'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/playwright-ruby-client-1.52.0/lib/playwright_api/js_handle.rb:46:in `evaluate'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-playwright-driver-0.5.6/lib/capybara/playwright/node.rb:885:in `block in path'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-playwright-driver-0.5.6/lib/capybara/playwright/node.rb:87:in `assert_element_not_stale'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-playwright-driver-0.5.6/lib/capybara/playwright/node.rb:884:in `path'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/node/element.rb:578:in `inspect'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/queries/selector_query.rb:106:in `description'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/queries/selector_query.rb:115:in `applied_description'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/queries/selector_query.rb:180:in `failure_message'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/result.rb:114:in `failure_message'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/node/matchers.rb:112:in `block in assert_selector'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/node/matchers.rb:869:in `block in _verify_selector_result'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/node/base.rb:84:in `synchronize'
./spec/rails_helper.rb:421:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/node/matchers.rb:868:in `_verify_selector_result'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/node/matchers.rb:110:in `assert_selector'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/session.rb:774:in `assert_selector'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/rspec/matchers/have_selector.rb:18:in `element_matches?'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/rspec/matchers/base.rb:52:in `matches?'
./spec/system/composer/review_media_unless_trust_level_spec.rb:20:in `block (3 levels) in <main>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/session.rb:366:in `within'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/dsl.rb:52:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/dsl.rb:52:in `within_element'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/capybara-3.40.0/lib/capybara/rspec/matcher_proxies.rb:15:in `within'
./spec/system/composer/review_media_unless_trust_level_spec.rb:20:in `block (2 levels) in <main>'
```
2025-05-18 22:57:00 +02:00
82ac698293 FIX: attempts to fix flaky in stat spec (#32784)
I suspect that by having an integer and not a float sometimes the value
we get is converted to 0.

This is the error we have atm:

```
Failure/Error: measurement = Benchmark.measure { example.run }

  expected: 0.75
       got: 0.0

  (compared using ==)
```

This might not fix it, but it feels right to make this change.
2025-05-18 21:55:46 +02:00
e60e832b63 DEV: fix flaky in admin site texts (#32783)
A spec could potentially go so fast that it would attempt to fill in the
input before we have gone through the various redirects resulting in an
error.

```
Failure/Error: super

Playwright::Error:
  TypeError: Cannot read properties of null (reading 'namespaceURI')
      at eval (eval at evaluate (:313:29), <anonymous>:17:12)
      at UtilityScript.evaluate (<anonymous>:320:18)
      at UtilityScript.<anonymous> (<anonymous>:1:44)
  Call log:
```

Now that we ensure that we have the current final state path we should
avoid this error.
2025-05-18 19:12:43 +02:00
df37ef5774 DEV: flaky spec (#32781)
Attempts to not use within to make this spec less flaky.
2025-05-17 15:32:45 +02:00
19e1c0ecfd DEV: skips s3 multipart spec (#32780)
The spec is randomly failing, but it's not due to the system spec.
Sometimes the upload fails to work and we get an error from the service.
2025-05-17 15:32:22 +02:00
948939e998 FIX: uses correct waiters and APIs (#32778) 2025-05-17 15:32:07 +02:00
c74a49d7e7 DEV: attempts to use capybara choose (#32779)
Im not convinced this will fix the flakyness, but this is better
anyways.
2025-05-17 15:31:52 +02:00
2a18834db1 DEV: Remove accidental whitespace from PluginOutlet (#32777) 2025-05-17 10:10:59 +02:00
de2159cd8a UX: follow-up search fixes for welcome banner (#32776)
follow-up to
6169ac2683

this fixes a spacing regression in the welcome banner search results


before:

![image](https://github.com/user-attachments/assets/3175feb9-b75b-4019-9df0-002faa73f204)


after: 

![image](https://github.com/user-attachments/assets/82c3c90e-7a0a-4c30-9cdc-a3a65e23ca27)


before:

![image](https://github.com/user-attachments/assets/a44b7414-c9a2-453d-96cc-a50af234e8fe)


after:

![image](https://github.com/user-attachments/assets/88e27a1c-b873-4e52-bab2-1eda84323565)
2025-05-16 15:34:59 -04:00
c293fe02c3 FIX: check if sidebar hidden and remove scrollLock when hiding hamburger menu (#32775)
Reported here:
https://meta.discourse.org/t/dashboard-freezes-until-sidebar-is-opened/366402

This is a follow-up to
https://github.com/discourse/discourse/pull/32651, when navigating from
the homepage to admin the hamburger gets force-hidden because we switch
from the dropdown to the sidebar nav but the scrollLock was
unintentionally left behind.

This makes sure we're only messing with hamburger state when the sidebar
is hidden (with ` {{hideApplicationSidebar}}`) and also removes the
scroll lock when the hamburger is force-hidden.
2025-05-16 15:30:24 -04:00
94ea8a3158 DEV: Add appEvents trigger for flag:created (#32710)
## Changes 

This PR adds an appEvents trigger for 'flag:created'.
2025-05-16 12:13:16 -05:00
6169ac2683 UX: make the notification panel consistent with new search panel styles (#32753)
This eliminates menu panel container padding, which gets us a closer
match to the recent search panel adjustments. I've also eliminated the
menu-panel box-shadow variant — if we're not going to use it on the
search panel we should consolidate and eliminate the variance.




Before:

![image](https://github.com/user-attachments/assets/07122788-61a4-4767-a697-47cc3118d84e)


After:

![image](https://github.com/user-attachments/assets/a6f66c6f-37cd-4144-930d-d05546bba801)
2025-05-16 12:50:12 -04:00
9e17b0bc1e REFACTOR: merge desktop and mobile topic-footer.scss into common (#32712)
This moves the desktop and mobile css into common with the relevant
breakpoints. There should be no major visual changes as a result.
2025-05-16 12:31:53 -04:00
77c240e4b6 DEV: Drop deprecated PluginOutlet @tagName argument (#32770)
This has been deprecated with an admin warning for some time
2025-05-16 16:30:42 +01:00
975fb9214d UX: improve spacing of text in topic list items (#32755)
This tightens up some topic list spacing — our line height for titles
has been kind of on the large size, we've got too much space between
wrapping metadata, and sometimes not enough space between the right of
titles and avatars.
 
Generally headline line-height is recommended to be within 1.1 - 1.3,
and we were at 1.4, this puts it at 1.2
 
Before:

![image](https://github.com/user-attachments/assets/cc71ef47-5492-4aea-9caf-3b768e326b67)


After: 

![image](https://github.com/user-attachments/assets/f274a0bc-0077-41bf-abda-ddde71d805b6)
2025-05-16 10:15:44 -04:00
071ec5a240 FIX: Bug with 2FA setup right after signup (#32754) 2025-05-16 09:00:39 -04:00
41363a2a18 DEV: Silence scss mixed-decls for themes/plugins (#32750)
Fixing this everywhere will be a very large undertaking, so we're
deferring it until there is a concrete timeline for it becoming an error
in sass.

In the meantime, we'll be adding a stylelint rule to enforce ordering of
declarations/nested-blocks/mixins, so that will go some way towards
avoiding this deprecation.
2025-05-16 13:06:10 +01:00
d60ba9a948 Build(deps-dev): Bump jsuites from 5.9.1 to 5.10.0 (#32717)
Bumps [jsuites](https://github.com/jsuites/jsuites) from 5.9.1 to
5.10.0.
- [Release notes](https://github.com/jsuites/jsuites/releases)
-
[Changelog](https://github.com/jsuites/jsuites/blob/master/changelog.md)
- [Commits](https://github.com/jsuites/jsuites/commits)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-16 13:37:15 +02:00
e6f9a53b5d Build(deps-dev): Bump ember-modifier from 4.2.0 to 4.2.2 (#32758)
Bumps [ember-modifier](https://github.com/ember-modifier/ember-modifier)
from 4.2.0 to 4.2.2.
- [Release
notes](https://github.com/ember-modifier/ember-modifier/releases)
-
[Changelog](https://github.com/ember-modifier/ember-modifier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ember-modifier/ember-modifier/commits)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-16 13:36:45 +02:00
772268647c Build(deps): Bump terser from 5.39.1 to 5.39.2 (#32759)
Bumps [terser](https://github.com/terser/terser) from 5.39.1 to 5.39.2.
- [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/terser/terser/compare/v5.39.1...v5.39.2)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-16 11:02:08 +02:00
b7865cdfe1 DEV: Run plugin system tests job on 16 core runners (#32767)
This is the bottleneck for the `tests` workflow now so we are throwing
more cores at the job
2025-05-16 16:33:01 +08:00
fee57fe1c3 DEV: Update labels for our self hosted runners (#32766)
We have 8 and 16 cores runner now but 16 core runners are not quite
ready for prime time yet.
2025-05-16 15:46:14 +08:00
7820dd2b8f FIX: Reset password link broken for non-staff user in confirm session dialog (#32765) 2025-05-16 15:09:03 +08:00
672007549b FIX: Allow existing users to accept invites that add them to a group. (#32762)
Check to see if the user needs to be added to any groups before redirecting. To avoid introducing a CSRF issue, force the user through the normal invite acceptance flow, ensuring there's user interaction before being added to any groups.

This change also tweaks the behaviour of 2e10fe9 to not follow redirects of expired invitations.

Co-authored-by: Krzysztof Kotlarek <kotlarek.krzysztof@gmail.com>
2025-05-16 16:42:02 +10:00
c3d0756df8 DEV: Add ca2dee5 to .git-glame-ignore-revs (#32764)
ca2dee5 was a reformatting commit that can be ignored in `git blame`.
2025-05-16 16:19:03 +10:00
f90ed6424f Build(deps-dev): Bump rubocop from 1.75.5 to 1.75.6 (#32756)
Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.75.5 to
1.75.6.
- [Release notes](https://github.com/rubocop/rubocop/releases)
-
[Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
-
[Commits](https://github.com/rubocop/rubocop/compare/v1.75.5...v1.75.6)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-16 13:16:41 +08:00
e0132d1baf Build(deps): Bump bootsnap from 1.18.5 to 1.18.6 (#32757)
Bumps [bootsnap](https://github.com/Shopify/bootsnap) from 1.18.5 to
1.18.6.
-
[Changelog](https://github.com/Shopify/bootsnap/blob/main/CHANGELOG.md)
-
[Commits](https://github.com/Shopify/bootsnap/compare/v1.18.5...v1.18.6)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-16 13:16:29 +08:00
Sam
8437288b54 FIX: correctly guard for missing close method (#32760)
`?.close()` is an unsafe pattern

```
test = {}
test?.close()
VM363:1 Uncaught TypeError: test?.close is not a function
    at <anonymous>:1:7
```
2025-05-16 13:04:23 +10:00
3519226539 UX: Refactor the edit topic title UI (#32339) 2025-05-15 13:10:42 -05:00
9cb3e2c5d2 DEV: Refactor tests & add animation (#32547) 2025-05-15 13:10:29 -05:00
1f131fb854 UX: more consistent admin search hover/focus color (#32752)
little follow-up to 264b9db18896d4125fa9a75898867bd127d80316 to make
admin search match topic search hover/focus styles


Before:

![image](https://github.com/user-attachments/assets/070643f6-eee4-4671-a891-c0e4d5695c03)


After: 

![image](https://github.com/user-attachments/assets/8637ee7b-9d62-44a7-ab08-a062dd63f4f1)
2025-05-15 13:30:22 -04:00
264b9db188 UX: improve admin search focus states (#32751)
Before:

![image](https://github.com/user-attachments/assets/7fee4e81-433a-4783-9055-a6ecdd7f4e10)


After: 

![image](https://github.com/user-attachments/assets/2924e54c-438c-409d-85ae-3257ee608bd7)
2025-05-15 13:18:31 -04:00
8918537b55 FIX: adds missing search-input-wrapper (#32749)
This node has been incorrectly removed in
215a129b68

Before:

![Screenshot 2025-05-15 at 18 30
59](https://github.com/user-attachments/assets/f7a7a544-59da-49ed-8c87-4f821984f140)

After:

![Screenshot 2025-05-15 at 18 30
27](https://github.com/user-attachments/assets/de77a888-8f48-410b-a26a-7abe2e08f9e6)
2025-05-15 18:51:05 +02:00
d564386066 UX: Add discourse text icon (#32744)
![CleanShot 2025-05-15 at 12 02
49@2x](https://github.com/user-attachments/assets/eacf0376-4491-4fcd-8e7e-c052564f0093)
2025-05-15 15:58:32 +02:00
ce2729e676 DEV: trigger single event when multiple posts are destroyed at once (#32731)
a complement to the :post_destroyed event - customer needed an action to
happen just once when the wrench icon was used to delete one or more
posts ...
2025-05-15 09:57:07 -04:00
305ebedfa1 Allow passing a redirect path to a param on the /login route (#32711)
Detects the `redirect` queryParam on the /login route. If the user is
already logged in, navigates to that page. Otherwise, sets the
"destination_url" cookie so that the user will be redirected after
logging in.

If the param doesn't start with a single slash, ignore it and follow
previous behavior (navigate to "/" or log in then navigate there)

Respects subfolder configs.
2025-05-15 08:48:06 -05:00
2e4076f586 DEV: standardise toasts duration (#32741)
Toasts can now have two durations:
- `short` -> 3000ms
- `long` -> 5000ms

For backwards compatibility integer values still work but will display a deprecation message in the browser console.
2025-05-15 14:59:37 +02:00
215a129b68 Revert UX: header search mobile support (#32748)
This reverts the complete work on "Improvements to mobile search" while
respecting all the related changes that were made after the next two
PRs:

- https://github.com/discourse/discourse/pull/32306
- https://github.com/discourse/discourse/pull/31711
2025-05-15 14:27:40 +02:00
5a8ab0b007 Build(deps): Bump prosemirror-view from 1.39.2 to 1.39.3 in the prosemirror group (#32738)
Bumps the prosemirror group with 1 update:
[prosemirror-view](https://github.com/prosemirror/prosemirror-view).


Updates `prosemirror-view` from 1.39.2 to 1.39.3
-
[Changelog](https://github.com/ProseMirror/prosemirror-view/blob/master/CHANGELOG.md)
-
[Commits](https://github.com/prosemirror/prosemirror-view/compare/1.39.2...1.39.3)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-15 14:16:33 +02:00
11b740be89 DEV: Resolve content-tag initSync deprecation (#32746) 2025-05-15 13:04:52 +01:00
d90b03f3bf DEV: Remove deprecated/archived theme from CI (#32747) 2025-05-15 13:04:43 +01:00
358fc9631c DEV: Raise error if lib/viewport is imported (#32745) 2025-05-15 12:46:12 +01:00