{"version":3,"file":"fold-ng-src-devtools.mjs","sources":["../../src/devtools/icon-devtool/icon-devtool.component.ts","../../src/devtools/icon-devtool/icon-devtool.component.html","../../src/devtools/public-api.ts","../../src/devtools/fold-ng-src-devtools.ts"],"sourcesContent":["import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  inject,\n  output,\n  signal,\n} from \"@angular/core\";\n// Cross-entry imports resolve through the package name, not a relative path\n// into `../../components`: `fold-ng/devtools` is its own ng-packagr entry point\n// (own rootDir), so it depends on the primary `fold-ng` entry the same way any\n// consumer would. The monorepo's vite/vitest alias `fold-ng` → `src/public-api`.\nimport type { FoldIconName } from \"fold-ng\";\nimport {\n  FOLD_BUILTIN_ICON_CATEGORIES,\n  FoldButtonIconComponent,\n  FoldIconComponent,\n  FoldIconRegistry,\n} from \"fold-ng\";\n\n/** A draggable panel position, in viewport pixels (top-left origin). `null`\n *  until the first drag — the panel sits in its default corner via CSS. */\ninterface DevtoolPos {\n  readonly x: number;\n  readonly y: number;\n}\n\nconst SIZE_STEPS = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"] as const;\ntype IconSize = (typeof SIZE_STEPS)[number];\n\n/** Bucket id for registry icons that belong to no built-in category. */\nconst CUSTOM_CATEGORY_ID = \"custom\";\n\n/** A category section rendered in the grid: its label, count, and members. */\ninterface IconCategory {\n  readonly id: string;\n  readonly label: string;\n  readonly names: readonly FoldIconName[];\n}\n\n/** name → built-in category id, for bucketing the live registry by theme. */\nconst CATEGORY_OF_NAME = new Map<string, string>(\n  FOLD_BUILTIN_ICON_CATEGORIES.flatMap((category) =>\n    category.names.map((name) => [name, category.id] as const),\n  ),\n);\n\n/**\n * `<fold-icon-devtool>` — a **dev-only** floating panel that browses the live\n * {@link FoldIconRegistry} (built-ins + whatever the host app has registered),\n * with a search, a preview grid, and a mini playground that builds a\n * `<fold-icon>` snippet and copies it to the clipboard. The panel is **draggable**\n * (grab the header) and **minimisable** (collapses to a pill).\n *\n * **Ship it behind a dev guard.** It is published from the opt-in `fold-ng/devtools`\n * entry so it never lands in a bundle that doesn't ask for it; import it only on a\n * dev path so a production build tree-shakes it away:\n *\n * ```ts\n * import { isDevMode, signal } from \"@angular/core\";\n * protected readonly showIconTool = signal(false);\n * // template: @if (showIconTool()) { <fold-icon-devtool (closed)=\"showIconTool.set(false)\" /> }\n * // …and only reach the import behind `if (isDevMode())`.\n * ```\n *\n * @selector `fold-icon-devtool`\n */\n@Component({\n  selector: \"fold-icon-devtool\",\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [FoldIconComponent, FoldButtonIconComponent],\n  templateUrl: \"./icon-devtool.component.html\",\n  styleUrl: \"./icon-devtool.component.scss\",\n  host: {\n    role: \"dialog\",\n    \"aria-label\": \"Icon devtool\",\n    \"[class.minimized]\": \"minimized()\",\n    \"[style.left.px]\": \"pos()?.x ?? null\",\n    \"[style.top.px]\": \"pos()?.y ?? null\",\n    \"[class.docked]\": \"pos() === null\",\n  },\n})\nexport class FoldIconDevtoolComponent {\n  private readonly registry = inject(FoldIconRegistry);\n\n  /** Emitted when the user closes the panel — the host should stop rendering it. */\n  readonly closed = output();\n\n  protected readonly sizeSteps = SIZE_STEPS;\n\n  /** Collapsed to a pill (header only). */\n  protected readonly minimized = signal(false);\n  /** Free-drag position; `null` = docked in the default corner (CSS). */\n  protected readonly pos = signal<DevtoolPos | null>(null);\n\n  /** The live registry names (built-ins + host-registered), sorted. */\n  private readonly allNames = computed(() => this.registry.names());\n\n  protected readonly query = signal(\"\");\n  /** Names matching the search (case-insensitive substring). */\n  protected readonly matches = computed(() => {\n    const q = this.query().trim().toLowerCase();\n    const names = this.allNames();\n    return q ? names.filter((n) => n.includes(q)) : names;\n  });\n\n  /** Category ids the user has collapsed (folded to their header). */\n  private readonly collapsed = signal<ReadonlySet<string>>(new Set());\n\n  /**\n   * The matches grouped into category sections, in built-in order, with a\n   * trailing **Custom** bucket for host-registered icons. Empty categories are\n   * dropped so a search only shows the themes it actually hit.\n   */\n  protected readonly categories = computed<readonly IconCategory[]>(() => {\n    const buckets = new Map<string, FoldIconName[]>();\n    for (const name of this.matches()) {\n      const id = CATEGORY_OF_NAME.get(name) ?? CUSTOM_CATEGORY_ID;\n      const bucket = buckets.get(id);\n      if (bucket) {\n        bucket.push(name);\n      } else {\n        buckets.set(id, [name]);\n      }\n    }\n    const sections: IconCategory[] = [];\n    for (const category of FOLD_BUILTIN_ICON_CATEGORIES) {\n      const names = buckets.get(category.id);\n      if (names) {\n        sections.push({ id: category.id, label: category.label, names });\n      }\n    }\n    const custom = buckets.get(CUSTOM_CATEGORY_ID);\n    if (custom) {\n      sections.push({ id: CUSTOM_CATEGORY_ID, label: \"Custom\", names: custom });\n    }\n    return sections;\n  });\n\n  /** Whether a category section is folded to its header. */\n  protected isCollapsed(id: string): boolean {\n    return this.collapsed().has(id);\n  }\n\n  protected toggleCategory(id: string): void {\n    this.collapsed.update((set) => {\n      const next = new Set(set);\n      if (!next.delete(id)) {\n        next.add(id);\n      }\n      return next;\n    });\n  }\n\n  /** The icon selected into the playground (empty = none). */\n  /** The icon under the playground — `null`, not `\"\"`, for \"none picked\": an\n   *  empty string is not a name, and the template already branches on it. */\n  protected readonly selected = signal<FoldIconName | null>(null);\n  /** Playground size preset. */\n  protected readonly size = signal<IconSize>(\"md\");\n\n  /** The snippet the copy button writes — size only emitted when non-default. */\n  protected readonly snippet = computed(() => {\n    const name = this.selected();\n    if (!name) {\n      return \"\";\n    }\n    const size = this.size();\n    return size === \"md\"\n      ? `<fold-icon name=\"${name}\" />`\n      : `<fold-icon name=\"${name}\" size=\"${size}\" />`;\n  });\n\n  /** Flashes true briefly after a successful copy. */\n  protected readonly copied = signal(false);\n\n  protected select(name: FoldIconName): void {\n    this.selected.set(name);\n  }\n\n  protected setSize(size: IconSize): void {\n    this.size.set(size);\n  }\n\n  protected onSearch(event: Event): void {\n    const target = event.target;\n    if (target instanceof HTMLInputElement) {\n      this.query.set(target.value);\n    }\n  }\n\n  protected copy(): void {\n    const snippet = this.snippet();\n    if (!snippet) {\n      return;\n    }\n    void navigator.clipboard.writeText(snippet).then(() => {\n      this.copied.set(true);\n      setTimeout(() => this.copied.set(false), 1200);\n    });\n  }\n\n  protected toggleMinimize(): void {\n    this.minimized.update((m) => !m);\n  }\n\n  protected close(): void {\n    this.closed.emit();\n  }\n\n  // ── Drag (grab the header) ────────────────────────────────────────────\n  private dragDx = 0;\n  private dragDy = 0;\n\n  protected onDragStart(event: PointerEvent): void {\n    const target = event.target;\n    const handle = event.currentTarget;\n    if (!(target instanceof HTMLElement) || !(handle instanceof HTMLElement)) {\n      return;\n    }\n    // Ignore drags that start on an interactive header control.\n    if (target.closest(\"button\")) {\n      return;\n    }\n    const host = handle.closest(\"fold-icon-devtool\");\n    if (!host) {\n      return;\n    }\n    const rect = host.getBoundingClientRect();\n    this.dragDx = event.clientX - rect.left;\n    this.dragDy = event.clientY - rect.top;\n    handle.setPointerCapture(event.pointerId);\n    event.preventDefault();\n  }\n\n  protected onDragMove(event: PointerEvent): void {\n    const handle = event.currentTarget;\n    if (\n      !(handle instanceof HTMLElement) ||\n      !handle.hasPointerCapture(event.pointerId)\n    ) {\n      return;\n    }\n    const width = window.innerWidth;\n    const height = window.innerHeight;\n    const x = Math.max(0, Math.min(event.clientX - this.dragDx, width - 40));\n    const y = Math.max(0, Math.min(event.clientY - this.dragDy, height - 40));\n    this.pos.set({ x, y });\n  }\n\n  protected onDragEnd(event: PointerEvent): void {\n    const handle = event.currentTarget;\n    if (\n      handle instanceof HTMLElement &&\n      handle.hasPointerCapture(event.pointerId)\n    ) {\n      handle.releasePointerCapture(event.pointerId);\n    }\n  }\n}\n","<header\n  class=\"dt-head\"\n  (pointerdown)=\"onDragStart($event)\"\n  (pointermove)=\"onDragMove($event)\"\n  (pointerup)=\"onDragEnd($event)\"\n  (pointercancel)=\"onDragEnd($event)\"\n>\n  <span class=\"dt-grip\" aria-hidden=\"true\"></span>\n  <span class=\"dt-title\">\n    <fold-icon name=\"grid\" size=\"sm\" aria-hidden=\"true\" />\n    Icons\n    <span class=\"dt-count\">{{ matches().length }}</span>\n  </span>\n  <span class=\"dt-actions\">\n    <fold-button-icon\n      [icon]=\"minimized() ? 'chevron-up' : 'minus'\"\n      size=\"sm\"\n      [tooltip]=\"minimized() ? 'Expand' : 'Minimise'\"\n      (clicked)=\"toggleMinimize()\"\n    />\n    <fold-button-icon\n      icon=\"close\"\n      size=\"sm\"\n      tooltip=\"Close\"\n      (clicked)=\"close()\"\n    />\n  </span>\n</header>\n\n@if (!minimized()) {\n  <div class=\"dt-body\">\n    <div class=\"dt-search\">\n      <fold-icon\n        name=\"search\"\n        size=\"sm\"\n        class=\"dt-search-ico\"\n        aria-hidden=\"true\"\n      />\n      <input\n        type=\"search\"\n        class=\"dt-search-input\"\n        placeholder=\"Search icons…\"\n        aria-label=\"Search icons\"\n        [value]=\"query()\"\n        (input)=\"onSearch($event)\"\n      />\n    </div>\n\n    <div class=\"dt-cats\">\n      @for (cat of categories(); track cat.id) {\n        <section class=\"dt-cat\">\n          <button\n            type=\"button\"\n            class=\"dt-cat-head\"\n            [attr.aria-expanded]=\"!isCollapsed(cat.id)\"\n            (click)=\"toggleCategory(cat.id)\"\n          >\n            <fold-icon\n              [name]=\"isCollapsed(cat.id) ? 'chevron-right' : 'chevron-down'\"\n              size=\"sm\"\n              aria-hidden=\"true\"\n            />\n            <span class=\"dt-cat-label\">{{ cat.label }}</span>\n            <span class=\"dt-cat-count\">{{ cat.names.length }}</span>\n          </button>\n\n          @if (!isCollapsed(cat.id)) {\n            <div class=\"dt-grid\" role=\"listbox\" [attr.aria-label]=\"cat.label\">\n              @for (name of cat.names; track name) {\n                <button\n                  type=\"button\"\n                  role=\"option\"\n                  class=\"dt-cell\"\n                  [class.is-selected]=\"selected() === name\"\n                  [attr.aria-selected]=\"selected() === name\"\n                  [title]=\"name\"\n                  (click)=\"select(name)\"\n                >\n                  <fold-icon [name]=\"name\" size=\"md\" aria-hidden=\"true\" />\n                </button>\n              }\n            </div>\n          }\n        </section>\n      } @empty {\n        <p class=\"dt-empty\">No icon matches “{{ query() }}”.</p>\n      }\n    </div>\n\n    @if (selected(); as name) {\n      <div class=\"dt-play\">\n        <div class=\"dt-preview\">\n          <fold-icon [name]=\"name\" [size]=\"size()\" />\n          <code class=\"dt-name\">{{ name }}</code>\n        </div>\n        <div class=\"dt-controls\">\n          <div class=\"dt-sizes\" role=\"group\" aria-label=\"Preview size\">\n            @for (s of sizeSteps; track s) {\n              <button\n                type=\"button\"\n                class=\"dt-size\"\n                [class.is-on]=\"size() === s\"\n                (click)=\"setSize(s)\"\n              >\n                {{ s }}\n              </button>\n            }\n          </div>\n          <div class=\"dt-snippet\">\n            <code>{{ snippet() }}</code>\n            <button\n              type=\"button\"\n              class=\"dt-copy\"\n              [class.is-copied]=\"copied()\"\n              (click)=\"copy()\"\n            >\n              <fold-icon\n                [name]=\"copied() ? 'check' : 'copy'\"\n                size=\"sm\"\n                aria-hidden=\"true\"\n              />\n              {{ copied() ? \"Copied\" : \"Copy\" }}\n            </button>\n          </div>\n        </div>\n      </div>\n    } @else {\n      <p class=\"dt-hint\">\n        Pick an icon to build a <code>&lt;fold-icon&gt;</code> snippet.\n      </p>\n    }\n  </div>\n}\n","// Opt-in dev-tools entry — `import { … } from \"fold-ng/devtools\"`.\n//\n// Everything here is meant for a DEV build only. Reach the import behind a dev\n// guard (`if (isDevMode())` + a dynamic `import(\"fold-ng/devtools\")`, or a\n// dev-only route/flag) so a production bundle tree-shakes it away — these tools\n// are never part of the shipped UI.\nexport { FoldIconDevtoolComponent } from \"./icon-devtool/icon-devtool.component\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}