@kolkrabbi/kol-icons 0.48.0 → 0.50.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.
Files changed (140) hide show
  1. package/package.json +3 -2
  2. package/src/Icon.jsx +47 -36
  3. package/src/cuts.json +0 -9
  4. package/src/iconNames.js +20 -0
  5. package/src/index.js +29 -2
  6. package/src/kol-icon-set-identity/brand/apple-touch-icon-dark.png +0 -0
  7. package/src/kol-icon-set-identity/brand/apple-touch-icon-light.png +0 -0
  8. package/src/kol-icon-set-identity/brand/brand-favicon.svg +5 -0
  9. package/src/kol-icon-set-identity/brand/brand-logomark.svg +4 -0
  10. package/src/kol-icon-set-identity/brand/brand-tile-light.svg +5 -0
  11. package/src/kol-icon-set-identity/brand/brand-tile.svg +5 -0
  12. package/src/kol-icon-set-identity/brand/brand-wordmark.svg +4 -0
  13. package/src/kol-icon-set-identity/brand/brand.svg +4 -0
  14. package/src/kol-icon-set-identity/brand/icon-192.png +0 -0
  15. package/src/kol-icon-set-identity/brand/icon-512-maskable.png +0 -0
  16. package/src/kol-icon-set-identity/brand/icon-512.png +0 -0
  17. package/src/kol-icon-set-identity/brand/og.png +0 -0
  18. package/src/kol-icon-set-identity/brand/og.svg +5 -0
  19. package/src/kol-icon-set-identity/fxr/apple-touch-icon-dark.png +0 -0
  20. package/src/kol-icon-set-identity/fxr/apple-touch-icon-light.png +0 -0
  21. package/src/kol-icon-set-identity/fxr/fxr-favicon.svg +8 -0
  22. package/src/kol-icon-set-identity/fxr/fxr-logomark.svg +4 -0
  23. package/src/kol-icon-set-identity/fxr/fxr-tile-light.svg +5 -0
  24. package/src/kol-icon-set-identity/fxr/fxr-tile.svg +5 -0
  25. package/src/kol-icon-set-identity/fxr/icon-192.png +0 -0
  26. package/src/kol-icon-set-identity/fxr/icon-512-maskable.png +0 -0
  27. package/src/kol-icon-set-identity/fxr/icon-512.png +0 -0
  28. package/src/kol-icon-set-identity/fxr/og.png +0 -0
  29. package/src/kol-icon-set-identity/fxr/og.svg +5 -0
  30. package/src/kol-icon-set-identity/kol-ds/apple-touch-icon-dark.png +0 -0
  31. package/src/kol-icon-set-identity/kol-ds/apple-touch-icon-light.png +0 -0
  32. package/src/kol-icon-set-identity/kol-ds/icon-192.png +0 -0
  33. package/src/kol-icon-set-identity/kol-ds/icon-512-maskable.png +0 -0
  34. package/src/kol-icon-set-identity/kol-ds/icon-512.png +0 -0
  35. package/src/kol-icon-set-identity/kol-ds/kol-ds-favicon.svg +16 -0
  36. package/src/kol-icon-set-identity/kol-ds/kol-ds-logomark.svg +6 -0
  37. package/src/kol-icon-set-identity/kol-ds/kol-ds-tile-light.svg +7 -0
  38. package/src/kol-icon-set-identity/kol-ds/kol-ds-tile.svg +7 -0
  39. package/src/kol-icon-set-identity/kol-ds/og.png +0 -0
  40. package/src/kol-icon-set-identity/kol-ds/og.svg +7 -0
  41. package/src/kol-icon-set-identity/kolkrabbi/apple-touch-icon-dark.png +0 -0
  42. package/src/kol-icon-set-identity/kolkrabbi/apple-touch-icon-light.png +0 -0
  43. package/src/kol-icon-set-identity/kolkrabbi/icon-192.png +0 -0
  44. package/src/kol-icon-set-identity/kolkrabbi/icon-512-maskable.png +0 -0
  45. package/src/kol-icon-set-identity/kolkrabbi/icon-512.png +0 -0
  46. package/src/kol-icon-set-identity/kolkrabbi/kolkrabbi-favicon.svg +12 -0
  47. package/src/kol-icon-set-identity/kolkrabbi/kolkrabbi-lockup-h.svg +4 -0
  48. package/src/kol-icon-set-identity/kolkrabbi/kolkrabbi-lockup-v.svg +12 -0
  49. package/src/kol-icon-set-identity/kolkrabbi/kolkrabbi-logomark.svg +3 -0
  50. package/src/kol-icon-set-identity/kolkrabbi/kolkrabbi-tile-light.svg +5 -0
  51. package/src/kol-icon-set-identity/kolkrabbi/kolkrabbi-tile.svg +5 -0
  52. package/src/kol-icon-set-identity/kolkrabbi/kolkrabbi-wordmark.svg +10 -0
  53. package/src/kol-icon-set-identity/kolkrabbi/og.png +0 -0
  54. package/src/kol-icon-set-identity/kolkrabbi/og.svg +6 -0
  55. package/src/kol-icon-set-identity/metric/apple-touch-icon-dark.png +0 -0
  56. package/src/kol-icon-set-identity/metric/apple-touch-icon-light.png +0 -0
  57. package/src/kol-icon-set-identity/metric/icon-192.png +0 -0
  58. package/src/kol-icon-set-identity/metric/icon-512-maskable.png +0 -0
  59. package/src/kol-icon-set-identity/metric/icon-512.png +0 -0
  60. package/src/kol-icon-set-identity/metric/metric-favicon.svg +6 -0
  61. package/src/kol-icon-set-identity/metric/metric-logomark.svg +6 -0
  62. package/src/kol-icon-set-identity/metric/metric-tile-light.svg +7 -0
  63. package/src/kol-icon-set-identity/metric/metric-tile.svg +7 -0
  64. package/src/kol-icon-set-identity/metric/metric-wordmark.svg +4 -0
  65. package/src/kol-icon-set-identity/metric/og.png +0 -0
  66. package/src/kol-icon-set-identity/metric/og.svg +5 -0
  67. package/src/kol-icon-set-identity/mirror/apple-touch-icon-dark.png +0 -0
  68. package/src/kol-icon-set-identity/mirror/apple-touch-icon-light.png +0 -0
  69. package/src/kol-icon-set-identity/mirror/icon-192.png +0 -0
  70. package/src/kol-icon-set-identity/mirror/icon-512-maskable.png +0 -0
  71. package/src/kol-icon-set-identity/mirror/icon-512.png +0 -0
  72. package/src/kol-icon-set-identity/mirror/mirror-favicon.svg +5 -0
  73. package/src/kol-icon-set-identity/mirror/mirror-logomark.svg +4 -0
  74. package/src/kol-icon-set-identity/mirror/mirror-tile-light.svg +5 -0
  75. package/src/kol-icon-set-identity/mirror/mirror-tile.svg +5 -0
  76. package/src/kol-icon-set-identity/mirror/mirror-wordmark.svg +4 -0
  77. package/src/kol-icon-set-identity/mirror/og.png +0 -0
  78. package/src/kol-icon-set-identity/mirror/og.svg +5 -0
  79. package/src/kol-icon-set-identity/monitor/apple-touch-icon-dark.png +0 -0
  80. package/src/kol-icon-set-identity/monitor/apple-touch-icon-light.png +0 -0
  81. package/src/kol-icon-set-identity/monitor/icon-192.png +0 -0
  82. package/src/kol-icon-set-identity/monitor/icon-512-maskable.png +0 -0
  83. package/src/kol-icon-set-identity/monitor/icon-512.png +0 -0
  84. package/src/kol-icon-set-identity/monitor/monitor-favicon.svg +5 -0
  85. package/src/kol-icon-set-identity/monitor/monitor-logomark.svg +4 -0
  86. package/src/kol-icon-set-identity/monitor/monitor-tile-light.svg +5 -0
  87. package/src/kol-icon-set-identity/monitor/monitor-tile.svg +5 -0
  88. package/src/kol-icon-set-identity/monitor/monitor-wordmark.svg +4 -0
  89. package/src/kol-icon-set-identity/monitor/og.png +0 -0
  90. package/src/kol-icon-set-identity/monitor/og.svg +5 -0
  91. package/src/kol-icon-set-identity/r2b2/apple-touch-icon-dark.png +0 -0
  92. package/src/kol-icon-set-identity/r2b2/apple-touch-icon-light.png +0 -0
  93. package/src/kol-icon-set-identity/r2b2/icon-192.png +0 -0
  94. package/src/kol-icon-set-identity/r2b2/icon-512-maskable.png +0 -0
  95. package/src/kol-icon-set-identity/r2b2/icon-512.png +0 -0
  96. package/src/kol-icon-set-identity/r2b2/og.png +0 -0
  97. package/src/kol-icon-set-identity/r2b2/og.svg +5 -0
  98. package/src/kol-icon-set-identity/r2b2/r2b2-favicon.svg +8 -0
  99. package/src/kol-icon-set-identity/r2b2/r2b2-logomark.svg +4 -0
  100. package/src/kol-icon-set-identity/r2b2/r2b2-tile-light.svg +5 -0
  101. package/src/kol-icon-set-identity/r2b2/r2b2-tile.svg +5 -0
  102. package/src/kol-icon-set-identity/record/apple-touch-icon-dark.png +0 -0
  103. package/src/kol-icon-set-identity/record/apple-touch-icon-light.png +0 -0
  104. package/src/kol-icon-set-identity/record/icon-192.png +0 -0
  105. package/src/kol-icon-set-identity/record/icon-512-maskable.png +0 -0
  106. package/src/kol-icon-set-identity/record/icon-512.png +0 -0
  107. package/src/kol-icon-set-identity/record/og.png +0 -0
  108. package/src/kol-icon-set-identity/record/og.svg +5 -0
  109. package/src/kol-icon-set-identity/record/record-favicon.svg +5 -0
  110. package/src/kol-icon-set-identity/record/record-logomark.svg +4 -0
  111. package/src/kol-icon-set-identity/record/record-tile-light.svg +5 -0
  112. package/src/kol-icon-set-identity/record/record-tile.svg +5 -0
  113. package/src/kol-icon-set-identity/record/record-wordmark.svg +4 -0
  114. package/src/kol-icon-set-identity/record/record.svg +4 -0
  115. package/src/kol-icon-set-identity/studio/apple-touch-icon-dark.png +0 -0
  116. package/src/kol-icon-set-identity/studio/apple-touch-icon-light.png +0 -0
  117. package/src/kol-icon-set-identity/studio/icon-192.png +0 -0
  118. package/src/kol-icon-set-identity/studio/icon-512-maskable.png +0 -0
  119. package/src/kol-icon-set-identity/studio/icon-512.png +0 -0
  120. package/src/kol-icon-set-identity/studio/og.png +0 -0
  121. package/src/kol-icon-set-identity/studio/og.svg +5 -0
  122. package/src/kol-icon-set-identity/studio/studio-favicon.svg +5 -0
  123. package/src/kol-icon-set-identity/studio/studio-logomark.svg +4 -0
  124. package/src/kol-icon-set-identity/studio/studio-tile-light.svg +5 -0
  125. package/src/kol-icon-set-identity/studio/studio-tile.svg +5 -0
  126. package/src/kol-icon-set-identity/studio/studio-wordmark.svg +4 -0
  127. package/src/kol-icon-set-identity/workshop/workshop-wordmark.svg +10 -0
  128. package/src/sets/identity.js +13 -0
  129. package/src/sets/interface.js +8 -0
  130. package/src/sets/signal.js +7 -0
  131. package/src/iconData.js +0 -31
  132. /package/src/{kol-icon-set-interface/identity → kol-icon-set-identity/fxr}/fxr.svg +0 -0
  133. /package/src/{kol-icon-set-interface/identity → kol-icon-set-identity/kol-ds}/kol-ds.svg +0 -0
  134. /package/src/{kol-icon-set-interface/identity → kol-icon-set-identity/kolkrabbi}/kolkrabbi.svg +0 -0
  135. /package/src/{kol-icon-set-interface/identity/metrics.svg → kol-icon-set-identity/metric/metric.svg} +0 -0
  136. /package/src/{kol-icon-set-interface/identity/mirror-mir.svg → kol-icon-set-identity/mirror/mirror-alt-mir.svg} +0 -0
  137. /package/src/{kol-icon-set-interface/identity → kol-icon-set-identity/mirror}/mirror.svg +0 -0
  138. /package/src/{kol-icon-set-interface/identity → kol-icon-set-identity/monitor}/monitor.svg +0 -0
  139. /package/src/{kol-icon-set-interface/identity → kol-icon-set-identity/r2b2}/r2b2.svg +0 -0
  140. /package/src/{kol-icon-set-interface/identity → kol-icon-set-identity/studio}/studio.svg +0 -0
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "@kolkrabbi/kol-icons",
3
- "version": "0.48.0",
3
+ "version": "0.50.0",
4
4
  "description": "The icon loader and icon sets",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "main": "./src/index.js",
8
8
  "module": "./src/index.js",
9
9
  "exports": {
10
- ".": "./src/index.js"
10
+ ".": "./src/index.js",
11
+ "./identity/*": "./src/kol-icon-set-identity/*"
11
12
  },
12
13
  "bin": {
13
14
  "kol-icons": "./bin/kol-icons.mjs"
package/src/Icon.jsx CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Icon Component
3
3
  *
4
- * Dynamically loads and renders SVG icons from kol-icon-set-interface and
5
- * kol-icon-set-signal (or consumer-registered sets)
4
+ * Dynamically loads and renders SVG icons from kol-icon-set-interface,
5
+ * kol-icon-set-signal and kol-icon-set-identity (or consumer-registered sets)
6
6
  *
7
7
  * @param {Object} props
8
8
  * @param {string} props.name - Icon name (matches SVG filename without extension)
@@ -12,46 +12,55 @@
12
12
  * @param {ReactNode} props.children - Optional: Direct SVG path content for custom icons
13
13
  */
14
14
  import { useEffect, useState } from 'react'
15
-
16
- /* ONE icon home: kol-icon-set-interface. Legacy sets removed 0.8.0 (2026-07-28) —
17
- * a name either resolves from v1 or from consumer-registered SVGs, nothing else.
18
- *
19
- * The raw SVG strings live in ./iconData.js and are pulled in via a single
20
- * dynamic import — that keeps them out of the entry chunk (off the critical first-
21
- * paint path) and streams them in their own async chunk. Once loaded the map is
22
- * cached at module scope, so resolution stays synchronous for every render after. */
23
- let ICONS = null // { V1 } once the chunk resolves
24
- let loadPromise = null
15
+ import { setOf } from './iconNames.js'
16
+
17
+ /* THREE SETS, THREE CHUNKS (1.5, plan-2026-10-28-identity — user: "I cant believe you have to take every icon we
18
+ * ship if you only need one? is kol-icon just one tier?"). Until 0.50.0 every set's SVG text sat in ONE async
19
+ * module, so the first <Icon> on a website pulled every rack waveform and every app mark too — the "a website pays
20
+ * nothing for the rest" claim was never true in the bundle. Now each set is its own module under ./sets/, and a
21
+ * name's set is known from the keys-only index (iconNames.js, no SVG text) BEFORE anything is fetched: the first
22
+ * interface name fetches the interface chunk and nothing else; signal and identity load the first time one of their
23
+ * names renders. Within a set it is still the whole set — one request, not one per glyph. Once a chunk lands its map
24
+ * is cached at module scope, so resolution stays synchronous for every render after. Nothing is prefetched at boot. */
25
+ const SETS = {
26
+ interface: () => import('./sets/interface.js'),
27
+ signal: () => import('./sets/signal.js'),
28
+ identity: () => import('./sets/identity.js'),
29
+ }
30
+ const LOADED = {} // set → { name: svg } once its chunk resolves
31
+ const PENDING = {} // set → the in-flight import
25
32
  const subscribers = new Set()
26
33
 
27
- const loadIcons = () => {
28
- if (!loadPromise) {
29
- loadPromise = import('./iconData.js').then((mod) => {
30
- ICONS = mod
34
+ const loadSet = (set) => {
35
+ if (!set || !SETS[set]) return Promise.resolve(null)
36
+ if (LOADED[set]) return Promise.resolve(LOADED[set])
37
+ if (!PENDING[set]) {
38
+ PENDING[set] = SETS[set]().then((mod) => {
39
+ LOADED[set] = mod.default
31
40
  subscribers.forEach((fn) => fn())
32
- return mod
41
+ return mod.default
33
42
  })
34
43
  }
35
- return loadPromise
44
+ return PENDING[set]
36
45
  }
37
46
 
38
- // Start fetching the icon chunk the moment this module evaluates, in parallel with
39
- // the rest of boot — by first paint it's usually already in flight or resolved.
40
- loadIcons()
41
-
42
- const useIconsReady = () => {
43
- const [ready, setReady] = useState(() => !!ICONS)
47
+ /* ready = the set this name lives in has landed (a name no set ships is "ready" at once — it is a consumer's
48
+ * registered glyph or a miss, and neither waits on a chunk) */
49
+ const useIconsReady = (name) => {
50
+ const set = setOf(name)
51
+ const [ready, setReady] = useState(() => !set || !!LOADED[set])
44
52
  useEffect(() => {
45
- /* the chunk can land BETWEEN the render (which read `ICONS` as null) and this effect — under a
53
+ /* the chunk can land BETWEEN the render (which read the set as missing) and this effect — under a
46
54
  Suspense boundary that gap is as long as the lazy route takes. Nobody was subscribed then, so
47
55
  returning here without setting the state left the icon blank for good (kol-fxr's rail on
48
56
  /editor and /randomiser, found in apps/editor-hub 2026-10-03). */
49
- if (ICONS) { setReady(true); return undefined }
50
- const cb = () => setReady(true)
57
+ if (!set || LOADED[set]) { setReady(true); return undefined }
58
+ setReady(false)
59
+ const cb = () => { if (LOADED[set]) setReady(true) }
51
60
  subscribers.add(cb)
52
- loadIcons()
61
+ loadSet(set)
53
62
  return () => subscribers.delete(cb)
54
- }, [])
63
+ }, [set])
55
64
  return ready
56
65
  }
57
66
 
@@ -80,7 +89,7 @@ export const registerIcons = (globMap) => {
80
89
  }
81
90
  }
82
91
 
83
- /* Resolution order: consumer-registered → kol-icon-set-interface → kol-icon-set-signal.
92
+ /* Resolution order: kol-icon-set-interface → kol-icon-set-signal → kol-icon-set-identity (0.49.0) → consumer-registered.
84
93
  * That's the whole chain — a miss is a real miss.
85
94
  *
86
95
  * v1 BEFORE signal, and it decides the twelve names both sets drew (2026-08-28):
@@ -92,9 +101,10 @@ export const registerIcons = (globMap) => {
92
101
  * blank an icon. Drop each once no repo in the estate names it (Retirements R2).
93
102
  * customize → nav-settings (2026-10-09: two drawings of one sliders mark; nav-settings has the
94
103
  * punched hole)
95
- * user-interface → metrics (2026-10-09: it is the metrics app's mark, moved to `identity`)
104
+ * user-interface → metrics → metric (2026-10-09: it is the metrics app's mark, moved to `identity`)
105
+ * metrics → metric (2026-10-28: one word, singular, the app's own name — `apps/metric`, metric.kolkrabbi.io)
96
106
  * rack → rack-v (2026-10-09: beside the new rack-h) */
97
- export const RENAMED_ICONS = { customize: 'nav-settings', 'user-interface': 'metrics', rack: 'rack-v' }
107
+ export const RENAMED_ICONS = { customize: 'nav-settings', 'user-interface': 'metric', metrics: 'metric', rack: 'rack-v' }
98
108
 
99
109
  /* A REGISTERED GLYPH NEVER OVERRIDES A DS NAME (user 2026-10-24: kol-mirror registered its own set over the resolver and
100
110
  * its `refresh` replaced the DS's in the settings rail's reset — *"how can it register its own in a FIXED PRESET OF
@@ -104,13 +114,14 @@ export const RENAMED_ICONS = { customize: 'nav-settings', 'user-interface': 'met
104
114
  const overridden = new Set()
105
115
  const resolveIcon = (name) => {
106
116
  const n = RENAMED_ICONS[name] ?? name
107
- const shipped = ICONS ? (ICONS.V1[n] ?? ICONS.SIGNAL[n]) : undefined
108
- if (shipped) {
117
+ const set = setOf(n)
118
+ if (set) {
119
+ /* a DS name: its set's map, or nothing yet while that chunk streams — never the custom glyph */
109
120
  if (CUSTOM[name] && import.meta.env?.DEV && !overridden.has(name)) {
110
121
  overridden.add(name)
111
122
  console.warn(`kol-icons: "${name}" is a DS glyph — the registered one is ignored (a registration never overrides a shipped name, 2026-10-24). Register it under another name if it is a different drawing.`)
112
123
  }
113
- return shipped
124
+ return LOADED[set]?.[n]
114
125
  }
115
126
  return CUSTOM[name]
116
127
  }
@@ -149,7 +160,7 @@ const Icon = ({
149
160
  style = {},
150
161
  children
151
162
  }) => {
152
- const ready = useIconsReady()
163
+ const ready = useIconsReady(RENAMED_ICONS[name] ?? name)
153
164
 
154
165
  // If children are provided, render directly (for custom icons)
155
166
  if (children) {
package/src/cuts.json CHANGED
@@ -145,7 +145,6 @@
145
145
  "font-01": "stroke",
146
146
  "foundation": "stroke",
147
147
  "frequency": "stroke",
148
- "fxr": "solid",
149
148
  "gen-color": "stroke",
150
149
  "gen-gradient": "stroke",
151
150
  "gen-pattern": "stroke",
@@ -170,8 +169,6 @@
170
169
  "instance-02": "stroke",
171
170
  "italic-a": "stroke",
172
171
  "journal": "stroke",
173
- "kol-ds": "solid",
174
- "kolkrabbi": "solid",
175
172
  "layers": "stroke",
176
173
  "layout": "stroke",
177
174
  "letter-spacing": "stroke",
@@ -193,14 +190,10 @@
193
190
  "mask": "solid",
194
191
  "maximize": "stroke",
195
192
  "message": "stroke",
196
- "metrics": "solid",
197
193
  "minus": "stroke",
198
- "mirror": "solid",
199
- "mirror-mir": "solid",
200
194
  "mobile": "stroke",
201
195
  "mode-toggle-01": "stroke",
202
196
  "mode-toggle-02": "stroke",
203
- "monitor": "solid",
204
197
  "more": "solid",
205
198
  "music-note": "stroke",
206
199
  "nav-create": "stroke",
@@ -225,7 +218,6 @@
225
218
  "ptrn-dot": "solid",
226
219
  "ptrn-stripe": "stroke",
227
220
  "pushpin": "solid",
228
- "r2b2": "solid",
229
221
  "rabbit": "stroke",
230
222
  "rack-h": "stroke",
231
223
  "rack-v": "stroke",
@@ -307,7 +299,6 @@
307
299
  "stop": "solid",
308
300
  "stopwatch": "stroke",
309
301
  "stopwatch-solid": "solid",
310
- "studio": "solid",
311
302
  "sum": "stroke",
312
303
  "swap": "stroke",
313
304
  "tablet": "stroke",
@@ -0,0 +1,20 @@
1
+ /* The names each set ships — keys only, no SVG text, so this costs nothing to import. Icon.jsx reads it to learn
2
+ * WHICH set a name belongs to before fetching that set's chunk (1.5, plan-2026-10-28-identity); index.js builds the
3
+ * grouped indexes from the same globs. A keys-only `import.meta.glob` (no `eager`) is a map of lazy importers that
4
+ * nobody calls — only `Object.keys` is read. */
5
+ const names = (mods, keep = () => true) => {
6
+ const s = new Set()
7
+ for (const path of Object.keys(mods)) {
8
+ const parts = path.split('/')
9
+ const name = (parts.pop() || '').replace('.svg', '')
10
+ if (keep(name, parts.pop())) s.add(name)
11
+ }
12
+ return s
13
+ }
14
+ export const INTERFACE_NAMES = names(import.meta.glob('./kol-icon-set-interface/**/*.svg'))
15
+ export const SIGNAL_NAMES = names(import.meta.glob('./kol-icon-set-signal/**/*.svg'))
16
+ export const IDENTITY_NAMES = names(import.meta.glob('./kol-icon-set-identity/*/*.svg'), (name, folder) => name === folder)
17
+
18
+ /* interface decides a name both sets drew (2026-08-28: `chevron-*`, `nav-*`, `dith-flow`, `ptrn-checker`, `ptrn-dot`
19
+ * were left out of signal rather than shipped to collide); identity last */
20
+ export const setOf = (name) => (INTERFACE_NAMES.has(name) ? 'interface' : SIGNAL_NAMES.has(name) ? 'signal' : IDENTITY_NAMES.has(name) ? 'identity' : null)
package/src/index.js CHANGED
@@ -56,6 +56,32 @@ export const KOL_ICON_SET_SIGNAL = (() => {
56
56
 
57
57
  export const KOL_ICON_SET_SIGNAL_NAMES = Object.values(KOL_ICON_SET_SIGNAL).flat().sort()
58
58
 
59
+ /* kol-icon-set-identity — the marks (user 2026-10-28: *"identity should be separate from signal and interface"*): the
60
+ * brand's own and each app's. Until 0.49.0 these were interface's `identity` group.
61
+ *
62
+ * ONE FOLDER PER IDENTITY (0.50.0, plan-2026-10-28-identity): `kol-icon-set-identity/<id>/` — kolkrabbi · kol-ds ·
63
+ * fxr · mirror · monitor · metric · r2b2 · studio · brand … The file named like its folder (`mirror/mirror.svg`) is the
64
+ * ICON, on the keyline, the one name the set ships; every other file in the folder is an asset by role suffix —
65
+ * `<id>-logomark.svg` (the raw mark in its own box) · `-wordmark` · `-lockup-h` · `-lockup-v` · `-favicon` (the tab
66
+ * icon) · `-tile` (the touch icon on its ground) · the rendered PNGs — read by path through the `./identity/*` export,
67
+ * never through <Icon>. The gallery's two groups (`kolkrabbi` for the brand's own, `apps` for the rest) are the
68
+ * set's own call, not the folder: the folder is the identity. */
69
+ const IDENTITY_GROUP = { kolkrabbi: 'kolkrabbi', 'kol-ds': 'kolkrabbi' }
70
+ export const KOL_ICON_SET_IDENTITY = (() => {
71
+ const idx = {}
72
+ for (const p of Object.keys(import.meta.glob('./kol-icon-set-identity/*/*.svg'))) {
73
+ const parts = p.split('/')
74
+ const name = (parts.pop() || '').replace('.svg', '')
75
+ const folder = parts.pop()
76
+ if (name !== folder) continue
77
+ ;(idx[IDENTITY_GROUP[name] ?? 'apps'] ||= []).push(name)
78
+ }
79
+ for (const g of Object.values(idx)) g.sort()
80
+ return idx
81
+ })()
82
+
83
+ export const KOL_ICON_SET_IDENTITY_NAMES = Object.values(KOL_ICON_SET_IDENTITY).flat().sort()
84
+
59
85
  /* Per-glyph META — `{ name: { group, cut } }` (IconSetCut, kol-website 2026-08-27):
60
86
  * the set carries how each glyph is DRAWN — `cut: 'stroke' | 'solid'` — so a
61
87
  * gallery filters by type without globbing the package's SVGs. The cut is
@@ -66,8 +92,9 @@ const metaOf = (index, set) => Object.fromEntries(
66
92
  )
67
93
  export const KOL_ICON_SET_INTERFACE_META = metaOf(KOL_ICON_SET_INTERFACE, 'interface')
68
94
  export const KOL_ICON_SET_SIGNAL_META = metaOf(KOL_ICON_SET_SIGNAL, 'signal')
69
- /* every glyph the package ships, either set — `{ name: { group, set, cut } }` */
70
- export const KOL_ICON_META = { ...KOL_ICON_SET_SIGNAL_META, ...KOL_ICON_SET_INTERFACE_META }
95
+ export const KOL_ICON_SET_IDENTITY_META = metaOf(KOL_ICON_SET_IDENTITY, 'identity')
96
+ /* every glyph the package ships, any set — `{ name: { group, set, cut } }` */
97
+ export const KOL_ICON_META = { ...KOL_ICON_SET_SIGNAL_META, ...KOL_ICON_SET_IDENTITY_META, ...KOL_ICON_SET_INTERFACE_META }
71
98
  export const getCut = (name) => KOL_ICON_META[name]?.cut ?? null
72
99
  export const getSet = (name) => KOL_ICON_META[name]?.set ?? null
73
100
 
@@ -0,0 +1,5 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- Brand favicon (2026-10-28): the B, Wide Dark — the glyph alone, ink by colour scheme -->
3
+ <style>svg { color: #0E0E11; } @media (prefers-color-scheme: dark) { svg { color: #FFFFFF; } }</style>
4
+ <path d="M7.631 0C10.114 0 11.331-1.026 11.331-3.087L11.331-3.119C11.331-4.567 10.607-5.443 9.143-5.745L9.143-5.904C10.376-6.183 10.997-6.986 10.997-8.331L10.997-8.363C10.997-10.225 9.827-11.140 7.448-11.140L0.684-11.140L0.684 0M4.273-8.793L6.238-8.793C7.042-8.793 7.432-8.474 7.432-7.806L7.432-7.774C7.432-7.106 7.042-6.779 6.238-6.779L4.273-6.779M4.273-4.679L6.326-4.679C7.169-4.679 7.583-4.305 7.583-3.549L7.583-3.517C7.583-2.737 7.169-2.347 6.326-2.347L4.273-2.347" transform="translate(-0.256 23.363) scale(2.0401)" fill="currentColor"/>
5
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- brand logomark: the mark in its own box, currentColor — the keyline icon brand.svg is this at translate(3 3) scale(0.75); the tile places it in the middle 60 % (render-identity.mjs). -->
3
+ <path d="M7.631 0C10.114 0 11.331-1.026 11.331-3.087L11.331-3.119C11.331-4.567 10.607-5.443 9.143-5.745L9.143-5.904C10.376-6.183 10.997-6.986 10.997-8.331L10.997-8.363C10.997-10.225 9.827-11.140 7.448-11.140L0.684-11.140L0.684 0M4.273-8.793L6.238-8.793C7.042-8.793 7.432-8.474 7.432-7.806L7.432-7.774C7.432-7.106 7.042-6.779 6.238-6.779L4.273-6.779M4.273-4.679L6.326-4.679C7.169-4.679 7.583-4.305 7.583-3.549L7.583-3.517C7.583-2.737 7.169-2.347 6.326-2.347L4.273-2.347" transform="translate(-0.256 23.363) scale(2.0401)" fill="currentColor"/>
4
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg width="180" height="180" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- brand app icon: light — for the record; iOS greys a light web clip. Rendered by scripts/render-identity.mjs from brand-logomark.svg — edit the logomark, not this. -->
3
+ <rect width="24" height="24" fill="#FAFAFA"/>
4
+ <g transform="translate(4.80 4.80) scale(0.6)" style="color:#121215"><path d="M7.631 0C10.114 0 11.331-1.026 11.331-3.087L11.331-3.119C11.331-4.567 10.607-5.443 9.143-5.745L9.143-5.904C10.376-6.183 10.997-6.986 10.997-8.331L10.997-8.363C10.997-10.225 9.827-11.140 7.448-11.140L0.684-11.140L0.684 0M4.273-8.793L6.238-8.793C7.042-8.793 7.432-8.474 7.432-7.806L7.432-7.774C7.432-7.106 7.042-6.779 6.238-6.779L4.273-6.779M4.273-4.679L6.326-4.679C7.169-4.679 7.583-4.305 7.583-3.549L7.583-3.517C7.583-2.737 7.169-2.347 6.326-2.347L4.273-2.347" transform="translate(-0.256 23.363) scale(2.0401)" fill="currentColor"/></g>
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg width="180" height="180" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- brand app icon: dark — the mark in the middle 60 %, the one iOS links. Rendered by scripts/render-identity.mjs from brand-logomark.svg — edit the logomark, not this. -->
3
+ <rect width="24" height="24" fill="#121215"/>
4
+ <g transform="translate(4.80 4.80) scale(0.6)" style="color:#FFFFFF"><path d="M7.631 0C10.114 0 11.331-1.026 11.331-3.087L11.331-3.119C11.331-4.567 10.607-5.443 9.143-5.745L9.143-5.904C10.376-6.183 10.997-6.986 10.997-8.331L10.997-8.363C10.997-10.225 9.827-11.140 7.448-11.140L0.684-11.140L0.684 0M4.273-8.793L6.238-8.793C7.042-8.793 7.432-8.474 7.432-7.806L7.432-7.774C7.432-7.106 7.042-6.779 6.238-6.779L4.273-6.779M4.273-4.679L6.326-4.679C7.169-4.679 7.583-4.305 7.583-3.549L7.583-3.517C7.583-2.737 7.169-2.347 6.326-2.347L4.273-2.347" transform="translate(-0.256 23.363) scale(2.0401)" fill="currentColor"/></g>
5
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg width="433" height="240" viewBox="-0.5 0 43.292 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- BRAND — BRAND — Compact Dark, set as type -->
3
+ <path d="M30.469 0C43.555 0 49.951-5.566 49.951-17.139L49.951-20.557C49.951-28.955 46.143-33.594 38.330-35.303L38.330-36.279C44.824-37.842 48.242-42.139 48.242-49.756L48.242-52.686C48.242-63.281 42.236-68.359 29.688-68.359L3.662-68.359L3.662 0M19.287-56.104L26.465-56.104C30.811-56.104 32.764-54.248 32.764-50.098L32.764-46.533C32.764-42.432 30.811-40.576 26.465-40.576L19.287-40.576M19.287-30.127L26.855-30.127C31.396-30.127 33.496-28.076 33.496-23.389L33.496-19.189C33.496-14.453 31.396-12.305 26.855-12.305L19.287-12.305 M70.605 0L70.605-28.223L75.098-28.223C79.736-28.223 81.152-26.221 82.031-19.385L82.861-12.500C83.740-5.615 84.375-2.344 85.742 0L102.686 0L102.832-1.270C100.977-2.832 99.805-5.225 98.486-13.184L97.168-21.191C95.850-29.150 93.945-31.689 87.939-33.398L87.939-34.326C95.605-35.547 99.805-40.674 99.805-48.828L99.805-51.074C99.805-62.305 92.871-68.359 79.492-68.359L54.980-68.359L54.980 0M70.605-55.957L78.027-55.957C82.275-55.957 84.277-54.004 84.277-49.658L84.277-46.338C84.277-41.992 82.275-39.990 78.027-39.990L70.605-39.990 M118.799 0L120.654-9.668L137.842-9.668L139.697 0L156.250 0L139.893-68.359L119.678-68.359L103.662 0M126.367-37.793C127.441-43.018 128.223-47.998 128.711-53.809L129.736-53.809C130.322-47.998 131.152-43.018 132.178-37.793L135.498-20.947L122.998-20.947 M175.488 0L175.488-25.146C175.488-31.299 175.049-38.770 174.414-45.459L175.439-45.605C176.953-39.307 178.125-35.547 179.443-32.178L192.188 0L209.473 0L209.473-68.359L194.287-68.359L194.287-42.139C194.287-36.670 194.727-30.566 195.361-23.486L194.385-23.340C192.920-28.809 191.699-32.764 190.430-35.986L177.832-68.359L160.352-68.359L160.352 0 M238.623 0C255.225 0 263.184-9.229 263.184-28.613L263.184-39.697C263.184-59.082 255.225-68.359 238.623-68.359L216.748-68.359L216.748 0M232.373-55.957L237.793-55.957C244.336-55.957 247.314-52.344 247.314-44.336L247.314-24.023C247.314-16.016 244.336-12.402 237.793-12.402L232.373-12.402" transform="translate(-0.597 17.570) scale(0.16296)" fill="currentColor"/>
4
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- identity/brand — the favicon B at the set keyline -->
3
+ <g transform="translate(3 3) scale(0.75)"><path d="M7.631 0C10.114 0 11.331-1.026 11.331-3.087L11.331-3.119C11.331-4.567 10.607-5.443 9.143-5.745L9.143-5.904C10.376-6.183 10.997-6.986 10.997-8.331L10.997-8.363C10.997-10.225 9.827-11.140 7.448-11.140L0.684-11.140L0.684 0M4.273-8.793L6.238-8.793C7.042-8.793 7.432-8.474 7.432-7.806L7.432-7.774C7.432-7.106 7.042-6.779 6.238-6.779L4.273-6.779M4.273-4.679L6.326-4.679C7.169-4.679 7.583-4.305 7.583-3.549L7.583-3.517C7.583-2.737 7.169-2.347 6.326-2.347L4.273-2.347" transform="translate(-0.256 23.363) scale(2.0401)" fill="currentColor"/></g>
4
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="630" viewBox="0 0 1200 630">
2
+ <!-- brand share image: the wordmark, white on #121215. Rendered by scripts/render-identity.mjs from brand-wordmark.svg. -->
3
+ <rect width="1200" height="630" fill="#121215"/>
4
+ <svg x="180.0" y="82.2" width="840" height="465.7" viewBox="-0.5 0 43.292 24" style="color:#FFFFFF"><path d="M30.469 0C43.555 0 49.951-5.566 49.951-17.139L49.951-20.557C49.951-28.955 46.143-33.594 38.330-35.303L38.330-36.279C44.824-37.842 48.242-42.139 48.242-49.756L48.242-52.686C48.242-63.281 42.236-68.359 29.688-68.359L3.662-68.359L3.662 0M19.287-56.104L26.465-56.104C30.811-56.104 32.764-54.248 32.764-50.098L32.764-46.533C32.764-42.432 30.811-40.576 26.465-40.576L19.287-40.576M19.287-30.127L26.855-30.127C31.396-30.127 33.496-28.076 33.496-23.389L33.496-19.189C33.496-14.453 31.396-12.305 26.855-12.305L19.287-12.305 M70.605 0L70.605-28.223L75.098-28.223C79.736-28.223 81.152-26.221 82.031-19.385L82.861-12.500C83.740-5.615 84.375-2.344 85.742 0L102.686 0L102.832-1.270C100.977-2.832 99.805-5.225 98.486-13.184L97.168-21.191C95.850-29.150 93.945-31.689 87.939-33.398L87.939-34.326C95.605-35.547 99.805-40.674 99.805-48.828L99.805-51.074C99.805-62.305 92.871-68.359 79.492-68.359L54.980-68.359L54.980 0M70.605-55.957L78.027-55.957C82.275-55.957 84.277-54.004 84.277-49.658L84.277-46.338C84.277-41.992 82.275-39.990 78.027-39.990L70.605-39.990 M118.799 0L120.654-9.668L137.842-9.668L139.697 0L156.250 0L139.893-68.359L119.678-68.359L103.662 0M126.367-37.793C127.441-43.018 128.223-47.998 128.711-53.809L129.736-53.809C130.322-47.998 131.152-43.018 132.178-37.793L135.498-20.947L122.998-20.947 M175.488 0L175.488-25.146C175.488-31.299 175.049-38.770 174.414-45.459L175.439-45.605C176.953-39.307 178.125-35.547 179.443-32.178L192.188 0L209.473 0L209.473-68.359L194.287-68.359L194.287-42.139C194.287-36.670 194.727-30.566 195.361-23.486L194.385-23.340C192.920-28.809 191.699-32.764 190.430-35.986L177.832-68.359L160.352-68.359L160.352 0 M238.623 0C255.225 0 263.184-9.229 263.184-28.613L263.184-39.697C263.184-59.082 255.225-68.359 238.623-68.359L216.748-68.359L216.748 0M232.373-55.957L237.793-55.957C244.336-55.957 247.314-52.344 247.314-44.336L247.314-24.023C247.314-16.016 244.336-12.402 237.793-12.402L232.373-12.402" transform="translate(-0.597 17.570) scale(0.16296)" fill="currentColor"/></svg>
5
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- FXR (2026-10-09): Right Grotesk Tall Dark, cut at dith-glitch's middle row, halves slid ±1 — the KDS favicon's treatment -->
3
+ <style>
4
+ svg { color: #0E0E11; }
5
+ @media (prefers-color-scheme: dark) { svg { color: #FFFFFF; } }
6
+ </style>
7
+ <clipPath id="fxr-top"><rect x="-4" y="-1" width="32" height="13"/></clipPath><clipPath id="fxr-bot"><rect x="-4" y="12" width="32" height="13"/></clipPath><g clip-path="url(#fxr-top)"><path d="M3.880 23.683L3.880 12.885L5.716 12.885L5.716 10.448L3.880 10.448L3.880 2.904L6.067 2.904L6.067 0.317L0.726 0.317L0.726 23.683M9.388 23.683L9.972 16.790C10.056 15.822 10.106 14.871 10.122 13.969L10.506 13.969C10.540 14.871 10.590 15.822 10.673 16.757L11.307 23.683L14.612 23.683L12.476 11.216L14.412 0.317L11.424 0.317L10.823 5.658C10.757 6.392 10.707 7.260 10.640 8.679L10.256 8.679C10.223 7.260 10.172 6.392 10.106 5.641L9.622 0.317L6.467 0.317L8.253 11.332L6.417 23.683M18.384 23.683L18.384 12.467L18.517 12.467C19.235 12.467 19.435 12.768 19.485 15.739L19.536 18.709C19.586 21.697 19.669 22.632 19.853 23.683L23.207 23.683L23.274 23.349C22.907 22.865 22.790 21.897 22.690 18.693L22.590 15.505C22.490 12.300 22.072 11.650 20.821 11.332L20.821 11.082C22.122 10.615 22.773 9.413 22.773 7.360L22.773 4.506C22.773 1.686 21.555 0.317 19.035 0.317L15.230 0.317L15.230 23.683M18.384 2.754L18.701 2.754C19.369 2.754 19.602 3.088 19.602 4.156L19.602 8.645C19.602 9.680 19.369 10.031 18.701 10.031L18.384 10.031" transform="translate(-1 0)" fill="currentColor"/></g><g clip-path="url(#fxr-bot)"><path d="M3.880 23.683L3.880 12.885L5.716 12.885L5.716 10.448L3.880 10.448L3.880 2.904L6.067 2.904L6.067 0.317L0.726 0.317L0.726 23.683M9.388 23.683L9.972 16.790C10.056 15.822 10.106 14.871 10.122 13.969L10.506 13.969C10.540 14.871 10.590 15.822 10.673 16.757L11.307 23.683L14.612 23.683L12.476 11.216L14.412 0.317L11.424 0.317L10.823 5.658C10.757 6.392 10.707 7.260 10.640 8.679L10.256 8.679C10.223 7.260 10.172 6.392 10.106 5.641L9.622 0.317L6.467 0.317L8.253 11.332L6.417 23.683M18.384 23.683L18.384 12.467L18.517 12.467C19.235 12.467 19.435 12.768 19.485 15.739L19.536 18.709C19.586 21.697 19.669 22.632 19.853 23.683L23.207 23.683L23.274 23.349C22.907 22.865 22.790 21.897 22.690 18.693L22.590 15.505C22.490 12.300 22.072 11.650 20.821 11.332L20.821 11.082C22.122 10.615 22.773 9.413 22.773 7.360L22.773 4.506C22.773 1.686 21.555 0.317 19.035 0.317L15.230 0.317L15.230 23.683M18.384 2.754L18.701 2.754C19.369 2.754 19.602 3.088 19.602 4.156L19.602 8.645C19.602 9.680 19.369 10.031 18.701 10.031L18.384 10.031" transform="translate(1 0)" fill="currentColor"/></g>
8
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- fxr logomark: the mark in its own 24 box, currentColor — the keyline icon fxr.svg is this at translate(3 3) scale(0.75); the tile places it in the middle 60 % (render-identity.mjs). -->
3
+ <clipPath id="kol-fxr-top"><rect x="-4" y="-1" width="32" height="13"/></clipPath><clipPath id="kol-fxr-bot"><rect x="-4" y="12" width="32" height="13"/></clipPath><g clip-path="url(#kol-fxr-top)"><path d="M3.880 23.683L3.880 12.885L5.716 12.885L5.716 10.448L3.880 10.448L3.880 2.904L6.067 2.904L6.067 0.317L0.726 0.317L0.726 23.683M9.388 23.683L9.972 16.790C10.056 15.822 10.106 14.871 10.122 13.969L10.506 13.969C10.540 14.871 10.590 15.822 10.673 16.757L11.307 23.683L14.612 23.683L12.476 11.216L14.412 0.317L11.424 0.317L10.823 5.658C10.757 6.392 10.707 7.260 10.640 8.679L10.256 8.679C10.223 7.260 10.172 6.392 10.106 5.641L9.622 0.317L6.467 0.317L8.253 11.332L6.417 23.683M18.384 23.683L18.384 12.467L18.517 12.467C19.235 12.467 19.435 12.768 19.485 15.739L19.536 18.709C19.586 21.697 19.669 22.632 19.853 23.683L23.207 23.683L23.274 23.349C22.907 22.865 22.790 21.897 22.690 18.693L22.590 15.505C22.490 12.300 22.072 11.650 20.821 11.332L20.821 11.082C22.122 10.615 22.773 9.413 22.773 7.360L22.773 4.506C22.773 1.686 21.555 0.317 19.035 0.317L15.230 0.317L15.230 23.683M18.384 2.754L18.701 2.754C19.369 2.754 19.602 3.088 19.602 4.156L19.602 8.645C19.602 9.680 19.369 10.031 18.701 10.031L18.384 10.031" transform="translate(-1 0)" fill="currentColor"/></g><g clip-path="url(#kol-fxr-bot)"><path d="M3.880 23.683L3.880 12.885L5.716 12.885L5.716 10.448L3.880 10.448L3.880 2.904L6.067 2.904L6.067 0.317L0.726 0.317L0.726 23.683M9.388 23.683L9.972 16.790C10.056 15.822 10.106 14.871 10.122 13.969L10.506 13.969C10.540 14.871 10.590 15.822 10.673 16.757L11.307 23.683L14.612 23.683L12.476 11.216L14.412 0.317L11.424 0.317L10.823 5.658C10.757 6.392 10.707 7.260 10.640 8.679L10.256 8.679C10.223 7.260 10.172 6.392 10.106 5.641L9.622 0.317L6.467 0.317L8.253 11.332L6.417 23.683M18.384 23.683L18.384 12.467L18.517 12.467C19.235 12.467 19.435 12.768 19.485 15.739L19.536 18.709C19.586 21.697 19.669 22.632 19.853 23.683L23.207 23.683L23.274 23.349C22.907 22.865 22.790 21.897 22.690 18.693L22.590 15.505C22.490 12.300 22.072 11.650 20.821 11.332L20.821 11.082C22.122 10.615 22.773 9.413 22.773 7.360L22.773 4.506C22.773 1.686 21.555 0.317 19.035 0.317L15.230 0.317L15.230 23.683M18.384 2.754L18.701 2.754C19.369 2.754 19.602 3.088 19.602 4.156L19.602 8.645C19.602 9.680 19.369 10.031 18.701 10.031L18.384 10.031" transform="translate(1 0)" fill="currentColor"/></g>
4
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg width="180" height="180" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- fxr app icon: light — for the record; iOS greys a light web clip. Rendered by scripts/render-identity.mjs from fxr-logomark.svg — edit the logomark, not this. -->
3
+ <rect width="24" height="24" fill="#FAFAFA"/>
4
+ <g transform="translate(4.80 4.80) scale(0.6)" style="color:#121215"><clipPath id="kol-fxr-top"><rect x="-4" y="-1" width="32" height="13"/></clipPath><clipPath id="kol-fxr-bot"><rect x="-4" y="12" width="32" height="13"/></clipPath><g clip-path="url(#kol-fxr-top)"><path d="M3.880 23.683L3.880 12.885L5.716 12.885L5.716 10.448L3.880 10.448L3.880 2.904L6.067 2.904L6.067 0.317L0.726 0.317L0.726 23.683M9.388 23.683L9.972 16.790C10.056 15.822 10.106 14.871 10.122 13.969L10.506 13.969C10.540 14.871 10.590 15.822 10.673 16.757L11.307 23.683L14.612 23.683L12.476 11.216L14.412 0.317L11.424 0.317L10.823 5.658C10.757 6.392 10.707 7.260 10.640 8.679L10.256 8.679C10.223 7.260 10.172 6.392 10.106 5.641L9.622 0.317L6.467 0.317L8.253 11.332L6.417 23.683M18.384 23.683L18.384 12.467L18.517 12.467C19.235 12.467 19.435 12.768 19.485 15.739L19.536 18.709C19.586 21.697 19.669 22.632 19.853 23.683L23.207 23.683L23.274 23.349C22.907 22.865 22.790 21.897 22.690 18.693L22.590 15.505C22.490 12.300 22.072 11.650 20.821 11.332L20.821 11.082C22.122 10.615 22.773 9.413 22.773 7.360L22.773 4.506C22.773 1.686 21.555 0.317 19.035 0.317L15.230 0.317L15.230 23.683M18.384 2.754L18.701 2.754C19.369 2.754 19.602 3.088 19.602 4.156L19.602 8.645C19.602 9.680 19.369 10.031 18.701 10.031L18.384 10.031" transform="translate(-1 0)" fill="currentColor"/></g><g clip-path="url(#kol-fxr-bot)"><path d="M3.880 23.683L3.880 12.885L5.716 12.885L5.716 10.448L3.880 10.448L3.880 2.904L6.067 2.904L6.067 0.317L0.726 0.317L0.726 23.683M9.388 23.683L9.972 16.790C10.056 15.822 10.106 14.871 10.122 13.969L10.506 13.969C10.540 14.871 10.590 15.822 10.673 16.757L11.307 23.683L14.612 23.683L12.476 11.216L14.412 0.317L11.424 0.317L10.823 5.658C10.757 6.392 10.707 7.260 10.640 8.679L10.256 8.679C10.223 7.260 10.172 6.392 10.106 5.641L9.622 0.317L6.467 0.317L8.253 11.332L6.417 23.683M18.384 23.683L18.384 12.467L18.517 12.467C19.235 12.467 19.435 12.768 19.485 15.739L19.536 18.709C19.586 21.697 19.669 22.632 19.853 23.683L23.207 23.683L23.274 23.349C22.907 22.865 22.790 21.897 22.690 18.693L22.590 15.505C22.490 12.300 22.072 11.650 20.821 11.332L20.821 11.082C22.122 10.615 22.773 9.413 22.773 7.360L22.773 4.506C22.773 1.686 21.555 0.317 19.035 0.317L15.230 0.317L15.230 23.683M18.384 2.754L18.701 2.754C19.369 2.754 19.602 3.088 19.602 4.156L19.602 8.645C19.602 9.680 19.369 10.031 18.701 10.031L18.384 10.031" transform="translate(1 0)" fill="currentColor"/></g></g>
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg width="180" height="180" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- fxr app icon: dark — the mark in the middle 60 %, the one iOS links. Rendered by scripts/render-identity.mjs from fxr-logomark.svg — edit the logomark, not this. -->
3
+ <rect width="24" height="24" fill="#121215"/>
4
+ <g transform="translate(4.80 4.80) scale(0.6)" style="color:#FFFFFF"><clipPath id="kol-fxr-top"><rect x="-4" y="-1" width="32" height="13"/></clipPath><clipPath id="kol-fxr-bot"><rect x="-4" y="12" width="32" height="13"/></clipPath><g clip-path="url(#kol-fxr-top)"><path d="M3.880 23.683L3.880 12.885L5.716 12.885L5.716 10.448L3.880 10.448L3.880 2.904L6.067 2.904L6.067 0.317L0.726 0.317L0.726 23.683M9.388 23.683L9.972 16.790C10.056 15.822 10.106 14.871 10.122 13.969L10.506 13.969C10.540 14.871 10.590 15.822 10.673 16.757L11.307 23.683L14.612 23.683L12.476 11.216L14.412 0.317L11.424 0.317L10.823 5.658C10.757 6.392 10.707 7.260 10.640 8.679L10.256 8.679C10.223 7.260 10.172 6.392 10.106 5.641L9.622 0.317L6.467 0.317L8.253 11.332L6.417 23.683M18.384 23.683L18.384 12.467L18.517 12.467C19.235 12.467 19.435 12.768 19.485 15.739L19.536 18.709C19.586 21.697 19.669 22.632 19.853 23.683L23.207 23.683L23.274 23.349C22.907 22.865 22.790 21.897 22.690 18.693L22.590 15.505C22.490 12.300 22.072 11.650 20.821 11.332L20.821 11.082C22.122 10.615 22.773 9.413 22.773 7.360L22.773 4.506C22.773 1.686 21.555 0.317 19.035 0.317L15.230 0.317L15.230 23.683M18.384 2.754L18.701 2.754C19.369 2.754 19.602 3.088 19.602 4.156L19.602 8.645C19.602 9.680 19.369 10.031 18.701 10.031L18.384 10.031" transform="translate(-1 0)" fill="currentColor"/></g><g clip-path="url(#kol-fxr-bot)"><path d="M3.880 23.683L3.880 12.885L5.716 12.885L5.716 10.448L3.880 10.448L3.880 2.904L6.067 2.904L6.067 0.317L0.726 0.317L0.726 23.683M9.388 23.683L9.972 16.790C10.056 15.822 10.106 14.871 10.122 13.969L10.506 13.969C10.540 14.871 10.590 15.822 10.673 16.757L11.307 23.683L14.612 23.683L12.476 11.216L14.412 0.317L11.424 0.317L10.823 5.658C10.757 6.392 10.707 7.260 10.640 8.679L10.256 8.679C10.223 7.260 10.172 6.392 10.106 5.641L9.622 0.317L6.467 0.317L8.253 11.332L6.417 23.683M18.384 23.683L18.384 12.467L18.517 12.467C19.235 12.467 19.435 12.768 19.485 15.739L19.536 18.709C19.586 21.697 19.669 22.632 19.853 23.683L23.207 23.683L23.274 23.349C22.907 22.865 22.790 21.897 22.690 18.693L22.590 15.505C22.490 12.300 22.072 11.650 20.821 11.332L20.821 11.082C22.122 10.615 22.773 9.413 22.773 7.360L22.773 4.506C22.773 1.686 21.555 0.317 19.035 0.317L15.230 0.317L15.230 23.683M18.384 2.754L18.701 2.754C19.369 2.754 19.602 3.088 19.602 4.156L19.602 8.645C19.602 9.680 19.369 10.031 18.701 10.031L18.384 10.031" transform="translate(1 0)" fill="currentColor"/></g></g>
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="630" viewBox="0 0 1200 630">
2
+ <!-- fxr share image: the logomark, white on #121215. Rendered by scripts/render-identity.mjs from fxr-logomark.svg. -->
3
+ <rect width="1200" height="630" fill="#121215"/>
4
+ <svg x="450.0" y="165.0" width="300" height="300.0" viewBox="0 0 24 24" style="color:#FFFFFF"><clipPath id="kol-fxr-top"><rect x="-4" y="-1" width="32" height="13"/></clipPath><clipPath id="kol-fxr-bot"><rect x="-4" y="12" width="32" height="13"/></clipPath><g clip-path="url(#kol-fxr-top)"><path d="M3.880 23.683L3.880 12.885L5.716 12.885L5.716 10.448L3.880 10.448L3.880 2.904L6.067 2.904L6.067 0.317L0.726 0.317L0.726 23.683M9.388 23.683L9.972 16.790C10.056 15.822 10.106 14.871 10.122 13.969L10.506 13.969C10.540 14.871 10.590 15.822 10.673 16.757L11.307 23.683L14.612 23.683L12.476 11.216L14.412 0.317L11.424 0.317L10.823 5.658C10.757 6.392 10.707 7.260 10.640 8.679L10.256 8.679C10.223 7.260 10.172 6.392 10.106 5.641L9.622 0.317L6.467 0.317L8.253 11.332L6.417 23.683M18.384 23.683L18.384 12.467L18.517 12.467C19.235 12.467 19.435 12.768 19.485 15.739L19.536 18.709C19.586 21.697 19.669 22.632 19.853 23.683L23.207 23.683L23.274 23.349C22.907 22.865 22.790 21.897 22.690 18.693L22.590 15.505C22.490 12.300 22.072 11.650 20.821 11.332L20.821 11.082C22.122 10.615 22.773 9.413 22.773 7.360L22.773 4.506C22.773 1.686 21.555 0.317 19.035 0.317L15.230 0.317L15.230 23.683M18.384 2.754L18.701 2.754C19.369 2.754 19.602 3.088 19.602 4.156L19.602 8.645C19.602 9.680 19.369 10.031 18.701 10.031L18.384 10.031" transform="translate(-1 0)" fill="currentColor"/></g><g clip-path="url(#kol-fxr-bot)"><path d="M3.880 23.683L3.880 12.885L5.716 12.885L5.716 10.448L3.880 10.448L3.880 2.904L6.067 2.904L6.067 0.317L0.726 0.317L0.726 23.683M9.388 23.683L9.972 16.790C10.056 15.822 10.106 14.871 10.122 13.969L10.506 13.969C10.540 14.871 10.590 15.822 10.673 16.757L11.307 23.683L14.612 23.683L12.476 11.216L14.412 0.317L11.424 0.317L10.823 5.658C10.757 6.392 10.707 7.260 10.640 8.679L10.256 8.679C10.223 7.260 10.172 6.392 10.106 5.641L9.622 0.317L6.467 0.317L8.253 11.332L6.417 23.683M18.384 23.683L18.384 12.467L18.517 12.467C19.235 12.467 19.435 12.768 19.485 15.739L19.536 18.709C19.586 21.697 19.669 22.632 19.853 23.683L23.207 23.683L23.274 23.349C22.907 22.865 22.790 21.897 22.690 18.693L22.590 15.505C22.490 12.300 22.072 11.650 20.821 11.332L20.821 11.082C22.122 10.615 22.773 9.413 22.773 7.360L22.773 4.506C22.773 1.686 21.555 0.317 19.035 0.317L15.230 0.317L15.230 23.683M18.384 2.754L18.701 2.754C19.369 2.754 19.602 3.088 19.602 4.156L19.602 8.645C19.602 9.680 19.369 10.031 18.701 10.031L18.384 10.031" transform="translate(1 0)" fill="currentColor"/></g></svg>
5
+ </svg>
@@ -0,0 +1,16 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <style>
3
+ svg { color: #0E0E11; }
4
+ @media (prefers-color-scheme: dark) { svg { color: #FFFFFF; } }
5
+ </style>
6
+ <g clip-path="url(#clip0_46_1151)">
7
+ <path d="M1.68554 12.3338L5.44559 0.317107H7.66597L4.70007 9.96384L3.6304 9.74687L1.68554 15.9054V12.3338ZM0 0.317107H2.22038V23.6829H0V0.317107ZM3.09556 10.1474L4.52179 6.94298L7.87666 23.6829H5.65629L3.09556 10.1474Z" fill="currentColor"/>
8
+ <path d="M9.06951 0.317107H12.9106C14.0019 0.317107 14.823 0.611961 15.3741 1.20167C15.9251 1.79138 16.2006 2.70932 16.2006 3.95549V20.0445C16.2006 21.2907 15.9197 22.2086 15.3579 22.7983C14.8068 23.388 13.9911 23.6829 12.9106 23.6829H9.06951V0.317107ZM12.6027 21.9805C13.024 21.9805 13.359 21.8136 13.6075 21.4798C13.856 21.146 13.9803 20.6231 13.9803 19.911V4.05563C13.9803 3.34353 13.856 2.82615 13.6075 2.50348C13.3698 2.18081 13.0348 2.01947 12.6027 2.01947H11.2899V21.9805H12.6027Z" fill="currentColor"/>
9
+ <path d="M20.402 24C19.2459 24 18.3599 23.6885 17.744 23.0654C17.139 22.4423 16.8365 21.5355 16.8365 20.3449V15.5716L19.0244 14.9875V20.3449C19.0136 21.0125 19.1271 21.5076 19.3648 21.8303C19.6133 22.153 19.9644 22.3143 20.4182 22.3143C20.71 22.3143 20.9585 22.2476 21.1638 22.114C21.369 21.9694 21.5257 21.7524 21.6338 21.4631C21.7418 21.1627 21.7958 20.79 21.7958 20.3449V18.1419C21.7958 17.2072 21.6824 16.3839 21.4555 15.6718C21.2394 14.9485 20.9693 14.3255 20.6451 13.8025C20.321 13.2796 19.8888 12.662 19.3486 11.9499C18.7867 11.2267 18.3437 10.5925 18.0196 10.0473C17.6954 9.50209 17.4145 8.85118 17.1768 8.09458C16.9499 7.32684 16.8365 6.44784 16.8365 5.45758V3.65508C16.8365 2.85396 16.9607 2.18081 17.2092 1.6356C17.4577 1.0904 17.8359 0.684284 18.3437 0.417246C18.8515 0.139082 19.489 0 20.2562 0C20.9693 0 21.5851 0.139082 22.1038 0.417246C22.6224 0.684284 23.0114 1.09597 23.2707 1.65229C23.5408 2.1975 23.6759 2.86509 23.6759 3.65508V7.76078L21.4717 8.32823L21.4879 3.65508C21.4771 2.99861 21.3636 2.50904 21.1475 2.18637C20.9315 1.85257 20.6397 1.68567 20.2724 1.68567C20.0022 1.68567 19.7753 1.758 19.5917 1.90264C19.4188 2.03616 19.2783 2.25313 19.1703 2.55355C19.073 2.84284 19.0244 3.21001 19.0244 3.65508V4.99026C19.0244 5.85814 19.1325 6.63143 19.3486 7.31015C19.5647 7.97775 19.824 8.56745 20.1265 9.07928C20.4398 9.57997 20.8612 10.1752 21.3907 10.8651C21.9633 11.6328 22.4171 12.2949 22.7521 12.8512C23.0978 13.4075 23.3895 14.0862 23.6272 14.8873C23.8757 15.6885 24 16.612 24 17.6579V20.3449C24 21.146 23.8595 21.8192 23.5786 22.3644C23.3085 22.9096 22.9033 23.3213 22.3631 23.5994C21.8336 23.8665 21.18 24 20.402 24Z" fill="currentColor"/>
10
+ </g>
11
+ <defs>
12
+ <clipPath id="clip0_46_1151">
13
+ <rect width="24" height="24" fill="currentColor"/>
14
+ </clipPath>
15
+ </defs>
16
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- kol-ds logomark: the mark in its own box, currentColor — the keyline icon kol-ds.svg is this at translate(3 3) scale(0.75); the tile places it in the middle 60 % (render-identity.mjs). -->
3
+ <path d="M1.68554 12.3338L5.44559 0.317107H7.66597L4.70007 9.96384L3.6304 9.74687L1.68554 15.9054V12.3338ZM0 0.317107H2.22038V23.6829H0V0.317107ZM3.09556 10.1474L4.52179 6.94298L7.87666 23.6829H5.65629L3.09556 10.1474Z" fill="currentColor"/>
4
+ <path d="M9.06951 0.317107H12.9106C14.0019 0.317107 14.823 0.611961 15.3741 1.20167C15.9251 1.79138 16.2006 2.70932 16.2006 3.95549V20.0445C16.2006 21.2907 15.9197 22.2086 15.3579 22.7983C14.8068 23.388 13.9911 23.6829 12.9106 23.6829H9.06951V0.317107ZM12.6027 21.9805C13.024 21.9805 13.359 21.8136 13.6075 21.4798C13.856 21.146 13.9803 20.6231 13.9803 19.911V4.05563C13.9803 3.34353 13.856 2.82615 13.6075 2.50348C13.3698 2.18081 13.0348 2.01947 12.6027 2.01947H11.2899V21.9805H12.6027Z" fill="currentColor"/>
5
+ <path d="M20.402 24C19.2459 24 18.3599 23.6885 17.744 23.0654C17.139 22.4423 16.8365 21.5355 16.8365 20.3449V15.5716L19.0244 14.9875V20.3449C19.0136 21.0125 19.1271 21.5076 19.3648 21.8303C19.6133 22.153 19.9644 22.3143 20.4182 22.3143C20.71 22.3143 20.9585 22.2476 21.1638 22.114C21.369 21.9694 21.5257 21.7524 21.6338 21.4631C21.7418 21.1627 21.7958 20.79 21.7958 20.3449V18.1419C21.7958 17.2072 21.6824 16.3839 21.4555 15.6718C21.2394 14.9485 20.9693 14.3255 20.6451 13.8025C20.321 13.2796 19.8888 12.662 19.3486 11.9499C18.7867 11.2267 18.3437 10.5925 18.0196 10.0473C17.6954 9.50209 17.4145 8.85118 17.1768 8.09458C16.9499 7.32684 16.8365 6.44784 16.8365 5.45758V3.65508C16.8365 2.85396 16.9607 2.18081 17.2092 1.6356C17.4577 1.0904 17.8359 0.684284 18.3437 0.417246C18.8515 0.139082 19.489 0 20.2562 0C20.9693 0 21.5851 0.139082 22.1038 0.417246C22.6224 0.684284 23.0114 1.09597 23.2707 1.65229C23.5408 2.1975 23.6759 2.86509 23.6759 3.65508V7.76078L21.4717 8.32823L21.4879 3.65508C21.4771 2.99861 21.3636 2.50904 21.1475 2.18637C20.9315 1.85257 20.6397 1.68567 20.2724 1.68567C20.0022 1.68567 19.7753 1.758 19.5917 1.90264C19.4188 2.03616 19.2783 2.25313 19.1703 2.55355C19.073 2.84284 19.0244 3.21001 19.0244 3.65508V4.99026C19.0244 5.85814 19.1325 6.63143 19.3486 7.31015C19.5647 7.97775 19.824 8.56745 20.1265 9.07928C20.4398 9.57997 20.8612 10.1752 21.3907 10.8651C21.9633 11.6328 22.4171 12.2949 22.7521 12.8512C23.0978 13.4075 23.3895 14.0862 23.6272 14.8873C23.8757 15.6885 24 16.612 24 17.6579V20.3449C24 21.146 23.8595 21.8192 23.5786 22.3644C23.3085 22.9096 22.9033 23.3213 22.3631 23.5994C21.8336 23.8665 21.18 24 20.402 24Z" fill="currentColor"/>
6
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg width="180" height="180" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- kol-ds app icon: light — for the record; iOS greys a light web clip. Rendered by scripts/render-identity.mjs from kol-ds-logomark.svg — edit the logomark, not this. -->
3
+ <rect width="24" height="24" fill="#FAFAFA"/>
4
+ <g transform="translate(4.80 4.80) scale(0.6)" style="color:#121215"><path d="M1.68554 12.3338L5.44559 0.317107H7.66597L4.70007 9.96384L3.6304 9.74687L1.68554 15.9054V12.3338ZM0 0.317107H2.22038V23.6829H0V0.317107ZM3.09556 10.1474L4.52179 6.94298L7.87666 23.6829H5.65629L3.09556 10.1474Z" fill="currentColor"/>
5
+ <path d="M9.06951 0.317107H12.9106C14.0019 0.317107 14.823 0.611961 15.3741 1.20167C15.9251 1.79138 16.2006 2.70932 16.2006 3.95549V20.0445C16.2006 21.2907 15.9197 22.2086 15.3579 22.7983C14.8068 23.388 13.9911 23.6829 12.9106 23.6829H9.06951V0.317107ZM12.6027 21.9805C13.024 21.9805 13.359 21.8136 13.6075 21.4798C13.856 21.146 13.9803 20.6231 13.9803 19.911V4.05563C13.9803 3.34353 13.856 2.82615 13.6075 2.50348C13.3698 2.18081 13.0348 2.01947 12.6027 2.01947H11.2899V21.9805H12.6027Z" fill="currentColor"/>
6
+ <path d="M20.402 24C19.2459 24 18.3599 23.6885 17.744 23.0654C17.139 22.4423 16.8365 21.5355 16.8365 20.3449V15.5716L19.0244 14.9875V20.3449C19.0136 21.0125 19.1271 21.5076 19.3648 21.8303C19.6133 22.153 19.9644 22.3143 20.4182 22.3143C20.71 22.3143 20.9585 22.2476 21.1638 22.114C21.369 21.9694 21.5257 21.7524 21.6338 21.4631C21.7418 21.1627 21.7958 20.79 21.7958 20.3449V18.1419C21.7958 17.2072 21.6824 16.3839 21.4555 15.6718C21.2394 14.9485 20.9693 14.3255 20.6451 13.8025C20.321 13.2796 19.8888 12.662 19.3486 11.9499C18.7867 11.2267 18.3437 10.5925 18.0196 10.0473C17.6954 9.50209 17.4145 8.85118 17.1768 8.09458C16.9499 7.32684 16.8365 6.44784 16.8365 5.45758V3.65508C16.8365 2.85396 16.9607 2.18081 17.2092 1.6356C17.4577 1.0904 17.8359 0.684284 18.3437 0.417246C18.8515 0.139082 19.489 0 20.2562 0C20.9693 0 21.5851 0.139082 22.1038 0.417246C22.6224 0.684284 23.0114 1.09597 23.2707 1.65229C23.5408 2.1975 23.6759 2.86509 23.6759 3.65508V7.76078L21.4717 8.32823L21.4879 3.65508C21.4771 2.99861 21.3636 2.50904 21.1475 2.18637C20.9315 1.85257 20.6397 1.68567 20.2724 1.68567C20.0022 1.68567 19.7753 1.758 19.5917 1.90264C19.4188 2.03616 19.2783 2.25313 19.1703 2.55355C19.073 2.84284 19.0244 3.21001 19.0244 3.65508V4.99026C19.0244 5.85814 19.1325 6.63143 19.3486 7.31015C19.5647 7.97775 19.824 8.56745 20.1265 9.07928C20.4398 9.57997 20.8612 10.1752 21.3907 10.8651C21.9633 11.6328 22.4171 12.2949 22.7521 12.8512C23.0978 13.4075 23.3895 14.0862 23.6272 14.8873C23.8757 15.6885 24 16.612 24 17.6579V20.3449C24 21.146 23.8595 21.8192 23.5786 22.3644C23.3085 22.9096 22.9033 23.3213 22.3631 23.5994C21.8336 23.8665 21.18 24 20.402 24Z" fill="currentColor"/></g>
7
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg width="180" height="180" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- kol-ds app icon: dark — the mark in the middle 60 %, the one iOS links. Rendered by scripts/render-identity.mjs from kol-ds-logomark.svg — edit the logomark, not this. -->
3
+ <rect width="24" height="24" fill="#121215"/>
4
+ <g transform="translate(4.80 4.80) scale(0.6)" style="color:#FFFFFF"><path d="M1.68554 12.3338L5.44559 0.317107H7.66597L4.70007 9.96384L3.6304 9.74687L1.68554 15.9054V12.3338ZM0 0.317107H2.22038V23.6829H0V0.317107ZM3.09556 10.1474L4.52179 6.94298L7.87666 23.6829H5.65629L3.09556 10.1474Z" fill="currentColor"/>
5
+ <path d="M9.06951 0.317107H12.9106C14.0019 0.317107 14.823 0.611961 15.3741 1.20167C15.9251 1.79138 16.2006 2.70932 16.2006 3.95549V20.0445C16.2006 21.2907 15.9197 22.2086 15.3579 22.7983C14.8068 23.388 13.9911 23.6829 12.9106 23.6829H9.06951V0.317107ZM12.6027 21.9805C13.024 21.9805 13.359 21.8136 13.6075 21.4798C13.856 21.146 13.9803 20.6231 13.9803 19.911V4.05563C13.9803 3.34353 13.856 2.82615 13.6075 2.50348C13.3698 2.18081 13.0348 2.01947 12.6027 2.01947H11.2899V21.9805H12.6027Z" fill="currentColor"/>
6
+ <path d="M20.402 24C19.2459 24 18.3599 23.6885 17.744 23.0654C17.139 22.4423 16.8365 21.5355 16.8365 20.3449V15.5716L19.0244 14.9875V20.3449C19.0136 21.0125 19.1271 21.5076 19.3648 21.8303C19.6133 22.153 19.9644 22.3143 20.4182 22.3143C20.71 22.3143 20.9585 22.2476 21.1638 22.114C21.369 21.9694 21.5257 21.7524 21.6338 21.4631C21.7418 21.1627 21.7958 20.79 21.7958 20.3449V18.1419C21.7958 17.2072 21.6824 16.3839 21.4555 15.6718C21.2394 14.9485 20.9693 14.3255 20.6451 13.8025C20.321 13.2796 19.8888 12.662 19.3486 11.9499C18.7867 11.2267 18.3437 10.5925 18.0196 10.0473C17.6954 9.50209 17.4145 8.85118 17.1768 8.09458C16.9499 7.32684 16.8365 6.44784 16.8365 5.45758V3.65508C16.8365 2.85396 16.9607 2.18081 17.2092 1.6356C17.4577 1.0904 17.8359 0.684284 18.3437 0.417246C18.8515 0.139082 19.489 0 20.2562 0C20.9693 0 21.5851 0.139082 22.1038 0.417246C22.6224 0.684284 23.0114 1.09597 23.2707 1.65229C23.5408 2.1975 23.6759 2.86509 23.6759 3.65508V7.76078L21.4717 8.32823L21.4879 3.65508C21.4771 2.99861 21.3636 2.50904 21.1475 2.18637C20.9315 1.85257 20.6397 1.68567 20.2724 1.68567C20.0022 1.68567 19.7753 1.758 19.5917 1.90264C19.4188 2.03616 19.2783 2.25313 19.1703 2.55355C19.073 2.84284 19.0244 3.21001 19.0244 3.65508V4.99026C19.0244 5.85814 19.1325 6.63143 19.3486 7.31015C19.5647 7.97775 19.824 8.56745 20.1265 9.07928C20.4398 9.57997 20.8612 10.1752 21.3907 10.8651C21.9633 11.6328 22.4171 12.2949 22.7521 12.8512C23.0978 13.4075 23.3895 14.0862 23.6272 14.8873C23.8757 15.6885 24 16.612 24 17.6579V20.3449C24 21.146 23.8595 21.8192 23.5786 22.3644C23.3085 22.9096 22.9033 23.3213 22.3631 23.5994C21.8336 23.8665 21.18 24 20.402 24Z" fill="currentColor"/></g>
7
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="630" viewBox="0 0 1200 630">
2
+ <!-- kol-ds share image: the logomark, white on #121215. Rendered by scripts/render-identity.mjs from kol-ds-logomark.svg. -->
3
+ <rect width="1200" height="630" fill="#121215"/>
4
+ <svg x="450.0" y="165.0" width="300" height="300.0" viewBox="0 0 24 24" style="color:#FFFFFF"><path d="M1.68554 12.3338L5.44559 0.317107H7.66597L4.70007 9.96384L3.6304 9.74687L1.68554 15.9054V12.3338ZM0 0.317107H2.22038V23.6829H0V0.317107ZM3.09556 10.1474L4.52179 6.94298L7.87666 23.6829H5.65629L3.09556 10.1474Z" fill="currentColor"/>
5
+ <path d="M9.06951 0.317107H12.9106C14.0019 0.317107 14.823 0.611961 15.3741 1.20167C15.9251 1.79138 16.2006 2.70932 16.2006 3.95549V20.0445C16.2006 21.2907 15.9197 22.2086 15.3579 22.7983C14.8068 23.388 13.9911 23.6829 12.9106 23.6829H9.06951V0.317107ZM12.6027 21.9805C13.024 21.9805 13.359 21.8136 13.6075 21.4798C13.856 21.146 13.9803 20.6231 13.9803 19.911V4.05563C13.9803 3.34353 13.856 2.82615 13.6075 2.50348C13.3698 2.18081 13.0348 2.01947 12.6027 2.01947H11.2899V21.9805H12.6027Z" fill="currentColor"/>
6
+ <path d="M20.402 24C19.2459 24 18.3599 23.6885 17.744 23.0654C17.139 22.4423 16.8365 21.5355 16.8365 20.3449V15.5716L19.0244 14.9875V20.3449C19.0136 21.0125 19.1271 21.5076 19.3648 21.8303C19.6133 22.153 19.9644 22.3143 20.4182 22.3143C20.71 22.3143 20.9585 22.2476 21.1638 22.114C21.369 21.9694 21.5257 21.7524 21.6338 21.4631C21.7418 21.1627 21.7958 20.79 21.7958 20.3449V18.1419C21.7958 17.2072 21.6824 16.3839 21.4555 15.6718C21.2394 14.9485 20.9693 14.3255 20.6451 13.8025C20.321 13.2796 19.8888 12.662 19.3486 11.9499C18.7867 11.2267 18.3437 10.5925 18.0196 10.0473C17.6954 9.50209 17.4145 8.85118 17.1768 8.09458C16.9499 7.32684 16.8365 6.44784 16.8365 5.45758V3.65508C16.8365 2.85396 16.9607 2.18081 17.2092 1.6356C17.4577 1.0904 17.8359 0.684284 18.3437 0.417246C18.8515 0.139082 19.489 0 20.2562 0C20.9693 0 21.5851 0.139082 22.1038 0.417246C22.6224 0.684284 23.0114 1.09597 23.2707 1.65229C23.5408 2.1975 23.6759 2.86509 23.6759 3.65508V7.76078L21.4717 8.32823L21.4879 3.65508C21.4771 2.99861 21.3636 2.50904 21.1475 2.18637C20.9315 1.85257 20.6397 1.68567 20.2724 1.68567C20.0022 1.68567 19.7753 1.758 19.5917 1.90264C19.4188 2.03616 19.2783 2.25313 19.1703 2.55355C19.073 2.84284 19.0244 3.21001 19.0244 3.65508V4.99026C19.0244 5.85814 19.1325 6.63143 19.3486 7.31015C19.5647 7.97775 19.824 8.56745 20.1265 9.07928C20.4398 9.57997 20.8612 10.1752 21.3907 10.8651C21.9633 11.6328 22.4171 12.2949 22.7521 12.8512C23.0978 13.4075 23.3895 14.0862 23.6272 14.8873C23.8757 15.6885 24 16.612 24 17.6579V20.3449C24 21.146 23.8595 21.8192 23.5786 22.3644C23.3085 22.9096 22.9033 23.3213 22.3631 23.5994C21.8336 23.8665 21.18 24 20.402 24Z" fill="currentColor"/></svg>
7
+ </svg>
@@ -0,0 +1,12 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M0 0.5C0 0.223857 0.223858 0 0.5 0H23.5C23.7761 0 24 0.223858 24 0.5V23.5C24 23.7761 23.7761 24 23.5 24H0.5C0.223857 24 0 23.7761 0 23.5V0.5Z" fill="#121215"/>
3
+ <path d="M16.1309 9.24902C16.1629 9.25002 16.1887 9.82221 16.1885 10.5205C16.1883 11.2192 16.167 12.0962 16.1416 12.4697L16.0957 13.1494H15.5225L15.5684 12.4004C15.5935 11.9888 15.635 11.1979 15.6602 10.6426C15.7036 9.68625 15.7151 9.62263 15.8887 9.44141C15.9896 9.33612 16.0988 9.24902 16.1309 9.24902Z" fill="#FAFAFA"/>
4
+ <path d="M15.1973 10.1211C15.4732 9.7803 15.4965 9.87987 15.4443 11.1816C15.4171 11.8614 15.3753 12.5841 15.3516 12.7871C15.3136 13.1118 15.2901 13.1531 15.1572 13.1348C15.0152 13.115 15.0057 13.0662 14.9844 12.2783C14.9516 11.0653 15.0233 10.3361 15.1973 10.1211Z" fill="#FAFAFA"/>
5
+ <path d="M8.33203 9.78906C8.2824 9.47656 8.35605 9.46073 8.61816 9.72656C8.79655 9.90744 8.81917 9.99406 8.88086 10.7188C8.91805 11.1555 8.94955 11.8341 8.9502 12.2266L8.95117 12.9404H8.7373C8.46649 12.9404 8.46873 12.9497 8.41602 11.3389C8.3928 10.6304 8.35489 9.93272 8.33203 9.78906Z" fill="#FAFAFA"/>
6
+ <path d="M14.7676 10.6426C14.8165 10.6429 14.8288 10.7227 14.8008 10.8594C14.7761 10.9791 14.7548 11.4886 14.7539 11.9912L14.7529 12.9053L14.6152 12.7314C14.4916 12.575 14.4824 12.4749 14.5195 11.7217C14.5604 10.8918 14.6177 10.6426 14.7676 10.6426Z" fill="#FAFAFA"/>
7
+ <path d="M9.07617 10.2246C9.11716 10.2246 9.17534 10.2796 9.20508 10.3467C9.23472 10.4157 9.27281 10.9556 9.29004 11.5479C9.31632 12.4499 9.30303 12.6492 9.20996 12.7656C9.10742 12.8939 9.09876 12.8415 9.09668 12.0977C9.09539 11.6534 9.07336 11.0499 9.04785 10.7568C9.01738 10.4061 9.02722 10.225 9.07617 10.2246Z" fill="#FAFAFA"/>
8
+ <path d="M9.52441 10.6768C9.5654 10.7014 9.5957 11.0606 9.5957 11.5166C9.5957 12.0013 9.56798 12.3135 9.52441 12.3135C9.48067 12.3131 9.45312 11.9868 9.45312 11.4736C9.45313 10.9321 9.47821 10.6496 9.52441 10.6768Z" fill="#FAFAFA"/>
9
+ <path d="M14.0977 11.5137C14.1102 11.6572 14.0917 11.8029 14.0566 11.8369C14.0195 11.8723 13.9534 11.825 13.8975 11.7236C13.8127 11.5698 13.8169 11.5308 13.9375 11.4004L14.0752 11.2529L14.0977 11.5137Z" fill="#FAFAFA"/>
10
+ <path d="M10.0977 11.2344C10.137 11.258 10.1698 11.3202 10.1699 11.373C10.1699 11.426 10.1371 11.489 10.0977 11.5127C10.057 11.537 10.0264 11.4767 10.0264 11.373C10.0264 11.2694 10.0569 11.2099 10.0977 11.2344Z" fill="#FAFAFA"/>
11
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M23.5 0C23.7761 0 24 0.223858 24 0.5V23.5C24 23.7761 23.7761 24 23.5 24H0.5C0.223858 24 8.05324e-09 23.7761 0 23.5V0.5C0 0.223858 0.223858 8.05317e-09 0.5 0H23.5ZM10.0527 2.57812C9.43308 3.55327 9.47561 3.24511 9.54297 6.28223L9.60254 8.98926L10.0635 9.50195C10.3483 9.81924 10.5073 10.0538 10.4824 10.1182C10.4221 10.2709 10.2364 10.1507 9.83691 9.70117C9.65008 9.49091 9.45955 9.31934 9.41406 9.31934C9.31931 9.31868 9.05062 9.04982 9.07617 8.98145C9.08599 8.95673 9.06451 8.93652 9.02832 8.93652C8.99158 8.9356 8.84259 8.77876 8.69629 8.58789C8.54953 8.39641 8.22126 8.03199 7.9668 7.77832L7.50391 7.31738L7.35742 4.85352C7.24923 3.03123 7.18558 2.36363 7.11328 2.28809C7.03884 2.21073 6.87366 2.19216 6.4248 2.20898C6.09957 2.2211 5.10431 2.25165 4.21289 2.27734C3.01478 2.31181 2.56082 2.34847 2.47461 2.41797C2.3773 2.49658 2.3584 2.67087 2.3584 3.47168V4.43066L3.23633 4.47461C3.71902 4.4987 4.45237 4.52568 4.86621 4.53418L5.61914 4.54883L5.66016 3.57422L3.29004 3.62109V3.40723C3.2901 3.24251 3.32665 3.18625 3.45117 3.16016C3.78042 3.09129 6.05103 2.99612 6.10742 3.04883C6.13977 3.08311 6.24454 4.08892 6.33984 5.28809C6.43525 6.48857 6.52863 7.53592 6.54785 7.61719C6.56684 7.69622 6.91145 8.07691 7.31348 8.46289L8.04395 9.16504L8.13672 9.81641C8.18746 10.1748 8.25102 11.0243 8.27832 11.7041L8.32812 12.9404H6.07812C4.84046 12.9408 3.71412 12.9584 3.57617 12.9785C3.43834 12.9986 3.28698 12.9899 3.24023 12.959C3.17827 12.9178 3.13586 12.0116 3.08398 9.63184C3.04472 7.83362 3.02438 6.3503 3.03906 6.33594C3.05368 6.32166 3.39972 6.29363 3.80762 6.27344C4.49755 6.23918 4.54969 6.24624 4.55664 6.36816C4.56078 6.44287 4.58692 7.51883 4.61426 8.76172L4.66406 11.0254L4.83008 11.0811C5.02091 11.1451 5.48262 11.0437 5.46191 10.9424C5.45424 10.8997 5.42451 9.64275 5.39648 8.14453C5.36832 6.64297 5.32394 5.40141 5.29785 5.38574C5.26618 5.37012 4.55816 5.35201 3.71973 5.3457L2.18945 5.33398L2.19531 6.09082C2.22283 9.57642 2.31736 13.7754 2.36816 13.7754C2.40214 13.7758 2.42958 13.8232 2.42969 13.8809C2.42969 13.9743 2.78194 13.9815 5.49121 13.9395L8.55371 13.8916L8.41602 14.0947C8.34035 14.2064 7.89367 14.8775 7.42383 15.5859C6.95394 16.2945 6.56169 16.8826 6.55273 16.8926C6.53445 16.902 5.81574 16.8726 4.94727 16.8271L3.35645 16.7441L3.39746 15.3428L3.64355 15.3193C3.77878 15.3068 3.9962 15.3161 4.12695 15.3398C4.35262 15.381 4.36523 15.3988 4.36523 15.6846C4.36523 15.9784 4.37151 15.9872 4.63379 16.0293C5.11318 16.1063 5.42106 16.0812 5.46777 15.9629C5.52388 15.8197 5.52248 15.1643 5.46484 14.6982C5.42062 14.3406 5.28872 14.211 5.19922 14.4375C5.16424 14.5254 4.93221 14.542 3.73047 14.542C2.07976 14.542 2.20778 14.4706 2.29492 15.3428C2.32552 15.6493 2.37234 16.2953 2.39941 16.7783L2.44922 17.6562L2.92285 17.7002C3.18363 17.7241 4.2447 17.7439 5.28027 17.7441L7.16309 17.7451L7.22852 17.5781C7.31444 17.3585 9.34389 14.4671 9.62695 14.1611C9.86556 13.9033 10.2991 13.7365 10.2227 13.9316C10.1993 13.9908 9.85231 14.4525 9.45215 14.957L8.72461 15.874L8.74121 18.3711H2.09375L2.04688 19.0508C2.02145 19.4244 2.00021 20.1921 2 20.7568V21.7832H4.15234C5.9615 21.7832 6.31036 21.7671 6.34375 21.6826C6.36541 21.627 6.35637 21.4158 6.32324 21.2129L6.2627 20.8438L4.65137 20.8037C3.7685 20.7821 3.0322 20.759 3.01074 20.752C2.97369 20.7354 3.05672 19.4848 3.09766 19.4404C3.11485 19.4238 4.6824 19.3909 6.58105 19.3672L10.0332 19.3242L9.99609 18.9697C9.97546 18.7749 9.94168 18.1137 9.9209 17.501C9.88789 16.5267 9.89835 16.3597 10.0078 16.168C10.0768 16.0474 10.5191 15.5139 10.9902 14.9834C11.4613 14.453 11.8595 14.0035 11.875 13.9844C11.8904 13.9652 11.9892 14.0467 12.0938 14.165C12.1986 14.2839 12.6873 14.8312 13.1797 15.3818L14.0752 16.3838V17.5693C14.0752 18.2212 14.048 18.9351 14.0156 19.1553L13.957 19.5557L16.6318 19.5645C18.1028 19.5695 19.6776 19.5925 20.1309 19.6162L20.9541 19.6592L20.9756 20.3037C20.9869 20.657 20.9868 20.9522 20.9756 20.9609C20.9642 20.9679 20.2286 20.991 19.3418 21.0127L17.7295 21.0527L17.6826 21.4697C17.657 21.6995 17.6518 21.9037 17.6709 21.9229C17.6907 21.942 18.6722 21.9668 19.8525 21.9785L22 22L21.958 18.6152L15.249 18.5791L15.2754 16.0693L14.5137 15.1006C14.0949 14.568 13.7529 14.1141 13.7529 14.0928C13.7538 13.9875 14.112 14.0743 14.2725 14.2188C14.5064 14.4295 16.7627 17.6528 16.7627 17.7764C16.7629 17.8275 16.8164 17.8887 16.8818 17.9131C16.949 17.9375 18.0285 17.9365 19.2822 17.9102L21.5635 17.8623V17.7041C21.5636 17.6165 21.6124 16.9615 21.6719 16.248C21.7315 15.5341 21.7542 14.9053 21.7227 14.8506C21.6763 14.7709 21.3848 14.7469 20.2461 14.7305C18.9955 14.7124 18.8193 14.6957 18.7588 14.5908C18.7211 14.5254 18.6643 14.4717 18.6328 14.4717C18.5572 14.4717 18.4702 15.787 18.5273 16.0654C18.5677 16.2612 18.5974 16.2819 18.832 16.2783C18.975 16.2761 19.2207 16.2517 19.3779 16.2246C19.6591 16.1761 19.6631 16.1711 19.6396 15.9062C19.61 15.572 19.6878 15.519 20.209 15.5176L20.6113 15.5166L20.6592 16.1875C20.6858 16.5549 20.6903 16.8729 20.6689 16.8965C20.6219 16.9422 17.5353 17.1175 17.4697 17.0781C17.4055 17.0385 15.5509 14.2385 15.5439 14.1709C15.5439 14.1452 15.689 14.124 15.8662 14.124C16.1051 14.124 16.1895 14.1512 16.1895 14.2285C16.1896 14.2858 16.2378 14.333 16.2969 14.333C16.3558 14.3328 16.4043 14.2803 16.4043 14.2168C16.4045 14.1104 16.6094 14.1052 18.9834 14.1465C21.168 14.1846 21.5632 14.1762 21.5635 14.0938C21.5635 14.0401 21.5958 13.9855 21.6348 13.9727C21.6782 13.9546 21.7195 13.1156 21.7422 11.791C21.7626 10.6038 21.7957 8.70789 21.8154 7.57812L21.8516 5.52441L20.2959 5.54102C19.4404 5.55049 18.7182 5.5825 18.6914 5.61133C18.6647 5.64929 18.6259 6.93208 18.6045 8.46973L18.5654 11.2754L19.333 11.2344L19.375 9.04102C19.3984 7.83462 19.4352 6.76063 19.457 6.65527L19.4971 6.46387H20.1299C20.4782 6.46387 20.8175 6.48442 20.8828 6.50879C20.9907 6.54952 20.9979 6.74041 20.959 8.64941C20.9355 9.80275 20.8972 11.2876 20.874 11.9482L20.832 13.1494H16.335L16.418 8.93652L16.8799 8.49023C17.134 8.24508 17.3728 7.98899 17.4102 7.9209C17.4477 7.85208 17.5611 6.7842 17.6621 5.54688C17.7627 4.31336 17.8693 3.2794 17.8994 3.24316C17.95 3.19331 20.4204 3.30703 20.6143 3.36816C20.6635 3.38397 20.7041 3.49447 20.7041 3.61426V3.83203L19.5205 3.80762C18.5571 3.78764 18.3442 3.80045 18.374 3.87598C18.3942 3.92693 18.4101 4.15722 18.4102 4.3877V4.80664L18.8945 4.76758C19.1607 4.74564 19.8845 4.70775 20.5029 4.68359L21.6279 4.63965L21.6494 3.70117C21.6689 2.8603 21.6572 2.75107 21.5381 2.64648C21.4262 2.54843 21.1633 2.52321 19.8896 2.48633C19.0563 2.46217 18.0648 2.43106 17.6865 2.41699C16.8324 2.38519 16.7627 2.427 16.7627 2.96973C16.7626 3.43365 16.565 6.78303 16.5117 7.22656C16.478 7.50607 16.4017 7.61111 15.7402 8.28418C15.3367 8.695 14.7684 9.2838 14.4775 9.59277C14.0085 10.0909 13.6811 10.2942 13.6807 10.0879C13.6807 10.0509 13.908 9.77038 14.1855 9.46484L14.6904 8.90918L14.6504 7.91309C14.6282 7.36528 14.5939 5.89801 14.5742 4.65332C14.5547 3.40908 14.5211 2.33799 14.5 2.27246C14.4789 2.20742 14.4068 2.1392 14.3398 2.12109C14.2711 2.10297 13.3627 2.06815 12.3193 2.04395L10.4199 2L10.0527 2.57812Z" fill="#FAFAFA"/>
12
+ </svg>