8
.github/ISSUE_TEMPLATE/01-bug-report.yml
vendored
@@ -21,6 +21,14 @@ body:
|
||||
options:
|
||||
- label: I have checked existing Issues and I feel this bug has not been raised
|
||||
required: true
|
||||
- type: checkboxes
|
||||
id: hugo-version-check
|
||||
attributes:
|
||||
label: Hugo Version Check
|
||||
description: Please confirm that your Hugo version is within the supported range specified in the [config](https://github.com/nunocoracao/blowfish/blob/main/config.toml)
|
||||
options:
|
||||
- label: My Hugo version is within the supported range
|
||||
required: true
|
||||
- type: textarea
|
||||
id: describe-bug
|
||||
attributes:
|
||||
|
||||
4
.github/workflows/build.yml
vendored
@@ -8,11 +8,11 @@ jobs:
|
||||
if: ${{ github.actor == 'dependabot[bot]' }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
ref: "${{ github.head_ref }}"
|
||||
- name: Install dependencies and Build Theme
|
||||
uses: actions/setup-node@v4
|
||||
uses: actions/setup-node@v5
|
||||
- run: npm install
|
||||
- run: npm run assets
|
||||
- name: Commit and push Chart.js changes
|
||||
|
||||
2
.github/workflows/create-config-zip.yml
vendored
@@ -8,7 +8,7 @@ jobs:
|
||||
zip:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
- run: zip -r config-default.zip config/_default
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
|
||||
2
.github/workflows/greetings.yml
vendored
@@ -9,7 +9,7 @@ jobs:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/first-interaction@v2
|
||||
- uses: actions/first-interaction@v3
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
issue-message: "Thanks for contributing to Blowfish"
|
||||
|
||||
2
.github/workflows/hugo-version-update.yml
vendored
@@ -11,7 +11,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out code into the Go module directory
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
ref: dev
|
||||
submodules: true # Fetch Hugo themes (true OR recursive)
|
||||
|
||||
4
.github/workflows/pages.yml
vendored
@@ -37,7 +37,7 @@ jobs:
|
||||
wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_Linux-64bit.deb \
|
||||
&& sudo dpkg -i ${{ runner.temp }}/hugo.deb
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Setup Pages
|
||||
@@ -51,7 +51,7 @@ jobs:
|
||||
run: |
|
||||
hugo --minify -s exampleSite --themesDir ../.. -d ../docs --baseURL https://nunocoracao.github.io/blowfish/
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v3
|
||||
uses: actions/upload-pages-artifact@v4
|
||||
with:
|
||||
path: ./docs
|
||||
|
||||
|
||||
2
.github/workflows/stale.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- uses: actions/stale@v9
|
||||
- uses: actions/stale@v10
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
stale-issue-message:
|
||||
|
||||
2
.github/workflows/test.yml
vendored
@@ -10,7 +10,7 @@ jobs:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
submodules: true
|
||||
fetch-depth: 0
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
|
||||
/*! tailwindcss v4.1.12 | MIT License | https://tailwindcss.com */
|
||||
/*! Blowfish | MIT License | https://github.com/nunocoracao/blowfish */
|
||||
@layer properties;
|
||||
#zen-mode-button {
|
||||
@@ -421,6 +421,9 @@ body.zen-mode-enable {
|
||||
::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {
|
||||
padding-block: 0;
|
||||
}
|
||||
::-webkit-calendar-picker-indicator {
|
||||
line-height: 1;
|
||||
}
|
||||
:-moz-ui-invalid {
|
||||
box-shadow: none;
|
||||
}
|
||||
@@ -488,6 +491,12 @@ body.zen-mode-enable {
|
||||
.inset-x-0 {
|
||||
inset-inline: calc(var(--spacing) * 0);
|
||||
}
|
||||
.-start-6 {
|
||||
inset-inline-start: calc(var(--spacing) * -6);
|
||||
}
|
||||
.start-\[calc\(max\(-50vw\,-800px\)\+50\%\)\] {
|
||||
inset-inline-start: calc(max(-50vw, -800px) + 50%);
|
||||
}
|
||||
.top-0 {
|
||||
top: calc(var(--spacing) * 0);
|
||||
}
|
||||
@@ -515,9 +524,6 @@ body.zen-mode-enable {
|
||||
.left-1\/2 {
|
||||
left: calc(1/2 * 100%);
|
||||
}
|
||||
.left-\[calc\(max\(-50vw\,-800px\)\+50\%\)\] {
|
||||
left: calc(max(-50vw, -800px) + 50%);
|
||||
}
|
||||
.-z-10 {
|
||||
z-index: calc(10 * -1);
|
||||
}
|
||||
@@ -620,6 +626,30 @@ body.zen-mode-enable {
|
||||
.my-3 {
|
||||
margin-block: calc(var(--spacing) * 3);
|
||||
}
|
||||
.-ms-5 {
|
||||
margin-inline-start: calc(var(--spacing) * -5);
|
||||
}
|
||||
.ms-0 {
|
||||
margin-inline-start: calc(var(--spacing) * 0);
|
||||
}
|
||||
.ms-2 {
|
||||
margin-inline-start: calc(var(--spacing) * 2);
|
||||
}
|
||||
.ms-6 {
|
||||
margin-inline-start: calc(var(--spacing) * 6);
|
||||
}
|
||||
.-me-48 {
|
||||
margin-inline-end: calc(var(--spacing) * -48);
|
||||
}
|
||||
.me-1 {
|
||||
margin-inline-end: calc(var(--spacing) * 1);
|
||||
}
|
||||
.me-2 {
|
||||
margin-inline-end: calc(var(--spacing) * 2);
|
||||
}
|
||||
.me-4 {
|
||||
margin-inline-end: calc(var(--spacing) * 4);
|
||||
}
|
||||
.prose {
|
||||
color: var(--tw-prose-body);
|
||||
max-width: 65ch;
|
||||
@@ -1117,9 +1147,6 @@ body.zen-mode-enable {
|
||||
.mt-\[0\.5rem\] {
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
.-mr-48 {
|
||||
margin-right: calc(var(--spacing) * -48);
|
||||
}
|
||||
.-mr-\[100\%\] {
|
||||
margin-right: calc(100% * -1);
|
||||
}
|
||||
@@ -1138,9 +1165,6 @@ body.zen-mode-enable {
|
||||
.mr-5 {
|
||||
margin-right: calc(var(--spacing) * 5);
|
||||
}
|
||||
.mr-\[10px\] {
|
||||
margin-right: 10px;
|
||||
}
|
||||
.mr-auto {
|
||||
margin-right: auto;
|
||||
}
|
||||
@@ -1189,9 +1213,6 @@ body.zen-mode-enable {
|
||||
.mb-\[2px\] {
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
.-ml-12 {
|
||||
margin-left: calc(var(--spacing) * -12);
|
||||
}
|
||||
.ml-0 {
|
||||
margin-left: calc(var(--spacing) * 0);
|
||||
}
|
||||
@@ -1201,9 +1222,6 @@ body.zen-mode-enable {
|
||||
.ml-3 {
|
||||
margin-left: calc(var(--spacing) * 3);
|
||||
}
|
||||
.ml-6 {
|
||||
margin-left: calc(var(--spacing) * 6);
|
||||
}
|
||||
.ml-auto {
|
||||
margin-left: auto;
|
||||
}
|
||||
@@ -1289,9 +1307,6 @@ body.zen-mode-enable {
|
||||
.inline-block {
|
||||
display: inline-block;
|
||||
}
|
||||
.list-item {
|
||||
display: list-item;
|
||||
}
|
||||
.table {
|
||||
display: table;
|
||||
}
|
||||
@@ -1491,12 +1506,6 @@ body.zen-mode-enable {
|
||||
.flex-none {
|
||||
flex: none;
|
||||
}
|
||||
.flex-shrink {
|
||||
flex-shrink: 1;
|
||||
}
|
||||
.shrink {
|
||||
flex-shrink: 1;
|
||||
}
|
||||
.shrink-0 {
|
||||
flex-shrink: 0;
|
||||
}
|
||||
@@ -1509,9 +1518,6 @@ body.zen-mode-enable {
|
||||
.basis-auto {
|
||||
flex-basis: auto;
|
||||
}
|
||||
.border-collapse {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.-translate-x-1\/2 {
|
||||
--tw-translate-x: calc(calc(1/2 * 100%) * -1);
|
||||
translate: var(--tw-translate-x) var(--tw-translate-y);
|
||||
@@ -1754,6 +1760,14 @@ body.zen-mode-enable {
|
||||
border-inline-start-style: var(--tw-border-style);
|
||||
border-inline-start-width: 0px;
|
||||
}
|
||||
.border-s-1 {
|
||||
border-inline-start-style: var(--tw-border-style);
|
||||
border-inline-start-width: 1px;
|
||||
}
|
||||
.border-s-2 {
|
||||
border-inline-start-style: var(--tw-border-style);
|
||||
border-inline-start-width: 2px;
|
||||
}
|
||||
.border-s-\[0\.125rem\] {
|
||||
border-inline-start-style: var(--tw-border-style);
|
||||
border-inline-start-width: 0.125rem;
|
||||
@@ -1770,10 +1784,6 @@ body.zen-mode-enable {
|
||||
border-bottom-style: var(--tw-border-style);
|
||||
border-bottom-width: 2px;
|
||||
}
|
||||
.border-l-2 {
|
||||
border-left-style: var(--tw-border-style);
|
||||
border-left-width: 2px;
|
||||
}
|
||||
.border-dotted {
|
||||
--tw-border-style: dotted;
|
||||
border-style: dotted;
|
||||
@@ -1848,6 +1858,9 @@ body.zen-mode-enable {
|
||||
.bg-\[\#6d6d6d\] {
|
||||
background-color: #6d6d6d;
|
||||
}
|
||||
.bg-black {
|
||||
background-color: #000;
|
||||
}
|
||||
.bg-neutral {
|
||||
background-color: rgba(var(--color-neutral), 1);
|
||||
}
|
||||
@@ -1893,6 +1906,9 @@ body.zen-mode-enable {
|
||||
.bg-transparent {
|
||||
background-color: transparent;
|
||||
}
|
||||
.bg-white {
|
||||
background-color: #fff;
|
||||
}
|
||||
.bg-gradient-to-b {
|
||||
--tw-gradient-position: to bottom in oklab;
|
||||
background-image: linear-gradient(var(--tw-gradient-stops));
|
||||
@@ -2028,6 +2044,18 @@ body.zen-mode-enable {
|
||||
.py-\[1px\] {
|
||||
padding-block: 1px;
|
||||
}
|
||||
.ps-2 {
|
||||
padding-inline-start: calc(var(--spacing) * 2);
|
||||
}
|
||||
.ps-5 {
|
||||
padding-inline-start: calc(var(--spacing) * 5);
|
||||
}
|
||||
.pe-2 {
|
||||
padding-inline-end: calc(var(--spacing) * 2);
|
||||
}
|
||||
.pe-3 {
|
||||
padding-inline-end: calc(var(--spacing) * 3);
|
||||
}
|
||||
.pt-1 {
|
||||
padding-top: calc(var(--spacing) * 1);
|
||||
}
|
||||
@@ -2085,9 +2113,6 @@ body.zen-mode-enable {
|
||||
.pl-0 {
|
||||
padding-left: calc(var(--spacing) * 0);
|
||||
}
|
||||
.pl-2 {
|
||||
padding-left: calc(var(--spacing) * 2);
|
||||
}
|
||||
.pl-4 {
|
||||
padding-left: calc(var(--spacing) * 4);
|
||||
}
|
||||
@@ -2097,12 +2122,18 @@ body.zen-mode-enable {
|
||||
.text-center {
|
||||
text-align: center;
|
||||
}
|
||||
.text-end {
|
||||
text-align: end;
|
||||
}
|
||||
.text-left {
|
||||
text-align: left;
|
||||
}
|
||||
.text-right {
|
||||
text-align: right;
|
||||
}
|
||||
.text-start {
|
||||
text-align: start;
|
||||
}
|
||||
.-indent-\[999px\] {
|
||||
text-indent: calc(999px * -1);
|
||||
}
|
||||
@@ -2264,6 +2295,9 @@ body.zen-mode-enable {
|
||||
.text-transparent {
|
||||
color: transparent;
|
||||
}
|
||||
.text-white {
|
||||
color: #fff;
|
||||
}
|
||||
.capitalize {
|
||||
text-transform: capitalize;
|
||||
}
|
||||
@@ -2356,14 +2390,6 @@ body.zen-mode-enable {
|
||||
--tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
|
||||
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
||||
}
|
||||
.ring {
|
||||
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
|
||||
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
||||
}
|
||||
.outline {
|
||||
outline-style: var(--tw-outline-style);
|
||||
outline-width: 1px;
|
||||
}
|
||||
.blur {
|
||||
--tw-blur: blur(8px);
|
||||
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
|
||||
@@ -2561,11 +2587,24 @@ body.zen-mode-enable {
|
||||
border-style: solid;
|
||||
}
|
||||
}
|
||||
.group-data-\[twe-input-focused\]\:border-white {
|
||||
&:is(:where(.group)[data-twe-input-focused] *) {
|
||||
border-color: #fff;
|
||||
}
|
||||
}
|
||||
.group-data-\[twe-input-focused\]\:border-t-transparent {
|
||||
&:is(:where(.group)[data-twe-input-focused] *) {
|
||||
border-top-color: transparent;
|
||||
}
|
||||
}
|
||||
.group-data-\[twe-input-focused\]\:shadow-white {
|
||||
&:is(:where(.group)[data-twe-input-focused] *) {
|
||||
--tw-shadow-color: #fff;
|
||||
@supports (color: color-mix(in lab, red, red)) {
|
||||
--tw-shadow-color: color-mix(in oklab, #fff var(--tw-shadow-alpha), transparent);
|
||||
}
|
||||
}
|
||||
}
|
||||
.group-data-\[twe-input-state-active\]\:border-x-0 {
|
||||
&:is(:where(.group)[data-twe-input-state-active] *) {
|
||||
border-inline-style: var(--tw-border-style);
|
||||
@@ -2721,13 +2760,6 @@ body.zen-mode-enable {
|
||||
}
|
||||
}
|
||||
}
|
||||
.hover\:decoration-neutral-300 {
|
||||
&:hover {
|
||||
@media (hover: hover) {
|
||||
text-decoration-color: rgba(var(--color-neutral-300), 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
.hover\:decoration-primary-400 {
|
||||
&:hover {
|
||||
@media (hover: hover) {
|
||||
@@ -2735,13 +2767,6 @@ body.zen-mode-enable {
|
||||
}
|
||||
}
|
||||
}
|
||||
.hover\:decoration-primary-500 {
|
||||
&:hover {
|
||||
@media (hover: hover) {
|
||||
text-decoration-color: rgba(var(--color-primary-500), 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
.hover\:decoration-2 {
|
||||
&:hover {
|
||||
@media (hover: hover) {
|
||||
@@ -2866,6 +2891,11 @@ body.zen-mode-enable {
|
||||
transition-property: none;
|
||||
}
|
||||
}
|
||||
.sm\:me-7 {
|
||||
@media (width >= 640px) {
|
||||
margin-inline-end: calc(var(--spacing) * 7);
|
||||
}
|
||||
}
|
||||
.sm\:mt-16 {
|
||||
@media (width >= 640px) {
|
||||
margin-top: calc(var(--spacing) * 16);
|
||||
@@ -2922,16 +2952,23 @@ body.zen-mode-enable {
|
||||
line-height: var(--tw-leading, var(--text-lg--line-height));
|
||||
}
|
||||
}
|
||||
.sm\:last\:me-0 {
|
||||
@media (width >= 640px) {
|
||||
&:last-child {
|
||||
margin-inline-end: calc(var(--spacing) * 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
.md\:-me-16 {
|
||||
@media (width >= 853px) {
|
||||
margin-inline-end: calc(var(--spacing) * -16);
|
||||
}
|
||||
}
|
||||
.md\:mt-0 {
|
||||
@media (width >= 853px) {
|
||||
margin-top: calc(var(--spacing) * 0);
|
||||
}
|
||||
}
|
||||
.md\:-mr-16 {
|
||||
@media (width >= 853px) {
|
||||
margin-right: calc(var(--spacing) * -16);
|
||||
}
|
||||
}
|
||||
.md\:mr-7 {
|
||||
@media (width >= 853px) {
|
||||
margin-right: calc(var(--spacing) * 7);
|
||||
@@ -3022,11 +3059,6 @@ body.zen-mode-enable {
|
||||
top: 140px;
|
||||
}
|
||||
}
|
||||
.lg\:left-0 {
|
||||
@media (width >= 1024px) {
|
||||
left: calc(var(--spacing) * 0);
|
||||
}
|
||||
}
|
||||
.lg\:order-last {
|
||||
@media (width >= 1024px) {
|
||||
order: 9999;
|
||||
@@ -3157,6 +3189,11 @@ body.zen-mode-enable {
|
||||
padding-block: calc(var(--spacing) * 32);
|
||||
}
|
||||
}
|
||||
.lg\:ps-8 {
|
||||
@media (width >= 1024px) {
|
||||
padding-inline-start: calc(var(--spacing) * 8);
|
||||
}
|
||||
}
|
||||
.xl\:w-1\/4 {
|
||||
@media (width >= 1280px) {
|
||||
width: calc(1/4 * 100%);
|
||||
@@ -3177,34 +3214,14 @@ body.zen-mode-enable {
|
||||
right: calc(var(--spacing) * 0);
|
||||
}
|
||||
}
|
||||
.ltr\:-left-6 {
|
||||
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
|
||||
left: calc(var(--spacing) * -6);
|
||||
}
|
||||
}
|
||||
.ltr\:mr-1 {
|
||||
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
|
||||
margin-right: calc(var(--spacing) * 1);
|
||||
}
|
||||
}
|
||||
.ltr\:mr-4 {
|
||||
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
|
||||
margin-right: calc(var(--spacing) * 4);
|
||||
}
|
||||
}
|
||||
.ltr\:-ml-5 {
|
||||
.ltr\:-ml-12 {
|
||||
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
|
||||
margin-left: calc(var(--spacing) * -5);
|
||||
}
|
||||
}
|
||||
.ltr\:ml-0 {
|
||||
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
|
||||
margin-left: calc(var(--spacing) * 0);
|
||||
}
|
||||
}
|
||||
.ltr\:ml-2 {
|
||||
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
|
||||
margin-left: calc(var(--spacing) * 2);
|
||||
margin-left: calc(var(--spacing) * -12);
|
||||
}
|
||||
}
|
||||
.ltr\:block {
|
||||
@@ -3222,83 +3239,19 @@ body.zen-mode-enable {
|
||||
display: inline;
|
||||
}
|
||||
}
|
||||
.ltr\:border-l {
|
||||
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
|
||||
border-left-style: var(--tw-border-style);
|
||||
border-left-width: 1px;
|
||||
}
|
||||
}
|
||||
.ltr\:pr-2 {
|
||||
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
|
||||
padding-right: calc(var(--spacing) * 2);
|
||||
}
|
||||
}
|
||||
.ltr\:pr-3 {
|
||||
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
|
||||
padding-right: calc(var(--spacing) * 3);
|
||||
}
|
||||
}
|
||||
.ltr\:pl-5 {
|
||||
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
|
||||
padding-left: calc(var(--spacing) * 5);
|
||||
}
|
||||
}
|
||||
.ltr\:text-right {
|
||||
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
.ltr\:sm\:mr-7 {
|
||||
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
|
||||
@media (width >= 640px) {
|
||||
margin-right: calc(var(--spacing) * 7);
|
||||
}
|
||||
}
|
||||
}
|
||||
.ltr\:sm\:last\:mr-0 {
|
||||
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
|
||||
@media (width >= 640px) {
|
||||
&:last-child {
|
||||
margin-right: calc(var(--spacing) * 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.ltr\:lg\:pl-8 {
|
||||
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
|
||||
@media (width >= 1024px) {
|
||||
padding-left: calc(var(--spacing) * 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
.rtl\:-right-6 {
|
||||
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
||||
right: calc(var(--spacing) * -6);
|
||||
}
|
||||
}
|
||||
.rtl\:left-0 {
|
||||
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
||||
left: calc(var(--spacing) * 0);
|
||||
}
|
||||
}
|
||||
.rtl\:-mr-5 {
|
||||
.rtl\:-mr-\[79px\] {
|
||||
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
||||
margin-right: calc(var(--spacing) * -5);
|
||||
}
|
||||
}
|
||||
.rtl\:mr-0 {
|
||||
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
||||
margin-right: calc(var(--spacing) * 0);
|
||||
}
|
||||
}
|
||||
.rtl\:mr-2 {
|
||||
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
||||
margin-right: calc(var(--spacing) * 2);
|
||||
}
|
||||
}
|
||||
.rtl\:ml-1 {
|
||||
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
||||
margin-left: calc(var(--spacing) * 1);
|
||||
margin-right: calc(79px * -1);
|
||||
}
|
||||
}
|
||||
.rtl\:ml-4 {
|
||||
@@ -3321,55 +3274,6 @@ body.zen-mode-enable {
|
||||
display: inline;
|
||||
}
|
||||
}
|
||||
.rtl\:border-r {
|
||||
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
||||
border-right-style: var(--tw-border-style);
|
||||
border-right-width: 1px;
|
||||
}
|
||||
}
|
||||
.rtl\:pr-5 {
|
||||
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
||||
padding-right: calc(var(--spacing) * 5);
|
||||
}
|
||||
}
|
||||
.rtl\:pl-2 {
|
||||
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
||||
padding-left: calc(var(--spacing) * 2);
|
||||
}
|
||||
}
|
||||
.rtl\:pl-3 {
|
||||
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
||||
padding-left: calc(var(--spacing) * 3);
|
||||
}
|
||||
}
|
||||
.rtl\:text-left {
|
||||
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
||||
text-align: left;
|
||||
}
|
||||
}
|
||||
.rtl\:sm\:ml-7 {
|
||||
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
||||
@media (width >= 640px) {
|
||||
margin-left: calc(var(--spacing) * 7);
|
||||
}
|
||||
}
|
||||
}
|
||||
.rtl\:sm\:last\:ml-0 {
|
||||
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
||||
@media (width >= 640px) {
|
||||
&:last-child {
|
||||
margin-left: calc(var(--spacing) * 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.rtl\:lg\:pr-8 {
|
||||
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
||||
@media (width >= 1024px) {
|
||||
padding-right: calc(var(--spacing) * 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
.dark\:flex {
|
||||
&:is(.dark *) {
|
||||
display: flex;
|
||||
@@ -3405,6 +3309,11 @@ body.zen-mode-enable {
|
||||
border-color: rgba(var(--color-primary-600), 1);
|
||||
}
|
||||
}
|
||||
.dark\:border-white\/10 {
|
||||
&:is(.dark *) {
|
||||
border-color: color-mix(in oklab, #fff 10%, transparent);
|
||||
}
|
||||
}
|
||||
.dark\:prose-invert {
|
||||
&:is(.dark *) {
|
||||
--tw-prose-body: var(--tw-prose-invert-body);
|
||||
@@ -3579,6 +3488,11 @@ body.zen-mode-enable {
|
||||
color: rgba(var(--color-primary-400), 1);
|
||||
}
|
||||
}
|
||||
.dark\:text-white {
|
||||
&:is(.dark *) {
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
.dark\:opacity-60 {
|
||||
&:is(.dark *) {
|
||||
opacity: 60%;
|
||||
@@ -4317,11 +4231,6 @@ pre {
|
||||
inherits: false;
|
||||
initial-value: 0 0 #0000;
|
||||
}
|
||||
@property --tw-outline-style {
|
||||
syntax: "*";
|
||||
inherits: false;
|
||||
initial-value: solid;
|
||||
}
|
||||
@property --tw-blur {
|
||||
syntax: "*";
|
||||
inherits: false;
|
||||
@@ -4424,6 +4333,11 @@ pre {
|
||||
initial-value: "";
|
||||
inherits: false;
|
||||
}
|
||||
@property --tw-outline-style {
|
||||
syntax: "*";
|
||||
inherits: false;
|
||||
initial-value: solid;
|
||||
}
|
||||
@keyframes pulse {
|
||||
50% {
|
||||
opacity: 0.5;
|
||||
@@ -4480,7 +4394,6 @@ pre {
|
||||
--tw-ring-offset-width: 0px;
|
||||
--tw-ring-offset-color: #fff;
|
||||
--tw-ring-offset-shadow: 0 0 #0000;
|
||||
--tw-outline-style: solid;
|
||||
--tw-blur: initial;
|
||||
--tw-brightness: initial;
|
||||
--tw-contrast: initial;
|
||||
@@ -4506,6 +4419,7 @@ pre {
|
||||
--tw-duration: initial;
|
||||
--tw-ease: initial;
|
||||
--tw-content: "";
|
||||
--tw-outline-style: solid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,194 +1,170 @@
|
||||
const getA11ySettings = () => {
|
||||
const settings = localStorage.getItem("a11ySettings");
|
||||
return settings
|
||||
? JSON.parse(settings)
|
||||
: {
|
||||
disableBlur: false,
|
||||
disableImages: false,
|
||||
fontSize: "default",
|
||||
underlineLinks: false,
|
||||
zenMode: false,
|
||||
};
|
||||
};
|
||||
window.A11yPanel = (() => {
|
||||
const FEATURES = {
|
||||
disableBlur: {
|
||||
default: false,
|
||||
apply: (enabled) => {
|
||||
document.querySelectorAll("script[data-blur-id]").forEach((script) => {
|
||||
const targetId = script.getAttribute("data-blur-id");
|
||||
const scrollDivisor = Number(script.getAttribute("data-scroll-divisor") || 300);
|
||||
if (typeof setBackgroundBlur === "function") {
|
||||
setBackgroundBlur(targetId, scrollDivisor, enabled, targetId === "menu-blur");
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
|
||||
const saveA11ySettings = (settings) => {
|
||||
localStorage.setItem("a11ySettings", JSON.stringify(settings));
|
||||
};
|
||||
disableImages: {
|
||||
default: false,
|
||||
apply: (enabled) => {
|
||||
const image = document.getElementById("background-image");
|
||||
if (image) {
|
||||
image.style.display = enabled ? "none" : "";
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
const applyImageState = (imageElement, imageUrl, disableImages) => {
|
||||
if (!imageElement) return;
|
||||
if (disableImages) {
|
||||
imageElement.style.display = "none";
|
||||
} else {
|
||||
imageElement.style.display = "";
|
||||
if (imageUrl && !imageElement.getAttribute("src")) {
|
||||
imageElement.setAttribute("src", imageUrl);
|
||||
fontSize: {
|
||||
default: "default",
|
||||
apply: (size) => {
|
||||
document.documentElement.style.fontSize = size === "default" ? "" : size;
|
||||
},
|
||||
},
|
||||
|
||||
underlineLinks: {
|
||||
default: false,
|
||||
apply: (enabled) => {
|
||||
const existing = document.getElementById("a11y-underline-links");
|
||||
if (enabled && !existing) {
|
||||
const style = document.createElement("style");
|
||||
style.id = "a11y-underline-links";
|
||||
style.textContent = `
|
||||
a { text-decoration: underline !important; }
|
||||
.group-hover-card-title { text-decoration: underline !important; }
|
||||
.group-hover-card:hover .group-hover-card-title { text-decoration: underline !important; }`;
|
||||
document.head.appendChild(style);
|
||||
} else if (!enabled && existing) {
|
||||
existing.remove();
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
zenMode: {
|
||||
default: false,
|
||||
apply: (enabled) => {
|
||||
const isActive = document.body?.classList.contains("zen-mode-enable");
|
||||
if (enabled !== isActive) {
|
||||
const checkbox = document.querySelector('[id$="zen-mode"]');
|
||||
if (checkbox && typeof _toggleZenMode === "function") {
|
||||
_toggleZenMode(checkbox, { scrollToHeader: false });
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
let settings = null;
|
||||
|
||||
const getSettings = () => {
|
||||
if (settings) return settings;
|
||||
const defaults = Object.fromEntries(Object.entries(FEATURES).map(([key, config]) => [key, config.default]));
|
||||
try {
|
||||
const saved = localStorage.getItem("a11ySettings");
|
||||
settings = { ...defaults, ...JSON.parse(saved || "{}") };
|
||||
} catch {
|
||||
settings = defaults;
|
||||
}
|
||||
}
|
||||
};
|
||||
return settings;
|
||||
};
|
||||
|
||||
const applyFontSize = (fontSizePx) => {
|
||||
const isDefaultSettings = localStorage.getItem("a11ySettings") === null;
|
||||
if (!isDefaultSettings && fontSizePx !== "default") {
|
||||
document.documentElement.style.fontSize = fontSizePx;
|
||||
}
|
||||
};
|
||||
|
||||
const applyUnderlineLinks = (enabled) => {
|
||||
let styleElement = document.getElementById("a11y-underline-links");
|
||||
if (enabled) {
|
||||
if (!styleElement) {
|
||||
styleElement = document.createElement("style");
|
||||
styleElement.id = "a11y-underline-links";
|
||||
styleElement.textContent = "a { text-decoration: underline !important; }";
|
||||
document.head.appendChild(styleElement);
|
||||
const updateSetting = (key, value) => {
|
||||
const current = getSettings();
|
||||
current[key] = value;
|
||||
try {
|
||||
localStorage.setItem("a11ySettings", JSON.stringify(current));
|
||||
} catch (e) {
|
||||
console.warn(`a11y.js: can not store settings: ${e}`);
|
||||
}
|
||||
} else {
|
||||
if (styleElement) {
|
||||
styleElement.remove();
|
||||
}
|
||||
}
|
||||
};
|
||||
FEATURES[key]?.apply(value);
|
||||
};
|
||||
|
||||
const applyZenMode = (enabled) => {
|
||||
const body = document.querySelector("body");
|
||||
const isZenModeActive = body && body.classList.contains("zen-mode-enable");
|
||||
const initPanel = (panelId) => {
|
||||
const prefix = panelId.replace("a11y-panel", "");
|
||||
const current = getSettings();
|
||||
|
||||
// Toggle only if current state doesn't match desired state
|
||||
if (enabled !== isZenModeActive) {
|
||||
const zenModeCheckbox = document.querySelector('[id$="zen-mode"]');
|
||||
if (zenModeCheckbox && typeof _toggleZenMode === "function") {
|
||||
_toggleZenMode(zenModeCheckbox, { scrollToHeader: false });
|
||||
}
|
||||
}
|
||||
};
|
||||
Object.entries(FEATURES).forEach(([key, config]) => {
|
||||
const elementId = `${prefix}${key.replace(/([A-Z])/g, "-$1").toLowerCase()}`;
|
||||
const element = document.getElementById(elementId) || document.getElementById(`${elementId}-select`);
|
||||
|
||||
const applyA11ySettings = () => {
|
||||
const settings = getA11ySettings();
|
||||
document.querySelectorAll("script[data-target-id]").forEach((script) => {
|
||||
const targetId = script.getAttribute("data-target-id");
|
||||
const scrollDivisor = Number(script.getAttribute("data-scroll-divisor") || 300);
|
||||
const imageId = script.getAttribute("data-image-id");
|
||||
const imageUrl = script.getAttribute("data-image-url");
|
||||
const isMenuBlur = targetId === "menu-blur";
|
||||
setBackgroundBlur(targetId, scrollDivisor, settings.disableBlur, isMenuBlur);
|
||||
applyImageState(document.getElementById(imageId), imageUrl, settings.disableImages);
|
||||
});
|
||||
applyFontSize(settings.fontSize);
|
||||
applyUnderlineLinks(settings.underlineLinks);
|
||||
applyZenMode(settings.zenMode);
|
||||
};
|
||||
|
||||
const updateA11ySetting = (key, value) => {
|
||||
const settings = getA11ySettings();
|
||||
settings[key] = value;
|
||||
saveA11ySettings(settings);
|
||||
applyA11ySettings();
|
||||
};
|
||||
|
||||
const toggleA11yPanel = (prefix = "") => {
|
||||
const panel = document.getElementById(`${prefix}a11y-panel`);
|
||||
const overlay = document.getElementById(`${prefix}a11y-overlay`);
|
||||
const button = document.getElementById(`${prefix}a11y-toggle`);
|
||||
if (!panel || !overlay || !button) return;
|
||||
if (overlay.classList.contains("hidden")) {
|
||||
overlay.classList.remove("hidden");
|
||||
panel.classList.remove("hidden");
|
||||
button.setAttribute("aria-pressed", "true");
|
||||
button.setAttribute("aria-expanded", "true");
|
||||
} else {
|
||||
overlay.classList.add("hidden");
|
||||
panel.classList.add("hidden");
|
||||
button.setAttribute("aria-pressed", "false");
|
||||
button.setAttribute("aria-expanded", "false");
|
||||
}
|
||||
};
|
||||
|
||||
const initA11yPanel = (prefix = "") => {
|
||||
const settings = getA11ySettings();
|
||||
const checkboxBlur = document.getElementById(`${prefix}disable-blur`);
|
||||
const checkboxImages = document.getElementById(`${prefix}disable-images`);
|
||||
const checkboxUnderline = document.getElementById(`${prefix}underline-links`);
|
||||
const checkboxZenMode = document.getElementById(`${prefix}zen-mode`);
|
||||
const fontSizeSelect = document.getElementById(`${prefix}font-size-select`);
|
||||
const toggleButton = document.getElementById(`${prefix}a11y-toggle`);
|
||||
const closeButton = document.getElementById(`${prefix}a11y-close`);
|
||||
const overlay = document.getElementById(`${prefix}a11y-overlay`);
|
||||
|
||||
if (
|
||||
!checkboxBlur ||
|
||||
!checkboxImages ||
|
||||
!checkboxUnderline ||
|
||||
!checkboxZenMode ||
|
||||
!fontSizeSelect ||
|
||||
!toggleButton ||
|
||||
!closeButton ||
|
||||
!overlay
|
||||
) {
|
||||
console.warn(`One or more a11y elements not found for prefix: ${prefix}`);
|
||||
return;
|
||||
}
|
||||
|
||||
checkboxBlur.checked = settings.disableBlur;
|
||||
checkboxImages.checked = settings.disableImages;
|
||||
checkboxUnderline.checked = settings.underlineLinks;
|
||||
checkboxZenMode.checked = settings.zenMode;
|
||||
fontSizeSelect.value = settings.fontSize;
|
||||
|
||||
checkboxBlur.addEventListener("change", (e) => updateA11ySetting("disableBlur", e.target.checked));
|
||||
checkboxImages.addEventListener("change", (e) => updateA11ySetting("disableImages", e.target.checked));
|
||||
checkboxUnderline.addEventListener("change", (e) => updateA11ySetting("underlineLinks", e.target.checked));
|
||||
checkboxZenMode.addEventListener("change", (e) => {
|
||||
// Only save setting, let applyZenMode handle the toggle logic
|
||||
updateA11ySetting("zenMode", e.target.checked);
|
||||
});
|
||||
fontSizeSelect.addEventListener("change", (e) => {
|
||||
// Remove fontSize from localStorage when default is selected
|
||||
if (e.target.value === "default") {
|
||||
const settings = getA11ySettings();
|
||||
delete settings.fontSize;
|
||||
saveA11ySettings(settings);
|
||||
document.documentElement.style.fontSize = "";
|
||||
} else {
|
||||
updateA11ySetting("fontSize", e.target.value);
|
||||
}
|
||||
});
|
||||
|
||||
toggleButton.addEventListener("click", () => toggleA11yPanel(prefix));
|
||||
closeButton.addEventListener("click", () => toggleA11yPanel(prefix));
|
||||
overlay.addEventListener("click", (e) => {
|
||||
if (e.target === overlay) {
|
||||
toggleA11yPanel(prefix);
|
||||
}
|
||||
});
|
||||
|
||||
document.querySelectorAll(`.ios-toggle${prefix ? `[id^="${prefix}"]` : ""}`).forEach((toggle) => {
|
||||
const checkbox = toggle.querySelector('input[type="checkbox"]');
|
||||
if (!checkbox) return;
|
||||
const newToggle = toggle.cloneNode(true);
|
||||
toggle.parentNode.replaceChild(newToggle, toggle);
|
||||
newToggle.addEventListener("click", () => {
|
||||
const newCheckbox = newToggle.querySelector('input[type="checkbox"]');
|
||||
if (newCheckbox) {
|
||||
newCheckbox.checked = !newCheckbox.checked;
|
||||
newCheckbox.dispatchEvent(new Event("change", { bubbles: true }));
|
||||
if (element) {
|
||||
if (element.type === "checkbox") {
|
||||
element.checked = current[key];
|
||||
element.onchange = (e) => updateSetting(key, e.target.checked);
|
||||
} else if (element.tagName === "SELECT") {
|
||||
element.value = current[key];
|
||||
element.onchange = (e) => updateSetting(key, e.target.value);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
document.querySelectorAll("script[data-target-id]").forEach((script) => {
|
||||
const imageId = script.getAttribute("data-image-id");
|
||||
const imageUrl = script.getAttribute("data-image-url");
|
||||
const settings = getA11ySettings();
|
||||
applyImageState(document.getElementById(imageId), imageUrl, settings.disableImages);
|
||||
});
|
||||
const togglePanel = () => {
|
||||
const panel = document.getElementById(panelId);
|
||||
const overlay = document.getElementById(`${prefix}a11y-overlay`);
|
||||
const toggle = document.getElementById(`${prefix}a11y-toggle`);
|
||||
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
applyA11ySettings();
|
||||
const allPanels = document.querySelectorAll('[id$="a11y-panel"]');
|
||||
allPanels.forEach((panel) => {
|
||||
const prefix = panel.id.replace("a11y-panel", "");
|
||||
initA11yPanel(prefix);
|
||||
});
|
||||
});
|
||||
if (!panel || !overlay) return;
|
||||
|
||||
const isHidden = overlay.classList.contains("hidden");
|
||||
overlay.classList.toggle("hidden");
|
||||
panel.classList.toggle("hidden");
|
||||
|
||||
if (toggle) {
|
||||
toggle.setAttribute("aria-pressed", String(isHidden));
|
||||
toggle.setAttribute("aria-expanded", String(isHidden));
|
||||
}
|
||||
};
|
||||
|
||||
const toggle = document.getElementById(`${prefix}a11y-toggle`);
|
||||
const close = document.getElementById(`${prefix}a11y-close`);
|
||||
const overlay = document.getElementById(`${prefix}a11y-overlay`);
|
||||
|
||||
if (toggle) toggle.onclick = togglePanel;
|
||||
if (close) close.onclick = togglePanel;
|
||||
if (overlay) overlay.onclick = (e) => e.target === overlay && togglePanel();
|
||||
};
|
||||
|
||||
const applyAll = () => {
|
||||
const current = getSettings();
|
||||
Object.entries(current).forEach(([key, value]) => {
|
||||
FEATURES[key]?.apply(value);
|
||||
});
|
||||
};
|
||||
|
||||
const init = () => {
|
||||
applyAll();
|
||||
document.querySelectorAll('[id$="a11y-panel"]').forEach((panel) => {
|
||||
initPanel(panel.id);
|
||||
});
|
||||
};
|
||||
|
||||
if (getSettings().disableImages) {
|
||||
new MutationObserver(() => {
|
||||
const img = document.getElementById("background-image");
|
||||
if (img) img.style.display = "none";
|
||||
}).observe(document, { childList: true, subtree: true });
|
||||
}
|
||||
|
||||
if (document.readyState === "loading") {
|
||||
document.addEventListener("DOMContentLoaded", init);
|
||||
} else {
|
||||
init();
|
||||
}
|
||||
|
||||
return {
|
||||
getSettings,
|
||||
updateSetting,
|
||||
addFeature: (name, config) => {
|
||||
FEATURES[name] = config;
|
||||
FEATURES[name].apply(getSettings()[name] || config.default);
|
||||
},
|
||||
};
|
||||
})();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
function setBackgroundBlur(targetId, scrollDivisor = 300, disableBlur = false, isMenuBlur = false) {
|
||||
if (!targetId) {
|
||||
console.error("data-target-id is null");
|
||||
console.error("data-blur-id is null");
|
||||
return;
|
||||
}
|
||||
const blurElement = document.getElementById(targetId);
|
||||
@@ -29,24 +29,11 @@ function setBackgroundBlur(targetId, scrollDivisor = 300, disableBlur = false, i
|
||||
updateBlur();
|
||||
}
|
||||
|
||||
document.querySelectorAll("script[data-target-id]").forEach((script) => {
|
||||
const targetId = script.getAttribute("data-target-id");
|
||||
document.querySelectorAll("script[data-blur-id]").forEach((script) => {
|
||||
const targetId = script.getAttribute("data-blur-id");
|
||||
const scrollDivisor = Number(script.getAttribute("data-scroll-divisor") || 300);
|
||||
const isMenuBlur = targetId === "menu-blur";
|
||||
const settings = JSON.parse(localStorage.getItem("a11ySettings") || "{}");
|
||||
const disableBlur = settings.disableBlur || false;
|
||||
setBackgroundBlur(targetId, scrollDivisor, disableBlur, isMenuBlur);
|
||||
});
|
||||
|
||||
// Prevent disableImages FOUC
|
||||
// Note: I tried putting this in a11y.js but it did not work, and placing it here prevents FOUC
|
||||
(() => {
|
||||
const settings = JSON.parse(localStorage.getItem("a11ySettings") || "{}");
|
||||
if (settings.disableImages) {
|
||||
document.querySelectorAll("script[data-image-id]").forEach((script) => {
|
||||
const imageId = script.getAttribute("data-image-id");
|
||||
const image = imageId && document.getElementById(imageId);
|
||||
if (image) image.style.display = "none";
|
||||
});
|
||||
}
|
||||
})();
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
var scriptBundle = document.getElementById("script-bundle");
|
||||
var copyText =
|
||||
scriptBundle && scriptBundle.getAttribute("data-copy") ? scriptBundle.getAttribute("data-copy") : "Copy";
|
||||
var copiedText =
|
||||
scriptBundle && scriptBundle.getAttribute("data-copied")
|
||||
? scriptBundle.getAttribute("data-copied")
|
||||
: "Copied";
|
||||
var copyText = scriptBundle?.getAttribute("data-copy") || "Copy";
|
||||
var copiedText = scriptBundle?.getAttribute("data-copied") || "Copied";
|
||||
|
||||
function createCopyButton(highlightDiv) {
|
||||
const button = document.createElement("button");
|
||||
@@ -13,51 +9,7 @@ function createCopyButton(highlightDiv) {
|
||||
button.ariaLabel = copyText;
|
||||
button.innerText = copyText;
|
||||
button.addEventListener("click", () => copyCodeToClipboard(button, highlightDiv));
|
||||
addCopyButtonToDom(button, highlightDiv);
|
||||
}
|
||||
|
||||
async function copyCodeToClipboard(button, highlightDiv) {
|
||||
const codeToCopy = highlightDiv.querySelector(":last-child").innerText;
|
||||
try {
|
||||
result = await navigator.permissions.query({ name: "clipboard-write" });
|
||||
if (result.state == "granted" || result.state == "prompt") {
|
||||
await navigator.clipboard.writeText(codeToCopy);
|
||||
} else {
|
||||
copyCodeBlockExecCommand(codeToCopy, highlightDiv);
|
||||
}
|
||||
} catch (_) {
|
||||
copyCodeBlockExecCommand(codeToCopy, highlightDiv);
|
||||
} finally {
|
||||
codeWasCopied(button);
|
||||
}
|
||||
}
|
||||
|
||||
function copyCodeBlockExecCommand(codeToCopy, highlightDiv) {
|
||||
const textArea = document.createElement("textArea");
|
||||
textArea.contentEditable = "true";
|
||||
textArea.readOnly = "false";
|
||||
textArea.className = "copy-textarea";
|
||||
textArea.value = codeToCopy;
|
||||
highlightDiv.insertBefore(textArea, highlightDiv.firstChild);
|
||||
const range = document.createRange();
|
||||
range.selectNodeContents(textArea);
|
||||
const sel = window.getSelection();
|
||||
sel.removeAllRanges();
|
||||
sel.addRange(range);
|
||||
textArea.setSelectionRange(0, 999999);
|
||||
document.execCommand("copy");
|
||||
highlightDiv.removeChild(textArea);
|
||||
}
|
||||
|
||||
function codeWasCopied(button) {
|
||||
button.blur();
|
||||
button.innerText = copiedText;
|
||||
setTimeout(function () {
|
||||
button.innerText = copyText;
|
||||
}, 2000);
|
||||
}
|
||||
|
||||
function addCopyButtonToDom(button, highlightDiv) {
|
||||
highlightDiv.insertBefore(button, highlightDiv.firstChild);
|
||||
const wrapper = document.createElement("div");
|
||||
wrapper.className = "highlight-wrapper";
|
||||
@@ -65,6 +17,63 @@ function addCopyButtonToDom(button, highlightDiv) {
|
||||
wrapper.appendChild(highlightDiv);
|
||||
}
|
||||
|
||||
async function copyCodeToClipboard(button, highlightDiv) {
|
||||
const codeToCopy = getCodeText(highlightDiv);
|
||||
|
||||
function fallback(codeToCopy, highlightDiv) {
|
||||
const textArea = document.createElement("textArea");
|
||||
textArea.contentEditable = "true";
|
||||
textArea.readOnly = "false";
|
||||
textArea.className = "copy-textarea";
|
||||
textArea.value = codeToCopy;
|
||||
highlightDiv.insertBefore(textArea, highlightDiv.firstChild);
|
||||
const range = document.createRange();
|
||||
range.selectNodeContents(textArea);
|
||||
const sel = window.getSelection();
|
||||
sel.removeAllRanges();
|
||||
sel.addRange(range);
|
||||
textArea.setSelectionRange(0, 999999);
|
||||
document.execCommand("copy");
|
||||
highlightDiv.removeChild(textArea);
|
||||
}
|
||||
|
||||
try {
|
||||
result = await navigator.permissions.query({ name: "clipboard-write" });
|
||||
if (result.state == "granted" || result.state == "prompt") {
|
||||
await navigator.clipboard.writeText(codeToCopy);
|
||||
} else {
|
||||
fallback(codeToCopy, highlightDiv);
|
||||
}
|
||||
} catch (_) {
|
||||
fallback(codeToCopy, highlightDiv);
|
||||
} finally {
|
||||
button.blur();
|
||||
button.innerText = copiedText;
|
||||
setTimeout(function () {
|
||||
button.innerText = copyText;
|
||||
}, 2000);
|
||||
}
|
||||
}
|
||||
|
||||
function getCodeText(highlightDiv) {
|
||||
const codeBlock = highlightDiv.querySelector("code");
|
||||
const inlineLines = codeBlock?.querySelectorAll(".cl"); // linenos=inline
|
||||
const tableCodeCell = highlightDiv?.querySelector(".lntable .lntd:last-child code"); // linenos=table
|
||||
|
||||
if (!codeBlock) return "";
|
||||
|
||||
if (inlineLines.length > 0) {
|
||||
const cleanedLines = Array.from(inlineLines).map((line) => line.textContent.replace(/\n$/, ""));
|
||||
return cleanedLines.join("\n");
|
||||
}
|
||||
|
||||
if (tableCodeCell) {
|
||||
return tableCodeCell.textContent.trim();
|
||||
}
|
||||
|
||||
return codeBlock.textContent.trim();
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", (event) => {
|
||||
document.querySelectorAll(".highlight").forEach((highlightDiv) => createCopyButton(highlightDiv));
|
||||
});
|
||||
|
||||
@@ -64,6 +64,16 @@
|
||||
});
|
||||
const data = await response.json();
|
||||
|
||||
if (!response.ok) {
|
||||
console.error(`fetch-repo.js: HTTP Error: ${response.status} ${response.statusText}`);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!data || typeof data !== "object") {
|
||||
console.error("fetch-repo.js: Invalid or empty data received from remote");
|
||||
return;
|
||||
}
|
||||
|
||||
Object.entries(mapping).forEach(([dataField, elementSuffix]) => {
|
||||
const element = document.getElementById(`${repoId}-${elementSuffix}`);
|
||||
if (element) {
|
||||
@@ -71,7 +81,9 @@
|
||||
if (processors[platform]?.[dataField]) {
|
||||
value = processors[platform][dataField](value);
|
||||
}
|
||||
element.innerHTML = value;
|
||||
if (value != null && value !== "") {
|
||||
element.innerHTML = value;
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
|
||||
1075
assets/lib/mermaid/mermaid.min.js
vendored
@@ -2,4 +2,4 @@
|
||||
[module.hugoVersion]
|
||||
extended = true
|
||||
min = "0.141.0"
|
||||
max = "0.148.2"
|
||||
max = "0.150.0"
|
||||
@@ -3,7 +3,7 @@ title: "Benvenuti a Blowfish!"
|
||||
description: "Questa pagina è stata creata utilizzando il tema Blowfish per Hugo."
|
||||
---
|
||||
<div class="flex px-4 py-2 mb-8 text-base rounded-md bg-primary-100 dark:bg-primary-900">
|
||||
<span class="flex items-center ltr:pr-3 rtl:pl-3 text-primary-400">
|
||||
<span class="flex items-center pe-3 text-primary-400">
|
||||
{{< icon "triangle-exclamation" >}}
|
||||
</span>
|
||||
<span class="flex items-center justify-between grow dark:text-neutral-300">
|
||||
@@ -22,4 +22,4 @@ description: "Questa pagina è stata creata utilizzando il tema Blowfish per Hug
|
||||
npx blowfish-tools
|
||||
```
|
||||
|
||||
{{< youtubeLite id="SgXhGb-7QbU" label="Demo degli strumenti Blowfish" >}}
|
||||
{{< youtubeLite id="SgXhGb-7QbU" label="Demo degli strumenti Blowfish" >}}
|
||||
|
||||
@@ -5,7 +5,7 @@ description: "このページは Hugo の Blowfish テーマを利用して構
|
||||
|
||||
|
||||
<div class="flex px-4 py-2 mb-8 text-base rounded-md bg-primary-100 dark:bg-primary-900">
|
||||
<span class="flex items-center ltr:pr-3 rtl:pl-3 text-primary-400">
|
||||
<span class="flex items-center pe-3 text-primary-400">
|
||||
{{< icon "triangle-exclamation" >}}
|
||||
</span>
|
||||
<span class="flex items-center justify-between grow dark:text-neutral-300">
|
||||
|
||||
@@ -5,7 +5,7 @@ description: "This page was built using the Blowfish theme for Hugo."
|
||||
|
||||
|
||||
<div class="flex px-4 py-2 mb-8 text-base rounded-md bg-primary-100 dark:bg-primary-900">
|
||||
<span class="flex items-center ltr:pr-3 rtl:pl-3 text-primary-400">
|
||||
<span class="flex items-center pe-3 text-primary-400">
|
||||
{{< icon "triangle-exclamation" >}}
|
||||
</span>
|
||||
<span class="flex items-center justify-between grow dark:text-neutral-300">
|
||||
|
||||
@@ -5,7 +5,7 @@ description: "此页面是使用 Hugo 的 Blowfish 主题搭建的"
|
||||
|
||||
|
||||
<div class="flex px-4 py-2 mb-8 text-base rounded-md bg-primary-100 dark:bg-primary-900">
|
||||
<span class="flex items-center ltr:pr-3 rtl:pl-3 text-primary-400">
|
||||
<span class="flex items-center pe-3 text-primary-400">
|
||||
{{< icon "triangle-exclamation" >}}
|
||||
</span>
|
||||
<span class="flex items-center justify-between grow dark:text-neutral-300">
|
||||
|
||||
@@ -188,7 +188,7 @@ Many of the article defaults here can be overridden on a per article basis by sp
|
||||
| `highlightCurrentMenuArea` | _Not set_ | Marks menu entries in the main menu when selected |
|
||||
| `smartTOC` | _Not set_ | Activate smart Table of Contents, items in view will be highlighted. |
|
||||
| `smartTOCHideUnfocusedChildren` | _Not set_ | When smart Table of Contents is turned on, this will hide deeper levels of the table when they are not in focus. |
|
||||
| `fingerprintAlgorithm` | `"sha512"` | This configures the fingerprint or resources.Fingerprint used in .Data.Integrity for files provided by the theme. Valid values are `sha512` (default), `sha384`, `sha256` |
|
||||
| `fingerprintAlgorithm` | `"sha512"` | Hash algorithm for CSS/JS file fingerprinting to prevent browser caching issues. Valid values are `sha512` (default), `sha384`, `sha256`. |
|
||||
|
||||
### Header
|
||||
|
||||
|
||||
@@ -188,7 +188,7 @@ Blowfish は、テーマの機能を制御する多数の設定パラメータ
|
||||
| `highlightCurrentMenuArea` | _未設定_ | メインメニューのメニュー項目が選択されているときにマークを付けます。 |
|
||||
| `smartTOC` | _未設定_ | スマート目次をアクティブにします。表示されている項目が強調表示されます。 |
|
||||
| `smartTOCHideUnfocusedChildren` | _未設定_ | スマート目次がオンになっている場合、フォーカスされていないときに、テーブルのより深いレベルが非表示になります。 |
|
||||
| `fingerprintAlgorithm` | `"sha512"` | This configures the fingerprint or resources.Fingerprint used in .Data.Integrity for files provided by the theme. Valid values are `sha512` (default), `sha384`, `sha256` |
|
||||
| `fingerprintAlgorithm` | `"sha512"` | CSS/JSファイルのフィンガープリントに使用するハッシュアルゴリズム。ブラウザキャッシュの問題を防ぎます。有効値は `sha512`(デフォルト)、`sha384`、`sha256`。 |
|
||||
|
||||
### ヘッダー(Header)
|
||||
|
||||
|
||||
@@ -194,7 +194,7 @@ Many of the article defaults here can be overridden on a per article basis by sp
|
||||
| `highlightCurrentMenuArea` | _Not set_ | Marks menu entries in the main menu when selected |
|
||||
| `smartTOC` | _Not set_ | Activate smart Table of Contents, items in view will be highlighted. |
|
||||
| `smartTOCHideUnfocusedChildren` | _Not set_ | When smart Table of Contents is turned on, this will hide deeper levels of the table when they are not in focus. |
|
||||
| `fingerprintAlgorithm` | `"sha512"` | This configures the fingerprint or resources.Fingerprint used in .Data.Integrity for files provided by the theme. Valid values are `sha512` (default), `sha384`, `sha256` |
|
||||
| `fingerprintAlgorithm` | `"sha512"` | Hash algorithm for CSS/JS file fingerprinting to prevent browser caching issues. Valid values are `sha512` (default), `sha384`, `sha256`. |
|
||||
|
||||
### Header
|
||||
|
||||
|
||||
@@ -192,7 +192,7 @@ Blowfish 提供了大量控制主题功能的配置参数,下面的表格中
|
||||
| `highlightCurrentMenuArea` | 无 | 当菜单被选择时,标记主菜单中的菜单项。 |
|
||||
| `smartTOC` | 无 | 开启智能目录,视图中的项目将会被高亮显示。 |
|
||||
| `smartTOCHideUnfocusedChildren` | 无 | 当开启智能目录,如果目录级别不再被聚焦时,将会隐藏更深层次的目录。 |
|
||||
| `fingerprintAlgorithm` | `"sha512"` | This configures the fingerprint or resources.Fingerprint used in .Data.Integrity for files provided by the theme. Valid values are `sha512` (default), `sha384`, `sha256` |
|
||||
| `fingerprintAlgorithm` | `"sha512"` | CSS/JS文件指纹的哈希算法,防止浏览器缓存问题。有效值为 `sha512`(默认)、`sha384`、`sha256`。 |
|
||||
|
||||
### 页头
|
||||
|
||||
|
||||
@@ -423,6 +423,7 @@ In order to add images to the gallery, use `img` tags for each image and add `cl
|
||||
| Parameter | Description |
|
||||
| --------- | ----------------------------------------------------- |
|
||||
| `repo` | [String] github repo in the format of `username/repo` |
|
||||
| `showThumbnail` | **Optional.** [Boolean] Whether to show the thumbnail, defaults to `true` |
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
**Example 1:**
|
||||
@@ -720,6 +721,7 @@ The `timeline` creates a visual timeline that can be used in different use-cases
|
||||
<!-- prettier-ignore-start -->
|
||||
| Parameter | Description |
|
||||
| ----------- | -------------------------------------------- |
|
||||
| `md` | render the content as Markdown (true/false) |
|
||||
| `icon` | the icon to be used in the timeline visuals. |
|
||||
| `header` | header for each entry |
|
||||
| `badge` | text to place within the top right badge |
|
||||
|
||||
@@ -420,6 +420,7 @@ Blowfish も、標準の Markdown 構文を使用して含まれる画像の自
|
||||
| パラメータ | 説明 |
|
||||
| --------- | ----------------------------------------------------- |
|
||||
| `repo` | [文字列] `username/repo` 形式の github リポジトリ |
|
||||
| `showThumbnail` | [ブール値] サムネイルを表示するかどうか。デフォルトは `true`。 |
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
**例1:**
|
||||
@@ -717,6 +718,7 @@ B-->C[利益]
|
||||
<!-- prettier-ignore-start -->
|
||||
| パラメータ | 説明 |
|
||||
| ----------- | -------------------------------------------- |
|
||||
| `md` | コンテンツを Markdown としてレンダリングする (true/false) |
|
||||
| `icon` | タイムラインのビジュアルで使用するアイコン |
|
||||
| `header` | 各エントリのヘッダーー |
|
||||
| `badge` | 右上のバッジ内に配置するテキスト |
|
||||
|
||||
@@ -728,7 +728,8 @@ The `timeline` creates a visual timeline that can be used in different use-cases
|
||||
<!-- prettier-ignore-start -->
|
||||
| Parameter | Description |
|
||||
| ----------- | -------------------------------------------- |
|
||||
| `icon` | the icon to be used in the timeline visuals. |
|
||||
| `md` | render the content as Markdown (true/false) |
|
||||
| `icon` | the icon to be used in the timeline visuals |
|
||||
| `header` | header for each entry |
|
||||
| `badge` | text to place within the top right badge |
|
||||
| `subheader` | entry's subheader |
|
||||
|
||||
@@ -426,7 +426,8 @@ Blowfish 还支持使用标准 Markdown 语法自动转换图像。只需使用
|
||||
<!-- prettier-ignore-start -->
|
||||
| 参数 | 功能 |
|
||||
| ------ | ---------------------------------------------- |
|
||||
| `repo` | [String] 格式为 `username/repo` 的 github repo |
|
||||
| `repo` | \[字符串] 格式为 `username/repo` 的 github repo |
|
||||
| `showThumbnail` | **可选** \[布尔值] 是否显示缩略图,默认为 `true` |
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
**例1:**
|
||||
@@ -728,12 +729,13 @@ B-->C[Profit]
|
||||
`timeline` 创建了一个可视化时间线,用于展示专业经验、项目成就等。 `timeline` 简码依赖于 `timelineItem` 子简码来定义主时间线中的每个项目。每个项目可以具有以下属性。
|
||||
|
||||
<!-- prettier-ignore-start -->
|
||||
| 参数 | 功能 |
|
||||
| ----------- | ------------------------ |
|
||||
| `icon` | 要在时间线中使用的图标。 |
|
||||
| `header` | 每个条目的标题 |
|
||||
| `badge` | 放置在右上角徽章内的文本 |
|
||||
| `subheader` | 每个条目的副标题 |
|
||||
| 参数 | 功能 |
|
||||
| ----------- | ----------------------------------- |
|
||||
| `md` | 将内容渲染为 Markdown (true/false) |
|
||||
| `icon` | 要在时间线中使用的图标 |
|
||||
| `header` | 每个条目的标题 |
|
||||
| `badge` | 放置在右上角徽章内的文本 |
|
||||
| `subheader` | 每个条目的副标题 |
|
||||
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "nveshaan"
|
||||
tags: [Sito personale]
|
||||
externalUrl: "https://nveshaan.github.io/"
|
||||
weight: 74
|
||||
weight: 72
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "nveshaan"
|
||||
tags: [パーソナルサイト]
|
||||
externalUrl: "https://nveshaan.github.io/"
|
||||
weight: 74
|
||||
weight: 72
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "nveshaan"
|
||||
tags: [Personal Site]
|
||||
externalUrl: "https://nveshaan.github.io/"
|
||||
weight: 74
|
||||
weight: 72
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "nveshaan"
|
||||
tags: [个人网站]
|
||||
externalUrl: "https://nveshaan.github.io/"
|
||||
weight: 74
|
||||
weight: 72
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 57 KiB |
@@ -2,7 +2,7 @@
|
||||
title: "DXPetti.com"
|
||||
tags: [Sito personale, Blog]
|
||||
externalUrl: "https://www.dxpetti.com/"
|
||||
weight: 57
|
||||
weight: 55
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "DXPetti.com"
|
||||
tags: [パーソナルサイト, ブログ]
|
||||
externalUrl: "https://www.dxpetti.com/"
|
||||
weight: 57
|
||||
weight: 55
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "DXPetti.com"
|
||||
tags: [Personal site,Blog]
|
||||
externalUrl: "https://www.dxpetti.com/"
|
||||
weight: 57
|
||||
weight: 55
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "DXPetti.com"
|
||||
tags: [个人网站, 博客]
|
||||
externalUrl: "https://www.dxpetti.com/"
|
||||
weight: 57
|
||||
weight: 55
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
@@ -2,7 +2,7 @@
|
||||
title: "lazarusoverlook.com"
|
||||
tags: [Sito personale, Blog]
|
||||
externalUrl: "https://lazarusoverlook.com"
|
||||
weight: 80
|
||||
weight: 78
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "lazarusoverlook.com"
|
||||
tags: [パーソナルサイト, ブログ]
|
||||
externalUrl: "https://lazarusoverlook.com"
|
||||
weight: 80
|
||||
weight: 78
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "lazarusoverlook.com"
|
||||
tags: [Personal site,Blog]
|
||||
externalUrl: "https://lazarusoverlook.com"
|
||||
weight: 80
|
||||
weight: 78
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "lazarusoverlook.com"
|
||||
tags: [个人网站, 博客]
|
||||
externalUrl: "https://lazarusoverlook.com"
|
||||
weight: 80
|
||||
weight: 78
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
@@ -2,7 +2,7 @@
|
||||
title: "Beauty Formulation"
|
||||
tags: [Sito aziendale]
|
||||
externalUrl: "https://www.beautyformulation.com/"
|
||||
weight: 71
|
||||
weight: 69
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "Beauty Formulation"
|
||||
tags: [会社のサイト]
|
||||
externalUrl: "https://www.beautyformulation.com/"
|
||||
weight: 71
|
||||
weight: 69
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "Beauty Formulation"
|
||||
tags: [Company site]
|
||||
externalUrl: "https://www.beautyformulation.com/"
|
||||
weight: 71
|
||||
weight: 69
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "Beauty Formulation"
|
||||
tags: [公司网站]
|
||||
externalUrl: "https://www.beautyformulation.com/"
|
||||
weight: 71
|
||||
weight: 69
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
@@ -2,7 +2,7 @@
|
||||
title: "Chill-Try"
|
||||
tags: [Blog tecnologico, Sito personale, Blog]
|
||||
externalUrl: "https://ctry.tech/"
|
||||
weight: 93
|
||||
weight: 91
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "Chill-Try"
|
||||
tags: [テクノロジーブログ, パーソナルサイト, ブログ]
|
||||
externalUrl: "https://ctry.tech/"
|
||||
weight: 93
|
||||
weight: 91
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "Chill-Try"
|
||||
tags: [Technology Blog,Personal site,Blog]
|
||||
externalUrl: "https://ctry.tech/"
|
||||
weight: 93
|
||||
weight: 91
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "Chill-Try"
|
||||
tags: [技术博客, 个人网站, 博客]
|
||||
externalUrl: "https://ctry.tech/"
|
||||
weight: 93
|
||||
weight: 91
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
|
Before Width: | Height: | Size: 44 KiB |
@@ -1,14 +0,0 @@
|
||||
---
|
||||
title: "merox.dev"
|
||||
tags: [Sito personale, Blog, Documentazione, Cv]
|
||||
externalUrl: "https://merox.dev"
|
||||
weight: 84
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
showEdit: false
|
||||
showLikes: false
|
||||
showViews: false
|
||||
layoutBackgroundHeaderSpace: false
|
||||
|
||||
---
|
||||
@@ -1,14 +0,0 @@
|
||||
---
|
||||
title: "merox.dev"
|
||||
tags: [パーソナルサイト, ブログ, ドキュメント, cv]
|
||||
externalUrl: "https://merox.dev"
|
||||
weight: 84
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
showEdit: false
|
||||
showLikes: false
|
||||
showViews: false
|
||||
layoutBackgroundHeaderSpace: false
|
||||
|
||||
---
|
||||
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
@@ -2,7 +2,7 @@
|
||||
title: "ekwska.com"
|
||||
tags: [Blog personale]
|
||||
externalUrl: "https://ekwska.com"
|
||||
weight: 59
|
||||
weight: 57
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "ekwska.com"
|
||||
tags: [個人的なブログ]
|
||||
externalUrl: "https://ekwska.com"
|
||||
weight: 59
|
||||
weight: 57
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "ekwska.com"
|
||||
tags: [Personal blog]
|
||||
externalUrl: "https://ekwska.com"
|
||||
weight: 59
|
||||
weight: 57
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "ekwska.com"
|
||||
tags: [个人博客]
|
||||
externalUrl: "https://ekwska.com"
|
||||
weight: 59
|
||||
weight: 57
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
@@ -2,7 +2,7 @@
|
||||
title: "Adam Madej - Gameplay Animator"
|
||||
tags: [Sito di portafoglio, Blog, Sito personale]
|
||||
externalUrl: "http://www.adammadej.com/"
|
||||
weight: 64
|
||||
weight: 62
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "Adam Madej - Gameplay Animator"
|
||||
tags: [ポートフォリオサイト, ブログ, パーソナルサイト]
|
||||
externalUrl: "http://www.adammadej.com/"
|
||||
weight: 64
|
||||
weight: 62
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "Adam Madej - Gameplay Animator"
|
||||
tags: [Portfolio Site,Blog,Personal Site]
|
||||
externalUrl: "http://www.adammadej.com/"
|
||||
weight: 64
|
||||
weight: 62
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "Adam Madej - Gameplay Animator"
|
||||
tags: [投资组合网站, 博客, 个人网站]
|
||||
externalUrl: "http://www.adammadej.com/"
|
||||
weight: 64
|
||||
weight: 62
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 32 KiB |
@@ -2,7 +2,7 @@
|
||||
title: "innerknowing"
|
||||
tags: [Sito personale, Modellatore]
|
||||
externalUrl: "https://innerknowing.xyz/en/"
|
||||
weight: 62
|
||||
weight: 60
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "innerknowing"
|
||||
tags: [パーソナルサイト, モデラー]
|
||||
externalUrl: "https://innerknowing.xyz/en/"
|
||||
weight: 62
|
||||
weight: 60
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "innerknowing"
|
||||
tags: [Personal site,Modeller]
|
||||
externalUrl: "https://innerknowing.xyz/en/"
|
||||
weight: 62
|
||||
weight: 60
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "innerknowing"
|
||||
tags: [个人网站, 建模器]
|
||||
externalUrl: "https://innerknowing.xyz/en/"
|
||||
weight: 62
|
||||
weight: 60
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
@@ -2,7 +2,7 @@
|
||||
title: "StepaniaH"
|
||||
tags: [Sito personale, Blog]
|
||||
externalUrl: "https://stepaniah.me"
|
||||
weight: 87
|
||||
weight: 85
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "StepaniaH"
|
||||
tags: [パーソナルサイト, ブログ]
|
||||
externalUrl: "https://stepaniah.me"
|
||||
weight: 87
|
||||
weight: 85
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "StepaniaH"
|
||||
tags: [Personal site,Blog]
|
||||
externalUrl: "https://stepaniah.me"
|
||||
weight: 87
|
||||
weight: 85
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "StepaniaH"
|
||||
tags: [个人网站, 博客]
|
||||
externalUrl: "https://stepaniah.me"
|
||||
weight: 87
|
||||
weight: 85
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
|
After Width: | Height: | Size: 34 KiB |
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: "micheledinelli.github.io"
|
||||
tags: [Sito personale, Sito di portafoglio, Accademico]
|
||||
externalUrl: "https://micheledinelli.github.io"
|
||||
weight: 75
|
||||
title: "Dan Davidson | Where Crypto, Charts and Curiosity Collide"
|
||||
tags: [Sito personale, Blog tecnologico]
|
||||
externalUrl: "https://danly.io"
|
||||
weight: 108
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: "Joshua Blais"
|
||||
tags: [パーソナルサイト, 著者, デジタルガーデン]
|
||||
externalUrl: "https://joshblais.com/"
|
||||
weight: 70
|
||||
title: "Dan Davidson | Where Crypto, Charts and Curiosity Collide"
|
||||
tags: [パーソナルサイト, テクノロジーブログ]
|
||||
externalUrl: "https://danly.io"
|
||||
weight: 108
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: "merox.dev"
|
||||
tags: [Personal site,Blog,Documentation,CV]
|
||||
externalUrl: "https://merox.dev"
|
||||
weight: 84
|
||||
title: "Dan Davidson | Where Crypto, Charts and Curiosity Collide"
|
||||
tags: [Personal site,Technology Blog]
|
||||
externalUrl: "https://danly.io"
|
||||
weight: 108
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: "micheledinelli.github.io"
|
||||
tags: [个人网站, 投资组合网站, 学术界]
|
||||
externalUrl: "https://micheledinelli.github.io"
|
||||
weight: 75
|
||||
title: "Dan Davidson | Where Crypto, Charts and Curiosity Collide"
|
||||
tags: [个人网站, 技术博客]
|
||||
externalUrl: "https://danly.io"
|
||||
weight: 108
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
@@ -2,7 +2,7 @@
|
||||
title: "todreamr.github.io"
|
||||
tags: [Sito personale]
|
||||
externalUrl: "https://todreamr.github.io/"
|
||||
weight: 60
|
||||
weight: 58
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "todreamr.github.io"
|
||||
tags: [パーソナルサイト]
|
||||
externalUrl: "https://todreamr.github.io/"
|
||||
weight: 60
|
||||
weight: 58
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "todreamr.github.io"
|
||||
tags: [Personal site]
|
||||
externalUrl: "https://todreamr.github.io/"
|
||||
weight: 60
|
||||
weight: 58
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "todreamr.github.io"
|
||||
tags: [个人网站]
|
||||
externalUrl: "https://todreamr.github.io/"
|
||||
weight: 60
|
||||
weight: 58
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
@@ -2,7 +2,7 @@
|
||||
title: "eallion.com"
|
||||
tags: [Blog, Sito personale]
|
||||
externalUrl: "http://www.eallion.com/"
|
||||
weight: 65
|
||||
weight: 63
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "eallion.com"
|
||||
tags: [ブログ, パーソナルサイト]
|
||||
externalUrl: "http://www.eallion.com/"
|
||||
weight: 65
|
||||
weight: 63
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "eallion.com"
|
||||
tags: [Blog,Personal Site]
|
||||
externalUrl: "http://www.eallion.com/"
|
||||
weight: 65
|
||||
weight: 63
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "eallion.com"
|
||||
tags: [博客, 个人网站]
|
||||
externalUrl: "http://www.eallion.com/"
|
||||
weight: 65
|
||||
weight: 63
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |
@@ -2,7 +2,7 @@
|
||||
title: "Hudson McNamara"
|
||||
tags: [Sito personale, Blog]
|
||||
externalUrl: "https://hudsonmcnamara.com"
|
||||
weight: 94
|
||||
weight: 92
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "Hudson McNamara"
|
||||
tags: [パーソナルサイト, ブログ]
|
||||
externalUrl: "https://hudsonmcnamara.com"
|
||||
weight: 94
|
||||
weight: 92
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "Hudson McNamara"
|
||||
tags: [Personal Site,Blog]
|
||||
externalUrl: "https://hudsonmcnamara.com"
|
||||
weight: 94
|
||||
weight: 92
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "Hudson McNamara"
|
||||
tags: [个人网站, 博客]
|
||||
externalUrl: "https://hudsonmcnamara.com"
|
||||
weight: 94
|
||||
weight: 92
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: "blog.stonegarden.dev"
|
||||
tags: [Sito personale]
|
||||
externalUrl: "https://blog.stonegarden.dev/"
|
||||
weight: 51
|
||||
weight: 49
|
||||
showDate: false
|
||||
showAuthor: false
|
||||
showReadingTime: false
|
||||
|
||||