Files
privacy.sexy/docs/presentation.md
undergroundwires bf83c58982 Refactor Saas naming, structure and modules
- Add more documentation.
- Use `main.scss` instead of importing components individually. This
  improves productivity without compilation errors due to missing
  imports and allows for easier future file/folder changes and
  refactorings inside `./styles`.
- Use partials with underscored naming. Because it documents that the
  files should not be individually imported.
- Introduce `third-party-extensions` folder to group styles that
  overwrites third party components.
- Refactor variable names from generic to specific.
- Use Sass modules (`@use` and `@forward`) over depreciated `@import`
  syntax.
- Separate font assets from Sass files (`styles/`). Create `assets/`
  folder that will contain both.
- Create `_globals.css` for global styling of common element instead of
  using `App.vue`.
2021-11-14 17:48:49 +01:00

5.0 KiB

Presentation layer

  • Consists of Vue.js components and other UI-related code.
  • Desktop application is created using Electron.
  • Event driven as in components simply listens to events from the state and act accordingly.

Structure

  • /src/ presentation/: Contains all presentation related code including Vue and Electron configurations
    • bootstrapping/: Registers Vue global objects including components and plugins.
    • components/: Contains all Vue components and their helper classes.
      • Shared/: Contains Vue components and component helpers that are shared across other components.
    • assets/: Contains assets that will be processed by webpack.
      • fonts/: Contains fonts
      • styles/: Contains shared styles used throughout different components.
        • components/: Contains styles that are reusable and tightly coupled a Vue/HTML component.
        • vendors-extensions/: Contains styles that override third-party components used.
        • main.scss: Primary Sass file, passes along all other styles, should be the only file used from other components.
    • main.ts: Application entry point that mounts and starts Vue application.
    • electron/: Electron configuration for the desktop application.
      • main.ts: Main process of Electron, started as first thing when app starts.
  • /public/: Contains static assets that will directly be copied and not go through webpack.
  • /vue.config.js: Global Vue CLI configurations loaded by @vue/cli-service
  • /postcss.config.js: PostCSS configurations that are used by Vue CLI internally
  • /babel.config.js: Babel configurations for polyfills used by @vue/cli-plugin-babel

Application data

Application state

  • Stateful components mutate or/and react to state changes in ApplicationContext.
  • Stateless components that does not handle state extends Vue
  • Stateful components that depends on the collection state such as user selection, search queries and more extends StatefulVue
  • The single source of truth is a singleton of the state created and made available to presentation layer by StatefulVue
  • StatefulVue includes abstract handleCollectionState that is fired once the component is loaded and also each time collection is changed.
  • Do not forget to subscribe from events when component is destroyed or if needed collection is changed.
    • 💡 events in base class StatefulVue makes lifecycling easier
  • 📖 See Application state | Application layer where the state is implemented using using state pattern.

Modals

  • Dialog.vue is a shared component that can be used to show modal windows

  • Simply wrap the content inside of its slot and call .show() method on its reference.

  • Example:

      <Dialog ref="testDialog">
        <div>Hello world</div>
      </Dialog>
      <div @click="$refs.testDialog.show()">Show dialog</div>
    

Sass naming convention

  • Use lowercase for variables/functions/mixins e.g.
    • Variable: $variable: value;
    • Function: @function function() {}
    • Mixin: @mixin mixin() {}
  • Use - for a phrase/compound word e.g.
    • Variable: $some-variable: value;
    • Function: @function some-function() {}
    • Mixin: @mixin some-mixin() {}
  • Grouping and name variables from generic to specific e.g.
    • $border-blue, $border-blue-light, $border-blue-lightest, $border-red
    • $blue-border, $light-blue-border, $lightest-blue-border, $red-border