useTypography.js 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. import useVars from './useVars.js'
  2. import { getClasses } from '../utils/classes.js'
  3. import useColor from './useColor.js'
  4. function useHook() { // useTypography
  5. const { colors, color } = useColor()
  6. const { pxs, percents, xls } = useVars()
  7. const FontFamily = {
  8. title: 'Font Family',
  9. classes: getClasses('sans, serif, mono', {
  10. name: ['font-'],
  11. value: [d => {
  12. const fs = {
  13. sans: `ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"`,
  14. serif: `ui-serif, Georgia, Cambria, "Times New Roman", Times, serif`,
  15. mono: `ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace`,
  16. }
  17. return [`font-family: ${fs[d.value]};`]
  18. }]
  19. })
  20. }
  21. const FontSize = ({
  22. title: 'Font Size',
  23. classes: getClasses(xls, {
  24. name: 'text-',
  25. value: d => {
  26. return [{ value: `font-size: ${d.value};`, rpx: d.fontSize * 2 }, { value: `line-height: ${d.lineHeightValue};`, desc: d.lineHeight > 0 ? `${d.lineHeight * 2}rpx` : 1 }]
  27. }
  28. }),
  29. })
  30. const FontSmoothing = { title: 'Font Smoothing', classes: [] }
  31. const FontStyle = {
  32. title: 'Font Style',
  33. classes: getClasses([
  34. { name: 'italic', value: 'italic' },
  35. { name: 'not-italic', value: 'normal' },
  36. ], { name: '', value: 'font-style' })
  37. }
  38. const FontWeight = ({
  39. title: 'Font Weight',
  40. classes: getClasses('thin,extralight,light,normal,medium,semibold,bold,extrabold,black', {
  41. name: 'font-',
  42. value: (d, i) => {
  43. return [`font-weight: ${(i + 1) * 100};`]
  44. }
  45. }),
  46. })
  47. const FontVariantNumeric = {
  48. title: 'Font Variant Numeric',
  49. classes: getClasses([
  50. { name: 'normal-nums', value: 'normal' },
  51. { name: 'ordinal', value: 'ordinal' },
  52. { name: 'slashed-zero', value: 'slashed-zero' },
  53. { name: 'lining-nums', value: 'lining-nums' },
  54. { name: 'oldstyle-nums', value: 'oldstyle-nums' },
  55. { name: 'proportional-nums', value: 'proportional-nums' },
  56. { name: 'tabular-nums', value: 'tabular-nums' },
  57. { name: 'diagonal-fractions', value: 'diagonal-fractions' },
  58. { name: 'stacked-fractions', value: 'stacked-fractions' },
  59. ], { name: '', value: 'font-variant-numeric' })
  60. }
  61. // 1em = 16px .1em = 16 * 0.1 = 1.6px = 3.2rpx
  62. const LetterSpacing = {
  63. title: 'Letter Spacing',
  64. classes: getClasses([
  65. { name: 'tighter', value: '-0.05em', rpx: -16 * 2 * .05 },
  66. { name: 'tight', value: '-0.025em', rpx: -16 * 2 * .025 },
  67. { name: 'normal', value: '0em', rpx: 0 },
  68. { name: 'wide', value: '0.025em', rpx: 16 * 2 * .025 },
  69. { name: 'wider', value: '0.05em', rpx: 16 * 2 * .05 },
  70. { name: 'widest', value: '0.1em', rpx: 16 * 2 * .1 },
  71. ], { name: 'tracking-', value: 'letter-spacing' })
  72. }
  73. const LineClamp = {
  74. title: 'Line Clamp',
  75. classes: [
  76. ...new Array(6).fill(0).map((d, i) => {
  77. return {
  78. name: `line-clamp-${i + 1}`,
  79. value: [
  80. 'overflow: hidden;',
  81. 'display: -webkit-box;',
  82. '-webkit-box-orient: vertical;',
  83. `-webkit-line-clamp: ${i + 1};`
  84. ]
  85. }
  86. }),
  87. {
  88. name: 'line-clamp-none',
  89. value: [
  90. 'overflow: visible;',
  91. 'display: block;',
  92. '-webkit-box-orient: horizontal;',
  93. '-webkit-line-clamp: none;'
  94. ]
  95. }
  96. ]
  97. }
  98. const LineHeight = {
  99. title: 'Line Height',
  100. classes: getClasses([
  101. { name: '3', value: '.75rem', rpx: 16 * 2 * .75 },
  102. { name: '4', value: '1rem', rpx: 16 * 2 * 1 },
  103. { name: '5', value: '1.25rem', rpx: 16 * 2 * 1.25 },
  104. { name: '6', value: '1.5rem', rpx: 16 * 2 * 1.5 },
  105. { name: '7', value: '1.75rem', rpx: 16 * 2 * 1.75 },
  106. { name: '8', value: '2rem', rpx: 16 * 2 * 2 },
  107. { name: '9', value: '2.25rem', rpx: 16 * 2 * 2.25 },
  108. { name: '10', value: '2.5rem', rpx: 16 * 2 * 2.5 },
  109. { name: 'none', value: '1' },
  110. { name: 'tight', value: '1.25' },
  111. { name: 'snug', value: '1.375' },
  112. { name: 'normal', value: '1.5' },
  113. { name: 'relaxed', value: '1.625' },
  114. { name: 'loose', value: '2' },
  115. ], { name: 'leading-', value: 'line-height' })
  116. }
  117. const ListStyleImage = { title: 'List StyleImage', classes: [] }
  118. const ListStylePosition = { title: 'List StylePosition', classes: [] }
  119. const ListStyleType = { title: 'List StyleType', classes: [] }
  120. const TextAlign = ({
  121. title: 'Text Align',
  122. classes: getClasses('left,center,right,justify,start,end', { name: 'text-', value: 'text-align' }),
  123. })
  124. const TextColor = {
  125. title: 'Text Color',
  126. classes: color.map(c => {
  127. return {
  128. ...c,
  129. name: `text-${c.name}`,
  130. value: [`color: ${c.value};`],
  131. textcolor: c.color,
  132. desc: c.rgb,
  133. }
  134. })
  135. }
  136. const TextDecoration = {
  137. title: 'Text Decoration',
  138. classes: getClasses([
  139. { name: 'underline', value: 'underline' },
  140. { name: 'overline', value: 'overline' },
  141. { name: 'line-through', value: 'line-through' },
  142. { name: 'no-underline', value: 'none' },
  143. ], { name: '', value: 'text-decoration-line' })
  144. }
  145. const TextDecorationColor = {
  146. title: 'Text DecorationColor',
  147. classes: color.map(c => {
  148. return {
  149. ...c,
  150. name: `decoration-${c.name}`,
  151. value: [`color: ${c.value};`],
  152. // textcolor: c.color,
  153. desc: c.rgb,
  154. }
  155. })
  156. }
  157. const TextDecorationStyle = {
  158. title: 'Text DecorationStyle',
  159. classes: getClasses('solid, double, dotted, dashed, wavy', { name: 'decoration-', value: 'text-decoration-style' })
  160. }
  161. const TextDecorationThickness = {
  162. title: 'Text Decoration Thickness',
  163. classes: getClasses([
  164. { name: 'auto', value: 'auto' },
  165. { name: 'from-font', value: 'from-font' },
  166. { name: '0', value: '0' },
  167. { name: '1', value: `${1 * 2}rpx` },
  168. { name: '2', value: `${2 * 2}rpx` },
  169. { name: '4', value: `${4 * 2}rpx` },
  170. { name: '8', value: `${8 * 2}rpx` },
  171. ], { name: 'decoration-', value: 'text-decoration-thickness', scss: 0 })
  172. }
  173. const TextUnderlineOffset = {
  174. title: 'Text Underline Offset',
  175. classes: getClasses([
  176. { name: 'auto', value: 'auto' },
  177. { name: '0', value: '0' },
  178. { name: '1', value: `${1 * 2}rpx` },
  179. { name: '2', value: `${2 * 2}rpx` },
  180. { name: '4', value: `${4 * 2}rpx` },
  181. { name: '8', value: `${8 * 2}rpx` },
  182. ], { name: 'underline-offset-', value: 'text-underline-offset', scss: 0 })
  183. }
  184. const TextTransform = {
  185. title: 'Text Transform',
  186. classes: getClasses([
  187. { name: 'uppercase', value: 'uppercase' },
  188. { name: 'lowercase', value: 'lowercase' },
  189. { name: 'capitalize', value: 'capitalize' },
  190. { name: 'normal-case', value: 'none' },
  191. ], { name: '', value: 'text-transform', scss: 0 })
  192. }
  193. const TextOverflow = {
  194. title: 'Text Overflow',
  195. classes: [{
  196. name: 'truncate',
  197. value: ['overflow: hidden;',
  198. 'text-overflow: ellipsis;',
  199. 'white-space: nowrap;'
  200. ]
  201. },
  202. { name: 'text-ellipsis', value: ['text-overflow: ellipsis;'] },
  203. { name: 'text-clip', value: ['text-overflow: clip;'] },
  204. ]
  205. }
  206. const TextIndent = {
  207. title: 'Text Indent',
  208. classes: getClasses(pxs, {
  209. name: ['indent-'],
  210. value: ['text-indent'],
  211. })
  212. }
  213. const VerticalAlign = {
  214. title: 'Vertical Align',
  215. classes: getClasses([
  216. { name: 'baseline', value: 'baseline' },
  217. { name: 'top', value: 'top' },
  218. { name: 'middle', value: 'middle' },
  219. { name: 'bottom', value: 'bottom' },
  220. { name: 'text-top', value: 'text-top' },
  221. { name: 'text-bottom', value: 'text-bottom' },
  222. { name: 'sub', value: 'sub' },
  223. { name: 'super', value: 'super' },
  224. ], { name: 'align-', value: 'vertical-align', scss: 0 })
  225. }
  226. const Whitespace = { title: 'Whitespace', classes: getClasses(`normal, nowrap, pre, pre-line, pre-wrap, break-spaces`, { name: 'whitespace-', value: 'white-space', scss: 0 }) }
  227. const WordBreak = {
  228. title: 'WordBreak',
  229. classes: [
  230. {name: 'break-normal', value: ['overflow-wrap: normal;', 'word-break: normal;']},
  231. {name: 'break-words', value: ['overflow-wrap: break-word;']},
  232. {name: 'break-all', value: ['word-break: break-all;']},
  233. {name: 'break-keep', value: ['word-break: keep-all;']},
  234. ]
  235. }
  236. const Hyphens = { title: 'Hyphens', classes: getClasses(`none, manual, auto`, { name: 'hyphens-', value: 'hyphens', scss: 0 }) }
  237. const Content = { title: 'Content', classes: getClasses(`none`, { name: 'content-', value: 'content', scss: 0 }) }
  238. return {
  239. FontFamily,
  240. FontSize,
  241. FontSmoothing,
  242. FontStyle,
  243. FontWeight,
  244. FontVariantNumeric,
  245. LetterSpacing,
  246. LineClamp,
  247. LineHeight,
  248. ListStyleImage,
  249. ListStylePosition,
  250. ListStyleType,
  251. TextAlign,
  252. TextColor,
  253. TextDecoration,
  254. TextDecorationColor,
  255. TextDecorationStyle,
  256. TextDecorationThickness,
  257. TextUnderlineOffset,
  258. TextTransform,
  259. TextOverflow,
  260. TextIndent,
  261. VerticalAlign,
  262. Whitespace,
  263. WordBreak,
  264. Hyphens,
  265. Content
  266. }
  267. }
  268. export default useHook