diff --git a/Gemfile.lock b/Gemfile.lock index 4c73766e99..32a4a17fce 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -81,20 +81,20 @@ GEM attr_required (1.0.1) awrence (1.1.1) aws-eventstream (1.2.0) - aws-partitions (1.558.0) - aws-sdk-core (3.127.0) + aws-partitions (1.579.0) + aws-sdk-core (3.130.2) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.525.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-kms (1.55.0) + aws-sdk-kms (1.56.0) aws-sdk-core (~> 3, >= 3.127.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.113.0) + aws-sdk-s3 (1.113.1) aws-sdk-core (~> 3, >= 3.127.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.4) - aws-sigv4 (1.4.0) + aws-sigv4 (1.5.0) aws-eventstream (~> 1, >= 1.0.2) bcrypt (3.1.17) better_errors (2.9.1) @@ -322,7 +322,7 @@ GEM terminal-table (>= 1.5.1) idn-ruby (0.1.4) ipaddress (0.8.3) - jmespath (1.6.0) + jmespath (1.6.1) json (2.5.1) json-canonicalization (0.3.0) json-jwt (1.13.0) @@ -617,7 +617,7 @@ GEM sidekiq (>= 3) thwait tilt (>= 1.4.0) - sidekiq-unique-jobs (7.1.19) + sidekiq-unique-jobs (7.1.21) brpoplpush-redis_script (> 0.1.1, <= 2.0.0) concurrent-ruby (~> 1.0, >= 1.0.5) sidekiq (>= 5.0, < 8.0) diff --git a/app/javascript/images/alert_badge.png b/app/javascript/images/alert_badge.png new file mode 100644 index 0000000000..681f6e6516 Binary files /dev/null and b/app/javascript/images/alert_badge.png differ diff --git a/app/javascript/images/icon_bookmarks.png b/app/javascript/images/icon_bookmarks.png new file mode 100644 index 0000000000..b0cff13442 Binary files /dev/null and b/app/javascript/images/icon_bookmarks.png differ diff --git a/app/javascript/images/icon_developers.png b/app/javascript/images/icon_developers.png new file mode 100644 index 0000000000..c6d2e18294 Binary files /dev/null and b/app/javascript/images/icon_developers.png differ diff --git a/app/javascript/images/icon_direct.png b/app/javascript/images/icon_direct.png new file mode 100644 index 0000000000..71e898a98f Binary files /dev/null and b/app/javascript/images/icon_direct.png differ diff --git a/app/javascript/images/icon_docs.png b/app/javascript/images/icon_docs.png new file mode 100644 index 0000000000..6af1c82689 Binary files /dev/null and b/app/javascript/images/icon_docs.png differ diff --git a/app/javascript/images/icon_domain_blocks.png b/app/javascript/images/icon_domain_blocks.png new file mode 100644 index 0000000000..ed3750485a Binary files /dev/null and b/app/javascript/images/icon_domain_blocks.png differ diff --git a/app/javascript/images/icon_invite.png b/app/javascript/images/icon_invite.png new file mode 100644 index 0000000000..21156ec96b Binary files /dev/null and b/app/javascript/images/icon_invite.png differ diff --git a/app/javascript/images/icon_mobile_apps.png b/app/javascript/images/icon_mobile_apps.png new file mode 100644 index 0000000000..a7cbd78c18 Binary files /dev/null and b/app/javascript/images/icon_mobile_apps.png differ diff --git a/app/javascript/images/icon_notifications.png b/app/javascript/images/icon_notifications.png new file mode 100644 index 0000000000..0aaf5e68d2 Binary files /dev/null and b/app/javascript/images/icon_notifications.png differ diff --git a/app/javascript/images/icon_profile_directory.png b/app/javascript/images/icon_profile_directory.png new file mode 100644 index 0000000000..05a94213a2 Binary files /dev/null and b/app/javascript/images/icon_profile_directory.png differ diff --git a/app/javascript/images/icon_tos.png b/app/javascript/images/icon_tos.png new file mode 100644 index 0000000000..d0dbb13f77 Binary files /dev/null and b/app/javascript/images/icon_tos.png differ diff --git a/app/javascript/styles/win95.scss b/app/javascript/styles/win95.scss index fdf2e59b60..66d451303a 100644 --- a/app/javascript/styles/win95.scss +++ b/app/javascript/styles/win95.scss @@ -9,6 +9,7 @@ $win95-mid-grey: #808080; $win95-window-header: #00007f; $win95-tooltip-yellow: #ffffcc; $win95-blue: blue; +$win95-cyan: #008080; $ui-base-lighter-color: $win95-dark-grey; $ui-highlight-color: $win95-window-header; @@ -21,6 +22,12 @@ $ui-highlight-color: $win95-window-header; border-radius:0px; } +@mixin win95-border-outset-sides-only() { + border-left: 2px solid #efefef; + border-right: 2px solid #404040; + border-radius:0px; +} + @mixin win95-outset() { box-shadow: inset -1px -1px 0px #000000, inset 1px 1px 0px #ffffff, @@ -29,6 +36,12 @@ $ui-highlight-color: $win95-window-header; border-radius:0px; } +@mixin win95-outset-no-highlight() { + box-shadow: inset -1px -1px 0px #000000, + inset -2px -2px 0px #808080; + border-radius:0px; +} + @mixin win95-border-inset() { border-left: 2px solid #404040; border-top: 2px solid #404040; @@ -54,6 +67,7 @@ $ui-highlight-color: $win95-window-header; border-radius:0px; } + @mixin win95-tab() { box-shadow: inset -1px 0px 0px #000000, inset 1px 0px 0px #ffffff, @@ -66,8 +80,14 @@ $ui-highlight-color: $win95-window-header; border-top-right-radius: 1px; } +@mixin win95-border-groove() { + border-radius: 0px; + border: 2px groove #bfbfbf; +} + @mixin win95-reset() { box-shadow: unset; + border: 0px solid transparent; } @font-face { @@ -80,49 +100,98 @@ $ui-highlight-color: $win95-window-header; /* borrowed from cybrespace style: wider columns and full column width images */ @media screen and (min-width: 1300px) { - .column { - flex-grow: 1 !important; - max-width: 400px; - } - .drawer { - width: 17%; + width: 17%; /* Not part of the flex fun */ max-width: 400px; min-width: 330px; } + .layout-multiple-columns .column { + flex-grow: 1 !important; + max-width: 400px; + } } -.media-gallery, -.video-player { - max-height:30vh; - height:30vh !important; +/* Don't show outline around statuses if we're in + * mouse or touch mode (rather than keyboard) */ +[data-whatinput="mouse"], [data-whatinput="touch"] { + .status__content:focus, .status:focus, + .status__wrapper:focus, .status__content__text:focus { + outline: none; + } +} + +/* Less emphatic show more */ +.status__content__read-more-button { + font-size: 14px; + color: $dark-text-color; + + .status__prepend-icon { + padding-right: 4px; + } +} + +/* Show a little arrowey thing after the time in a + * status to signal that you can click it to see + * a detailed view */ +.status time:after, +.detailed-status__datetime span:after { + font: normal normal normal 14px/1 FontAwesome; + content: "\00a0\00a0\f08e"; +} + +/* Don't display the elephant mascot (we have our + * own, thanks) */ +.drawer__inner__mastodon { + display: none; +} + +/* Let the compose area/drawer be short, but + * expand if necessary */ +.drawer .drawer__inner { + overflow: visible; + height:inherit; + background-image: none; +} +.drawer__pager { + overflow-y:auto; +} + +/* Put a reasonable background on the single-column compose form */ +.layout-single-column .compose-panel { + background-color: $ui-base-color; + height: auto; + max-height: 100%; + overflow-y: visible; + margin-top: 65px; +} + +/* Better distinguish the search bar */ +.layout-single-column .compose-panel .search { position:relative; - margin-top:20px; - margin-left:-68px; - width: calc(100% + 80px) !important; - max-width: calc(100% + 80px); + top: -55px; + margin-bottom: -55px; } -.detailed-status .media-gallery, -.detailed-status .video-player { - margin-left:-5px; - width: calc(100% + 9px); - max-width: calc(100% + 9px); +/* Use display: none instead of visibility:hidden + * to hide the suggested follows list on non-mobile */ +@media screen and (min-width: 630px) { + .search-results .trends { + display:none; + } } -.video-player video { - transform: unset; - top: unset; -} - -.detailed-status .media-spoiler, -.status .media-spoiler { - height: 100%!important; - vertical-align: middle; +/* Don't display the weird triangles on the modal layout, + * because they look strange on cybrespace themes. */ +.modal-layout__mastodon { + display:none; } /* main win95 style */ +html { + scrollbar-color: $win95-mid-grey transparent; +} + body { font-size:13px; font-family: "MS Sans Serif", "premillenium", sans-serif; @@ -132,7 +201,7 @@ body { .ui, .ui .columns-area, body.admin { - background: #008080; + background: $win95-cyan; } .loading-bar { @@ -140,6 +209,10 @@ body.admin { background-color: #000080; } +.tabs-bar__wrapper { + background-color: $win95-cyan; +} + .tabs-bar { background: $win95-bg; @include win95-outset(); @@ -214,10 +287,6 @@ body.admin { z-index:2; } -.column { - max-height:100vh; -} - .column > .scrollable { background: $win95-bg; @include win95-border-outset(); @@ -231,7 +300,7 @@ body.admin { } .column-header { - padding:2px; + padding:0px; font-size:13px; background:#7f7f7f; @include win95-border-outset(); @@ -239,6 +308,12 @@ body.admin { color:white; font-weight:bold; align-items:baseline; + min-height: 24px; +} + +.column-header > button { + padding: 0px; + min-height: 22px; } .column-header__wrapper.active { @@ -259,18 +334,22 @@ body.admin { .column-header__buttons { max-height: 20px; - margin-right:0px; + margin: 2px; + margin-left: -2px; +} + +.column-header__buttons button { + margin-left: 2px; } .column-header__button { background: $win95-bg; color: black; + @include win95-outset(); + line-height:0px; font-size:14px; - max-height:20px; - padding:0px 2px; - margin-top:2px; - @include win95-outset(); + padding:0px 4px; &:hover { color: black; @@ -282,24 +361,34 @@ body.admin { background-color:#7f7f7f; } -.column-header__back-button { +// selectivity -- needs to override .column-header > button +.column-header .column-header__back-button { background: $win95-bg; color: black; padding:2px; - max-height:20px; - margin-top:2px; + padding-right: 4px; + max-height: 20px; + min-height: unset; + margin: 2px; @include win95-outset(); - font-size:13px; + font-size: 13px; + line-height: 17px; font-weight:bold; } +.column-header__buttons .column-header__back-button { + margin: 0; +} + .column-back-button { background:$win95-bg; color:black; @include win95-outset(); - padding:2px; font-size:13px; font-weight:bold; + + padding: 2px; + height: 26px; } .column-back-button--slim-button { @@ -307,8 +396,8 @@ body.admin { top:-22px; right:4px; max-height:20px; - max-width:60px; - padding:0px 2px; + padding: 1px 6px 0 2px; + box-sizing: border-box; } .column-back-button__icon { @@ -331,10 +420,9 @@ body.admin { } .column-header__collapsible__extra div[role="group"] { - border: 2px groove $win95-bg; - border-radius:4px; - margin-bottom:8px; - padding:4px; + border: 2px groove #eee; + margin-bottom: 11px; + padding: 4px; } .column-inline-form { @@ -342,19 +430,37 @@ body.admin { @include win95-border-outset(); border-bottom-width:0px; border-top-width:0px; + + align-items: baseline; +} + +.column-inline-form .icon-button { + font-size: 14px!important; + line-height: 17px!important; +} + +.column-inline-form .setting-text { + line-height: 17px; + padding-left: 4px; } .column-settings__section { color:black; font-weight:bold; font-size:11px; - position:relative; - top: -12px; - left:4px; - background-color:$win95-bg; +} + +[role="group"] .column-settings__section { display:inline-block; - padding:0px 4px; - margin-bottom:0px; + background-color:$win95-bg; + position:relative; + + top: -14px; + top: calc(-1em - 0.5ex); + left: 4px; + + padding: 0px 4px; + margin-bottom: 0px; } .setting-meta__label, .setting-toggle__label { @@ -448,8 +554,7 @@ body.admin { } .missing-indicator > div { - background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRUaXRsZQAACJnLyy9Jyy/NSwEAD5IDblIFOhoAAAAXelRYdEF1dGhvcgAACJlLzijKz0vMAQALmgLoDsFj8gAAAQpJREFUOMuVlD0OwjAMhd2oQl04Axfo0IGBgYELcAY6cqQuSO0ZOEAZGBg6VKg74gwsEaoESRVHjusI8aQqzY8/PbtOEz1qkFSn2YevlaNOpLMJh2DwvixhuXtOa6/LCh51DUMEFkAsgAZD207Doin8mQ562JpRE5CHBAAhmIqD1L8AqzUUUJkxc6kr3AgAJ+NuvIWRdk7WcrKl0AUqcIBBHOiEbpS4m27mIL5Onfg3k0rgggeQuS2sDOGSahKR+glgqaGLgUJs951NN1q9D72cQqQWR9cr3sm9YcEssEuz6eEuZh2bu0aSOhQ1MBezu2O/+TVSvEFII3qLsZWrSA2AAUQIh1HpyP/kC++zjVSMj6ntAAAAAElFTkSuQmCC') - no-repeat; + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRUaXRsZQAACJnLyy9Jyy/NSwEAD5IDblIFOhoAAAAXelRYdEF1dGhvcgAACJlLzijKz0vMAQALmgLoDsFj8gAAAQpJREFUOMuVlD0OwjAMhd2oQl04Axfo0IGBgYELcAY6cqQuSO0ZOEAZGBg6VKg74gwsEaoESRVHjusI8aQqzY8/PbtOEz1qkFSn2YevlaNOpLMJh2DwvixhuXtOa6/LCh51DUMEFkAsgAZD207Doin8mQ562JpRE5CHBAAhmIqD1L8AqzUUUJkxc6kr3AgAJ+NuvIWRdk7WcrKl0AUqcIBBHOiEbpS4m27mIL5Onfg3k0rgggeQuS2sDOGSahKR+glgqaGLgUJs951NN1q9D72cQqQWR9cr3sm9YcEssEuz6eEuZh2bu0aSOhQ1MBezu2O/+TVSvEFII3qLsZWrSA2AAUQIh1HpyP/kC++zjVSMj6ntAAAAAElFTkSuQmCC') no-repeat; background-position:center center; } @@ -459,6 +564,34 @@ body.admin { color: black; } +.notification__filter-bar { + background: $win95-bg; + @include win95-border-outset-sides-only(); + padding-top: 10px; + padding-left: 10px; + padding-right: 10px; + border-bottom: 2px solid #efefef; + overflow-y: visible; + + button { + background: transparent; + color: black; + padding: 8px 0; + align-self: end; + @include win95-tab(); + + &.active { + color: black; + top: 2px; + background-color: $win95-bg; + + &::before, &::after { + display:none; + } + } + } +} + .status__wrapper { border: 2px groove $win95-bg; margin:4px; @@ -473,11 +606,37 @@ body.admin { } .status.status-direct { - background-color:$win95-bg; + background:$win95-bg; + &:focus, &:active { + background:$win95-bg; + } + + &:not(.read) { + background: white; + } +} +.focusable:focus .status.status-direct { + background:$win95-bg; } -.status__content { +[data-whatinput="mouse"], [data-whatinput="touch"] { + .status__content:focus, .status:focus, + .status__wrapper:focus, .status__content__text:focus { + background-color: $win95-bg; + } + + .status.status-direct, .detailed-status { + &:not(.read) { + .status__content:focus { + background-color: white; + } + } + } +} + +.status__content, .reply-indicator__content { font-size:13px; + color: black; } .status.light .status__relative-time, @@ -573,6 +732,7 @@ body.admin { justify-items:left; padding-left:4px; } + .icon-button { background:$win95-bg; @include win95-border-outset(); @@ -636,15 +796,15 @@ body.admin { padding-right:25px; } -.status-card { +.status-card, .status-card.compact, a.status-card, a.status-card.compact { border-radius:0px; background:white; border: 1px solid black; color:black; -} -.status-card:hover { - background-color:white; + &:hover { + background-color:white; + } } .status-card__title { @@ -681,7 +841,7 @@ body.admin { } .account { - border-bottom: 2px groove $win95-bg; + border-bottom: none; } .reply-indicator__content .status__content__spoiler-link, .status__content .status__content__spoiler-link { @@ -715,6 +875,7 @@ body.admin { font-weight:bold; } + .drawer__header { background: $win95-bg; @include win95-border-outset(); @@ -819,6 +980,23 @@ body.admin { color:blue; } +.search-results__section h5:before { + display: none; +} + +.search-results__section h5 { + background: #bfbfbf; + span { + color: black; + padding: 0px 2px; + } +} + +.search-results__section { + border: 3px groove white; + margin: 11px 6px 9px 3px; +} + .search-results__section .account:hover, .search-results__section .account:hover .account__display-name, .search-results__section .account:hover .account__display-name strong, @@ -839,6 +1017,11 @@ body.admin { } } +.trends__item__name a, +.trends__item__current { + color: black; +} + .drawer__inner, .drawer__inner.darker { background-color:$win95-bg; @@ -893,6 +1076,10 @@ body.admin { border-left: 2px groove $win95-bg; } +.compose-form__poll-wrapper .icon-button.disabled { + color: $win95-mid-grey; +} + .privacy-dropdown.active .privacy-dropdown__value.active, .advanced-options-dropdown.open .advanced-options-dropdown__value { background: $win95-bg; @@ -932,32 +1119,34 @@ body.admin { font-weight:bold; } -.compose-form__warning::before { - content:"Tip:"; - font-weight:bold; - display:block; - position:absolute; - top:-10px; - background-color:$win95-bg; - font-size:11px; - padding: 0px 5px; -} +.compose-form { + .compose-form__warning::before { + content:"Tip:"; + font-weight:bold; + display:block; + position:absolute; + top:-10px; + background-color:$win95-bg; + font-size:11px; + padding: 0px 5px; + } -.compose-form__warning { - position:relative; - box-shadow:unset; - border:2px groove $win95-bg; - background-color:$win95-bg; - color:black; -} + .compose-form__warning { + position:relative; + box-shadow:unset; + border:2px groove $win95-bg; + background-color:$win95-bg; + color:black; + } -.compose-form__warning a { - color:blue; -} + .compose-form__warning a { + color:blue; + } -.compose-form__warning strong { - color:black; - text-decoration:underline; + .compose-form__warning strong { + color:black; + text-decoration:underline; + } } .compose-form__buttons button.active:last-child { @@ -1052,44 +1241,8 @@ body.admin { } -#Getting-started { - background-color:$win95-bg; - @include win95-inset(); - border-bottom-width:0px; -} - -#Getting-started::before { - content:"Start"; - color:black; - font-weight:bold; - font-size:15px; - width:80%; - text-align:center; - display:block; - position:absolute; - right:2px; -} - -#Getting-started { - position:relative; - padding:5px 15px; - width:60px; - font-size:0px; - color:$win95-bg; - - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); - background-repeat:no-repeat; - background-position:8%; - background-clip:padding-box; - background-size:auto 50%; -} - -.column-subheading { - background-color:$win95-bg; - color:black; - border-bottom: 2px groove $win95-bg; - text-transform: none; - font-size: 16px; +.button.button-secondary { + background-color: $win95-bg; } .column-link { @@ -1101,18 +1254,82 @@ body.admin { } } +.column-link__badge { + background-image: url('~images/alert_badge.png'); + background-repeat: no-repeat; + background-size:contain; + background-color:transparent; + border-radius:0; + box-sizing: border-box; + width: 24px; + height:24px; + padding-top:4px; + padding-left:0px; + padding-right:1px; + text-align:center; + position:relative; + top:2px; +} + +.column-link:hover .column-link__badge { + color:black; +} + +.column-subheading { + background-color:$win95-bg; + color:black; + @include win95-border-outset-sides-only; +} + +.column { + overflow-y:auto; +} + +.getting-started { + background: none; + position:relative; + top:-30px; + padding-top:30px; + z-index:10; + overflow-y:auto; + background-color: $win95-cyan; +} + .getting-started__wrapper { + padding-top:0px; + + box-shadow: inset -1px 0px 0px #000000, + inset 1px 1px 0px #ffffff, + inset -2px 0px 0px #808080, + inset 2px 2px 0px #dfdfdf; + border-radius:0px; + + background-color:$win95-bg; + border-bottom: 2px groove $win95-bg; + + height: unset !important; + + .navigation-bar { + padding-left: 45px; + } + .column-subheading { font-size:0px; margin:0px; padding:0px; + background-color: transparent; + color:black; + border-bottom: 2px groove $win95-bg; + text-transform: none; } - .column-link { +} + +.column-link { background-size:32px 32px; background-repeat:no-repeat; background-position: 36px 50%; - padding-left:40px; + padding-left:45px; &:hover { background-size:32px 32px; @@ -1125,8 +1342,144 @@ body.admin { width:32px; } } + +.getting-started__wrapper::before { + content: "Start"; + display:block; + color:black; + font-weight:bold; + font-size:15px; + position:absolute; + top:0px; + left:0px; + padding:5px 15px; + width:50px; + font-size:16px; + padding-left:25px; + background-color:$win95-bg; + z-index:12; + + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); + background-repeat:no-repeat; + background-position:8%; + background-clip:padding-box; + background-size:auto 50%; + + @include win95-border-inset(); } + +@media screen and (min-width: 360px) { + .getting-started__wrapper{ + margin-bottom:0px; + } +} + +@media screen and (max-width: 360px) { + .getting-started { + top:0px; + padding-top:0px; + } + + .getting-started__wrapper::before { + display:none; + } +} + +.getting-started__footer { + background-color: $win95-bg; + padding:0px; + padding-bottom:10px; + position:relative; + top:0px; + + @include win95-outset-no-highlight(); + + p { + margin-left: 45px; + } + + ul { + display:block; + li { + cursor:pointer; + display:block; + font-size:0px; + padding:0px; + line-height:0; + a { + padding:15px; + padding-left:77px; + line-height:1em; + font-size:16px; + display:block; + color:black; + background-size:32px 32px; + background-repeat:no-repeat; + background-position: 36px 50%; + &:hover { + text-decoration:none; + } + } + + &:hover { + background-color: $win95-window-header; + a { + color:white; + } + } + } + } +} + +.getting-started__footer::after { + content:"Mastodon 95"; + font-weight:bold; + font-size:23px; + color:white; + line-height:30px; + padding-left:20px; + padding-right:40px; + + left:0px; + box-sizing:border-box; + bottom:-32px; + display:block; + position:absolute; + background-color:#7f7f7f; + width:1000px; + height:32px; + + z-index:11; + + border-left: 2px solid #404040; + border-top: 2px solid #efefef; + border-right: 2px solid #efefef; + border-radius:0px; + + -ms-transform: rotate(-90deg); + + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + transform-origin:top left; +} + +.layout-single-column .getting-started__footer::after { + display: none; +} + +.getting-started__wrapper + .flex-spacer { + display:none; +} + +.column-link[href="/web/timelines/home"] { + background-image: url("~images/icon_home.png"); + &:hover { background-image: url("~images/icon_home.png"); } +} +.column-link[href="/web/notifications"] { + background-image: url("~images/icon_notifications.png"); + &:hover { background-image: url("~images/icon_notifications.png"); } +} .column-link[href="/web/timelines/public"] { background-image: url("~images/icon_public.png"); &:hover { background-image: url("~images/icon_public.png"); } @@ -1135,6 +1488,10 @@ body.admin { background-image: url("~images/icon_local.png"); &:hover { background-image: url("~images/icon_local.png"); } } +.column-link[href="/web/timelines/direct"] { + background-image: url("~images/icon_direct.png"); + &:hover { background-image: url("~images/icon_direct.png"); } +} .column-link[href="/web/pinned"] { background-image: url("~images/icon_pin.png"); &:hover { background-image: url("~images/icon_pin.png"); } @@ -1151,62 +1508,62 @@ body.admin { background-image: url("~images/icon_follow_requests.png"); &:hover { background-image: url("~images/icon_follow_requests.png"); } } -.column-link[href="/web/keyboard-shortcuts"] { - background-image: url("~images/icon_keyboard_shortcuts.png"); - &:hover { background-image: url("~images/icon_keyboard_shortcuts.png"); } -} .column-link[href="/web/blocks"] { background-image: url("~images/icon_blocks.png"); &:hover { background-image: url("~images/icon_blocks.png"); } } +.column-link[href="/web/domain_blocks"] { + background-image: url("~images/icon_domain_blocks.png"); + &:hover { background-image: url("~images/icon_domain_blocks.png"); } +} .column-link[href="/web/mutes"] { background-image: url("~images/icon_mutes.png"); &:hover { background-image: url("~images/icon_mutes.png"); } } -.column-link[href="/settings/preferences"] { - background-image: url("~images/icon_settings.png"); - &:hover { background-image: url("~images/icon_settings.png"); } +.column-link[href="/web/directory"] { + background-image: url("~images/icon_profile_directory.png"); + &:hover { background-image: url("~images/icon_profile_directory.png"); } } -.column-link[href="/about/more"] { +.column-link[href="/web/bookmarks"] { + background-image: url("~images/icon_bookmarks.png"); + &:hover { background-image: url("~images/icon_bookmarks.png"); } +} + +.getting-started__footer ul li a[href="/web/keyboard-shortcuts"] { + background-image: url("~images/icon_keyboard_shortcuts.png"); + &:hover { background-image: url("~images/icon_keyboard_shortcuts.png"); } +} +.getting-started__footer ul li a[href="/invites"] { + background-image: url("~images/icon_invite.png"); + &:hover { background-image: url("~images/icon_invite.png"); } +} +.getting-started__footer ul li a[href="/terms"] { + background-image: url("~images/icon_tos.png"); + &:hover { background-image: url("~images/icon_tos.png"); } +} +.getting-started__footer ul li a[href="https://docs.joinmastodon.org"] { + background-image: url("~images/icon_docs.png"); + &:hover { background-image: url("~images/icon_docs.png"); } +} +.getting-started__footer ul li a[href="/about/more"] { background-image: url("~images/icon_about.png"); &:hover { background-image: url("~images/icon_about.png"); } } -.column-link[href="/auth/sign_out"] { +.getting-started__footer ul li a[href="/auth/sign_out"] { background-image: url("~images/icon_logout.png"); &:hover { background-image: url("~images/icon_logout.png"); } } - -.getting-started__footer { - display:none; +.getting-started__footer ul li a[href="https://joinmastodon.org/apps"] { + background-image: url("~images/icon_mobile_apps.png"); + &:hover { background-image: url("~images/icon_mobile_apps.png"); } } - -.getting-started__wrapper::before { - content:"Mastodon 95"; - font-weight:bold; - font-size:23px; - color:white; - line-height:30px; - padding-left:20px; - padding-right:40px; - - left:0px; - bottom:-30px; - display:block; - position:absolute; - background-color:#7f7f7f; - width:200%; - height:30px; - - -ms-transform: rotate(-90deg); - - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); - transform-origin:top left; +.getting-started__footer ul li a[href="/settings/applications"] { + background-image: url("~images/icon_developers.png"); + &:hover { background-image: url("~images/icon_developers.png"); } } - -.getting-started__wrapper { - @include win95-border-outset(); - background-color:$win95-bg; +.getting-started__footer ul li a[href="/auth/edit"] { + background-image: url("~images/icon_settings.png"); + &:hover { background-image: url("~images/icon_settings.png"); } } .column .static-content.getting-started { @@ -1225,12 +1582,37 @@ body.admin { color:white; } +.account__header__fields { + border-left: 1px solid black; + border-top: 1px solid black; + + dt { + background-color:$win95-bg; + color:black; + border-top: 1px solid #ffffff; + border-bottom: 1px solid $win95-mid-grey; + border-right: 1px solid $win95-mid-grey; + } + dd { + background-color:white; + border: 1px solid $win95-bg; + color:black; + } + dd,dt { + padding: 5px 8px; + } +} + .account-authorize__wrapper { border: 2px groove $win95-bg; margin: 2px; padding:2px; } +.domain .domain__domain-name strong { + color: black; +} + .account--panel { background-color: $win95-bg; border:0px; @@ -1263,18 +1645,75 @@ body.admin { @include win95-inset(); } +.account__section-headline { + background: $win95-bg; + margin-top: 5px; + + & > a { + @include win95-tab(); + color: black; + padding: 5px; + + &.active { + background: $win95-bg; + @include win95-inset(); + color: black; + + &:before, &:after { + display: none; + } + } + } +} + .dropdown--active .dropdown__content > ul, .dropdown-menu { background:$win95-tooltip-yellow; border-radius:0px; border:1px solid black; box-shadow:unset; + margin-top: 6px; } .dropdown-menu a { background-color:transparent; } +.dropdown-menu__arrow { + &.bottom { + border-bottom-color: $win95-tooltip-yellow; + } + + &.top { + border-top-color: $win95-tooltip-yellow; + } + + &:before { + position: relative; + border: 0 solid transparent; + display: block; + content: ''; + left: -8px; + z-index: -1; + } + + &.bottom::before { + border-bottom-color: black; + border-width: 0 8px 6px; + bottom: 1px; + } + + &.top::before { + border-top-color: black; + border-width: 6px 8px 0; + top: -5px; + } +} + +.dropdown-menu { + margin-top: 6px; +} + .dropdown--active::after { display:none; } @@ -1301,11 +1740,11 @@ body.admin { } .detailed-status__action-bar-dropdown .dropdown--active .dropdown__content.dropdown__left { - left:unset; + left: unset; } -.dropdown > .icon-button, .detailed-status__button > .icon-button, -.status__action-bar > .icon-button, .star-icon i { +.dropdown > .icon-button, .detailed-status__action-bar .icon-button, +.status__action-bar .icon-button, .star-icon i { /* i don't know what's going on with the inline styles someone should look at the react code */ height: 25px !important; @@ -1313,39 +1752,52 @@ body.admin { box-sizing: border-box; } +.icon-button { + height: auto!important; + width: auto!important; +} + +.status__action-bar-dropdown .icon-button { + position: relative; + top: -1px; +} + +.fa-user-plus, .fa-user-times { + padding: 2px 0px 2px 1px; +} + +.fa-ellipsis-h { + padding-top: 3px; +} + .status__action-bar-button .fa-floppy-o { - padding-top: 2px; -} - -.status__action-bar-dropdown { - position: relative; - top: -3px; -} - -.detailed-status__action-bar-dropdown .dropdown { - position: relative; - top: -4px; + padding-top: 2px; } .notification .status__action-bar { - border-bottom: none; + border-bottom: none; } .notification .status { - margin-bottom: 4px; + margin-bottom: 4px; } .status__wrapper .status { - margin-bottom: 3px; + margin-bottom: 3px; } .status__wrapper { - margin-bottom: 8px; + margin-bottom: 8px; +} + +.status__prepend { + color: black; + font-size: 13px; } .icon-button .fa-retweet { - position: relative; - top: -1px; + position: relative; + top: -1px; } .embed-modal, .error-modal, .onboarding-modal, @@ -1389,6 +1841,13 @@ body.admin { text-align:left; } +.media-modal .media-modal__close { + font-size: 14px!important; + line-height: 17px!important; + margin-right: 4vw; + margin-top: 4vh; +} + .confirmation-modal__action-bar { .confirmation-modal__cancel-button { color:black; @@ -1412,11 +1871,42 @@ body.admin { @include win95-inset(); } +.report-modal__target .media-modal__close { + top: 3px; + right: 0px; + font-size: 12px!important; + line-height: 13px!important; +} + +.report-modal__comment p { + font-size: 12px; + margin-bottom: 1em; + padding-left: 3px; +} + +.report-modal__comment .setting-text.light { + border-radius: 0; +} + +.report-modal__container { + margin-right: 2px; +} + +.report-modal::before { + height: 22px; + line-height: 23px; +} + +.status-check-box__status .media-gallery { + margin: unset; +} + .modal-root__overlay, .account__header > div { background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAFnpUWHRUaXRsZQAACJnLzU9JzElKBwALgwLXaCRlPwAAABd6VFh0QXV0aG9yAAAImUvOKMrPS8wBAAuaAugOwWPyAAAAEUlEQVQImWNgYGD4z4AE/gMADwMB/414xEUAAAAASUVORK5CYII='); } + .admin-wrapper::before { position:absolute; top:0px; @@ -1439,6 +1929,7 @@ body.admin { @include win95-outset(); width:70vw; height:80vh; + min-height:80vh; margin:10vh auto; color: black; padding-top:24px; @@ -1466,6 +1957,7 @@ body.admin { .admin-wrapper .sidebar-wrapper { position:static; height:auto; + min-height:auto; flex: 0 0 auto; margin:2px; } @@ -1473,12 +1965,15 @@ body.admin { .admin-wrapper .content-wrapper { flex: 1 1 auto; width:calc(100% - 20px); + max-width:calc(100% - 20px); @include win95-border-outset(); position:relative; margin-left:10px; margin-right:10px; margin-bottom:40px; box-sizing:border-box; + overflow-y:scroll; + height: 100%; } .admin-wrapper .content { @@ -1489,6 +1984,9 @@ body.admin { box-sizing:border-box; position:relative; } +.admin-wrapper .content h4 { + color: black; +} .admin-wrapper .sidebar { position:static; @@ -1611,6 +2109,10 @@ body.admin { } } +.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover { + background: $win95-bg; +} + @media screen and (max-width: 1520px) { .admin-wrapper .sidebar > ul > li > ul { max-width:1000px; @@ -1657,7 +2159,20 @@ body.admin { @include win95-border-slight-inset(); } +.admin-wrapper .table th, .table td { + background-color:transparent; +} + +.admin-wrapper button.table-action-link, +.admin-wrapper a.table-action-link, +.admin-wrapper button.table-action-link:hover, +.admin-wrapper a.table-action-link:hover, +.admin-wrapper a.name-tag, +.admin-wrapper .name-tag, +.admin-wrapper a.inline-name-tag, +.admin-wrapper .inline-name-tag, .admin-wrapper .content h2, +.admin-wrapper .content h3, .simple_form .input.with_label .label_input > label, .admin-wrapper .content h6, .admin-wrapper .content > p, @@ -1671,10 +2186,48 @@ body.admin { a.table-action-link, a.table-action-link:hover, .simple_form .input.with_block_label > label, -.simple_form p.hint { +.simple_form p.hint, +.admin-wrapper .content > p strong, +.simple_form .input.with_floating_label .label_input > label, +.admin-wrapper .content .fields-group h6 { color:black; } +.report-card { + background: white; + border: 1px solid black; + border-radius: 0px; +} + +.report-card__summary__item:hover { + background: white; +} + +.report-card__summary__item__content a { + color: black; +} + +.directory__tag > a, .directory__tag > div, +.directory__tag > a:hover, .directory__tag > a:active, .directory__tag > a:focus { + background: white; + border: 1px solid black; + border-radius: 0px; +} + +.admin-wrapper .content .directory__tag h4 { + color: black; +} + +.simple_form .hint code { + background: $win95-bg; + border-radius: 0px; +} + +.input-copy { + background: transparent; + border: 0px solid transparent; +} + .table > tbody > tr:nth-child(2n+1) > td, .table > tbody > tr:nth-child(2n+1) > th { background-color:white; @@ -1729,6 +2282,12 @@ a.table-action-link:hover, background: $win95-bg; } +.simple_form select { + background: white; + border-radius: 0px; + color: black; +} + .filters .filter-subset { border: 2px groove $win95-bg; padding:2px; @@ -1761,3 +2320,365 @@ a.table-action-link:hover, color:black; border-bottom: 0px solid transparent; } + +.drawer__inner__mastodon { + display: none; +} + +.list-editor h4 { + padding: 2px; + color: white; + font-size: 14px; + font-weight: bold; + background: #00007f; + border-radius: 0; +} + +.list-editor { + @include win95-border-outset(); + box-shadow: unset; +} + +.list-editor .drawer__inner { + @include win95-inset(); + border-radius: 0; +} + +.batch-table__toolbar { + border-radius: 0px; + background-color:white; + border: 1px solid black; +} + +.batch-table__row { + border: 1px solid black; + background-color: white; + + &:hover { + background-color: white; + } +} + +.batch-table__row:nth-child(2n) { + background-color: white; +} + +.dashboard__counters > div > div, +.dashboard__counters > div > a { + background-color: $win95-bg; + border: 1px solid black; + border-radius: 1px; + color:black; + + &:hover { + background-color: $win95-bg; + } +} + +.dashboard__counters__label, +.dashboard__widgets a:not(.name-tag), +.dashboard__counters__num { + color:black; +} + +.card { + & > a, & > a:hover { + box-shadow: none; + + .card__img { + border-radius: 0px; + border: 1px solid black; + } + + .card__bar { + @include win95-outset(); + background-color: $win95-bg; + + .display-name { + strong, span { + color:black; + } + } + } + } +} + +/* Public layout stuff */ +body { + background: $win95-cyan; +} + +.public-layout { + max-width: 960px; + margin:10px auto; + background: $win95-bg; + padding:0px; + @include win95-outset(); + + .header { + background: $win95-window-header; + @include win95-border-outset(); + height: 22px; + margin: 0px; + padding:0px; + border-radius: 0px; + + .brand { + padding: 2px; + } + + .nav-button { + @include win95-outset(); + background: $win95-bg; + color:black; + margin: 2px; + margin-bottom: 0px; + &:hover { + background: $win95-bg; + color:black; + } + } + } + .footer { + background: none; + &, h4, ul a, .grid .column-2 h4 a { + color: black; + } + } + + .button.logo-button { + @include win95-outset(); + background: $win95-bg; + color:black; + &:hover { + background: $win95-bg; + color:black; + } + svg { + visibility:hidden; + } + &, &:hover { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); + background-repeat:no-repeat; + background-position:8%; + background-clip:padding-box; + background-size:auto 50%; + } + } + + .public-account-header { + @include win95-reset(); + padding: 4px; + .public-account-header__image { + @include win95-border-slight-inset(); + border-radius: 0px; + } + } + + .public-account-header__bar { + &, &:before { + background: transparent; + } + .avatar img { + @include win95-border-slight-inset(); + filter: saturate(1.8) brightness(1.1); + border-radius: 0px; + background: darken($win95-bg, 9.09%); + } + } + .public-account-header__extra__links { + margin-top: 0px; + a, a strong { + color: black; + } + } + + .public-account-header__tabs { + position: relative; + } + + .public-account-header__tabs__name { + display: inline-block; + position: relative; + background: $win95-tooltip-yellow; + border: 1px solid black; + padding: 4px; + + h1, h1 small { + color:black; + text-shadow: unset; + text-overflow: unset; + } + + margin-bottom: 24px; + + &:after { + content: ""; + display:block; + position:absolute; + left: 0px; + bottom: -20px; + width: 0px; + height: 0px; + border-left: 20px solid $win95-tooltip-yellow; + border-bottom: 20px solid transparent; + } + &:before { + content: ""; + display:block; + position:absolute; + left: -1px; + bottom: -22px; + width: 0px; + height: 0px; + border-left: 22px solid black; + border-bottom: 22px solid transparent; + } + } + + .public-account-header__tabs__tabs { + .details-counters { + @include win95-border-groove(); + .counter { + .counter-number, .counter-label { + color: black; + } + &:after { + border-bottom-width: 0px; + } + &.active { + @include win95-border-slight-inset(); + } + } + } + } + + .public-account-bio { + @include win95-reset(); + @include win95-border-groove(); + background: $win95-bg; + margin-right: 10px; + .account__header__content, .roles { + color: black; + } + } + .public-account-bio__extra { + color: black; + } + + .status__prepend { + padding-top:5px; + } + .status__content , + .reply-indicator__content { + .status__content__spoiler-link { + color: $win95-dark-grey; + } + } + .account__section-headline { + margin-left: 10px; + } + .card-grid { + margin-left: 10px; + } + .status { + padding: 15px 15px 55px 78px; + } +} + +@media screen and (max-width: 1255px) { + .container { + width: 100%; + padding: 0px; + } +} + +.hero-widget { + box-shadow: none; + @include win95-border-groove(); + background: $win95-bg; + padding: 8px; + margin-right: 10px; + margin-top: 10px; +} +.hero-widget__text { + background: none; + color: black; +} +.hero-widget__img { + background: none; + border-radius: 0px; + border: 1px solid black; + img { + border-radius: 0px; + } +} + +.activity-stream { + @include win95-reset(); + @include win95-border-groove(); + + background: $win95-bg; + margin-top: 10px; + margin-left: 10px; + .entry { + background: none; + &:first-child:last-child, &:first-child { + .detailed-status, .status, .load-more { + border-radius: 0px; + } + } + } +} + +.nothing-here { + @include win95-reset(); + background: transparent; + color: black; +} + +.flash-message.notice { + border: 1px solid black; + background: $win95-tooltip-yellow; + color:black; +} + +.layout-single-column .compose-panel { + background: $win95-bg; +} + +.layout-single-column .status__wrapper .status { + padding-bottom: 50px; +} + +::-webkit-scrollbar { + width: 14px; +} + +::-webkit-scrollbar-track { + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAAAAABX3VL4AAAADklEQVQIW2P4f4DhwH8ACoADf0PlskQAAAAASUVORK5CYII='); + + &:hover { + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAAAAABX3VL4AAAADklEQVQIW2P4f4DhwH8ACoADf0PlskQAAAAASUVORK5CYII='); + } +} + +::-webkit-scrollbar-thumb { + background: #bfbfbf; + border-color: #efefef #404040 #404040 #efefef; + border-style: solid; + border-width: 2px; + + &:hover { + background: #bfbfbf; + border-color: #efefef #404040 #404040 #efefef; + border-style: solid; + border-width: 2px; + } + + &:active { + background: #bfbfbf; + border-color: #404040 #efefef #efefef #404040; + } +} + diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 1ac509f184..09fe08d45f 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -117,7 +117,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity language: @status_parser.language, spoiler_text: converted_object_type? ? '' : (@status_parser.spoiler_text || ''), created_at: @status_parser.created_at, - edited_at: @status_parser.edited_at, + edited_at: @status_parser.edited_at && @status_parser.edited_at != @status_parser.created_at ? @status_parser.edited_at : nil, override_timestamps: @options[:override_timestamps], reply: @status_parser.reply, sensitive: @account.sensitized? || @status_parser.sensitive || false, diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index b35ae4f225..235d6fedd2 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -132,7 +132,7 @@ class FeedManager def merge_into_home(from_account, into_account) timeline_key = key(:home, into_account.id) aggregate = into_account.user&.aggregates_reblogs? - query = from_account.statuses.where(visibility: [:public, :unlisted, :private]).includes(:preloadable_poll, reblog: :account).limit(FeedManager::MAX_ITEMS / 4) + query = from_account.statuses.where(visibility: [:public, :unlisted, :private]).includes(:preloadable_poll, :media_attachments, reblog: :account).limit(FeedManager::MAX_ITEMS / 4) if redis.zcard(timeline_key) >= FeedManager::MAX_ITEMS / 4 oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i @@ -158,7 +158,7 @@ class FeedManager def merge_into_list(from_account, list) timeline_key = key(:list, list.id) aggregate = list.account.user&.aggregates_reblogs? - query = from_account.statuses.where(visibility: [:public, :unlisted, :private]).includes(:preloadable_poll, reblog: :account).limit(FeedManager::MAX_ITEMS / 4) + query = from_account.statuses.where(visibility: [:public, :unlisted, :private]).includes(:preloadable_poll, :media_attachments, reblog: :account).limit(FeedManager::MAX_ITEMS / 4) if redis.zcard(timeline_key) >= FeedManager::MAX_ITEMS / 4 oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i @@ -182,10 +182,10 @@ class FeedManager # @param [Account] into_account # @return [void] def unmerge_from_home(from_account, into_account) - timeline_key = key(:home, into_account.id) - oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true)&.first&.last&.to_i || 0 + timeline_key = key(:home, into_account.id) + timeline_status_ids = redis.zrange(timeline_key, 0, -1) - from_account.statuses.select('id, reblog_of_id').where('id > ?', oldest_home_score).reorder(nil).find_each do |status| + from_account.statuses.select('id, reblog_of_id').where(id: timeline_status_ids).reorder(nil).find_each do |status| remove_from_feed(:home, into_account.id, status, into_account.user&.aggregates_reblogs?) end end @@ -195,10 +195,10 @@ class FeedManager # @param [List] list # @return [void] def unmerge_from_list(from_account, list) - timeline_key = key(:list, list.id) - oldest_list_score = redis.zrange(timeline_key, 0, 0, with_scores: true)&.first&.last&.to_i || 0 + timeline_key = key(:list, list.id) + timeline_status_ids = redis.zrange(timeline_key, 0, -1) - from_account.statuses.select('id, reblog_of_id').where('id > ?', oldest_list_score).reorder(nil).find_each do |status| + from_account.statuses.select('id, reblog_of_id').where(id: timeline_status_ids).reorder(nil).find_each do |status| remove_from_feed(:list, list.id, status, list.account.user&.aggregates_reblogs?) end end @@ -276,7 +276,7 @@ class FeedManager next if last_status_score < oldest_home_score end - statuses = target_account.statuses.where(visibility: [:public, :unlisted, :private]).includes(:preloadable_poll, reblog: :account).limit(limit) + statuses = target_account.statuses.where(visibility: [:public, :unlisted, :private]).includes(:preloadable_poll, :media_attachments, reblog: :account).limit(limit) crutches = build_crutches(account.id, statuses) statuses.each do |status| diff --git a/app/models/account.rb b/app/models/account.rb index 1966c5a48b..068ee7ae9c 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -561,6 +561,12 @@ class Account < ApplicationRecord before_validation :prepare_username, on: :create before_destroy :clean_feed_manager + def ensure_keys! + return unless local? && private_key.blank? && public_key.blank? + generate_keys + save! + end + private def prepare_contents diff --git a/app/models/concerns/account_finder_concern.rb b/app/models/concerns/account_finder_concern.rb index 0dadddad12..e8b804934a 100644 --- a/app/models/concerns/account_finder_concern.rb +++ b/app/models/concerns/account_finder_concern.rb @@ -13,7 +13,7 @@ module AccountFinderConcern end def representative - Account.find(-99) + Account.find(-99).tap(&:ensure_keys!) rescue ActiveRecord::RecordNotFound Account.create!(id: -99, actor_type: 'Application', locked: true, username: Rails.configuration.x.local_domain) end diff --git a/db/migrate/20190715164535_add_instance_actor.rb b/db/migrate/20190715164535_add_instance_actor.rb index 8c0301d69d..0ae53199ac 100644 --- a/db/migrate/20190715164535_add_instance_actor.rb +++ b/db/migrate/20190715164535_add_instance_actor.rb @@ -2,6 +2,14 @@ class AddInstanceActor < ActiveRecord::Migration[5.2] class Account < ApplicationRecord # Dummy class, to make migration possible across version changes validates :username, uniqueness: { scope: :domain, case_sensitive: false } + + before_create :generate_keys + + def generate_keys + keypair = OpenSSL::PKey::RSA.new(2048) + self.private_key = keypair.to_pem + self.public_key = keypair.public_key.to_pem + end end def up diff --git a/lib/tasks/tests.rake b/lib/tasks/tests.rake index 8082f32fb4..0f3b44a744 100644 --- a/lib/tasks/tests.rake +++ b/lib/tasks/tests.rake @@ -33,6 +33,11 @@ namespace :tests do puts 'AccountConversation records not created as expected' exit(1) end + + if Account.find(-99).private_key.blank? + puts 'Instance actor does not have a private key' + exit(1) + end end desc 'Populate the database with test data for 2.4.0' diff --git a/package.json b/package.json index 6b3578c108..3f132d944a 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "es6-symbol": "^3.1.3", "escape-html": "^1.0.3", "exif-js": "^2.3.0", - "express": "^4.17.3", + "express": "^4.18.0", "favico.js": "^0.3.10", "file-loader": "^6.2.0", "font-awesome": "^4.7.0", @@ -117,7 +117,7 @@ "marky": "^1.2.4", "mini-css-extract-plugin": "^1.6.2", "mkdirp": "^1.0.4", - "npmlog": "^6.0.1", + "npmlog": "^6.0.2", "object-assign": "^4.1.1", "object-fit-images": "^3.2.3", "object.values": "^1.1.5", @@ -157,7 +157,7 @@ "requestidlecallback": "^0.3.0", "reselect": "^4.1.5", "rimraf": "^3.0.2", - "sass": "^1.50.0", + "sass": "^1.50.1", "sass-loader": "^10.2.0", "stacktrace-js": "^2.0.2", "stringz": "^2.1.0", diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb index 3e9cbba923..738e644c54 100644 --- a/spec/lib/activitypub/activity/create_spec.rb +++ b/spec/lib/activitypub/activity/create_spec.rb @@ -29,6 +29,58 @@ RSpec.describe ActivityPub::Activity::Create do subject.perform end + context 'object has been edited' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + published: '2022-01-22T15:00:00Z', + updated: '2022-01-22T16:00:00Z', + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.text).to eq 'Lorem ipsum' + end + + it 'marks status as edited' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.edited?).to eq true + end + end + + context 'object has update date equal to creation date' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + published: '2022-01-22T15:00:00Z', + updated: '2022-01-22T15:00:00Z', + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.text).to eq 'Lorem ipsum' + end + + it 'does not mark status as edited' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.edited?).to eq false + end + end + context 'unknown object type' do let(:object_json) do { diff --git a/yarn.lock b/yarn.lock index 9ee607726b..664a830d40 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2615,21 +2615,23 @@ bn.js@^5.1.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== -body-parser@1.19.2: - version "1.19.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" - integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== dependencies: bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.7" - raw-body "2.4.3" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" type-is "~1.6.18" + unpipe "1.0.0" bonjour@^3.5.0: version "3.5.0" @@ -3229,7 +3231,7 @@ color-string@^1.5.2: color-name "^1.0.0" simple-swizzle "^0.2.2" -color-support@^1.1.2: +color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== @@ -3330,7 +3332,7 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== -console-control-strings@^1.0.0, console-control-strings@^1.1.0: +console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= @@ -3364,10 +3366,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== copy-concurrently@^1.0.0: version "1.0.5" @@ -3888,6 +3890,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -3901,10 +3908,10 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-file@^1.0.0: version "1.0.0" @@ -4717,38 +4724,39 @@ expect@^27.5.1: jest-matcher-utils "^27.5.1" jest-message-util "^27.5.1" -express@^4.17.1, express@^4.17.3: - version "4.17.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" - integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== +express@^4.17.1, express@^4.18.0: + version "4.18.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.0.tgz#7a426773325d0dd5406395220614c0db10b6e8e2" + integrity sha512-EJEXxiTQJS3lIPrU1AE2vRuT7X7E+0KBbpm5GSoK524yl0K8X+er8zS2P14E64eqsVNoWbMCT7MpmQ+ErAhgRg== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.2" + body-parser "1.20.0" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.2" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + finalhandler "1.2.0" fresh "0.5.2" + http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.9.7" + qs "6.10.3" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.17.2" - serve-static "1.14.2" + send "0.18.0" + serve-static "1.15.0" setprototypeof "1.2.0" - statuses "~1.5.0" + statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -4886,17 +4894,17 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" unpipe "~1.0.0" find-cache-dir@^2.1.0: @@ -5099,20 +5107,19 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gauge@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.0.tgz#afba07aa0374a93c6219603b1fb83eaa2264d8f8" - integrity sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw== +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== dependencies: - ansi-regex "^5.0.1" aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.2" - console-control-strings "^1.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" has-unicode "^2.0.1" - signal-exit "^3.0.0" + signal-exit "^3.0.7" string-width "^4.2.3" strip-ansi "^6.0.1" - wide-align "^1.1.2" + wide-align "^1.1.5" generate-function@^2.0.0: version "2.3.1" @@ -5520,15 +5527,15 @@ http-deceiver@^1.2.7: resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - depd "~1.1.2" + depd "2.0.0" inherits "2.0.4" setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" + statuses "2.0.1" toidentifier "1.0.1" http-errors@~1.6.2: @@ -7632,14 +7639,14 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -npmlog@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.1.tgz#06f1344a174c06e8de9c6c70834cfba2964bba17" - integrity sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg== +npmlog@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== dependencies: are-we-there-yet "^3.0.0" console-control-strings "^1.1.0" - gauge "^4.0.0" + gauge "^4.0.3" set-blocking "^2.0.0" nth-check@^1.0.2: @@ -7799,10 +7806,10 @@ offline-plugin@^5.0.7: minimatch "^3.0.3" slash "^1.0.0" -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" @@ -8850,10 +8857,12 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.9.7: - version "6.9.7" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" - integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== +qs@6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" querystring-es3@^0.2.0: version "0.2.1" @@ -8902,13 +8911,13 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" - integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" - http-errors "1.8.1" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" @@ -9647,10 +9656,10 @@ sass-loader@^10.2.0: schema-utils "^3.0.0" semver "^7.3.2" -sass@^1.50.0: - version "1.50.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.50.0.tgz#3e407e2ebc53b12f1e35ce45efb226ea6063c7c8" - integrity sha512-cLsD6MEZ5URXHStxApajEh7gW189kkjn4Rc8DQweMyF+o5HF5nfEz8QYLMlPsTOD88DknatTmBWkOcw5/LnJLQ== +sass@^1.50.1: + version "1.50.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.50.1.tgz#e9b078a1748863013c4712d2466ce8ca4e4ed292" + integrity sha512-noTnY41KnlW2A9P8sdwESpDmo+KBNkukI1i8+hOK3footBUcohNHtdOJbckp46XO95nuvcHDDZ+4tmOnpK3hjw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -9745,24 +9754,24 @@ semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: dependencies: lru-cache "^6.0.0" -send@0.17.2: - version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" - integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + depd "2.0.0" + destroy "1.2.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "1.8.1" + http-errors "2.0.0" mime "1.6.0" ms "2.1.3" - on-finished "~2.3.0" + on-finished "2.4.1" range-parser "~1.2.1" - statuses "~1.5.0" + statuses "2.0.1" serialize-javascript@^2.1.2: version "2.1.2" @@ -9789,15 +9798,15 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.14.2: - version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" - integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.2" + send "0.18.0" set-blocking@^2.0.0: version "2.0.0" @@ -9892,6 +9901,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -10160,7 +10174,12 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= @@ -10214,7 +10233,16 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0: +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -10231,15 +10259,6 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string.prototype.matchall@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" @@ -11399,12 +11418,12 @@ wicg-inert@^3.1.1: resolved "https://registry.yarnpkg.com/wicg-inert/-/wicg-inert-3.1.1.tgz#b033fd4fbfb9e3fd709e5d84becbdf2e06e5c229" integrity sha512-PhBaNh8ur9Xm4Ggy4umelwNIP6pPP1bv3EaWaKqfb/QNme2rdLjm7wIInvV4WhxVHhzA4Spgw9qNSqWtB/ca2A== -wide-align@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== dependencies: - string-width "^1.0.2 || 2" + string-width "^1.0.2 || 2 || 3 || 4" wildcard@^2.0.0: version "2.0.0"