@symbo.ls/scratch 0.3.33 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@symbo.ls/scratch",
3
3
  "description": "Φ / CSS framework and methodology.",
4
4
  "author": "symbo.ls",
5
- "version": "0.3.33",
5
+ "version": "0.4.0",
6
6
  "files": [
7
7
  "src"
8
8
  ],
@@ -9,5 +9,5 @@ export const applyDocument = () => merge(DOCUMENT, {
9
9
  theme: THEME.document,
10
10
  fontFamily: getDefaultOrFirstKey(FONT_FAMILY),
11
11
  fontSize: TYPOGRAPHY.base,
12
- lineHeight: TYPOGRAPHY.styles.lineHeight
12
+ lineHeight: TYPOGRAPHY.lineHeight
13
13
  })
@@ -1,5 +1,7 @@
1
1
  'use strict'
2
2
 
3
+ import { CSS_VARS } from '../factory'
4
+
3
5
  export * from './sequence'
4
6
  export * from './unit'
5
7
  export * from './typography'
@@ -13,4 +15,5 @@ export * from './icons'
13
15
  export * from './timing'
14
16
  export * from './document'
15
17
  export * from './cases'
18
+
16
19
  export const RESET = {}
@@ -1,6 +1,8 @@
1
1
  'use strict'
2
2
 
3
3
  export const MEDIA = {
4
+ tv: '(min-width: 2780px)',
5
+
4
6
  screenL: '(max-width: 1920px)',
5
7
  screenM: '(max-width: 1680px)',
6
8
  screenS: '(max-width: 1440px)',
@@ -11,7 +13,7 @@ export const MEDIA = {
11
13
  mobileM: '(max-width: 560px)',
12
14
  mobileS: '(max-width: 480px)',
13
15
  mobileXS: '(max-width: 375px)',
14
-
16
+
15
17
  sL: '(max-width: 1920px)',
16
18
  sM: '(max-width: 1680px)',
17
19
  sS: '(max-width: 1440px)',
@@ -1,7 +1,7 @@
1
1
  'use strict'
2
2
 
3
3
  import { SEQUENCE, TYPOGRAPHY } from '.'
4
- import { Arrayize, fallBack, generateSequence } from '../utils'
4
+ import { Arrayize, getSequenceValue, generateSequence, applySequenceVars, merge } from '../utils'
5
5
 
6
6
  const defaultProps = {
7
7
  base: TYPOGRAPHY.base,
@@ -9,12 +9,44 @@ const defaultProps = {
9
9
  ratio: SEQUENCE.phi,
10
10
  range: [-5, +15],
11
11
  subSequence: true,
12
+ unit: 'em',
12
13
  sequence: {},
13
- scales: {}
14
+ scales: {},
15
+ vars: {}
16
+ }
17
+
18
+ const runThroughMedia = props => {
19
+ for (const prop in props) {
20
+ const mediaProps = props[prop]
21
+ if (prop.slice(0, 1) === '@') {
22
+ const { type, base, ratio, range, subSequence, h1Matches, unit } = props
23
+
24
+ merge(mediaProps, {
25
+ type,
26
+ base,
27
+ ratio,
28
+ range,
29
+ subSequence,
30
+ h1Matches,
31
+ unit,
32
+ sequence: {},
33
+ scales: {},
34
+ styles: {},
35
+ vars: {}
36
+ })
37
+
38
+ generateSequence(mediaProps)
39
+
40
+ const mediaName = prop.slice(1)
41
+ applySequenceVars(mediaProps, mediaName)
42
+ }
43
+ }
14
44
  }
15
45
 
16
46
  export const applySpacingSequence = () => {
17
47
  generateSequence(defaultProps)
48
+ applySequenceVars(defaultProps)
49
+ runThroughMedia(defaultProps)
18
50
  }
19
51
 
20
52
  const getSequence = (props) => {
@@ -23,7 +55,7 @@ const getSequence = (props) => {
23
55
  return hasGenerated ? props : generateSequence(props)
24
56
  }
25
57
 
26
- export const mapSpacing = (val, property = 'padding', props, unit) => {
58
+ export const getSpacingByKey = (val, property = 'padding', props, unit) => {
27
59
  const prefix = '--spacing-'
28
60
 
29
61
  const generatedSequence = getSequence(props)
@@ -33,8 +65,9 @@ export const mapSpacing = (val, property = 'padding', props, unit) => {
33
65
  if (!stack) return
34
66
 
35
67
  const length = stack.length
68
+ console.log(stack)
36
69
 
37
- const wrapFallBack = (prop, i) => fallBack({
70
+ const wrapSequenceItem = (prop, i) => getSequenceValue({
38
71
  type,
39
72
  prop,
40
73
  val: stack[i],
@@ -50,26 +83,26 @@ export const mapSpacing = (val, property = 'padding', props, unit) => {
50
83
 
51
84
  if (length === 2) {
52
85
  return [
53
- wrapFallBack(property + 'Block' + suffix, 0),
54
- wrapFallBack(property + 'Inline' + suffix, 1)
86
+ wrapSequenceItem(property + 'Block' + suffix, 0),
87
+ wrapSequenceItem(property + 'Inline' + suffix, 1)
55
88
  ]
56
89
  }
57
90
  if (length === 3) {
58
91
  return [
59
- wrapFallBack(property + 'BlockStart' + suffix, 0),
60
- wrapFallBack(property + 'Inline' + suffix, 1),
61
- wrapFallBack(property + 'BlockEnd' + suffix, 2)
92
+ wrapSequenceItem(property + 'BlockStart' + suffix, 0),
93
+ wrapSequenceItem(property + 'Inline' + suffix, 1),
94
+ wrapSequenceItem(property + 'BlockEnd' + suffix, 2)
62
95
  ]
63
96
  } else if (length === 4) {
64
97
  return [
65
- wrapFallBack(property + 'BlockStart' + suffix, 0),
66
- wrapFallBack(property + 'InlineStart' + suffix, 3),
67
- wrapFallBack(property + 'BlockEnd' + suffix, 2),
68
- wrapFallBack(property + 'InlineEnd' + suffix, 1)
98
+ wrapSequenceItem(property + 'BlockStart' + suffix, 0),
99
+ wrapSequenceItem(property + 'InlineStart' + suffix, 3),
100
+ wrapSequenceItem(property + 'BlockEnd' + suffix, 2),
101
+ wrapSequenceItem(property + 'InlineEnd' + suffix, 1)
69
102
  ]
70
103
  }
71
104
 
72
- return fallBack({ type, prop: property, val, prefix })
105
+ return getSequenceValue({ type, prop: property, val, prefix, unit })
73
106
  }
74
107
 
75
108
  export const SPACING = defaultProps
@@ -1,25 +1,28 @@
1
1
  'use strict'
2
2
 
3
3
  import { SEQUENCE } from '.'
4
- import { fallBack, generateSequence } from '../utils'
4
+ import { applySequenceVars, generateSequence, getSequenceValue } from '../utils'
5
5
 
6
6
  const defaultProps = {
7
7
  default: 150,
8
8
  base: 150,
9
- type: 'timing',
10
- ratio: SEQUENCE['minor-third'],
9
+ type: 'duration',
10
+ ratio: SEQUENCE['perfect-fourth'],
11
11
  range: [-3, +12],
12
+ unit: 'ms',
12
13
  sequence: {},
13
- scales: {}
14
+ scales: {},
15
+ vars: {}
14
16
  }
15
17
 
16
18
  export const applyTimingSequence = () => {
17
19
  generateSequence(defaultProps)
20
+ applySequenceVars(defaultProps)
18
21
  }
19
22
 
20
- export const mapTiming = val => fallBack({
23
+ export const getTimingByKey = val => getSequenceValue({
21
24
  type: defaultProps.sequence,
22
- prop: 'timing',
25
+ prop: 'duration',
23
26
  val,
24
27
  unit: 'ms',
25
28
  prefix: '--duration-'
@@ -1,41 +1,85 @@
1
1
  'use strict'
2
2
 
3
- import { SEQUENCE } from '.'
4
- import { fallBack, generateSequence, findHeadings } from '../utils'
3
+ import { CONFIG } from '../factory'
4
+ import { SEQUENCE, MEDIA } from '.'
5
+ import { getSequenceValue, generateSequence, findHeadings, merge, applySequenceVars } from '../utils'
5
6
 
6
7
  const defaultProps = {
7
- default: 16,
8
+ browserDefault: 16,
8
9
  base: 16,
9
10
  type: 'font-size',
10
11
  ratio: SEQUENCE['minor-third'],
11
12
  range: [-3, +12],
12
13
  h1Matches: +6,
13
- styles: {
14
- lineHeight: 1.5
15
- },
14
+ lineHeight: 1.5,
15
+ unit: 'em',
16
+ styles: {},
16
17
  sequence: {},
17
- scales: {}
18
+ scales: {},
19
+ vars: {}
18
20
  }
19
21
 
20
- export const applyTypographySequence = () => {
21
- generateSequence(defaultProps)
22
+ const runThroughMedia = props => {
23
+ for (const prop in props) {
24
+ const mediaProps = props[prop]
25
+ if (prop.slice(0, 1) === '@') {
26
+ const { type, base, ratio, range, subSequence, h1Matches, unit } = props
27
+
28
+ merge(mediaProps, {
29
+ type,
30
+ base,
31
+ ratio,
32
+ range,
33
+ subSequence,
34
+ h1Matches,
35
+ unit,
36
+ sequence: {},
37
+ scales: {},
38
+ styles: {},
39
+ vars: {}
40
+ })
41
+
42
+ generateSequence(mediaProps)
22
43
 
23
- if (defaultProps.h1Matches) {
24
- const HEADINGS = findHeadings(defaultProps)
25
- const { styles } = defaultProps
44
+ const mediaName = prop.slice(1)
45
+ applySequenceVars(mediaProps, mediaName)
46
+
47
+ const query = MEDIA[mediaName]
48
+ defaultProps.styles[`@media screen and ${query}`] = {
49
+ fontSize: mediaProps.base / defaultProps.browserDefault + unit
50
+ }
51
+ }
52
+ }
53
+ }
54
+
55
+ const applyHeadings = (props) => {
56
+ if (props.h1Matches) {
57
+ const unit = props.unit
58
+ const HEADINGS = findHeadings(props)
59
+ const { styles } = props
26
60
  for (const k in HEADINGS) {
27
61
  styles[`h${parseInt(k) + 1}`] = {
28
- fontSize: `${HEADINGS[k].scaling}em`
62
+ fontSize: CONFIG.useVariable ? `var(${HEADINGS[k].variable})` : `${HEADINGS[k].scaling}${unit}`
29
63
  }
30
64
  }
31
65
  }
32
66
  }
33
67
 
34
- export const mapFontSize = val => fallBack({
68
+ export const applyTypographySequence = () => {
69
+ generateSequence(defaultProps)
70
+ applyHeadings(defaultProps)
71
+ applySequenceVars(defaultProps)
72
+ runThroughMedia(defaultProps)
73
+ }
74
+
75
+ export const getFontSizeByKey = val => getSequenceValue({
35
76
  type: defaultProps.sequence,
36
77
  prop: 'fontSize',
37
78
  val,
79
+ unit: defaultProps.unit,
38
80
  prefix: '--font-size-'
39
81
  })
40
82
 
83
+ console.log(defaultProps)
84
+
41
85
  export const TYPOGRAPHY = defaultProps
package/src/factory.js CHANGED
@@ -5,10 +5,8 @@ import * as CONF from './config'
5
5
  export const CSS_VARS = {}
6
6
  export const CONFIG = {
7
7
  verbose: false,
8
- useVariable: false,
8
+ useVariable: true,
9
9
  useReset: true,
10
10
  VARS: CSS_VARS,
11
11
  ...CONF
12
12
  }
13
-
14
-
package/src/reset.js CHANGED
@@ -1,11 +1,14 @@
1
1
  'use strict'
2
2
 
3
3
  import * as CONFIG from './config'
4
+ import { CSS_VARS } from './factory'
4
5
  import { getTheme } from './system'
5
6
  import { deepMerge, merge } from './utils'
6
7
 
7
8
  export const applyReset = (reset = {}) => {
8
9
  return deepMerge(merge(CONFIG.RESET, reset), {
10
+ ':root': CSS_VARS,
11
+
9
12
  html: {
10
13
  position: 'absolute',
11
14
  overflow: 'hidden',
@@ -18,8 +21,9 @@ export const applyReset = (reset = {}) => {
18
21
  transform: 'translate3d(0, 0, 1px)',
19
22
  scrollBehavior: 'smooth',
20
23
 
24
+ fontSize: CONFIG.TYPOGRAPHY.browserDefault + 'px',
25
+
21
26
  fontFamily: CONFIG.DOCUMENT.fontFamily,
22
- fontSize: CONFIG.DOCUMENT.fontSize / CONFIG.TYPOGRAPHY.default + CONFIG.UNIT.default,
23
27
  lineHeight: CONFIG.DOCUMENT.lineHeight
24
28
  },
25
29
 
@@ -29,10 +33,12 @@ export const applyReset = (reset = {}) => {
29
33
  margin: 0,
30
34
  fontFamily: CONFIG.DOCUMENT.fontFamily,
31
35
 
32
- ...getTheme('document')
33
- },
36
+ ...getTheme('document'),
34
37
 
35
- ...CONFIG.TYPOGRAPHY.styles,
38
+ fontSize: CONFIG.TYPOGRAPHY.base / CONFIG.TYPOGRAPHY.browserDefault + CONFIG.UNIT.default,
39
+
40
+ ...CONFIG.TYPOGRAPHY.styles
41
+ },
36
42
 
37
43
  // form elements
38
44
  fieldset: {
package/src/set.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict'
2
2
 
3
3
  import { applyDocument, applySpacingSequence, applyTimingSequence, applyTypographySequence } from './config'
4
- import { CONFIG, CSS_VARS } from './factory'
4
+ import { CONFIG, CSS_VARS } from './factory' // eslint-disable-line no-unused-vars
5
5
  import { applyReset } from './reset'
6
6
  import { setColor, setGradient, setFont, setFontFamily, setTheme } from './system'
7
7
  import {
@@ -30,7 +30,8 @@ export const SETTERS = {
30
30
  media: setSameValue,
31
31
  timing: setSameValue,
32
32
  icons: setSameValue,
33
- reset: setSameValue
33
+ reset: setSameValue,
34
+ unit: setSameValue
34
35
  }
35
36
 
36
37
  /**
@@ -84,5 +85,7 @@ export const set = recivedConfig => {
84
85
 
85
86
  return CONFIG
86
87
  }
88
+ console.log(CONFIG.RESET)
89
+ console.log(CSS_VARS)
87
90
 
88
91
  export * from './system'
@@ -15,8 +15,9 @@ export const setFont = (val, key) => {
15
15
  return { var: CSSvar, value: val, fontFace }
16
16
  }
17
17
 
18
- export const getFontFamily = (LIBRARY, key) => {
19
- return getDefaultOrFirstKey(LIBRARY, key)
18
+ export const getFontFamily = key => {
19
+ const { FONT_FAMILY } = CONFIG
20
+ return getDefaultOrFirstKey(FONT_FAMILY, key)
20
21
  }
21
22
 
22
23
  export const setFontFamily = (val, key) => {
@@ -4,4 +4,4 @@ export * from './object'
4
4
  export * from './color'
5
5
  export * from './font'
6
6
  export * from './sequence'
7
- export * from './setVariables'
7
+ export * from './var'
@@ -1,6 +1,7 @@
1
1
  'use strict'
2
2
 
3
3
  import { UNIT } from '../config'
4
+ import { CONFIG } from '../factory'
4
5
 
5
6
  export const numToLetterMap = {
6
7
  '-6': 'U',
@@ -32,14 +33,57 @@ export const numToLetterMap = {
32
33
  }
33
34
 
34
35
  const setSequenceValue = ({ key, variable, value, scaling, state, index }) => {
35
- state.sequence[variable] = {
36
+ state.sequence[key] = {
36
37
  key,
37
38
  decimal: Math.round(value * 100) / 100,
38
39
  val: Math.round(value),
39
40
  scaling,
40
- index
41
+ index,
42
+ variable
41
43
  }
42
- state.scales[variable] = scaling
44
+ state.scales[key] = scaling
45
+ state.vars[variable] = scaling + state.unit
46
+ }
47
+
48
+ export const getSequenceValue = ({ type, prop, val = 'A', prefix = '--font-size-', unit = UNIT.default }) => {
49
+ if (typeof val !== 'string') console.warn(prop, val, 'is not a string')
50
+
51
+ if (val === '-' || val === '') return ({ })
52
+ if (
53
+ val === 'none' ||
54
+ val === 'auto' ||
55
+ val === 'fit-content' ||
56
+ val === 'min-content' ||
57
+ val === 'max-content'
58
+ ) return ({ [prop]: val })
59
+
60
+ const startsWithLetterRegex = /^-?[a-zA-Z]/i
61
+ const startsWithLetter = startsWithLetterRegex.test(val)
62
+ if (!startsWithLetter) return ({ [prop]: val })
63
+
64
+ const letterVal = val.toUpperCase()
65
+ const isNegative = letterVal.slice(0, 1) === '-' ? '-' : ''
66
+ const simplyLetterVal = isNegative ? letterVal.slice(1) : letterVal
67
+
68
+ const value = type ? type[simplyLetterVal] : null
69
+ if (!value) return console.warn('can\'t find', type, simplyLetterVal)
70
+
71
+ if (CONFIG.useVariable) {
72
+ return isNegative ? {
73
+ [prop]: `calc(var(${prefix}${simplyLetterVal}) * -1)`
74
+ } : {
75
+ [prop]: `var(${prefix}${simplyLetterVal})`
76
+ }
77
+ }
78
+
79
+ if (unit === 'ms' || unit === 's') {
80
+ return ({ [prop]: isNegative + value.val + unit })
81
+ }
82
+
83
+ return ({
84
+ [prop]: isNegative + value.val + value.unit,
85
+ [prop]: isNegative + value.scaling + unit
86
+ })
43
87
  }
44
88
 
45
89
  export const generateSubSequence = ({ key, base, value, ratio, variable, state, index }) => {
@@ -56,8 +100,6 @@ export const generateSubSequence = ({ key, base, value, ratio, variable, state,
56
100
  const middle = (first + second) / 2
57
101
  if (diffRounded > 100) arr = [first, middle, second]
58
102
  else arr = [first, second]
59
- // else if (diffRounded > 2) arr = [first, second]
60
- // else if (diffRounded > 1) arr = [middle]
61
103
 
62
104
  arr.map((v, k) => {
63
105
  const scaling = Math.round(v / base * 1000) / 1000
@@ -70,6 +112,7 @@ export const generateSubSequence = ({ key, base, value, ratio, variable, state,
70
112
  export const generateSequence = ({ type, base, ratio, range, subSequence, ...state }) => {
71
113
  const n = Math.abs(range[0]) + Math.abs(range[1])
72
114
  const prefix = '--' + type + '-'
115
+
73
116
  for (let i = 0; i <= n; i++) {
74
117
  const key = range[1] - i
75
118
  const letterKey = numToLetterMap[key]
@@ -84,38 +127,10 @@ export const generateSequence = ({ type, base, ratio, range, subSequence, ...sta
84
127
  return state
85
128
  }
86
129
 
87
- export const fallBack = ({ type, prop, val = 'A', prefix = '--font-size-', unit = UNIT.default }) => {
88
- if (typeof val !== 'string') console.warn(prop, val, 'is not a string')
89
-
90
- if (val === '-' || val === '') return ({ })
91
- if (val === 'none' || val === 'auto' || val === 'fit-content' || val === 'min-content' || val === 'max-content') return ({ [prop]: val })
92
-
93
- // const startsWithLetterRegex = /^[a-zA-Z]/i
94
- const startsWithLetterRegex = /^-?[a-zA-Z]/i
95
- // const hasLetter = /[A-Za-z]+/.test(val)
96
- const startsWithLetter = startsWithLetterRegex.test(val)
97
- if (!startsWithLetter) return ({ [prop]: val })
98
-
99
- const letterVal = val.toUpperCase()
100
- const isNegative = letterVal.slice(0, 1) === '-' ? '-' : ''
101
- const simplyLetterVal = isNegative ? letterVal.slice(1) : letterVal
102
-
103
- const value = type ? type[prefix + simplyLetterVal] : null
104
- if (!value) return console.warn('can\'t find', type, prefix + simplyLetterVal, simplyLetterVal)
105
-
106
- if (unit === 'ms' || unit === 's') {
107
- return ({ [prop]: isNegative + value.val + value.unit })
108
- }
109
- return ({
110
- [prop]: isNegative + value.val + value.unit,
111
- [prop]: isNegative + value.scaling + 'em'
112
- })
113
- }
114
-
115
- export const findHeadings = (TYPOGRAPHY) => {
116
- const { h1Matches, type, sequence } = TYPOGRAPHY
130
+ export const findHeadings = props => {
131
+ const { h1Matches, sequence } = props
117
132
  return new Array(6).fill(null).map((_, i) => {
118
133
  const findLetter = numToLetterMap[h1Matches - i]
119
- return sequence[`--${type}-${findLetter}`]
134
+ return sequence[findLetter]
120
135
  })
121
136
  }
@@ -0,0 +1,39 @@
1
+ 'use strict'
2
+
3
+ import { MEDIA } from '../config'
4
+ import { CONFIG, CSS_VARS } from '../factory'
5
+ import { isObjectLike } from './object'
6
+
7
+ export const setVariables = (result, key) => {
8
+ // CSS_VARS[result.var] =
9
+ if (isObjectLike(result.value)) {
10
+ // console.group(key)
11
+ // for (const key in result.value) {
12
+ // console.log(key, result.value[key])
13
+ // }
14
+ // console.log(result)
15
+ // console.groupEnd(key)
16
+ } else {
17
+ CSS_VARS[result.var] = result.value
18
+ }
19
+ }
20
+
21
+ export const applySequenceVars = (props, mediaName) => {
22
+ const unit = props.unit || CONFIG.UNIT.default
23
+ const { sequence, scales } = props
24
+ console.log(props)
25
+
26
+ for (const key in sequence) {
27
+ const item = sequence[key]
28
+ const value = (props.type === 'duration' ? sequence[key].val : scales[key]) + unit
29
+ const query = MEDIA[mediaName]
30
+
31
+ if (mediaName) {
32
+ let underMediaQuery = CSS_VARS[`@media ${query}`]
33
+ if (!underMediaQuery) underMediaQuery = CSS_VARS[`@media ${query}`] = {}
34
+ underMediaQuery[item.variable] = value
35
+ } else {
36
+ CSS_VARS[item.variable] = value
37
+ }
38
+ }
39
+ }
@@ -1,18 +0,0 @@
1
- 'use strict'
2
-
3
- import { CSS_VARS } from '../factory'
4
- import { isObjectLike } from './object'
5
-
6
- export const setVariables = (result, key) => {
7
- // CSS_VARS[result.var] =
8
- if (isObjectLike(result.value)) {
9
- // console.group(key)
10
- // for (const key in result.value) {
11
- // console.log(key, result.value[key])
12
- // }
13
- // console.log(result)
14
- // console.groupEnd(key)
15
- } else {
16
- CSS_VARS[result.var] = result.value
17
- }
18
- }