Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
cedc38c
bump version to 1.10.0
blued-gear Jun 14, 2026
afb9c36
update vulnerable dependency
blued-gear Jun 14, 2026
63e3e20
Merge branch 'main' into bump_version
blued-gear Jun 23, 2026
06b0558
update to PHP 8.5 (composer broken)
blued-gear Jun 23, 2026
fe1aa7d
update dependencies for new PHP
blued-gear Jun 23, 2026
6611f77
fix small mistakes in code
blued-gear Jun 24, 2026
11757de
update Symfony part 1
blued-gear Jun 24, 2026
551cc02
update Symfony part 2
blued-gear Jun 25, 2026
22c1fa7
to be reverted
blued-gear Jun 25, 2026
1d71452
update Symfony part 3
blued-gear Jun 25, 2026
0117a40
update Symfony part 4
blued-gear Jun 25, 2026
ec2078b
update Symfony part 5
blued-gear Jun 25, 2026
26aeb24
update Symfony part 6
blued-gear Jun 25, 2026
f9d88e8
to be reverted
blued-gear Jun 25, 2026
601c305
update Symfony part 7
blued-gear Jun 25, 2026
e1eed09
update Symfony part 8
blued-gear Jun 25, 2026
bbead0d
update Symfony part 9
blued-gear Jun 25, 2026
b85dba5
update Symfony part 10
blued-gear Jun 25, 2026
99d0b16
update Symfony part 11
blued-gear Jun 25, 2026
f683706
update Symfony part 12
blued-gear Jun 25, 2026
466c652
"fix" deprecation
blued-gear Jun 25, 2026
cccb306
Merge branch 'main' into bump_version
blued-gear Jun 25, 2026
72774b8
rip out abandoned rss-atom-bundle
blued-gear Jun 25, 2026
8a0e373
update everything
blued-gear Jun 25, 2026
aa78b23
note about deprecation
blued-gear Jun 26, 2026
fa76b3e
reimplement RSS
blued-gear Jun 26, 2026
e285627
cleanup composer.json
blued-gear Jun 26, 2026
02af2b4
apply changes by major dependencies updates
blued-gear Jun 27, 2026
2ae95c1
apply changes by major dependencies updates
blued-gear Jun 27, 2026
e5d838e
update recipe
blued-gear Jun 27, 2026
f1a6ba3
js now uses module build type
blued-gear Jun 27, 2026
94053db
fix removed class
blued-gear Jun 27, 2026
9e5464c
fix Doctrine deprecation
blued-gear Jun 27, 2026
36159c1
fix deprecations
blued-gear Jun 27, 2026
0b3a196
fix a deprecation
blued-gear Jun 27, 2026
e493a9e
fix a fix
blued-gear Jun 27, 2026
6e488bb
fix deprecation
blued-gear Jun 27, 2026
d3de943
fix JS stuff
blued-gear Jun 27, 2026
310d74f
fix form
blued-gear Jun 28, 2026
9b50f24
fix deprecation
blued-gear Jun 28, 2026
5f88caa
improve behavior of magazine search in MagazineAutocompleteType
blued-gear Jun 28, 2026
0409db8
fix deprecation
blued-gear Jun 28, 2026
45ee7d2
fix js error
blued-gear Jun 28, 2026
74dfed0
linter
blued-gear Jun 28, 2026
e2e285a
update php linter
blued-gear Jun 28, 2026
300c9a5
Merge branch 'main' into upgrade_dependencies
blued-gear Jun 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
{
"name": "PHP",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image": "mcr.microsoft.com/devcontainers/php:3.0.3-8.4-trixie",
"image": "mcr.microsoft.com/devcontainers/php:3-8.5-trixie",

// Features to add to the dev container. More info: https://containers.dev/features.
"features": {
Expand Down
2 changes: 1 addition & 1 deletion assets/controllers/collapsable_controller.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Controller } from '@hotwired/stimulus';
import debounce from '../utils/debounce';
import debounce from '@app/utils/debounce';

// use some buffer-space so that the expand-button won't be included if just a couple of lines would be hidden
const MAX_COLLAPSED_HEIGHT_REM = 25;
Expand Down
2 changes: 1 addition & 1 deletion assets/controllers/comment_collapse_controller.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Controller } from '@hotwired/stimulus';
import { getLevel } from '../utils/mbin';
import { getLevel } from '@app/utils/mbin';

const COMMENT_ELEMENT_TAG = 'BLOCKQUOTE';
const COLLAPSIBLE_CLASS = 'collapsible';
Expand Down
4 changes: 2 additions & 2 deletions assets/controllers/entry_link_create_controller.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ApplicationController, useThrottle } from 'stimulus-use';
import { fetch, ok } from '../utils/http';
import router from '../utils/routing';
import { fetch, ok } from '@app/utils/http';
import router from '@app/utils/routing';

/* stimulusFetch: 'lazy' */
export default class extends ApplicationController {
Expand Down
2 changes: 1 addition & 1 deletion assets/controllers/html_refresh_controller.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { fetch, ok } from '../utils/http';
import { fetch, ok } from '@app/utils/http';
import { Controller } from '@hotwired/stimulus';

/* stimulusFetch: 'lazy' */
Expand Down
2 changes: 1 addition & 1 deletion assets/controllers/infinite_scroll_controller.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { fetch, ok } from '../utils/http';
import { fetch, ok } from '@app/utils/http';
import { Controller } from '@hotwired/stimulus';
import { useIntersection } from 'stimulus-use';

Expand Down
6 changes: 4 additions & 2 deletions assets/controllers/mentions_controller.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { fetch, ok } from '../utils/http';
import { fetch, ok } from '@app/utils/http';
import { Controller } from '@hotwired/stimulus';
import router from '../utils/routing';
import { defaultPopover } from '@app/utils/popover.js';
import router from '@app/utils/routing';

/* stimulusFetch: 'lazy' */
export default class extends Controller {
Expand Down Expand Up @@ -61,6 +62,7 @@ export default class extends Controller {

document.querySelector('.popover').innerHTML = response.html;

const popover = defaultPopover();
popover.trigger = event.target;
popover.selectedTrigger = event.target;
popover.element.dispatchEvent(new Event('openPopover'));
Expand Down
4 changes: 2 additions & 2 deletions assets/controllers/notifications_controller.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ThrowResponseIfNotOk, fetch } from '../utils/http';
import { ThrowResponseIfNotOk, fetch } from '@app/utils/http';
import { Controller } from '@hotwired/stimulus';
import Subscribe from '../utils/event-source';
import Subscribe from '@app/utils/event-source';

/* stimulusFetch: 'lazy' */
export default class extends Controller {
Expand Down
6 changes: 3 additions & 3 deletions assets/controllers/post_controller.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { fetch, ok } from '../utils/http';
import { fetch, ok } from '@app/utils/http';
import { Controller } from '@hotwired/stimulus';
import getIntIdFromElement from '../utils/mbin';
import router from '../utils/routing';
import getIntIdFromElement from '@app/utils/mbin';
import router from '@app/utils/routing';

/* stimulusFetch: 'lazy' */
export default class extends Controller {
Expand Down
4 changes: 2 additions & 2 deletions assets/controllers/preview_controller.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { fetch, ok } from '../utils/http';
import { fetch, ok } from '@app/utils/http';
import { Controller } from '@hotwired/stimulus';
import router from '../utils/routing';
import router from '@app/utils/routing';
import { useThrottle } from 'stimulus-use';

/* stimulusFetch: 'lazy' */
Expand Down
2 changes: 1 addition & 1 deletion assets/controllers/push_controller.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ThrowResponseIfNotOk, fetch } from '../utils/http';
import { ThrowResponseIfNotOk, fetch } from '@app/utils/http';
import { Controller } from '@hotwired/stimulus';

export default class extends Controller {
Expand Down
8 changes: 5 additions & 3 deletions assets/controllers/rich_textarea_controller.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Controller } from '@hotwired/stimulus';
import { fetch } from '../utils/http';
import { fetch } from '@app/utils/http';

/* stimulusFetch: 'lazy' */
export default class extends Controller {
Expand All @@ -17,7 +17,7 @@ export default class extends Controller {
emojiAutocompleteActive = false;
mentionAutocompleteActive = false;

abortController;
abortController = null;
requestActive = false;

selectedSuggestionIndex = 0;
Expand Down Expand Up @@ -114,7 +114,9 @@ export default class extends Controller {
this.selectedSuggestionIndex = 0;
this.emojiAutocompleteActive = false;
this.mentionAutocompleteActive = false;
this.abortController.abort();
if (null !== this.abortController) {
this.abortController.abort();
}
this.requestActive = false;
document.getElementById('user-suggestions')?.remove();
document.getElementById('emoji-suggestions')?.remove();
Expand Down
9 changes: 5 additions & 4 deletions assets/controllers/subject_controller.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { fetch, ok } from '../utils/http';
import getIntIdFromElement, { getDepth, getLevel, getTypeFromNotification } from '../utils/mbin';
import { fetch, ok } from '@app/utils/http';
import getIntIdFromElement, { getDepth, getLevel, getTypeFromNotification } from '@app/utils/mbin';
import { Controller } from '@hotwired/stimulus';
import router from '../utils/routing';
import { defaultPopover } from '@app/utils/popover.js';
import router from '@app/utils/routing';
import { useIntersection } from 'stimulus-use';

/* stimulusFetch: 'lazy' */
Expand Down Expand Up @@ -66,7 +67,7 @@ export default class extends Controller {
window.location.href = event.target.href;
} finally {
this.loadingValue = false;
popover.togglePopover(false);
defaultPopover().togglePopover(false);
}
}

Expand Down
6 changes: 3 additions & 3 deletions assets/controllers/subject_list_controller.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { fetch, ok } from '../utils/http';
import { getDepth, getLevel, getTypeFromNotification } from '../utils/mbin';
import { fetch, ok } from '@app/utils/http';
import { getDepth, getLevel, getTypeFromNotification } from '@app/utils/mbin';
import { Controller } from '@hotwired/stimulus';
import router from '../utils/routing';
import router from '@app/utils/routing';

/* stimulusFetch: 'lazy' */
export default class extends Controller {
Expand Down
2 changes: 1 addition & 1 deletion assets/controllers/subs_controller.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { fetch, ok } from '../utils/http';
import { fetch, ok } from '@app/utils/http';
import { Controller } from '@hotwired/stimulus';

/* stimulusFetch: 'lazy' */
Expand Down
2 changes: 1 addition & 1 deletion assets/controllers/subs_panel_controller.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Controller } from '@hotwired/stimulus';
import router from '../utils/routing';
import router from '@app/utils/routing';

const KBIN_SUBSCRIPTIONS_IN_SEPARATE_SIDEBAR = 'kbin_subscriptions_in_separate_sidebar';
const KBIN_SUBSCRIPTIONS_SIDEBARS_SAME_SIDE = 'kbin_subscriptions_sidebars_same_side';
Expand Down
63 changes: 38 additions & 25 deletions assets/controllers/timeago_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,23 @@ import { Controller } from '@hotwired/stimulus';
/* eslint-disable camelcase -- zh_TW is a specific identifier */
// eslint-disable-next-line -- grouping timeago imports here is more readable than properly sorting
import * as timeago from 'timeago.js';
import bg from 'timeago.js/lib/lang/bg';
import da from 'timeago.js/lib/lang/da';
import de from 'timeago.js/lib/lang/de';
import el from 'timeago.js/lib/lang/el';
import en from 'timeago.js/lib/lang/en_US';
import es from 'timeago.js/lib/lang/es';
import fr from 'timeago.js/lib/lang/fr';
import gl from 'timeago.js/lib/lang/gl';
import it from 'timeago.js/lib/lang/it';
import ja from 'timeago.js/lib/lang/ja';
import nl from 'timeago.js/lib/lang/nl';
import pl from 'timeago.js/lib/lang/pl';
import pt_BR from 'timeago.js/lib/lang/pt_BR';
import ru from 'timeago.js/lib/lang/ru';
import tr from 'timeago.js/lib/lang/tr';
import uk from 'timeago.js/lib/lang/uk';
import zh_TW from 'timeago.js/lib/lang/zh_TW';
import bg from 'timeago.js/lib/lang/bg.js';
import da from 'timeago.js/lib/lang/da.js';
import de from 'timeago.js/lib/lang/de.js';
import el from 'timeago.js/lib/lang/el.js';
import en from 'timeago.js/lib/lang/en_US.js';
import es from 'timeago.js/lib/lang/es.js';
import fr from 'timeago.js/lib/lang/fr.js';
import gl from 'timeago.js/lib/lang/gl.js';
import it from 'timeago.js/lib/lang/it.js';
import ja from 'timeago.js/lib/lang/ja.js';
import nl from 'timeago.js/lib/lang/nl.js';
import pl from 'timeago.js/lib/lang/pl.js';
import pt_BR from 'timeago.js/lib/lang/pt_BR.js';
import ru from 'timeago.js/lib/lang/ru.js';
import tr from 'timeago.js/lib/lang/tr.js';
import uk from 'timeago.js/lib/lang/uk.js';
import zh_TW from 'timeago.js/lib/lang/zh_TW.js';

/* stimulusFetch: 'lazy' */
export default class extends Controller {
Expand All @@ -30,13 +30,26 @@ export default class extends Controller {
}

const lang = document.documentElement.lang;
const languages = { bg, da, de, el, en, es, fr, gl, it, ja, nl, pl, pt_BR, ru, tr, uk, zh_TW };

if (languages[lang]) {
timeago.register(lang, languages[lang]);
timeago.render(elems, lang);
} else {
timeago.render(elems);
}
const languages = {
bg: bg.default,
da: da.default,
de: de.default,
el: el.default,
en: en.default,
es: es.default,
fr: fr.default,
gl: gl.default,
it: it.default,
ja: ja.default,
nl: nl.default,
pl: pl.default,
pt_BR: pt_BR.default,
ru: ru.default,
tr: tr.default,
uk: uk.default,
zh_TW: zh_TW.default,
};
timeago.register(lang, languages[lang]);
timeago.render(elems, lang);
}
}
45 changes: 45 additions & 0 deletions assets/controllers/tomselect_clear_on_load_controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { Controller } from '@hotwired/stimulus';

export default class extends Controller {

_orgLoad = null;
_tomselect = null;

initialize() {
this._onPreConnect = this._onPreConnect.bind(this);
this._onConnect = this._onConnect.bind(this);
this._onSearchLoad = this._onSearchLoad.bind(this);
}

connect() {
this.element.addEventListener('autocomplete:pre-connect', this._onPreConnect);
this.element.addEventListener('autocomplete:connect', this._onConnect);
}

disconnect() {
this.element.removeEventListener('autocomplete:connect', this._onConnect);
this.element.removeEventListener('autocomplete:pre-connect', this._onPreConnect);
}

_onPreConnect(event) {
this._orgLoad = event.detail.options.load;
event.detail.options.load = this._onSearchLoad;
}

_onConnect(event) {
this._tomselect = event.detail.tomSelect;
this._orgLoad = this._orgLoad.bind(this._tomselect);
}

_onSearchLoad(query, callback) {
this._tomselect.clear();
this._tomselect.clearActiveItems();
this._tomselect.clearActiveOption();
this._tomselect.clearFilter();
this._tomselect.clearOptions();
this._tomselect.clearPagination();
this._tomselect.clearCache();

this._orgLoad(query, callback);
}
}
11 changes: 4 additions & 7 deletions assets/stimulus_bootstrap.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
// register any custom, 3rd party controllers here
// app.register('some_controller_name', SomeImportedController);
import { startStimulusApp } from '@symfony/stimulus-bridge';

// Registers Stimulus controllers from controllers.json and in the controllers/ directory
export const app = startStimulusApp(require.context(
'@symfony/stimulus-bridge/lazy-controller-loader!./controllers',
true,
/\.[jt]sx?$/,
));
export const app = startStimulusApp(import.meta.webpackContext('@symfony/stimulus-bridge/lazy-controller-loader!./controllers', {
recursive: true,
regExp: /\.[jt]sx?$/,
}));
5 changes: 5 additions & 0 deletions assets/styles/_variables.scss
Original file line number Diff line number Diff line change
Expand Up @@ -179,4 +179,9 @@ $aspect-ratios: (

--mbin-details-detail-label: "Details";
--mbin-details-spoiler-label: "Spoiler";

// ---------------------------------------------------------------------------
// Overwrites for libraries
// ---------------------------------------------------------------------------
--fa-width: auto;
}
3 changes: 3 additions & 0 deletions assets/styles/layout/_breakpoints.scss
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
@if not $n {
@error "breakpoint `#{$name}` not found in `#{$breakpoints}`";
}
//TODO migrate all SCSS if to official CSS if once it supported by all major browsers
// https://sass-lang.com/documentation/breaking-changes/if-function/
// https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/if
@return if($n < list.length($breakpoint-names), list.nth($breakpoint-names, $n + 1), null);
}

Expand Down
9 changes: 5 additions & 4 deletions assets/styles/layout/_forms.scss
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
@use 'breakpoints' as b;
@use '../mixins/mbin';
@use '@fortawesome/fontawesome-free/scss/fontawesome' as fa;
@use '@fortawesome/fontawesome-free/scss/fa' as fa;
@use '@fortawesome/fontawesome-free/scss/solid' as faSolid;
// needed for the checkmark do render correctly even though it is not directly used
@use '@fortawesome/fontawesome-free/scss/solid' as faS;

Expand Down Expand Up @@ -138,16 +139,16 @@ input[type=radio] {
-webkit-appearance: none;
appearance: none;
font-size: 0.9rem;
display: grid;
display: grid !important;
margin: 0px;
width: 1.5rem;
width: 1.5rem !important;
height: 1.5rem;
justify-content: center;
align-items: center;
align-content: center;
cursor: pointer;

@include fa.fa-icon-solid(fa.$fa-var-check);
@include faSolid.icon(fa.$var-check);

&::before {
transform: scale(0);
Expand Down
Loading
Loading