Giter Club home page Giter Club logo

rimarok's Introduction

Hi there !

I'm Romaric Ruga,

  • aka. RIMAROK (freelance web-developer)
  • aka. IMROK (multipotent creator).

Tinker, engineer, artist

My passion about software design & development is driven by the will to give my creations a shape on the internet.

Back to my teen years, I always felt the urge to use computers and to build things online.

Since my mother bought us an internet connection I started to customize forums, host my static websites and create some JS/PHP algorithms.

After my computer science/company management (MIAGE) master degree, in 2016, I immediately started my freelance life.

Seven years later, I'm still roxxing as an independant web-developper, with a serious interest for sustainable IT and a quite sensible approach.

Currently my main skills are :

  • Front-end development (TypeScript, React, SASS),
  • Back-end development (Node, PHP),
  • Testing (Jest),
  • CI/CD automation (Actions, Travis).

I'm also found of patterns !

Current projects

Nebula ✨

Nebula is a solution coupling Notion, Gatsby and GitHub CI/CD for a user-friendly data management interface and automated static website refresh.

The main attempt is to create a more light and sustainable alternative to CMS like WordPress.

  • nebula-genesis, is cloned from the actual Github repo to fetch data from Notion API and to cache it,
  • nebula-atoms, is a set of Gatsby/React templates, components and types to import in projects.

The actual project and process can be seen on the astraliko-nebula folder.

Some of the following website projects also embody this stack.

RIMAROK.com, freelance 🤖 dev web 🌻 éco-conception

  • rimarok, my web developper professional website.

IMROK.fr, le hub créatif de Romaric Ruga

  • imrok, my creative blog for various thoughts sharing.

HIGHBS-BOK, le livre du motif absolu

  • highbs-bok, my deep optimistic book saga's website.

Historic projects

During the last years, I played with various JS full-stack technologies.

The following are archived but meaningful projects :

PERMA-DATA

  • v5⭐✨,
  • v4⭐,
  • v3,
  • v1.
  • A long-time and multi-versioned full-stack project that made me use ES6, React, Firebase, Bulma, Express, Mongo, Bootstrap, Heroku and more.

My goal was to provide data about plants, from a wide range of sources.

I also experienced some aspects of gamification, to make data import more fun.

MOTIFS-JS

Working on PERMA-DATA and micro JS apps, I found myself trying to re-use some parts of my code

At this point the concept of patterns did really hit me.

The multiple purposes changes of this project

  • At first it was a project/file system patterns library (ex: read some JS/MD files),
  • But it soon became a static website generator.

Then I discovered Gatsby and re-oriented the project to cover both aspect of my website generation system, that I was previously providing through this framework :

nebula-genesis, to query and fetch the website content, nebula-atoms, to display fetched content.

rimarok's People

Stargazers

 avatar

Watchers

 avatar

rimarok's Issues

Styleguide page: Quote

Fixed by #28

Add variations :

  • No source no author,
  • No source, author,
  • Source, no author,
  • Source & author
<Row>
  <>
    <h3>Citation simple</h3>
    <p>(Sans légende)</p>
    <Quote ...

Fix: TableOfContents prop type Header rename to Section

As Styleguide page shown us, we don't want TableOfContents's internal link to point to headers but rows.

So id is not anymore semantically related to header concept but to row (or section).

Doesn't hurt me that header take section title (children props).

Fixes batch 1

Make these fixes on the same branch and the same PR :

  • Fix : Carousel > Project is going above Navbar
    image
  • Navbar sub-menu mobile : add mb under Prestation box,
  • Footer : reverse col order mobile.

Component : Footer

Footer is split in two columns (for desktop, but one under the other on mobile) :

  • Background color : ABYSS, text : white
  • Row or not ?
  • On mobile, direction column (for left & right sections)
  1. Left : site map (see #1), display site pages link tree

  2. Right, mentions :

    • RIMAROK.com
    • "Site conçu par Romaric Ruga et Lucile Joan, développé par Romaric Ruga et Tim Jeanmart."
    • Two buttons :
      • Contact (behavior will be treated in another issue)
      • A link to Mentions légales
  3. Last, insert <Footer> at the end of <Layout>.

Edit :

  • Replace <Row> with <footer>

Example

See footer on : https://highbs-bok.art/
Code (w/ article sort & slice algo) : https://github.com/Skaant/highbs-bok/blob/main/src/components/Layout/Footer.tsx

Component : Quote

Requires #14

image

Extend Bootstrap component : https://getbootstrap.com/docs/5.2/content/typography/#blockquotes

Example : grey & " symbols, https://github.com/Skaant/highbs-bok/blob/6880ab499e2d3affc12944f5e1a51ed919163b90/src/components/_rows/QuoteRow.tsx

Style

  • Use second font size.
  • Use one or more other specific styles (ex: reduced opacity, padding left ...).

Props

  • displayHeading?: 1 | 2 | 3 | 4 | 5 | 6 to take advantage of Bootstrap display headings classes.
  • legend?: { source?: string, author?: string }, to optionally display quote data under body.

Component : Project

Requires :

<Project> will be used in <Carousel> as children item.

UI

Each Project displays as a Card :
d-flex for Card body & order for content

  • A h3 title,
  • A line with :
    • Left, a list of pill badges,
      • A single COLORS.SUN badge which is either : Full-stack / Front-end,
      • A set of COLORS.MIST badge for tags (ex: React, Nest, Bootstrap ...),
    • Right, date (ex: Juin 2019 - Août 2020), optional (for personal project)
    • Left on top of right for mobiles,
  • The second line is displayed on top of the h3 title with flex order.
    This allow page to keep header before content for robot reading, but welcome eyes with the metadata line.
  • The children content (ReactElement),
  • An optional <LinksMenu> left under.

Props

  • title: string,
  • scope: 'full-stack' | 'front-end',
  • tags?: string[],
  • date?: string,
  • children: ReactElement,
  • menu?: <menu-items*>[]

* *If not already done, extract <LinksMenu> menu items type in a exportable type inside the same file

export type LinksMenuItem = { link: string; internal?: boolean; label: string }

type LinksMenuProps = {
  links: LinksMenuItem[];
};

Component : TableOfContents

Displays a list <ul> of internal page links.

  • Create a type for header across pages (that can be read as a value for h1 etc. & for this component) :
/** src/types/Header.ts */
type Header = { id: string, title: string }
export default Header
  • Create the "Styleguide" page,
  • Create a constant STYLEGUIDE_HEADERS with Row, Quote, TableOfContents :
/** index.tsx */

const STYLEGUIDE_HEADERS: Header[] = [
  {
    id: 'row',
    title: 'Row'
  },
  {
    id: 'table-of-contents',
    title: 'Table of contents'
  }
]

function Styleguide(...
  • Create a TableOfContents component displaying the list of given headers data :
<ul>
  {STYLEGUIDE_HEADERS.map(({ id, title }) => (
    <li>
      <a href={id}>{title}</a>
    </li>
  )}
</ul>

Props

  • contents: Header[]

Component : ArticlesList

ArticlesList is a single usage component to be displayed in Blog page.

  • Display articles list (for blog page) using https://getbootstrap.com/docs/5.2/components/list-group/#flush
    Articles items should render with :
    • The same tags/date header than <Project>,
      • Extract header in a new component (choose the name and path 😋), imported by both <ArticlesList> and <Project>,
    • h3 article title,
    • p description, shortened to 150 characters (break and add " ..." if necessary),
  • sort() articles from the most recent to the least,
  • Import component in blog under Liste des articles
  • Add a link (<LinkMenu> or <a>) to (future) articles page /blog/${article.id}

If you use array methods modifying ARTICLES_DATA array (like reverse()), use slice() before in order to preserve initial object shape.

Enforce color composition

Enforce and harmonize the links between :

  • row bg color and text color,
  • row bg color and btns color,
  • row bg color and a color,
  • row bg color and quote bg color,
  • quote bg color and quote text color.

For the sake of clarity, try to make it mostly SCSS.

FullScreenTitle variation : 60vh+ normal h1 size

  • Add 60vh variation to $utilities / viewport height
  • Allow component width to be set either to 100 or 60vh.
    60vh by default.
  • Allow component h1 to be set either to normal h1 size or bigger size (current component size).
    Normal by default

Props

  • height: '100vh' | '60vh'
  • titleSize: 'normal' | 'big'

Page : Accueil

List of rows composing the page :

  • Site name & catch phrase

    #6

  • CTA (to prestation page)

    #8

  • Carousel (5 most important experiences)

    #10

  • CTA (to motifs page)

    #8

  • Carousel (5 personal projects)

    #10

  • CTA (to blog page)

    #8

  • CTA (to prestation page)

    #8

Component : MotifsList

Displays motifs as follow :

  • h3 title w/ a way smaller size (must fit in given responsive conditions below)
  • Display summary in <p>
  • A Link in a div to the motif page with label Page ${motif}
  • Responsive behavior
    • Mobile : 1 item by line
    • Sm : 2 items
    • Lg : 4 items

You should use col-*-* classes.

  • Integrates in page MOTIFS

Component : BackToTop

Creates a component on Gatsby and the behavior on front-end application.

Component

  • A circle button (Button + rounded-circle) is displayed w/ position (absolute/static/fixed ?) & high z-index, at page's right bottom.
    It displays the character ↑.
  • For Styleguide page, allow positionning to be set to block (to be displayed in components thread)
  • Background color : LAGOON, font color: WHITE, no border or shadow.

Behavior

Edit global.js to add following mechanics (you can create an external file that you'll then import in global file) :

  • On click, use scrollTo(0) to come back to top of the page,
  • Button appear only when user scrolled 200px down.
    Disappear when user comes back on the 200 top pages' px.
    addEventListener scroll on window

Row / col : base spacing

  • Row : add padding y
  • Row or .col : add min padding x for mobile

Bonus

  • Row : add padding y range : 'small' | 'normal' /** default */ | 'large'

Component : FlyingImage

absolute-positionned SVG (w/parallax)

This component should be inserted inside a row.

Noticable props :

  • parallax?: boolean = true
  • Sizes ?
  • Z-index ?

Component : Layout

Page top-level component.

Elements to integrates in Layout :

  • Use <Helmet> for :

    • Meta title,
    • Meta description,
    • Meta no-robot (styleguide page, mentions légales page).
  • container Bootstrap, which encapsulates page content (a list of rows)

  • Navbar (moved to #16 )

  • Footer (moved to #17 )

Component : Carousel

Carousel will be used to display both :

  • A set of CV experiences,
  • A set of personal projects.

Controls must be though with in mind : CV experiences should be visually tracked in time and ordered as so.

Pages : base content

Create all website's pages in :

  • Accueil
  • Prestation
    • Ingénierie web
    • Éco-conception
  • Motifs
    • Motif template
  • Blog
    • Article template
  • Styleguide
  • Mentions légales

Structure

  • data/pages.ts to hold PAGES enum & PAGES_DATA (url, title, description, tags ...)

Row : id and headers

On existing component <Row> , add both properties :

  • id?: string, set .row's id attribute,
  • header: { level: 1 | 2 | 3, content: string}

PageHeader : merge FullScreenTitle & TableOfContents

As a systematic usage, we now want to create a new component from FullScreenTitle (deleted or renamed [moved] in operation) & TableOfContents (kept for other uses, in sections).

Use TableOfContentsProps in union w/ current component props type.

LinksMenu's items indicate target scope

There is three link's scopes :

  • Inside the page,
  • Inside the site, but outside the page,
  • Outside the site.

A small and slightly transparent text should be set above link's item to indicate their scope with :

  • Lien de page,
  • Lien de site,
  • Lien externe.

Component : BadgesList

Displays an inline* list of pill badges.

* Will be used inside <p> so it must use a span (to encapsulate span.badge).

Share some characteristics with #25.

Props

  • badges: { label: string, color: COLORS }[]

Component : CTA

Requires :

Widely used components.

Made of :

  • An <h2>
  • A set of paragraphs
  • One or two buttons

Component : Full-screen title

Single-use component (page Accueil).

May be derivated for article pages, and even ingénierie web & éco-conception pages.

Expectations

cf. https://rimarok.com/ homepage, but without graphics.

  • Use of <Row>, makes it height: 100vh (there may be an utility).
  • Title and subtitle are horizontally and vertically centered.
  • Make them both big (title way bigger), but ensure they fit in a single mobile screen 😹
    Attention : use Bootstrap's font-size() mixin to handle responsive font-size
    https://github.com/twbs/bootstrap/blob/c11c3a7e1941032be9f239520a52e6064af3e017/scss/vendor/_rfs.scss#L312
  • Display title with font slab
    Instead, creates a rule in global.scss which set all h<level> (1 to 6) tag to hold slab font style.
  • Row background should be FLOWER

Row changes to display title full-size

  • Row changes :
    • For RowProps, add : col?: string;,
    • For Row props destructuring, col = "col-12 col-sm-10 col-md-8 col-lg-6" to set col value by default (if no value is given in prop col),
    • Inside col div = className={col}
  • FullSizeTitle changes : import <Row className='col-12'>

Content

<h1>Moins égal plus</h1>
<p>RIMAROK.com, ingénierie web et éco-conception</p>

Component : LinksMenu

Inside a Row, display a list of links aligned at left.

Links, while <Link> or <a> tags, use Bootstrap's .btn classes
https://getbootstrap.com/docs/5.2/components/buttons/
(This component isn't a Buttons group, they are splat away from each other ~mx-2..3 ?)

Props

  • links: { link: string, internal?: boolean = true, label: string }[]
    Link can be internal (default, and use <Link>) or external.
    Label is displayed button text.

SCSS: Default remove all utilities, enable only given list

By default, importing utilities/map creates breakpoints (6) * utilities (10, 20, more ?) * values (average 5 ?) rules.

We want to disable all utilities by overriding $utilities with empty content & fill it with only requires entries.

Navbar : color, brand link, brand font

Brand is the name of the left link

  • Set navbar right links color to lagoon
  • Hide links underline globally
  • Brand link must be set to site root /,
  • Brand font must be set to : font-size(24px) and font-slab
  • Edit Prestation button :
    • Replace Prestation dynamic title with static : "Mon offre",
    • Remove link from dropdown button (just render text),
    • Add a dropdown item at top with Prestation page link and title (in <b> tag),
    • Add "◆ " before Ingénier web and Éco-conception,
  • Add real links to pages' navbar links

Row component : add header as prop

On <Row> component add a prop to automatically generates a header.

  • Add prop header: { level: 1 | ... | 6, content: string }
  • Conditionally render given <h<level>> tag on .col top.

SCSS: integrates two font-family

The two families to include (experimental) :

  1. Add fonts file in /static/fonts (create folder static, more info : https://www.gatsbyjs.com/docs/how-to/images-and-media/static-folder/)
  2. Create font families in global.scss :
    The font face & a font-* class to add in components' className.
    Example : https://github.com/Skaant/highbs-bok/blob/6880ab499e2d3affc12944f5e1a51ed919163b90/src/styles/global.scss#L62-L68
@font-face {
  font-family: "Rubik-400";
  src: url("/fonts/<file-name>");
}

.font-rubik {
  font-family: "Rubik-400";
}
  • Rubik-400 alias : 'rubik' (for .font-rubik)
  • Roboto-Slab-300 alias : 'slab' (for .font-slab)

Page : Prestation

Page row list :

  1. Full-size title (variation 60% viewport height)

  2. CTA (prestation details)

  3. Simple Row (price)

  4. CTA (profesional and alternative)

Pages : generate motifs' page

  • Create a template for motifs with h1 title or id, and subtitle summary
  • Create the gatsby-node file
  • Generate one page for every motif in MOTIFS enum

Component : Navbar

Encapsulate https://getbootstrap.com/docs/5.2/components/navbar/.

  • Add BRAND_NAME = 'RIMAROK.com' to WEBSITE_DATA,
  • Use BRAND_NAME in navbar brand (https://getbootstrap.com/docs/5.2/components/navbar/#brand)
  • Add the following navbar items on the right :
    • Prestation
      • Ingénierie web
      • Eco-conception
    • Motifs
    • Blog
  • 🤔😎 Ensure navbar behavior (collapsing, sub-menus opening) on mobile display
    This particular point may require building a front-end app, that we should implement in pair programming.

Component : Row

Encapsulate Bootstrap's .row (and .col ?) in a generic component.

<Row> is the root of all pages' section components.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.