Compare commits

...
Sign in to create a new pull request.

26 commits
rvb ... main

Author SHA1 Message Date
Julie Blanc
1867e54400 details styles 2026-03-17 15:59:47 +01:00
Julie Blanc
6e97e2f46c adjust header entretiens 2026-03-17 15:31:57 +01:00
Julie Blanc
828d97f3f9 color entretiens 2026-03-17 15:20:44 +01:00
Julie Blanc
fe9a3228a8 gaa unicode entretiens 2026-03-17 15:07:01 +01:00
Julie Blanc
a34e879296 layout entretiens 2026-03-17 12:16:39 +01:00
Julie Blanc
464f6cf39f add fonts 2026-03-17 11:49:49 +01:00
Julie Blanc
92668b5d29 num pages' 2026-03-17 00:10:52 +01:00
Julie Blanc
8a33fa6ef0 better running 2026-03-16 23:54:56 +01:00
Julie Blanc
738d470087 all on grid 2026-03-16 23:29:25 +01:00
Julie Blanc
ce4d7285fe change font-family for sign → teletext 2026-03-16 21:43:39 +01:00
Julie Blanc
9344129a9f add Teletext 2026-03-16 21:28:54 +01:00
Julie Blanc
1783105175 change class subtitles 2026-03-16 15:27:31 +01:00
Julie Blanc
7851d1a4ec correction subtitles & notes 2026-03-16 15:20:27 +01:00
Julie Blanc
2f5da421b5 to do readme 2026-03-16 15:12:02 +01:00
Julie Blanc
16e268c7ef bibliographie & blockauote 2026-03-16 15:11:43 +01:00
Julie Blanc
bd64798428 subtitle top page 2026-03-16 14:55:59 +01:00
Julie Blanc
f255ad6733 blockauote 2026-03-16 14:52:34 +01:00
Julie Blanc
56d11343f8 running pages 2026-03-16 13:57:11 +01:00
Julie Blanc
015689c0ed css running-page 2026-03-16 13:44:41 +01:00
Julie Blanc
4833822985 add running pages 2026-03-16 13:23:03 +01:00
Julie Blanc
cc971f6152 decor subtitles finish js 2026-03-16 12:01:16 +01:00
Julie Blanc
1c1a2b0a93 symbols on grid 2026-03-16 10:44:16 +01:00
Julie Blanc
512d62e5df add symbol nav left page 2026-03-16 09:48:16 +01:00
Julie Blanc
15aaf441cd support double line in subtitles 2026-03-15 11:30:36 +01:00
Julie Blanc
9340553c0b subtitles symbols 2026-03-15 11:09:25 +01:00
Julie Blanc
0e03ba8475 add fonts 2026-03-10 15:26:40 +01:00
54 changed files with 1734 additions and 479 deletions

20
maquette-tests/README.md Normal file
View file

@ -0,0 +1,20 @@
# Notes
Choses que je nai pas automatisées:
- pour les titres h3 et h4, il faut mettre explicitement un `<br>` si on a 2 lignes pour que le décor fonctionne
- pour les titres h3 et h4 qui arrivent en début de page ajouter la class `.subtitle-top-page`
- pour les bibliographies: les wrapper dans une div `.bibliographie`
**TO-DO**
- Régler les hypens
- ajouter des `<wbr>aux liens
- ajouter des `+` devant les points dans les blockquote comme dans les bibliogaphies
- attention le «œ» de Routed Gothic Wide
- pas daccents pour les typo Teletex

View file

@ -1,11 +1,22 @@
:root{
--symbol: "+";
--unit: 70px;
--sub-unit: 17.5px;
--font: 'Routed Gothic', sans-serif;
--font: 'Wagram Slab', serif;
--font: 'Bilzig', serif;
--font: 'Routed Gothic', sans-serif;
--font-title: 'OCR-X';
/* --font: 'HAL Timezone', serif; */
--mono: 'Selectric Mono', monospace;
--mono: 'Ivory Mono', monospace;
@ -17,6 +28,8 @@
--font-notes: 'Selectric Mono', monospace;
--font-notes: 'Baskemo Sans', monospace;
--font-notes: 'OCR-X';
@ -46,11 +59,22 @@
--baseline: 18px;
--fs-nav: 11px;
--fs-subtitle: 11px;
--fs-subtitle: 16px;
--fs-notes: 11px;
--unit: 20px;
--gap: 8px;
}
--sign-family: 'Teletext';
--sign-size: 14px;
--sign-baseline: 18px;
/* --sign-spacing: 0.45rem; */
--sign-spacing: 7.5px;
--sign-spacing-dots: 7px;
--sign-color: var(--blue);
/* --sign-color: black; */
}

View file

@ -5,6 +5,7 @@
-webkit-font-smoothing: antialiased;
-moz-font-smoothing: antialiased;
-o-font-smoothing: antialiased;
text-rendering: geometricPrecision;
}
a {
@ -19,4 +20,16 @@ body {
font-size: var(--font-size);
line-height: var(--baseline);
}
}
.pagedjs_left_page .pagedjs_sheet{
--grid-position-x: 21px!important;
}
.pagedjs_right_page .pagedjs_sheet{
--grid-position-x: 16px!important;
}

View file

@ -2,111 +2,178 @@
@page {
size: 165mm 240mm;
margin-top: 25mm;
margin-bottom: 14mm;
margin-top: 95px;
margin-bottom: 18mm;
bleed: 6mm;
marks: crop;
margin-left: 33mm;
margin-right: 11mm;
--symbol-top: 1px;
--running-top: 8mm;
--running-bottom: 6mm;
--running-left: 19px;
}
@page:left {
margin-left: 18mm;
margin-right: 26mm;
@top-left-corner {
content: var(--symbol) var(--symbol) var(--symbol);
font-size: var(--sign-size);
color: var(--sign-color);
letter-spacing: var(--sign-spacing);
font-family: var(--sign-family);
line-height: var(--sign-baseline);
vertical-align: top;
padding-top: var(--running-top);
text-align: left;
padding-left: var(--running-left);
}
@top-left {
content: element(decor);
width: 0px;
vertical-align: top;
padding-top: 8mm;
padding-top: calc(var(--running-top) - var(--symbol-top));
width: calc(var(--unit)*2);
font-size: var(--font-size);
color: var(--sign-color);
font-family: var(--sign-family);
}
@top-center {
content: element(author);
vertical-align: top;
padding-top: calc(var(--running-top) - var(--symbol-top));
text-align: left;
white-space: nowrap;
font-size: var(--font-size);
color: var(--sign-color);
font-family: var(--sign-family);
}
@top-right {
content: element(author);
content: var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol);
font-size: var(--sign-size);
color: var(--sign-color);
letter-spacing: var(--sign-spacing);
font-family: var(--sign-family);
line-height: var(--sign-baseline);
vertical-align: top;
padding-top: 8mm;
padding-top: var(--running-top);
width: 100%;
padding-top: 8mm;
text-align: right;
}
@top-left-corner {
content: counter(page);
vertical-align: top;
padding-top: 8mm;
white-space: nowrap;
text-align: left;
margin-left: 11mm;
padding-left: 5px;
}
@bottom-left {
content: counter(page);
vertical-align: bottom;
padding-bottom: var(--running-bottom);
white-space: nowrap;
font-size: var(--sign-size);
color: var(--sign-color);
font-family: var(--sign-family);
z-index: 100;
}
}
@page:right {
/* margin-left: 18mm;
margin-right: 26mm; */
margin-left: 26mm;
margin-right: 18mm;
@top-left-corner {
content: var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol);
font-size: var(--sign-size);
color: var(--sign-color);
letter-spacing: var(--sign-spacing);
font-family: var(--sign-family);
line-height: var(--sign-baseline);
vertical-align: top;
padding-top: var(--running-top);
text-align: left;
padding-left: var(--running-left);
}
@top-left {
content: element(type);
width: 0px;
vertical-align: top;
padding-top: 8mm;
}
@top-right {
content: element(title);
vertical-align: top;
padding-top: calc(8mm + 20px);
/* padding-right: 11mm; */
text-align: left;
position: relative;
left: -11mm;
width: 100%;
padding-top: var(--running-top);
white-space: nowrap;
padding-right: 1.5ch;
font-family: var(--sign-family);
font-size: var(--font-size);
color: var(--sign-color);
}
@top-right-corner {
content: counter(page);
width: 40px;
position: relative;
left: -40px;
text-align: right;
vertical-align: top;
padding-top: 8mm;
}
}
.chapter {
break-before: right;
page: chapter;
}
@page chapter:first {
@top-right {
content: none;
content: var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol);
font-size: var(--sign-size);
color: var(--sign-color);
letter-spacing: var(--sign-spacing);
font-family: var(--sign-family);
line-height: var(--sign-baseline);
vertical-align: top;
padding-top: var(--running-top);
width: 100%;
white-space: nowrap;
}
@bottom-right {
content: counter(page);
vertical-align: bottom;
padding-bottom: var(--running-bottom);
text-align: right;
white-space: nowrap;
font-size: var(--sign-size);
color: var(--sign-color);
font-family: var(--sign-family);
z-index: 100;
}
}
@page:blank {
@top-left {
content: none;
}
@top-left-corner {
content: none;
}
@top-right {
@top-right {
content: none;
}
@top-center {
@top-center {
content: none;
}
@ -134,4 +201,89 @@
.nav-decor {
position: running(decor);
}
.pagedjs_area {
position: relative;
}
.pagedjs_margin-top-left .pagedjs_margin-content .nav-decor::after {
content: var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol);
font-size: var(--sign-size);
color: var(--sign-color);
letter-spacing: var(--sign-spacing);
font-family: var(--sign-family);
line-height: var(--sign-baseline);
/* padding-left: 1ch; */
width: calc(var(--unit) + var(--sub-unit));
position: relative;
top: var(--symbol-top);
padding-left: 11px;
}
.pagedjs_left_page .pagedjs_margin-top {
width: calc(100% + var(--pagedjs-margin-right) - 2ch);
overflow: hidden;
}
.pagedjs_right_page .pagedjs_margin-top{
width: calc(100% + var(--pagedjs-margin-left) - 4ch);
overflow: hidden;
}
.pagedjs_left_page .pagedjs_margin-bottom-left .pagedjs_margin-content::after {
padding-left: 0.25ch;
padding-right: 1.25ch;
display: inline-block;
background-color: white;
min-width: 2ch;
}
.pagedjs_right_page .pagedjs_margin-bottom-right .pagedjs_margin-content::after {
padding-left: 1.25ch;
padding-right: 0.25ch;
display: inline-block;
background-color: white;
min-width: 2ch;
}
[data-chapter="essai"]{
--sign-color: var(--blue);
page: essai;
break-before: right;
}
@page essai{
--sign-color: var(--blue);
}
[data-chapter="entretien"]{
--sign-color: var(--red);
page: entretien;
break-before: right;
}
@page entretien{
--sign-color: var(--red);
}
[data-chapter="portfolio"]{
--sign-color: var(--green);
page: portfolio;
break-before: right;
}
@page portfolio{
--sign-color: var(--green);
}

View file

@ -0,0 +1,48 @@
blockquote{
/* padding-left: 3ch; */
margin-top: calc(var(--baseline)*1);
margin-bottom: calc(var(--baseline)*1);
padding-left: calc(var(--unit)*0.75);
padding-right: calc(var(--unit)*0.75);
}
blockquote p::before{
display: none;
}
.before-blockquote_container,
.after-blockquote_container{
position: absolute;
overflow: hidden;
}
.before-blockquote_container{
left: 0px;
}
.after-blockquote_container{
right: -10px;
}
.after-blockquote,
.before-blockquote{
font-size: var(--sign-size);
color: var(--sign-color);
letter-spacing: var(--sign-spacing);
font-family: var(--sign-family);
line-height: var(--sign-baseline);
word-break: break-all;
width: calc(var(--unit)*0.5 + 4px);
overflow-wrap: anywhere;
position: relative;
top: -3px;
}

View file

@ -1,91 +1,165 @@
.chapter-header {
position: relative;
}
/* break-after: page; */
.chapter-header p {
text-indent: 0px !important;
}
.chapter-header .type,
.chapter-header .h2-pattern {
display: none;
}
.chapter-header .hgroup{
/* margin-top: var(--gap);
border-left: var(--unit) solid var(--grey);
border-left: var(--unit) solid var(--grey);
padding-left: var(--gap);
display: flex;
flex-direction: column; */
margin-left: 15%;
}
.chapter-header h2 {
font-family: 'Routed Gothic Wide';
line-height: 1.1;
font-size: 36px;
font-weight: normal;
}
.chapter-header .author {
font-family: 'Routed Gothic Wide';
font-size: 36px;
margin-top: calc(var(--baseline)*6);
margin-bottom: calc(var(--baseline)*2);
/* background-color: black;
color: white;
font-family: var(--mono);
font-size: var(--fs-nav);
text-align: center;
font-size: var(--fs-nav);
.chapter-header .hgroup {
font-size: 22px;
line-height: 1;
padding: 4px 1ch;
font-weight: normal;
font-weight: normal;
/* margin-top: calc(var(--baseline)*2);*/
position: relative;
top: calc(var(--baseline)*-0.25 - 2px);
margin-bottom: calc(var(--baseline)*3 + 13px);
padding-right: calc(var(--unit)*2);
position: relative;
padding-left: 15px;
height: var(--unit);
margin-bottom: 0; */
/* display: inline-block;
margin-inline: auto;
margin-top: calc(var(--baseline)*1); */
}
.chapter-header .bio{
.chapter-header .hgroup::before {
content: "***************************************************************************************************************************************************************************************************************************************************************************************************************************************************";
display: block;
width: calc(100% + 1ch);
height: 100%;
overflow: hidden;
position: absolute;
top: 0;
left: 0px;
z-index: -1;
font-size: var(--sign-size);
color: var(--sign-color);
letter-spacing: var(--sign-spacing);
font-family: var(--sign-family);
line-height: calc(var(--sign-baseline)*1.5);
overflow-wrap: anywhere;
/* padding-top: 6px; */
}
.chapter-header .type {
display: none;
}
.chapter-header .hgroup h2 {
font-family: 'Teletext';
font-weight: normal;
font-size: 1em;
line-height: calc(var(--sign-baseline)*1.5);
display: inline;
box-sizing: border-box;
}
.chapter-header .hgroup h2 span {
color: white;
padding-left: 0.25ch;
padding-right: 0.25ch;
box-decoration-break: clone;
background-color: var(--sign-color);
padding: 1px 0.25ch;
text-transform: uppercase;
}
.chapter-header .author span {
font-family: 'Teletext';
color: var(--sign-color);
margin-top: calc(var(--baseline)*1.5);
text-transform: uppercase;
background-color: white;
display: inline-block;
}
.chapter-header .author::before {
display: none;
}
.chapter-header{
margin-bottom: calc(var(--baseline)*1);
.chapter-header .bio {
display: none;
}
.chapter-header:after{
/* content: "";
display: block;
margin-top: var(--gap);
.hgroup-before,
.hgroup-after,
.chapter-header .title-before,
.chapter-header .title-after {
font-size: var(--sign-size);
color: var(--sign-color);
letter-spacing: var(--sign-spacing);
font-family: var(--sign-family);
line-height: calc(var(--sign-baseline)*1);
border-top: 2px dashed var(--grey);
}
margin-bottom: calc(var(--baseline)*1); */
.chapter-header .title-before,
.chapter-header .title-after{
white-space: nowrap;
position: absolute;
left: 0px;
}
.chapter-header .title-before {
top: calc(var(--baseline)*-1.25);
}
.chapter-header .title-after {
bottom: calc(var(--baseline)*-1.5 + 1px);
}
.hgroup-before{
position: absolute;
left: calc(var(--pagedjs-margin-left)*-1);
padding-left: 19px;
top: -47px;
}
.hgroup-after{
position: absolute;
bottom: calc(var(--baseline)*-5 - 1px);
right: calc(var(--pagedjs-margin-right)*-1);
text-align: right;
}
/* SPECIFIC ----------------------------------------------- */
#charlie-aubry .hgroup{
top: calc(var(--baseline)*-0.25 - 2px);
top: -2px;
}
#charlie-aubry .chapter-header .title-before{
/* top: calc(var(--baseline)*-1.25); */
top: calc(var(--baseline)*-1.5);
}
#charlie-aubry .chapter-header .title-after {
/* bottom: calc(var(--baseline)*-5 - 1px); */
bottom: calc(var(--baseline) * -1.75 + 1px);
}
#charlie-aubry .hgroup-after{
bottom: calc(var(--baseline)*-11 - 10px);
}

View file

@ -0,0 +1,138 @@
.description {
padding-left: calc(var(--unit)*0.75);
padding-right: calc(var(--unit)*0.75);
position: relative;
top: -4px;
}
.description-before {
position: relative;
top: -6px;
}
.description-after {
margin-top: -5px;
margin-bottom: calc(var(--baseline)*1 - 3px);
}
.description-before,
.description-after {
font-size: var(--sign-size);
color: var(--sign-color);
letter-spacing: var(--sign-spacing);
font-family: var(--sign-family);
line-height: var(--sign-baseline);
}
.description::before,
.description::after {
content: "......";
font-size: var(--sign-size);
color: var(--sign-color);
letter-spacing: var(--sign-spacing);
font-family: var(--sign-family);
line-height: var(--sign-baseline);
word-break: break-all;
width: calc(var(--unit)*0.75 + 4px);
overflow-wrap: anywhere;
display: block;
}
.description::before {
position: absolute;
left: 0;
top: -3px;
}
.description::after {
position: absolute;
right: -13px;
top: -3px;
}
h5 {
font-size: var(--sign-size);
color: var(--sign-color);
font-weight: normal;
position: relative;
z-index: 10;
top: calc(var(--baseline)*1);
background-color: white;
display: inline;
}
h5::before, h6::before{
font-size: var(--sign-size);
color: var(--sign-color);
letter-spacing: var(--sign-spacing);
font-family: var(--sign-family);
line-height: var(--sign-baseline);
}
.pagedjs_right_page h5{
left: -80px;
}
.pagedjs_right_page h5::before{
content: "+++++++"
}
.pagedjs_left_page h5{
left: -49px;
}
.pagedjs_left_page h5::before{
content: "+++++"
}
.h6_container {
position: relative;
z-index: 10;
top: calc(var(--baseline)*1);
}
h6 {
font-size: var(--sign-size);
color: var(--sign-color);
font-weight: normal;
position: relative;
background-color: white;
display: inline;
}
h6::before {
content: "++";
}
.decor-h6 {
font-size: var(--sign-size);
color: var(--sign-color);
letter-spacing: var(--sign-spacing);
font-family: var(--sign-family);
line-height: var(--sign-baseline);
position: absolute;
left: -49px;
top: calc(var(--baseline)*-2.5 + 11px);
}
.pagedjs_right_page .decor-h6 {
left: -80px;
top: calc(var(--baseline)*-4.5 + 11px);
}

View file

@ -1,16 +0,0 @@
.item-decor{
font-family: var(--sans);
font-weight: 400;
font-size: 12px;
position: absolute;
}
.pagedjs_left_page .item-decor{
left: -12mm;
}
.pagedjs_right_page .item-decor{
right: -12mm;
}

View file

@ -12,7 +12,7 @@
}
.container-following-note {
margin-left: 30%;
margin-left: calc(var(--unit)*2);
}
@ -41,6 +41,7 @@
padding-left: 0.25ch;
position: relative;
top: -3px;
line-height: 0;
}

View file

@ -0,0 +1,125 @@
.running-page_container{
--w-container: calc(var(--pagedjs-width) - var(--pagedjs-bleed-left)*2);
font-size: var(--sign-size);
color: var(--sign-color);
letter-spacing: var(--sign-spacing);
font-family: var(--sign-family);
line-height: var(--sign-baseline);
vertical-align: bottom;
padding-bottom: var(--running-bottom);
width: 100%;
position: absolute;
left: 0px;
bottom: 0px;
width: var( --w-container);
overflow: hidden;
/* background-color: red; */
}
.running-page{
width: calc(var(--w-container)*2);
padding-left: var(--running-left);
padding-right: 6px;
display: flex;
}
.running-page .symbols{
flex-shrink: 0;
/* background-color: white; */
z-index: 20;
}
.running-page .dots{
position: absolute;
top: -5px;
left: var(--running-left);
z-index: 10;
}
.pagedjs_right_page .running-page_container .running-page{
position: relative;
/* left: calc(var( --w-container)*-1 + var(--pagedjs-margin-left)*-1 + 2px); */
left: calc(var( --w-container)*-1 + 10px);
}
@page essai:first {
@top-left-corner {
content: var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol);
}
@top-left {
content: none;
}
@top-center {
content: none;
}
@top-right {
content: none;
}
}
@page entretien:first {
@top-left-corner {
content: var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol);
}
@top-left {
content: none;
}
@top-center {
content: none;
}
@top-right {
content: none;
}
}
@page portfolio:first {
@top-left-corner {
content: var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol) var(--symbol);
}
@top-left {
content: none;
}
@top-center {
content: none;
}
@top-right {
content: none;
}
}
/* TEMP */
@page entretien{
--sign-color: var(--red);
}

View file

@ -0,0 +1,122 @@
h3, h4{
break-after: avoid;
}
h3, h4{
font-family: var(--sign-family);
font-weight: normal;
margin-top: calc(var(--baseline)*1.5);
margin-bottom: calc(var(--baseline)*1);
position: relative;
font-size: var(--font-size);
color: var(--sign-color);
}
.h3_container,
.h4_container{
position: relative;
}
.subtitle-before,
.subtitle-after{
letter-spacing:var(--sign-spacing);
font-size: var(--sign-size);
color: var(--sign-color);
line-height: var(--sign-baseline);
}
.subtitle-line {
display: flex;
justify-content: flex-end;
}
.subtitle-after{
padding-left: 0.75ch;
position: relative;
left: 6px;
overflow-wrap: anywhere;
}
.subtitle-text{
/* background-color: yellow; */
flex-grow: 2;
}
.decor-h3{
font-size: var(--sign-size);
color: var(--sign-color);
letter-spacing: var(--sign-spacing);
font-family: var(--sign-family);
line-height: var(--sign-baseline);
position: absolute;
}
/* LEFTPAGE */
.decor-h3_small{
left: -49px;
top: calc(var(--baseline)*-2.5 + 9px);
}
.decor-h3_big{
right: -81px;
text-align: right;
top: calc(var(--baseline) * -3.5 - 9px);
}
/*RIGHTPAGE */
.pagedjs_right_page .decor-h3_small{
left: auto;
right: -53px;
top: calc(var(--baseline)*-2.5 + 9px);
text-align: right;
}
.pagedjs_right_page .decor-h3_big{
right: 0;
left: -80px;
text-align: left;
top: calc(var(--baseline) * -3.5 - 9px);
}
/*if page top */
.pagedjs_right_page .subtitle-top-page h3 {
margin-top: 0px;
}
.pagedjs_right_page .subtitle-top-page [data-count="2"]{
color: transparent
}
.pagedjs_left_page .subtitle-top-page h3 {
margin-top: 5px;
}
.pagedjs_left_page .subtitle-top-page .decor-h3_big [data-count="1"],
.pagedjs_left_page .subtitle-top-page .decor-h3_big [data-count="2"]{
color: transparent!important
}

View file

@ -1,118 +1,71 @@
.chapter p{
.chapter p {
text-align: justify;
hyphens: auto;
hyphenate-limit-chars: 8 3;
position: relative;
hyphenate-limit-chars: 7 3 2;
/* position: relative; */
orphans: 2;
hyphens: 2;
}
.container-following-note + p,
p + p{
text-indent: 30%;
p::before {
content: ".........";
font-size: var(--sign-size);
color: var(--sign-color);
letter-spacing: var(--sign-spacing);
font-family: var(--sign-family);
line-height: 0px;
position: relative;
/* text-indent: -6ch; */
top: -3px;
padding-left: 0px;
padding-right: 0px;
margin-right: -4px;
}
p::before{
/* content: ">";
position: absolute;
left: 0;
font-family: var(--mono);
font-weight: normal;
font-size: var(--fs-nav); */
/* display: block;
width: var(--unit);
height: var(--unit);
background-color: var(--grey);
top: 2px;
display: flex;
align-items: center; */
/* justify-content: center; */
.following-title::before,
.following-h3::before {
display: none !important;
}
/*BILBIOGRAPHIE*/
h3, h4{
break-after: avoid;
}
h3, h4{
font-weight: normal;
/* font-size: 14px; */
font-family: var(--font-subtitle);
/* font-family: var(--font-subtitle);
font-size: var(--fs-subtitle);
background-color: var(--grey);
font-size: var(--fs-nav);
line-height: 1;
padding: 4px 1ch;
min-height: var(--unit);
margin-top: calc(var(--baseline)*1.5);
margin-bottom: calc(var(--baseline)*0.5);
font-weight: normal; */
/* padding-left: 1.5ch; */
margin-top: calc(var(--baseline)*1.5);
margin-bottom: calc(var(--baseline)*0.5);
padding-left: 30%;
.bibliographie p {
font-size: var(--fs-notes);
line-height: 14px;
font-weight: 500;
text-align: left;
padding-left: calc(var(--unit)*2);
text-indent: calc(var(--unit)*-0.75);
break-inside: avoid;
position: relative;
}
h3::before,
h3::after{
/* content: "+------------------------------------------------+";
display: block;
position: relative;
left: -1.5ch;
width: calc(100% + 1.5ch); */
}
h4{
border: var(--border-grey);
background: none;
}
blockquote p{
/* font-family: var(--mono); */
}
blockquote{
padding-left: 3ch;
/* font-style: italic; */
margin-top: calc(var(--baseline)*0.5);
margin-bottom: calc(var(--baseline)*0.5);
}
blockquote::before{
content: "> > > > > > > > > >";
display: block;
width: 1ch;
.bibliographie p::before {
content: ".....";
position: absolute;
left: 0;
font-family: var(--mono);
font-size: var(--fs-nav);
font-style: normal;
/* left: calc(var(--unit)*0.75); */
left: calc(var(--unit)*0.75 + 16px);
top: 3px;
display: none !important;
}
.bibliographie p::after {
content: "+";
position: absolute;
left: calc(var(--unit)*0.75);
top: 0px;
font-size: var(--sign-size);
color: var(--sign-color);
letter-spacing: var(--sign-spacing);
font-family: var(--sign-family);
line-height: var(--sign-baseline);
}
.chapter > :first-child{
margin-top: 0px;
}
.pagedjs_area{
position: relative;
}

View file

@ -0,0 +1,18 @@
@font-face {
font-family: "JetBrains Mono";
src: url("JetBrainsMono[wght].ttf") format("truetype");
font-weight: 100 800;
font-style: normal;
}
@font-face {
font-family: "JetBrains Mono";
src: url("JetBrainsMono-Italic[wght].ttf") format("truetype");
font-weight: 100 800;
font-style: italic;
}
/* p {
font-family: "JetBrains Mono";
font-feature-settings: "calt" 1;
} */

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,54 @@
@font-face {
font-family: 'OCR-X';
src: url('OCR-X-Bold.woff2') format('woff2'),
url('OCR-X-Bold.woff') format('woff');
font-weight: bold;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'OCR-X';
src: url('OCR-X-Black.woff2') format('woff2'),
url('OCR-X-Black.woff') format('woff');
font-weight: 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'OCR-X';
src: url('OCR-X-Light.woff2') format('woff2'),
url('OCR-X-Light.woff') format('woff');
font-weight: 300;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'OCR-X';
src: url('OCR-X-Regular.woff2') format('woff2'),
url('OCR-X-Regular.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'OCR-X';
src: url('OCR-X-Medium.woff2') format('woff2'),
url('OCR-X-Medium.woff') format('woff');
font-weight: 500;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'OCR-X';
src: url('OCR-X-Thin.woff2') format('woff2'),
url('OCR-X-Thin.woff') format('woff');
font-weight: 100;
font-style: normal;
font-display: swap;
}

View file

@ -0,0 +1,13 @@
@font-face {
font-family: "OCR X";
src: url("OCR-XTrial-VariableVF.ttf") format("truetype");
font-weight: 10 220;
font-style: normal;
}
@font-face {
font-family: "OCR X";
src: url("OCR-XTrial-VariableVF.woff2") format("woff2");
font-weight: 10 220;
font-style: normal;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,40 @@
@font-face {
font-family: 'Teletext';
src: url('MODE7GX0.TTF') format('truetype');
font-weight: normal;
font-style: normal;
font-display: swap;
}
/* @font-face {
font-family: 'Teletext';
src: url('MODE7GX1.TTF') format('truetype');
font-weight: normal;
font-style: normal;
font-display: swap;
} */
/* @font-face {
font-family: 'Teletext';
src: url('MODE7GX2.TTF') format('truetype');
font-weight: 300;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Teletext';
src: url('MODE7GX3.TTF') format('truetype');
font-weight: 400;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Teletext';
src: url('MODE7GX4.TTF') format('truetype');
font-weight: 500;
font-style: normal;
font-display: swap;
} */

View file

@ -0,0 +1,55 @@
@font-face {
font-family: "Triplicate T3";
src: url("triplicate-t3.ttf") format("truetype");
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "Triplicate T3";
src: url("triplicate-t3-italic.ttf") format("truetype");
font-weight: normal;
font-style: italic;
}
@font-face {
font-family: "Triplicate T3";
src: url("triplicate-t3-bold.ttf") format("truetype");
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: "Triplicate T3";
src: url("triplicate-t3-bold-italic.ttf") format("truetype");
font-weight: bold;
font-style: italic;
}
@font-face {
font-family: "Triplicate T4";
src: url("triplicate-t4.ttf") format("truetype");
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "Triplicate T4";
src: url("triplicate-t4-italic.ttf") format("truetype");
font-weight: normal;
font-style: italic;
}
@font-face {
font-family: "Triplicate T4";
src: url("triplicate-t4-bold.ttf") format("truetype");
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: "Triplicate T4";
src: url("triplicate-t4-bold-italic.ttf") format("truetype");
font-weight: bold;
font-style: italic;
}

View file

@ -1,177 +0,0 @@
# CSS Page Weaver
![Interface](https://gitlab.com/csspageweaver/csspageweaver/-/wikis/uploads/e724d6782600c30bc1b8d1ad56b24217/_screen_copie.webp)
CSS Page Weaver is a browser-based publishing tool, made up of [PagedJs](https://pagedjs.org/about/) library and modulars additionals features. While it's design to ease installation for beginners CSS Page Weaver also bring elegant and extendable solution for more advanced users.
## ✨ Features
- **Streamlined and Ready-to-Use**: Get started quickly with a standardized way to integrate features.
- **Extensive Plugin Library**: No need to reinvent the wheel with the available plugins.
- **WYSIWYG Editor**: Streamline your design pratice with an extandable interface.
- **Create and Share Plugins**: Develop and share your own plugins easily.
## ⛵ Getting Started
### Prerequisites
- A local web server
### 🪴 Installation (fastest way)
If you feel a bit lost with following instruction, you should probably look at the [CSS Page Weaver compiled with a few plugins](https://gitlab.com/csspageweaver/csspageweaver/-/releases)
Integrate it at the root level of your page and add a link to `csspageweaver` main _module_ into your HTML template
```html
<script src="/csspageweaver/main.js" type="module"></script>
```
*Do you need to also install PagedJs? Nope! CSS Page Weaver already embed it.*
### Use
Run a simple server. That's it!
### Boilerplate
Don't have a project to test it? There is [a ready-to-use boilerplate](https://gitlab.com/csspageweaver//boilerplate). Download, unzip & run a server!
## 🚀 Going further
### 🌲 Installation (complete way)
Released version on CSS Page Weaver is compiled with few plugins. You can install the package yourself for greater control.
#### Clone CSS Page Weaver repo in your project [option A].
```bash
# With HTTPS
git clone https://gitlab.com/csspageweaver/csspageweaver.git
# With SSH
git clone git@gitlab.com:csspageweaver/csspageweaver.git
```
#### Clone CSS Page Weaver as a git subtree [option B].
Subtree are great to:
- embed CSS Page Weaver repo in another repo
- get updates
```bash
git subtree add --prefix csspageweaver/ git@gitlab.com:csspageweaver/cssPageWeaver.git --squash
```
### 🔌 Dependencies
CSS Page Weaver is designed to work with plugins. In this complete installation, you need to install plugins by yourself. If you've downloaded [the last release of CSS Page Weaver](https://gitlab.com/csspageweaver/csspageweaver/-/releases), few plugins are already embedded.
**Here is a [list of all plugins](https://gitlab.com/csspageweaver//plugins) known.**
**Steps**
1. Download and place plugin folder in `csspageweaver/plugins`
2. Add plugin to manifest
#### Installation as subtree
We prefer to install plugins using Git Subtree because it allows us to easily preserve the filiation link with the plugin directory (and to obtain updates!).
Bear in mind, if you're not comfortable with command lines, that *step 1* can easily be replaced by a simple *download, drag and drop*.
Otherwise, here is how it works.
##### (Step 1) Clone plugin as a subtree
Install plugin as a submodule of `csspageweaver`
```bash
git subtree add --prefix="csspageweaver/plugins/{{PLUGIN_FOLDER_NAME}}" git@gitlab.com:csspageweaver/plugins/{{PLUGIN_NAME}}.git --squash
```
##### (Step 2) Add plugin to manifest
Almost done. Add a mention to `csspageweaver/manifest.json`
```json
{
"plugins": [
// existing plugin,
"PLUGIN_FOLDER_NAME"
],
}
```
Look at complete [plugins list](https://gitlab.com/csspageweaver/plugins) and [plugins installation guide](https://gitlab.com/csspageweaver/csspageweaver/-/wikis/design/plugins/install)
#### Update as subtree
This is where Git subtrees are wonderful
```bash
git subtree pull --prefix="csspageweaver/plugins/{{PLUGIN_NAME}}" main --squash
```
A bit dazed? Don't worry. Once again, you can update your plugins with your favorite *download, unzip, drag and drop* shady method.
### 🎁 Package manager
You already like the principle of subtrees, but you think (rightly) that the multiplication of command lines can be a bit tedious in the long run? Installation and dependencies can me handle with our [Package Manager](https://gitlab.com/csspageweaver/package-manager)
**Install CSS Page Weaver and plugins with package manager**
```bash
./weaver_manager.sh --install
```
**Get update with package manager**
```bash
./weaver_manager.sh --pull
```
See [Package Manager repository](https://gitlab.com/csspageweaver-toolkit/package_manager) and [further documentation on managing your installation](https://gitlab.com/csspageweaver/csspageweaver/-/wikis/maintain_and_develop/core/5-manage_csspageweaver_integration)
## 🔄 Customization
### Basic Information
Edit `csspageweaver/manifest.json` to declare:
- Plugins
- Plugins configuration
- Stylesheets
- Your custom hooks
### CSS Page Weaver behavior (advanced)
Edit `csspageweaver/main.js` to:
- disable Common dictionary
- disable Interface
- Choose render method
## 🎓 Documentation
A complete [documentation is available](https://gitlab.com/csspageweaver/csspageweaver/-/wikis/home)
## 📝 License
This project is licensed under the MIT License
## 👏 Acknowledgements
CSS Page Weaver is based on [PagedJs](https://pagedjs.org/about/) by Coko Foundation.
CSS Page Weaver is an original idea of Julie Blanc ehanced by Benjamin G.
Julien Taquet was a great help in reimagining the rendering module. Finally, Nicolas Taffin and Julien Bidoret helped to oversee this tool.
All CSS Page Weaver plugins remains linked to their original creators.
Without them, GUI would remain an empty shell. Thanks 🙏
## 🙌 Contributing
Features and documentation requests are welcome! Feel free to check the [issues page](https://gitlab.com/csspageweaver/csspageweaver/-/issues).
Contributions must follow our [code of conduct](https://www.contributor-covenant.org/version/2/1/code_of_conduct/)

View file

@ -27,12 +27,17 @@
"assets/css/02_body.css",
"assets/css/03_layout.css",
"assets/css/chapter-header.css",
"assets/css/item-decor.css",
"assets/css/blockquote.css",
"assets/css/notes.css",
"assets/css/text.css"
"assets/css/text.css",
"assets/css/subtitles.css",
"assets/css/running-page.css",
"assets/css/entretiens.css"
],
"hook": [
"/js/decor-subtitles.js",
"/js/decor-num-pages.js",
"/js/decor-blockquote.js"
]
}

View file

@ -38,10 +38,9 @@ function inlineNotesHandler(params){
createNotes(content, input, type);
let noteContainer = content.querySelector(params.containerNotes);
if(noteContainer){
content.querySelectorAll(params.containerNotes).forEach(noteContainer => {
noteContainer.remove();
}
});
}

View file

@ -27,6 +27,9 @@
<link rel="stylesheet" type="text/css" href="/assets/fonts/BaskemoSans/stylesheet.css">
<link rel="stylesheet" type="text/css" href="/assets/fonts/Bilzig/stylesheet.css">
<link rel="stylesheet" type="text/css" href="/assets/fonts/DecorRound/stylesheet.css">
<link rel="stylesheet" type="text/css" href="/assets/fonts/OCR-X/stylesheet.css">
<link rel="stylesheet" type="text/css" href="/assets/fonts/Velvetyne/stylesheet.css">
<link rel="stylesheet" type="text/css" href="/assets/fonts/Teletext/stylesheet.css">
</head>
@ -37,10 +40,7 @@
<h1>Décor 6 - Numérique</h1>
</section>
<span class="nav-decor">D6cor</span>
<span class="nav-type">Essai</span>
<span class="nav-author">Olivain Porry</span>
<span class="nav-title">Un robot-poète ne&nbsp;nous fait toujours pas peur</span>
@ -55,27 +55,30 @@
<section class="chapter" id="olivain-porry">
<section class="chapter" data-chapter="essai" id="olivain-porry">
<span class="nav-decor">D6cor</span>
<span class="nav-author">Olivain Porry</span>
<span class="nav-title">Un robot-poete ne&nbsp;nous fait toujours pas peur</span>
<div class="chapter-header">
<p class="type">Essai</p>
<div class="hgroup-before">++++<br>+++++<br>+++<br>++<br>
+<br>+<br>+<br>+<br>+<br>+<br>
+++<br>++<br>+<br>+<br>
+<br><br>+<br>++<br>+<br></div>
<div class="hgroup">
<h2><span>Un robot-poète ne&nbsp;nous fait toujours pas peur</span></h2>
<p class="author">Olivain Porry</p>
<div class="title-before">++--------------------------+</div>
<h2><span>Un robot-poete <br>ne&nbsp;nous fait toujours <br>pas peur</span></h2>
<p class="author"><span>Olivain Porry</span></p>
<div class="title-after">+--------------------------++</div>
</div>
<div class="bio">
<p class="name">Olivain Porry</p>
<p class="description">est artiste, docteur en recherche-création (SACRe) du laboratoire EnsadLab
(université PSL) et diplômé d'un DNSEP de l'École des Beaux-Arts de Nantes. Son travail plastique se
concentre sur l'émergence, dans une expérience esthétique, de modalités relationnelles entre public,
dispositif artistique et environnement. </p>
</div>
<div class="hgroup-after">+<br>++<br>+++<br>++++<br>+++<br>++<br>+<br>
</div>
</div>
<p>Entouré dun cadre noir et brillant, posé sur une surface blanche et
<p class="following-title">Entouré dun cadre noir et brillant, posé sur une surface blanche et
plastique, un texte saffiche et décrit ce qui se trouve supposément
devant lui : « Un homme se tient dans une salle baignée de lumière rouge
». Si un homme se tient en effet debout face à lappareil, la salle
@ -103,8 +106,7 @@
Ducrocq, tandis que Boris Vian, lui, sen amusait. Dans une
correspondance restée célèbre sous le titre « Un robot-poète ne nous
fait pas peur »<a href="#fn1" class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a>, il
écrivait : « Mirandolez,
éclaboussez ce robot poète de vos connaissances en cybernétique,
écrivait : « Mirandolez, éclaboussez ce <br>robot poète de vos connaissances en cybernétique,
expliquez-lui comment il marche et vous laurez tout humble à votre
merci. »</p>
<p>Aujourdhui, notre rapport aux mots prend une forme nouvelle,
@ -112,7 +114,7 @@
lapparition de vocables qui circulent, se répètent et se diffusent dans
nos imaginaires. Parmi eux, un mot en particulier cristallise ces
tensions : le mot « arafed ».</p>
<h3>Une sociolinguisitique arafed</h3>
<h3 class="">Une sociolinguisitique arafed</h3>
<p>Cest à loccasion du Chaos Computer Congress, dans lune des grandes
salles de conférence du centre des congrès de Hambourg, que le terme «
arafed » est décrit par deux chercheurs<a href="#fn2" class="footnote-ref" id="fnref2"
@ -138,7 +140,7 @@
massivement parce
quaccessible gratuitement et facilement dès 2014, COCO contient des
textes en anglais qui décrivent des images. Ces légendes commencent,
dans la très grande majorité des cas, par les articles indéfinis « A »
dans la très grande majorité des <br><br>cas, par les articles indéfinis « A »
et « An » : <em>An apple on a table, a brown teddy bear with a blue bib
on that says baby</em>. La surreprésentation de ces articles indéfinis
en début de phrase a mené BLIP à produire, au cours de son entraînement,
@ -168,7 +170,7 @@
sociolinguistique. Les LLM animent aujourdhui de très nombreux
programmes informatiques, des <em>bots,</em> qui lisent et écrivent sur
internet avec des objectifs allant de lexploration de données (<em>data
mining</em>) à la diffusion de propagande politique. De X à Instagram en
mining</em>) à la diffusion <br>de propagande politique. De X à Instagram en
passant par Reddit, les réseaux sociaux pullulent de ces <em>bots</em>
qui produisent textes, images et sons pour nous encourager à interagir
avec eux et entretenir ces interactions. Sur des plateformes comme
@ -204,7 +206,7 @@
constituent des matrices lexicales que les locuteurs sapproprient : une
adoption généralement inconsciente dun vocabulaire, de lexiques et de
structures syntaxiques, provoquée par lusage répété des LLM dans
lexercice décriture. Dans ce contexte, le langage apparaît comme une
lexercice <br>décriture. Dans ce contexte, le langage apparaît comme une
matière poreuse, traversée par des flux de textes générés
automatiquement à travers des logiques systématiques et probabilistes
décorrélées des dimensions socio-culturelles des langues.
@ -221,7 +223,14 @@
fond : un dialecte hybride qui nautorise que lélaboration didées
aussi précises quelles savèrent uniformes<a href="#fn10" class="footnote-ref" id="fnref10"
role="doc-noteref"><sup>10</sup></a>.</p>
<h3>La langage est un champ de bataille</h3>
<p>Si les LLM apparaissent comme de nouveaux acteurs sociolinguistiques,
leurs usages, nombreux et divers, cristallisent aussi une forme de lutte
culturelle. Cette conflictualité se donne à voir sur les réseaux sociaux
@ -289,7 +298,9 @@
garde-fous des grands modèles de langage à travers linvention dune
stratégie dattaque au nom évocateur : la poésie antagoniste<a href="#fn18" class="footnote-ref"
id="fnref18" role="doc-noteref"><sup>18</sup></a>.</p>
<h3>Pour une poésie antagoniste</h3>
<h3 class="subtitle-top-page">Pour une poesie antagoniste</h3>
<p>Dans un article publié en 2023, des chercheurs ont démontré quils
étaient parvenus à faire apparaître des données dentraînement brutes
@ -546,7 +557,361 @@
</section>
<section class="chapter" id="outdoor-computer-club">
<section class="chapter" data-chapter="entretien" id="charlie-aubry">
<span class="nav-decor">D6cor</span>
<span class="nav-author">Charlie Aubry</span>
<span class="nav-title">"Des intuitions venues en le faisant"</span>
<div class="chapter-header">
<div class="hgroup-before">
++<br>
+
<br>
<br>
+<br>
+<br>
+<br>
++<br>
+++<br>
++++<br>
+++++<br>
++++<br>
+++<br>++<br>+<br>+<br><br>+<br>
</div>
<div class="hgroup">
<div class="title-before">++--------------------------+</div>
<h2><span>"Des intuitions venues en le faisant" </span></h2>
<p class="author"><span>Charlie Aubry</span></p>
<div class="title-after">+--------------------------++</div>
</div>
<div class="hgroup-after"><br><br>+<br>++++<br>+++<br>++<br>+<br><br>++<br>+<br>+<br>+<br>+<br>+
</div>
</div>
<div class="description-before">.............................</div>
<div class="description">Entretien avec Charlie Aubry, réalisé le 30 novembre 2025 par Martin De Bie.</div>
<div class="description-after">.............................</div>
<p class="following-title">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque feugiat non odio eu euismod. In sit amet eros ut velit ornare sollicitudin sit amet quis est. Vestibulum ultricies dui commodo diam tristique efficitur. Mauris eleifend enim at vestibulum placerat. Vestibulum placerat elit metus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nullam iaculis magna eget nisl semper, ut scelerisque nisi luctus. Fusce pharetra tincidunt pharetra. Curabitur ac sodales mauris. Praesent erat leo, rhoncus ut felis a, auctor egestas nulla. Nulla pretium ex vitae ante commodo sollicitudin. Phasellus sed velit aliquam, laoreet neque vel, faucibus quam. Etiam posuere cursus sem, quis laoreet tortor posuere ac. Aliquam sed fermentum justo, a lobortis libero. In auctor arcu id metus auctor, ac tincidunt velit euismod. Donec vel arcu ut sapien convallis pharetra.</p>
<p>Mauris tincidunt eleifend eleifend. Nunc in elit venenatis, gravida elit ac, commodo dui. Nulla tempus augue lorem, ut dignissim elit gravida vel. Phasellus dui nulla, lacinia et accumsan a, condimentum sed nisl. Aenean tincidunt vitae eros vel sollicitudin. Suspendisse potenti. Vestibulum eget orci in urna maximus tempus. Suspendisse rhoncus imperdiet nunc, vitae ultricies metus ornare quis. Etiam quis auctor erat.</p>
<h5>Martin</h5>
<p>Bonjour Charlie, merci davoir accepté cet entretien pour
la revue Décor numéro 6. Avant de commencer, jaimerais revenir
brièvement sur ton travail.</p>
<p>Tu es artiste plasticien, et quand on parcourt ton travail, on se
rend rapidement compte que tu as un goût assez prononcé pour la
collection, le démontage, le hacking de machines, le détournement
dobjets souvent désuets et promis à labandon. Il y a aussi chez toi
une manière assez forte de faire dialoguer une pensée complexe avec des
formes très accessibles. Pour cela, tu utilises des médiums très variés
: la vidéo, linstallation, des formes parfois plus sculpturales, avec
une place souvent centrale accordée au son et à la musique que tu
pratiques aussi à côté.</p>
<p>Aujourdhui, jaimerais quon parle plus précisément de ton travail à
travers une pièce, une installation : P3 450. Elle a été présentée aux
Abattoirs de Toulouse en 2019, puis au Palais de Tokyo en 2020. Lidée,
cest de sappuyer sur cette pièce pour comprendre ton processus de
création, lorsque tu imagines tes installations. Jaimerais quon essaye
de “craquer ton code créatif” qui me semble être davantage une posture
quune méthode fixe, que tu appliques à chaque projet.</p>
<p>Pour commencer, peux-tu nous décrire brièvement cette installation P3
450 ? Son origine, son fonctionnement, et ce que cela produit comme
expérience pour le public ?</p>
<h6>Charlie</h6>
<p>Déjà, merci pour linvitation.</p>
<p>Pour P3 450, si on repart sur la genèse du projet, cétait en réponse
à la loi sécurité globale qui donnait le droit aux autorités étatiques
de scanner les visages et den tirer des informations, et ensuite de
faire des croisements de ces données-là : trouver des identités, ou
plein dautres choses. Et je crois que cest aussi lié avec larrivée
des premières IA qui se démocratisent, le début de ChatGPT, plein
dautres outils, comme les petites cartes NVIDIA type Jetson Nano qui
permettaient de faire tourner des petites IA de reconnaissance. Et dun
coup, à ce moment-là, jai commencé à réaliser la force de frappe de ces
outils, ou quelles allaient avoir : dans les croisements de big data,
pouvoir repérer quelquun, trouver son compte en banque, se rendre
compte que tout est lié informatiquement dans des bases de données. On
le voit quand on retrouve des gens en un claquement de doigts. Tous ces
croisements entre la plaque dimmatriculation, le compte en banque, la
CAF, etc.</p>
<p>Jy voyais quelque chose dassez violent. Je me suis demandé comment
ça pouvait se remettre dans lespace public, enfin dans lespace
dexposition, mais que ce soit pas utopique : quelque chose de réel,
fonctionnel, et aussi fonctionnel juridiquement. À lépoque, on sest
entouré dune avocate juriste dans le numérique : avec elle, on a trouvé
le périmètre daction, ce quon avait le droit de <br>faire. Les lois
changeaient tous les six mois : à un instant T ça marchait, et ça ne
marche plus maintenant.</p>
<p>Je me suis entouré dun docteur en intelligence artificielle qui
sappelle Jean-Charles Risch, avec qui on a travaillé en collaboration.
Il est le grand architecte de l'installation.</p>
<p>Linstallation ressemble à une espèce de data center. Il y avait
lidée de montrer la consommation, montrer ce que ça génère : des bips
informatiques, des ordis qui travaillent, les câbles… On parle du cloud
comme si cétait dématérialisé, mais en fait ça arrive vraiment à un
endroit, un endroit qui récupère tout ça.[...]</p>
<p>En fonction du visage de certains, ça bloquait pendant 30 secondes,
et les écrans allaient chercher de la publicité, des choses attractives,
pour ces personnes-là, à partir de choses terribles : lIA quon a
entraînée essayait de trouver des catégories sociales. Cest un peu ce
que fait Facebook : essayer de faire un profil psychologique et social
avec quelques photos.[...]</p>
<p>Pour entraîner lIA, quon a fabriquée de A à Z, on la déposée aussi
à lorganisme INPI ou je ne sais plus, pour avoir les droits, parce
quon la fait de zéro. Jean-Charles Risch est spécialisé en machine
learning. LIA était capable dapprendre à partir de quelques données,
puis de sauto-alimenter. Et là, pour “trouver une classe sociale”, ça
veut dire quoi ? Cest intéressant de voir le chemin quelle fait.</p>
<p>Par exemple : quelquun porte du Louis Vuitton, est-ce que cest
quelquun de riche ? Sil est racisé, est-ce que cest toujours
quelquun de riche ? Sil est blanc, est-ce que cest quelquun de riche
? Tout ça. En plus, il y avait une analyse faciale : si la vidéo
projetée sur la personne repérée, si la personne souriait, elle avait un
bon point. Si cétait intermédiaire ou elle était pas contente, elle
avait un mauvais point. À force, elle sest auto-alimentée. Cétait
dune grande précision, très flippant.</p>
<h5>Martin</h5>
<p>À quel point cétait important dans le processus de
création de partir de zéro, dentraîner “from scratch” un algorithme,
alors quil existait déjà des modèles, des datasets que tu pouvais
récupérer assez facilement ?</em></p>
<h6>Charlie</h6>
<p>Je crois que cest un moyen de comprendre, déjà, pour moi.</p>
<p>Jean-Charles, lui, était docteur, il comprenait les enjeux. Mais moi
je ne comprenais pas bien. Javais besoin de le faire <br>avec lui pour
comprendre larchitecture, et aussi les enjeux : distinguer ce qui est
de lordre du mythe, du Terminator. Dailleurs cest pour ça quon la
nommé <em>P3 450</em> : cest le nom de série des cartes qui
pilotent la quarantaine dordis. Et ça faisait référence à au T1000 de
Terminator ou bien au film THX 1138…</p>
<p>Le titre joue sur le mythe du dépassement de lhumain, mais en le
faisant on se rend compte que non : cest basé sur des clichés racistes,
homophobes… cest terrible. Cétait intéressant de comprendre comment
cela fonctionne : comment on crée un pseudo-cerveau, quelle autonomie
réelle, et comment cela peut sappliquer.</p>
<p>Et juridiquement, partir de zéro permettait de mettre un périmètre
clair. On a utilisé des datasets, des banques dimages : pour entraîner
une IA, il faut des centaines de milliers dimages. On a eu des
librairies open source énormes, des centaines de gigas, pour
différencier identité de genre, etc.[...]</p>
<h5>Martin</h5>
<p>Donc lorsque tu commences à travailler avec Jean-Charles
Risch, tu comprends comment cela fonctionne, mais tu nas pas encore la
forme définitive de linstallation. Comment le fait de mettre les mains
dans le cambouis a fait évoluer ce que tu allais construire visuellement
au fur et à mesure que le projet avançait ?</em></p>
<h6>Charlie</h6>
<p>Il y avait une grosse part dimpro. Aux Abattoirs, javais
quatre jours dinstallation. Avec beaucoup de schémas, on a fait tourner
les machines dans un petit espace, et ça a créé une première version
monolithique, à léchelle de la pièce où on a fait tourner les
machines. [...]</p>
<p>
Quand on entend les ordis réfléchir, le bruit des disques durs… On a
envie que ça se matérialise. On simagine à léchelle dinternet : un
data center avec des centaines de milliers de serveurs. [...]</p>
<p>
Mais cela sest formalisé tard, au moment du montage. Et javais envie
de ramener quelque chose dhumain, pas juste une baie informatique :
raconter des histoires dedans, mettre des objets du quotidien, etc. Mais
oui, ça sest formalisé sur la fin : des intuitions venues en le
faisant.</p>
<h5>Martin</h5>
<p>Tu parlais des biais, ça me fait penser au chatbot de
Microsoft (Tay), qui est devenu raciste en moins de 48h. Est-ce quà un
moment, en voyant évoluer lIA, vous avez eu peur que ça prenne une
mauvaise tournure ?</p><p>
Avez-vous choisi de la contraindre, ou au contraire de prendre le risque
de laisser apparaître ces dérives, parce que cela fait aussi partie de
la réalité de ces algorithmes ?</em></p>
<h6>Charlie</h6>
<p>On a eu des gros stops de la part du musée. Comme lidée était
que cela puisse exister dans la vraie vie, il fallait que le spectateur
rentre sans signer une décharge. Il y avait donc des éléments
rhétoriques : on parlait “danalyse de pixels” plutôt que de
portraits. [...]</p>
<p>
Après, on na pas énormément contraint le système. Là où cela a
vraiment été limité, cest sur lidentification des personnes. Cétait
interdit par la juriste et par le musée. Car lorsquon associe un visage
humain et quon lui dit “trouve une identité”, ça sortait des dingueries
: afficher des animaux selon des caractères physiques… mais parfois ça
arrivait à trouver une identité, une sur dix tentatives. Cela dépendait
surtout de sa médiatisation.</p>
<p>Donc tout cela, on la exclu. Pour le reste, ça se baladait sur
YouTube.</p>
<p>Pour le schéma, on avait fait un tableau, une grille que lIA pouvait
auto-remplir. Au début, on a mis des mots-clés caricaturaux : personne
âgée est associée à documentaire animalier ou discours politique ; un
enfant lui vers Nike, Haribo, etc et via lAPI YouTube, on recherche par
tags. Puis on lui a dit : tu as ça comme base, auto-alimente toi et
génère des nouveaux tags en fonction de la réaction des gens. [...]</p>
<p>Mais le spectateur ne voyait pas forcément cette ingénierie
derrière.</p>
<h5>Martin</h5>
<p>Justement, quelle était la perception des gens ?<br />
Est-ce quils comprenaient vraiment ce qui se jouait ?<br />
Comment ressortaient-ils de linstallation ? Et quels types de discours
revenaient le plus souvent ?</em></p>
<h6>Charlie</h6>
<p>Il y a eu quelques personnes averties qui mont écrit pour me
dire : “je ne veux pas être enregistré”. Mais je ne suis pas sûr
quelles comprenaient vraiment ce qui se jouait. Cétait surtout la peur
dêtre filmé.</p>
<p>Dans linstallation, il y avait un écran de contrôle de chaque côté,
pour que lon puisse tourner autour. Cela affichait en temps réel ce que
lIA voyait : parfois un focus sur un visage, âge, genre, etc.</p>
<p>Mais cétait assez déceptif : je pensais que les gens seraient en
colère, quils casseraient tout. En fait, ils étaient plutôt contents.
Cela faisait attraction. [...]</p>
<h5>Martin</h5>
<p>Aujourdhui, en 2026, lIA est partout dans les
conversations.<br />
Si la pièce était présentée maintenant, est-ce que tu penses quelle
aurait un impact différent maintenant que lon a une conscience plus
aiguë de ces enjeux ?<br />
Et quen serait-il de cette question du visible et de linvisible,
notamment autour des data centers ?</em></p>
<h6>Charlie</h6>
<p>Je pense que les gens nont toujours pas vraiment conscience
que les data centers réchauffent le climat, quils consomment énormément
deau, dair… Ça, ce nest pas encore totalement conscientisé. LIA,
oui.</p>
<p>Mais pour le reste, on est toujours dans une forme de dictature
molle. Lidée, cest que tu passes dans linstallation, puis tu sors et
tu te dis : “tiens, je vais me faire un McDo”, en pensant que ça vient
de toi. En fait, l'IA, sur certains attraits, te pousse à consommer.
Tas limpression que ça vient de toi, mais pas du tout. Peut-être quil
aurait fallu pousser encore plus loin, aller vers une forme de
sponsoring assumé. Il y avait déjà YouTube. [...]</p>
<h5>Martin</h5>
<p>Quel est ton point de vue sur les outils numériques, et
plus spécifiquement sur lIA, dans le champ de lart ?<br />
Pour les créateurs, cela ouvre des possibilités presque infinies, mais
cela soulève aussi des questions politiques, parfois polémiques.<br />
Comment toi, tu te situes par rapport à cela ?</p>
<h6>Charlie</h6>
<p>Cest compliqué. Réponse en deux voies.</p>
<p>La première voie, cest que si tu mavais posé la question avant que
je sois professionnel à 100 %, jaurais probablement répondu autrement.
Aujourdhui, jai parfois limpression dêtre davantage le chef dune
PME quun artiste plasticien : il y a la compta, lauto-branding, les
réseaux… On se rend compte que tout entre en jeu, la condition sociale{}
aussi. Ce sont des autoroutes à vitesses très différentes. [...]</p>
<p>Quand je réponds à un appel à candidature, je ne suis pas payé pour
le faire, et la réponse est négative la plupart du <br>temps. Passer trois
jours dessus, cest lourd. Donc là-dessus, lIA maide. [...] On passe de
quatre jours à deux heures. Et ça me permet de me recentrer sur ma
pratique.</p>
<p>Cest pareil pour la démocratisation des savoirs : ça démultiplie ma
capacité à faire. Si je répare quelque chose, je prends une photo dun
PCB, jai immédiatement des pistes. Ça me fait gagner du temps et ça
mapprend aussi des choses. En même temps, je reste critique. Dans le
monde de lart, il y a déjà ce côté performatif permanent, les gros
studios, les assistants… Je nai pas envie dentrer là-dedans. Si lIA
me sert, cest pour dégager du temps et continuer à avoir les mains dans
les outils. [...]</p>
<p>a seconde voie, ce serait dêtre totalement réticent. On est pris
dans un paradoxe capitaliste : jai des Nike, un iPhone, je sais ce que
ça implique en termes de ressources. Cest extrêmement difficile de
sortir du flux. Je ne cherche pas une forme de pureté, jessaie plutôt
de resserrer langle. Et puis il y a labsence déthique : ces outils
peuvent aussi servir à produire du malveillant. On peut la berner
facilement et leur faire produire des choses dangereuses sous prétexte
de fiction.</p>
<p>En même temps, il ne sagit pas non plus dêtre des luddites. Cest
une révolution technologique, et sy opposer frontalement serait tout
aussi violent. Pour moi, la question est politique à une échelle
globale. Comme pour leau ou les vitrines allumées la nuit : ce nest
pas lindividu, cest le système. Et ce qui se profile, cest un écart
technologique énorme entre les pays, une nouvelle forme dordre. À mon
échelle, ça me rend plus performatif dans mon domaine. Mais la vraie
question reste celle de la balance : est-ce que mon travail justifie de
réchauffer 15 litres deau par prompt ? On ne matérialise pas réellement
limpact.</p>
<h5>Martin</h5>
<p>Dailleurs on parlait des petits modèles qui tournent en
local, de souveraineté, doutils plus frugaux. Cela pose la question de
louverture : des outils libres, du partage. Tu es sensible à lidée de
maîtriser tes propres outils, mais aussi à celle de les rendre
accessibles.<br />
Comment tu te situes par rapport à cela aujourdhui ?</em></p>
<h6>Charlie</h6>
<p>Jusquà il ny a pas longtemps, on pouvait trouver le code de
P3 450 sur mon site, je suis en train de tout refaire, mais tous mes
programmes sont accessibles.</p>
<p>La question du droit dauteur, au XXIe siècle, ce nest pas là-dessus
que je me concentre. Ce qui mintéresse davantage, cest la question du
revenu continu. Le droit dauteur est lié à une forme de capital, à des
inerties qui enrichissent souvent des gens déjà riches, et cest très
difficile dentrer dans ces cercles-là.</p>
<p>Par contre, la démocratisation des outils ma rendu autonome, que ce
soit sur le code ou sur les outils. Ça permet aussi de comprendre
comment les systèmes fonctionnent, de les contourner parfois, et surtout
de voir à quel endroit on peut intervenir. Je pense quon est dans une
bulle, dans quelque chose qui part un peu dans les extrêmes. Mais pour
la majorité des usages, ça va se nuancer. Avoir un agent local qui
consomme peu, ça deviendra logique. On ne pourra pas continuer à
fonctionner comme aujourdhui.</p>
<p>Ce qui minquiète, cest la question dune forme de “primitivisme”
technologique : des gens qui seraient considérés comme primitifs parce
quils nauraient pas accès à certaines augmentations, à certaines
technologies. Est-ce quil y aura des zones autonomes anti-IA, des
dispositifs anti-détection ? On peut déjà imaginer des choses comme ça.
Tout est interdépendant. on traite les sujets un par un, mais en réalité
tout se répond. Il faudrait des approches globales, à léchelle
internationale sur le plan écologique et technologique. [...]</p>
<h5>Martin</h5>
<p>Peut-être une dernière chose pour conclure. On est partis
un peu dans tous les sens, mais cest aussi ce que génère ton travail :
quand on est artiste aujourdhui, on est obligé daller chercher
partout, parce que tout est intrinsèquement lié. On ne peut pas parler
dun sujet sans être “tout azimut”, sans croiser des dimensions
techniques, politiques, sociales.</p>
<h6>Charlie</h6>
<p>Ouais. Le plus dur, aujourdhui, cest cette dichotomie entre
le régime capitaliste, la démocratisation du confort, et puis la
saturation quon est en train de vivre. On voit même des mots comme
“écoterroristes” entrer dans le langage courant… Alors quen parallèle,
on sature lespace, on accumule les déchets, les satellites,
Starlink.</p>
<p>On est en train de créer une inertie qui se replie sur elle-même.
Jai parfois limpression que le capitalisme fabrique sa propre
obsolescence. Cest quand même fou den arriver à penser quil serait
plus facile dimaginer une fin du monde quune fin du capitalisme. À
léchelle de lhumanité, le capitalisme, cest 300 ans. Il y a eu
dautres systèmes avant, qui ont duré bien plus longtemps.</p>
<p>Malgré tout, je crois quà un moment il y aura une forme de force
commune. Les gens vont se rassembler, créer ensemble, sautonomiser. On
va forcément taper un plafond, que ce soit en termes de ressources ou de
fabrication. Et je pense que la suite, ce sera lhybridation : garder
les vieux objets, les amplis, les Mac et simplement leur ajouter de
petits modules, du Bluetooth, un PCB, plutôt que de tout jeter.</p>
<p>Cest déjà le cas dans certains pays où tout est récupéré et hybridé
, mais sur ces territoires cest une nécessité. Le vrai problème, cest
le fossé qui va continuer à se creuser entre ceux qui peuvent se
permettre de réchauffer les océans et ceux qui en subissent les
conséquences. À un moment, il faudra arrêter ou rééquilibrer les choses.
Sinon, on sera inondés. On fera des radeaux…</p>
<h5>Martin</h5>
<p>Merci beaucoup Charlie.</p>
<h6>Charlie</h6>
<p>Merci à toi.</p>
</section>
<section class="chapter" data-chapter="essai" id="outdoor-computer-club">
<span class="nav-decor">D6cor</span>
@ -599,6 +964,7 @@
</p>
<h3>Tv communal :<br /> Télévisions populaires au Venezuela</h3>
<p>Pour comprendre le projet politique des télévisions communales au
Venezuela, il est important de revenir sur la tentative de coup dÉtat
contre Hugo Chávez en 2002, et sur le rôle décisif quy ont joué les
@ -837,7 +1203,7 @@
communale réside alors dans cette opportunité de se raconter soi-même,
de s'auto-déterminer.  </p>
<h4">Une télévision rhizomatique</h4>
<h4>Une télévision rhizomatique</h4>
<p>Le renversement ne s'opère pas seulement dans la reconfiguration des
rôles émetteur-récepteur. Les télévisions de quartier transforment le
modèle médiatique dit <em>one-to-many</em> <a href="#fn3" class="footnote-ref" id="fnref3"
@ -899,7 +1265,7 @@
positions exclues par les médias mainstream, il est important de se
questionner sur le caractère paralysant et individualisant des
plateformes qui les accueillent ainsi que sur leur capacité à
étanchéifier les communautés. </p>
étanchéifier les communautés. </p>
<p>Les <em>Telestreet</em> et les TV communales proposent d'engager la
population autant dans le processus d'information que dans celui de
@ -910,7 +1276,13 @@
pirate en 2026 reste à prouver, par l'expérience<a href="#fn5" class="footnote-ref" id="fnref5"
role="doc-noteref"><sup>5</sup></a></p>
<h3 id="bibliographie">Bibliographie : </h3>
<div class="bibliographie">
<h3>Bibliographie</h3>
<p>Ardizzoni, Michela. « Neighborhood Television Channels in Italy: The
Case of Telestreet ». <em>Beyond Monopoly: Globalization and
Contemporary Italian Media</em>, s. d. Consulté le 16 février 2026. <a
@ -963,6 +1335,8 @@
<p>« What is Mini FM? » Consulté le 12 janvier 2026. <a
href="http://anarchy.k2.tku.ac.jp/radio/micro/what_is_minifm/index.html">http://anarchy.k2.tku.ac.jp/radio/micro/what_is_minifm/index.html</a>.
</p>
</div>
<section id="footnotes" class="footnotes footnotes-end-of-document" role="doc-endnotes">
<ol>
@ -998,7 +1372,7 @@
<section class="chapter" id="jean-noel-lafague">
<section class="chapter" data-chapter="essai" id="jean-noel-lafague">
<span class="nav-decor">D6cor</span>
<span class="nav-type">Essai</span>

View file

@ -0,0 +1,33 @@
import { Handler } from '/csspageweaver/lib/paged.esm.js';
export default class itemsDecor extends Handler {
constructor(chunker, polisher, caller) {
super(chunker, polisher, caller);
this.symbol = ".";
}
afterPageLayout(pageElement, page, breakToken) {
let blockquotes = pageElement.querySelectorAll("blockquote");
blockquotes.forEach((blockquote) => {
const container = document.createElement("div");
container.className = "before-blockquote_container";
const inner = document.createElement("div");
inner.className = "before-blockquote";
inner.textContent = this.symbol.repeat(300);
container.appendChild(inner);
blockquote.insertBefore(container, blockquote.firstChild);
container.style.height = `${blockquote.offsetHeight}px`;
const containerAfter = document.createElement("div");
containerAfter.className = "after-blockquote_container";
const innerAfter = document.createElement("div");
innerAfter.className = "after-blockquote";
innerAfter.textContent = this.symbol.repeat(300);
containerAfter.appendChild(innerAfter);
blockquote.insertBefore(containerAfter, container.nextSibling);
containerAfter.style.height = `${blockquote.offsetHeight}px`;
});
}
}

View file

@ -0,0 +1,57 @@
import { Handler } from '/csspageweaver/lib/paged.esm.js';
export default class itemsDecor extends Handler {
constructor(chunker, polisher, caller) {
super(chunker, polisher, caller);
this.symbol = "+";
this.totalPages = 33;
}
afterPageLayout(pageElement, page, breakToken) {
const numPage = parseInt(pageElement.dataset.pageNumber);
// const half = this.totalPages / 2;
// const isFirstHalf = numPage <= half;
// console.log(numPage, isFirstHalf ? "première moitié" : "deuxième moitié");
const area = pageElement.querySelector(".pagedjs_area");
if (area) {
const container = document.createElement("div");
container.className = "running-page_container";
const progress = (numPage / this.totalPages) * 100;
const symbols = document.createElement("div");
symbols.className = "symbols";
symbols.style.width = `${progress}%`;
symbols.style.wordBreak = "break-all";
const dots = document.createElement("div");
dots.className = "dots";
dots.textContent = ".".repeat(100);
const runningPage = document.createElement("div");
runningPage.className = "running-page";
runningPage.appendChild(symbols);
runningPage.appendChild(dots);
container.appendChild(runningPage);
area.after(container);
symbols.textContent = this.symbol;
const baseHeight = symbols.offsetHeight;
let count = 1;
while (count < 2000) {
count++;
symbols.textContent = this.symbol.repeat(count);
if (symbols.offsetHeight > baseHeight) {
symbols.textContent = this.symbol.repeat(count - 1);
break;
}
}
}
}
}

View file

@ -0,0 +1,154 @@
import { Handler } from '/csspageweaver/lib/paged.esm.js';
export default class itemsDecor extends Handler {
constructor(chunker, polisher, caller) {
super(chunker, polisher, caller);
this.symbol = "+";
}
createDecor(symbol, sizes, sizeClass, baseClass = "decor-h3") {
const div = document.createElement("div");
div.className = `${baseClass} ${sizeClass}`;
sizes.forEach((n, i) => {
const line = document.createElement("div");
line.dataset.count = i + 1;
line.textContent = symbol.repeat(n);
div.appendChild(line);
});
return div;
}
createLine(symbol, nodes) {
const line = document.createElement("span");
line.className = "subtitle-line";
const spanBefore = document.createElement("span");
spanBefore.className = "subtitle-before";
spanBefore.textContent = symbol.repeat(3);
line.appendChild(spanBefore);
const spanText = document.createElement("span");
spanText.className = "subtitle-text";
nodes.forEach(node => spanText.appendChild(node));
line.appendChild(spanText);
const spanAfter = document.createElement("span");
spanAfter.className = "subtitle-after";
spanAfter.textContent = "";
line.appendChild(spanAfter);
return line;
}
processTitle(subtitle, symbol, withDecor, isLeft) {
if (subtitle.querySelector(".subtitle-line")) return;
const children = Array.from(subtitle.childNodes);
// Découper en segments à chaque <br>
const segments = [];
let current = [];
children.forEach(node => {
if (node.nodeName === "BR") {
segments.push(current);
current = [];
} else {
current.push(node);
}
});
segments.push(current);
// Reconstruire le titre avec des .subtitle-line
subtitle.innerHTML = "";
segments.filter(seg => seg.length > 0).forEach(nodes => {
const line = this.createLine(symbol, nodes);
subtitle.appendChild(line);
const spanAfter = line.querySelector(".subtitle-after");
const baseHeight = line.offsetHeight;
let count = 0;
// subtitle-after → Ajouter des symboles à la ligne en vérifiant la hauteur de la ligne, si la ligne devient plus haute, supprimer le dernier symbole ajouté
while (count < 300) {
count++;
spanAfter.textContent = symbol.repeat(count);
if (line.offsetHeight > baseHeight) {
spanAfter.textContent = symbol.repeat(count - 1);
break;
}
}
});
if (withDecor) {
const smallSizes = [1, 2, 3, 2, 1];
const bigSizes = [1, 2, 3, 4, 5, 4, 3, 2, 1];
let firstDecor, secondDecor;
if (isLeft) {
firstDecor = this.createDecor(symbol, smallSizes, "decor-h3_small");
secondDecor = this.createDecor(symbol, bigSizes, "decor-h3_big");
} else {
firstDecor = this.createDecor(symbol, bigSizes, "decor-h3_big");
secondDecor = this.createDecor(symbol, smallSizes, "decor-h3_small");
}
const container = document.createElement("div");
container.className = "h3_container " + subtitle.className;
subtitle.className = "";
subtitle.parentNode.insertBefore(container, subtitle);
container.appendChild(firstDecor);
container.appendChild(secondDecor);
container.appendChild(subtitle);
}
}
beforeParsed(content){
content.querySelectorAll("h3").forEach(subtitle => {
const next = subtitle.nextElementSibling;
if (next) next.classList.add("following-h3");
});
content.querySelectorAll("h4").forEach(subtitle => {
const next = subtitle.nextElementSibling;
if (next) next.classList.add("following-h4");
});
}
afterPageLayout(pageElement, page, breakToken) {
const symbol = this.symbol;
const isLeft = pageElement.classList.contains("pagedjs_left_page");
pageElement.querySelectorAll("h3").forEach(subtitle => {
this.processTitle(subtitle, symbol, true, isLeft);
});
pageElement.querySelectorAll("h4").forEach(subtitle => {
this.processTitle(subtitle, symbol, false, isLeft);
const container = document.createElement("div");
container.className = "h4_container " + subtitle.className;
subtitle.className = "";
subtitle.parentNode.insertBefore(container, subtitle);
container.appendChild(subtitle);
});
pageElement.querySelectorAll("h6").forEach(h6 => {
if (h6.closest(".h6_container")) return;
const smallSizes = [1, 2, 3, 2, 1];
const bigSizes = [1, 2, 3, 4, 5, 4, 3, 2, 1];
const firstDecor = isLeft
? this.createDecor(symbol, smallSizes, "decor-h6_small", "decor-h6")
: this.createDecor(symbol, bigSizes, "decor-h6_big", "decor-h6");
const container = document.createElement("div");
container.className = "h6_container";
h6.parentNode.insertBefore(container, h6);
container.appendChild(firstDecor);
container.appendChild(h6);
});
}
}

View file

@ -1,24 +0,0 @@
import { Handler } from '/csspageweaver/lib/paged.esm.js';
export default class myCustomHandler2 extends Handler {
constructor(chunker, polisher, caller) {
super(chunker, polisher, caller);
}
afterPageLayout(pageElement, page, breakToken) {
let pageArea = pageElement.querySelector(".pagedjs_area");
let pageAreaTop = pageArea.getBoundingClientRect().top;
let items = pageElement.querySelectorAll("p, h3, h4, .inline-note");
items.forEach(function (item) {
let topOffset = item.getBoundingClientRect().top - pageAreaTop;
let decor = document.createElement("div");
decor.classList.add("item-decor");
decor.style.top = topOffset + "px";
decor.textContent = pageElement.classList.contains("pagedjs_left_page") ? "<" : ">";
pageArea.appendChild(decor);
});
}
}