{"id":26532006,"url":"https://github.com/paintparty/bling","last_synced_at":"2025-04-12T20:43:52.044Z","repository":{"id":253990822,"uuid":"845147008","full_name":"paintparty/bling","owner":"paintparty","description":"Rich text console printing for Clojure, ClojureScript, and Babashka.","archived":false,"fork":false,"pushed_at":"2025-03-11T04:43:01.000Z","size":8008,"stargazers_count":122,"open_issues_count":10,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-04T20:02:48.901Z","etag":null,"topics":["accessibility","babashka","clojure","clojurescript","color","console","design","rich-text","styling","terminal","typography"],"latest_commit_sha":null,"homepage":"","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/paintparty.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-20T17:10:22.000Z","updated_at":"2025-03-30T21:07:10.000Z","dependencies_parsed_at":"2024-08-20T20:00:37.542Z","dependency_job_id":"71cfb38e-0c0e-41fa-a9fb-4e081c77e4cd","html_url":"https://github.com/paintparty/bling","commit_stats":null,"previous_names":["paintparty/bling"],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paintparty%2Fbling","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paintparty%2Fbling/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paintparty%2Fbling/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paintparty%2Fbling/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/paintparty","download_url":"https://codeload.github.com/paintparty/bling/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248631686,"owners_count":21136555,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["accessibility","babashka","clojure","clojurescript","color","console","design","rich-text","styling","terminal","typography"],"created_at":"2025-03-21T18:36:49.162Z","updated_at":"2025-04-12T20:43:52.034Z","avatar_url":"https://github.com/paintparty.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003c!-- TODO - Update images with new colors --\u003e\n# bling\n\n**Rich text in the console.**  \n\n\n\u003cp align=\"left\"\u003e\n  \u003ca href=\"https://clojars.org/io.github.paintparty/bling\"\u003e\n    \u003cimg src=\"https://img.shields.io/clojars/v/io.github.paintparty/bling.svg?color=0969da\u0026style=flat\u0026cacheSeconds=3\" alt=\"bling on Clojars\"\u003e\u003c/img\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cdiv align=\"left\"\u003e\n\n**[Features]**  \u0026nbsp;•\u0026nbsp; **[Setup]**  \u0026nbsp;•\u0026nbsp;  **[Basic Usage]** \u0026nbsp;•\u0026nbsp; **[Callout Blocks]** \u0026nbsp;•\u0026nbsp; **[Error Templates]**\n\u003c/div\u003e\n\n[Features]: #features\n[Setup]: #setup\n[Basic Usage]: #basic-usage\n[Callout Blocks]: #callout-blocks\n\n[Error Templates]: #templates-for-errors-and-warnings\n[Interop]: #printing-conventions\n[Contributing]: #contributing\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n\u003cp align=\"left\"\u003e\n  \u003cimg src=\"resources/docs/chromed/bling-banner-light-0.5.0.png\" width=\"700px\" /\u003e\n\u003c/p\u003e\n\nThe same example as above, in a terminal emulator with a dark background.\n\u003cp align=\"left\"\u003e\n  \u003cimg src=\"resources/docs/chromed/bling-banner-dark-0.5.0.png\" width=\"700px\" /\u003e\n\u003c/p\u003e\n\n## Features\n\n- Works great for Clojure, ClojureScript, and Babashka.\n\n- Supports both terminal emulators and browser consoles.\n\n- Simple, accessibility-focused, 11-color pallette.\n\n- All colors provide reasonable contrast on both light and dark backgrounds.\n\n- Simple and intuitive hiccup-like markup syntax.\n\n- Sensible templates for warning and error callouts.\n\n\n\u003cbr\u003e\n\n## Setup\n\n\nAdd as a dependency to your project:\n\n\n```Clojure\n[io.github.paintparty/bling \"0.5.0\"]\n```\n\u003cbr\u003e\n\nRequire:\n\n```Clojure\n(require '[bling.core :refer [bling callout point-of-interest]])\n\n;; In ClojureScript, you may also want :refer bling.core/print-bling.\n```\n\n\u003cbr\u003e\n\nOr, import into your namespace:\n\n```Clojure\n(ns myns.core\n  (:require\n    [bling.core :refer [bling callout point-of-interest]]))\n\n;; In ClojureScript, you may also want :refer bling.core/print-bling.\n```\n\n\u003cbr\u003e\n\nYou can view an exhaustive sampling of Bling output by pasting this snippet into your terminal:\n\n```clojure\nclj -Sdeps '{:deps {io.github.paintparty/bling {:mvn/version \"0.5.2\"}}}' -e \"(require '[bling.sample]) (println (bling.sample/sample))\"\n```\n\u003cbr\u003e\n\u003cbr\u003e\n\nTo view the above sample with Babashka, paste this snippet into your terminal:\n\n```clojure\nbb -Sdeps '{:deps {io.github.paintparty/bling {:mvn/version \"0.5.2\"}}}' -e \"(require '[bling.sample]) (println (bling.sample/sample))\"\n```\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n\n## Basic Usage \n\n\u003e [!NOTE]\n\u003e If you are reading this on github in a light-mode theme, the dark-mode samples in the sections below will appear to have lower contrast than they actually do if you were viewing them in dark-mode. \n\n\u003cbr\u003e\n\n**`bling.core/bling`** takes any number of arguments and returns a string\nof text decorated with tags for colorization, italics, and boldness:\n\n```Clojure\n(println (bling [:bold \"bold\"]\n                \", \"\n                [:italic \"italic\"]\n                \", or \"\n                [:blue \"colored\"]))\n```\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./resources/docs/chromed/basics-light.png\" width=\"700px\" align=\"center\"/\u003e\n\u003c/p\u003e\n\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/basics-dark.png\" width=\"700px\"/\u003e\u003c/p\u003e\n\n\n\n\u003cbr\u003e\n\nIn ClojureScript (browser context), **`bling`** returns a js object that needs to be printed like this: \u003cbr\u003e\n`(.apply js/console.log js/console (goog.object/get o \"consoleArray\"))`.\u003cbr\u003e\n\nTo avoid typing all this out, you can use **`bling.core/print-bling`** to print the array returned from **`bling`**:\n\n```Clojure\n(print-bling (bling [:bold \"bold\"]\n                    \", \"\n                    [:italic \"italic\"]\n                    \", or \"\n                    [:blue \"colored\"]))\n```\n\nBy default **`bling.core/print-bling`** prints with `js/console.log`.\nIf you would like to print with either `js.console/warn`, or `js/console.error`, you can pass either as a second argument.\n\n```Clojure\n(print-bling (bling [:bold \"bold\"]\n                    \", \"\n                    [:italic \"italic\"]\n                    \", or \"\n                    [:blue \"colored\"])\n             js/console.warn)\n```\n\u003cbr\u003e\n\n### Combo styles\n\nYou can add multiple decorations with hiccup-style tags (a keyword with dot separators). The order of the things separated by dots doesn't matter.\n```Clojure\n(println (bling [:bold.italic \"bold \u0026 italic\"]\n                \", \"\n                [:italic.blue \"italic \u0026 colored\"]\n                \", \"\n                [:bold.italic.white.blue-bg\n                 \"bold \u0026 italic \u0026 colored \u0026 colored-bg\"]\n                \", \"\n                [:bold.italic.blue.underline\n                 \"bold \u0026 italic \u0026 colored \u0026 underline\"]\n                \", \"\n                [:bold.italic.blue.strikethrough\n                 \"bold \u0026 italic \u0026 colored \u0026 strikethrough\"]))\n```\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/combos-light.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/combos-dark.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\n\u003cbr\u003e\n\n\nYou can also pass a map (instead of a hiccup-style keyword tag) to style the text:\n\n```Clojure\n(bling [{:color            :green\n         :background-color :black\n         :font-style       :italic\n         :font-weight      :bold}\n        \"bold italic green text on black background\"])\n```\nUsing a map is preferrable if you are doing something like this:\n```Clojure\n(println (string/join (for [c [\"red\"\n                               \"orange\"\n                               \"yellow\"\n                               \"olive\"\n                               \"green\"\n                               \"blue\"\n                               \"purple\"\n                               \"magenta\"]]\n                        (bling [{:background-color c\n                                 :color            :white\n                                 :font-weight      :bold}\n                                (str \" \" c \" \")]))))\n```\n\n\u003cbr\u003e\n\nNote that all the arguments to **`bling.core/bling`** must satisfy this predicate:\n\n```Clojure\n(every? (fn [x]\n          (or (and (vector? x)\n                   (= 2 (count x))\n                   (-\u003e x\n                       (nth 0)\n                       (maybe #(or (keyword? %)\n                                   (map? %)))))\n              (not (coll? x))))\n        args)\n```\n\nIn other words, every one of the arguments to **`bling.core/bling`** must be either:\u003cbr\u003e\n\n- A two-element vector, with the first element being a keyword or map.\u003cbr\u003e\n- A value which is not a collection.\n\nIf, for example, you wanted to print `[1 2 3]` in red, you will need to stringify the vector:\n\n```Clojure\n(bling [:red (str [1 2 3])])\n```\n\n\n\n\n### The Bling pallette \n\nEleven carefully selected colors, from the [xterm range 16-255](https://en.m.wikipedia.org/wiki/Xterm#/media/File%3AXterm_256color_chart.svg), are available for use. All of these colors should display consistantly across most consoles on the end-user side. Don't expect all of the colors to pass the [strictest APCA contrast criterion](https://www.myndex.com/APCA/), but you can be sure of reasonable visibility on both light and dark backgrounds:\n\n```Clojure\n(println (bling [:bold.red \"Red\"]\n                \", \"\n                [:bold.orange \"Orange\"]\n                \", \"\n                [:bold.yellow \"Yellow\"]\n                \", \"\n                [:bold.green \"Olive\"]\n                \", \"\n                [:bold.green \"Green\"]\n                \", \"\n                [:bold.blue \"Blue\"]\n                \", \"\n                [:bold.blue \"Purple\"]\n                \", \"\n                [:bold.magenta \"Magenta\"]\n                \", \"\n                [:bold.gray \"Gray\"]\n                \", \"\n                [:bold.black \"Black\"]\n                \", \"\n                [:bold.white \"White\"] ))\n```\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/colors-light.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/colors-dark.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\n\u003cbr\u003e\n\n### Color aliases\n\nYou can use the following semantic aliases for some colors:\n```Clojure\n(println (bling [:bold.negative \"Negative\"]\n                \", \"\n                [:bold.error \"Error\"]\n                \", \"\n                [:bold.warning \"Warning\"]\n                \", \"\n                [:bold.positive \"Positive\"]\n                \", \"\n                [:bold.info \"Info\"]\n                \", \"\n                [:bold.subtle \"Subtle\"]\n                \", \"\n                [:bold.neutral \"Neutral\"]))\n```\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/semantic-colors-light.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/semantic-colors-dark.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\n\u003cbr\u003e\n\n### Using system colors\n\nBling also supports named color aliases for system colors (Xterm colors 0-16).\n\nMost likely, you do **not** want to use these. They will not display consistently across user spaces, as the actual color is dictated by the theme the user has selected in their particular terminal emulator.\n\nIf, however, you are using Bling to provide errors, warnings, and messages for that only you will ever see (on your own computer), and your terminal emulator theme is totally dialed-in to your liking, then system colors might be an option worth exploring.\n\n\n```Clojure\n(println (bling [:system-black \"black (SYSTEM)\"]))\n(println (bling [:system-maroon \"maroon (SYSTEM)\"]))\n(println (bling [:system-green \"green (SYSTEM)\"]))\n(println (bling [:system-olive \"olive (SYSTEM)\"]))\n(println (bling [:system-navy \"navy (SYSTEM)\"]))\n(println (bling [:system-purple \"purple (SYSTEM)\"]))\n(println (bling [:system-teal \"teal (SYSTEM)\"]))\n(println (bling [:system-silver \"silver (SYSTEM)\"]))\n(println (bling [:system-grey \"grey (SYSTEM)\"]))\n(println (bling [:system-red \"red (SYSTEM)\"]))\n(println (bling [:system-lime \"lime (SYSTEM)\"]))\n(println (bling [:system-yellow \"yellow (SYSTEM)\"]))\n(println (bling [:system-blue \"blue (SYSTEM)\"]))\n(println (bling [:system-fuchsia \"fuchsia (SYSTEM)\"]))\n(println (bling [:system-aqua \"aqua (SYSTEM)\"]))\n(println (bling [:system-white \"white (SYSTEM)\"]))\n```\n\u003cbr\u003e\n\n### Using arbitrary colors\n\nBling also supports arbitrary colors in the xTerm 0-256 range. If you are using\narbitrary colors to construct messages to stdout that other people might have to\nread, you may want to test the appearance with both light and dark terminal\nthemes. They must be provided as integers, so you will need to use an options\nmap instead of a hiccup-style keyword:\n\n```Clojure\n(println (bling [{:color 180} \"xTerm color 180, aka Tan\"]))\n```\n\n\u003cbr\u003e\n\n\u003cbr\u003e\n\n## Callout blocks\n**`bling.core/callout`** will print a message \"block\" to the console with a colored bounding border in the inline-start position.\n\n**`callout`** takes one or two arguments. If two arguments are supplied, the first should be a map with 0 or more of following entries:\n\n| Key               | Pred                    | Description                                                  |\n| :---------------  | -----------------       | ------------------------------------------------------------ |\n| `:type`           | #{`keyword?` `string?`} | Should be one of: `:error`,  `:warning` , or `:info`. \u003cbr\u003eWill set the label text (unless provided via `:label`). Will also set the `:colorway`, and override any provided `:colorway` value. |\n| `:colorway`       | #{`keyword?` `string?`} | The color of the sideline border, or gutter, depending on the value of `:theme`.\u003cbr /\u003eShould be one of: `:error`,  `:warning` , `:info` , `:positive`, or `:subtle`. \u003cbr\u003eCan also be any one of the pallete colors such as  `:magenta`, `:green`,  `:negative`, `:neutral`, etc. |\n| `:theme`          | #{`keyword?` `string?`} | Theme of callout. Can be one of `:sideline`, `:sideline-bold`, or `:gutter`. Defaults to `:sideline`. |\n| `:label`          | `any?`                  | Labels the callout. In a terminal emulator context, the value will be cast to a string. In a browser context, the label can be an instance of `bling.core/Enriched`, or any other value (which will be cast to a string). \u003cbr\u003eIn the case of a callout `:type` of `:warning`, `:error`, or `:info`, the value of the label will default to `WARNING`, `ERROR`, or `INFO`, respectively. |\n| `:label-theme`    | #{`keyword?` `string?`} | Theme of label. Can be one of `:marquee` or `:minimal`. Defaults to `:minimal`. |\n| `:padding-top`    | `int?`                  | Amount of padding (in newlines) at top, inside callout.\u003cbr/\u003eDefaults to `0`. |\n| `:padding-bottom` | `int?`                  | Amount of padding (in newlines) at bottom, inside callout.\u003cbr\u003eDefaults to `0`. In browser console, defaults to `1` in the case of callouts of type `:warning` or `:error`.|\n| `:padding-left`   | `int?`                  | Amount of padding (in blank character spaces) at left, inside callout.\u003cbr\u003eIn console emulator, defaults to `2`. In browser console, defaults to `0`.|\n| `:margin-top`     | `int?`                  | Amount of margin (in newlines) at top, outside callout.\u003cbr\u003eDefaults to `1`. Only applies to terminal emulator printing. |\n| `:margin-bottom`  | `int?`                  | Amount of margin (in newlines) at bottom, outside callout.\u003cbr\u003eDefaults to `0`. Only applies to terminal emulator printing. |\n| `:margin-left`    | `int?`                  | Amount of margin (in blank character spaces) at left, outside callout.\u003cbr\u003eDefaults to `0`. Only applies to terminal emulator printing. |\n| `:data?`          | `boolean?`              | Returns a data representation of result instead of printing it. |\n\n\n\u003cbr\u003e\n\u003cbr\u003e\n\nExamples of `callout` with different `:type` / `:colorway` options:\n\n```Clojure\n(callout {:type :info}\n         \"Example callout, with :type of :info\")\n\n(callout {:type  :info\n          :label \"My custom label\"}\n         \"Example callout, with :type of :info and custom :label\")\n\n(callout {:type :warning}\n         \"Example callout, with :type of :warning\")\n\n(callout {:type :error}\n         \"Example callout, with :type of :error\")\n\n(callout {:type  :positive\n          :label \"SUCCESS!\"}\n         \"Example callout, with :type of :positive, and custom :label\")\n\n(callout {:type :subtle}\n         \"Example callout, with :type of :subtle (or :gray)\")\n\n(callout {:type :magenta}\n         \"Example callout, with :type of :magenta\")\n\n(callout \"Example callout, default\")\n```\n\n\u003cbr\u003e\n\nThe above calls would render the following in your terminal emulator: \n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callouts_sideline_minimal_light.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callouts_sideline_minimal_dark.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cbr\u003e\n\nWith `{:theme :sideline-bold}`: \n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callouts_sideline-bold_minimal_light.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callouts_sideline-bold_minimal_dark.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cbr\u003e\n\nCallout accepts a `:label-theme` option. Supplying a value of `:marquee`, will render\nthe label inside a box: \n\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callouts_sideline_marquee_light.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callouts_sideline_marquee_dark.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cbr\u003e\n\nWith `{:theme :sideline-bold :label-theme :marquee}`: \n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callouts_sideline-bold_marquee_light.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callouts_sideline-bold_marquee_dark.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cbr\u003e\n\n\n\u003cbr\u003e\n\n## Templates for errors and warnings\n\n**`bling.core/callout`**, paired with **`bling.core/point-of-interest`** \nis perfect for creating your own custom error or warning messages. \n\n\n\nHere is an example of creating a custom callout for an error message.\nYou must provide the relevant `:file`, `:line`, `:column`, and `:form` values.\n\n```Clojure\n(defn example-custom-callout\n  [{:keys [point-of-interest-opts callout-opts]}]\n  (let [poi-opts     (merge {:header \"Your header message goes here.\"\n                             :body   (str \"The body of your message goes here.\"\n                                          \"\\n\"\n                                          \"Another line of copy.\"\n                                          \"\\n\"\n                                          \"Another line.\"\n                                          )}\n                            point-of-interest-opts)\n        message      (point-of-interest poi-opts)\n        callout-opts (merge callout-opts\n                            {:padding-top 1})]\n    (callout callout-opts message)))\n\n(example-custom-callout\n {:point-of-interest-opts {:type                  :error\n                           :file                  \"example.ns.core\"\n                           :line                  11\n                           :column                1\n                           :form                  '(+ foo baz)\n                           :text-decoration-index 2}\n  :callout-opts           {:type :error}})\n```\n\n\n\u003cbr\u003e\n\nThe above callout would render like this your terminal emulator: \n\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callout-with-poi_sideline_minimal_light.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callout-with-poi_sideline_minimal_dark.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\nYou can also render such warning and error callouts using a `:label-theme` value of `:marquee`. \n\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callout-with-poi_sideline_marquee_dark.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callout-with-poi_sideline_marquee_dark.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\nThe diagram inside the callout that shows the namespace, line, column, and form\nwith underlined is created by **`bling.core/point-of-interest`**, which takes a\nsingle map with the following options:\n\n\u003cbr\u003e\n\n\n| Key                | Pred                   | Description                                                  |\n| :--------          | -----------------      | ------------------------------------------------------------ |\n| `:file`            | `string?`              | File or namespace                                            |\n| `:line`            | `integer?`             | Line number                                                  |\n| `:column`          | `integer?`             | Column number                                                |\n| `:form`            | `any?`                 | The form to draw attention to. Will be cast to string and truncated at 33 chars |\n| `:header`          | `any?`                 | Typically, a string. If multi-line, string should be composed with newlines as desired. In a browser context, can be an instance of `bling.core/Enriched` (produced by using `bling.core/enriched`)|\n| `:body`            | `any?`                 | Typically, a string. If multi-line, string should be composed with newlines as desired. In a browser context, can be an instance of `bling.core/Enriched` (produced by using `bling.core/enriched`)|\n| `:margin-block`    | `int?`                 | Controls the number of blank lines above and below the diagram.\u003cbr/\u003eDefaults to `1`.|\n| `:type`            | #{`:error` `:warning`} | Automatically sets the `:text-decoration-color`. |\n| `:text-decoration-color` | #{`keyword?` `string?`} | Controls the color of the underline. Should be one of: `:error` `:warning`, or `:neutral`.\u003cbr\u003eCan also be any one of the pallete colors such as  `:magenta`, `:green`,  `:negative`, `:neutral`, etc. Defaults to `:neutral` |\n| `:text-decoration-style` | #{`:wavy` `:solid` `:dashed` `:dotted` `:double`} | Controls the color of the underline. |\n| `:text-decoration-index` | `pos-int?` | If the value of `:form` is a collection, this is the index of the item to apply text-decoration (underline). |\n\u003cbr\u003e\n\u003cbr\u003e\n\n## Go heavy\n\nIf you want to place more emphasis on your callouts you can pass\n**`bling.core/callout`** a `:theme` option with a value of `:gutter`. With the\n`:gutter` theme, the thickness of the colored border is controlled by the value of\n`:margin-left`. Here is an example using the `example-custom-callout` function we\ndefined above:\n\n```Clojure\n(example-custom-callout\n {:file          \"example.ns.core\"\n  :line          11\n  :column        1\n  :form          '(+ 1 true)\n  :type          :error\n  :theme         :gutter})\n```\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callout-with-poi_gutter_with-colored-labels_light.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callout-with-poi_gutter_with-colored-labels_dark.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\nExample value of `2` for `:margin-left`, to increase the weight:\n\n```Clojure\n(example-custom-callout\n {:file          \"example.ns.core\"\n  :line          11\n  :column        1\n  :form          '(+ 1 true)\n  :type          :error\n  :margin-left   2\n  :theme         :gutter})\n```\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callout-with-poi_gutter_with-colored-labels_light.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callout-with-poi_gutter_with-colored-labels_dark.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\nMore callout examples of the `:gutter` theme:\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callouts_gutter_with-colored-labels_light.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callouts_gutter_with-colored-labels_dark.png\"  width=\"700px\" /\u003e\u003c/p\u003e\n\n\nMore example values of `2` for `:margin-left`, to increase the weight:\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callouts_gutter2_with-colored-labels_dark.png\" width=\"700px\" /\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"resources/docs/chromed/callouts_gutter2_with-colored-labels_dark.png\"  width=\"700px\" /\u003e\u003c/p\u003e\n\n\n\u003cbr\u003e\n\n## Testing\nThere is a set of visual test suites in `bling.core-test`.\n\nFor visual testing of output in node / deno context first do:\n\n`shadow-cljs compile node-script`\n\nThen do \n\n`node out/bling-in-node-demo-script.js`\n\n\u003cbr\u003e\n\n## Status / Roadmap\nAlpha, subject to change. Issues welcome, see [contributing](#contributing).\n\n\u003cbr\u003e\n\n## Contributing\nIssues for bugs, improvements, or features are very welcome. Please file an\nissue for discussion before starting or issuing a PR.\n\n\n\u003cbr\u003e\n\n\u003c!-- ## Alternatives / Prior Art --\u003e\n\n\u003cbr\u003e          \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaintparty%2Fbling","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpaintparty%2Fbling","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaintparty%2Fbling/lists"}