{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "icons",
  "type": "registry:component",
  "title": "Icons",
  "description": "Provides interface marks on a 16px viewBox. Round currentColor strokes are 1px at 12, 1.25px at 16, and 1.5px at 24.",
  "registryDependencies": [
    "https://vlak.dev/r/vlak-base.json",
    "https://vlak.dev/r/inter.json",
    "https://vlak.dev/r/vlak-lib.json"
  ],
  "dependencies": [
    "@stylexjs/stylex"
  ],
  "devDependencies": [
    "@stylexjs/babel-plugin"
  ],
  "docs": "Vlak leaves are StyleX. Compile them with @stylexjs/babel-plugin (Vite: @stylexjs/unplugin, Next: @stylexjs/nextjs-plugin). If you would rather not run a compiler, import @noorddev/vlak-react instead: it ships precompiled with one stylesheet.",
  "files": [
    {
      "path": "vlak/icons.tsx",
      "content": "import * as React from \"react\";\nimport * as stylex from \"@stylexjs/stylex\";\nimport { vlak } from \"./tokens.stylex\";\nimport { rs } from \"./rs\";\nimport {\n  filledCutouts,\n  filledMarks,\n  iconGroups,\n  iconLabel,\n  iconNames,\n  marks,\n  resolveIcon,\n  smallFilledCutouts,\n  smallFilledMarks,\n  type IconName,\n  type IconRotate,\n  type MarkEl,\n} from \"./icon-marks\";\n\nconst at480 = \"@media (max-width: 480px)\" as const;\n\nexport { filledCutouts, filledMarks, iconGroups, iconLabel, iconNames, resolveIcon };\nexport type { IconName, IconRotate };\nexport type { DrawnName, IconAlias, IconGroup } from \"./icon-marks\";\n\n/**\n * Vlak chrome marks, optically drawn on a 16×16 module centered at 8,8.\n * Line weight is tuned for each displayed size; rounded terminals keep small\n * strokes clear without sharp spurs. Filled figures share the same silhouettes\n * and use transparent detail cuts of at least one CSS pixel at the small size.\n * Arrow shafts and symmetric heads meet in one compound painted path.\n */\nexport const ICON_STROKE = 1.25;\nexport const ICON_STROKES = { 12: 1, 16: ICON_STROKE, 24: 1.5 } as const;\nexport const ICON_VIEWBOX = 16;\n\nexport const iconInk = {\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: ICON_STROKE,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\",\n  vectorEffect: \"non-scaling-stroke\",\n} as const;\n\nexport const iconFill = {\n  fill: \"currentColor\",\n  stroke: \"none\",\n} as const;\n\nconst maskPositiveFill = { fill: \"white\", stroke: \"none\" } as const;\nconst maskPositiveStroke = {\n  fill: \"none\",\n  stroke: \"white\",\n  strokeWidth: 2,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\",\n  vectorEffect: \"none\",\n} as const;\nconst maskCutoutFill = { fill: \"black\", stroke: \"none\" } as const;\nconst maskCutoutStroke = {\n  fill: \"none\",\n  stroke: \"black\",\n  strokeWidth: 1.25,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\",\n  vectorEffect: \"none\",\n} as const;\n\nexport type IconSize = 12 | 16 | 24;\nexport type IconVariant = \"line\" | \"filled\";\n\nconst styles = stylex.create({\n  icon: {\n    display: \"block\",\n    flexShrink: 0,\n    overflow: \"visible\",\n    color: \"inherit\",\n  },\n  row: {\n    display: \"flex\",\n    gap: \"1.125rem\",\n    alignItems: \"center\",\n    color: vlak.ink,\n  },\n  catalog: {\n    width: \"100%\",\n    display: \"flex\",\n    flexDirection: \"column\",\n    gap: \"1.75rem\",\n    textAlign: \"start\",\n    alignSelf: \"stretch\",\n  },\n  group: {\n    display: \"flex\",\n    flexDirection: \"column\",\n    gap: \"0.75rem\",\n  },\n  groupTitle: {\n    margin: 0,\n    fontSize: \"0.75rem\",\n    fontWeight: 600,\n    letterSpacing: 0,\n    color: vlak.gray,\n    textTransform: \"none\",\n  },\n  grid: {\n    display: \"grid\",\n    gridTemplateColumns: {\n      default: \"repeat(auto-fill, 184px)\",\n      [at480]: \"minmax(0, 1fr)\",\n    },\n    columnGap: vlak.gutter,\n    rowGap: \"1.25rem\",\n    justifyContent: \"start\",\n    width: \"100%\",\n  },\n  cell: {\n    display: \"flex\",\n    flexDirection: \"column\",\n    alignItems: \"flex-start\",\n    gap: \"0.5rem\",\n    width: {\n      default: 184,\n      [at480]: \"100%\",\n    },\n  },\n  pair: {\n    display: \"flex\",\n    alignItems: \"center\",\n    gap: \"1rem\",\n    minHeight: \"1.5rem\",\n  },\n  kin: {\n    display: \"flex\",\n    alignItems: \"center\",\n    gap: \"0.5rem\",\n    minHeight: \"1.5rem\",\n  },\n  label: {\n    margin: 0,\n    fontSize: \"0.6875rem\",\n    lineHeight: 1.3,\n    color: vlak.gray,\n    textTransform: \"none\",\n  },\n});\n\nfunction isClosed(el: MarkEl): boolean {\n  if (el.t === \"rect\" || el.t === \"circle\") return true;\n  if (el.t === \"path\") return /z\\s*$/i.test(el.d.trim());\n  return false;\n}\n\nfunction inkFor(el: MarkEl, variant: IconVariant, size: IconSize) {\n  return (el.t === \"circle\" && el.solid) || (variant === \"filled\" && isClosed(el)) ? iconFill : { ...iconInk, strokeWidth: ICON_STROKES[size] };\n}\n\nfunction renderEl(el: MarkEl, key: number, variant: IconVariant, size: IconSize): React.ReactNode {\n  const ink = inkFor(el, variant, size);\n  switch (el.t) {\n    case \"path\":\n      return <path key={key} d={el.d} {...ink} />;\n    case \"rect\":\n      return <rect key={key} x={el.x} y={el.y} width={el.w} height={el.h} {...ink} />;\n    case \"circle\":\n      return <circle key={key} cx={el.cx} cy={el.cy} r={el.r} {...ink} />;\n    case \"line\":\n      return <line key={key} x1={el.x1} y1={el.y1} x2={el.x2} y2={el.y2} {...ink} />;\n  }\n}\n\nfunction renderMaskEl(el: MarkEl, key: number, cutout: boolean, size: IconSize): React.ReactNode {\n  const ink = cutout\n    ? (isClosed(el) ? maskCutoutFill : { ...maskCutoutStroke, strokeWidth: Math.max(1.25, 16 / size) })\n    : (isClosed(el) ? maskPositiveFill : { ...maskPositiveStroke, strokeWidth: el.strokeWidth ?? maskPositiveStroke.strokeWidth });\n  switch (el.t) {\n    case \"path\":\n      return <path key={key} d={el.d} {...ink} />;\n    case \"rect\":\n      return <rect key={key} x={el.x} y={el.y} width={el.w} height={el.h} {...ink} />;\n    case \"circle\":\n      return <circle key={key} cx={el.cx} cy={el.cy} r={el.r} {...ink} />;\n    case \"line\":\n      return <line key={key} x1={el.x1} y1={el.y1} x2={el.x2} y2={el.y2} {...ink} />;\n  }\n}\n\nexport interface IconProps extends Omit<React.SVGAttributes<SVGSVGElement>, \"children\" | \"rotate\"> {\n  name: IconName;\n  size?: IconSize;\n  /** Optically weighted line, or filled silhouette of the same figure. */\n  variant?: IconVariant;\n  /** Same mark, spun around 8,8. Accordion down is chevron-right at 90. */\n  rotate?: IconRotate;\n}\n\n/** One mark. Size is the drawn square; the viewBox is always 16. */\nexport const Icon = React.forwardRef<SVGSVGElement, IconProps>(function Icon(\n  { name, size = 16, variant = \"line\", rotate, className, style, ...props },\n  ref,\n) {\n  const resolved = resolveIcon(name);\n  const turn = rotate ?? resolved.rotate;\n  const figure = variant === \"filled\"\n    ? ((size === 12 ? smallFilledMarks[resolved.mark] : undefined) ?? filledMarks[resolved.mark] ?? marks[resolved.mark])\n    : marks[resolved.mark];\n  const maskId = `rs-icon-${React.useId().replace(/:/g, \"\")}`;\n  const cutouts = new Set((size === 12 ? smallFilledCutouts[resolved.mark] : undefined) ?? filledCutouts[resolved.mark] ?? []);\n  const sx = rs([\"rs-icon\", variant === \"filled\" && \"rs-icon-filled\", className], styles.icon);\n  return (\n    <svg\n      ref={ref}\n      viewBox=\"0 0 16 16\"\n      width={size}\n      height={size}\n      aria-hidden=\"true\"\n      {...iconInk}\n      strokeWidth={ICON_STROKES[size]}\n      {...props}\n      className={sx.className}\n      /* rem, so the mark scales with the text-size setting; the attributes keep the px ratio for SVG. */\n      style={{ ...sx.style, width: `${size / 16}rem`, height: `${size / 16}rem`, ...style }}\n    >\n      {variant === \"filled\" ? (\n        <>\n          <mask id={maskId} maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"16\" height=\"16\">\n            <rect width=\"16\" height=\"16\" fill=\"black\" stroke=\"none\" />\n            <g transform={turn ? `rotate(${turn} 8 8)` : undefined}>\n              {figure.map((el, i) => renderMaskEl(el, i, cutouts.has(i), size))}\n            </g>\n          </mask>\n          <rect width=\"16\" height=\"16\" fill=\"currentColor\" stroke=\"none\" mask={`url(#${maskId})`} />\n        </>\n      ) : turn ? (\n        <g transform={`rotate(${turn} 8 8)`}>{figure.map((el, i) => renderEl(el, i, variant, size))}</g>\n      ) : (\n        figure.map((el, i) => renderEl(el, i, variant, size))\n      )}\n    </svg>\n  );\n});\n\n/** Inline mark row. One family, current color. */\nexport const Icons = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(function Icons(\n  { className, style, ...props },\n  ref,\n) {\n  const sx = rs([\"rs-icons\", className], styles.row);\n  return <div ref={ref} {...props} className={sx.className} style={{ ...sx.style, ...style }} />;\n});\n\n/** Full family at 12, 16, and 24, line | filled, grouped. Optical center 8,8. */\nexport const IconCatalog = React.forwardRef<HTMLDivElement, { className?: string }>(function IconCatalog(\n  { className },\n  ref,\n) {\n  const catalog = rs([\"rs-icon-catalog\", className], styles.catalog);\n  const group = rs([\"rs-icon-group\"], styles.group);\n  const groupTitle = rs([\"rs-icon-group-title\"], styles.groupTitle);\n  const grid = rs([\"rs-icon-grid\"], styles.grid);\n  const cell = rs([\"rs-icon-cell\"], styles.cell);\n  const pair = rs([\"rs-icon-pair\"], styles.pair);\n  const kin = rs([\"rs-icon-kin\"], styles.kin);\n  const label = rs([\"rs-icon-label\"], styles.label);\n  return (\n    <div ref={ref} className={catalog.className} style={catalog.style}>\n      <p className={label.className} style={label.style}>\n        Line on the left, filled on the right. Each shown at 12, 16, and 24px.\n      </p>\n      {iconGroups.map((g) => (\n        <section\n          key={g.title}\n          id={g.title.toLowerCase().replace(/[^a-z0-9]+/g, \"-\")}\n          className={group.className}\n          style={group.style}\n        >\n          <h3 className={groupTitle.className} style={groupTitle.style}>\n            {g.title}\n          </h3>\n          <p className={label.className} style={label.style}>Line 12 · 16 · 24 / Filled 12 · 16 · 24</p>\n          <div className={grid.className} style={grid.style}>\n            {g.names.map((mark) => (\n              <div key={`${g.title}-${mark}`} className={cell.className} style={cell.style}>\n                <div className={pair.className} style={pair.style}>\n                  <div className={kin.className} style={kin.style} data-variant=\"line\">\n                    <Icon name={mark} size={12} />\n                    <Icon name={mark} size={16} />\n                    <Icon name={mark} size={24} />\n                  </div>\n                  <div className={kin.className} style={kin.style} data-variant=\"filled\">\n                    <Icon name={mark} size={12} variant=\"filled\" />\n                    <Icon name={mark} size={16} variant=\"filled\" />\n                    <Icon name={mark} size={24} variant=\"filled\" />\n                  </div>\n                </div>\n                <span className={label.className} style={label.style}>\n                  {iconLabel(mark)}\n                </span>\n              </div>\n            ))}\n          </div>\n        </section>\n      ))}\n    </div>\n  );\n});\n",
      "type": "registry:component",
      "target": "components/vlak/icons.tsx"
    },
    {
      "path": "vlak/icon-marks.ts",
      "content": "/**\n * Vlak icon figures. 16×16 module, optical center 8,8.\n * Optical refinement, 11 Sep 2026. CurrentColor, open line geometry and\n * rounded terminals; displayed stroke weight is selected by the renderer.\n * Filled kinship fills closed geometry of the same figures. A small set of\n * asymmetric marks has a hand-cut filled silhouette so it keeps the same\n * optical weight as the rest of the family instead of looking half-filled.\n * Chevron left/right: +0.25y optical nudge toward center 8,8.\n * Arrow endpoints: balanced 90° heads with an uninterrupted wing–tip–wing\n * subpath. The shaft meets that apex in the same painted path; it never\n * turns into a head wing, which would create an acute miter spur.\n * Wi-Fi uses two concentric 90° waves at a 4-unit pitch, centered on a\n * solid source point. The line and filled families keep the same silhouette.\n */\n\nexport type MarkEl = (\n  | { t: \"path\"; d: string }\n  | { t: \"rect\"; x: number; y: number; w: number; h: number }\n  | { t: \"circle\"; cx: number; cy: number; r: number; solid?: true }\n  | { t: \"line\"; x1: number; y1: number; x2: number; y2: number }\n) & { /** Optical weight for open strokes in a filled silhouette. */ strokeWidth?: number };\n\n/** Element indexes that become transparent detail cuts in the filled mark. */\nexport type FilledCutouts = Partial<Record<DrawnName, readonly number[]>>;\n\nexport type IconRotate = 90 | 180 | 270;\n\nconst p = (d: string): MarkEl => ({ t: \"path\", d });\nconst r = (x: number, y: number, w: number, h: number): MarkEl => ({ t: \"rect\", x, y, w, h });\nconst o = (cx: number, cy: number, rad: number): MarkEl => ({ t: \"circle\", cx, cy, r: rad });\nconst l = (x1: number, y1: number, x2: number, y2: number): MarkEl => ({ t: \"line\", x1, y1, x2, y2 });\n\n// A narrow clearance preserves the underlying symbol on either side of the slash.\nconst offClearance = p(\"M2.616117 11.616117 L11.616117 2.616117 L13.383883 4.383883 L4.383883 13.383883 Z\");\nconst offSlash = p(\"M2.96967 11.96967 L11.96967 2.96967 L13.03033 4.03033 L4.03033 13.03033 Z\");\n\n// Both arcs share the source point (8, 12.5), not independently fitted centers.\nconst wifiSignal: MarkEl[] = [\n  p(\"M1.636039 6.136039 A9 9 0 0 1 14.363961 6.136039\"),\n  p(\"M4.464466 8.964466 A5 5 0 0 1 11.535534 8.964466\"),\n  { t: \"circle\", cx: 8, cy: 12.5, r: 1, solid: true },\n];\n\n/** Unique drawn marks. Aliases resolve elsewhere. */\nexport const iconNames = [\n  \"copy\",\n  \"copied\",\n  \"chevron-left\",\n  \"chevron-right\",\n  \"close\",\n  \"arrow-left\",\n  \"arrow-right\",\n  \"arrow-up\",\n  \"arrow-down\",\n  \"menu\",\n  \"more\",\n  \"more-h\",\n  \"external\",\n  \"home\",\n  \"chevrons-left\",\n  \"chevrons-right\",\n  \"plus\",\n  \"minus\",\n  \"search\",\n  \"filter\",\n  \"sort\",\n  \"edit\",\n  \"trash\",\n  \"share\",\n  \"download\",\n  \"upload\",\n  \"refresh\",\n  \"undo\",\n  \"redo\",\n  \"save\",\n  \"zoom-in\",\n  \"zoom-out\",\n  \"link\",\n  \"image\",\n  \"quote\",\n  \"code\",\n  \"list-ordered\",\n  \"mail\",\n  \"message\",\n  \"bell\",\n  \"send\",\n  \"inbox\",\n  \"reply\",\n  \"user\",\n  \"users\",\n  \"user-plus\",\n  \"user-minus\",\n  \"file\",\n  \"file-text\",\n  \"folder\",\n  \"folder-open\",\n  \"clipboard\",\n  \"archive\",\n  \"attachment\",\n  \"play\",\n  \"pause\",\n  \"stop\",\n  \"skip-back\",\n  \"skip-forward\",\n  \"volume\",\n  \"mic\",\n  \"video\",\n  \"camera\",\n  \"music\",\n  \"info\",\n  \"warning\",\n  \"error\",\n  \"help\",\n  \"ban\",\n  \"calendar\",\n  \"clock\",\n  \"history\",\n  \"timer\",\n  \"sliders\",\n  \"cog\",\n  \"lock\",\n  \"unlock\",\n  \"key\",\n  \"shield\",\n  \"eye\",\n  \"eye-off\",\n  \"cart\",\n  \"bag\",\n  \"credit-card\",\n  \"tag\",\n  \"dollar\",\n  \"package\",\n  \"grid\",\n  \"list\",\n  \"columns\",\n  \"rows\",\n  \"sidebar\",\n  \"table\",\n  \"layout\",\n  \"expand\",\n  \"sun\",\n  \"moon\",\n  \"star\",\n  \"bookmark\",\n  \"flag\",\n  \"map-pin\",\n  \"globe\",\n  \"phone\",\n  \"printer\",\n  \"terminal\",\n  \"log-in\",\n  \"log-out\",\n  \"grip\",\n  \"power\",\n  \"cloud\",\n  \"database\",\n  \"wifi\",\n  \"panel-right\",\n  \"minimize\",\n  \"cut\",\n  \"paste\",\n  \"duplicate\",\n  \"move\",\n  \"unlink\",\n  \"crop\",\n  \"at\",\n  \"hash\",\n  \"user-check\",\n  \"file-plus\",\n  \"folder-plus\",\n  \"files\",\n  \"volume-off\",\n  \"mic-off\",\n  \"headphones\",\n  \"film\",\n  \"receipt\",\n  \"percent\",\n  \"wallet\",\n  \"monitor\",\n  \"smartphone\",\n  \"wifi-off\",\n  \"layers\",\n  \"window\",\n  \"trending-up\",\n  \"trending-down\",\n  \"compass\",\n  \"map\",\n  \"building\",\n  \"thumbs-up\",\n  \"slash\",\n  \"equal\",\n  \"box\",\n  \"truck\",\n  \"car\",\n  \"van\",\n  \"bicycle\",\n  \"activity\",\n  \"crosshair\",\n  \"pin\",\n] as const;\n\nexport type DrawnName = (typeof iconNames)[number];\n\nexport const marks: Record<DrawnName, MarkEl[]> = {\n  /* Core controls */\n  copy: [p(\"M5.5 3 H13 V10.5\"), r(3, 5.5, 7.5, 7.5)],\n  copied: [p(\"M3 8.25 L6.25 11.5 L13 4.5\")],\n  \"chevron-left\": [p(\"M10.5 3.75 L5.5 8.25 L10.5 12.75\")],\n  \"chevron-right\": [p(\"M5.5 3.75 L10.5 8.25 L5.5 12.75\")],\n  close: [p(\"M4.5 4.5 L11.5 11.5\"), p(\"M11.5 4.5 L4.5 11.5\")],\n\n  /* Navigation — balanced horizontal and vertical reach around 8,8 */\n  \"arrow-left\": [p(\"M13 8 H3 M7 4 L3 8 L7 12\")],\n  \"arrow-right\": [p(\"M3 8 H13 M9 4 L13 8 L9 12\")],\n  \"arrow-up\": [p(\"M8 13 V3 M4 7 L8 3 L12 7\")],\n  \"arrow-down\": [p(\"M8 3 V13 M4 9 L8 13 L12 9\")],\n  menu: [p(\"M3.5 4.5 H12.5\"), p(\"M3.5 8 H12.5\"), p(\"M3.5 11.5 H12.5\")],\n  more: [4.5, 8, 11.5].map(cy => ({ t: \"circle\", cx: 8, cy, r: 1, solid: true })),\n  \"more-h\": [4.5, 8, 11.5].map(cx => ({ t: \"circle\", cx, cy: 8, r: 1, solid: true })),\n  external: [p(\"M6.5 3 H3 V13 H13 V9.5\"), p(\"M8 8 L13 3 M9 3 H13 V7\")],\n  home: [p(\"M3.5 8 L8 3.5 L12.5 8\"), p(\"M5 8 V12.5 H7 V10 H9 V12.5 H11 V8\")],\n  \"chevrons-left\": [p(\"M8.5 3.5 L3.5 8 L8.5 12.5\"), p(\"M12.5 3.5 L7.5 8 L12.5 12.5\")],\n  \"chevrons-right\": [p(\"M3.5 3.5 L8.5 8 L3.5 12.5\"), p(\"M7.5 3.5 L12.5 8 L7.5 12.5\")],\n\n  /* Actions */\n  plus: [p(\"M8 3 V13 M3 8 H13\")],\n  minus: [p(\"M3 8 H13\")],\n  search: [o(6.75, 6.75, 4.25), p(\"M9.7552 9.7552 L13.5 13.5\")],\n  filter: [p(\"M3.5 3.5 H12.5 L9.5 8 V13 L6.5 13 V8 Z\")],\n  sort: [p(\"M3.5 4.5 H12.5\"), p(\"M3.5 8 H10.5\"), p(\"M3.5 11.5 H8\")],\n  edit: [\n    p(\"M9.5 3.5 L12.5 6.5 L6 13 H3.5 V10.5 Z\"),\n    p(\"M8.5 4.5 L11.5 7.5\"),\n    p(\"M4.5 10 L6.5 12\"),\n  ],\n  trash: [\n    p(\"M4.5 4 H11.5\"),\n    p(\"M6.5 4 V3 H9.5 V4\"),\n    p(\"M4.5 5.5 H11.5 V13 H4.5 Z\"),\n    p(\"M6.5 7.5 V11\"),\n    p(\"M8 7.5 V11\"),\n    p(\"M9.5 7.5 V11\"),\n  ],\n  share: [o(4, 8, 1), o(12, 4.5, 1), o(12, 11.5, 1), l(4.8, 7.4, 11.2, 5.1), l(4.8, 8.6, 11.2, 10.9)],\n  download: [p(\"M3.5 11.5 V13 H12.5 V11.5\"), p(\"M8 3.5 V10.5 M5.5 8 L8 10.5 L10.5 8\")],\n  upload: [p(\"M3.5 11.5 V13 H12.5 V11.5\"), p(\"M8 10.5 V3.5 M5.5 6 L8 3.5 L10.5 6\")],\n  refresh: [p(\"M12 8.5 A4 4 0 1 1 8 4.5 H11 M9 2.5 L11 4.5 L9 6.5\")],\n  undo: [p(\"M12.5 11.5 V9 A4.5 4.5 0 0 0 8 4.5 H3.5 M5.5 2.5 L3.5 4.5 L5.5 6.5\")],\n  redo: [p(\"M3.5 11.5 V9 A4.5 4.5 0 0 1 8 4.5 H12.5 M10.5 2.5 L12.5 4.5 L10.5 6.5\")],\n  save: [p(\"M3.5 3.5 H10.5 L12.5 5.5 V12.5 H3.5 Z\"), r(5.5, 3.5, 5, 3), r(5.5, 8.5, 5, 4)],\n  \"zoom-in\": [o(6.75, 6.75, 4.25), p(\"M9.7552 9.7552 L13.5 13.5\"), p(\"M6.75 4.75 V8.75 M4.75 6.75 H8.75\")],\n  \"zoom-out\": [o(6.75, 6.75, 4.25), p(\"M9.7552 9.7552 L13.5 13.5\"), p(\"M4.75 6.75 H8.75\")],\n\n  /* Editing */\n  link: [r(2.5, 6, 6, 4), r(7.5, 6, 6, 4)],\n  image: [r(2.5, 3.5, 11, 9), o(5.5, 6.5, 1), p(\"M3.5 12 L6 8.5 L8.5 10.5 L11 7 L13.5 12\")],\n  quote: [\n    r(3.5, 4.5, 3, 3.5),\n    p(\"M3.5 8 L3.5 11.5 L6.5 8\"),\n    r(9.5, 4.5, 3, 3.5),\n    p(\"M9.5 8 L9.5 11.5 L12.5 8\"),\n  ],\n  code: [p(\"M6 3.5 L3 8 L6 12.5\"), p(\"M10 3.5 L13 8 L10 12.5\")],\n  \"list-ordered\": [\n    p(\"M7 4.75 H13.5\"),\n    p(\"M7 11.25 H13.5\"),\n    p(\"M2.75 4 L4 3.25 V6.5 M2.75 6.5 H5.25\"),\n    p(\"M2.75 10 A1.25 1.25 0 0 1 5.25 10 L2.75 12.5 H5.25\"),\n  ],\n\n  /* Communication */\n  mail: [r(2.5, 4.5, 11, 7), p(\"M2.5 4.5 L8 9 L13.5 4.5\")],\n  message: [p(\"M2.5 3.5 H13.5 V11 H8 L5.5 13.5 V11 H2.5 Z\")],\n  bell: [p(\"M4.75 6 A3.25 3.25 0 0 1 11.25 6 V8.75 C11.25 9.75 11.75 10.5 12.5 11.5 H3.5 C4.25 10.5 4.75 9.75 4.75 8.75 Z\"), p(\"M6.5 13 C7 14 9 14 9.5 13\")],\n  send: [p(\"M2.5 3.5 L13.5 8 L2.5 12.5 L5.5 8 Z\"), p(\"M5.5 8 H10.5\")],\n  inbox: [p(\"M3.5 6.5 V12.5 H12.5 V6.5\"), p(\"M3.5 6.5 L6.5 10 H9.5 L12.5 6.5\")],\n  reply: [p(\"M11.5 5 V8 H3.5 M7 4.5 L3.5 8 L7 11.5\")],\n\n  /* People */\n  user: [o(8, 4.75, 2.25), p(\"M3.5 13 V11.75 C3.5 10 5.5 8.75 8 8.75 C10.5 8.75 12.5 10 12.5 11.75 V13\")],\n  users: [\n    o(6, 4.75, 1.75),\n    p(\"M2.5 13.5 V10.75 L6 9.25 L9.5 10.75 V13.5\"),\n    o(10.75, 4.75, 1.5),\n    p(\"M9.25 13.5 V11.25 L11.75 9.75 L14 11.25 V13.5\"),\n  ],\n  \"user-plus\": [\n    o(6, 4.75, 1.75),\n    p(\"M2.5 13.5 V10.75 L6 9.25 L9.5 10.75 V13.5\"),\n    p(\"M12.625 6.75 V11.25\"),\n    p(\"M10.75 9 H14.5\"),\n  ],\n  \"user-minus\": [o(6, 4.75, 1.75), p(\"M2.5 13.5 V10.75 L6 9.25 L9.5 10.75 V13.5\"), p(\"M10.75 9 H14.5\")],\n\n  /* Files */\n  file: [p(\"M5 2.5 H9.5 L12.5 5.5 V13.5 H5 Z\"), p(\"M9.5 2.5 V5.5 H12.5\")],\n  \"file-text\": [\n    p(\"M5 2.5 H9.5 L12.5 5.5 V13.5 H5 Z\"),\n    p(\"M9.5 2.5 V5.5 H12.5\"),\n    p(\"M6.5 8 H11\"),\n    p(\"M6.5 10 H11\"),\n    p(\"M6.5 12 H9.5\"),\n  ],\n  folder: [p(\"M2.5 5.5 H6 L7.5 4 H13.5 V12.5 H2.5 Z\")],\n  \"folder-open\": [p(\"M2.5 6 V4.5 H6 L7.5 3 H12.5 V6\"), p(\"M2.5 6 H13.5 L12 13 H2.5 Z\")],\n  clipboard: [r(4, 3.5, 8, 10.5), r(6, 2.5, 4, 2)],\n  archive: [r(2.5, 3.5, 11, 3), p(\"M3.5 6.5 V13 H12.5 V6.5\"), p(\"M6.5 8.5 H9.5\")],\n  attachment: [p(\"M5 8 V10.5 A3 3 0 0 0 11 10.5 V4.75 A2 2 0 0 0 7 4.75 V10 A1 1 0 0 0 9 10 V6.5\")],\n\n  /* Media */\n  play: [p(\"M6 3.5 L13 8 L6 12.5 Z\")],\n  pause: [r(4, 3.5, 2.5, 9), r(9.5, 3.5, 2.5, 9)],\n  stop: [r(4.5, 4.5, 7, 7)],\n  \"skip-back\": [p(\"M3.5 3.5 V12.5\"), p(\"M12.5 3.5 L6.5 8 L12.5 12.5 Z\")],\n  \"skip-forward\": [p(\"M12.5 3.5 V12.5\"), p(\"M3.5 3.5 L9.5 8 L3.5 12.5 Z\")],\n  volume: [p(\"M3.5 6.5 H6 L9 3.5 V12.5 L6 9.5 H3.5 Z\"), p(\"M11 5.5 A3 3 0 0 1 11 10.5\")],\n  mic: [p(\"M6 4.5 A2 2 0 0 1 10 4.5 V7.5 A2 2 0 0 1 6 7.5 Z\"), p(\"M4 7.5 A4 4 0 0 0 12 7.5\"), p(\"M8 11.5 V13.5\"), p(\"M6 13.5 H10\")],\n  video: [r(2.5, 4.5, 8, 7), p(\"M10.5 6.5 L13.5 4.5 V11.5 L10.5 9.5\")],\n  camera: [r(2.5, 4.5, 11, 7), p(\"M6 4.5 L7 3 H9 L10 4.5\"), o(8, 8, 2)],\n  music: [o(5.5, 11.5, 1.5), o(11, 10, 1.5), p(\"M7 11.5 V3.5 H12.5 V10\")],\n\n  /* Status */\n  info: [o(8, 8, 5.5), p(\"M8 7.5 V11\"), p(\"M8 5 V6\")],\n  warning: [p(\"M8 2.5 L13.5 13.5 H2.5 Z\"), p(\"M8 6.5 V9.5\"), p(\"M8 11.5 V12.5\")],\n  error: [o(8, 8, 5.5), p(\"M6 6 L10 10\"), p(\"M10 6 L6 10\")],\n  help: [o(8, 8, 5.5), p(\"M6.5 6.5 A1.5 1.5 0 1 1 8.5 8 L8 9.5\"), p(\"M8 11.5 V12\")],\n  ban: [o(8, 8, 5.5), p(\"M4.5 4.5 L11.5 11.5\")],\n\n  /* Time */\n  calendar: [r(3, 4.5, 10, 9), p(\"M3 7.5 H13\"), p(\"M6 3 V5.5\"), p(\"M10 3 V5.5\")],\n  clock: [o(8, 8, 5.5), p(\"M8 8 L8 5\"), p(\"M8 8 L11 9.5\")],\n  history: [p(\"M8 12.5 C10.5 12.5 12.5 10.5 12.5 8 C12.5 5.5 10.5 3.5 8 3.5 C6 3.5 4.5 4.5 3.5 5.5 M3.5 2.5 V5.5 H6.5\")],\n  timer: [p(\"M6.5 2.5 H9.5\"), p(\"M8 2.5 V4\"), o(8, 8.5, 4.5), p(\"M8 8.5 L10 7\")],\n\n  /* Settings */\n  sliders: [p(\"M2.5 4.5 H13.5\"), p(\"M2.5 8 H13.5\"), p(\"M2.5 11.5 H13.5\"), r(9.5, 3, 3, 3), r(3.5, 6.5, 3, 3), r(7.5, 10, 3, 3)],\n  cog: [\n    p(\"M6.5 2 H9.5 L9.85 3.65 L11 4.3 L12.6 3.8 L14.1 6.4 L12.85 7.5 V8.5 L14.1 9.6 L12.6 12.2 L11 11.7 L9.85 12.35 L9.5 14 H6.5 L6.15 12.35 L5 11.7 L3.4 12.2 L1.9 9.6 L3.15 8.5 V7.5 L1.9 6.4 L3.4 3.8 L5 4.3 L6.15 3.65 Z\"),\n    o(8, 8, 2.25),\n  ],\n  lock: [r(4, 7, 8, 6), p(\"M5.5 7 V5 A2.5 2.5 0 0 1 10.5 5 V7\")],\n  unlock: [r(4, 7, 8, 6), p(\"M5.5 7 V5 A2.5 2.5 0 0 1 10.5 5\")],\n  key: [o(5.5, 10, 2.5), p(\"M7.5 8.5 L13.5 2.5\"), p(\"M11 5 L13 7\")],\n  shield: [p(\"M8 2.5 L13 5 V9 L8 13.5 L3 9 V5 Z\")],\n  eye: [p(\"M2 8 C3.5 5.5 5.5 4.25 8 4.25 C10.5 4.25 12.5 5.5 14 8 C12.5 10.5 10.5 11.75 8 11.75 C5.5 11.75 3.5 10.5 2 8 Z\"), o(8, 8, 1.75)],\n  \"eye-off\": [p(\"M2 8 C3.5 5.5 5.5 4.25 8 4.25 C10.5 4.25 12.5 5.5 14 8 C12.5 10.5 10.5 11.75 8 11.75 C5.5 11.75 3.5 10.5 2 8 Z\"), o(8, 8, 1.75), p(\"M3.5 12.5 L12.5 3.5\")],\n\n  /* Commerce */\n  cart: [p(\"M3 4 H4.5 L6 11 H12 L13.5 6 H5.5\"), o(6.5, 13, 1), o(11.5, 13, 1)],\n  bag: [p(\"M4.5 6 H11.5 L12.5 13.5 H3.5 Z\"), p(\"M6 6 V4.5 H10 V6\")],\n  \"credit-card\": [r(2.5, 4.5, 11, 7), p(\"M2.5 7 H13.5\")],\n  tag: [p(\"M3.5 7 L7 3.5 H13 V9.5 L9.5 13 Z\"), o(10.5, 6, 1)],\n  dollar: [p(\"M8 3.5 V12.5\"), p(\"M10.5 5 H6.5 V7.5 H9.5 V10.5 H5.5\")],\n  package: [\n    p(\"M8 2.5 L12.5 5.5 V10.5 L8 13.5 L3.5 10.5 V5.5 Z\"),\n    p(\"M3.5 5.5 L8 8.5 L12.5 5.5\"),\n    p(\"M8 8.5 V13.5\"),\n  ],\n\n  /* Layout */\n  grid: [r(2.5, 2.5, 4.5, 4.5), r(9, 2.5, 4.5, 4.5), r(2.5, 9, 4.5, 4.5), r(9, 9, 4.5, 4.5)],\n  list: [p(\"M5.5 4.5 H13\"), p(\"M5.5 8 H13\"), p(\"M5.5 11.5 H13\"), p(\"M3 4.5 H4\"), p(\"M3 8 H4\"), p(\"M3 11.5 H4\")],\n  columns: [r(2.5, 3.5, 5, 9), r(8.5, 3.5, 5, 9)],\n  rows: [r(2.5, 2.5, 11, 4.5), r(2.5, 9, 11, 4.5)],\n  sidebar: [r(2.5, 3.5, 11, 9), p(\"M6.5 3.5 V12.5\")],\n  table: [r(2.5, 3.5, 11, 9), p(\"M2.5 7 H13.5\"), p(\"M2.5 10.5 H13.5\"), p(\"M6.5 3.5 V12.5\")],\n  layout: [r(2.5, 3.5, 11, 9), p(\"M2.5 6.5 H13.5\"), p(\"M8 6.5 V12.5\")],\n  expand: [\n    p(\"M3.5 6.5 V3.5 H6.5\"),\n    p(\"M9.5 3.5 H12.5 V6.5\"),\n    p(\"M12.5 9.5 V12.5 H9.5\"),\n    p(\"M6.5 12.5 H3.5 V9.5\"),\n  ],\n\n  /* System */\n  sun: [\n    o(8, 8, 2.75),\n    p(\"M8 2 V3.5\"),\n    p(\"M8 12.5 V14\"),\n    p(\"M2 8 H3.5\"),\n    p(\"M12.5 8 H14\"),\n    p(\"M3.7574 3.7574 L4.818 4.818\"),\n    p(\"M11.182 11.182 L12.2426 12.2426\"),\n    p(\"M12.2426 3.7574 L11.182 4.818\"),\n    p(\"M4.818 11.182 L3.7574 12.2426\"),\n  ],\n  moon: [p(\"M13.5 8.5 A5.5 5.5 0 1 1 7.5 2.5 A4.5 4.5 0 0 0 13.5 8.5 Z\")],\n  star: [p(\"M8 2.5 L9.6 6.4 H13.5 L10.5 8.8 L11.6 12.8 L8 10.4 L4.4 12.8 L5.5 8.8 L2.5 6.4 H6.4 Z\")],\n  bookmark: [p(\"M5 2.5 V13.5 L8 11 L11 13.5 V2.5 Z\")],\n  flag: [p(\"M4.5 2.5 V13.5\"), p(\"M4.5 2.5 H12.5 L10.5 5.5 L12.5 8.5 H4.5\")],\n  \"map-pin\": [\n    p(\"M8 2.5 A3.5 3.5 0 0 1 11.5 6 C11.5 8.5 8 13.5 8 13.5 C8 13.5 4.5 8.5 4.5 6 A3.5 3.5 0 0 1 8 2.5 Z\"),\n    o(8, 6, 1.25),\n  ],\n  globe: [\n    o(8, 8, 5.5),\n    p(\"M8 2.5 C5.5 5 5.5 11 8 13.5\"),\n    p(\"M8 2.5 C10.5 5 10.5 11 8 13.5\"),\n    p(\"M2.5 8 H13.5\"),\n  ],\n  phone: [r(5, 2.5, 6, 11), p(\"M6.5 12 H9.5\")],\n  printer: [r(5.5, 2.5, 5, 5.5), p(\"M3.5 8 H12.5 V11.5 H3.5 Z\"), p(\"M6 10.5 H10\"), r(5.5, 11.5, 5, 2.5)],\n  terminal: [r(2.5, 3.5, 11, 9), p(\"M4.5 6.5 L6.5 8 L4.5 9.5\"), p(\"M8 10 H11.5\")],\n  \"log-in\": [p(\"M8.5 3.5 H13.5 V12.5 H8.5\"), p(\"M2.5 8 H9.5 M7 5.5 L9.5 8 L7 10.5\")],\n  \"log-out\": [p(\"M7.5 3.5 H2.5 V12.5 H7.5\"), p(\"M6.5 8 H13.5 M11 5.5 L13.5 8 L11 10.5\")],\n  grip: [o(5.5, 4, 0.9), o(10.5, 4, 0.9), o(5.5, 8, 0.9), o(10.5, 8, 0.9), o(5.5, 12, 0.9), o(10.5, 12, 0.9)],\n  power: [p(\"M8 3.5 V8\"), p(\"M5 5.5 A4.5 4.5 0 1 0 11 5.5\")],\n  cloud: [p(\"M4 10.5 H12.5 A2 2 0 0 0 12.5 7 A3 3 0 0 0 6.5 6.5 A2.5 2.5 0 0 0 4 10.5\")],\n  database: [\n    p(\"M2.5 4.5 A5.5 1.8 0 0 0 13.5 4.5 A5.5 1.8 0 0 0 2.5 4.5\"),\n    p(\"M2.5 4.5 V11.5\"),\n    p(\"M13.5 4.5 V11.5\"),\n    p(\"M2.5 11.5 A5.5 1.8 0 0 0 13.5 11.5\"),\n    p(\"M2.5 8 A5.5 1.8 0 0 0 13.5 8\"),\n  ],\n  wifi: wifiSignal,\n  \"panel-right\": [r(2.5, 3.5, 11, 9), p(\"M9.5 3.5 V12.5\")],\n  minimize: [p(\"M3.5 11.5 H12.5\")],\n  cut: [o(5, 11.5, 1.5), o(11, 11.5, 1.5), p(\"M5.5 10.2 L11 3.5\"), p(\"M10.5 10.2 L5 3.5\")],\n  paste: [\n    r(4.5, 4.5, 8, 9),\n    r(6, 2.5, 5, 2.5),\n    p(\"M6.5 7.5 H10.5\"),\n    p(\"M6.5 9.75 H10.5\"),\n    p(\"M6.5 12 H9.5\"),\n  ],\n  duplicate: [r(3, 5, 8, 8), r(5.5, 2.5, 8, 8)],\n  move: [\n    p(\"M8 2.5 V13.5 M2.5 8 H13.5 M6 4.5 L8 2.5 L10 4.5 M6 11.5 L8 13.5 L10 11.5 M4.5 6 L2.5 8 L4.5 10 M11.5 6 L13.5 8 L11.5 10\"),\n  ],\n  unlink: [r(2.5, 6, 5, 4), r(8.5, 6, 5, 4), p(\"M4 12 L12 4\")],\n  crop: [p(\"M4.5 2.5 V11.5 H13.5\"), p(\"M2.5 4.5 H11.5 V13.5\")],\n  at: [\n    o(8, 8, 2.25),\n    p(\"M10.25 8 V10.5 H11.25 C12.75 10.5 13.5 9.5 13.5 8\"),\n    p(\"M11.5 12 A5.5 5.5 0 1 1 13.5 8\"),\n  ],\n  hash: [p(\"M6.5 3.5 L5.5 12.5\"), p(\"M10.5 3.5 L9.5 12.5\"), p(\"M4 6.5 H12\"), p(\"M3.5 9.5 H11.5\")],\n  \"user-check\": [o(6, 4.75, 1.75), p(\"M2.5 13.5 V10.75 L6 9.25 L9.5 10.75 V13.5\"), p(\"M10.75 8.75 L12.25 10.25 L14.5 7.5\")],\n  \"file-plus\": [\n    p(\"M5 2.5 H9.5 L12.5 5.5 V13.5 H5 Z\"),\n    p(\"M9.5 2.5 V5.5 H12.5\"),\n    p(\"M8 7 V10.5\"),\n    p(\"M6.25 8.75 H9.75\"),\n  ],\n  \"folder-plus\": [p(\"M2.5 5.5 H6 L7.5 4 H13.5 V12.5 H2.5 Z\"), p(\"M8 7 V10.5\"), p(\"M6.25 8.75 H9.75\")],\n  files: [r(3, 4.5, 7.5, 9), r(5.5, 2.5, 7.5, 9)],\n  \"volume-off\": [p(\"M3.5 6.5 H6 L9 3.5 V12.5 L6 9.5 H3.5 Z\"), p(\"M3.5 12.5 L12.5 3.5\")],\n  \"mic-off\": [p(\"M6 4.5 A2 2 0 0 1 10 4.5 V7.5 A2 2 0 0 1 6 7.5 Z\"), p(\"M4 7.5 A4 4 0 0 0 12 7.5\"), p(\"M8 11.5 V13.5\"), p(\"M6 13.5 H10\"), p(\"M3.5 12.5 L12.5 3.5\")],\n  headphones: [p(\"M4 8.5 V12 H6 V8.5\"), p(\"M10 8.5 V12 H12 V8.5\"), p(\"M4 8.5 A4 4 0 0 1 12 8.5\")],\n  film: [\n    r(2.5, 3.5, 11, 9),\n    p(\"M5.5 3.5 V12.5\"),\n    p(\"M10.5 3.5 V12.5\"),\n    p(\"M2.5 6.5 H5.5\"),\n    p(\"M2.5 9.5 H5.5\"),\n    p(\"M10.5 6.5 H13.5\"),\n    p(\"M10.5 9.5 H13.5\"),\n  ],\n  receipt: [r(4.5, 2.5, 7, 11), p(\"M4.5 13.5 L6 12.5 L7.5 13.5 L9 12.5 L11.5 13.5\"), p(\"M6 6 H10\"), p(\"M6 8.5 H10\")],\n  percent: [p(\"M4.5 11.5 L11.5 4.5\"), o(5.5, 5.5, 1.5), o(10.5, 10.5, 1.5)],\n  wallet: [r(2.5, 5.5, 11, 7), p(\"M2.5 5.5 L4 3.5 H13.5 V5.5\"), r(9.5, 7.5, 4, 3)],\n  monitor: [r(2.5, 3.5, 11, 7.5), p(\"M8 11 V13\"), p(\"M5.5 13 H10.5\")],\n  smartphone: [r(5, 1.5, 6, 13), p(\"M7 12.5 H9\")],\n  \"wifi-off\": [\n    ...wifiSignal,\n    p(\"M3.5 12.5 L12.5 3.5\"),\n  ],\n  layers: [\n    p(\"M8 2.5 L13.5 5.5 L8 8.5 L2.5 5.5 Z\"),\n    p(\"M3.5 8 L8 10.5 L12.5 8\"),\n    p(\"M3.5 10.5 L8 13 L12.5 10.5\"),\n  ],\n  window: [r(2.5, 3.5, 11, 9), p(\"M2.5 6.5 H13.5\")],\n  \"trending-up\": [p(\"M2.5 10.5 L6.5 6.5 L9 9 L13.5 4.5 M10.5 4.5 H13.5 V7.5\")],\n  \"trending-down\": [p(\"M2.5 5.5 L6.5 9.5 L9 7 L13.5 11.5 M10.5 11.5 H13.5 V8.5\")],\n  compass: [o(8, 8, 5.5), p(\"M10.75 5.25 L9 9 L5.25 10.75 L7 7 Z\"), p(\"M7 7 L9 9\")],\n  map: [\n    p(\"M2.5 4.5 L6 3.5 L10 5 L13.5 3.5 V12.5 L10 13.5 L6 12 L2.5 13.5 Z\"),\n    p(\"M6 3.5 V12\"),\n    p(\"M10 5 V13.5\"),\n  ],\n  building: [\n    p(\"M3.5 13.5 V5 L8 2.5 L12.5 5 V13.5\"),\n    p(\"M3.5 13.5 H12.5\"),\n    p(\"M6 7 H7\"),\n    p(\"M9 7 H10\"),\n    p(\"M6 9.5 H7\"),\n    p(\"M9 9.5 H10\"),\n    p(\"M7.5 11.5 V13.5\"),\n  ],\n  \"thumbs-up\": [\n    r(3, 7.5, 2.5, 5.5),\n    p(\"M5.5 8 L7.25 5.75 L7.75 3 H9.25 L10 7.5 H12.75 L11.75 13 H5.5 Z\"),\n    p(\"M3.75 10.5 H5.5\"),\n  ],\n  slash: [p(\"M5 13 L11 3\")],\n  equal: [p(\"M3.5 6 H12.5\"), p(\"M3.5 10 H12.5\")],\n  box: [r(3.5, 3.5, 9, 9)],\n  /* Transportation shares a wheel baseline and a side profile on the same module. */\n  truck: [\n    r(1.5, 4, 8, 5.5),\n    p(\"M9.5 6 H12 L14.5 8.5 V9.5 H9.5 Z\"),\n    p(\"M10.5 6 V8 H14\"),\n    o(4.5, 11, 1.5),\n    o(11.5, 11, 1.5),\n  ],\n  car: [\n    p(\"M1.5 9.5 V8 L3.5 7.5 L5 4.5 H10 L12 7.5 L14.5 8 V9.5 Z\"),\n    p(\"M3.5 7.5 H12 M7.5 4.5 V7.5\"),\n    o(4.5, 11, 1.5),\n    o(11.5, 11, 1.5),\n  ],\n  van: [\n    p(\"M1.5 4.5 H10.5 L14.5 8 V9.5 H1.5 Z\"),\n    p(\"M9 4.5 V9.5\"),\n    p(\"M10.5 5.75 V7.5 H12.5 Z\"),\n    o(4.5, 11, 1.5),\n    o(11.5, 11, 1.5),\n  ],\n  bicycle: [\n    o(3.5, 11, 2.5),\n    o(12.5, 11, 2.5),\n    p(\"M3.5 11 L6.5 6.5 H11 L8 11 H3.5 M6.5 6.5 L8 11\"),\n    p(\"M6.5 6.5 L6 4.5 M4.75 4.5 H7.5\"),\n    p(\"M10.5 3.5 H12.5 V5 H11 L12.5 11\"),\n  ],\n  activity: [p(\"M2.5 8 H4.5 L6.5 4 L9.5 12 L11.5 8 H13.5\")],\n  crosshair: [\n    o(8, 8, 3.5),\n    p(\"M8 2.5 V4.5\"),\n    p(\"M8 11.5 V13.5\"),\n    p(\"M2.5 8 H4.5\"),\n    p(\"M11.5 8 H13.5\"),\n    o(8, 8, 0.6),\n  ],\n  pin: [o(8, 5.5, 2.5), p(\"M8 8 V13.5\")],\n};\n\n/**\n * Optical filled cuts for figures whose line construction is intentionally\n * open. These are silhouettes of the same marks, not a second icon family.\n * Every other mark continues to derive its fill directly from `marks`.\n */\nexport const filledMarks: Partial<Record<DrawnName, MarkEl[]>> = {\n  truck: [\n    marks.truck[0]!, marks.truck[1]!,\n    p(\"M10.5 7 H11.7 L13.2 8.5 H10.5 Z\"),\n    marks.truck[3]!, marks.truck[4]!,\n  ],\n  car: [\n    marks.car[0]!, p(\"M5.6 5.5 H9.45 L10.45 7 H4.85 Z\"),\n    marks.car[2]!, marks.car[3]!,\n  ],\n  van: [\n    marks.van[0]!, marks.van[1]!, marks.van[2]!,\n    marks.van[3]!, marks.van[4]!,\n  ],\n  bicycle: [\n    marks.bicycle[0]!, o(3.5, 11, 1.25),\n    marks.bicycle[1]!, o(12.5, 11, 1.25),\n    // Closed 1.25-unit frame members leave the wheel and frame apertures open.\n    p(\"M2.98 10.65 L5.98 6.15 L7.02 6.85 L4.02 11.35 Z\"),\n    r(6.5, 5.875, 4.5, 1.25),\n    p(\"M10.48 6.15 L7.48 10.65 L8.52 11.35 L11.52 6.85 Z\"),\n    r(3.5, 10.375, 4.5, 1.25),\n    p(\"M5.91 6.7 L7.41 11.2 L8.59 10.8 L7.09 6.3 Z\"),\n    p(\"M5.4 4.65 L5.9 6.65 L7.1 6.35 L6.6 4.35 Z\"),\n    r(4.75, 3.875, 2.75, 1.25),\n    p(\"M10.5 2.875 H13.125 V5.625 H11 V4.375 H11.875 V4.125 H10.5 Z\"),\n    p(\"M10.394 5.15 L11.894 11.15 L13.106 10.85 L11.606 4.85 Z\"),\n  ],\n  // Keep the fold inside the paper plane so its pointed endpoint stays solid.\n  send: [marks.send[0]!, p(\"M5.5 8 H10.5\")],\n  link: [r(2.25, 5.5, 6.5, 5), r(3.75, 7, 3.5, 2), r(7.25, 5.5, 6.5, 5), r(8.75, 7, 3.5, 2)],\n  unlink: [\n    r(2.25, 5.5, 6.5, 5),\n    r(3.75, 7, 3.5, 2),\n    r(7.25, 5.5, 6.5, 5),\n    r(8.75, 7, 3.5, 2),\n    p(\"M4 12 L12 4\"),\n  ],\n  search: [marks.search[0]!, o(6.75, 6.75, 2.5), marks.search[1]!],\n  \"zoom-in\": [\n    marks.search[0]!,\n    o(6.75, 6.75, 2.75),\n    marks.search[1]!,\n    p(\"M6.75 5.25 V8.25 M5.25 6.75 H8.25\"),\n  ],\n  \"zoom-out\": [\n    marks.search[0]!,\n    o(6.75, 6.75, 2.75),\n    marks.search[1]!,\n    p(\"M5.25 6.75 H8.25\"),\n  ],\n  \"chevrons-left\": [p(\"M7.75 3.75 L3.25 8.25 L7.75 12.75\"), p(\"M12.75 3.75 L8.25 8.25 L12.75 12.75\")],\n  \"chevrons-right\": [p(\"M3.25 3.75 L7.75 8.25 L3.25 12.75\"), p(\"M8.25 3.75 L12.75 8.25 L8.25 12.75\")],\n  home: [p(\"M3.5 8 L8 3.5 L12.5 8 V13 H9.5 V10 H6.5 V13 H3.5 Z\")],\n  inbox: [p(\"M3.5 6.5 L6.5 10 H9.5 L12.5 6.5 V12.5 H3.5 Z\")],\n  user: [marks.user[0]!, p(\"M3.5 13 V11.75 C3.5 10 5.5 8.75 8 8.75 C10.5 8.75 12.5 10 12.5 11.75 V13 Z\")],\n  users: [\n    o(6, 4.75, 1.75),\n    p(\"M2.5 13.5 V10.75 L6 9.25 L9.5 10.75 V13.5 Z\"),\n    o(10.75, 4.75, 1.5),\n    p(\"M9.25 13.5 V11.25 L11.75 9.75 L14 11.25 V13.5 Z\"),\n  ],\n  \"user-plus\": [\n    o(6, 4.75, 1.75),\n    p(\"M2.5 13.5 V10.75 L6 9.25 L9.5 10.75 V13.5 Z\"),\n    p(\"M12.625 6.75 V11.25\"),\n    p(\"M10.75 9 H14.5\"),\n  ],\n  \"user-minus\": [\n    o(6, 4.75, 1.75),\n    p(\"M2.5 13.5 V10.75 L6 9.25 L9.5 10.75 V13.5 Z\"),\n    p(\"M10.75 9 H14.5\"),\n  ],\n  trash: [\n    p(\"M4 4 H12\"),\n    p(\"M6.25 4 V2.75 H9.75 V4\"),\n    p(\"M4.5 5.5 H11.5 V13 H4.5 Z\"),\n    r(5.875, 7.25, 1, 4),\n    r(7.5, 7.25, 1, 4),\n    r(9.125, 7.25, 1, 4),\n  ],\n  save: [\n    p(\"M3.5 3.5 H10.5 L12.5 5.5 V12.5 H3.5 Z\"),\n    r(5.5, 4.5, 4, 2),\n    r(5.5, 8.5, 5, 2.5),\n  ],\n  download: [p(\"M3.5 12 V13 H12.5 V12\"), p(\"M8 3.5 V10 M5.5 7.5 L8 10 L10.5 7.5\")],\n  upload: [p(\"M3.5 12 V13 H12.5 V12\"), p(\"M8 10 V3.5 M5.5 6 L8 3.5 L10.5 6\")],\n  cart: [p(\"M3 4 H4.5 L6 11 H12 L13.5 6 H5.5 Z\"), o(6.5, 13, 1), o(11.5, 13, 1)],\n  flag: [p(\"M4.5 2.5 V13.5\"), p(\"M4.5 2.5 H12.5 L10.5 5.5 L12.5 8.5 H4.5 Z\")],\n  \"map-pin\": [\n    p(\"M8 2.5 A3.5 3.5 0 0 1 11.5 6 C11.5 8.5 8 13.5 8 13.5 C8 13.5 4.5 8.5 4.5 6 A3.5 3.5 0 0 1 8 2.5 Z\"),\n    o(8, 6, 1.25),\n  ],\n  cloud: [p(\"M4 10.5 H12.5 A2 2 0 0 0 12.5 7 A3 3 0 0 0 6.5 6.5 A2.5 2.5 0 0 0 4 10.5 Z\")],\n  \"folder-open\": [p(\"M2.5 6 V4.5 H6 L7.5 3 H12.5 V6\"), p(\"M2.5 6 H13.5 L12 13 H2.5 Z\"), p(\"M3.5 6 H12.75\")],\n  clipboard: [r(4, 3.5, 8, 10.5), r(5, 5, 6, 7.5), r(6, 2.5, 4, 2)],\n  archive: [r(2.5, 3.5, 11, 3), p(\"M3.5 6.5 V13 H12.5 V6.5 Z\"), r(6.5, 8.25, 3, 1.5)],\n  duplicate: [p(\"M5.5 5 V2.5 H13.5 V10.5 H11\"), p(\"M11 5 H3 V13 H11 Z\")],\n  files: [p(\"M5.5 4.5 V2.5 H13 V11.5 H10.5\"), p(\"M10.5 4.5 H3 V13.5 H10.5 Z\")],\n  key: [o(5.5, 10, 2.75), o(5.5, 10, 1), p(\"M7.5 8.5 L13.5 2.5\"), p(\"M11 5 L13 7\")],\n  database: [\n    p(\"M2.5 4.5 A5.5 1.8 0 0 1 13.5 4.5 V11.5 A5.5 1.8 0 0 1 2.5 11.5 Z\"),\n    p(\"M3.5 7.75 A4.5 1.35 0 0 0 12.5 7.75\"),\n    p(\"M3.5 10.5 A4.5 1.35 0 0 0 12.5 10.5\"),\n  ],\n  monitor: [r(2.5, 3.5, 11, 7.5), r(3.75, 4.75, 8.5, 5), p(\"M8 11 V13\"), p(\"M5.5 13 H10.5\")],\n  sun: [marks.sun[0]!, ...marks.sun.slice(1).map(ray => ({ ...ray, strokeWidth: 1.25 }))],\n  moon: [p(\"M13.5 8.5 A5.5 5.5 0 1 1 7.5 2.5 A4.5 4.5 0 0 0 13.5 8.5 Z\")],\n  receipt: [\n    p(\"M4.5 2.5 H11.5 V13.5 L10.25 12.5 L9 13.5 L7.75 12.5 L6.5 13.5 L4.5 12.5 Z\"),\n    p(\"M6 6 H10\"),\n    p(\"M6 8.5 H10\"),\n  ],\n  wallet: [\n    p(\"M2.5 5.5 L4 3.5 H13.5 V12.5 H2.5 Z\"),\n    r(10, 8, 3, 2),\n  ],\n  compass: [\n    o(8, 8, 5.5),\n    o(8, 8, 4),\n    marks.compass[1]!,\n  ],\n  building: [\n    p(\"M3.5 13.5 V5 L8 2.5 L12.5 5 V13.5 Z\"),\n    r(5.5, 6.5, 2, 1.5),\n    r(8.5, 6.5, 2, 1.5),\n    r(5.5, 9.25, 2, 1.5),\n    r(8.5, 9.25, 2, 1.5),\n    r(7.25, 11.5, 1.5, 2),\n  ],\n  at: [\n    p(\"M8 5.75 A2.25 2.25 0 1 1 8 10.25 A2.25 2.25 0 1 1 8 5.75\"),\n    p(\"M10.25 8 V10.5 H11.25 C12.75 10.5 13.5 9.5 13.5 8\"),\n    p(\"M11.5 12 A5.5 5.5 0 1 1 13.5 8\"),\n  ],\n  \"user-check\": [\n    o(6, 4.75, 1.75),\n    p(\"M2.5 13.5 V10.75 L6 9.25 L9.5 10.75 V13.5 Z\"),\n    p(\"M10.1 8.4 L12.1 10.4 L14.8 7.15 L14 6.5 L12 8.9 L10.85 7.75 Z\"),\n  ],\n  \"thumbs-up\": [\n    r(3, 7.5, 2.5, 5.5),\n    p(\"M5.5 8 L7.25 5.75 L7.75 3 H9.25 L10 7.5 H12.75 L11.75 13 H5.5 Z\"),\n    p(\"M3.75 10.5 H5.5\"),\n  ],\n  crosshair: [\n    o(8, 8, 3.5),\n    o(8, 8, 2),\n    o(8, 8, 0.65),\n    p(\"M8 2.5 V4.5\"),\n    p(\"M8 11.5 V13.5\"),\n    p(\"M2.5 8 H4.5\"),\n    p(\"M11.5 8 H13.5\"),\n  ],\n  \"eye-off\": [\n    ...marks.eye,\n    offClearance,\n    offSlash,\n  ],\n  \"volume-off\": [\n    marks.volume[0]!,\n    offClearance,\n    offSlash,\n  ],\n  \"mic-off\": [\n    ...marks.mic,\n    offClearance,\n    offSlash,\n  ],\n  \"wifi-off\": [\n    ...wifiSignal,\n    // A 2.5-unit clearance and a hand-cut 1.5-unit slash keep the signal\n    // recognizable. The family-wide off-state cut erases this small wave.\n    offClearance,\n    offSlash,\n  ],\n};\n\n/** At 12px, two open slots survive rasterization better than three fine cuts. */\nexport const smallFilledMarks: Partial<Record<DrawnName, MarkEl[]>> = {\n  trash: [\n    p(\"M4 4 H12\"),\n    p(\"M6.25 4 V2.75 H9.75 V4\"),\n    p(\"M4.5 5.5 H11.5 V13 H4.5 Z\"),\n    r(5.75, 7.25, 1.5, 4),\n    r(8.75, 7.25, 1.5, 4),\n  ],\n};\n\nexport const smallFilledCutouts: FilledCutouts = { trash: [3, 4] };\n\n/**\n * Negative-space details for the filled family. These are punched through the\n * solid silhouette with an SVG mask, so the detail works on every background\n * and does not depend on light or dark theme colors.\n */\nexport const filledCutouts: FilledCutouts = {\n  truck: [2],\n  car: [1],\n  van: [1, 2],\n  bicycle: [1, 3],\n  link: [1, 3],\n  unlink: [1, 3, 4],\n  search: [1],\n  \"zoom-in\": [1],\n  \"zoom-out\": [1],\n  edit: [1, 2],\n  save: [1, 2],\n  image: [1, 2],\n  mail: [1],\n  send: [1],\n  file: [1],\n  \"file-text\": [1, 2, 3, 4],\n  \"file-plus\": [1, 2, 3],\n  trash: [3, 4, 5],\n  archive: [2],\n  clipboard: [1],\n  camera: [2],\n  film: [1, 2, 3, 4, 5, 6],\n  info: [1, 2],\n  warning: [1, 2],\n  error: [1, 2],\n  help: [1, 2],\n  ban: [1],\n  calendar: [1, 2, 3],\n  clock: [1, 2],\n  timer: [3],\n  eye: [1],\n  \"eye-off\": [1, 2],\n  \"volume-off\": [1],\n  \"mic-off\": [4],\n  \"wifi-off\": [3],\n  \"credit-card\": [1],\n  tag: [1],\n  package: [1, 2],\n  sidebar: [1],\n  \"panel-right\": [1],\n  table: [1, 2, 3],\n  layout: [1, 2],\n  window: [1],\n  \"map-pin\": [1],\n  globe: [1, 2, 3],\n  phone: [1],\n  printer: [2],\n  terminal: [1, 2],\n  paste: [2, 3, 4],\n  \"folder-open\": [2],\n  receipt: [1, 2],\n  wallet: [1],\n  cog: [1],\n  smartphone: [1],\n  compass: [1],\n  map: [1, 2],\n  \"folder-plus\": [1, 2],\n  database: [1, 2],\n  monitor: [1],\n  building: [1, 2, 3, 4, 5],\n  key: [1],\n  \"thumbs-up\": [2],\n  crosshair: [1],\n};\n\nexport const iconAliases = {\n  check: { name: \"copied\" },\n  success: { name: \"copied\" },\n  \"chevron-down\": { name: \"chevron-right\", rotate: 90 },\n  \"chevron-up\": { name: \"chevron-right\", rotate: 270 },\n  x: { name: \"close\" },\n  settings: { name: \"sliders\" },\n  gear: { name: \"cog\" },\n  pencil: { name: \"edit\" },\n  \"panel-left\": { name: \"sidebar\" },\n} as const satisfies Record<string, { name: DrawnName; rotate?: IconRotate }>;\n\nexport type IconAlias = keyof typeof iconAliases;\nexport type IconName = DrawnName | IconAlias;\n\nexport type IconGroup = { title: string; names: IconName[] };\n\nexport const iconGroups: IconGroup[] = [\n  {\n    title: \"Navigation\",\n    names: [\n      \"arrow-left\",\n      \"arrow-right\",\n      \"arrow-up\",\n      \"arrow-down\",\n      \"chevron-left\",\n      \"chevron-right\",\n      \"chevron-up\",\n      \"chevron-down\",\n      \"chevrons-left\",\n      \"chevrons-right\",\n      \"menu\",\n      \"more\",\n      \"more-h\",\n      \"external\",\n      \"home\",\n      \"close\",\n      \"panel-left\",\n      \"panel-right\",\n      \"minimize\",\n      \"move\",\n    ],\n  },\n  {\n    title: \"Actions\",\n    names: [\n      \"plus\",\n      \"minus\",\n      \"search\",\n      \"filter\",\n      \"sort\",\n      \"edit\",\n      \"trash\",\n      \"share\",\n      \"download\",\n      \"upload\",\n      \"refresh\",\n      \"undo\",\n      \"redo\",\n      \"save\",\n      \"copy\",\n      \"copied\",\n      \"zoom-in\",\n      \"zoom-out\",\n      \"cut\",\n      \"paste\",\n      \"duplicate\",\n      \"crop\",\n    ],\n  },\n  { title: \"Editing\", names: [\"link\", \"unlink\", \"image\", \"quote\", \"code\", \"list-ordered\", \"at\", \"hash\"] },\n  { title: \"Communication\", names: [\"mail\", \"message\", \"bell\", \"send\", \"inbox\", \"reply\"] },\n  { title: \"People\", names: [\"user\", \"users\", \"user-plus\", \"user-minus\", \"user-check\"] },\n  {\n    title: \"Files\",\n    names: [\"file\", \"file-text\", \"file-plus\", \"files\", \"folder\", \"folder-open\", \"folder-plus\", \"clipboard\", \"archive\", \"attachment\"],\n  },\n  {\n    title: \"Media\",\n    names: [\n      \"play\",\n      \"pause\",\n      \"stop\",\n      \"skip-back\",\n      \"skip-forward\",\n      \"volume\",\n      \"volume-off\",\n      \"mic\",\n      \"mic-off\",\n      \"video\",\n      \"camera\",\n      \"music\",\n      \"headphones\",\n      \"film\",\n    ],\n  },\n  { title: \"Status\", names: [\"info\", \"warning\", \"error\", \"help\", \"ban\", \"success\", \"slash\", \"equal\"] },\n  { title: \"Time\", names: [\"calendar\", \"clock\", \"history\", \"timer\"] },\n  { title: \"Settings\", names: [\"sliders\", \"cog\", \"lock\", \"unlock\", \"key\", \"shield\", \"eye\", \"eye-off\"] },\n  { title: \"Transportation\", names: [\"truck\", \"car\", \"van\", \"bicycle\"] },\n  { title: \"Commerce\", names: [\"cart\", \"bag\", \"credit-card\", \"tag\", \"dollar\", \"package\", \"receipt\", \"percent\", \"wallet\"] },\n  {\n    title: \"Layout\",\n    names: [\"grid\", \"list\", \"columns\", \"rows\", \"sidebar\", \"panel-left\", \"panel-right\", \"table\", \"layout\", \"expand\", \"window\", \"layers\"],\n  },\n  {\n    title: \"System\",\n    names: [\n      \"sun\",\n      \"moon\",\n      \"star\",\n      \"bookmark\",\n      \"flag\",\n      \"map-pin\",\n      \"pin\",\n      \"globe\",\n      \"phone\",\n      \"printer\",\n      \"terminal\",\n      \"log-in\",\n      \"log-out\",\n      \"grip\",\n      \"power\",\n      \"cloud\",\n      \"database\",\n      \"wifi\",\n      \"wifi-off\",\n      \"monitor\",\n      \"smartphone\",\n      \"compass\",\n      \"map\",\n      \"building\",\n      \"box\",\n      \"activity\",\n      \"crosshair\",\n      \"trending-up\",\n      \"trending-down\",\n      \"thumbs-up\",\n    ],\n  },\n];\n\nexport function resolveIcon(name: IconName): { mark: DrawnName; rotate?: IconRotate } {\n  if (name in iconAliases) {\n    const alias = iconAliases[name as IconAlias];\n    return { mark: alias.name, rotate: \"rotate\" in alias ? alias.rotate : undefined };\n  }\n  return { mark: name as DrawnName };\n}\n\nexport function iconLabel(name: IconName): string {\n  return name.replace(/-/g, \" \").replace(/^./, (c) => c.toUpperCase());\n}\n",
      "type": "registry:file",
      "target": "components/vlak/icon-marks.ts"
    },
    {
      "path": "vlak/styles/icons.css",
      "content": "/* ── icons: generated from packages/react/src/components/icon.tsx ── */\n.rs-icon{display:block;flex-shrink:0;overflow:visible;color:inherit}\n.rs-icons{display:flex;gap:1.125rem;align-items:center;color:var(--text)}\n.rs-icon-catalog{width:100%;display:flex;flex-direction:column;gap:1.75rem;text-align:start;align-self:stretch}\n.rs-icon-group{display:flex;flex-direction:column;gap:0.75rem}\n.rs-icon-group-title{margin:0;font-size:0.75rem;font-weight:600;letter-spacing:0;color:var(--text-secondary);text-transform:none}\n.rs-icon-grid{display:grid;grid-template-columns:repeat(auto-fill, 184px);column-gap:var(--gutter);row-gap:1.25rem;justify-content:start;width:100%}\n@media (max-width: 480px){.rs-icon-grid{grid-template-columns:minmax(0, 1fr)}}\n.rs-icon-cell{display:flex;flex-direction:column;align-items:flex-start;gap:0.5rem;width:184px}\n@media (max-width: 480px){.rs-icon-cell{width:100%}}\n.rs-icon-pair{display:flex;align-items:center;gap:1rem;min-height:1.5rem}\n.rs-icon-kin{display:flex;align-items:center;gap:0.5rem;min-height:1.5rem}\n.rs-icon-label{margin:0;font-size:0.6875rem;line-height:1.3;color:var(--text-secondary);text-transform:none}\n",
      "type": "registry:file",
      "target": "styles/vlak/icons.css"
    }
  ],
  "meta": {
    "vlak": {
      "category": "icons",
      "classes": [
        "rs-icons",
        "rs-icon",
        "rs-icon-catalog",
        "rs-icon-group",
        "rs-icon-group-title",
        "rs-icon-grid",
        "rs-icon-cell",
        "rs-icon-pair",
        "rs-icon-kin",
        "rs-icon-label"
      ],
      "snippet": "<div class=\"rs-icons\"><svg class=\"rs-icon\" viewBox=\"0 0 16 16\" width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5.5 3 H13 V10.5\" vector-effect=\"non-scaling-stroke\"/><rect x=\"3\" y=\"5.5\" width=\"7.5\" height=\"7.5\" vector-effect=\"non-scaling-stroke\"/></svg><svg class=\"rs-icon\" viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5.5 3 H13 V10.5\" vector-effect=\"non-scaling-stroke\"/><rect x=\"3\" y=\"5.5\" width=\"7.5\" height=\"7.5\" vector-effect=\"non-scaling-stroke\"/></svg></div>",
      "cssOnly": false,
      "registryDependencies": [
        "vlak-lib"
      ],
      "aliases": [
        "Icon",
        "Icons",
        "Icon set",
        "Glyphs"
      ],
      "example": "import { Icon, IconCatalog, iconNames } from \"@noorddev/vlak-react\";\n\n<Icon name=\"search\" size={12} />\n<Icon name=\"search\" size={16} />\n<Icon name=\"check\" size={24} variant=\"filled\" />\n<Icon name=\"chevron-right\" rotate={90} />\n<button type=\"button\" aria-label=\"Close\"><Icon name=\"close\" /></button>\n\niconNames; // every drawn mark\n<IconCatalog />",
      "usage": {
        "use": [
          "Chrome marks at 12, 16, or 24: chevrons, close, search, sort, and the rest of the family.",
          "rotate for the down and up chevrons; variant=\"filled\" for the solid kin."
        ],
        "avoid": [
          "Illustration or brand marks; these are compact interface glyphs.",
          "Icons as the only label; add text or an aria-label on the control."
        ]
      },
      "a11y": [
        "Icon renders an inline <svg aria-hidden=\"true\">; it is decorative unless you pass aria-hidden={false}, role=\"img\", and aria-label.",
        "Icon-only controls need an aria-label; the icon never names them."
      ]
    }
  }
}
