diff --git a/advocate.html.pm b/advocate.html.pm deleted file mode 100644 index 3dea5a5..0000000 --- a/advocate.html.pm +++ /dev/null @@ -1,59 +0,0 @@ -#lang pollen -◊(require pollen/template) - -◊(define-meta tfl-font-template "true") -◊(define-meta title "Advocate") - -◊margin-note{ -◊div[#:style "text-align:center"]{ -◊link["http://typo.la/ats" #:class 'pdf]{◊image{advocate-type-specimen.png}} - -◊link["http://typo.la/ats" #:class 'buylink]{PDF specimen} - -◊link["https://mbtype.com/fonts/advocate/" #:class 'buylink]{Web demo} - -}} - - -◊mb-font-specimen{◊div[#:style "line-height:1.1;margin-top:-0.5rem"]{◊span[#:style "font-family:'advocate-c43';font-size:115%"]{THE SENATORS AND REPRESENTATIVES -shall receive a Compensation for their -Services, to be ascertained by Law, and -◊strong{paid out of the Treasury of the United -States. They shall in all Cases, except} -◊span[#:style "font-family:'advocate-slab-c43'"]{Felony, be privileged from Arrest.} -◊span[#:style "font-family:'advocate-c45'"]{You can edit this paragraph.}}}} - - - -◊make-buy-table[#:skus (list -advocate -equity-concourse-triplicate-advocate)] - -◊(ie-payment-warning) - -◊font-details{Advocate includes 270 font files: -= 3 weights (regular, medium, bold) -× 3 widths (narrow, regular, wide) -× 2 series (sans, slab) -+ 12 cloned styles -× 3 stylistic variants (normal, tab, mid) -× 3 file formats (OpenType, TrueType-compatible OpenType TT, and WOFF) - -Read the ◊link["http://mbtype.com/license"]{font license} (it’s short) or the ◊link["http://mbtype.com/faq"]{FAQ} -For details on character set and OpenType features, visit ◊link["https://mbtype.com/fonts/advocate/"]{MB Type} -For more than ten people, visit ◊link["https://mbtype.com/fonts/advocate/buy.html"]{MB Type} -} - - -◊numbered-list{ -An assertive display face for ◊xref{letterhead}, logos, and titles. - - -Three widths and three weights, with sans and slab serif versions. - - -Short, plain-English license. - - -30-day return option. -} diff --git a/concourse.html.pm b/concourse.html.pm deleted file mode 100644 index d1b8ce5..0000000 --- a/concourse.html.pm +++ /dev/null @@ -1,64 +0,0 @@ -#lang pollen -◊(require pollen/template) - -◊(define-meta tfl-font-template "true") -◊(define-meta title "Concourse") - -◊margin-note{ -◊div[#:style "text-align:center"]{ -◊link["http://typo.la/cots" #:class 'pdf]{◊image{concourse-type-specimen.png}} - -◊link["http://typo.la/cots" #:class 'buylink]{PDF specimen} - -◊link["https://mbtype.com/fonts/concourse/" #:class 'buylink]{Web demo} -}} - - -◊mb-font-specimen{◊div[#:style "font-family:'concourse-t3';font-size:108%;position:relative;top:-.5rem;"]{◊span[#:style "text-transform:lowercase;font-family:concourse-c4;font-size:110tripl%"]{THE CONGRESS SHALL HAVE POWER} -to lay and collect Taxes, Duties, Imposts and -Excises, to pay the Debts and provide for the -◊em{common Defense and general Welfare of the} -◊strong{United States; but all Duties, Imposts and} -◊em{◊strong{Excises shall be uniform throughout.}} -If you like, you can edit this paragraph.}} - -◊make-buy-table[#:skus (list -concourse -equity-concourse -equity-concourse-triplicate-advocate)] - -◊(ie-payment-warning) - -◊font-details{Concourse includes 162 font files: -= 6 weights (light, book, medium, semibold, bold, black) -× 3 series (roman, italic, and caps) -+ 9 cloned styles -× 2 variants (regular and Tab, with tabular figures as the defaults) -× 3 file formats (OpenType, TrueType-compatible OpenType TT, and WOFF) - -Read the ◊link["https://mbtype.com/license"]{font license} (it’s short) or the ◊link["https://mbtype.com/faq"]{FAQ} -For details on character set and OpenType features, visit ◊link["https://mbtype.com/fonts/concourse/"]{MB Type} -For more than ten people, visit ◊link["https://mbtype.com/fonts/concourse/buy.html"]{MB Type} -} - - -◊numbered-list{ -A sans serif companion for ◊xref{Equity} suitable for text and display uses. - - -Six weights in the Standard package, with real italics and small caps for every weight. It includes oldstyle and tabular ◊xref{alternate figures}. - - -The Basic package includes the three weights most useful for legal drafting. - - -Separate caps fonts, which contain real ◊xref{small caps} and already include my recommended ◊xref{letterspacing}. - - -Short, plain-English license. - - -30-day return option. -} - - diff --git a/equity.html.pm b/equity.html.pm deleted file mode 100644 index 11b7eeb..0000000 --- a/equity.html.pm +++ /dev/null @@ -1,60 +0,0 @@ -#lang pollen -◊(require pollen/template) - -◊(define-meta tfl-font-template "true") -◊(define-meta title "Equity") - -◊margin-note{ -◊div[#:style "text-align:center"]{ -◊link["http://typo.la/eqts" #:class 'pdf]{◊image{equity-type-specimen.png}} - -◊link["http://typo.la/eqts" #:class 'buylink]{PDF specimen} - -◊link["https://mbtype.com/fonts/equity/" #:class 'buylink]{Web demo} -}} - - -◊mb-font-specimen{◊span[#:style "font-family:equity-caps"]{WE THE PEOPLE OF THE UNITED} -States, in Order to form a more perfect Union, -establish Justice, insure domestic Tranquility, -provide for the common Defense, promote the -◊em{general Welfare, and secure the Blessings of} -◊strong{Liberty to ourselves and our Posterity.} -If you like, you can edit this paragraph.} - -◊make-buy-table[#:skus (list -equity -equity-concourse -equity-concourse-triplicate-advocate)] - -◊(ie-payment-warning) - -◊font-details{Equity includes 72 font files: -= 6 styles (regular, italic, bold, bold italic, regular caps, bold caps) -× 2 weight grades (A and B) -× 2 variants (regular and Tab, with tabular figures as the defaults) -× 3 file formats (OpenType, TrueType-compatible OpenType TT, and WOFF) - -Read the ◊link["https://mbtype.com/license"]{font license} (it’s short) or the ◊link["https://mbtype.com/faq"]{FAQ} -For details on character set and OpenType features, visit ◊link["https://mbtype.com/fonts/equity/"]{MB Type} -For more than ten people, visit ◊link["https://mbtype.com/fonts/equity/buy.html"]{MB Type} -} - -◊numbered-list{ -A workhorse serif font for ◊xref{body text}. - - -Fits as many words on the page as ◊xref{Times New Roman}, and stays legible down to small ◊xref{point sizes}. - - -Designed to perform well on both high-end output devices and office printers. - - -Comes with a separate set of caps fonts, which contain real ◊xref{small caps} and already include my recommended ◊xref{letterspacing}. - - -Short, plain-English license. - - -30-day return option. -} diff --git a/fonts.html.pm b/fonts.html.pm deleted file mode 100644 index c7a6413..0000000 --- a/fonts.html.pm +++ /dev/null @@ -1,23 +0,0 @@ -#lang pollen -◊(require pollen/template) - -◊(define-meta tfl-font-template "true") -◊(define-meta title "TFL Fonts") - -◊margin-note{Equity, seen in a letterpress version of the ◊link["https://www.mozilla.org/en-US/MPL/"]{Mozilla Public License}.} - -◊image["equity-sm.jpg"] - -When I started the ◊em{Typography for Lawyers} project, I was asked "MB, you've designed fonts before. Will you ever design one for lawyers?" - -Of course not, I thought. Lawyers hadn't even scratched the surface of the many excellent professional fonts already available. - -But over time, lawyers kept nudging me — "it would be great if a font could do such-and-such …" After all, many of today's fonts — including ◊xref["a-brief-history-of-times-new-roman.html"]{Times New Roman} — were invented to suit the needs of earlier publishers. Why not lawyers? - -Like most type designers, I found it impossible to resist an invitation to explore a new realm of typographic geekery. But I'm also happy to share the results with you: the ◊strong{TFL Fonts}, a set of four font families inspired by the needs of legal writers. - -The second edition of ◊em{Typography for Lawyers} uses all four: ◊xref{Equity} for ◊xref{body text}, ◊xref{Concourse} for captions and instructions, ◊xref{Triplicate} for typewriter-style samples, and ◊xref{Advocate} for headlines and the front cover. (Of course, you're also reading them right now.) - -"Will these fonts comply with my local court rules?" I can't offer legal advice. But I can say that thousands of lawyers have been using the TFL Fonts without incident. In fact, they regularly tell me that judges, clients, and even opposing counsel notice & admire the appearance of their documents. - -◊em{Opposing counsel?} So I'm told. Your mileage may vary, however. \ No newline at end of file diff --git a/index.html.pm b/index.html.pm index e4a34e7..20691cc 100644 --- a/index.html.pm +++ b/index.html.pm @@ -27,6 +27,4 @@ Refreshed layout, featuring four font families — ◊xref{Equity}, ◊xref{Con ◊home-link["toc.html"]{read excerpts} -◊home-link[buy-url]{get the book} - -◊home-link["fonts.html"]{get the fonts} \ No newline at end of file +◊home-link[buy-url]{get the book} \ No newline at end of file diff --git a/pricing-table.rkt b/pricing-table.rkt deleted file mode 100644 index 588ea1f..0000000 --- a/pricing-table.rkt +++ /dev/null @@ -1,107 +0,0 @@ -#lang racket/base -(require racket/dict - racket/match - "sku.rkt") -(provide (all-defined-out) - (all-from-out "sku.rkt")) - - -(define (round-cents float) - (/ (floor (* float 100)) 100)) - -(define (round-up inc x) - (* (ceiling (/ x inc)) inc)) - - -(define (calc-multi-price base-price people) - (round-cents - (sub1 (round-up 10 (case people - [(1 2) base-price] - [(5) (* base-price 2)] - [(10) (* base-price 3)] - [(20) (* base-price 4)] - [(40) (* base-price 5)] - [(60) (* base-price 6)] - [(80) (* base-price 7)] - [else (error "Too many people")]))))) - - - -(define (calc-multi-license sku people) - (define base-price (sku-base-price sku)) - (calc-multi-price base-price people)) - -(define license-increments '(1 2 5 10 20 40 60 80)) - -(define (make-price-list base-price) - (map (λ(n) (cons n (calc-multi-license base-price n))) license-increments)) - -(define (get-price sku [people 1]) - (with-handlers ([exn:fail? (λ(e) (get-price sku (add1 people)))]) - (calc-multi-license sku people))) - -(define (get-variant-id sku which) - (dict-ref (sku-variant-ids sku) which)) - -(define (bc-url item-number) - (format "http://typo.la/bc.html?item=~a" item-number)) - -(define (make-buy-url sku which) - (bc-url (get-variant-id sku which))) - - -(define (grid->table grid) - (define (table-row row [cell-tag 'td]) - `(tr (th ((style "width:40%")) ,(car row)) ,@(map (λ(c) `(,cell-tag ,c)) (cdr row)))) - (define (table-header row) - (table-row row 'th)) - - `(table ((class "buy-table")) - ,(table-header (car grid)) - ,@(map table-row (cdr grid)))) - -(define (people->string p) - (string-append (match p - [2 "1–2"] - [5 "3–5"] - [10 "6–10"]) " people")) - -(require txexpr racket/string) -(define (textify x) - (cond - ;; convert nbsp to string - [(string? x) (string-replace x #px"[\\s#\u00A0]+" " ")] - [(eq? 'nbsp x) " "] - [(list? x) (string-append* (map textify (if (txexpr? x) - (get-elements x) - x)))])) - -(module+ test - (require rackunit) - (check-equal? - (textify - '(span (a ((href "equity.html")) "Equity") " + " (a ((href "concourse.html")) "Concourse Standard") " + " (a ((href "triplicate.html")) "Triplicate"))) - "Equity + Concourse Standard + Triplicate")) - -(define (buy-link sku people) - (define price (get-price sku people)) - (define item (textify (sku-name sku))) - `(a ((class "checkout_clicker") - (href "#") - (item ,item) - (label ,(format "~a (~a-person license)" item people)) - (quantity ,(number->string people)) - (amount ,(number->string price)) - (success "/order-success.html") - (failure "/order-failure.html")) - ,(format "$~a" price))) - -(define (make-buy-grid #:people people-list #:skus sku-list) - (cons - (cons "" (map people->string people-list)) - (map (λ(sku) (cons (sku-name sku) - (map (λ(p) (buy-link sku p)) people-list))) sku-list))) - - -(define (make-buy-table #:people [people-list '(2 5 10)] #:skus sku-list) - (grid->table (make-buy-grid #:people people-list #:skus sku-list))) diff --git a/scribblings/pollen-rkt.scrbl b/scribblings/pollen-rkt.scrbl index d1ff2e4..6712e5b 100644 --- a/scribblings/pollen-rkt.scrbl +++ b/scribblings/pollen-rkt.scrbl @@ -54,7 +54,7 @@ Other libraries we'll be using. @racketmodname[sugar] and @racketmodname[txexpr] @terminal{> raco pkg install hyphenate} -@filepath{pricing-table.rkt} is another custom Racket file for this project. It's up to you whether you store all your functions and definitions in @filepath{pollen.rkt}, or spread them over different source files. Regardless of where you store them, @filepath{pollen.rkt} remains the central gathering point for everything you want to propagate to the @|lang| @racketmodname[pollen] source files in your project. +It's up to you whether you store all your functions and definitions in @filepath{pollen.rkt}, or spread them over different source files. Regardless of where you store them, @filepath{pollen.rkt} remains the central gathering point for everything you want to propagate to the @|lang| @racketmodname[pollen] source files in your project. @margin-note{If you end up making reusable functions, you can share them between Pollen projects (and with other Racket users, if you want) by moving them into a @italic{package}. For more, see @secref["how-to-create" #:doc '(lib "pkg/scribblings/pkg.scrbl")].} @@ -66,8 +66,7 @@ Other libraries we'll be using. @racketmodname[sugar] and @racketmodname[txexpr] sugar txexpr hyphenate - pollen/unstable/typography - "../pricing-table.rkt")] + pollen/unstable/typography)] @section{Exports} @@ -76,7 +75,7 @@ Note that @racket[all-defined-out] would only export the definitions that are cr imported definitions available too, we need to re-export them explicitly with @racket[all-from-out]. @chunk[ - (provide (all-defined-out) (all-from-out "../pricing-table.rkt")) + (provide (all-defined-out)) ] diff --git a/sku.rkt b/sku.rkt deleted file mode 100644 index f8ddf76..0000000 --- a/sku.rkt +++ /dev/null @@ -1,34 +0,0 @@ -#lang racket/base -(provide (all-defined-out)) - -;; name = xexpr in table -;; base price = what it sounds like -;; variant-ids = pairs of (people . big cartel id) -(struct sku (name base-price variant-ids)) - -(define concourse (sku "Concourse" 150 '((1 . 25256145) (2 . 25256442) (5 . 25256445)))) - -(define hermes-maia (sku "Hermes Maia" 150 '((1 . 25256145) (2 . 25256442) (5 . 25256445)))) - -(define triplicate (sku "Triplicate" 100 '((1 . 64167442) (2 . 64167463) (5 . 64167466)))) - -(define advocate (sku "Advocate" 100 '((1 . 102904009) (2 . 102904012) (5 . 102904015)))) - -(define equity (sku "Equity" 120 '((1 . 14855773) (2 . 21635815) (5 . 14855775)))) -(define valkyrie (sku "Valkyrie" 120 '((1 . 14855773) (2 . 21635815) (5 . 14855775)))) -(define century-supra (sku "Century Supra" 120 '((1 . 14855773) (2 . 21635815) (5 . 14855775)))) - -(define text-font+concourse-discount 30) - -(define equity-concourse (sku '(span (a ((href "equity.html")) "Equity") " +" nbsp (a ((href "concourse.html")) "Concourse")) (- (+ (sku-base-price equity) (sku-base-price concourse)) text-font+concourse-discount) '((1 . 25256655) (2 . 25256754) (5 . 25256757)))) - -(define valkyrie-concourse (sku '(span (a ((href "valkyrie.html")) "Valkyrie") " +" nbsp (a ((href "concourse.html")) "Concourse")) (- (+ (sku-base-price equity) (sku-base-price concourse)) text-font+concourse-discount) '((1 . 25256655) (2 . 25256754) (5 . 25256757)))) - -(define century-supra-concourse (sku '(span (a ((href "century-supra.html")) "Century Supra") " +" nbsp (a ((href "concourse.html")) "Concourse")) (- (+ (sku-base-price equity) (sku-base-price concourse)) text-font+concourse-discount) '((1 . 25256655) (2 . 25256754) (5 . 25256757)))) - -(define text-font+3-discount 110) -(define equity-concourse-triplicate-advocate (sku '(span (a ((href "equity.html")) "Equity") " +" nbsp (a ((href "concourse.html")) "Concourse") " +" nbsp (a ((href "triplicate.html")) "Triplicate") (br) " +" nbsp (a ((href "advocate.html")) "Advocate")) (- (apply + (map sku-base-price (list equity concourse triplicate advocate))) text-font+3-discount) '((1 . 102904795)(2 . 102904798)(5 . 102904801)))) - -(define century-supra-concourse-triplicate-advocate (sku '(span (a ((href "century-supra.html")) "Century Supra") " +" nbsp (a ((href "concourse.html")) "Concourse") " +" nbsp (a ((href "triplicate.html")) "Triplicate") (br) " +" nbsp (a ((href "advocate.html")) "Advocate")) (- (apply + (map sku-base-price (list equity concourse triplicate advocate))) text-font+3-discount) '((1 . 102904795)(2 . 102904798)(5 . 102904801)))) - -(define valkyrie-concourse-triplicate-advocate (sku '(span (a ((href "valkyrie.html")) "Valkyrie") " +" nbsp (a ((href "concourse.html")) "Concourse") " +" nbsp (a ((href "triplicate.html")) "Triplicate") (br) " +" nbsp (a ((href "advocate.html")) "Advocate")) (- (apply + (map sku-base-price (list equity concourse triplicate advocate))) text-font+3-discount) '((1 . 102904795)(2 . 102904798)(5 . 102904801)))) \ No newline at end of file diff --git a/styles.css.pp b/styles.css.pp index fa6d876..ff3b27e 100644 --- a/styles.css.pp +++ b/styles.css.pp @@ -654,6 +654,7 @@ margin-left: ◊(+ single-quote-width)em; transition: opacity 0.2s; } + #bottom .span { display: inline-block, width: 12%; @@ -665,7 +666,7 @@ margin-left: ◊(+ single-quote-width)em; #bottom #left, #bottom #right { - width: 32%; + width: 44%; } #bottom a.xref:hover { diff --git a/template.html.p b/template.html.p index b24bd93..7e911c5 100644 --- a/template.html.p +++ b/template.html.p @@ -90,68 +90,6 @@ if (maybe_ie_ua.indexOf('MSIE ') > 0 || maybe_ie_ua.indexOf('Trident/') > 0) { ◊(define (empty-string) "") -◊(define (tfl-font-template-body) - ◊body{ - ◊style[#:type "text/css"]{ - #tfl-fonts-nav { - top: 0; - width: 29rem; - margin-bottom: 2rem; - font-size: 90%; - } - - #tfl-fonts-nav tr:first-child { - background: ◊|content-rule-color|; - ◊make-css-background-gradient[(list ◊|content-rule-color| "#777") '("17%" "100%")] - color: white; - } - - #tfl-fonts-nav tr:first-child td { - padding: 0; - padding-top: 0.3em; - padding-bottom: 0.5em; - } - - #tfl-fonts-nav tr + tr td { - padding: 0; - } - - #tfl-fonts-nav tr + tr td .xref { - display: inline-block; - height: 100%; - width: 100%; - padding-top: 0.3em; - padding-bottom: 0.3em; - box-sizing: content-box; - background: none; - } - - #content { - padding-top: 0; - padding-bottom: 2rem; - border-top: 0; - } - } - - ◊div[#:id "content"]{ - ◊table[#:id "tfl-fonts-nav"]{ - ◊tr{◊td[#:colspan "4"]{◊xref["fonts.html"]{The TFL fonts — designed by Matthew Butterick}}} - ◊tr{ - ◊td{◊xref{Equity}} - ◊td{◊xref{Concourse}} - ◊td{◊xref{Triplicate}} - ◊td{◊xref{Advocate}}}} - - ◊doc} - - ◊if[(not toolbar?) ""]{ - ◊div[#:class "nav-outer" #:id "bottom"]{ - ◊div[#:class "nav-inner"]{ - ◊span[#:style "width:33%"]{◊xref["/index.html"]{TFL home}} - ◊span[#:style "width:34%"]{◊xref["/toc.html"]{Read excerpts}} - ◊span[#:style "width:33%"]{◊xref[buy-url]{get the book}}}}}}) - - ◊(define (default-body) ◊body{ ◊; use this body for all other pages ◊div[#:id "top-stripe"]{} @@ -172,15 +110,9 @@ if (maybe_ie_ua.indexOf('MSIE ') > 0 || maybe_ie_ua.indexOf('Trident/') > 0) { ◊xref["index.html"]{home} ◊xref{◊(select 'title previous-page)})} ◊span{◊xref["/index.html"]{TFL home}} - ◊span{◊xref[buy-url]{get the book}} - ◊span{◊xref["/fonts.html"]{get the fonts}} ◊span[#:id "right"]{◊(if next-page ◊xref{◊(select 'title next-page)} ◊xref["https://www.google.com/search?q=boxer+puppies&safe=off&tbm=isch"]{boxer puppies})}}})}) -◊(->html - (body - (if (select-from-metas 'tfl-font-template metas) - (tfl-font-template-body) - (default-body)))) +◊(->html (body (default-body))) diff --git a/triplicate.html.pm b/triplicate.html.pm deleted file mode 100644 index 428a8c0..0000000 --- a/triplicate.html.pm +++ /dev/null @@ -1,59 +0,0 @@ -#lang pollen -◊(require pollen/template) - -◊(define-meta tfl-font-template "true") -◊(define-meta title "Triplicate") - -◊margin-note{ -◊div[#:style "text-align:center"]{ -◊type-specimen{◊link["http://typo.la/trts" #:class 'pdf]{◊image{triplicate-type-specimen.png}}} - -◊link["http://typo.la/trts" #:class 'buylink]{PDF specimen} - -◊link["https://mbtype.com/fonts/triplicate/" #:class 'buylink]{Web demo} -}} - - -◊mb-font-specimen{◊div[#:style "line-height:1.2;margin-top:-0.5rem"]{◊span[#:style "font-family:'triplicate-t4';font-size:85%"]{EACH HOUSE SHALL BE THE JUDGE OF THE -Elections, Returns and Qualifications -of its own Members, and a Majority of -◊em{each shall constitute a Quorum to do} -◊strong{Business; but a smaller Number may} -adjourn from day to day. If you like, -you can edit this paragraph.}}} - - - -◊make-buy-table[#:skus (list -triplicate -equity-concourse-triplicate-advocate)] - -◊(ie-payment-warning) - -◊font-details{Triplicate includes 144 font files: -= 3 weights (light, book, bold) -× 3 series (roman, italic, caps) -+ 3 cloned styles -× 4 variants (regular, code, poly, short) -× 3 file formats (OpenType, TrueType-compatible OpenType TT, and WOFF) - -Read the ◊link["http://mbtype.com/license"]{font license} (it’s short) or the ◊link["http://mbtype.com/faq"]{FAQ} -For details on character set and OpenType features, visit ◊link["https://mbtype.com/fonts/triplicate/"]{MB Type} -For more than ten people, visit ◊link["https://mbtype.com/fonts/triplicate/buy.html"]{MB Type} -} - - -◊numbered-list{ -A ◊xref{monospaced font} that's more readable and useful than Courier. - - -Three weights, with true italics, real ◊xref{small caps}, oldstyle figures, swash caps, box-drawing characters, and other superfluities. - - -Short, plain-English license. - - -30-day return option. -} - -