Timezone Converter

NOTICE:

This is a component page used internally by the SCP Wiki. It is intended to be used and included on other pages.

[[iftags +theme]]

What this is

A bunch of miscellaneous CSS 'improvements' that I, CroquemboucheCroquembouche, use on a bunch of pages because I think it makes them easier to deal with.

If you're not me, which you're not (I think), then you probably shouldn't use this component because it may break, disappear, or change in a way that you don't like at any time; and I promise you that if I want to add something to this I will without asking your permission or checking whether or not it breaks your article. If you're cool with that, go wild.

The styling from this component doesn't change the look or feel of a page, so it's not important narratively. I wouldn't expect translations of articles that use this component to also use this component, unless the translator likes it.

Other personal styling components:

Personal styling themes:

Usage

[[include :scp-wiki:component:croqstyle ]]

Using this on a page tagged 'template'? You'll need to manually stop all these usage instructions from appearing:

[[div style="display: none;"]]
[[include :scp-wiki:component:croqstyle ]]
[[/div]]

Improvements

Reasonably-sized footnotes

Stops footnotes from being a million miles wide, so that you can actually read them.

.hovertip { max-width: 400px; }

I'd add a demonstration, but I've included this component to a bunch of other template pages and it messes them up. You'll just have to trust me on this one.

Monospace edit/code

Makes the edit textbox monospace, and also changes all monospace text to Fira Code, the obviously superior monospace font.

@import url('https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;700&display=swap');
 
:root { --mono-font: "Fira Code", Cousine, monospace; }
#edit-page-textarea, .code pre, .code p, .code, tt, .page-source { font-family: var(--mono-font); }
.code pre * { white-space: pre; }
.code *, .pre * { font-feature-settings: unset; }

Teletype backgrounds

Adds a light grey background to <tt> elements ({{text}}), so code snippets stand out more.

tt {
  background-color: var(--swatch-something-idk-will-fix-later, #f4f4f4);
  font-size: 85%;
  padding: 0.2em 0.4em;
  margin: 0;
  border-radius: 6px;
}

No more bigfaces

Stops big pictures from appearing when you hover over someone's avatar image, because they're stupid and really annoying.

.avatar-hover { display: none !important; }

Breaky breaky

Stuff wrapped in a .nobreak div or span line-wraps betweene every letter.

.nobreak { word-break: break-all; }

Code colours

Add my terminal's code colours as variables. Maybe I'll change this to a more common terminal theme like Monokai or something at some point, but for now it's just my personal theme, which is derived from Tomorrow Night Eighties.

Also, adding the .terminal class to a fake code block as [[div class="code terminal"]] gives it a sort of pseudo-terminal look with a dark background. Doesn't work with [[code]], because Wikidot inserts a bunch of syntax highlighting that you can't change yourself without a bunch of CSS. Use it for non-[[code]] code snippets only.

:root {
  --c-bg: #393939;
  --c-syntax: #e0e0e0;
  --c-comment: #999999;
  --c-error: #f2777a;
  --c-value: #f99157;
  --c-symbol: #ffcc66;
  --c-string: #99cc99;
  --c-operator: #66cccc;
  --c-builtin: #70a7df;
  --c-keyword: #cc99cc;
}
 
.terminal.code, .terminal > .code {
  color: var(--c-syntax);
  background: var(--c-bg);
  border: 0.5rem solid var(--c-comment);
  border-radius: 2rem;
}

Debug mode

Draw lines around anything inside .debug-mode. The colour of the lines is red but defers to CSS variable --debug-colour.

You can also add div.debug-info.over and div.debug-info.under inside an element to annotate the debug boxes — though you'll need to make sure to leave enough vertical space that the annotation doesn't overlap the thing above or below it.

…like this!

.debug-mode, .debug-mode *, .debug-mode *::before, .debug-mode *::after {
  outline: 1px solid var(--debug-colour, red);
  position: relative;
}
.debug-info {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  font-family: 'Fira Code', monospace;
  font-size: 1rem;
  white-space: nowrap;
}
.debug-info.over { top: -2.5rem; }
.debug-info.under { bottom: -2.5rem; }
.debug-info p { margin: 0; }

[[/iftags]]

What this is

A component that displays a given time and/or date in the reader's timezone.

The reader's timezone will be automatically calculated. All you need to do is input the timezone of the time you want on the page.

If your timezone matches the reader's timezone, this module will not appear. This is intentional! It will still be there for readers who need it.

Please note the following Daylight Savings Time exceptions: both "EST" and "EDT", when entered into this component, are converted to the America/New_York timezone, which is then converted to either EST or EDT depending on the time of year. "BST" is converted to Europe/London, which is then converted to either GMT or BST depending on the time of year. To avoid this confusion, please avoid using timezones that vary depending on DST! Use a static timezone like UTC.

Usage

On any wiki:

[[include :scp-wiki:component:tz
| time=18:00
| tz=UTC
]]

A setting in italics is optional. Everything else you gotta have. If you omit an optional setting, then it will have its default value. If you omit a non-optional setting, then don't expect the component to work properly.

To omit a setting, leave it out completely.

time The time of the event. Times should be two digits followed by a colon followed by two digits. "18:30" is good. "1830", "6:30 PM" and "half past six in the afternoon" are bad.
tz
(Optional)
The timezone of the time that you're entering.
Default value: UTC
date
(Optional)
The date of the event in ISO format: YYYY-MM-DD.
The date might be used at some point to calculate "time until" stuff, but right now it's unused.
Default value: today
text_before
(Optional)
The text that comes before the converted time.
Default value: "${time} ${tz} is "
text_after
(Optional)
The text that comes after the converted time.
Default value: "."


Codebase

HTML structure of the converter

Unfortunately this is buried in the source code - you'll have to go digging for it!

JS to operate the converter

document.addEventListener("DOMContentLoaded", function() {
  console.log(date);
  date = date === "{$date}" ? moment().format("Y-MM-DD") : date;
  console.log(date);
  tz = tz === "{$tz}" ? "UTC" : tz;
  tz = tz === "EST" ? "America/New_York" : tz;
  tz = tz === "EDT" ? "America/New_York" : tz;
  tz = tz === "BST" ? "Europe/London" : tz;
 
  given_time = moment.tz(date + " " + time, tz);
  tz = given_time.format("z");
 
  text_before = text_before === "{$text_before}" ? "${time} ${tz} is " : 
text_before;
  text_after = text_after === "{$text_after}" ? "." : text_after;
  // eval is used here to convert text strings to template literals
  // variables of the form ${var} will be parsed
  text_before = eval('`' + text_before + '`');
  text_after = eval('`' + text_after + '`');
 
  user_tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
  converted_time = given_time.tz(user_tz);
  converted_time_tz = converted_time.format("HH:mm z");
 
  console.log(given_time);
  console.log(converted_time);
 
  document.getElementById("text_before").textContent = text_before;
  document.getElementById("text_converted").textContent = converted_time_tz;
  document.getElementById("text_after").textContent = text_after;
 
  if (converted_time.format("z") === tz) {
    // e.g. displaying an EST time to an EST user - that's pointless!
    document.documentElement.style.display = 'none';
  }
});

CSS to style the output wrapper

.timezone-thingy { margin-top: -0.5rem; }
.timezone-thingy iframe { border: none; max-height: 3.5rem; }

CSS to style the output internally

#wrapper {
  padding: 0.5rem !important;
  border: 1px solid #660000;
  border-radius: 10px;
  box-shadow: 0 2px 6px rgba(102,0,0,.5);
  background: white;
  margin: 0.5rem 0;
  display: inline-block;
  position: relative;
  left: 50%;
  transform: translateX(-50%);
}
#wrapper p {
  margin: 0;
}
#wrapper img {
  height: 1rem;
  vertical-align: text-top;
}
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License