- 98.css permet de créer des interfaces web qui ressemblent à Windows 98 en CSS uniquement, afin de reproduire fidèlement l’ancienne UI de bureau
- L’accessibilité repose sur du HTML sémantique, avec comme principe l’usage correct des attributs ARIA pour les boutons, labels et boutons d’icône
- Sans inclure de JavaScript, il peut s’intégrer indépendamment du framework choisi à des projets React, JavaScript pur ou HTML classique
- Il fournit des composants au style Windows 98 comme des boutons, cases à cocher, boutons radio, fenêtres, arborescences, onglets, vues tabulaires et barres de progression
- Il peut être utilisé via npm, les releases GitHub ou unpkg, et est publié sous licence MIT avec accueil des signalements de bugs et des pull requests
Recréer l’interface de Windows 98 avec CSS
- 98.css est une bibliothèque CSS conçue pour créer des interfaces ayant l’apparence de Windows 98
- Le projet est disponible sur GitHub
- L’accessibilité repose sur une structure HTML sémantique plutôt que sur des scripts dédiés
- les boutons doivent utiliser
<button>
- les éléments de saisie doivent avoir un
<label> correspondant
- les boutons d’icône transmettent leur intention via
aria-label
- Il est possible de surcharger partiellement le style des éléments tout en conservant leur apparence de base
- par exemple, augmenter le padding d’un bouton ou ajouter une couleur au label d’un champ
Installation et intégration aux frameworks
- 98.css applique un style Windows 98 aux éléments HTML uniquement avec du CSS, sans JavaScript
- Il peut être utilisé indépendamment du framework frontend
- Des exemples sont fournis avec React et en JavaScript pur
- La manière la plus rapide de l’utiliser consiste à charger la feuille de style depuis unpkg
<link rel="stylesheet" href="https://unpkg.com/98.css">
npm install 98.css
Contrôles de formulaire de base
-
Button
- Le bouton standard mesure 75 px de large et 23 px de haut, avec des bordures externe et interne en relief ainsi qu’un padding horizontal par défaut de 12 px
- L’ajout de la classe
default permet d’indiquer visuellement l’action par défaut déclenchée par la touche Enter dans Windows 98
- À l’état cliqué, les bordures en relief prennent un aspect enfoncé
- Un bouton désactivé conserve les mêmes bordures en relief, mais son libellé apparaît estompé
- Le focus est indiqué par une bordure en pointillés placée à 4 px à l’intérieur du contenu du bouton
-
Checkbox
- Les cases à cocher représentent des sélections indépendantes ou non exclusives
- Lorsqu’elles sont sélectionnées, une icône de coche apparaît dans un panneau enfoncé, avec un label indiquant l’option à côté
- Après
<input type="checkbox">, il faut inclure un <label> dont l’attribut for pointe vers l’id du champ
- Les attributs
checked et disabled peuvent être utilisés
- Pour grouper plusieurs champs, il faut envelopper chaque entrée dans un conteneur portant la classe
field-row afin d’uniformiser l’espacement
-
Option Button
- Les boutons radio servent à choisir une seule option parmi un ensemble limité
- Ils s’utilisent avec
<input type="radio"> et sont regroupés en partageant le même attribut name
- Comme pour les cases à cocher, on peut les entourer de
field-row pour conserver un espacement cohérent entre les champs
- Les attributs
checked et disabled sont pris en charge
-
Group Box
- Le group box est un cadre rectangulaire servant à organiser plusieurs contrôles
- Il s’utilise en enveloppant les éléments dans un
fieldset, qui fournit une bordure externe enfoncée et une bordure interne en relief
- Un
legend placé dans le fieldset permet d’ajouter un libellé au groupe
Saisie de texte, slider et menu déroulant
-
TextBox
- La zone de texte est un contrôle rectangulaire permettant à l’utilisateur de saisir ou modifier du texte
- La saisie sur une seule ligne est rendue avec
<input type="text">
- Il est recommandé de fournir un
<label> correspondant avec le bon attribut for, puis d’entourer les deux d’un conteneur field-row
- La classe
field-row-stacked permet de placer le label au-dessus du champ plutôt qu’à côté
- Les saisies multiligne utilisent
textarea
- Les attributs HTML standard comme
disabled ou value peuvent être utilisés
-
Slider
- Le slider est composé d’une barre représentant la plage d’ajustement et d’un indicateur affichant la valeur actuelle
- Il est rendu avec
<input type="range">
- La classe
has-box-indicator permet de remplacer l’indicateur par défaut par un indicateur en forme de boîte
- Il peut être affiché verticalement en l’enveloppant dans un
div utilisant is-vertical
- Pour modifier la longueur d’un slider vertical, il faut ajuster la width de l’
input et la height du div
-
Dropdown
- La liste déroulante permet de sélectionner un seul élément dans une liste
- À l’état fermé, elle affiche la valeur courante, puis l’utilisateur ouvre la liste pour la modifier
- Elle est rendue avec les éléments
select et option
- La valeur par défaut est la première option, mais on peut la changer en ajoutant
selected à une option spécifique
Composer des fenêtres au style Windows 98
-
Title Bar
- La barre de titre se trouve sur le bord supérieur interne de la fenêtre et identifie son contenu
- Elle se compose des classes
title-bar, title-bar-text et title-bar-controls
- Le bouton de fermeture utilise
aria-label="Close" pour transmettre son intention aux technologies d’assistance
- Des
aria-label comme Minimize, Maximize, Restore et Help peuvent aussi être utilisés
- Chaque
aria-label dispose d’une classe de style correspondante, ce qui évite des problèmes de rendu, d’accessibilité ou de localisation même si le texte de aria-label est dans une autre langue
- Le bouton d’agrandissement peut être désactivé avec
disabled
- L’ajout de la classe
inactive permet d’afficher une barre de titre inactive
-
Window contents
- La classe
window crée le conteneur de fenêtre qui accueille la barre de titre, avec des bordures externe et interne en relief ainsi qu’un padding
- La taille de la fenêtre peut être librement ajustée en définissant une width sur le style du conteneur
- Le contenu sous la barre de titre peut être rendu avec la classe
window-body
-
Status Bar
- La barre d’état se situe généralement en bas d’une fenêtre et affiche des informations de statut ou de contexte
- Elle est rendue avec la classe
status-bar
- Chaque élément de texte utilise la classe
status-bar-field
- L’exemple inclut des champs comme
Press F1 for help, Slide 1 et CPU Usage: 14%
Listes, onglets, tableaux et progression
-
TreeView
- La vue arborescente est une boîte de liste spécialisée qui affiche un ensemble d’objets sous la forme d’un plan indenté suivant une relation hiérarchique logique
- Elle est rendue en ajoutant la classe
tree-view à un élément ul
- Les éléments enfants
li peuvent contenir le contenu souhaité
- Des
ul imbriqués affichent la structure arborescente grâce à des bordures en pointillés et à l’indentation
- Des sections dépliables peuvent être créées en plaçant la liste enfant dans un élément
details
-
Tabs
- Le contrôle d’onglets sert à définir plusieurs pages logiques ou sections d’information dans une même fenêtre
- Il utilise un élément
menu avec role="tablist", et des éléments enfants li avec role="tab"
- La gestion des onglets doit être prise en charge par le code JavaScript de l’utilisateur
- Il suffit d’ajouter
aria-selected="true" à l’onglet actif
- Des onglets sur plusieurs lignes peuvent être créés en ajoutant la classe
multirows à la balise menu
-
TableView
- La vue tabulaire est rendue avec un élément
table
- Pour fournir des bordures appropriées et un conteneur avec overflow, elle doit être enveloppée dans un
div portant la classe sunken-panel
- Avec un peu de script en plus, la vue tabulaire peut devenir interactive
- En ajoutant la classe
interactive à table, le curseur pointeur s’affiche au survol des lignes du corps du tableau
- En ajoutant la classe
highlighted à une ligne, celle-ci apparaît comme sélectionnée
-
Progress Indicator
- La barre de progression sert à afficher le pourcentage d’achèvement d’une tâche longue
- Le style par défaut est une barre de progression pleine
- La classe
segmented permet de déclarer une barre de progression segmentée
- La progression est indiquée via le style
width de progress-indicator-bar
Bordures de champ et participation open source
-
Field borders
- Les zones de texte, cases à cocher, listes déroulantes, spin boxes et listes utilisent le style de bordure de champ
- Le même style peut aussi être appliqué à la zone de travail à l’intérieur d’une fenêtre
- Les bordures de champ utilisent une bordure externe enfoncée et une bordure interne enfoncée
- L’intérieur de la plupart des contrôles utilise la couleur button highlight
- Lorsque des champs de texte comme les text boxes et combo boxes sont en lecture seule ou désactivés, leur intérieur utilise la couleur button face
- Les classes
field-border, field-border-disabled et status-field-border sont fournies pour un usage général
- Ces classes ne définissent que les bordures, la couleur de fond et un padding minimal, il faut donc généralement définir soi-même un padding supplémentaire
-
Licence et contribution
- 98.css est un projet sous licence MIT
- La vérification et le signalement de bugs passent par la page GitHub issues
- Les pull requests sont bienvenues, et le projet précise fournir des revues de code, en particulier aux personnes qui contribuent pour la première fois à l’open source
- Le projet vise à être un endroit où acquérir une expérience open source agréable
1 commentaires
Avis sur Hacker News
J’ai fait quelque chose de similaire qui inclut 3.11, 95, 2000, XP, CDE, Mac OS 9 et toutes leurs palettes de couleurs par défaut : https://nielssp.github.io/classic-stylesheets/?theme=win9x&s...
L’objectif n’était pas une reproduction parfaite au pixel près, mais plutôt quelque chose qui fonctionne bien et reste agréable dans des environnements modernes, comme les écrans haute résolution
J’ai donc refait toutes les icônes et tous les symboles en SVG, et quand j’ai ajouté XP et Mac OS 9, je l’ai publié sur Show HN, mais ça n’a pas suscité beaucoup d’intérêt
Personnellement, Windows 2000 a été le sommet du design d’UI
Ce que j’aimerais voir en plus, ce serait un thème pour les tableaux de données, et même des tableaux interactifs qui se comportent comme des listes et des grilles
https://nielssp.github.io/classic-stylesheets/?theme=win3x&s...
C’est moi qui l’ai créé. Content de le voir remonter
C’était mon projet de récupération après burnout, et j’ai récemment écrit quelques réflexions à ce sujet : https://notes.jordanscales.com/98-css-reflections
[0] : https://www.mathsheets.net/
Je trouve intéressant que le rétrocomputing, comme les vieux jeux ou les anciens systèmes d’exploitation, puisse être réconfortant, voire thérapeutique
J’ai ressenti quelque chose de similaire en jouant sur émulateur aux jeux Gameboy et Nintendo de mon enfance, ou en lançant Macintosh System 9, et ça me fait aussi penser à Pico-8, SerenityOS et TempleOS
Leur point commun est d’offrir un environnement informatique rétro que l’utilisateur peut entièrement comprendre et contrôler ; il y a peut-être aussi une dynamique psychologique plus profonde, comme celle d’un bac à sable sûr en tant qu’outil thérapeutique
La technologie et la société d’aujourd’hui regorgent de dark patterns hostiles, donc trouver des espaces physiques et mentaux conçus pour le confort de l’utilisateur procure un grand soulagement
Ce serait bien d’en avoir aussi pour Windows 2000 et Windows XP
Quelques ressources que j’ai rassemblées :
The Sims https://thesimscss.inbn.dev/
Windows 98 https://jdan.github.io/98.css/
Windows XP https://botoxparty.github.io/XP.css/
Windows 7 https://khang-nd.github.io/7.css/
Edward Tufte https://edwardtufte.github.io/tufte-css/
98.css est devenu un classique de HN pour de bonnes raisons
Discussions précédentes :
https://news.ycombinator.com/item?id=33310554 - octobre 2022, 179 commentaires
https://news.ycombinator.com/item?id=22940564 - avril 2020, 211 commentaires
À voir aussi dans le même esprit : HyperCard Simulator et Decker
https://hn.algolia.com/?q=hypercard
Je me souviens qu’à la fin des années 90, Microsoft avait des noms de couleurs CSS intégrés qui correspondaient aux thèmes et couleurs du bureau Windows
Je ne sais pas si ça fonctionne encore aujourd’hui ; dans l’IDE, tout apparaît en rouge, donc on dirait que non
On pouvait utiliser des valeurs comme
windowtext,appworkspace,menutext,threedlightshadow,threedshadow,threedfacepour créer des UI web assorties au look and feel du bureau de l’utilisateurJe m’en étais servi en 1998 dans une appli intranet basée sur le navigateur, et ça la rendait un peu plus native
https://drafts.csswg.org/css-color/#css-system-colors
Les anciennes couleurs sont toutes marquées comme obsolètes :
https://drafts.csswg.org/css-color/#deprecated-system-colors
Ce style ne fonctionne pas bien avec les DPI non standard
Par exemple, si vous réglez l’échelle du moniteur à 150 %, vous pouvez essayer d’exécuter ceci dans la console du navigateur pour l’aligner sur les pixels physiques :
with(document.documentElement.style){ transform = \scale(${ 1 / devicePixelRatio })`; transformOrigin = 'top left'; }`En multipliant l’échelle par un entier, on peut obtenir un rendu agrandi plus net ; ce n’est pas parfait à 100 %, mais cela paraît beaucoup plus proche du rendu voulu
withcomme ça est à la fois effrayant et très rafraîchissantJ’aime et je déteste à la fois
Il semble que crowdwave en utilise un peu : https://www.crowdwave.com
À voir aussi : https://botoxparty.github.io/XP.css et https://khang-nd.github.io/7.css
Aujourd’hui, l’idée qu’il faut de l’espace pour respirer, par exemple entre les choix d’un groupe de boutons radio, est presque devenue un mantra, mais les espacements serrés des anciennes UI semblent plus honnêtes, plus respectueux de l’utilisateur final et plus denses en information
Je ne veux pas jeter toutes les innovations, mais les anciennes UI me manquent souvent
Je n’aimais pas l’habillage des fenêtres de Windows 7, mais le reste pourrait très bien convenir à une application Electron
L’UI de Windows XP était la meilleure de toutes les UI Windows : suffisamment moderne pour paraître élégante, tout en gardant du contraste, ce qui la rendait facile à voir, à lire et à comprendre
L’UI de Windows 7 était trop brillante et privilégiait l’apparence à la lisibilité, tandis que Windows 98 était trop daté, tout en gris, avec aussi un manque de contraste
https://git.sr.ht/~q3cpma/website/tree/master/item/src/resou...
https://world-playground-deceit.net/
Voir ce genre de choses donne envie d’aller jusqu’au bout
Rien qu’à l’œil, ça ne ressemble pas à MS Sans Serif tel qu’il était rendu sous Windows 95 et Windows 98
https://web.archive.org/web/20230603234837/https://vistaserv...
La feuille de style XP[1] liée dans un autre commentaire dessine le texte et les formes en haute résolution, ce qui réduit les contraintes tout en conservant l’esprit de l’UI
La raison pour laquelle j’aime les UI de type 98, ce n’est pas la basse résolution, mais la clarté et la simplicité
[1] https://news.ycombinator.com/item?id=42056921
Je trouve ça bien meilleur que ce qui est sorti après des années de “recherche” et d’“améliorations” en UX/UI
Ce n’est pas non plus parce que je ferais partie d’une vieille génération : j’avais un an en 1998
Je déteste simplement les boutons qui ne ressemblent pas à des boutons, les onglets qui ne ressemblent pas à des onglets, et les champs de texte dont on ne découvre qu’ils sont modifiables qu’après avoir cliqué dessus
Apple a sans doute fait quelques recherches pour MacOSX, mais ces vingt dernières années, surtout sur mobile, les fonctionnalités ont souvent semblé jetées là sans notion de découvrabilité ni de cohérence
Plus que tout, j’ai l’impression que beaucoup de problèmes viennent du fait que les entreprises voulaient une “identité de marque cohérente” ou une “apparence propre”
Et ce site web comporte aussi un bouton “show code” déguisé en texte ordinaire