{
  "$schema": "https://ngstarter.com/schemas/component-registry.schema.json",
  "generatedBy": "scripts/generate-ai-metadata.mjs",
  "package": "@ngstarter-ui/components",
  "description": "AI-readable registry for NgStarter UI Angular secondary entry points.",
  "componentCount": 126,
  "conventions": {
    "importPattern": "@ngstarter-ui/components/<component>",
    "selectorPrefix": "ngs",
    "themeTokenPrefix": "--ngs-",
    "themeStylesheetExample": "@use '@ngstarter-ui/components/styles/themes/default';"
  },
  "recipes": [
    {
      "name": "admin-dashboard",
      "description": "Build admin dashboards from NgStarter UI primitives instead of hand-rolled shell, cards, forms, datatables, static tables, and pagination.",
      "mustUse": [
        "@ngstarter-ui/components/sidenav",
        "@ngstarter-ui/components/navigation",
        "@ngstarter-ui/components/card",
        "@ngstarter-ui/components/data-view",
        "@ngstarter-ui/components/table",
        "@ngstarter-ui/components/form-field",
        "@ngstarter-ui/components/input",
        "@ngstarter-ui/components/paginator",
        "@ngstarter-ui/components/button",
        "@ngstarter-ui/components/icon",
        "@ngstarter-ui/components/checkbox",
        "@ngstarter-ui/components/progress-bar"
      ],
      "componentMappings": {
        "appShell": [
          "SidenavContainer",
          "Sidenav",
          "SidenavContent"
        ],
        "navigation": [
          "Navigation",
          "NavigationItem",
          "NavigationItemIconDirective"
        ],
        "cards": [
          "Card",
          "CardContent",
          "CardFooter"
        ],
        "datatables": [
          "DataView"
        ],
        "operationalDatasets": [
          "DataView"
        ],
        "staticTables": [
          "Table",
          "ColumnDef",
          "HeaderCell",
          "HeaderCellDef",
          "Cell",
          "CellDef",
          "HeaderRow",
          "HeaderRowDef",
          "Row",
          "RowDef"
        ],
        "search": [
          "FormField",
          "Label",
          "Input",
          "IconPrefix"
        ],
        "pagination": [
          "Paginator"
        ],
        "actions": [
          "Button",
          "Icon"
        ],
        "selection": [
          "Checkbox"
        ],
        "progress": [
          "ProgressBar"
        ]
      },
      "mustNot": [
        "Do not build datatables or operational admin datasets with role=\"table\", plain table markup, or div grids when DataView fits.",
        "Do not use DataView for purely static/read-only tabular content when ngs-table fits.",
        "Do not build static/read-only tables with role=\"table\" div grids when ngs-table fits.",
        "Do not build search fields with plain input when ngs-form-field and ngsInput fit.",
        "Do not build navigation menus with plain button lists when ngs-navigation fits.",
        "Do not build KPI cards with plain article/div cards when ngs-card fits.",
        "Do not restyle NgStarter components through wrapper-only classes when component selectors and component tokens fit.",
        "Do not make ordinary table rows, labels, descriptions, sidebar items, or status text bold to imitate a screenshot."
      ],
      "styling": {
        "template": "Treat TailwindCSS utility classes in templates as the primary styling surface for layout, responsive behavior, sizing, spacing, flex, grid, alignment, and routine margins/padding such as mt-10 and p-6 instead of custom margin-top: 2.5rem and padding: 1.5rem in SCSS.",
        "localScss": [
          "Start local SCSS files that use Tailwind tokens with @reference 'tailwindcss';",
          "Use --spacing(N) for spacing values in local SCSS.",
          "Use local SCSS for CSS custom property/token overrides, especially --ngs-* component variables, and necessary component selector overrides. Do not move routine layout, spacing, sizing, flex/grid, or alignment styling from templates into SCSS.",
          "Override NgStarter components through component or directive selectors such as ngs-card, ngs-navigation, ngs-form-field, table[ngs-table], button[ngsButton], and button[ngsIconButton]."
        ],
        "globalStyles": "Use CSS custom properties and theme tokens, especially --ngs-* variables, for global visual customization."
      },
      "typography": {
        "normalTextWeights": [
          "400"
        ],
        "navigationWeights": [
          "400"
        ],
        "buttonWeights": [
          "500",
          "600"
        ],
        "headingWeights": [
          "600",
          "650"
        ],
        "reserveHeavyWeightsFor": [
          "brand marks",
          "hero headings",
          "primary KPI numbers",
          "deliberate emphasis"
        ]
      },
      "verificationCommand": "npm run verify:admin:components"
    }
  ],
  "components": [
    {
      "name": "action-required",
      "title": "Action Required",
      "overviewName": "Action Required",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/action-required",
      "publicApi": "projects/components/action-required/public-api.ts",
      "sourceRoot": "projects/components/action-required/src",
      "docsPath": "/components/action-required",
      "docsOverviewSource": "projects/docs/src/app/components/action-required/overview/overview.html",
      "purpose": "Prompt users to resolve required account, setup, billing, or workflow actions.",
      "useWhen": "Use for dashboard notices that require user action before work can continue.",
      "exampleTopics": [
        "Basic action required"
      ],
      "minimalExample": "<ngs-action-required actionText=\"Action Required\"\n                     description=\"Please provide your company details to access our services seamlessly, whether forming a new company or adding existing information.\"\n                     buttonText=\"Get started\" (buttonClicked)=\"onButtonClicked()\"/>",
      "exampleFiles": [
        {
          "name": "basic-action-required-example",
          "title": "Basic action required",
          "file": "projects/docs/src/app/components/action-required/_examples/basic-action-required-example/basic-action-required-example.html",
          "source": "<ngs-action-required actionText=\"Action Required\"\n                     description=\"Please provide your company details to access our services seamlessly, whether forming a new company or adding existing information.\"\n                     buttonText=\"Get started\" (buttonClicked)=\"onButtonClicked()\"/>"
        }
      ],
      "previewAsset": "projects/components/action-required/preview.svg",
      "selectors": [
        "ngs-action-required"
      ],
      "exportedSymbols": [
        "ActionRequired"
      ],
      "inputs": [
        "actionText",
        "buttonText",
        "description",
        "iconName"
      ],
      "outputs": [
        "buttonClicked"
      ],
      "cssTokens": [
        "--ngs-action-action-text-bg",
        "--ngs-action-required-bg",
        "--ngs-action-text-color",
        "--ngs-color-danger-container",
        "--ngs-color-danger-container-highest",
        "--ngs-color-on-danger-container",
        "--ngs-color-surface",
        "--ngs-radius-xl"
      ],
      "example": null
    },
    {
      "name": "alert",
      "title": "Alert",
      "overviewName": "Alert",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/alert",
      "publicApi": "projects/components/alert/public-api.ts",
      "sourceRoot": "projects/components/alert/src",
      "docsPath": "/components/alert",
      "docsOverviewSource": "projects/docs/src/app/components/alert/overview/overview.html",
      "purpose": "Show inline status messages, warnings, errors, confirmations, or contextual notices.",
      "useWhen": "Use inside page content when the message should remain visible near the affected workflow.",
      "exampleTopics": [
        "Basic Alert",
        "Alert Variants",
        "Alert with icon",
        "Alert with title",
        "Alert actions"
      ],
      "minimalExample": "<ngs-alert>This is a NgStarter alert — check it out!</ngs-alert>",
      "exampleFiles": [
        {
          "name": "basic-alert-example",
          "title": "Basic alert",
          "file": "projects/docs/src/app/components/alert/_examples/basic-alert-example/basic-alert-example.html",
          "source": "<ngs-alert>This is a NgStarter alert — check it out!</ngs-alert>"
        },
        {
          "name": "alert-actions-example",
          "title": "Alert actions",
          "file": "projects/docs/src/app/components/alert/_examples/alert-actions-example/alert-actions-example.html",
          "source": "<div class=\"flex flex-col gap-6\">\n  <ngs-alert>\n    This is a NgStarter Admin alert — check it out!\n    <button ngsIconButton ngsAlertAction ngsAlertClose>\n      <ngs-icon name=\"fluent:dismiss-24-regular\"/>\n    </button>\n  </ngs-alert>\n  <ngs-alert variant=\"informative\">\n    This is a NgStarter Admin alert — check it out!\n    <button ngsIconButton ngsAlertAction ngsAlertClose>\n      <ngs-icon name=\"fluent:dismiss-24-regular\"/>\n    </button>\n  </ngs-alert>\n  <ngs-alert variant=\"negative\">\n    This is a NgStarter Admin alert — check it out!\n    <button ngsButton ngsAlertAction>ACTION</button>\n    <button ngsIconButton ngsAlertAction ngsAlertClose>\n      <ngs-icon name=\"fluent:dismiss-24-regular\"/>\n    </button>\n  </ngs-alert>\n  <ngs-alert variant=\"positive\">\n    <ngs-alert-title>Alert Title</ngs-alert-title>\n    This is a NgStarter Admin alert — check it out!\n    <button ngsIconButton ngsAlertAction ngsAlertClose>\n      <ngs-icon name=\"fluent:dismiss-24-regular\"/>\n    </button>\n  </ngs-alert>\n  <ngs-alert variant=\"notice\">\n    <ngs-alert-title>Alert Title</ngs-alert-title>\n    This is a NgStarter Admin alert — check it out!\n    <button ngsButton ngsAlertAction>ACTION</button>\n    <button ngsIconButton ngsAlertAction ngsAlertClose>\n      <ngs-icon name=\"fluent:dismiss-24-regular\"/>\n    </button>\n  </ngs-alert>\n</div>"
        },
        {
          "name": "alert-variants-example",
          "title": "Alert variants",
          "file": "projects/docs/src/app/components/alert/_examples/alert-variants-example/alert-variants-example.html",
          "source": "<div class=\"flex flex-col gap-6\">\n  <ngs-alert variant=\"default\">This is a NgStarter alert — check it out!</ngs-alert>\n  <ngs-alert variant=\"positive\">This is a NgStarter alert — check it out!</ngs-alert>\n  <ngs-alert variant=\"informative\">This is a NgStarter alert — check it out!</ngs-alert>\n  <ngs-alert variant=\"negative\">This is a NgStarter alert — check it out!</ngs-alert>\n  <ngs-alert variant=\"notice\">This is a NgStarter alert — check it out!</ngs-alert>\n</div>"
        }
      ],
      "previewAsset": "projects/components/alert/preview.svg",
      "selectors": [
        "[ngsAlertAction]",
        "[ngsAlertClose]",
        "[ngsAlertIcon]",
        "[ngsAlertTitle]",
        "ngs-alert",
        "ngs-alert-title"
      ],
      "exportedSymbols": [
        "Alert",
        "ALERT",
        "AlertActionDirective",
        "AlertCloseDirective",
        "AlertIconDirective",
        "AlertTitleDirective",
        "AlertVariant"
      ],
      "inputs": [
        "autoClose",
        "bordered",
        "variant"
      ],
      "outputs": [
        "closed"
      ],
      "cssTokens": [
        "--ngs-alert-action-border-radius",
        "--ngs-alert-action-font-weight",
        "--ngs-alert-action-height",
        "--ngs-alert-action-hover-bg",
        "--ngs-alert-action-hover-color",
        "--ngs-alert-action-padding",
        "--ngs-alert-action-with-icon-padding",
        "--ngs-alert-actions-gap",
        "--ngs-alert-bg-color",
        "--ngs-alert-border-color",
        "--ngs-alert-border-radius",
        "--ngs-alert-border-width",
        "--ngs-alert-color",
        "--ngs-alert-font-size",
        "--ngs-alert-gap",
        "--ngs-alert-has-thumbnail-padding",
        "--ngs-alert-icon-color",
        "--ngs-alert-padding",
        "--ngs-alert-thumbnail-bg",
        "--ngs-alert-thumbnail-border-radius",
        "--ngs-alert-thumbnail-size",
        "--ngs-alert-title-font-size",
        "--ngs-alert-title-font-weight",
        "--ngs-color-danger",
        "--ngs-color-danger-container",
        "--ngs-color-info",
        "--ngs-color-info-container",
        "--ngs-color-on-danger-container",
        "--ngs-color-on-info-container",
        "--ngs-color-on-success-container",
        "--ngs-color-on-warning-container",
        "--ngs-color-success",
        "--ngs-color-success-container",
        "--ngs-color-surface-container",
        "--ngs-color-surface-container-highest",
        "--ngs-color-warning",
        "--ngs-color-warning-container",
        "--ngs-font-size-sm",
        "--ngs-font-size-xs",
        "--ngs-radius-xl"
      ],
      "example": null
    },
    {
      "name": "announcement",
      "title": "Announcement",
      "overviewName": "Announcement",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/announcement",
      "publicApi": "projects/components/announcement/public-api.ts",
      "sourceRoot": "projects/components/announcement/src",
      "docsPath": "/components/announcement",
      "docsOverviewSource": "projects/docs/src/app/components/announcement/overview/overview.html",
      "purpose": "Show prominent product, system, or marketing announcements with optional title, icon, and actions.",
      "useWhen": "Use for broadcast-style messages that should stand apart from normal form or page content.",
      "exampleTopics": [
        "Show/Hide announcement dynamically",
        "Basic announcement",
        "Announcement with title",
        "Announcement with icons"
      ],
      "minimalExample": "<div class=\"flex flex-col gap-6\">\n  <ngs-announcement variant=\"neutral\" closable>You still have not uploaded your Mart invoice due on 22 April 2024</ngs-announcement>\n  <ngs-announcement variant=\"informative\">You still have not uploaded your Mart invoice due on 22 April 2024</ngs-announcement>\n  <ngs-announcement variant=\"negative\">You still have not uploaded your Mart invoice due on 22 April 2024</ngs-announcement>\n  <ngs-announcement variant=\"positive\" closable>You still have not uploaded your Mart invoice due on 22 April 2024</ngs-announcement>\n  <ngs-announcement variant=\"warning\">You still have not uploaded your Mart invoice due on 22 April 2024</ngs-announcement>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-announcement-example",
          "title": "Basic announcement",
          "file": "projects/docs/src/app/components/announcement/_examples/basic-announcement-example/basic-announcement-example.html",
          "source": "<div class=\"flex flex-col gap-6\">\n  <ngs-announcement variant=\"neutral\" closable>You still have not uploaded your Mart invoice due on 22 April 2024</ngs-announcement>\n  <ngs-announcement variant=\"informative\">You still have not uploaded your Mart invoice due on 22 April 2024</ngs-announcement>\n  <ngs-announcement variant=\"negative\">You still have not uploaded your Mart invoice due on 22 April 2024</ngs-announcement>\n  <ngs-announcement variant=\"positive\" closable>You still have not uploaded your Mart invoice due on 22 April 2024</ngs-announcement>\n  <ngs-announcement variant=\"warning\">You still have not uploaded your Mart invoice due on 22 April 2024</ngs-announcement>\n</div>"
        },
        {
          "name": "announcement-with-icons-example",
          "title": "Announcement with icons",
          "file": "projects/docs/src/app/components/announcement/_examples/announcement-with-icons-example/announcement-with-icons-example.html",
          "source": "<div class=\"flex flex-col gap-6\">\n  <ngs-announcement iconName=\"fluent:question-24-regular\" variant=\"neutral\">\n    You still have not uploaded your Mart invoice due on 22 April 2025\n  </ngs-announcement>\n  <ngs-announcement iconName=\"fluent:info-24-regular\" variant=\"informative\">\n    You still have not uploaded your Mart invoice due on 22 April 2024\n  </ngs-announcement>\n  <ngs-announcement iconName=\"fluent:error-circle-24-regular\" variant=\"negative\">\n    You still have not uploaded your Mart invoice due on 22 April 2025\n  </ngs-announcement>\n  <ngs-announcement iconName=\"fluent:checkmark-24-regular\" variant=\"positive\">\n    You still have not uploaded your Mart invoice due on 22 April 2024\n  </ngs-announcement>\n  <ngs-announcement iconName=\"fluent:warning-24-regular\" variant=\"warning\">\n    You still have not uploaded your Mart invoice due on 22 April 2025\n  </ngs-announcement>\n</div>"
        },
        {
          "name": "announcement-with-title-example",
          "title": "Announcement with title",
          "file": "projects/docs/src/app/components/announcement/_examples/announcement-with-title-example/announcement-with-title-example.html",
          "source": "<div class=\"flex flex-col gap-6\">\n  <ngs-announcement title=\"Neutral\" variant=\"neutral\" closable>\n    You still have not uploaded your Mart invoice due on 22 April 2024\n  </ngs-announcement>\n  <ngs-announcement title=\"Informative\" variant=\"informative\">\n    You still have not uploaded your Mart invoice due on 22 April 2024\n  </ngs-announcement>\n  <ngs-announcement title=\"Negative\" variant=\"negative\">\n    You still have not uploaded your Mart invoice due on 22 April 2024\n  </ngs-announcement>\n  <ngs-announcement title=\"Positive\" variant=\"positive\" closable>\n    You still have not uploaded your Mart invoice due on 22 April 2024\n  </ngs-announcement>\n  <ngs-announcement title=\"Warning\" variant=\"warning\">\n    You still have not uploaded your Mart invoice due on 22 April 2024\n  </ngs-announcement>\n</div>"
        }
      ],
      "previewAsset": "projects/components/announcement/preview.svg",
      "selectors": [
        "[ngsAnnouncementTitle]",
        "ngs-announcement",
        "ngs-announcement-global"
      ],
      "exportedSymbols": [
        "Announcement",
        "AnnouncementData",
        "AnnouncementGlobal",
        "AnnouncementLinkTo",
        "AnnouncementState",
        "AnnouncementStore",
        "AnnouncementTitle",
        "AnnouncementVariant"
      ],
      "inputs": [
        "closable",
        "iconName",
        "linkTo",
        "title",
        "variant"
      ],
      "outputs": [
        "announcementClose",
        "closed"
      ],
      "cssTokens": [
        "--ngs-color-danger-container",
        "--ngs-color-info-container",
        "--ngs-color-on-danger-container",
        "--ngs-color-on-info-container",
        "--ngs-color-on-secondary-container",
        "--ngs-color-on-success-container",
        "--ngs-color-on-warning-container",
        "--ngs-color-secondary-container",
        "--ngs-color-success-container",
        "--ngs-color-warning-container",
        "--ngs-font-size-sm"
      ],
      "example": null
    },
    {
      "name": "autocomplete",
      "title": "Autocomplete",
      "overviewName": "Autocomplete",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/autocomplete",
      "publicApi": "projects/components/autocomplete/public-api.ts",
      "sourceRoot": "projects/components/autocomplete/src",
      "docsPath": "/forms/autocomplete",
      "docsOverviewSource": "projects/docs/src/app/forms/autocomplete/overview/overview.html",
      "purpose": "Let users search and choose from suggestions while typing.",
      "useWhen": "Use for large option lists where a select would be too slow or crowded.",
      "exampleTopics": [
        "Simple autocomplete",
        "Custom Filter",
        "Separate control and display values",
        "Automatically highlighting the first option",
        "Autocomplete with option groups",
        "Autocomplete filter",
        "Separate controls and display values",
        "Auto highlight first person",
        "Option groups"
      ],
      "minimalExample": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Number</ngs-label>\n  <input type=\"text\"\n         placeholder=\"Pick one\"\n         aria-label=\"Number\"\n         ngsInput\n         [formControl]=\"myControl\"\n         [ngsAutocomplete]=\"auto\">\n  <ngs-autocomplete [autoActiveFirstOption]=\"true\" #auto=\"ngsAutocomplete\">\n    @for (option of filteredOptions | async; track option) {\n      <ngs-option [value]=\"option\">{{ option }}</ngs-option>\n    }\n  </ngs-autocomplete>\n</ngs-form-field>",
      "exampleFiles": [
        {
          "name": "auto-highlight-first-person-example",
          "title": "Auto highlight first person",
          "file": "projects/docs/src/app/forms/autocomplete/_examples/auto-highlight-first-person-example/auto-highlight-first-person-example.html",
          "source": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Number</ngs-label>\n  <input type=\"text\"\n         placeholder=\"Pick one\"\n         aria-label=\"Number\"\n         ngsInput\n         [formControl]=\"myControl\"\n         [ngsAutocomplete]=\"auto\">\n  <ngs-autocomplete [autoActiveFirstOption]=\"true\" #auto=\"ngsAutocomplete\">\n    @for (option of filteredOptions | async; track option) {\n      <ngs-option [value]=\"option\">{{ option }}</ngs-option>\n    }\n  </ngs-autocomplete>\n</ngs-form-field>"
        },
        {
          "name": "autocomplete-filter-example",
          "title": "Autocomplete filter",
          "file": "projects/docs/src/app/forms/autocomplete/_examples/autocomplete-filter-example/autocomplete-filter-example.html",
          "source": "<form>\n  <ngs-form-field class=\"w-1/2\">\n    <ngs-label>Number</ngs-label>\n    <input type=\"text\"\n           placeholder=\"Pick one\"\n           aria-label=\"Number\"\n           ngsInput\n           [formControl]=\"myControl\"\n           [ngsAutocomplete]=\"auto\">\n    <ngs-autocomplete #auto=\"ngsAutocomplete\">\n      @for (option of filteredOptions | async; track option) {\n        <ngs-option [value]=\"option\">{{ option }}</ngs-option>\n      }\n    </ngs-autocomplete>\n  </ngs-form-field>\n</form>"
        },
        {
          "name": "option-groups-example",
          "title": "Option groups",
          "file": "projects/docs/src/app/forms/autocomplete/_examples/option-groups-example/option-groups-example.html",
          "source": "<form [formGroup]=\"stateForm\">\n  <ngs-form-field class=\"w-1/2\">\n    <ngs-label>States Group</ngs-label>\n    <input type=\"text\"\n           ngsInput\n           formControlName=\"stateGroup\"\n           required\n           [ngsAutocomplete]=\"autoGroup\">\n    <ngs-autocomplete #autoGroup=\"ngsAutocomplete\">\n      @for (group of stateGroupOptions | async; track group) {\n        <ngs-optgroup [label]=\"group.letter\">\n          @for (name of group.names; track name) {\n            <ngs-option [value]=\"name\">{{name}}</ngs-option>\n          }\n        </ngs-optgroup>\n      }\n    </ngs-autocomplete>\n  </ngs-form-field>\n</form>"
        }
      ],
      "previewAsset": "projects/components/autocomplete/preview.svg",
      "selectors": [
        "[ngsAutocomplete]",
        "ngs-autocomplete"
      ],
      "exportedSymbols": [
        "Autocomplete",
        "AutocompleteActivatedEvent",
        "AutocompleteSelectedEvent",
        "AutocompleteTrigger"
      ],
      "inputs": [
        "aria-label",
        "aria-labelledby",
        "autoActiveFirstOption",
        "autoSelectActiveOption",
        "class",
        "disableRipple",
        "hideSingleSelectionIndicator",
        "ngsAutocomplete",
        "panelWidth",
        "requireSelection"
      ],
      "outputs": [
        "closed",
        "opened",
        "optionActivated",
        "optionSelected"
      ],
      "cssTokens": [
        "--ngs-autocomplete-panel-bg",
        "--ngs-autocomplete-panel-border",
        "--ngs-autocomplete-panel-max-height",
        "--ngs-autocomplete-panel-padding",
        "--ngs-autocomplete-panel-shadow",
        "--ngs-dropdown-bg",
        "--ngs-dropdown-border",
        "--ngs-dropdown-max-height",
        "--ngs-dropdown-padding",
        "--ngs-dropdown-radius",
        "--ngs-dropdown-shadow"
      ],
      "example": null
    },
    {
      "name": "avatar",
      "title": "Avatar",
      "overviewName": "Avatar",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/avatar",
      "publicApi": "projects/components/avatar/public-api.ts",
      "sourceRoot": "projects/components/avatar/src",
      "docsPath": "/components/avatar",
      "docsOverviewSource": "projects/docs/src/app/components/avatar/overview/overview.html",
      "purpose": "Represent users, teams, or entities with images, initials, icons, generated key-based avatar appearances, and presence.",
      "useWhen": "Use in account menus, lists, comments, assignees, collaborators, and activity feeds. Use the default appearance for normal image, label, or icon avatars. Use appearance=\"identicon\" or appearance=\"initials\" with a stable key for deterministic generated placeholders, optionally with backgroundColors and foregroundColors. Set a global default with provideAvatar({ appearance }) and override individual avatars with appearance=\"default\" when generated placeholders should be disabled.",
      "exampleTopics": [
        "Basic Avatar",
        "Avatar Variants",
        "Presence Indicator",
        "Avatar Sizes",
        "Avatar With Images",
        "Avatar With Icons",
        "Grouped Avatars",
        "Grouped and Total Avatars",
        "Avatar automatic color",
        "Generated Avatar",
        "Avatar presence indicator",
        "Avatar generated"
      ],
      "minimalExample": "<div class=\"flex gap-6\">\n  <ngs-avatar label=\"PS\"/>\n  <ngs-avatar label=\"N\" class=\"bg-pink-500 text-white\"/>\n  <ngs-avatar label=\"OP\" class=\"bg-blue-500 text-white\"/>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-avatar-example",
          "title": "Basic avatar",
          "file": "projects/docs/src/app/components/avatar/_examples/basic-avatar-example/basic-avatar-example.html",
          "source": "<div class=\"flex gap-6\">\n  <ngs-avatar label=\"PS\"/>\n  <ngs-avatar label=\"N\" class=\"bg-pink-500 text-white\"/>\n  <ngs-avatar label=\"OP\" class=\"bg-blue-500 text-white\"/>\n</div>"
        },
        {
          "name": "avatar-automatic-color-example",
          "title": "Avatar automatic color",
          "file": "projects/docs/src/app/components/avatar/_examples/avatar-automatic-color-example/avatar-automatic-color-example.html",
          "source": "<div class=\"flex flex-col gap-10\">\n  <div class=\"flex gap-6\">\n    <ngs-avatar label=\"PS\" automaticColor=\"#fcd6bb\"/>\n    <ngs-avatar label=\"N\" automaticColor=\"#a7f3d0\"/>\n    <ngs-avatar label=\"OP\" automaticColor=\"#eecff3\"/>\n  </div>\n  <div class=\"flex flex-col gap-8\">\n    <div class=\"flex gap-6 items-center\">\n      <ngs-avatar automaticColor=\"#eecff3\">\n        <ngs-icon name=\"fluent:folder-24-regular\"/>\n      </ngs-avatar>\n      <ngs-avatar automaticColor=\"#fcd6bb\">\n        <ngs-icon name=\"fluent:cloud-download-24-regular\"/>\n      </ngs-avatar>\n      <ngs-avatar automaticColor=\"#a7f3d0\">\n        <ngs-icon name=\"fluent:person-24-regular\"/>\n      </ngs-avatar>\n    </div>\n    <div class=\"flex gap-6 items-center\">\n      <ngs-avatar class=\"size-7\" automaticColor=\"#fde68a\">\n        <ngs-icon name=\"fluent:folder-24-regular\" class=\"size-5\"/>\n      </ngs-avatar>\n      <ngs-avatar class=\"size-7\" automaticColor=\"#a7f3d0\">\n        <ngs-icon name=\"fluent:cloud-download-24-regular\" class=\"size-5\"/>\n      </ngs-avatar>\n      <ngs-avatar class=\"size-7\" automaticColor=\"#eecff3\">\n        <ngs-icon name=\"fluent:person-24-regular\" class=\"size-5\"/>\n      </ngs-avatar>\n    </div>\n  </div>\n  <ngs-avatar-group>\n    <ngs-avatar label=\"am\" automaticColor=\"#bfdbfe\"/>\n    <ngs-avatar label=\"ps\" automaticColor=\"#a7f3d0\"/>\n    <ngs-avatar label=\"br\" automaticColor=\"#eecff3\"/>\n    <ngs-avatar-more>+20</ngs-avatar-more>\n  </ngs-avatar-group>\n</div>"
        },
        {
          "name": "avatar-generated-example",
          "title": "Avatar generated",
          "file": "projects/docs/src/app/components/avatar/_examples/avatar-generated-example/avatar-generated-example.html",
          "source": "<div class=\"flex flex-col gap-10\">\n  <div class=\"flex items-center gap-6\">\n    <ngs-avatar appearance=\"identicon\" key=\"Pavel Salauyou\" class=\"size-6\"/>\n    <ngs-avatar appearance=\"identicon\" key=\"PS\"/>\n    <ngs-avatar appearance=\"identicon\" key=\"N\" class=\"size-16\"/>\n    <ngs-avatar appearance=\"identicon\" key=\"OP\" class=\"size-32\"/>\n  </div>\n  <ngs-avatar-group>\n    <ngs-avatar appearance=\"identicon\" key=\"am\"/>\n    <ngs-avatar appearance=\"identicon\" key=\"ps\"/>\n    <ngs-avatar appearance=\"identicon\" key=\"br\"/>\n    <ngs-avatar appearance=\"identicon\" key=\"brn\"/>\n    <ngs-avatar appearance=\"identicon\" key=\"brt\"/>\n    <ngs-avatar appearance=\"identicon\" key=\"ps1\"/>\n  </ngs-avatar-group>\n  <div class=\"flex items-center gap-6\">\n    <ngs-avatar key=\"Pavel Salauyou\" appearance=\"initials\" class=\"size-6\"/>\n    <ngs-avatar key=\"Tate Stafford\" appearance=\"initials\"/>\n    <ngs-avatar key=\"Oscar Bristol\" appearance=\"initials\" class=\"size-16\"/>\n    <ngs-avatar key=\"Andrew Notley\" appearance=\"initials\" class=\"size-32\"/>\n  </div>\n  <ngs-avatar-group>\n    <ngs-avatar key=\"Pavel Salauyou\" appearance=\"initials\"/>\n    <ngs-avatar key=\"Tate Stafford\" appearance=\"initials\"/>\n    <ngs-avatar key=\"Oscar Bristol\" appearance=\"initials\"/>\n    <ngs-avatar key=\"Andrew Notley\" appearance=\"initials\"/>\n  </ngs-avatar-group>\n</div>"
        }
      ],
      "previewAsset": "projects/components/avatar/preview.svg",
      "selectors": [
        "[ngs-avatar-more]",
        "[ngs-avatar-total]",
        "[ngs-avatar]",
        "ngs-avatar",
        "ngs-avatar-group",
        "ngs-avatar-more",
        "ngs-avatar-total"
      ],
      "exportedSymbols": [
        "Avatar",
        "AVATAR_ACCESSOR",
        "AVATAR_CONFIG",
        "AvatarAppearance",
        "AvatarConfig",
        "AvatarGenerator",
        "AvatarGeneratorOptions",
        "AvatarGroup",
        "AvatarKey",
        "AvatarMore",
        "AvatarPresenceIndicator",
        "AvatarTotal",
        "AvatarVariant",
        "GeneratedAvatar",
        "GeneratedAvatarCell",
        "provideAvatar"
      ],
      "inputs": [
        "alt",
        "appearance",
        "automaticColor",
        "backgroundColors",
        "clickable",
        "foregroundColors",
        "image",
        "key",
        "label",
        "presenceIndicator",
        "variant"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-avatar-bg",
        "--ngs-avatar-border-color",
        "--ngs-avatar-border-color-auto",
        "--ngs-avatar-border-radius",
        "--ngs-avatar-border-width",
        "--ngs-avatar-color",
        "--ngs-avatar-font-weight",
        "--ngs-avatar-group-item-border",
        "--ngs-avatar-group-item-offset",
        "--ngs-avatar-inner-border",
        "--ngs-avatar-presence-indicator-away-bg",
        "--ngs-avatar-presence-indicator-offline-bg",
        "--ngs-avatar-presence-indicator-online-bg",
        "--ngs-avatar-presence-indicator-outline",
        "--ngs-avatar-presence-indicator-position-end",
        "--ngs-avatar-presence-indicator-position-top",
        "--ngs-avatar-presence-indicator-size",
        "--ngs-avatar-size",
        "--ngs-avatar-total-bg",
        "--ngs-avatar-total-color",
        "--ngs-avatar-total-font-size",
        "--ngs-avatar-total-font-weight",
        "--ngs-avatar-total-hover-bg",
        "--ngs-color-border",
        "--ngs-color-neutral-600",
        "--ngs-color-neutral-700",
        "--ngs-color-neutral-950",
        "--ngs-color-on-primary",
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-outline-variant",
        "--ngs-color-primary",
        "--ngs-color-success",
        "--ngs-color-surface",
        "--ngs-color-surface-container-highest",
        "--ngs-color-warning",
        "--ngs-font-size-xs"
      ],
      "example": null
    },
    {
      "name": "badge",
      "title": "Badge",
      "overviewName": "Badge",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/badge",
      "publicApi": "projects/components/badge/public-api.ts",
      "sourceRoot": "projects/components/badge/src",
      "docsPath": "/components/badge",
      "docsOverviewSource": "projects/docs/src/app/components/badge/overview/overview.html",
      "purpose": "Attach compact counts, statuses, or labels to another UI element.",
      "useWhen": "Use for notification counts, unread states, status dots, or small metadata on icons and avatars.",
      "exampleTopics": [
        "Basic Badges"
      ],
      "minimalExample": "<div ngsBadge=\"4\" ngsBadgeOverlap=\"true\">Text with a badge (Overlap: true)</div>\n<div ngsBadge=\"4\" ngsBadgeOverlap=\"false\">Text with a badge (Overlap: false)</div>\n<div ngsBadge=\"1\" ngsBadgeSize=\"small\">Text with small badge</div>\n<div ngsBadge=\"1\" ngsBadgeSize=\"large\">Text with large badge</div>\n<div class=\"flex items-center gap-2\">\n  Button with a badge on the left\n  <button ngsButton=\"tonal\" ngsBadge=\"8\" ngsBadgePosition=\"before\">\n    Action\n  </button>\n</div>\n<div class=\"flex items-center gap-2\">\n  Button toggles badge visibility\n  <button ngsButton=\"tonal\" ngsBadge=\"7\" [ngsBadgeHidden]=\"hidden\" (click)=\"toggleBadgeVisibility()\">\n    Hide\n  </button>\n</div>\n<div class=\"flex items-center gap-2\">\n  Icon with a badge\n  <ngs-icon name=\"fluent:home-24-regular\" ngsBadge=\"15\"/>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-badges-example",
          "title": "Basic badges",
          "file": "projects/docs/src/app/components/badge/_examples/basic-badges-example/basic-badges-example.html",
          "source": "<div ngsBadge=\"4\" ngsBadgeOverlap=\"true\">Text with a badge (Overlap: true)</div>\n<div ngsBadge=\"4\" ngsBadgeOverlap=\"false\">Text with a badge (Overlap: false)</div>\n<div ngsBadge=\"1\" ngsBadgeSize=\"small\">Text with small badge</div>\n<div ngsBadge=\"1\" ngsBadgeSize=\"large\">Text with large badge</div>\n<div class=\"flex items-center gap-2\">\n  Button with a badge on the left\n  <button ngsButton=\"tonal\" ngsBadge=\"8\" ngsBadgePosition=\"before\">\n    Action\n  </button>\n</div>\n<div class=\"flex items-center gap-2\">\n  Button toggles badge visibility\n  <button ngsButton=\"tonal\" ngsBadge=\"7\" [ngsBadgeHidden]=\"hidden\" (click)=\"toggleBadgeVisibility()\">\n    Hide\n  </button>\n</div>\n<div class=\"flex items-center gap-2\">\n  Icon with a badge\n  <ngs-icon name=\"fluent:home-24-regular\" ngsBadge=\"15\"/>\n</div>"
        }
      ],
      "previewAsset": "projects/components/badge/preview.svg",
      "selectors": [
        "[ngsBadge]",
        "ngs-badge-content"
      ],
      "exportedSymbols": [
        "Badge",
        "BadgeContent",
        "BadgePosition",
        "BadgeSize"
      ],
      "inputs": [
        "ngsBadge",
        "ngsBadgeColor",
        "ngsBadgeDescription",
        "ngsBadgeDisabled",
        "ngsBadgeHidden",
        "ngsBadgeOverlap",
        "ngsBadgePosition",
        "ngsBadgeSize"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-badge-background",
        "--ngs-badge-background-color",
        "--ngs-badge-font-size",
        "--ngs-badge-large-size",
        "--ngs-badge-size",
        "--ngs-badge-small-size",
        "--ngs-badge-text-color",
        "--ngs-color-danger",
        "--ngs-color-on-danger",
        "--ngs-color-on-primary",
        "--ngs-color-on-secondary",
        "--ngs-color-on-surface-variant",
        "--ngs-color-primary",
        "--ngs-color-secondary",
        "--ngs-color-surface-container-high"
      ],
      "example": null
    },
    {
      "name": "block-loader",
      "title": "Block Loader",
      "overviewName": "Block Loader",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/block-loader",
      "publicApi": "projects/components/block-loader/public-api.ts",
      "sourceRoot": "projects/components/block-loader/src",
      "docsPath": "/components/block-loader",
      "docsOverviewSource": "projects/docs/src/app/components/block-loader/overview/overview.html",
      "purpose": "Indicate that a bounded area of the UI is loading while preserving the surrounding page.",
      "useWhen": "Use when a panel, table, modal section, or card is refreshing independently.",
      "exampleTopics": [
        "Basic block loader",
        "Block loader in a dialog",
        "Block loader in modal",
        "_modals"
      ],
      "minimalExample": "<div class=\"border border-muted rounded-2xl p-5 w-1/2 h-[400px]\" ngsBlockLoaderContainer>\n  Some text data for example..\n  <ngs-block-loader [loading]=\"loading()\">\n    Loading large data..\n  </ngs-block-loader>\n</div>\n<div class=\"mt-8\">\n  <button ngsButton=\"filled\" (click)=\"toggleLoading()\">Toggle Loading</button>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-block-loader-example",
          "title": "Basic block loader",
          "file": "projects/docs/src/app/components/block-loader/_examples/basic-block-loader-example/basic-block-loader-example.html",
          "source": "<div class=\"border border-muted rounded-2xl p-5 w-1/2 h-[400px]\" ngsBlockLoaderContainer>\n  Some text data for example..\n  <ngs-block-loader [loading]=\"loading()\">\n    Loading large data..\n  </ngs-block-loader>\n</div>\n<div class=\"mt-8\">\n  <button ngsButton=\"filled\" (click)=\"toggleLoading()\">Toggle Loading</button>\n</div>"
        },
        {
          "name": "_modals",
          "title": "_modals",
          "file": "projects/docs/src/app/components/block-loader/_examples/_modals/block-loader-modal/block-loader-modal.html",
          "source": "<ngs-block-loader [loading]=\"!loaded()\">\n  @if (saving()) {\n    Saving...\n  }\n</ngs-block-loader>\n<div class=\"w-[500px]\">\n  <h3 ngs-dialog-title>Basic dialog</h3>\n  <ngs-dialog-content>\n    <p class=\"mb-3\">What's your favorite animal?</p>\n    <ngs-form-field class=\"w-full\">\n      <ngs-label>Favorite Animal</ngs-label>\n      <input ngsInput>\n    </ngs-form-field>\n  </ngs-dialog-content>\n  <div ngs-dialog-actions align=\"end\">\n    <button ngsButton (click)=\"onNoClick()\">Cancel</button>\n    <button ngsButton=\"filled\" (click)=\"save()\">Save</button>\n  </div>\n</div>"
        },
        {
          "name": "block-loader-in-modal-example",
          "title": "Block loader in modal",
          "file": "projects/docs/src/app/components/block-loader/_examples/block-loader-in-modal-example/block-loader-in-modal-example.html",
          "source": "<button ngsButton=\"filled\" (click)=\"showDialog()\">Show Dialog</button>"
        }
      ],
      "previewAsset": "projects/components/block-loader/preview.svg",
      "selectors": [
        "[ngsBlockLoaderContainer]",
        "ngs-block-loader"
      ],
      "exportedSymbols": [
        "BlockLoader",
        "BlockLoaderContainerDirective"
      ],
      "inputs": [
        "loading",
        "spinnerDiameter",
        "spinnerStrokeWidth"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-block-loader-bg",
        "--ngs-font-size-sm"
      ],
      "example": null
    },
    {
      "name": "bottom-sheet",
      "title": "Bottom Sheet",
      "overviewName": "Bottom Sheet",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/bottom-sheet",
      "publicApi": "projects/components/bottom-sheet/public-api.ts",
      "sourceRoot": "projects/components/bottom-sheet/src",
      "docsPath": "/components/bottom-sheet",
      "docsOverviewSource": "projects/docs/src/app/components/bottom-sheet/overview/overview.html",
      "purpose": "Present mobile-friendly contextual actions or short forms from the bottom of the viewport.",
      "useWhen": "Use for temporary choices, mobile action menus, and lightweight task flows.",
      "exampleTopics": [
        "Basic Bottom Sheet",
        "Bottom sheet"
      ],
      "minimalExample": "<p>You have received a file called \"cat-picture.jpeg\".</p>\n<button ngsButton=\"tonal\" (click)=\"openBottomSheet()\">Open file</button>",
      "exampleFiles": [
        {
          "name": "basic-bottom-sheet-example",
          "title": "Basic bottom sheet",
          "file": "projects/docs/src/app/components/bottom-sheet/_examples/basic-bottom-sheet-example/basic-bottom-sheet-example.html",
          "source": "<p>You have received a file called \"cat-picture.jpeg\".</p>\n<button ngsButton=\"tonal\" (click)=\"openBottomSheet()\">Open file</button>"
        },
        {
          "name": "bottom-sheet-example",
          "title": "Bottom sheet",
          "file": "projects/docs/src/app/components/bottom-sheet/_examples/bottom-sheet-example/bottom-sheet-example.html",
          "source": "<ngs-list>\n  <a href=\"https://keep.google.com/\" ngs-list-item (click)=\"openLink($event)\">\n    <span ngsListItemTitle>Google Keep</span>\n    <span ngsLine>Add to a note</span>\n  </a>\n  <a href=\"https://docs.google.com/\" ngs-list-item (click)=\"openLink($event)\">\n    <span ngsListItemTitle>Google Docs</span>\n    <span ngsLine>Embed in a document</span>\n  </a>\n  <a href=\"https://plus.google.com/\" ngs-list-item (click)=\"openLink($event)\">\n    <span ngsListItemTitle>Google Plus</span>\n    <span ngsLine>Share with your friends</span>\n  </a>\n  <a href=\"https://hangouts.google.com/\" ngs-list-item (click)=\"openLink($event)\">\n    <span ngsListItemTitle>Google Hangouts</span>\n    <span ngsLine>Show to your coworkers</span>\n  </a>\n</ngs-list>"
        }
      ],
      "previewAsset": "projects/components/bottom-sheet/preview.svg",
      "selectors": [
        "ngs-bottom-sheet-container"
      ],
      "exportedSymbols": [
        "BOTTOM_SHEET_DATA",
        "BOTTOM_SHEET_DEFAULT_OPTIONS",
        "BottomSheet",
        "BottomSheetConfig",
        "BottomSheetContainer",
        "BottomSheetRef"
      ],
      "inputs": [],
      "outputs": [],
      "cssTokens": [
        "--ngs-bottom-sheet-container-background-color",
        "--ngs-bottom-sheet-container-shape",
        "--ngs-bottom-sheet-container-text-color"
      ],
      "example": null
    },
    {
      "name": "breadcrumbs",
      "title": "Breadcrumbs",
      "overviewName": "Breadcrumbs",
      "category": "navigation",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/breadcrumbs",
      "publicApi": "projects/components/breadcrumbs/public-api.ts",
      "sourceRoot": "projects/components/breadcrumbs/src",
      "docsPath": "/navigation/breadcrumbs",
      "docsOverviewSource": "projects/docs/src/app/navigation/breadcrumbs/overview/overview.html",
      "purpose": "Show the user's current location in a hierarchy and provide parent navigation.",
      "useWhen": "Use in admin sections with nested routes, folders, projects, or record detail pages.",
      "exampleTopics": [
        "Basic breadcrumbs",
        "Breadcrumbs with icons",
        "Breadcrumbs with titles",
        "Breadcrumbs with datasource",
        "Breadcrumbs with last item as link",
        "Breadcrumbs global (set breadcrumbs dynamically)",
        "Breadcrumbs global"
      ],
      "minimalExample": "<ngs-breadcrumbs>\n  <ngs-breadcrumb-item>Home</ngs-breadcrumb-item>\n  <ngs-breadcrumb-separator>/</ngs-breadcrumb-separator>\n  <ngs-breadcrumb-item>Navigation</ngs-breadcrumb-item>\n</ngs-breadcrumbs>",
      "exampleFiles": [
        {
          "name": "basic-breadcrumbs-example",
          "title": "Basic breadcrumbs",
          "file": "projects/docs/src/app/navigation/breadcrumbs/_examples/basic-breadcrumbs-example/basic-breadcrumbs-example.html",
          "source": "<ngs-breadcrumbs>\n  <ngs-breadcrumb-item>Home</ngs-breadcrumb-item>\n  <ngs-breadcrumb-separator>/</ngs-breadcrumb-separator>\n  <ngs-breadcrumb-item>Navigation</ngs-breadcrumb-item>\n</ngs-breadcrumbs>"
        },
        {
          "name": "breadcrumbs-global-example",
          "title": "Breadcrumbs global",
          "file": "projects/docs/src/app/navigation/breadcrumbs/_examples/breadcrumbs-global-example/breadcrumbs-global-example.html",
          "source": "<ngs-breadcrumbs-global class=\"mb-6\">\n  <!-- Setup custom icons -->\n  <ng-template ngsBreadcrumbItemIconDef let-breadcrumb>\n    @if (breadcrumb.icon) {\n      <ngs-icon [name]=\"breadcrumb.icon\" class=\"size-5 me-0.5\"/>\n    }\n  </ng-template>\n<!--  if you want to translate or customize the breadcrumbs, you can use the following templates:-->\n<!--  <ng-template ngsBreadcrumbItemNameDef let-breadcrumb>-->\n<!--    {{ breadcrumb.name }}-->\n<!--  </ng-template>-->\n<!--  <ng-template ngsBreadcrumbItemTitleDef let-breadcrumb>-->\n<!--    {{ breadcrumb.title }}-->\n<!--  </ng-template>-->\n</ngs-breadcrumbs-global>\n<p>\n  <button ngsButton=\"filled\" (click)=\"setBreadcrumbs()\">Set breadcrumbs</button>\n</p>"
        },
        {
          "name": "breadcrumbs-with-datasource-example",
          "title": "Breadcrumbs with datasource",
          "file": "projects/docs/src/app/navigation/breadcrumbs/_examples/breadcrumbs-with-datasource-example/breadcrumbs-with-datasource-example.html",
          "source": "<ngs-breadcrumbs [dataSource]=\"dataSource\">\n  <a *ngsBreadcrumbItemDef=\"let item\" ngs-breadcrumb-item [routerLink]=\"item.link\">{{ item.name }}</a>\n  <ngs-breadcrumb-separator *ngsBreadcrumbSeparatorDef>/</ngs-breadcrumb-separator>\n  <ngs-breadcrumb-item *ngsBreadcrumbActiveItemDef=\"let item\">{{ item.name }}</ngs-breadcrumb-item>\n</ngs-breadcrumbs>"
        }
      ],
      "previewAsset": "projects/components/breadcrumbs/preview.svg",
      "selectors": [
        "[ngs-breadcrumb-item]",
        "[ngsBreadcrumbActiveItemDef]",
        "[ngsBreadcrumbItemDef]",
        "[ngsBreadcrumbItemIcon]",
        "[ngsBreadcrumbItemIconDef]",
        "[ngsBreadcrumbItemNameDef]",
        "[ngsBreadcrumbItemTitleDef]",
        "[ngsBreadcrumbSeparatorDef]",
        "ngs-breadcrumb-item",
        "ngs-breadcrumb-separator",
        "ngs-breadcrumb-title",
        "ngs-breadcrumbs",
        "ngs-breadcrumbs-global"
      ],
      "exportedSymbols": [
        "Breadcrumb",
        "BreadcrumbActiveItemDefDirective",
        "BreadcrumbItem",
        "BreadcrumbItemDefDirective",
        "BreadcrumbItemIconDefDirective",
        "BreadcrumbItemIconDirective",
        "BreadcrumbItemNameDefDirective",
        "BreadcrumbItemTitleDefDirective",
        "Breadcrumbs",
        "BreadcrumbSeparator",
        "BreadcrumbSeparatorDefDirective",
        "BreadcrumbsGlobal",
        "BreadcrumbsState",
        "BreadcrumbsStore",
        "BreadcrumbTitle"
      ],
      "inputs": [
        "dataSource",
        "lastItemAsLink",
        "separator"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-breadcrumbs-active-item-color",
        "--ngs-breadcrumbs-gap",
        "--ngs-breadcrumbs-item-color",
        "--ngs-breadcrumbs-item-font-size",
        "--ngs-breadcrumbs-item-font-weight",
        "--ngs-breadcrumbs-item-hover-color",
        "--ngs-breadcrumbs-separator-color",
        "--ngs-breadcrumbs-separator-font-size",
        "--ngs-breadcrumbs-separator-position-top",
        "--ngs-breadcrumbs-title-color",
        "--ngs-breadcrumbs-title-font-size",
        "--ngs-color-neutral-400",
        "--ngs-color-neutral-800",
        "--ngs-color-primary",
        "--ngs-color-secondary",
        "--ngs-font-size-md",
        "--ngs-font-size-sm",
        "--ngs-font-size-xs"
      ],
      "example": null
    },
    {
      "name": "button",
      "title": "Button",
      "overviewName": "Buttons",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/button",
      "publicApi": "projects/components/button/public-api.ts",
      "sourceRoot": "projects/components/button/src",
      "docsPath": "/forms/buttons",
      "docsOverviewSource": "projects/docs/src/app/forms/buttons/overview/overview.html",
      "purpose": "Trigger actions with filled, outlined, text, tonal, loading, disabled, and icon button states.",
      "useWhen": "Use for commands, form submission, toolbar actions, and navigation-like calls to action.",
      "exampleTopics": [
        "Basic Button",
        "Outlined Button",
        "Tonal Button",
        "Flat Button",
        "Icon Button",
        "Button Loading",
        "Hide text on mobile",
        "Interactive disabled buttons",
        "Basic buttons",
        "Stroked buttons",
        "Tonal buttons",
        "Flat buttons",
        "Icon buttons",
        "Buttons with interactive disabled"
      ],
      "minimalExample": "<div class=\"flex gap-5\">\n  <button ngsButton>Basic</button>\n  <button ngsButton disabled>Disabled</button>\n  <button ngsButton disabled disabledInteractive ngsTooltip=\"This button is disabled but interactive\">Disabled Interactive</button>\n  <button ngsButton>\n    <ngs-icon name=\"fluent:add-24-regular\"/> Basic\n  </button>\n  <button ngsButton reverseIcon>\n    <ngs-icon name=\"fluent:search-24-regular\"/> Basic\n  </button>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-buttons-example",
          "title": "Basic buttons",
          "file": "projects/docs/src/app/forms/buttons/_examples/basic-buttons-example/basic-buttons-example.html",
          "source": "<div class=\"flex gap-5\">\n  <button ngsButton>Basic</button>\n  <button ngsButton disabled>Disabled</button>\n  <button ngsButton disabled disabledInteractive ngsTooltip=\"This button is disabled but interactive\">Disabled Interactive</button>\n  <button ngsButton>\n    <ngs-icon name=\"fluent:add-24-regular\"/> Basic\n  </button>\n  <button ngsButton reverseIcon>\n    <ngs-icon name=\"fluent:search-24-regular\"/> Basic\n  </button>\n</div>"
        },
        {
          "name": "button-loading-example",
          "title": "Button loading",
          "file": "projects/docs/src/app/forms/buttons/_examples/button-loading-example/button-loading-example.html",
          "source": "<div class=\"flex gap-5 items-center\">\n  <button ngsButton loading>Text</button>\n  <button ngsButton=\"tonal\" loading>Tonal</button>\n  <button ngsButton=\"filled\" loading>Filled</button>\n  <button ngsButton=\"outlined\" loading>Outlined</button>\n</div>"
        },
        {
          "name": "buttons-with-interactive-disabled-example",
          "title": "Buttons with interactive disabled",
          "file": "projects/docs/src/app/forms/buttons/_examples/buttons-with-interactive-disabled-example/buttons-with-interactive-disabled-example.html",
          "source": "<div class=\"flex gap-5\">\n  <button\n    ngsButton=\"filled\"\n    disabled\n    disabledInteractive\n    ngsTooltip=\"This is a tooltip!\">Disabled button allowing interactivity</button>\n  <button\n    ngsButton=\"outlined\"\n    disabled\n    ngsTooltip=\"This is a tooltip!\">Default disabled button</button>\n</div>"
        }
      ],
      "previewAsset": "projects/components/button/preview.svg",
      "selectors": [
        "a[ngsButton]",
        "a[ngsIconButton]",
        "button[ngsButton]",
        "button[ngsIconButton]"
      ],
      "exportedSymbols": [
        "Button",
        "ButtonVariant"
      ],
      "inputs": [
        "disabled",
        "disabledInteractive",
        "disableRipple",
        "fullWidth",
        "hideTextOnMobile",
        "loading",
        "ngsButton",
        "ngsIconButton",
        "reverse"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-button-bg",
        "--ngs-button-border-radius",
        "--ngs-button-color",
        "--ngs-button-content-gap",
        "--ngs-button-filled-bg",
        "--ngs-button-filled-color",
        "--ngs-button-font-size",
        "--ngs-button-font-weight",
        "--ngs-button-height",
        "--ngs-button-hover-bg",
        "--ngs-button-outlined-border",
        "--ngs-button-outlined-color",
        "--ngs-button-padding",
        "--ngs-button-padding-x",
        "--ngs-button-radius",
        "--ngs-button-tonal-bg",
        "--ngs-button-tonal-color",
        "--ngs-color-danger",
        "--ngs-color-danger-container",
        "--ngs-color-emphasis",
        "--ngs-color-on-danger",
        "--ngs-color-on-danger-container",
        "--ngs-color-on-primary",
        "--ngs-color-on-primary-container",
        "--ngs-color-on-secondary",
        "--ngs-color-on-secondary-container",
        "--ngs-color-on-surface",
        "--ngs-color-primary",
        "--ngs-color-primary-container",
        "--ngs-color-secondary",
        "--ngs-color-secondary-container",
        "--ngs-control-gap",
        "--ngs-font-size-sm",
        "--ngs-radius-lg",
        "--ngs-state-disabled-bg",
        "--ngs-state-disabled-border",
        "--ngs-state-disabled-color",
        "--ngs-state-focus-ring"
      ],
      "example": "<button ngsButton=\"filled\">Save</button>"
    },
    {
      "name": "button-toggle",
      "title": "Button Toggle",
      "overviewName": "Button Toggle",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/button-toggle",
      "publicApi": "projects/components/button-toggle/public-api.ts",
      "sourceRoot": "projects/components/button-toggle/src",
      "docsPath": "/forms/button-toggle",
      "docsOverviewSource": "projects/docs/src/app/forms/button-toggle/overview/overview.html",
      "purpose": "Let users choose one or more options from a compact segmented button group.",
      "useWhen": "Use for mode switching, view density, filters, or mutually exclusive short choices.",
      "exampleTopics": [
        "Basic Button Toggle",
        "Icon Only Button Toggle",
        "Selection Mode",
        "Button toggle selection mode"
      ],
      "minimalExample": "<ngs-button-toggle-group name=\"fontStyle\" aria-label=\"Font Style\">\n  <ngs-button-toggle value=\"bold\">Bold</ngs-button-toggle>\n  <ngs-button-toggle value=\"italic\">Italic</ngs-button-toggle>\n  <ngs-button-toggle value=\"underline\">Underline</ngs-button-toggle>\n</ngs-button-toggle-group>",
      "exampleFiles": [
        {
          "name": "basic-button-toggle-example",
          "title": "Basic button toggle",
          "file": "projects/docs/src/app/forms/button-toggle/_examples/basic-button-toggle-example/basic-button-toggle-example.html",
          "source": "<ngs-button-toggle-group name=\"fontStyle\" aria-label=\"Font Style\">\n  <ngs-button-toggle value=\"bold\">Bold</ngs-button-toggle>\n  <ngs-button-toggle value=\"italic\">Italic</ngs-button-toggle>\n  <ngs-button-toggle value=\"underline\">Underline</ngs-button-toggle>\n</ngs-button-toggle-group>"
        },
        {
          "name": "button-toggle-selection-mode-example",
          "title": "Button toggle selection mode",
          "file": "projects/docs/src/app/forms/button-toggle/_examples/button-toggle-selection-mode-example/button-toggle-selection-mode-example.html",
          "source": "<div>\n  <p class=\"mt-0\">Single selection:</p>\n  <ngs-button-toggle-group name=\"favoriteColor\" aria-label=\"Favorite Color\">\n    <ngs-button-toggle value=\"red\">Red</ngs-button-toggle>\n    <ngs-button-toggle value=\"green\">Green</ngs-button-toggle>\n    <ngs-button-toggle value=\"blue\">Blue</ngs-button-toggle>\n  </ngs-button-toggle-group>\n</div>\n<div class=\"mt-8\">\n  <p>Single selection (hidden indicator):</p>\n  <ngs-button-toggle-group name=\"favoriteColorHidden\" aria-label=\"Favorite Color Hidden\" hideSelectionIndicator>\n    <ngs-button-toggle value=\"red\">Red</ngs-button-toggle>\n    <ngs-button-toggle value=\"green\">Green</ngs-button-toggle>\n    <ngs-button-toggle value=\"blue\">Blue</ngs-button-toggle>\n  </ngs-button-toggle-group>\n</div>\n<div class=\"mt-8\">\n  <p>Multiple selection:</p>\n  <ngs-button-toggle-group name=\"ingredients\" aria-label=\"Ingredients\" multiple>\n    <ngs-button-toggle value=\"flour\">Flour</ngs-button-toggle>\n    <ngs-button-toggle value=\"eggs\">Eggs</ngs-button-toggle>\n    <ngs-button-toggle value=\"sugar\">Sugar</ngs-button-toggle>\n  </ngs-button-toggle-group>\n</div>"
        },
        {
          "name": "icon-only-button-toggle-example",
          "title": "Icon only button toggle",
          "file": "projects/docs/src/app/forms/button-toggle/_examples/icon-only-button-toggle-example/icon-only-button-toggle-example.html",
          "source": "<ngs-button-toggle-group value=\"grid\" hideSelectionIndicator onlyIcon aria-label=\"View mode\">\n  <ngs-button-toggle value=\"list\">\n    <ngs-icon name=\"fluent:text-bullet-list-ltr-24-regular\" />\n    <span class=\"sr-only\">List</span>\n  </ngs-button-toggle>\n  <ngs-button-toggle value=\"grid\">\n    <ngs-icon name=\"fluent:grid-24-regular\" />\n    <span class=\"sr-only\">Grid</span>\n  </ngs-button-toggle>\n  <ngs-button-toggle value=\"board\">\n    <ngs-icon name=\"fluent:board-24-regular\" />\n    <span class=\"sr-only\">Board</span>\n  </ngs-button-toggle>\n</ngs-button-toggle-group>"
        }
      ],
      "previewAsset": "projects/components/button-toggle/preview.svg",
      "selectors": [
        "ngs-button-toggle",
        "ngs-button-toggle-group"
      ],
      "exportedSymbols": [
        "ButtonToggle",
        "ButtonToggleAppearance",
        "ButtonToggleGroup"
      ],
      "inputs": [
        "appearance",
        "checked",
        "disabled",
        "hideSelectionIndicator",
        "id",
        "multiple",
        "name",
        "onlyIcon",
        "value",
        "vertical"
      ],
      "outputs": [
        "change"
      ],
      "cssTokens": [
        "--ngs-button-height",
        "--ngs-button-radius",
        "--ngs-button-toggle-button-font-size",
        "--ngs-button-toggle-button-font-weight",
        "--ngs-button-toggle-button-only-icon-padding",
        "--ngs-button-toggle-button-padding",
        "--ngs-button-toggle-checked-bg-color",
        "--ngs-button-toggle-checked-text-color",
        "--ngs-button-toggle-group-bg",
        "--ngs-button-toggle-group-border-color",
        "--ngs-button-toggle-group-border-radius",
        "--ngs-button-toggle-hover-bg-color",
        "--ngs-button-toggle-selection-indicator-color",
        "--ngs-button-toggle-text-color",
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-primary",
        "--ngs-color-surface-container",
        "--ngs-color-surface-container-high",
        "--ngs-color-surface-container-highest"
      ],
      "example": null
    },
    {
      "name": "calendar",
      "title": "Calendar",
      "overviewName": "Calendar",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/calendar",
      "publicApi": "projects/components/calendar/public-api.ts",
      "sourceRoot": "projects/components/calendar/src",
      "docsPath": "/components/calendar",
      "docsOverviewSource": "projects/docs/src/app/components/calendar/overview/overview.html",
      "purpose": "The NgStarter Angular Calendar component renders an inline month calendar for dashboards, scheduling widgets, event summaries, availability previews, and date-driven product surfaces.",
      "useWhen": "Choose Calendar when the workflow matches examples such as Basic Calendar, Calendar With Events, Calendar With Min And Max Dates, Calendar min max.",
      "exampleTopics": [
        "Basic Calendar",
        "Calendar With Events",
        "Calendar With Min And Max Dates",
        "Calendar min max"
      ],
      "minimalExample": "<div class=\"calendar-example\">\n  <ngs-calendar [selected]=\"selectedDate()\" (selectedChange)=\"selectedDate.set($event)\" />\n</div>",
      "exampleFiles": [
        {
          "name": "basic-calendar-example",
          "title": "Basic calendar",
          "file": "projects/docs/src/app/components/calendar/_examples/basic-calendar-example/basic-calendar-example.html",
          "source": "<div class=\"calendar-example\">\n  <ngs-calendar [selected]=\"selectedDate()\" (selectedChange)=\"selectedDate.set($event)\" />\n</div>"
        },
        {
          "name": "calendar-min-max-example",
          "title": "Calendar min max",
          "file": "projects/docs/src/app/components/calendar/_examples/calendar-min-max-example/calendar-min-max-example.html",
          "source": "<div class=\"calendar-example\">\n  <ngs-calendar\n    [selected]=\"selectedDate()\"\n    [minDate]=\"minDate\"\n    [maxDate]=\"maxDate\"\n    [firstDayOfWeek]=\"1\"\n    [showAdjacentDays]=\"false\"\n    (selectedChange)=\"selectedDate.set($event)\"\n  />\n</div>"
        },
        {
          "name": "calendar-with-events-example",
          "title": "Calendar with events",
          "file": "projects/docs/src/app/components/calendar/_examples/calendar-with-events-example/calendar-with-events-example.html",
          "source": "<div class=\"calendar-example\">\n  <ngs-calendar\n    [selected]=\"selectedDate()\"\n    [events]=\"events\"\n    [showEventTitles]=\"true\"\n    (selectedChange)=\"selectedDate.set($event)\"\n  />\n</div>"
        }
      ],
      "previewAsset": null,
      "selectors": [
        "ngs-calendar"
      ],
      "exportedSymbols": [
        "Calendar",
        "CalendarDateInput",
        "CalendarEvent",
        "CalendarEventColor"
      ],
      "inputs": [
        "events",
        "firstDayOfWeek",
        "locale",
        "maxDate",
        "minDate",
        "selected",
        "showAdjacentDays",
        "showEventTitles",
        "showTodayButton",
        "startAt"
      ],
      "outputs": [
        "eventSelected",
        "monthChange",
        "selectedChange"
      ],
      "cssTokens": [
        "--ngs-button-bg",
        "--ngs-button-border-radius",
        "--ngs-button-height",
        "--ngs-button-padding",
        "--ngs-button-padding-x",
        "--ngs-calendar-day-bg",
        "--ngs-calendar-day-hover-bg",
        "--ngs-calendar-day-min-height",
        "--ngs-calendar-day-muted-color",
        "--ngs-calendar-day-radius",
        "--ngs-calendar-day-selected-bg",
        "--ngs-calendar-day-selected-color",
        "--ngs-calendar-day-today-outline",
        "--ngs-calendar-event-blue",
        "--ngs-calendar-event-danger",
        "--ngs-calendar-event-green",
        "--ngs-calendar-event-info",
        "--ngs-calendar-event-neutral",
        "--ngs-calendar-event-primary",
        "--ngs-calendar-event-rose",
        "--ngs-calendar-event-success",
        "--ngs-calendar-event-warning",
        "--ngs-calendar-gap",
        "--ngs-calendar-header-gap",
        "--ngs-calendar-header-margin-bottom",
        "--ngs-calendar-weekday-color",
        "--ngs-color-danger",
        "--ngs-color-info",
        "--ngs-color-on-primary",
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-outline",
        "--ngs-color-primary",
        "--ngs-color-success",
        "--ngs-color-surface-container",
        "--ngs-color-warning",
        "--ngs-font-size-lg",
        "--ngs-font-size-xs",
        "--ngs-radius-md",
        "--ngs-radius-sm"
      ],
      "example": null
    },
    {
      "name": "card",
      "title": "Card",
      "overviewName": "Card",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/card",
      "publicApi": "projects/components/card/public-api.ts",
      "sourceRoot": "projects/components/card/src",
      "docsPath": "/components/card",
      "docsOverviewSource": "projects/docs/src/app/components/card/overview/overview.html",
      "purpose": "Group related content, controls, media, and actions in a bordered or elevated container.",
      "useWhen": "Use for repeated dashboard widgets, previews, summaries, or compact content modules.",
      "exampleTopics": [
        "Basic Card",
        "Card Appearance",
        "Card Actions",
        "Card Multiple Sections",
        "Card Footer Loading"
      ],
      "minimalExample": "<ngs-card appearance=\"raised\" class=\"w-1/2\">\n  <ngs-card-content>Simple card</ngs-card-content>\n</ngs-card>\n<ngs-card appearance=\"outlined\" class=\"w-1/2 mt-8\">\n  <ngs-card-content>Simple card</ngs-card-content>\n  <ngs-card-actions>\n    <button ngsButton>LIKE</button>\n    <button ngsButton>SHARE</button>\n  </ngs-card-actions>\n</ngs-card>",
      "exampleFiles": [
        {
          "name": "basic-card-example",
          "title": "Basic card",
          "file": "projects/docs/src/app/components/card/_examples/basic-card-example/basic-card-example.html",
          "source": "<ngs-card appearance=\"raised\" class=\"w-1/2\">\n  <ngs-card-content>Simple card</ngs-card-content>\n</ngs-card>\n<ngs-card appearance=\"outlined\" class=\"w-1/2 mt-8\">\n  <ngs-card-content>Simple card</ngs-card-content>\n  <ngs-card-actions>\n    <button ngsButton>LIKE</button>\n    <button ngsButton>SHARE</button>\n  </ngs-card-actions>\n</ngs-card>"
        },
        {
          "name": "card-actions-example",
          "title": "Card actions",
          "file": "projects/docs/src/app/components/card/_examples/card-actions-example/card-actions-example.html",
          "source": "<div class=\"flex flex-col gap-8\">\n  <ngs-card class=\"w-1/2\">\n    <ngs-card-header>\n      <ngs-card-title>Actions Buttons</ngs-card-title>\n      <ngs-card-subtitle>Start</ngs-card-subtitle>\n    </ngs-card-header>\n    <ngs-card-actions>\n      <button ngsButton>LIKE</button>\n      <button ngsButton>SHARE</button>\n    </ngs-card-actions>\n  </ngs-card>\n  <ngs-card appearance=\"raised\" class=\"w-1/2\">\n    <ngs-card-header>\n      <ngs-card-title>Actions Buttons</ngs-card-title>\n      <ngs-card-subtitle>End</ngs-card-subtitle>\n    </ngs-card-header>\n    <ngs-card-actions align=\"end\">\n      <button ngsButton>LIKE</button>\n      <button ngsButton>SHARE</button>\n    </ngs-card-actions>\n  </ngs-card>\n  <ngs-card appearance=\"outlined\" class=\"w-1/2\">\n    <ngs-card-header>\n      <ngs-card-title>Actions Buttons</ngs-card-title>\n      <ngs-card-subtitle>Start</ngs-card-subtitle>\n    </ngs-card-header>\n    <ngs-card-actions align=\"start\">\n      <button ngsButton>LIKE</button>\n      <button ngsButton>SHARE</button>\n    </ngs-card-actions>\n  </ngs-card>\n  <ngs-card appearance=\"outlined\" class=\"w-1/2\">\n    <ngs-card-header>\n      <ngs-card-title>Actions Buttons</ngs-card-title>\n      <ngs-card-subtitle>Center</ngs-card-subtitle>\n    </ngs-card-header>\n    <ngs-card-actions align=\"center\">\n      <button ngsButton>LIKE</button>\n      <button ngsButton>SHARE</button>\n    </ngs-card-actions>\n  </ngs-card>\n  <ngs-card appearance=\"outlined\" class=\"w-1/2\">\n    <ngs-card-header>\n      <ngs-card-title>Actions Buttons</ngs-card-title>\n      <ngs-card-subtitle>End</ngs-card-subtitle>\n    </ngs-card-header>\n..."
        },
        {
          "name": "card-appearance-example",
          "title": "Card appearance",
          "file": "projects/docs/src/app/components/card/_examples/card-appearance-example/card-appearance-example.html",
          "source": "<div class=\"flex flex-col gap-4\">\n  <ngs-card appearance=\"filled\">\n    <ngs-card-header>\n      <ngs-card-title>Filled Card</ngs-card-title>\n      <ngs-card-subtitle>Default appearance</ngs-card-subtitle>\n    </ngs-card-header>\n    <ngs-card-content>\n      This is a filled card. It has a background color and no shadow or border.\n    </ngs-card-content>\n    <ngs-card-actions>\n      <button ngsButton>ACTION</button>\n    </ngs-card-actions>\n  </ngs-card>\n  <ngs-card appearance=\"outlined\">\n    <ngs-card-header>\n      <ngs-card-title>Outlined Card</ngs-card-title>\n      <ngs-card-subtitle>Simple border</ngs-card-subtitle>\n    </ngs-card-header>\n    <ngs-card-content>\n      This is an outlined card. It has a border and no shadow.\n    </ngs-card-content>\n    <ngs-card-actions>\n      <button ngsButton>ACTION</button>\n    </ngs-card-actions>\n  </ngs-card>\n  <ngs-card appearance=\"raised\">\n    <ngs-card-header>\n      <ngs-card-title>Raised Card</ngs-card-title>\n      <ngs-card-subtitle>Shadow</ngs-card-subtitle>\n    </ngs-card-header>\n    <ngs-card-content>\n      This is a raised card. It has a shadow to make it stand out from the background.\n    </ngs-card-content>\n    <ngs-card-actions>\n      <button ngsButton>ACTION</button>\n    </ngs-card-actions>\n  </ngs-card>\n</div>"
        }
      ],
      "previewAsset": "projects/components/card/preview.svg",
      "selectors": [
        "[ngs-card-actions]",
        "[ngs-card-aside]",
        "[ngs-card-avatar]",
        "[ngs-card-content]",
        "[ngs-card-footer]",
        "[ngs-card-image]",
        "[ngs-card-lg-image]",
        "[ngs-card-md-image]",
        "[ngs-card-sm-image]",
        "[ngs-card-subtitle]",
        "[ngs-card-title]",
        "[ngs-card-xl-image]",
        "[ngsCardActions]",
        "[ngsCardAvatar]",
        "[ngsCardContent]",
        "[ngsCardFooter]",
        "[ngsCardImage]",
        "[ngsCardImageLarge]",
        "[ngsCardImageMedium]",
        "[ngsCardImageSmall]",
        "[ngsCardImageXLarge]",
        "[ngsCardSubtitle]",
        "[ngsCardTitle]",
        "ngs-card",
        "ngs-card-actions",
        "ngs-card-aside",
        "ngs-card-avatar",
        "ngs-card-content",
        "ngs-card-footer",
        "ngs-card-header",
        "ngs-card-image",
        "ngs-card-subtitle",
        "ngs-card-title",
        "ngsCardAside"
      ],
      "exportedSymbols": [
        "Card",
        "CARD_CONFIG",
        "CardActions",
        "CardActionsPosition",
        "CardAppearance",
        "CardAside",
        "CardAvatar",
        "CardConfig",
        "CardContent",
        "CardFooter",
        "CardHeader",
        "CardImage",
        "CardImageLarge",
        "CardImageMedium",
        "CardImageSmall",
        "CardImageXLarge",
        "CardSubtitle",
        "CardTitle",
        "provideCard"
      ],
      "inputs": [
        "align",
        "appearance",
        "withoutPadding"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-card-bg",
        "--ngs-card-border-color",
        "--ngs-card-color",
        "--ngs-card-content-font-size",
        "--ngs-card-content-letter-spacing",
        "--ngs-card-content-line-height",
        "--ngs-card-padding",
        "--ngs-card-radius",
        "--ngs-card-shadow",
        "--ngs-card-subtitle-color",
        "--ngs-card-subtitle-font-size",
        "--ngs-card-subtitle-font-weight",
        "--ngs-card-subtitle-letter-spacing",
        "--ngs-card-subtitle-line-height",
        "--ngs-card-title-font-size",
        "--ngs-card-title-font-weight",
        "--ngs-card-title-letter-spacing",
        "--ngs-card-title-line-height",
        "--ngs-color-border",
        "--ngs-color-on-surface",
        "--ngs-color-surface-container",
        "--ngs-radius-xl",
        "--ngs-shadow-sm"
      ],
      "example": null
    },
    {
      "name": "card-overlay",
      "title": "Card Overlay",
      "overviewName": "Card Overlay",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/card-overlay",
      "publicApi": "projects/components/card-overlay/public-api.ts",
      "sourceRoot": "projects/components/card-overlay/src",
      "docsPath": "/components/card-overlay",
      "docsOverviewSource": "projects/docs/src/app/components/card-overlay/overview/overview.html",
      "purpose": "Reveal overlay content or actions on top of a card-like surface, often on hover or interaction.",
      "useWhen": "Use for media cards, galleries, previews, and quick actions over visual content.",
      "exampleTopics": [
        "Basic card overlay",
        "Card overlay with translate",
        "Card overlay with blur"
      ],
      "minimalExample": "<div class=\"flex flex-col gap-10\">\n  <ngs-card class=\"w-1/2 h-80\" ngsCardOverlayContainer>\n    <ngs-card-content>Hover on card to see overlay</ngs-card-content>\n    <ngs-card-overlay>\n      <button ngsButton=\"filled\">View Product</button>\n    </ngs-card-overlay>\n  </ngs-card>\n  <ngs-card class=\"w-1/2\">\n    <ngs-card-header class=\"h-20\">\n      <ngs-avatar ngs-card-avatar />\n      <ngs-card-title>Dog Breed</ngs-card-title>\n      <ngs-card-subtitle>Shiba Inu</ngs-card-subtitle>\n    </ngs-card-header>\n    <div ngsCardOverlayContainer>\n      <img ngs-card-image src=\"/assets/shibainu.png\" alt=\"Photo of a Shiba Inu\" class=\"my-0\">\n      <ngs-card-overlay>\n        <button ngsButton=\"filled\">View Image</button>\n      </ngs-card-overlay>\n    </div>\n    <ngs-card-content>\n      <div class=\"pt-5 text-sm\">\n        Hover on image to see overlay\n      </div>\n    </ngs-card-content>\n    <ngs-card-actions>\n      <button ngsButton>LIKE</button>\n      <button ngsButton>SHARE</button>\n    </ngs-card-actions>\n  </ngs-card>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-card-overlay-example",
          "title": "Basic card overlay",
          "file": "projects/docs/src/app/components/card-overlay/_examples/basic-card-overlay-example/basic-card-overlay-example.html",
          "source": "<div class=\"flex flex-col gap-10\">\n  <ngs-card class=\"w-1/2 h-80\" ngsCardOverlayContainer>\n    <ngs-card-content>Hover on card to see overlay</ngs-card-content>\n    <ngs-card-overlay>\n      <button ngsButton=\"filled\">View Product</button>\n    </ngs-card-overlay>\n  </ngs-card>\n  <ngs-card class=\"w-1/2\">\n    <ngs-card-header class=\"h-20\">\n      <ngs-avatar ngs-card-avatar />\n      <ngs-card-title>Dog Breed</ngs-card-title>\n      <ngs-card-subtitle>Shiba Inu</ngs-card-subtitle>\n    </ngs-card-header>\n    <div ngsCardOverlayContainer>\n      <img ngs-card-image src=\"/assets/shibainu.png\" alt=\"Photo of a Shiba Inu\" class=\"my-0\">\n      <ngs-card-overlay>\n        <button ngsButton=\"filled\">View Image</button>\n      </ngs-card-overlay>\n    </div>\n    <ngs-card-content>\n      <div class=\"pt-5 text-sm\">\n        Hover on image to see overlay\n      </div>\n    </ngs-card-content>\n    <ngs-card-actions>\n      <button ngsButton>LIKE</button>\n      <button ngsButton>SHARE</button>\n    </ngs-card-actions>\n  </ngs-card>\n</div>"
        },
        {
          "name": "card-overlay-with-blur-example",
          "title": "Card overlay with blur",
          "file": "projects/docs/src/app/components/card-overlay/_examples/card-overlay-with-blur-example/card-overlay-with-blur-example.html",
          "source": "<div class=\"flex flex-col gap-10\">\n  <ngs-card class=\"w-1/2 h-80\" ngsCardOverlayContainer>\n    <ngs-card-content>Hover on card to see overlay</ngs-card-content>\n    <ngs-card-overlay withBlur>\n      <button ngsButton=\"filled\">View Product</button>\n    </ngs-card-overlay>\n  </ngs-card>\n  <ngs-card class=\"w-1/2\">\n    <ngs-card-header class=\"h-20\">\n      <ngs-avatar ngs-card-avatar />\n      <ngs-card-title>Dog Breed</ngs-card-title>\n      <ngs-card-subtitle>Shiba Inu</ngs-card-subtitle>\n    </ngs-card-header>\n    <div ngsCardOverlayContainer>\n      <img ngs-card-image src=\"/assets/shibainu.png\" alt=\"Photo of a Shiba Inu\" class=\"my-0\">\n      <ngs-card-overlay withBlur>\n        <button ngsButton=\"filled\">View Image</button>\n      </ngs-card-overlay>\n    </div>\n    <ngs-card-content>\n      <div class=\"pt-5 text-sm\">\n        Hover on image to see overlay\n      </div>\n    </ngs-card-content>\n    <ngs-card-actions>\n      <button ngsButton>LIKE</button>\n      <button ngsButton>SHARE</button>\n    </ngs-card-actions>\n  </ngs-card>\n</div>"
        },
        {
          "name": "card-overlay-with-translate-example",
          "title": "Card overlay with translate",
          "file": "projects/docs/src/app/components/card-overlay/_examples/card-overlay-with-translate-example/card-overlay-with-translate-example.html",
          "source": "<div class=\"flex flex-col gap-10\">\n  <ngs-card class=\"w-1/2 h-80\" ngsCardOverlayContainer>\n    <ngs-card-content>Hover on card to see overlay</ngs-card-content>\n    <ngs-card-overlay withTranslate>\n      <button ngsButton=\"filled\">View Product</button>\n    </ngs-card-overlay>\n  </ngs-card>\n  <ngs-card class=\"w-1/2\">\n    <ngs-card-header class=\"h-20\">\n      <ngs-avatar ngs-card-avatar />\n      <ngs-card-title>Dog Breed</ngs-card-title>\n      <ngs-card-subtitle>Shiba Inu</ngs-card-subtitle>\n    </ngs-card-header>\n    <div ngsCardOverlayContainer>\n      <img ngs-card-image src=\"/assets/shibainu.png\" alt=\"Photo of a Shiba Inu\" class=\"my-0\">\n      <ngs-card-overlay withTranslate>\n        <button ngsButton=\"filled\">View Image</button>\n      </ngs-card-overlay>\n    </div>\n    <ngs-card-content>\n      <div class=\"pt-5 text-sm\">\n        Hover on image to see overlay\n      </div>\n    </ngs-card-content>\n    <ngs-card-actions>\n      <button ngsButton>LIKE</button>\n      <button ngsButton>SHARE</button>\n    </ngs-card-actions>\n  </ngs-card>\n</div>"
        }
      ],
      "previewAsset": "projects/components/card-overlay/preview.svg",
      "selectors": [
        "[ngsCardOverlayContainer]",
        "ngs-card-overlay"
      ],
      "exportedSymbols": [
        "CardOverlay",
        "CardOverlayContainerDirective"
      ],
      "inputs": [
        "disabled",
        "withBlur",
        "withTranslate"
      ],
      "outputs": [],
      "cssTokens": [],
      "example": null
    },
    {
      "name": "carousel",
      "title": "Carousel",
      "overviewName": "Carousel",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/carousel",
      "publicApi": "projects/components/carousel/public-api.ts",
      "sourceRoot": "projects/components/carousel/src",
      "docsPath": "/components/carousel",
      "docsOverviewSource": "projects/docs/src/app/components/carousel/overview/overview.html",
      "purpose": "Display a sequence of slides or panels that users can browse horizontally.",
      "useWhen": "Use for featured content, image galleries, onboarding panels, or compact previews.",
      "exampleTopics": [
        "Basic Carousel",
        "Carousel controls with custom position",
        "Carousel with fade effect",
        "Carousel controls custom position",
        "Carousel fade effect"
      ],
      "minimalExample": "<div class=\"w-full bg-neutral-100 dark:bg-neutral-900 rounded-xl p-5\">\n  <ngs-carousel>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl h-72 w-120 bg-surface-container-lowest\">\n        Card 1\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl h-72 w-120 bg-surface-container-lowest\">\n        Card 2\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl h-72 w-120 bg-surface-container-lowest\">\n        Card 3\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl h-72 w-120 bg-surface-container-lowest\">\n        Card 4\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl h-72 w-120 bg-surface-container-lowest\">\n        Card 5\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl h-72 w-120 bg-surface-container-lowest\">\n        Card 6\n      </div>\n    </ngs-carousel-card>\n    <ng-container ngsCarouselControls>\n      <button ngsIconButton ngsCarouselPrevious>\n        <ngs-icon name=\"fluent:arrow-left-24-regular\"/>\n      </button>\n      <button ngsIconButton ngsCarouselNext>\n        <ngs-icon name=\"fluent:arrow-right-24-regular\"/>\n      </button>\n    </ng-container>\n  </ngs-carousel>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-carousel-example",
          "title": "Basic carousel",
          "file": "projects/docs/src/app/components/carousel/_examples/basic-carousel-example/basic-carousel-example.html",
          "source": "<div class=\"w-full bg-neutral-100 dark:bg-neutral-900 rounded-xl p-5\">\n  <ngs-carousel>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl h-72 w-120 bg-surface-container-lowest\">\n        Card 1\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl h-72 w-120 bg-surface-container-lowest\">\n        Card 2\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl h-72 w-120 bg-surface-container-lowest\">\n        Card 3\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl h-72 w-120 bg-surface-container-lowest\">\n        Card 4\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl h-72 w-120 bg-surface-container-lowest\">\n        Card 5\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl h-72 w-120 bg-surface-container-lowest\">\n        Card 6\n      </div>\n    </ngs-carousel-card>\n    <ng-container ngsCarouselControls>\n      <button ngsIconButton ngsCarouselPrevious>\n        <ngs-icon name=\"fluent:arrow-left-24-regular\"/>\n      </button>\n      <button ngsIconButton ngsCarouselNext>\n        <ngs-icon name=\"fluent:arrow-right-24-regular\"/>\n      </button>\n    </ng-container>\n  </ngs-carousel>\n</div>"
        },
        {
          "name": "carousel-controls-custom-position-example",
          "title": "Carousel controls custom position",
          "file": "projects/docs/src/app/components/carousel/_examples/carousel-controls-custom-position-example/carousel-controls-custom-position-example.html",
          "source": "<div class=\"w-[500px] bg-neutral-100 dark:bg-neutral-900 rounded-xl p-5 relative\">\n  <ngs-carousel #carousel>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl size-72 bg-surface-container-lowest\">\n        Card 1\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl size-72 bg-surface-container-lowest\">\n        Card 2\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl size-72 bg-surface-container-lowest\">\n        Card 3\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl size-72 bg-surface-container-lowest\">\n        Card 4\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl size-72 bg-surface-container-lowest\">\n        Card 5\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl size-72 bg-surface-container-lowest\">\n        Card 6\n      </div>\n    </ngs-carousel-card>\n  </ngs-carousel>\n  <div class=\"absolute start-2 top-1/2 w-max -translate-y-1/2\">\n    <button ngsIconButton ngsCarouselPrevious [carousel]=\"carousel\">\n      <ngs-icon name=\"fluent:arrow-left-24-regular\"/>\n    </button>\n  </div>\n  <div class=\"absolute end-2 top-1/2 w-max -translate-y-1/2\">\n    <button ngsIconButton ngsCarouselNext [carousel]=\"carousel\">\n      <ngs-icon name=\"fluent:arrow-right-24-regular\"/>\n    </button>\n  </div>\n</div>"
        },
        {
          "name": "carousel-fade-effect-example",
          "title": "Carousel fade effect",
          "file": "projects/docs/src/app/components/carousel/_examples/carousel-fade-effect-example/carousel-fade-effect-example.html",
          "source": "<div class=\"bg-neutral-100 dark:bg-neutral-900 rounded-xl p-5\">\n  <ngs-carousel fade>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl size-40 bg-surface-container-lowest\">\n        Card 1\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl size-40 bg-surface-container-lowest\">\n        Card 2\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl size-40 bg-surface-container-lowest\">\n        Card 3\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl size-40 bg-surface-container-lowest\">\n        Card 4\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl size-40 bg-surface-container-lowest\">\n        Card 5\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl size-40 bg-surface-container-lowest\">\n        Card 6\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl size-40 bg-surface-container-lowest\">\n        Card 7\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl size-40 bg-surface-container-lowest\">\n        Card 8\n      </div>\n    </ngs-carousel-card>\n    <ngs-carousel-card>\n      <div class=\"border border-muted p-6 rounded-xl size-40 bg-surface-container-lowest\">\n        Card 9\n      </div>\n    </ngs-carousel-card>\n..."
        }
      ],
      "previewAsset": "projects/components/carousel/preview.svg",
      "selectors": [
        "[ngs-carousel-card]",
        "[ngsCarouselControls]",
        "[ngsCarouselNext]",
        "[ngsCarouselPrevious]",
        "[ngsDraggableCarousel]",
        "ngs-carousel",
        "ngs-carousel-card"
      ],
      "exportedSymbols": [
        "Carousel",
        "CAROUSEL",
        "CAROUSEL_CARD",
        "CarouselApiInterface",
        "CarouselCard",
        "CarouselCardInterface",
        "CarouselControlsDirective",
        "CarouselInterface",
        "CarouselNextDirective",
        "CarouselPreviousDirective",
        "DraggableCarouselDirective"
      ],
      "inputs": [
        "cardSelector",
        "carousel",
        "fade",
        "resistanceFactor",
        "snapDebounceTime",
        "snapDuration",
        "snapToCenter",
        "stopPropagation",
        "velocityThreshold",
        "visibilityDebounceTime"
      ],
      "outputs": [
        "indexChange"
      ],
      "cssTokens": [
        "--ngs-carousel-gap"
      ],
      "example": null
    },
    {
      "name": "checkbox",
      "title": "Checkbox",
      "overviewName": "Checkbox",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/checkbox",
      "publicApi": "projects/components/checkbox/public-api.ts",
      "sourceRoot": "projects/components/checkbox/src",
      "docsPath": "/forms/checkbox",
      "docsOverviewSource": "projects/docs/src/app/forms/checkbox/overview/overview.html",
      "purpose": "Capture independent boolean choices or multi-select options.",
      "useWhen": "Use for forms, preferences, tables, and filter groups where multiple values can be selected.",
      "exampleTopics": [
        "Basic Checkboxes",
        "Checkbox with Description",
        "Checkbox Group",
        "Checkbox description"
      ],
      "minimalExample": "<section>\n  <ngs-checkbox class=\"me-3\">Check me!</ngs-checkbox>\n  <ngs-checkbox [disabled]=\"true\">Disabled</ngs-checkbox>\n</section>\n<section class=\"mt-8\">\n  <div>\n    <ngs-checkbox\n                  [checked]=\"allComplete\"\n                  [color]=\"task.color\"\n                  [indeterminate]=\"someComplete()\"\n                  (change)=\"setAll($event.checked)\">\n      {{ task.name }}\n    </ngs-checkbox>\n  </div>\n  <ul class=\"m-0\">\n    @for (subtask of task.subtasks; track subtask) {\n      <li>\n        <ngs-checkbox [(ngModel)]=\"subtask.completed\"\n                      [color]=\"subtask.color\"\n                      (ngModelChange)=\"updateAllComplete()\">\n          {{subtask.name}}\n        </ngs-checkbox>\n      </li>\n    }\n  </ul>\n</section>",
      "exampleFiles": [
        {
          "name": "basic-checkboxes-example",
          "title": "Basic checkboxes",
          "file": "projects/docs/src/app/forms/checkbox/_examples/basic-checkboxes-example/basic-checkboxes-example.html",
          "source": "<section>\n  <ngs-checkbox class=\"me-3\">Check me!</ngs-checkbox>\n  <ngs-checkbox [disabled]=\"true\">Disabled</ngs-checkbox>\n</section>\n<section class=\"mt-8\">\n  <div>\n    <ngs-checkbox\n                  [checked]=\"allComplete\"\n                  [color]=\"task.color\"\n                  [indeterminate]=\"someComplete()\"\n                  (change)=\"setAll($event.checked)\">\n      {{ task.name }}\n    </ngs-checkbox>\n  </div>\n  <ul class=\"m-0\">\n    @for (subtask of task.subtasks; track subtask) {\n      <li>\n        <ngs-checkbox [(ngModel)]=\"subtask.completed\"\n                      [color]=\"subtask.color\"\n                      (ngModelChange)=\"updateAllComplete()\">\n          {{subtask.name}}\n        </ngs-checkbox>\n      </li>\n    }\n  </ul>\n</section>"
        },
        {
          "name": "checkbox-description-example",
          "title": "Checkbox description",
          "file": "projects/docs/src/app/forms/checkbox/_examples/checkbox-description-example/checkbox-description-example.html",
          "source": "<ngs-checkbox>\n  I agree to the terms and conditions\n  <div ngsCheckboxDecription>\n    By checking this box, you agree to our Terms of Service and Privacy Policy.\n  </div>\n</ngs-checkbox>"
        },
        {
          "name": "checkbox-group-example",
          "title": "Checkbox group",
          "file": "projects/docs/src/app/forms/checkbox/_examples/checkbox-group-example/checkbox-group-example.html",
          "source": "<ngs-checkbox-group>\n  <ngs-checkbox>Option 1</ngs-checkbox>\n  <ngs-checkbox>Option 2</ngs-checkbox>\n  <ngs-checkbox>Option 3</ngs-checkbox>\n</ngs-checkbox-group>\n<ngs-checkbox-group class=\"mt-10\">\n  <ngs-checkbox>\n    Email notifications\n    <div ngsCheckboxDecription>\n      Receive updates about new products and promotions.\n    </div>\n  </ngs-checkbox>\n  <ngs-checkbox>\n    SMS alerts\n    <div ngsCheckboxDecription>\n      Get real-time alerts for security and account activity.\n    </div>\n  </ngs-checkbox>\n  <ngs-checkbox>\n    Partner offers\n    <div ngsCheckboxDecription>\n      Subscribe to receive exclusive offers from our trusted partners.\n    </div>\n  </ngs-checkbox>\n</ngs-checkbox-group>"
        }
      ],
      "previewAsset": "projects/components/checkbox/preview.svg",
      "selectors": [
        "[ngsCheckboxDescription]",
        "ngs-checkbox",
        "ngs-checkbox-group"
      ],
      "exportedSymbols": [
        "Checkbox",
        "CheckboxChange",
        "CheckboxDescription",
        "CheckboxGroup",
        "TransitionCheckState"
      ],
      "inputs": [
        "aria-controls",
        "aria-describedby",
        "aria-expanded",
        "aria-label",
        "aria-labelledby",
        "aria-owns",
        "checked",
        "color",
        "disabled",
        "disabledInteractive",
        "disableRipple",
        "id",
        "indeterminate",
        "labelPosition",
        "name",
        "required",
        "tabIndex",
        "value"
      ],
      "outputs": [
        "change",
        "indeterminateChange"
      ],
      "cssTokens": [
        "--ngs-checkbox-checked-color",
        "--ngs-checkbox-checkmark-color",
        "--ngs-checkbox-description-color",
        "--ngs-checkbox-description-font-size",
        "--ngs-checkbox-disabled-color",
        "--ngs-checkbox-gap",
        "--ngs-checkbox-group-gap",
        "--ngs-checkbox-label-font-size",
        "--ngs-checkbox-size",
        "--ngs-checkbox-unchecked-color",
        "--ngs-color-danger",
        "--ngs-color-neutral-500",
        "--ngs-color-on-danger",
        "--ngs-color-on-primary",
        "--ngs-color-on-secondary",
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-primary",
        "--ngs-color-secondary",
        "--ngs-field-border-color",
        "--ngs-font-size-md",
        "--ngs-font-size-sm"
      ],
      "example": null
    },
    {
      "name": "chips",
      "title": "Chips",
      "overviewName": "Chips",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/chips",
      "publicApi": "projects/components/chips/public-api.ts",
      "sourceRoot": "projects/components/chips/src",
      "docsPath": "/components/chips",
      "docsOverviewSource": "projects/docs/src/app/components/chips/overview/overview.html",
      "purpose": "Display compact tokens for tags, selected values, filters, or removable items.",
      "useWhen": "Use for tag entry, selected people/items, active filters, and small categorical metadata.",
      "exampleTopics": [
        "Basic Chips",
        "Chips Appearance",
        "Chips With Input",
        "Chips Autocomplete",
        "Chips With Icons",
        "Chips Drag and Drop",
        "Stacked Chips"
      ],
      "minimalExample": "<ngs-chip-listbox aria-label=\"Fish selection\">\n  <ngs-chip-option>One fish</ngs-chip-option>\n  <ngs-chip-option>Two fish</ngs-chip-option>\n  <ngs-chip-option selected>Accent fish</ngs-chip-option>\n  <ngs-chip-option>Warn fish</ngs-chip-option>\n</ngs-chip-listbox>",
      "exampleFiles": [
        {
          "name": "basic-chips-example",
          "title": "Basic chips",
          "file": "projects/docs/src/app/components/chips/_examples/basic-chips-example/basic-chips-example.html",
          "source": "<ngs-chip-listbox aria-label=\"Fish selection\">\n  <ngs-chip-option>One fish</ngs-chip-option>\n  <ngs-chip-option>Two fish</ngs-chip-option>\n  <ngs-chip-option selected>Accent fish</ngs-chip-option>\n  <ngs-chip-option>Warn fish</ngs-chip-option>\n</ngs-chip-listbox>"
        },
        {
          "name": "chips-appearance-example",
          "title": "Chips appearance",
          "file": "projects/docs/src/app/components/chips/_examples/chips-appearance-example/chips-appearance-example.html",
          "source": "<div class=\"example-section\">\n  <h4>Filled (Default)</h4>\n  <ngs-chip-set>\n    <ngs-chip>One</ngs-chip>\n    <ngs-chip>Two</ngs-chip>\n    <ngs-chip>Three</ngs-chip>\n  </ngs-chip-set>\n</div>\n<div class=\"example-section\">\n  <h4>Outlined</h4>\n  <ngs-chip-set>\n    <ngs-chip appearance=\"outlined\">One</ngs-chip>\n    <ngs-chip appearance=\"outlined\">Two</ngs-chip>\n    <ngs-chip appearance=\"outlined\">Three</ngs-chip>\n  </ngs-chip-set>\n</div>\n<div class=\"example-section\">\n  <h4>Custom Styles (via appearance)</h4>\n  <ngs-chip-set>\n    <ngs-chip appearance=\"success\">Success</ngs-chip>\n    <ngs-chip appearance=\"warning\">Warning</ngs-chip>\n    <ngs-chip appearance=\"danger\">Danger</ngs-chip>\n    <ngs-chip appearance=\"gradient\">Gradient</ngs-chip>\n  </ngs-chip-set>\n</div>"
        },
        {
          "name": "chips-autocomplete-example",
          "title": "Chips autocomplete",
          "file": "projects/docs/src/app/components/chips/_examples/chips-autocomplete-example/chips-autocomplete-example.html",
          "source": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Favorite Fruits</ngs-label>\n  <ngs-chip-grid #chipGrid aria-label=\"Fruit selection\">\n    @for (fruit of fruits; track fruit) {\n      <ngs-chip-row (removed)=\"remove(fruit)\">\n        {{fruit}}\n        <button ngsChipRemove>\n          <ngs-icon name=\"fluent:dismiss-20-regular\"/>\n        </button>\n      </ngs-chip-row>\n    }\n    <input ngsInput\n           placeholder=\"New Fruit...\" #fruitInput\n           [formControl]=\"fruitCtrl\"\n           [ngsChipInputFor]=\"chipGrid\"\n           [ngsAutocomplete]=\"auto\"\n           [ngsChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n           (chipInputTokenEnd)=\"add($event)\">\n  </ngs-chip-grid>\n  <ngs-autocomplete #auto=\"ngsAutocomplete\" (optionSelected)=\"selected($event)\">\n    @for (fruit of filteredFruits | async; track fruit) {\n      <ngs-option [value]=\"fruit\">{{ fruit }}</ngs-option>\n    }\n  </ngs-autocomplete>\n</ngs-form-field>"
        }
      ],
      "previewAsset": "projects/components/chips/preview.svg",
      "selectors": [
        "[ngsChipAvatar]",
        "[ngsChipControl]",
        "[ngsChipEdit]",
        "[ngsChipRemove]",
        "[ngsChipShape]",
        "input[ngsChipInputFor]",
        "ngs-chip",
        "ngs-chip-avatar",
        "ngs-chip-edit",
        "ngs-chip-grid",
        "ngs-chip-listbox",
        "ngs-chip-option",
        "ngs-chip-remove",
        "ngs-chip-row",
        "ngs-chip-set",
        "ngs-chip-shape"
      ],
      "exportedSymbols": [
        "Chip",
        "ChipAvatar",
        "ChipControl",
        "ChipEdit",
        "ChipEditedEvent",
        "ChipGrid",
        "ChipInput",
        "ChipInputEvent",
        "ChipListbox",
        "ChipOption",
        "ChipRemove",
        "ChipRow",
        "ChipSet",
        "ChipShape"
      ],
      "inputs": [
        "appearance",
        "disabled",
        "editable",
        "id",
        "multiple",
        "ngsChipInputAddOnBlur",
        "ngsChipInputFor",
        "placeholder",
        "required",
        "selected",
        "value"
      ],
      "outputs": [
        "chipInputTokenEnd",
        "destroyed",
        "edited",
        "removed",
        "selectionChange",
        "valueChange"
      ],
      "cssTokens": [
        "--ngs-avatar-size",
        "--ngs-chip-background",
        "--ngs-chip-border-color",
        "--ngs-chip-color",
        "--ngs-chip-font-size",
        "--ngs-chip-font-weight",
        "--ngs-chip-height",
        "--ngs-chip-input-height",
        "--ngs-chip-listbox-gap",
        "--ngs-chip-outline-color",
        "--ngs-chip-padding",
        "--ngs-chip-radius",
        "--ngs-chip-selected-background",
        "--ngs-chip-selected-color",
        "--ngs-chip-set-gap",
        "--ngs-chip-set-spacing",
        "--ngs-color-danger",
        "--ngs-color-on-primary",
        "--ngs-color-on-surface",
        "--ngs-color-outline-variant",
        "--ngs-color-primary",
        "--ngs-color-surface-container-high",
        "--ngs-field-input-height",
        "--ngs-font-size-xs",
        "--ngs-form-field-input-height",
        "--ngs-icon-size",
        "--ngs-radius-xl"
      ],
      "example": null
    },
    {
      "name": "code-highlighter",
      "title": "Code Highlighter",
      "overviewName": "Code Highlighter",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/code-highlighter",
      "publicApi": "projects/components/code-highlighter/public-api.ts",
      "sourceRoot": "projects/components/code-highlighter/src",
      "docsPath": "/components/code-highlighter",
      "docsOverviewSource": "projects/docs/src/app/components/code-highlighter/overview/overview.html",
      "purpose": "Render formatted source code snippets with syntax highlighting.",
      "useWhen": "Use in docs, developer tools, examples, and configuration previews.",
      "exampleTopics": [
        "Basic Code Highlighter",
        "With Title",
        "Diff",
        "Highlight Lines",
        "With Language and Copy",
        "Code highlighter with title",
        "Code highlighter diff",
        "Code highlighter highlight lines",
        "Code highlighter full"
      ],
      "minimalExample": "<div class=\"mb-5\">\n  <ngs-segmented [(ngModel)]=\"appearance\">\n    <ngs-segmented-button value=\"bordered\">Bordered</ngs-segmented-button>\n    <ngs-segmented-button value=\"none\">None</ngs-segmented-button>\n  </ngs-segmented>\n</div>\n<ngs-code-highlighter [code]=\"sampleTs\" language=\"ts\" [appearance]=\"appearance()\" />",
      "exampleFiles": [
        {
          "name": "basic-code-highlighter-example",
          "title": "Basic code highlighter",
          "file": "projects/docs/src/app/components/code-highlighter/_examples/basic-code-highlighter-example/basic-code-highlighter-example.html",
          "source": "<div class=\"mb-5\">\n  <ngs-segmented [(ngModel)]=\"appearance\">\n    <ngs-segmented-button value=\"bordered\">Bordered</ngs-segmented-button>\n    <ngs-segmented-button value=\"none\">None</ngs-segmented-button>\n  </ngs-segmented>\n</div>\n<ngs-code-highlighter [code]=\"sampleTs\" language=\"ts\" [appearance]=\"appearance()\" />"
        },
        {
          "name": "code-highlighter-diff-example",
          "title": "Code highlighter diff",
          "file": "projects/docs/src/app/components/code-highlighter/_examples/code-highlighter-diff-example/code-highlighter-diff-example.html",
          "source": "<ngs-code-highlighter [code]=\"diffSample\"\n                      language=\"typescript\"\n                      [diff]=\"true\"\n                      title=\"Changes in app.component.ts\" />"
        },
        {
          "name": "code-highlighter-full-example",
          "title": "Code highlighter full",
          "file": "projects/docs/src/app/components/code-highlighter/_examples/code-highlighter-full-example/code-highlighter-full-example.html",
          "source": "<ngs-code-highlighter\n  [code]=\"code\"\n  language=\"typescript\"\n  title=\"app.component.ts\"\n  showLanguage\n  showCopyButton\n/>"
        }
      ],
      "previewAsset": "projects/components/code-highlighter/preview.svg",
      "selectors": [
        "ngs-code-highlighter"
      ],
      "exportedSymbols": [
        "CodeHighlighter"
      ],
      "inputs": [
        "appearance",
        "code",
        "diff",
        "disableOverflow",
        "highlightLines",
        "language",
        "showCopyButton",
        "showLanguage",
        "theme",
        "title"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-code-highlighter-bg",
        "--ngs-code-highlighter-border",
        "--ngs-code-highlighter-margin",
        "--ngs-code-highlighter-padding",
        "--ngs-code-highlighter-radius",
        "--ngs-code-highlighter-title-color",
        "--ngs-code-highlighter-title-padding",
        "--ngs-color-background",
        "--ngs-color-border",
        "--ngs-color-danger",
        "--ngs-color-neutral-500",
        "--ngs-color-primary",
        "--ngs-color-success",
        "--ngs-font-size-sm",
        "--ngs-font-size-xs",
        "--ngs-radius-xl"
      ],
      "example": null
    },
    {
      "name": "color-picker",
      "title": "Color Picker",
      "overviewName": "Color Picker",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/color-picker",
      "publicApi": "projects/components/color-picker/public-api.ts",
      "sourceRoot": "projects/components/color-picker/src",
      "docsPath": "/components/color-picker",
      "docsOverviewSource": "projects/docs/src/app/components/color-picker/overview/overview.html",
      "purpose": "Let users choose or edit a color value.",
      "useWhen": "Use in branding, theme customization, design tools, and visual editors.",
      "exampleTopics": [
        "Basic Color Picker",
        "Color Picker With Popover",
        "Input With Color Picker"
      ],
      "minimalExample": "<ngs-color-picker [(ngModel)]=\"color\" [asDropdown]=\"false\" class=\"mb-6\"/>\n<p>\n  Selected color: <strong>{{ color }}</strong>\n</p>\n<div ngs-color-picker-thumbnail [color]=\"color\"></div>",
      "exampleFiles": [
        {
          "name": "basic-color-picker-example",
          "title": "Basic color picker",
          "file": "projects/docs/src/app/components/color-picker/_examples/basic-color-picker-example/basic-color-picker-example.html",
          "source": "<ngs-color-picker [(ngModel)]=\"color\" [asDropdown]=\"false\" class=\"mb-6\"/>\n<p>\n  Selected color: <strong>{{ color }}</strong>\n</p>\n<div ngs-color-picker-thumbnail [color]=\"color\"></div>"
        },
        {
          "name": "color-picker-with-popover-example",
          "title": "Color picker with popover",
          "file": "projects/docs/src/app/components/color-picker/_examples/color-picker-with-popover-example/color-picker-with-popover-example.html",
          "source": "<div class=\"mb-6\">\n  <button ngs-color-picker-thumbnail\n          [color]=\"color\"\n          [ngsColorPickerTriggerFor]=\"colorPicker\"\n          class=\"cursor-pointer\"></button>\n  <ng-template #colorPicker>\n    <ngs-color-picker [(ngModel)]=\"color\"/>\n  </ng-template>\n</div>\n<p>\n  Selected color: <strong>{{ color }}</strong>\n</p>"
        },
        {
          "name": "input-with-color-picker-example",
          "title": "Input with color picker",
          "file": "projects/docs/src/app/components/color-picker/_examples/input-with-color-picker-example/input-with-color-picker-example.html",
          "source": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Color</ngs-label>\n  <input type=\"text\" [ngModel]=\"color\" readonly ngsInput placeholder=\"Select color\">\n  <button ngs-color-picker-thumbnail [color]=\"color\"\n          [ngsColorPickerTriggerFor]=\"colorPicker\"\n          ngsSuffix\n          class=\"cursor-pointer\"></button>\n  <ng-template #colorPicker>\n    <ngs-color-picker [(ngModel)]=\"color\" resultFormat=\"hex\" [showOpacity]=\"false\"/>\n  </ng-template>\n</ngs-form-field>\n<p>\n  Selected color: <strong>{{ color }}</strong>\n</p>"
        }
      ],
      "previewAsset": "projects/components/color-picker/preview.svg",
      "selectors": [
        "[inputChange]",
        "[ngs-color-picker-thumbnail]",
        "[ngsColorPickerTriggerFor]",
        "ngs-alpha",
        "ngs-color-picker",
        "ngs-color-picker-thumbnail",
        "ngs-hue",
        "ngs-saturation"
      ],
      "exportedSymbols": [
        "Alpha",
        "BaseComponent",
        "ChunksPipe",
        "ColorPicker",
        "ColorPickerInputDirective",
        "ColorPickerPosition",
        "ColorPickerResultFormat",
        "ColorPickerThumbnail",
        "ColorPickerTriggerForDirective",
        "Hue",
        "PositionManager",
        "ReversePipe",
        "Saturation"
      ],
      "inputs": [
        "asDropdown",
        "color",
        "colorFromHue",
        "disabled",
        "max",
        "min",
        "position",
        "resultFormat",
        "showOpacity",
        "tinyColor"
      ],
      "outputs": [
        "alphaChange",
        "closed",
        "colorChange",
        "inputChange",
        "opened",
        "rawColorChange"
      ],
      "cssTokens": [
        "--ngs-color-picker-alpha-height",
        "--ngs-color-picker-alpha-pointer-border",
        "--ngs-color-picker-alpha-pointer-shadow",
        "--ngs-color-picker-alpha-pointer-size",
        "--ngs-color-picker-alpha-width",
        "--ngs-color-picker-as-dropdown-shadow",
        "--ngs-color-picker-bg",
        "--ngs-color-picker-border",
        "--ngs-color-picker-border-radius",
        "--ngs-color-picker-gap",
        "--ngs-color-picker-hue-height",
        "--ngs-color-picker-hue-pointer-border",
        "--ngs-color-picker-hue-pointer-shadow",
        "--ngs-color-picker-hue-pointer-size",
        "--ngs-color-picker-hue-width",
        "--ngs-color-picker-margin-offset",
        "--ngs-color-picker-padding",
        "--ngs-color-picker-saturation-height",
        "--ngs-color-picker-saturation-pointer-border",
        "--ngs-color-picker-saturation-pointer-shadow",
        "--ngs-color-picker-saturation-pointer-size",
        "--ngs-color-picker-saturation-width",
        "--ngs-color-picker-thumbnail-bg",
        "--ngs-color-picker-thumbnail-border-radius",
        "--ngs-color-picker-thumbnail-size",
        "--ngs-dropdown-bg",
        "--ngs-dropdown-border",
        "--ngs-dropdown-radius",
        "--ngs-dropdown-shadow",
        "--ngs-shadow-md",
        "--ngs-transition-transform"
      ],
      "example": null
    },
    {
      "name": "color-scheme",
      "title": "Color Scheme",
      "overviewName": "Color Scheme",
      "category": null,
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/color-scheme",
      "publicApi": "projects/components/color-scheme/public-api.ts",
      "sourceRoot": "projects/components/color-scheme/src",
      "docsPath": null,
      "docsOverviewSource": null,
      "purpose": "Switch the application color scheme between light, dark, and auto.",
      "useWhen": "Use anywhere in the UI where users need to control the global light, dark, or auto theme mode. Do not use it for brand colors, accent colors, object colors, statuses, or palettes.",
      "exampleTopics": [],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/color-scheme/preview.svg",
      "selectors": [
        "[ngsColorSchemeAuto]",
        "[ngsColorSchemeDark]",
        "[ngsColorSchemeLight]",
        "ngs-color-scheme-switcher"
      ],
      "exportedSymbols": [
        "COLOR_SCHEME_LOCAL_KEY",
        "ColorScheme",
        "ColorSchemeAutoDirective",
        "ColorSchemeDarkDirective",
        "ColorSchemeLightDirective",
        "ColorSchemeStore",
        "ColorSchemeSwitcher",
        "ResolvedColorScheme"
      ],
      "inputs": [],
      "outputs": [
        "colorSchemeChanged"
      ],
      "cssTokens": [],
      "example": null
    },
    {
      "name": "color-switcher",
      "title": "Color Switcher",
      "overviewName": "Color Switcher",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/color-switcher",
      "publicApi": "projects/components/color-switcher/public-api.ts",
      "sourceRoot": "projects/components/color-switcher/src",
      "docsPath": "/components/color-switcher",
      "docsOverviewSource": "projects/docs/src/app/components/color-switcher/overview/overview.html",
      "purpose": "Let users choose one color from a fixed allowed palette.",
      "useWhen": "Use for brand color presets, accent color presets, project colors, category colors, tag colors, tenant branding, and theme playground controls. Use ColorPicker for arbitrary custom colors and ColorScheme for light, dark, or auto theme mode.",
      "exampleTopics": [
        "Basic Color Switcher",
        "Custom Palette",
        "Disabled State",
        "Form Control",
        "Basic brand colors",
        "Brand colors custom colors",
        "Brand colors disabled",
        "Brand colors as form control"
      ],
      "minimalExample": "<ngs-color-switcher [selectedColor]=\"selectedColor\"\n                    (colorChange)=\"onColorChange($event)\"/>\n<div class=\"mt-3\">\n  Selected color: <span class=\"uppercase\">{{ selectedColor }}</span>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-brand-colors-example",
          "title": "Basic brand colors",
          "file": "projects/docs/src/app/components/color-switcher/_examples/basic-brand-colors-example/basic-brand-colors-example.html",
          "source": "<ngs-color-switcher [selectedColor]=\"selectedColor\"\n                    (colorChange)=\"onColorChange($event)\"/>\n<div class=\"mt-3\">\n  Selected color: <span class=\"uppercase\">{{ selectedColor }}</span>\n</div>"
        },
        {
          "name": "brand-colors-as-form-control-example",
          "title": "Brand colors as form control",
          "file": "projects/docs/src/app/components/color-switcher/_examples/brand-colors-as-form-control-example/brand-colors-as-form-control-example.html",
          "source": "<ngs-color-switcher [(ngModel)]=\"selectedColor\"/>\n<div class=\"mt-3\">\n  Selected color: <span class=\"uppercase\">{{ selectedColor }}</span>\n</div>"
        },
        {
          "name": "brand-colors-custom-colors-example",
          "title": "Brand colors custom colors",
          "file": "projects/docs/src/app/components/color-switcher/_examples/brand-colors-custom-colors-example/brand-colors-custom-colors-example.html",
          "source": "<ngs-color-switcher [colors]=\"colors\"\n                    [selectedColor]=\"selectedColor\"\n                    (colorChange)=\"onColorChange($event)\"/>\n<div class=\"mt-3\">\n  Selected color: <span class=\"uppercase\">{{ selectedColor }}</span>\n</div>"
        }
      ],
      "previewAsset": "projects/components/color-switcher/preview.svg",
      "selectors": [
        "ngs-color-switcher"
      ],
      "exportedSymbols": [
        "ColorSwitcher"
      ],
      "inputs": [
        "colors",
        "disabled",
        "selectedColor"
      ],
      "outputs": [
        "colorChange"
      ],
      "cssTokens": [
        "--ngs-brand-colors-color-size",
        "--ngs-brand-colors-gap",
        "--ngs-shadow-sm"
      ],
      "example": null
    },
    {
      "name": "command-bar",
      "title": "Command Bar",
      "overviewName": "Command Bar",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/command-bar",
      "publicApi": "projects/components/command-bar/public-api.ts",
      "sourceRoot": "projects/components/command-bar/src",
      "docsPath": "/components/command-bar",
      "docsOverviewSource": "projects/docs/src/app/components/command-bar/overview/overview.html",
      "purpose": "Show a floating contextual action bar for selected items or temporary page state.",
      "useWhen": "Use when rows, files, cards, canvas objects, or other page items are selected and users need quick actions such as edit, delete, archive, move, export, or share. Do not use it as a command palette, search UI, dropdown menu, header toolbar, navigation bar, autocomplete, or normal form action row.",
      "exampleTopics": [
        "Basic Command Bar"
      ],
      "minimalExample": "<ngs-checkbox [(ngModel)]=\"open\">Show command bar</ngs-checkbox>\n<div>\n  <ngs-form-field class=\"w-1/2 mt-4\">\n    <ngs-label>Tooltip position</ngs-label>\n    <ngs-select [formControl]=\"position\">\n      @for (positionOption of positionOptions; track positionOption) {\n        <ngs-option [value]=\"positionOption\">{{ positionOption }}</ngs-option>\n      }\n    </ngs-select>\n  </ngs-form-field>\n</div>\n<ngs-command-bar [open]=\"open\" [position]=\"position.value!\">\n  2 selected\n  <ngs-command-bar-divider/>\n  <ngs-command-bar-command shortcut=\"e\">Edit</ngs-command-bar-command>\n  <ngs-command-bar-divider/>\n  <ngs-command-bar-command shortcut=\"d\">Delete</ngs-command-bar-command>\n</ngs-command-bar>",
      "exampleFiles": [
        {
          "name": "basic-command-bar-example",
          "title": "Basic command bar",
          "file": "projects/docs/src/app/components/command-bar/_examples/basic-command-bar-example/basic-command-bar-example.html",
          "source": "<ngs-checkbox [(ngModel)]=\"open\">Show command bar</ngs-checkbox>\n<div>\n  <ngs-form-field class=\"w-1/2 mt-4\">\n    <ngs-label>Tooltip position</ngs-label>\n    <ngs-select [formControl]=\"position\">\n      @for (positionOption of positionOptions; track positionOption) {\n        <ngs-option [value]=\"positionOption\">{{ positionOption }}</ngs-option>\n      }\n    </ngs-select>\n  </ngs-form-field>\n</div>\n<ngs-command-bar [open]=\"open\" [position]=\"position.value!\">\n  2 selected\n  <ngs-command-bar-divider/>\n  <ngs-command-bar-command shortcut=\"e\">Edit</ngs-command-bar-command>\n  <ngs-command-bar-divider/>\n  <ngs-command-bar-command shortcut=\"d\">Delete</ngs-command-bar-command>\n</ngs-command-bar>"
        }
      ],
      "previewAsset": "projects/components/command-bar/preview.svg",
      "selectors": [
        "[ngs-command-bar-command]",
        "ngs-command-bar",
        "ngs-command-bar-command",
        "ngs-command-bar-divider"
      ],
      "exportedSymbols": [
        "CommandBar",
        "CommandBarCommand",
        "CommandBarDivider",
        "CommandBarPosition"
      ],
      "inputs": [
        "open",
        "position",
        "shortcut"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-neutral-100",
        "--ngs-color-neutral-200",
        "--ngs-color-neutral-300",
        "--ngs-color-neutral-600",
        "--ngs-color-neutral-700",
        "--ngs-color-neutral-800",
        "--ngs-color-neutral-950",
        "--ngs-color-primary-200",
        "--ngs-command-bar-bg",
        "--ngs-command-bar-border",
        "--ngs-command-bar-border-radius",
        "--ngs-command-bar-color",
        "--ngs-command-bar-command-color",
        "--ngs-command-bar-command-font-size",
        "--ngs-command-bar-command-gap",
        "--ngs-command-bar-command-height",
        "--ngs-command-bar-command-hover-bg",
        "--ngs-command-bar-command-hover-color",
        "--ngs-command-bar-command-padding",
        "--ngs-command-bar-command-shortcut-bg",
        "--ngs-command-bar-command-shortcut-border",
        "--ngs-command-bar-command-shortcut-border-radius",
        "--ngs-command-bar-command-shortcut-color",
        "--ngs-command-bar-command-shortcut-font-size",
        "--ngs-command-bar-command-shortcut-padding",
        "--ngs-command-bar-command-shortcut-size",
        "--ngs-command-bar-content-padding",
        "--ngs-command-bar-divider-bg",
        "--ngs-command-bar-divider-height",
        "--ngs-command-bar-divider-width",
        "--ngs-command-bar-font-size",
        "--ngs-command-bar-height",
        "--ngs-command-bar-margin",
        "--ngs-command-bar-padding",
        "--ngs-command-bar-shadow",
        "--ngs-command-bar-value-color",
        "--ngs-command-bar-zindex",
        "--ngs-font-size-sm",
        "--ngs-font-size-xs",
        "--ngs-radius-lg",
        "--ngs-shadow-lg"
      ],
      "example": null
    },
    {
      "name": "comment-editor",
      "title": "Comment Editor",
      "overviewName": "Comment Editor",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/comment-editor",
      "publicApi": "projects/components/comment-editor/public-api.ts",
      "sourceRoot": "projects/components/comment-editor/src",
      "docsPath": "/components/comment-editor",
      "docsOverviewSource": "projects/docs/src/app/components/comment-editor/overview/overview.html",
      "purpose": "Provide a simplified text editor for quick messages, comments, threads, and replies.",
      "useWhen": "Use in tasks, projects, activity feeds, reviews, support threads, and conversation replies where users write a short or medium message and send it immediately. Do not use for long-form documents, CMS pages, complex content editing, markdown editing, code editing, search, or display-only comments.",
      "exampleTopics": [
        "Basic Comment Editor",
        "Toolbar Always Visible",
        "Cancel Button Always Visible",
        "Custom Button Labels",
        "Full View Mode",
        "Upload Error",
        "Max Content Height",
        "Custom Icons",
        "Comment editor with toolbar",
        "Comment editor cancel button always visible",
        "Comment editor custom button labels",
        "Comment editor with full view mode",
        "Comment editor with upload error",
        "Comment editor with max content height",
        "Comment editor with custom icons"
      ],
      "minimalExample": "<ngs-comment-editor #editor [imageUploadFn]=\"uploadFn\" (sent)=\"onSent($event)\"\n                    class=\"rounded-xl border border-muted\">\n  <ngs-comment-editor-toolbar>\n    <button ngsIconButton ngsTooltip=\"Bold\"\n            ngsCommentEditorCommand ngsCommentEditorCommandBold>\n      <ngs-icon name=\"fluent:text-bold-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Italic\"\n            ngsCommentEditorCommand ngsCommentEditorCommandItalic>\n      <ngs-icon name=\"fluent:text-italic-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Strike\"\n            ngsCommentEditorCommand ngsCommentEditorCommandStrike>\n      <ngs-icon name=\"fluent:text-strikethrough-24-regular\"/>\n    </button>\n    <ngs-comment-editor-divider />\n    <button ngsIconButton ngsTooltip=\"Bullet List\"\n            ngsCommentEditorCommand ngsCommentEditorCommandBulletList>\n      <ngs-icon name=\"fluent:text-bullet-list-ltr-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Ordered List\"\n            ngsCommentEditorCommand ngsCommentEditorCommandOrderedList>\n      <ngs-icon name=\"fluent:text-number-list-ltr-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Blockquote\"\n            ngsCommentEditorCommand ngsCommentEditorCommandBlockquote>\n      <ngs-icon name=\"fluent:text-quote-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Code Block\"\n            ngsCommentEditorCommand ngsCommentEditorCommandCodeBlock>\n      <ngs-icon name=\"fluent:code-block-24-regular\"/>\n    </button>\n    <ngs-comment-editor-divider />\n    <button ngsIconButton ngsToolt\n...",
      "exampleFiles": [
        {
          "name": "basic-comment-editor-example",
          "title": "Basic comment editor",
          "file": "projects/docs/src/app/components/comment-editor/_examples/basic-comment-editor-example/basic-comment-editor-example.html",
          "source": "<ngs-comment-editor #editor [imageUploadFn]=\"uploadFn\" (sent)=\"onSent($event)\"\n                    class=\"rounded-xl border border-muted\">\n  <ngs-comment-editor-toolbar>\n    <button ngsIconButton ngsTooltip=\"Bold\"\n            ngsCommentEditorCommand ngsCommentEditorCommandBold>\n      <ngs-icon name=\"fluent:text-bold-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Italic\"\n            ngsCommentEditorCommand ngsCommentEditorCommandItalic>\n      <ngs-icon name=\"fluent:text-italic-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Strike\"\n            ngsCommentEditorCommand ngsCommentEditorCommandStrike>\n      <ngs-icon name=\"fluent:text-strikethrough-24-regular\"/>\n    </button>\n    <ngs-comment-editor-divider />\n    <button ngsIconButton ngsTooltip=\"Bullet List\"\n            ngsCommentEditorCommand ngsCommentEditorCommandBulletList>\n      <ngs-icon name=\"fluent:text-bullet-list-ltr-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Ordered List\"\n            ngsCommentEditorCommand ngsCommentEditorCommandOrderedList>\n      <ngs-icon name=\"fluent:text-number-list-ltr-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Blockquote\"\n            ngsCommentEditorCommand ngsCommentEditorCommandBlockquote>\n      <ngs-icon name=\"fluent:text-quote-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Code Block\"\n            ngsCommentEditorCommand ngsCommentEditorCommandCodeBlock>\n      <ngs-icon name=\"fluent:code-block-24-regular\"/>\n    </button>\n    <ngs-comment-editor-divider />\n    <button ngsIconButton ngsToolt\n..."
        },
        {
          "name": "comment-editor-cancel-button-always-visible-example",
          "title": "Comment editor cancel button always visible",
          "file": "projects/docs/src/app/components/comment-editor/_examples/comment-editor-cancel-button-always-visible-example/comment-editor-cancel-button-always-visible-example.html",
          "source": "<ngs-comment-editor #editor cancelButtonAlwaysVisible [imageUploadFn]=\"uploadFn\" (sent)=\"onSent($event)\"\n                    class=\"rounded-xl border border-muted \">\n  <ngs-comment-editor-toolbar>\n    <button ngsIconButton ngsTooltip=\"Bold\"\n            ngsCommentEditorCommand ngsCommentEditorCommandBold>\n      <ngs-icon name=\"fluent:text-bold-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Italic\"\n            ngsCommentEditorCommand ngsCommentEditorCommandItalic>\n      <ngs-icon name=\"fluent:text-italic-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Strike\"\n            ngsCommentEditorCommand ngsCommentEditorCommandStrike>\n      <ngs-icon name=\"fluent:text-strikethrough-24-regular\"/>\n    </button>\n    <ngs-comment-editor-divider />\n    <button ngsIconButton ngsTooltip=\"Bullet List\"\n            ngsCommentEditorCommand ngsCommentEditorCommandBulletList>\n      <ngs-icon name=\"fluent:text-bullet-list-ltr-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Ordered List\"\n            ngsCommentEditorCommand ngsCommentEditorCommandOrderedList>\n      <ngs-icon name=\"fluent:text-number-list-ltr-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Blockquote\"\n            ngsCommentEditorCommand ngsCommentEditorCommandBlockquote>\n      <ngs-icon name=\"fluent:text-quote-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Code Block\"\n            ngsCommentEditorCommand ngsCommentEditorCommandCodeBlock>\n      <ngs-icon name=\"fluent:code-block-24-regular\"/>\n    </button>\n    <ngs-comment-editor-divider />\n    <bu\n..."
        },
        {
          "name": "comment-editor-custom-button-labels-example",
          "title": "Comment editor custom button labels",
          "file": "projects/docs/src/app/components/comment-editor/_examples/comment-editor-custom-button-labels-example/comment-editor-custom-button-labels-example.html",
          "source": "<ngs-comment-editor #editor buttonCancelLabel=\"Close\" buttonSendLabel=\"Reply\"\n                    cancelButtonAlwaysVisible\n                    [imageUploadFn]=\"uploadFn\" (sent)=\"onSent($event)\"\n                    class=\"rounded-xl border border-muted \">\n  <ngs-comment-editor-toolbar>\n    <button ngsIconButton ngsTooltip=\"Bold\"\n            ngsCommentEditorCommand ngsCommentEditorCommandBold>\n      <ngs-icon name=\"fluent:text-bold-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Italic\"\n            ngsCommentEditorCommand ngsCommentEditorCommandItalic>\n      <ngs-icon name=\"fluent:text-italic-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Strike\"\n            ngsCommentEditorCommand ngsCommentEditorCommandStrike>\n      <ngs-icon name=\"fluent:text-strikethrough-24-regular\"/>\n    </button>\n    <ngs-comment-editor-divider />\n    <button ngsIconButton ngsTooltip=\"Bullet List\"\n            ngsCommentEditorCommand ngsCommentEditorCommandBulletList>\n      <ngs-icon name=\"fluent:text-bullet-list-ltr-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Ordered List\"\n            ngsCommentEditorCommand ngsCommentEditorCommandOrderedList>\n      <ngs-icon name=\"fluent:text-number-list-ltr-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Blockquote\"\n            ngsCommentEditorCommand ngsCommentEditorCommandBlockquote>\n      <ngs-icon name=\"fluent:text-quote-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Code Block\"\n            ngsCommentEditorCommand ngsCommentEditorCommandCodeBlock>\n      <ngs-icon name\n..."
        }
      ],
      "previewAsset": "projects/components/comment-editor/preview.svg",
      "selectors": [
        "[ngsCommentEditorCommand]",
        "[ngsCommentEditorCommandBlockquote]",
        "[ngsCommentEditorCommandBold]",
        "[ngsCommentEditorCommandBulletList]",
        "[ngsCommentEditorCommandCode]",
        "[ngsCommentEditorCommandCodeBlock]",
        "[ngsCommentEditorCommandEditLink]",
        "[ngsCommentEditorCommandImage]",
        "[ngsCommentEditorCommandItalic]",
        "[ngsCommentEditorCommandLink]",
        "[ngsCommentEditorCommandOrderedList]",
        "[ngsCommentEditorCommandStrike]",
        "[ngsCommentEditorCommandToggleToolbar]",
        "[ngsCommentEditorCommandUnsetLink]",
        "[ngsCommentEditorCommandYoutube]",
        "ngs-comment-editor",
        "ngs-comment-editor-bubble-menu",
        "ngs-comment-editor-divider",
        "ngs-comment-editor-footer-bar",
        "ngs-comment-editor-toolbar",
        "ngs-image-uploading-placeholder",
        "ngs-link",
        "ngs-youtube"
      ],
      "exportedSymbols": [
        "AngularNodeView",
        "AngularNodeViewRenderer",
        "AngularRenderer",
        "COMMENT_EDITOR",
        "COMMENT_EDITOR_BUBBLE_MENU",
        "CommentEditor",
        "CommentEditorAPI",
        "CommentEditorBubbleMenu",
        "CommentEditorCommandBlockquoteDirective",
        "CommentEditorCommandBoldDirective",
        "CommentEditorCommandBulletListDirective",
        "CommentEditorCommandCodeBlockDirective",
        "CommentEditorCommandCodeDirective",
        "CommentEditorCommandDirective",
        "CommentEditorCommandEditLinkDirective",
        "CommentEditorCommandImageDirective",
        "CommentEditorCommandItalicDirective",
        "CommentEditorCommandLinkDirective",
        "CommentEditorCommandOrderedListDirective",
        "CommentEditorCommandStrikeDirective",
        "CommentEditorCommandToggleToolbarDirective",
        "CommentEditorCommandUnsetLinkDirective",
        "CommentEditorCommandYoutubeDirective",
        "CommentEditorDivider",
        "CommentEditorFooterBar",
        "CommentEditorInterface",
        "CommentEditorToolbar",
        "ImageUploadingPlaceholder",
        "LinkDialog",
        "SingleEmoji",
        "YoutubeDialog"
      ],
      "inputs": [
        "allowEmptyContent",
        "autoClear",
        "buttonCancelLabel",
        "buttonSendLabel",
        "cancelButtonAlwaysVisible",
        "contentMaxHeight",
        "decorations",
        "deleteNode",
        "editor",
        "extension",
        "fullViewMode",
        "getPos",
        "innerDecorations",
        "loading",
        "node",
        "placeholder",
        "selected",
        "toolbarAlwaysVisible",
        "updateAttributes",
        "view"
      ],
      "outputs": [
        "canceled",
        "fileSelected",
        "sent"
      ],
      "cssTokens": [
        "--ngs-color-border",
        "--ngs-color-neutral-100",
        "--ngs-color-neutral-200",
        "--ngs-color-neutral-300",
        "--ngs-color-neutral-500",
        "--ngs-color-neutral-650",
        "--ngs-color-neutral-700",
        "--ngs-color-neutral-900",
        "--ngs-color-neutral-950",
        "--ngs-color-primary",
        "--ngs-color-tertiary-100",
        "--ngs-color-tertiary-200",
        "--ngs-color-tertiary-300",
        "--ngs-color-tertiary-700",
        "--ngs-color-tertiary-800",
        "--ngs-comment-editor-bg",
        "--ngs-comment-editor-content-max-height",
        "--ngs-dropdown-bg",
        "--ngs-font-size-xl",
        "--ngs-icon-size",
        "--ngs-radius-xl",
        "--ngs-shadow-sm"
      ],
      "example": null
    },
    {
      "name": "comparison-slider",
      "title": "Comparison Slider",
      "overviewName": "Comparison Slider",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/comparison-slider",
      "publicApi": "projects/components/comparison-slider/public-api.ts",
      "sourceRoot": "projects/components/comparison-slider/src",
      "docsPath": "/components/comparison-slider",
      "docsOverviewSource": "projects/docs/src/app/components/comparison-slider/overview/overview.html",
      "purpose": "Compare two aligned visual layers with a draggable before-and-after divider.",
      "useWhen": "Use for before-and-after images, photo edits, design changes, product variations, UI state diffs, image processing results, maps, reports, and other visual diffs. Give the component a stable width and height or aspect ratio, and do not use it as a gallery, carousel, image viewer, range input, data comparison table, or text comparison tool.",
      "exampleTopics": [
        "Basic Comparison Slider"
      ],
      "minimalExample": "<ngs-comparison-slider class=\"rounded-2xl w-[800px] h-[450px]\">\n  <img ngsComparisonSliderBeforeImage src=\"assets/chairs.jpg\">\n  <img ngsComparisonSliderAfterImage src=\"assets/chairs2.jpg\">\n</ngs-comparison-slider>",
      "exampleFiles": [
        {
          "name": "basic-comparison-slider-example",
          "title": "Basic comparison slider",
          "file": "projects/docs/src/app/components/comparison-slider/_examples/basic-comparison-slider-example/basic-comparison-slider-example.html",
          "source": "<ngs-comparison-slider class=\"rounded-2xl w-[800px] h-[450px]\">\n  <img ngsComparisonSliderBeforeImage src=\"assets/chairs.jpg\">\n  <img ngsComparisonSliderAfterImage src=\"assets/chairs2.jpg\">\n</ngs-comparison-slider>"
        }
      ],
      "previewAsset": "projects/components/comparison-slider/preview.svg",
      "selectors": [
        "[ngsComparisonSliderAfterImage]",
        "[ngsComparisonSliderBeforeImage]",
        "ngs-comparison-slider"
      ],
      "exportedSymbols": [
        "ComparisonSlider",
        "ComparisonSliderAfterImageDirective",
        "ComparisonSliderBeforeImageDirective"
      ],
      "inputs": [
        "initialPosition"
      ],
      "outputs": [],
      "cssTokens": [],
      "example": null
    },
    {
      "name": "confirm",
      "title": "Confirm",
      "overviewName": "Confirm",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/confirm",
      "publicApi": "projects/components/confirm/public-api.ts",
      "sourceRoot": "projects/components/confirm/src",
      "docsPath": "/components/confirm",
      "docsOverviewSource": "projects/docs/src/app/components/confirm/overview/overview.html",
      "purpose": "Show a standardized confirmation dialog for a short binary decision before an important action.",
      "useWhen": "Use through ConfirmManager.open({ title, description }) before delete, unpublish, archive, reset, discard changes, leave with unsaved changes, bulk, destructive, irreversible, or high-impact operations. Do not use for long forms, custom modal layouts, wizards, informational dialogs, settings panels, or choices with more than two outcomes; use Dialog for custom modal content.",
      "exampleTopics": [
        "Basic Confirm",
        "Confirm From Dialog",
        "Confirm form modal",
        "Dialog with confirmation"
      ],
      "minimalExample": "<button ngsButton=\"filled\" (click)=\"open()\">Open confirmation</button>",
      "exampleFiles": [
        {
          "name": "basic-confirm-example",
          "title": "Basic confirm",
          "file": "projects/docs/src/app/components/confirm/_examples/basic-confirm-example/basic-confirm-example.html",
          "source": "<button ngsButton=\"filled\" (click)=\"open()\">Open confirmation</button>"
        },
        {
          "name": "confirm-form-modal-example",
          "title": "Confirm form modal",
          "file": "projects/docs/src/app/components/confirm/_examples/confirm-form-modal-example/confirm-form-modal-example.html",
          "source": "<button ngsButton=\"filled\" (click)=\"open()\">Open dialog</button>"
        },
        {
          "name": "dialog-with-confirmation",
          "title": "Dialog with confirmation",
          "file": "projects/docs/src/app/components/confirm/_examples/dialog-with-confirmation/dialog-with-confirmation.html",
          "source": "<div class=\"w-[500px]\">\n  <h3 class=\"ngs-title-large\" ngs-dialog-title>Confirmation</h3>\n  <ngs-dialog-content>\n    <button ngsButton=\"filled\" (click)=\"open()\">Open confirmation</button>\n  </ngs-dialog-content>\n  <ngs-dialog-actions align=\"end\">\n    <button ngsButton=\"filled\" cdkFocusInitial (click)=\"onNoClick()\">Ok</button>\n  </ngs-dialog-actions>\n</div>"
        }
      ],
      "previewAsset": "projects/components/confirm/preview.svg",
      "selectors": [
        "ngs-confirm"
      ],
      "exportedSymbols": [
        "Confirm",
        "ConfirmManager",
        "ConfirmOptions",
        "ConfirmRef"
      ],
      "inputs": [],
      "outputs": [],
      "cssTokens": [],
      "example": null
    },
    {
      "name": "content-editor",
      "title": "Content Editor",
      "overviewName": "Content Editor",
      "category": "libraries",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/content-editor",
      "publicApi": "projects/components/content-editor/public-api.ts",
      "sourceRoot": "projects/components/content-editor/src",
      "docsPath": "/libraries/content-editor",
      "docsOverviewSource": "projects/docs/src/app/libraries/content-editor/overview/overview.html",
      "purpose": "Provide a block-based builder for structured long-form content.",
      "useWhen": "Use ngs-content-editor-builder for articles, pages, documentation, knowledge base entries, rich notes, editable descriptions, landing content, and CMS-like editing workflows built from blocks such as paragraph, heading, list, quote, code, divider, table, image, video, and embed. Use ngs-content-editor-renderer for saved block previews and display-only content. Do not use for quick messages, comments, threads, or reply composers; use CommentEditor for that. Do not use for a simple text field or small rich text input; use TextEditor, Input, or Textarea depending on the task.",
      "exampleTopics": [
        "Content Editor"
      ],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/content-editor/preview.svg",
      "selectors": [
        "[ngsBlockSelection]",
        "[ngsContentChangesObserver]",
        "[ngsContentEditorContentEditable]",
        "[ngsContentObserver]",
        "[ngsFocusMonitor]",
        "[ngsTableColumnsManager]",
        "[ngsTableRowsManager]",
        "[ngsTextSelectionPopup]",
        "app-embed-block",
        "ngs-add-link",
        "ngs-audio-recorder",
        "ngs-code-block",
        "ngs-command-bar",
        "ngs-content-editor-builder",
        "ngs-content-editor-code-renderer",
        "ngs-content-editor-divider-renderer",
        "ngs-content-editor-embed-renderer",
        "ngs-content-editor-heading-renderer",
        "ngs-content-editor-image-renderer",
        "ngs-content-editor-list-renderer",
        "ngs-content-editor-paragraph-renderer",
        "ngs-content-editor-quote-renderer",
        "ngs-content-editor-renderer",
        "ngs-content-editor-table-renderer",
        "ngs-content-editor-video-renderer",
        "ngs-divider-block",
        "ngs-draggable-table",
        "ngs-edit-link",
        "ngs-heading-block",
        "ngs-image-block",
        "ngs-list-block",
        "ngs-paragraph-block",
        "ngs-quote-block",
        "ngs-table-block",
        "ngs-text-color",
        "ngs-video-block",
        "table[ngsResizableTable]"
      ],
      "exportedSymbols": [
        "AddLinkDialog",
        "AudioRecorderComponent",
        "BaseErrorHandler",
        "BlockSelectionDirective",
        "Change",
        "Changeset",
        "CodeBlockComponent",
        "CodeBlockDef",
        "CommandBarComponent",
        "compare",
        "CONTENT_BUILDER",
        "CONTENT_EDITOR_BLOCK",
        "CONTENT_EDITOR_BLOCK_RENDERERS",
        "CONTENT_EDITOR_DEFAULT_RENDERERS",
        "ContentBuilderComponent",
        "ContentBuilderStore",
        "ContentChangesObserverDirective",
        "ContentEditorBlock",
        "ContentEditorBlockDef",
        "ContentEditorBlockEmpty",
        "ContentEditorBlockRendererDef",
        "ContentEditorBlockRendererInputs",
        "ContentEditorBlockRendererInputSignals",
        "ContentEditorCodeBlockSettings",
        "ContentEditorCodeLanguage",
        "ContentEditorCodeRenderer",
        "ContentEditorCodeRendererSettings",
        "ContentEditorContentEditableDirective",
        "ContentEditorDataBlock",
        "ContentEditorDividerRenderer",
        "ContentEditorEmbedBlockSettings",
        "ContentEditorEmbedContent",
        "ContentEditorEmbedRenderer",
        "ContentEditorHeadingBlockSettings",
        "ContentEditorHeadingRenderer",
        "ContentEditorImageBlockSettings",
        "ContentEditorImageContent",
        "ContentEditorImageRenderer",
        "ContentEditorItemProperty",
        "ContentEditorListItem",
        "ContentEditorListRenderer",
        "ContentEditorListSettings",
        "ContentEditorOptions",
        "ContentEditorParagraphRenderer",
        "ContentEditorQuoteBlock",
        "ContentEditorQuoteBlockContent",
        "ContentEditorQuoteRenderer",
        "ContentEditorQuoteRendererContent",
        "ContentEditorQuoteRendererContentPart",
        "ContentEditorRenderer",
        "ContentEditorSuggestionHeading",
        "ContentEditorSuggestionItem",
        "ContentEditorTableBlockSettings",
        "ContentEditorTableCell",
        "ContentEditorTableRenderer",
        "ContentEditorTextAlignment",
        "ContentEditorVideoBlockSettings",
        "ContentEditorVideoContent",
        "ContentEditorVideoRenderer",
        "ContentObserverDirective",
        "CursorController",
        "DataAvailableHandler",
        "DividerBlockComponent",
        "DividerBlockDef",
        "DraggableTableComponent",
        "EditLinkDialog",
        "ElementAttributes",
        "EmbedBlock",
        "EmbedService",
        "FocusMonitorDirective",
        "getDimensionAttribute",
        "getHtmlContent",
        "getTextAlignment",
        "HeadingBlockComponent",
        "HeadingBlockDef",
        "ImageBlockComponent",
        "ImageBlockDef",
        "ISelectionPopupComponent",
        "ListBlockComponent",
        "ListBlockDef",
        "MicrophoneRecorder",
        "MicrophoneRecorderOptions",
        "ParagraphBlockComponent",
        "ParagraphBlockDef",
        "provideContentEditorRenderer",
        "provideContentEditorRenderers",
        "QuoteBlockComponent",
        "QuoteBlockDef",
        "RecognitionErrorHandler",
        "RecognitionLifeCycleHandler",
        "RecognitionResult",
        "RecognitionResultHandler",
        "ResizableTableDirective",
        "StopHandler",
        "TableBlockComponent",
        "TableBlockDef",
        "TableColumnsManagerDirective",
        "TableRowsManagerDirective",
        "TextAlignment",
        "TextColor",
        "TextColorComponent",
        "TextHighlightService",
        "TextSelectionPopupDirective",
        "VideoBlockComponent"
      ],
      "inputs": [
        "_alt",
        "_caption",
        "_settings",
        "autoScrollContainerSelector",
        "backgroundColors",
        "block",
        "blockSelector",
        "captionPlaceholder",
        "closestContentObserverClass",
        "content",
        "contentChangedDelay",
        "detectAddedNode",
        "disabled",
        "id",
        "ignoreClasses",
        "index",
        "insertAtCursor",
        "minColumnWidth",
        "mutationObserverDebounceTime",
        "ngsContentEditorContentEditable",
        "observedElement",
        "options",
        "persistDraft",
        "placeholder",
        "props",
        "recentlyUsed",
        "recognitionLang",
        "resizeHandleWidth",
        "scrollContainer",
        "selectedBackgroundColor",
        "selectedTextColor",
        "selectionAreaClass",
        "settings",
        "stopTimeout",
        "suggestions",
        "targetComponent",
        "textColors",
        "type"
      ],
      "outputs": [
        "backgroundColorChanged",
        "columnAdded",
        "columnDeleted",
        "columnManagingEnd",
        "columnManagingStart",
        "columnMoved",
        "columnWidthChange",
        "columnWidthChangeEnd",
        "columnWidthChangeStart",
        "contentChanged",
        "displayTranscriptChange",
        "initialized",
        "moveEnd",
        "moveStart",
        "nodeAdded",
        "pressedEnter",
        "propsChanged",
        "rowAdded",
        "rowDeleted",
        "rowManagingEnd",
        "rowManagingStart",
        "rowMoved",
        "tagSelected",
        "textColorChanged"
      ],
      "cssTokens": [
        "--ngs-color-border",
        "--ngs-color-neutral-200",
        "--ngs-color-neutral-50",
        "--ngs-color-neutral-500",
        "--ngs-color-neutral-600",
        "--ngs-color-on-surface",
        "--ngs-color-primary",
        "--ngs-color-primary-100",
        "--ngs-color-primary-300",
        "--ngs-color-primary-400",
        "--ngs-color-secondary-fixed",
        "--ngs-color-surface-container",
        "--ngs-color-surface-container-high",
        "--ngs-color-surface-container-highest",
        "--ngs-color-surface-container-low",
        "--ngs-content-editor-builder-content-width",
        "--ngs-content-editor-renderer-block-gap",
        "--ngs-font-size-sm",
        "--ngs-list-list-item-one-line-container-height",
        "--ngs-radius-lg",
        "--ngs-radius-sm",
        "--ngs-shadow-lg",
        "--ngs-upload-area-padding"
      ],
      "example": null
    },
    {
      "name": "content-fade",
      "title": "Content Fade",
      "overviewName": "Content Fade",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/content-fade",
      "publicApi": "projects/components/content-fade/public-api.ts",
      "sourceRoot": "projects/components/content-fade/src",
      "docsPath": "/components/content-fade",
      "docsOverviewSource": "projects/docs/src/app/components/content-fade/overview/overview.html",
      "purpose": "Add a visual gradient fade at the edge of clipped or scrollable content.",
      "useWhen": "Use for horizontal preview text, teaser rows, chips, compact lists, or cropped inline content when an edge should fade out instead of ending abruptly. The parent container must provide width, height, scroll behavior, or overflow-hidden; ContentFade does not manage overflow, expansion, truncation, or scrolling by itself. Do not use for loading skeletons, collapsed content logic, tooltips, pagination, modal clipping, ellipsis truncation, or long article reading.",
      "exampleTopics": [
        "Basic Content Fade",
        "Custom Width",
        "Custom Position",
        "Content fade custom width",
        "Content fade custom position"
      ],
      "minimalExample": "<div class=\"w-max border border-muted rounded-xl overflow-hidden p-5\">\n  <ngs-content-fade>Lorem ipsum dolor sit amet, consec tetur adip isc ing elit,</ngs-content-fade>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-content-fade-example",
          "title": "Basic content fade",
          "file": "projects/docs/src/app/components/content-fade/_examples/basic-content-fade-example/basic-content-fade-example.html",
          "source": "<div class=\"w-max border border-muted rounded-xl overflow-hidden p-5\">\n  <ngs-content-fade>Lorem ipsum dolor sit amet, consec tetur adip isc ing elit,</ngs-content-fade>\n</div>"
        },
        {
          "name": "content-fade-custom-position-example",
          "title": "Content fade custom position",
          "file": "projects/docs/src/app/components/content-fade/_examples/content-fade-custom-position-example/content-fade-custom-position-example.html",
          "source": "<ngs-radio-group [(ngModel)]=\"position\" aria-label=\"Choose a position\">\n  <ngs-radio-button value=\"both\">Both</ngs-radio-button>\n  <ngs-radio-button value=\"start\">Start</ngs-radio-button>\n  <ngs-radio-button value=\"end\">End</ngs-radio-button>\n</ngs-radio-group>\n<div class=\"w-max border border-muted rounded-xl overflow-hidden mt-6 p-5\">\n  <ngs-content-fade [position]=\"position\">Lorem ipsum dolor sit amet, consec tetur adip isc ing elit,</ngs-content-fade>\n</div>"
        },
        {
          "name": "content-fade-custom-width-example",
          "title": "Content fade custom width",
          "file": "projects/docs/src/app/components/content-fade/_examples/content-fade-custom-width-example/content-fade-custom-width-example.html",
          "source": "<div class=\"w-max border border-muted rounded-xl overflow-hidden p-5\">\n  <ngs-content-fade width=\"40%\">Lorem ipsum dolor sit amet, consec tetur adip isc ing elit,</ngs-content-fade>\n</div>"
        }
      ],
      "previewAsset": "projects/components/content-fade/preview.svg",
      "selectors": [
        "ngs-content-fade"
      ],
      "exportedSymbols": [
        "ContentFade",
        "ContentFadePosition"
      ],
      "inputs": [
        "color",
        "position",
        "width"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-background",
        "--ngs-content-fade-color",
        "--ngs-content-fade-width"
      ],
      "example": null
    },
    {
      "name": "cookie-popup",
      "title": "Cookie Popup",
      "overviewName": "Cookie Popup",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/cookie-popup",
      "publicApi": "projects/components/cookie-popup/public-api.ts",
      "sourceRoot": "projects/components/cookie-popup/src",
      "docsPath": "/components/cookie-popup",
      "docsOverviewSource": "projects/docs/src/app/components/cookie-popup/overview/overview.html",
      "purpose": "Collect a non-blocking cookie or privacy consent choice.",
      "useWhen": "Use on public pages or apps when users need to accept all cookies or only necessary cookies and see a short cookie/privacy message with a policy link. The consumer must persist the accepted choice in a cookie, localStorage, or backend and control visible state. Do not use as a normal Dialog, Alert, Announcement, snackbar, or settings panel.",
      "exampleTopics": [
        "Basic Cookie Popup"
      ],
      "minimalExample": "<ngs-cookie-popup [visible]=\"visible()\"\n                  (cookieAccepted)=\"onCookieAccepted($event)\">\n  <ng-container ngsCookiePopupTitle>Cookie Settings</ng-container>\n  We use cookies to provide and improve services and ensure security. Click to view our\n  <a href=\"https://ngstarter.com/cookie-policy\" class=\"link\">cookie policy</a>.\n  You can choose to accept all or only necessary cookies, which may affect some functionalities.\n  <ng-container ngsCookiePopupAcceptNecessaryOnlyButton>Necessary cookies only</ng-container>\n  <ng-container ngsCookiePopupAcceptAllButton>Accept all cookies</ng-container>\n</ngs-cookie-popup>\n<button ngsButton=\"filled\" (click)=\"visible.set(false)\">Hide cookie popup</button>\n@if (acceptType()) {\n  <div class=\"mt-4\">\n    You are selected: <span class=\"font-bold\">{{ acceptType() }}</span> cookies type.\n  </div>\n}",
      "exampleFiles": [
        {
          "name": "basic-cookie-popup-example",
          "title": "Basic cookie popup",
          "file": "projects/docs/src/app/components/cookie-popup/_examples/basic-cookie-popup-example/basic-cookie-popup-example.html",
          "source": "<ngs-cookie-popup [visible]=\"visible()\"\n                  (cookieAccepted)=\"onCookieAccepted($event)\">\n  <ng-container ngsCookiePopupTitle>Cookie Settings</ng-container>\n  We use cookies to provide and improve services and ensure security. Click to view our\n  <a href=\"https://ngstarter.com/cookie-policy\" class=\"link\">cookie policy</a>.\n  You can choose to accept all or only necessary cookies, which may affect some functionalities.\n  <ng-container ngsCookiePopupAcceptNecessaryOnlyButton>Necessary cookies only</ng-container>\n  <ng-container ngsCookiePopupAcceptAllButton>Accept all cookies</ng-container>\n</ngs-cookie-popup>\n<button ngsButton=\"filled\" (click)=\"visible.set(false)\">Hide cookie popup</button>\n@if (acceptType()) {\n  <div class=\"mt-4\">\n    You are selected: <span class=\"font-bold\">{{ acceptType() }}</span> cookies type.\n  </div>\n}"
        }
      ],
      "previewAsset": "projects/components/cookie-popup/preview.svg",
      "selectors": [
        "[ngsCookiePopupAcceptAllButton]",
        "[ngsCookiePopupAcceptNecessaryOnlyButton]",
        "[ngsCookiePopupTitle]",
        "ngs-cookie-popup"
      ],
      "exportedSymbols": [
        "CookiePopup",
        "CookiePopupAcceptAllButtonDirective",
        "CookiePopupAcceptNecessaryOnlyButtonDirective",
        "CookiePopupAcceptType",
        "CookiePopupTitleDirective"
      ],
      "inputs": [
        "cookiePolicyUrl",
        "visible"
      ],
      "outputs": [
        "cookieAccepted"
      ],
      "cssTokens": [
        "--ngs-color-surface-container-lowest",
        "--ngs-font-size-sm",
        "--ngs-radius-xl",
        "--ngs-shadow-lg"
      ],
      "example": null
    },
    {
      "name": "core",
      "title": "Core",
      "overviewName": "Core",
      "category": null,
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/core",
      "publicApi": "projects/components/core/public-api.ts",
      "sourceRoot": "projects/components/core/src",
      "docsPath": null,
      "docsOverviewSource": null,
      "purpose": "Provide infrastructure primitives, theme setup, services, directives, pipes, tokens, and low-level utilities.",
      "useWhen": "Use @ngstarter-ui/components/core for infrastructure, not for building screens directly. Use provideNgsTheme in app config to set theme, colorScheme, radius, primaryColor, persistence, and storageKey. Inject ThemeManagerService for runtime theme, color scheme, radius, and primary color changes. Use utility directives such as ngsRipple, ngsAutoFocus, ngsFocusElement, ngsTextareaAutoSize, and ngsDebounceTime when a specific low-level behavior is needed. Use pipes such as InitialsPipe, FormatFileSizePipe, SafeHtmlPipe, SafeResourceUrlPipe, OrderByPipe, FilterByPropertyPipe, and SearchByPropertyPipe when they fit. Use ErrorStateMatcher or ShowOnDirtyErrorStateMatcher for form error behavior, and observer/services/utils only for low-level infrastructure. Do not use core as a replacement for real UI components. Do not build admin screens from core primitives; choose concrete components such as Button, Card, DataView, Table, FormField, Dialog, Navigation, Layout, or other component entry points. Do not import Option from core directly for ordinary option lists when Select, Autocomplete, or another component owns the option pattern.",
      "exampleTopics": [],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/core/preview.svg",
      "selectors": [
        "[ngsAutoFocus]",
        "[ngsDebounceTime][ngModel]",
        "[ngsFocusElement]",
        "[ngsRipple]",
        "[ngsSoundEffect]",
        "ngs-optgroup",
        "ngs-option",
        "textarea[ngsTextareaAutoSize]"
      ],
      "exportedSymbols": [
        "_Option",
        "_OptionParent",
        "AnalyticsService",
        "arrayShallowEquals",
        "Autofocusable",
        "AUTOFOCUSABLE",
        "AutoFocusDirective",
        "DebounceTimeDirective",
        "defaultRippleAnimationConfig",
        "ENVIRONMENT",
        "EnvironmentService",
        "ErrorStateMatcher",
        "FilterByPropertyPipe",
        "FocusElementDirective",
        "FormatFileSizePipe",
        "generateNgsThemeCssText",
        "generateNgsThemeProperties",
        "getActualTarget",
        "GlobalState",
        "GlobalStore",
        "InactivityTrackerService",
        "InitialsPipe",
        "injectElement",
        "isElement",
        "MutationObserverService",
        "NGS_GENERATED_THEME_PROPERTY_NAMES",
        "NGS_THEME_OPTIONS",
        "NgsColorScheme",
        "NgsGeneratedThemeColorScheme",
        "NgsRadius",
        "NgsThemeCssProperties",
        "NgsThemeName",
        "NgsThemeOptions",
        "Optgroup",
        "Option",
        "OPTION",
        "OPTION_PARENT",
        "OrderByPipe",
        "PageTitleStrategyService",
        "provideNgsTheme",
        "px",
        "ResizeObserverService",
        "Ripple",
        "RIPPLE_GLOBAL_OPTIONS",
        "RippleAnimationConfig",
        "RippleConfig",
        "RippleGlobalOptions",
        "RippleRef",
        "RippleRenderer",
        "RippleState",
        "SafeHtmlPipe",
        "SafeResourceUrlPipe",
        "ScreenLoaderService",
        "SearchByPropertyPipe",
        "SeoService",
        "ShowOnDirtyErrorStateMatcher",
        "SoundEffectDirective",
        "TextareaAutoSize",
        "ThemeManagerService",
        "typedFromEvent",
        "zonefreeScheduler"
      ],
      "inputs": [
        "checkChildren",
        "debounceTime",
        "disabled",
        "label",
        "maxRows",
        "minRows",
        "ngsAutoFocus",
        "ngsRippleAnimation",
        "ngsRippleCentered",
        "ngsRippleColor",
        "ngsRippleDisabled",
        "ngsRippleRadius",
        "ngsRippleTrigger",
        "ngsRippleUnbounded",
        "selected",
        "soundSrc",
        "value"
      ],
      "outputs": [
        "elementBlurred",
        "elementFocused",
        "onSelectionChange"
      ],
      "cssTokens": [
        "--ngs-color-on-primary-container",
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-primary-container",
        "--ngs-color-surface-container-high",
        "--ngs-color-surface-container-highest",
        "--ngs-control-radius",
        "--ngs-dropdown-height",
        "--ngs-dropdown-item-active-bg",
        "--ngs-dropdown-item-color",
        "--ngs-dropdown-item-disabled-color",
        "--ngs-dropdown-item-font-size",
        "--ngs-dropdown-item-gap",
        "--ngs-dropdown-item-hover-bg",
        "--ngs-dropdown-item-nested-padding-start",
        "--ngs-dropdown-item-padding",
        "--ngs-dropdown-item-padding-x",
        "--ngs-dropdown-item-radius",
        "--ngs-dropdown-item-selected-bg",
        "--ngs-dropdown-item-selected-color",
        "--ngs-font-size-sm",
        "--ngs-option-active-background",
        "--ngs-option-color",
        "--ngs-option-disabled-color",
        "--ngs-option-font-size",
        "--ngs-option-gap",
        "--ngs-option-group-padding-start",
        "--ngs-option-height",
        "--ngs-option-hover-background",
        "--ngs-option-padding",
        "--ngs-option-radius",
        "--ngs-option-selected-background",
        "--ngs-option-selected-color"
      ],
      "example": null
    },
    {
      "name": "country-select",
      "title": "Country Select",
      "overviewName": "Country",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/country-select",
      "publicApi": "projects/components/country-select/public-api.ts",
      "sourceRoot": "projects/components/country-select/src",
      "docsPath": "/forms/country",
      "docsOverviewSource": "projects/docs/src/app/forms/country/overview/overview.html",
      "purpose": "Let users choose a country from the built-in country list and store its ISO country code.",
      "useWhen": "Use in addresses, user profiles, billing, shipping, legal forms, tax forms, tenant settings, and locale settings where the form value should be a country code such as US, PL, or DE. The component shows country flags and names, supports search by name or ISO code, and integrates with FormField. Do not use for phone dialing codes; use PhoneInput. Do not use for currency selection; use CurrencySelect. Do not use for custom region, city, office, or location lists; use Select or Autocomplete.",
      "exampleTopics": [
        "Unselected country",
        "Basic country select",
        "Unselected country select"
      ],
      "minimalExample": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Country</ngs-label>\n  <ngs-country-select [(ngModel)]=\"country\" placeholder=\"Select a country\" clearable/>\n</ngs-form-field>\n<p>\n  Selected country: {{ country() }}\n</p>",
      "exampleFiles": [
        {
          "name": "basic-country-select-example",
          "title": "Basic country select",
          "file": "projects/docs/src/app/forms/country/_examples/basic-country-select-example/basic-country-select-example.html",
          "source": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Country</ngs-label>\n  <ngs-country-select [(ngModel)]=\"country\" placeholder=\"Select a country\" clearable/>\n</ngs-form-field>\n<p>\n  Selected country: {{ country() }}\n</p>"
        },
        {
          "name": "unselected-country-select-example",
          "title": "Unselected country select",
          "file": "projects/docs/src/app/forms/country/_examples/unselected-country-select-example/unselected-country-select-example.html",
          "source": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Country</ngs-label>\n  <ngs-country-select [(ngModel)]=\"country\" placeholder=\"Select a country\" clearable/>\n</ngs-form-field>\n<p>\n  Selected country: {{ country() || 'No country selected' }}\n</p>"
        }
      ],
      "previewAsset": "projects/components/country-select/preview.svg",
      "selectors": [
        "ngs-country-select"
      ],
      "exportedSymbols": [
        "countries",
        "Country",
        "CountrySelect",
        "CountrySelectValue"
      ],
      "inputs": [
        "aria-describedby",
        "aria-label",
        "clearable",
        "disabled",
        "hideCheckIcon",
        "id",
        "multiple",
        "placeholder",
        "required",
        "searchTerm",
        "showCountryCode",
        "tabIndex",
        "value"
      ],
      "outputs": [
        "closed",
        "opened",
        "selectionChange"
      ],
      "cssTokens": [
        "--ngs-color-neutral-500",
        "--ngs-color-on-surface-variant",
        "--ngs-dropdown-item-gap",
        "--ngs-font-size-sm"
      ],
      "example": null
    },
    {
      "name": "crop",
      "title": "Crop",
      "overviewName": "Crop",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/crop",
      "publicApi": "projects/components/crop/public-api.ts",
      "sourceRoot": "projects/components/crop/src",
      "docsPath": "/components/crop",
      "docsOverviewSource": "projects/docs/src/app/components/crop/overview/overview.html",
      "purpose": "Let users choose a rectangle or circle crop area on top of an existing image or visual preview.",
      "useWhen": "Use for avatar dialogs, cover image forms, thumbnail preparation, media management screens, and content editor flows where the user chooses the visible crop area. Crop emits selectionApplied with pixel coordinates, percentages, and container size. It does not upload files, save images, zoom the image, open a gallery, compare images, or process the final bitmap; handle those steps outside the component.",
      "exampleTopics": [
        "Basic image crop"
      ],
      "minimalExample": null,
      "exampleFiles": [
        {
          "name": "basic-image-crop-example",
          "title": "Basic image crop",
          "file": "projects/docs/src/app/components/crop/_examples/basic-image-crop-example/basic-image-crop-example.html",
          "source": ""
        }
      ],
      "previewAsset": "projects/components/crop/preview.svg",
      "selectors": [
        "ngs-crop"
      ],
      "exportedSymbols": [
        "Crop",
        "CropSelection"
      ],
      "inputs": [
        "minHeight",
        "minWidth",
        "shape"
      ],
      "outputs": [
        "selectionApplied"
      ],
      "cssTokens": [],
      "example": null
    },
    {
      "name": "currency-select",
      "title": "Currency Select",
      "overviewName": "Currency Select",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/currency-select",
      "publicApi": "projects/components/currency-select/public-api.ts",
      "sourceRoot": "projects/components/currency-select/src",
      "docsPath": "/forms/currency-select",
      "docsOverviewSource": "projects/docs/src/app/forms/currency-select/overview/overview.html",
      "purpose": "Let users choose a currency from the built-in currency list and store its ISO currency code.",
      "useWhen": "Use for billing, pricing, invoices, checkout, marketplace, finance settings, reporting settings, tenant settings, and locale settings where the form value should be a currency code such as USD, EUR, or PLN. The component shows a flag, ISO code, and symbol, supports search by currency name or code, and can show country names with showCountryName. Do not use for country selection; use CountrySelect. Do not use for entering a money amount; pair it with Input/FormField. Do not use for exchange calculators, rate tables, or number formatting.",
      "exampleTopics": [
        "Basic currency select",
        "Currency select with country name",
        "Currency with country name"
      ],
      "minimalExample": "<ngs-form-field class=\"w-48\">\n  <ngs-label>Currency</ngs-label>\n  <ngs-currency-select [(ngModel)]=\"currency\"/>\n</ngs-form-field>\n<p class=\"mt-5\">\n  Selected currency: {{ currency() }}\n</p>",
      "exampleFiles": [
        {
          "name": "basic-currency-select-example",
          "title": "Basic currency select",
          "file": "projects/docs/src/app/forms/currency-select/_examples/basic-currency-select-example/basic-currency-select-example.html",
          "source": "<ngs-form-field class=\"w-48\">\n  <ngs-label>Currency</ngs-label>\n  <ngs-currency-select [(ngModel)]=\"currency\"/>\n</ngs-form-field>\n<p class=\"mt-5\">\n  Selected currency: {{ currency() }}\n</p>"
        },
        {
          "name": "currency-with-country-name-example",
          "title": "Currency with country name",
          "file": "projects/docs/src/app/forms/currency-select/_examples/currency-with-country-name-example/currency-with-country-name-example.html",
          "source": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Currency</ngs-label>\n  <ngs-currency-select [(ngModel)]=\"currency\" showCountryName/>\n</ngs-form-field>\n<p class=\"mt-5\">\n  Selected currency: {{ currency() }}\n</p>"
        }
      ],
      "previewAsset": "projects/components/currency-select/preview.svg",
      "selectors": [
        "ngs-currency-select"
      ],
      "exportedSymbols": [
        "currencies",
        "Currency",
        "CurrencySelect"
      ],
      "inputs": [
        "disabled",
        "placeholder",
        "required",
        "searchTerm",
        "showCountryName"
      ],
      "outputs": [
        "closed",
        "opened"
      ],
      "cssTokens": [
        "--ngs-color-neutral-500",
        "--ngs-color-on-surface-variant",
        "--ngs-dropdown-item-gap",
        "--ngs-font-size-sm"
      ],
      "example": null
    },
    {
      "name": "data-view",
      "title": "Data View",
      "overviewName": "Data View",
      "category": "libraries",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/data-view",
      "publicApi": "projects/components/data-view/public-api.ts",
      "sourceRoot": "projects/components/data-view/src",
      "docsPath": "/libraries/data-view",
      "docsOverviewSource": "projects/docs/src/app/libraries/data-view/overview/overview.html",
      "purpose": "Build operational data grids for records that users need to inspect, organize, select, and act on.",
      "useWhen": "Use for datatables and working data surfaces in admin screens, CRM and ERP records, users, orders, invoices, logs, tasks, assets, and any dataset where the table is the main interactive work surface. Choose DataView when users need row actions, selection, sorting, search/filter state, pagination, loading or empty states, column resizing, column visibility/order, pinned or sticky columns, custom cell renderers, refresh, snapshots, server-side data, or ngsDataViewActionBar. DataView is configured with columnDefs plus local data or a server-side datasource. Do not use for small static tables or simple read-only tabular content; use Table. Do not use as a card list, layout grid, chart widget, report summary, or form editor.",
      "exampleTopics": [
        "Basic dataview",
        "Data view column pinning",
        "Data view column settings",
        "Data view custom cell renderers",
        "Data view custom empty state",
        "Data view embedded",
        "Data view filter data",
        "Data view height test",
        "Data view loading state",
        "Data view pinning pagination",
        "Data view refresh",
        "Data view resizable columns",
        "Data view row click selection",
        "Data view server side empty state",
        "Data view server side",
        "Data view sticky columns",
        "Data view with action bar",
        "Data view with pagination",
        "Data view with sorting",
        "Dataview with selection"
      ],
      "minimalExample": "<ngs-data-view [columnDefs]=\"columnDefs\"\n               [data]=\"data\" class=\"h-[300px]\" />",
      "exampleFiles": [
        {
          "name": "basic-dataview-example",
          "title": "Basic dataview",
          "file": "projects/docs/src/app/libraries/data-view/_examples/basic-dataview-example/basic-dataview-example.html",
          "source": "<ngs-data-view [columnDefs]=\"columnDefs\"\n               [data]=\"data\" class=\"h-[300px]\" />"
        },
        {
          "name": "data-view-column-pinning-example",
          "title": "Data view column pinning",
          "file": "projects/docs/src/app/libraries/data-view/_examples/data-view-column-pinning-example/data-view-column-pinning-example.html",
          "source": "<ngs-data-view [columnDefs]=\"columnDefs\" withColumnSettings [data]=\"data\"/>"
        },
        {
          "name": "data-view-column-settings-example",
          "title": "Data view column settings",
          "file": "projects/docs/src/app/libraries/data-view/_examples/data-view-column-settings-example/data-view-column-settings-example.html",
          "source": "<ngs-data-view [columnDefs]=\"columnDefs\" withColumnSettings [data]=\"data\"/>"
        }
      ],
      "previewAsset": "projects/components/data-view/preview.svg",
      "selectors": [
        "[ngsDataViewActionBar]",
        "[ngsDataViewEmptyData]",
        "[ngsDataViewEmptyFilterResults]",
        "ngs-data-view",
        "ngs-data-view-action-bar",
        "ngs-data-view-column-settings-dialog"
      ],
      "exportedSymbols": [
        "cellRenderer",
        "ColumnSettingsDialogData",
        "ColumnSettingsDialogResult",
        "DATA_VIEW",
        "DATA_VIEW_CONFIG",
        "DataView",
        "DataViewActionBar",
        "DataViewActionBarAPI",
        "DataViewActionBarDirective",
        "DataViewAPI",
        "DataViewCellRenderer",
        "DataViewCellRendererDef",
        "DataViewColumnDef",
        "DataViewColumnSettingsDialog",
        "DataViewConfig",
        "DataViewDatasource",
        "DataViewEmptyDataDirective",
        "DataViewEmptyFilterResultsDirective",
        "DataViewGetRowsParams",
        "DataViewInterface",
        "DataViewPinAlign",
        "DataViewRowModelType",
        "DataViewRowSelectionEvent",
        "DataViewRowSelectionEventSource",
        "DataViewState",
        "provideDataView"
      ],
      "inputs": [
        "allowSingleRowSelectionByClick",
        "autoHeight",
        "bodyScroll",
        "bufferRows",
        "cellRenderers",
        "columnDefs",
        "data",
        "datasource",
        "embedded",
        "emptyFilterResultsIcon",
        "emptyFilterResultsText",
        "emptyIcon",
        "emptyText",
        "forceVisible",
        "headerHeight",
        "highlightHeader",
        "hoverRows",
        "loading",
        "minColumnWidth",
        "ngsDataViewActionBarWidth",
        "pageIndex",
        "pageSize",
        "pageSizeOptions",
        "paginator",
        "paginatorAriaLabel",
        "rowHeight",
        "rowModelType",
        "rowSelection",
        "search",
        "selectionWidth",
        "showFirstLastButtons",
        "snapshot",
        "stickyHeader",
        "width",
        "withColumnSettings",
        "withPagination",
        "withSelection"
      ],
      "outputs": [
        "allRowsSelectionChanged",
        "loadEnd",
        "refreshEnd",
        "selectionChanged",
        "sortChange"
      ],
      "cssTokens": [
        "--ngs-color-background",
        "--ngs-color-border",
        "--ngs-color-neutral-500",
        "--ngs-color-on-background",
        "--ngs-color-primary",
        "--ngs-color-surface-container",
        "--ngs-color-surface-container-low",
        "--ngs-content-fade-color",
        "--ngs-data-view-bg",
        "--ngs-data-view-body-bg",
        "--ngs-data-view-border-color",
        "--ngs-data-view-cell-padding",
        "--ngs-data-view-header-bg",
        "--ngs-data-view-header-height",
        "--ngs-data-view-hl-header-row-bg",
        "--ngs-data-view-min-height",
        "--ngs-data-view-radius",
        "--ngs-data-view-root-border",
        "--ngs-data-view-row-bg",
        "--ngs-data-view-row-hover-bg",
        "--ngs-data-view-selection-column-width",
        "--ngs-radius-xl",
        "--ngs-table-background",
        "--ngs-table-header-cell-background",
        "--ngs-table-row-item-outline-width"
      ],
      "example": null
    },
    {
      "name": "date-format-select",
      "title": "Date Format Select",
      "overviewName": "Date Format Select",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/date-format-select",
      "publicApi": "projects/components/date-format-select/public-api.ts",
      "sourceRoot": "projects/components/date-format-select/src",
      "docsPath": "/forms/date-format-select",
      "docsOverviewSource": "projects/docs/src/app/forms/date-format-select/overview/overview.html",
      "purpose": "Let users choose a preferred date display format string from a predefined list.",
      "useWhen": "Use in account settings, profile settings, tenant settings, localization preferences, and reporting settings where users choose how dates should appear in the UI or exported reports. The form value is a format string such as MM/dd/yyyy, dd.MM.yyyy, or yyyy-MM-dd; override the available options with dateFormats when needed. Do not use to pick an actual date; use Datepicker. Do not use for date ranges, calendars, schedules, period filters, or direct date formatting in a template.",
      "exampleTopics": [
        "Basic date format select"
      ],
      "minimalExample": "<div [formGroup]=\"settingsForm\">\n  <ngs-form-field class=\"w-92\">\n    <ngs-label>Date Format</ngs-label>\n    <ngs-date-format-select formControlName=\"dateFormat\" required placeholder=\"Select a date format\"/>\n    @if (dateFormatControl?.hasError('required') && dateFormatControl?.touched) {\n      <ngs-error>Please select the date format.</ngs-error>\n    }\n  </ngs-form-field>\n</div>\n<div class=\"text-sm mt-2\">\n  @if (dateFormatControl?.value) {\n    <p>Selected date format: {{ dateFormatControl?.value }}</p>\n  } @else {\n    <p>No date format selected.</p>\n  }\n</div>",
      "exampleFiles": [
        {
          "name": "basic-date-format-select-example",
          "title": "Basic date format select",
          "file": "projects/docs/src/app/forms/date-format-select/_examples/basic-date-format-select-example/basic-date-format-select-example.html",
          "source": "<div [formGroup]=\"settingsForm\">\n  <ngs-form-field class=\"w-92\">\n    <ngs-label>Date Format</ngs-label>\n    <ngs-date-format-select formControlName=\"dateFormat\" required placeholder=\"Select a date format\"/>\n    @if (dateFormatControl?.hasError('required') && dateFormatControl?.touched) {\n      <ngs-error>Please select the date format.</ngs-error>\n    }\n  </ngs-form-field>\n</div>\n<div class=\"text-sm mt-2\">\n  @if (dateFormatControl?.value) {\n    <p>Selected date format: {{ dateFormatControl?.value }}</p>\n  } @else {\n    <p>No date format selected.</p>\n  }\n</div>"
        }
      ],
      "previewAsset": "projects/components/date-format-select/preview.svg",
      "selectors": [
        "ngs-date-format-select"
      ],
      "exportedSymbols": [
        "DateFormat",
        "DateFormatSelect"
      ],
      "inputs": [
        "dateFormats",
        "placeholder"
      ],
      "outputs": [],
      "cssTokens": [],
      "example": null
    },
    {
      "name": "datepicker",
      "title": "Datepicker",
      "overviewName": "Datepicker",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/datepicker",
      "publicApi": "projects/components/datepicker/public-api.ts",
      "sourceRoot": "projects/components/datepicker/src",
      "docsPath": "/components/datepicker",
      "docsOverviewSource": "projects/docs/src/app/components/datepicker/overview/overview.html",
      "purpose": "Let users choose a concrete date or date range through an input connected to a calendar overlay.",
      "useWhen": "Use input[ngsDatepicker], ngs-datepicker, and usually ngs-datepicker-toggle for single date fields in forms, filters, deadlines, birth dates, publish dates, schedules, reporting, invoices, and order dates. Use ngs-date-range-input with ngs-date-range-picker for start/end ranges, report periods, booking windows, analytics ranges, and quick presets. The form value is a date object handled by the configured DateAdapter, not a date format string. Do not use to choose a date display format; use DateFormatSelect. Do not use to choose only a time; use Timepicker. Do not use as a static event calendar, scheduler, timeline, or date formatter.",
      "exampleTopics": [
        "Basic Datepicker",
        "Datepicker With Custom Icon",
        "Datepicker With Custom Header",
        "Datepicker Action Buttons",
        "Basic Date Range Picker",
        "Extended Date Range Picker",
        "Date Range Picker With Quick Presets",
        "Datepicker custom icon",
        "Datepicker actions button",
        "Datepicker presets",
        "Custom header"
      ],
      "minimalExample": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Enter a date range</ngs-label>\n  <ngs-date-range-input [rangePicker]=\"picker\">\n    <input ngsStartDate placeholder=\"Start date\">\n    <input ngsEndDate placeholder=\"End date\">\n  </ngs-date-range-input>\n  <ngs-hint>MM/DD/YYYY – MM/DD/YYYY</ngs-hint>\n  <ngs-datepicker-toggle ngsIconButtonSuffix [for]=\"picker\"/>\n  <ngs-date-range-picker #picker/>\n</ngs-form-field>",
      "exampleFiles": [
        {
          "name": "basic-date-range-picker-example",
          "title": "Basic date range picker",
          "file": "projects/docs/src/app/components/datepicker/_examples/basic-date-range-picker-example/basic-date-range-picker-example.html",
          "source": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Enter a date range</ngs-label>\n  <ngs-date-range-input [rangePicker]=\"picker\">\n    <input ngsStartDate placeholder=\"Start date\">\n    <input ngsEndDate placeholder=\"End date\">\n  </ngs-date-range-input>\n  <ngs-hint>MM/DD/YYYY – MM/DD/YYYY</ngs-hint>\n  <ngs-datepicker-toggle ngsIconButtonSuffix [for]=\"picker\"/>\n  <ngs-date-range-picker #picker/>\n</ngs-form-field>"
        },
        {
          "name": "basic-datepicker-example",
          "title": "Basic datepicker",
          "file": "projects/docs/src/app/components/datepicker/_examples/basic-datepicker-example/basic-datepicker-example.html",
          "source": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Choose a date</ngs-label>\n  <input ngsInput [ngsDatepicker]=\"picker\">\n  <ngs-hint>MM/DD/YYYY</ngs-hint>\n  <ngs-datepicker-toggle ngsIconButtonSuffix [for]=\"picker\"/>\n  <ngs-datepicker #picker/>\n</ngs-form-field>"
        },
        {
          "name": "custom-header",
          "title": "Custom header",
          "file": "projects/docs/src/app/components/datepicker/_examples/custom-header/custom-header.html",
          "source": "<div class=\"flex items-center justify-center\">\n  <button ngsIconButton (click)=\"previousClicked('year')\">\n    <ngs-icon name=\"fluent:arrow-left-24-regular\"/>\n  </button>\n  <button ngsIconButton (click)=\"previousClicked('month')\">\n    <ngs-icon name=\"fluent:chevron-left-24-regular\"/>\n  </button>\n  <span class=\"py-5 px-3 text-center font-semibold\">{{ periodLabel }}</span>\n  <button ngsIconButton (click)=\"nextClicked('month')\">\n    <ngs-icon name=\"fluent:chevron-right-24-regular\"/>\n  </button>\n  <button ngsIconButton (click)=\"nextClicked('year')\">\n    <ngs-icon name=\"fluent:arrow-right-24-regular\"/>\n  </button>\n</div>"
        }
      ],
      "previewAsset": "projects/components/datepicker/preview.svg",
      "selectors": [
        "[ngsDatepickerApply]",
        "[ngsDatepickerCancel]",
        "[ngsDatepickerToggleIcon]",
        "input[ngsDatepicker]",
        "input[ngsEndDate]",
        "input[ngsStartDate]",
        "ngs-calendar",
        "ngs-date-range-input",
        "ngs-date-range-picker",
        "ngs-datepicker",
        "ngs-datepicker-actions",
        "ngs-datepicker-toggle",
        "ngs-month-view",
        "ngs-multi-year-view",
        "ngs-year-view"
      ],
      "exportedSymbols": [
        "Calendar",
        "DateAdapter",
        "Datepicker",
        "DatepickerActions",
        "DatepickerApply",
        "DatepickerCancel",
        "DatepickerInput",
        "DatepickerIntl",
        "DatepickerPreset",
        "DatepickerToggle",
        "DatepickerToggleIcon",
        "DateRange",
        "DateRangeInput",
        "DateRangePicker",
        "EndDate",
        "MAT_DATE_FORMATS",
        "MAT_DATE_LOCALE",
        "MAT_NATIVE_DATE_FORMATS",
        "MonthView",
        "MultiYearView",
        "NativeDateAdapter",
        "provideNativeDateAdapter",
        "StartDate",
        "YearView"
      ],
      "inputs": [
        "activeDate",
        "calendarCount",
        "extended",
        "maxDate",
        "minDate",
        "rangePreviewDate",
        "selected",
        "separator",
        "sharedRangePreview",
        "showQuickPresets",
        "startAt",
        "visibleCalendars"
      ],
      "outputs": [
        "monthSelected",
        "rangePreviewDateChange",
        "selectedChange",
        "yearSelected"
      ],
      "cssTokens": [
        "--ngs-calendar-cell-hover-bg",
        "--ngs-calendar-cell-in-range-bg",
        "--ngs-calendar-cell-radius",
        "--ngs-calendar-cell-selected-bg",
        "--ngs-calendar-cell-selected-color",
        "--ngs-calendar-cell-size",
        "--ngs-calendar-cell-today-border",
        "--ngs-calendar-header-padding",
        "--ngs-calendar-padding",
        "--ngs-color-border",
        "--ngs-color-on-primary",
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-outline",
        "--ngs-color-primary",
        "--ngs-color-primary-container",
        "--ngs-color-surface-container-high",
        "--ngs-datepicker-bg",
        "--ngs-datepicker-border",
        "--ngs-datepicker-color",
        "--ngs-datepicker-preset-hover-bg",
        "--ngs-datepicker-preset-padding",
        "--ngs-datepicker-presets-border",
        "--ngs-datepicker-radius",
        "--ngs-datepicker-shadow",
        "--ngs-dropdown-bg",
        "--ngs-dropdown-border",
        "--ngs-dropdown-radius",
        "--ngs-dropdown-shadow",
        "--ngs-field-label-color",
        "--ngs-font-size-sm",
        "--ngs-font-size-xs",
        "--ngs-radius-lg"
      ],
      "example": null
    },
    {
      "name": "dialog",
      "title": "Dialog",
      "overviewName": "Dialog",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/dialog",
      "publicApi": "projects/components/dialog/public-api.ts",
      "sourceRoot": "projects/components/dialog/src",
      "docsPath": "/components/dialog",
      "docsOverviewSource": "projects/docs/src/app/components/dialog/overview/overview.html",
      "purpose": "Open custom focused modal workflows above the current page.",
      "useWhen": "Use Dialog.open(ComponentOrTemplate, config) for forms, editing records, creating objects, settings, detail views, wizard-like steps, scrollable content, and custom modal workflows where users must complete or close the task before returning to the page. Structure custom dialog components with ngs-dialog-title, ngs-dialog-content, ngs-dialog-actions, DialogRef.close(...), ngs-dialog-close, and optional DIALOG_DATA. Use DialogConfig for data, sizing, disableClose, autofocus, backdrop, panel classes, accessibility labels, and showCloseButton when the dialog should render the built-in icon close button. Do not use for a short binary destructive confirmation; use Confirm. Do not use for global messages; use Announcement, Alert, or SnackBar. Do not use for mobile bottom action panels; use BottomSheet. Do not use for side inspectors, filters, or detail panels; use Drawer or SidePanel.",
      "configOptions": [
        "data",
        "width",
        "height",
        "minWidth",
        "minHeight",
        "maxWidth",
        "maxHeight",
        "hasBackdrop",
        "backdropClass",
        "panelClass",
        "disableClose",
        "autoFocus",
        "restoreFocus",
        "ariaDescribedBy",
        "ariaLabelledBy",
        "ariaLabel",
        "role",
        "closeOnNavigation",
        "showCloseButton"
      ],
      "exampleTopics": [
        "Basic Dialog",
        "Dialog Close",
        "Dialog With Scrollable Content",
        "Dialog Sizing (height, min-height)",
        "Dialog scrollable content",
        "Dialog sizing",
        "Basic"
      ],
      "minimalExample": "<h3 ngs-dialog-title>Hi {{ data.name }}</h3>\n<ngs-dialog-content>\n  <p class=\"mb-3\">What's your favorite animal?</p>\n  <ngs-form-field subscriptHiddenIfEmpty>\n    <ngs-label>Favorite Animal</ngs-label>\n    <input ngsInput [(ngModel)]=\"data.animal\">\n  </ngs-form-field>\n</ngs-dialog-content>\n<ngs-dialog-actions align=\"end\">\n  <button ngsButton (click)=\"onNoClick()\">No Thanks</button>\n  <button ngsButton=\"filled\" [ngs-dialog-close]=\"data.animal\">Ok</button>\n</ngs-dialog-actions>",
      "exampleFiles": [
        {
          "name": "basic",
          "title": "Basic",
          "file": "projects/docs/src/app/components/dialog/_examples/basic/basic.dialog.html",
          "source": "<h3 ngs-dialog-title>Hi {{ data.name }}</h3>\n<ngs-dialog-content>\n  <p class=\"mb-3\">What's your favorite animal?</p>\n  <ngs-form-field subscriptHiddenIfEmpty>\n    <ngs-label>Favorite Animal</ngs-label>\n    <input ngsInput [(ngModel)]=\"data.animal\">\n  </ngs-form-field>\n</ngs-dialog-content>\n<ngs-dialog-actions align=\"end\">\n  <button ngsButton (click)=\"onNoClick()\">No Thanks</button>\n  <button ngsButton=\"filled\" [ngs-dialog-close]=\"data.animal\">Ok</button>\n</ngs-dialog-actions>"
        },
        {
          "name": "basic-dialog-example",
          "title": "Basic dialog",
          "file": "projects/docs/src/app/components/dialog/_examples/basic-dialog-example/basic-dialog-example.html",
          "source": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>What's your name?</ngs-label>\n  <input ngsInput [(ngModel)]=\"name\">\n</ngs-form-field>\n<div>\n  <button ngsButton=\"outlined\" (click)=\"openDialog()\">Pick one</button>\n</div>\n@if (animal) {\n  <p>You chose: <em>{{ animal }}</em></p>\n}"
        },
        {
          "name": "dialog-close-example",
          "title": "Dialog close",
          "file": "projects/docs/src/app/components/dialog/_examples/dialog-close-example/dialog-close-example.html",
          "source": "<button ngsButton=\"filled\" (click)=\"openDialog()\">Open close dialog</button>\n@if (result()) {\n  <p class=\"mt-3\">Result: {{ result() }}</p>\n}\n<ng-template #closeDialog>\n  <h3 ngs-dialog-title>Close dialog</h3>\n  <ngs-dialog-content>\n    <p>\n      This dialog enables the built-in close button through <code>showCloseButton</code>. Action\n      buttons can still use <code>ngs-dialog-close</code> to close the current dialog and optionally\n      return a result to the opener.\n    </p>\n  </ngs-dialog-content>\n  <ngs-dialog-actions align=\"end\">\n    <button ngsButton ngs-dialog-close>Cancel</button>\n    <button ngsButton=\"filled\" [ngs-dialog-close]=\"'Saved changes'\">Save</button>\n  </ngs-dialog-actions>\n</ng-template>"
        }
      ],
      "previewAsset": "projects/components/dialog/preview.svg",
      "selectors": [
        "[ngs-dialog-actions]",
        "[ngs-dialog-close]",
        "[ngs-dialog-content]",
        "[ngs-dialog-title]",
        "[ngsDialogActions]",
        "[ngsDialogClose]",
        "[ngsDialogContent]",
        "[ngsDialogTitle]",
        "ngs-dialog-actions",
        "ngs-dialog-container",
        "ngs-dialog-content",
        "ngs-dialog-header",
        "ngs-dialog-title"
      ],
      "exportedSymbols": [
        "Dialog",
        "DIALOG_DATA",
        "DIALOG_DEFAULT_OPTIONS",
        "DialogActions",
        "DialogClose",
        "DialogConfig",
        "DialogContainer",
        "DialogContent",
        "DialogHeader",
        "DialogRef",
        "DialogTitle"
      ],
      "inputs": [
        "align",
        "ariaLabel",
        "id",
        "ngs-dialog-close",
        "ngsDialogClose",
        "type"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-on-surface",
        "--ngs-control-height-lg",
        "--ngs-dialog-actions-gap",
        "--ngs-dialog-actions-padding",
        "--ngs-dialog-background",
        "--ngs-dialog-bg",
        "--ngs-dialog-border-radius",
        "--ngs-dialog-box-shadow",
        "--ngs-dialog-color",
        "--ngs-dialog-container-max-width",
        "--ngs-dialog-container-min-width",
        "--ngs-dialog-header-padding",
        "--ngs-dialog-headline-padding",
        "--ngs-dialog-radius",
        "--ngs-dialog-shadow",
        "--ngs-dialog-title-font-size",
        "--ngs-dialog-title-font-weight",
        "--ngs-dialog-with-content-padding"
      ],
      "example": "inject(Dialog).open(MyDialogComponent, { data })"
    },
    {
      "name": "digit-roller",
      "title": "Digit Roller",
      "overviewName": "Digit Roller",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/digit-roller",
      "publicApi": "projects/components/digit-roller/public-api.ts",
      "sourceRoot": "projects/components/digit-roller/src",
      "docsPath": "/components/digit-roller",
      "docsOverviewSource": "projects/docs/src/app/components/digit-roller/overview/overview.html",
      "purpose": "The NgStarter Angular Digit Roller component animates individual digits in formatted numbers with a slot-machine style reel effect.",
      "useWhen": "Choose Digit Roller when the workflow matches examples such as Number Sizes, Social Actions, Progress Bar, Gauge, Digit roller dashboard.",
      "exampleTopics": [
        "Number Sizes",
        "Social Actions",
        "Progress Bar",
        "Gauge",
        "Digit roller dashboard",
        "Digit roller social actions",
        "Digit roller progress bar",
        "Digit roller gauge"
      ],
      "minimalExample": "<div class=\"grid gap-4\" ngsDigitRollerGroup>\n  @for (example of examples; track example.label) {\n    <div class=\"grid gap-4 rounded-lg border border-neutral-200 bg-white p-5 md:grid-cols-[160px_minmax(0,1fr)] md:items-center\">\n      <div>\n        <p class=\"font-medium text-neutral-900\">{{ example.label }}</p>\n        <p class=\"mt-1 text-sm leading-6 text-neutral-500\">{{ example.description }}</p>\n      </div>\n      <div class=\"flex min-w-0 flex-wrap items-baseline gap-2\">\n        <ngs-digit-roller\n          [class]=\"example.className\"\n          [value]=\"example.value()\"\n          [format]=\"example.format\"\n          [prefix]=\"example.prefix ?? ''\"\n          [continuous]=\"example.continuous ?? false\"\n          [duration]=\"example.duration ?? 900\"\n          [stagger]=\"example.stagger ?? 0\"\n          spinEasing=\"spring\"\n        />\n        @if (example.unit) {\n          <span class=\"text-sm text-neutral-500\">{{ example.unit }}</span>\n        }\n      </div>\n    </div>\n  }\n</div>",
      "exampleFiles": [
        {
          "name": "digit-roller-dashboard-example",
          "title": "Digit roller dashboard",
          "file": "projects/docs/src/app/components/digit-roller/_examples/digit-roller-dashboard-example/digit-roller-dashboard-example.html",
          "source": "<div class=\"grid gap-4\" ngsDigitRollerGroup>\n  @for (example of examples; track example.label) {\n    <div class=\"grid gap-4 rounded-lg border border-neutral-200 bg-white p-5 md:grid-cols-[160px_minmax(0,1fr)] md:items-center\">\n      <div>\n        <p class=\"font-medium text-neutral-900\">{{ example.label }}</p>\n        <p class=\"mt-1 text-sm leading-6 text-neutral-500\">{{ example.description }}</p>\n      </div>\n      <div class=\"flex min-w-0 flex-wrap items-baseline gap-2\">\n        <ngs-digit-roller\n          [class]=\"example.className\"\n          [value]=\"example.value()\"\n          [format]=\"example.format\"\n          [prefix]=\"example.prefix ?? ''\"\n          [continuous]=\"example.continuous ?? false\"\n          [duration]=\"example.duration ?? 900\"\n          [stagger]=\"example.stagger ?? 0\"\n          spinEasing=\"spring\"\n        />\n        @if (example.unit) {\n          <span class=\"text-sm text-neutral-500\">{{ example.unit }}</span>\n        }\n      </div>\n    </div>\n  }\n</div>"
        },
        {
          "name": "digit-roller-gauge-example",
          "title": "Digit roller gauge",
          "file": "projects/docs/src/app/components/digit-roller/_examples/digit-roller-gauge-example/digit-roller-gauge-example.html",
          "source": "<div class=\"grid gap-6 rounded-lg border border-neutral-200 bg-white p-6 sm:grid-cols-[auto_minmax(0,1fr)] sm:items-center\" ngsDigitRollerGroup>\n  <ngs-gauge class=\"size-28\" [value]=\"score()\" [radius]=\"50\" [strokeWidth]=\"8\">\n    <ngs-gauge-value>\n      <ngs-digit-roller\n        class=\"text-xl font-bold leading-none text-primary\"\n        [value]=\"score()\"\n        [format]=\"integerFormat\"\n        suffix=\"%\"\n        [continuous]=\"true\"\n        [stagger]=\"12\"\n      />\n    </ngs-gauge-value>\n  </ngs-gauge>\n  <div>\n    <p class=\"text-sm font-medium text-neutral-900\">Health score</p>\n    <p class=\"mt-1 text-sm leading-6 text-neutral-500\">\n      The same value drives the gauge arc and the animated number in the center.\n    </p>\n  </div>\n</div>"
        },
        {
          "name": "digit-roller-progress-bar-example",
          "title": "Digit roller progress bar",
          "file": "projects/docs/src/app/components/digit-roller/_examples/digit-roller-progress-bar-example/digit-roller-progress-bar-example.html",
          "source": "<div class=\"grid gap-4 rounded-lg border border-neutral-200 bg-white p-5\" ngsDigitRollerGroup>\n  <div class=\"flex items-end justify-between gap-4\">\n    <div>\n      <p class=\"text-sm font-medium text-neutral-900\">Deployment progress</p>\n      <p class=\"mt-1 flex flex-wrap items-baseline gap-1 text-sm text-neutral-500\">\n        <ngs-digit-roller [value]=\"remaining()\" [format]=\"integerFormat\"/>\n        <span>steps remaining</span>\n      </p>\n    </div>\n    <ngs-digit-roller\n      class=\"text-2xl font-bold leading-none text-primary\"\n      [value]=\"progress() / 100\"\n      [format]=\"percentFormat\"\n      [continuous]=\"true\"\n      [stagger]=\"14\"\n    />\n  </div>\n  <ngs-progress-bar [value]=\"progress()\"/>\n</div>"
        }
      ],
      "previewAsset": "projects/components/digit-roller/preview.svg",
      "selectors": [
        "[ngsDigitRollerGroup]",
        "ngs-digit-roller"
      ],
      "exportedSymbols": [
        "canAnimateDigitRoller",
        "DIGIT_ROLLER_EMPTY_FORMATTED",
        "DIGIT_ROLLER_GROUP",
        "DigitRoller",
        "DigitRollerCapabilityOptions",
        "DigitRollerDigitConfig",
        "DigitRollerDigits",
        "DigitRollerEasing",
        "DigitRollerFormattedNumber",
        "DigitRollerGlyph",
        "DigitRollerGroupCoordinator",
        "DigitRollerGroupDirective",
        "DigitRollerGroupMember",
        "DigitRollerNumberPart",
        "DigitRollerTiming",
        "DigitRollerTrend",
        "formatDigitRollerValue",
        "getDigitRollerGlyphs",
        "resetDigitRollerCapabilityCache"
      ],
      "inputs": [
        "animated",
        "colorOnDecrease",
        "colorOnIncrease",
        "continuous",
        "digits",
        "duration",
        "flipEasing",
        "format",
        "locales",
        "opacityDuration",
        "opacityTiming",
        "prefix",
        "respectMotionPreference",
        "spinEasing",
        "spinTiming",
        "stagger",
        "suffix",
        "transformTiming",
        "trend",
        "value"
      ],
      "outputs": [
        "animationsFinish",
        "animationsStart"
      ],
      "cssTokens": [
        "--ngs-digit-roller-mask-height",
        "--ngs-digit-roller-mask-width",
        "--ngs-digit-roller-min-digit-width"
      ],
      "example": null
    },
    {
      "name": "divider",
      "title": "Divider",
      "overviewName": "Divider",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/divider",
      "publicApi": "projects/components/divider/public-api.ts",
      "sourceRoot": "projects/components/divider/src",
      "docsPath": "/components/divider",
      "docsOverviewSource": "projects/docs/src/app/components/divider/overview/overview.html",
      "purpose": "Separate related groups of content or actions with a visual rule.",
      "useWhen": "Use ngs-divider in lists, forms, panels, cards, toolbars, popovers, settings screens, and dense layouts where a clear boundary between groups helps scanning. Use vertical dividers between inline actions or columns, horizontal dividers between sections, inset when the line should align with content, and fixedHeight for compact vertical dividers. Use ngs-text-divider when the separator needs a short label such as “or”. Do not use Divider to create empty space or layout structure; use Tailwind spacing and layout classes. Prefer specialized divider components inside systems that provide them, such as MenuDivider, NavigationDivider, SidebarDivider, and CommandBarDivider.",
      "exampleTopics": [
        "Basic Divider",
        "Text Divider",
        "Divider overview"
      ],
      "minimalExample": "<div class=\"flex flex-col gap-8 py-6\">\n  <div>\n    <p class=\"mb-2\">Horizontal</p>\n    <ngs-divider/>\n  </div>\n  <div>\n    <p class=\"mb-2\">Horizontal inset</p>\n    <div class=\"border border-border rounded-md p-4\">\n      <div class=\"text-sm\">Section 1</div>\n      <ngs-divider inset class=\"my-4\"/>\n      <div class=\"text-sm\">Section 2</div>\n    </div>\n  </div>\n  <div>\n    <p class=\"mb-2\">Vertical</p>\n    <div class=\"flex items-center h-32 gap-4\">\n      <div>Item 1</div>\n      <ngs-divider vertical/>\n      <div>Item 2</div>\n      <ngs-divider vertical/>\n      <div>Item 3</div>\n    </div>\n  </div>\n  <div>\n    <p class=\"mb-2\">Vertical fixed height</p>\n    <div class=\"flex items-center gap-4\">\n      <div>Item 1</div>\n      <ngs-divider vertical fixedHeight/>\n      <div>Item 2</div>\n      <ngs-divider vertical fixedHeight/>\n      <div>Item 3</div>\n    </div>\n  </div>\n</div>",
      "exampleFiles": [
        {
          "name": "divider-overview-example",
          "title": "Divider overview",
          "file": "projects/docs/src/app/components/divider/_examples/divider-overview-example/divider-overview-example.html",
          "source": "<div class=\"flex flex-col gap-8 py-6\">\n  <div>\n    <p class=\"mb-2\">Horizontal</p>\n    <ngs-divider/>\n  </div>\n  <div>\n    <p class=\"mb-2\">Horizontal inset</p>\n    <div class=\"border border-border rounded-md p-4\">\n      <div class=\"text-sm\">Section 1</div>\n      <ngs-divider inset class=\"my-4\"/>\n      <div class=\"text-sm\">Section 2</div>\n    </div>\n  </div>\n  <div>\n    <p class=\"mb-2\">Vertical</p>\n    <div class=\"flex items-center h-32 gap-4\">\n      <div>Item 1</div>\n      <ngs-divider vertical/>\n      <div>Item 2</div>\n      <ngs-divider vertical/>\n      <div>Item 3</div>\n    </div>\n  </div>\n  <div>\n    <p class=\"mb-2\">Vertical fixed height</p>\n    <div class=\"flex items-center gap-4\">\n      <div>Item 1</div>\n      <ngs-divider vertical fixedHeight/>\n      <div>Item 2</div>\n      <ngs-divider vertical fixedHeight/>\n      <div>Item 3</div>\n    </div>\n  </div>\n</div>"
        },
        {
          "name": "text-divider-example",
          "title": "Text divider",
          "file": "projects/docs/src/app/components/divider/_examples/text-divider-example/text-divider-example.html",
          "source": "<p>\n  Text dividers\n</p>\n<div class=\"flex flex-col gap-12 py-6\">\n  <ngs-text-divider>or</ngs-text-divider>\n  <ngs-text-divider>Or register with</ngs-text-divider>\n  <ngs-text-divider>any text</ngs-text-divider>\n</div>"
        }
      ],
      "previewAsset": "projects/components/divider/preview.svg",
      "selectors": [
        "ngs-divider",
        "ngs-text-divider"
      ],
      "exportedSymbols": [
        "Divider",
        "TextDivider"
      ],
      "inputs": [
        "fixedHeight",
        "inset",
        "vertical"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-border",
        "--ngs-divider-vertical-fixed-height"
      ],
      "example": null
    },
    {
      "name": "drawer",
      "title": "Drawer",
      "overviewName": "Drawer",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/drawer",
      "publicApi": "projects/components/drawer/public-api.ts",
      "sourceRoot": "projects/components/drawer/src",
      "docsPath": "/components/drawer",
      "docsOverviewSource": "projects/docs/src/app/components/drawer/overview/overview.html",
      "purpose": "Show custom side content in a right-side overlay while keeping the current page as context.",
      "useWhen": "Use for any secondary side content or workflow that should open beside the current screen without navigating away: forms, filters, record details, settings, previews, history, activity feeds, help content, quick actions, inspectors, or other custom panels. Open with #drawer=\"ngsDrawer\" and drawer.open()/drawer.close(), or control with [isOpen]. Use [showBackdrop]=\"false\" for a non-blocking side panel. Do not use for centered modal workflows; use Dialog. Do not use for short confirmations; use Confirm. Do not use for mobile bottom action panels; use BottomSheet. Do not use as the primary persistent app navigation; use navigation/sidebar components.",
      "exampleTopics": [
        "Basic drawer",
        "Drawer without backdrop"
      ],
      "minimalExample": "<button ngsButton=\"filled\" (click)=\"drawer.open()\">Open Drawer</button>\n<ngs-drawer #drawer=\"ngsDrawer\">\n  <ngs-panel class=\"w-[460px]\">\n    <ngs-panel-header class=\"px-5 py-3\">Header</ngs-panel-header>\n    <ngs-panel-content class=\"p-5\">\n      <button ngsButton=\"filled\" (click)=\"drawer.close()\">Close Drawer</button>\n    </ngs-panel-content>\n    <ngs-panel-footer class=\"px-5 py-3\">Footer</ngs-panel-footer>\n  </ngs-panel>\n</ngs-drawer>",
      "exampleFiles": [
        {
          "name": "basic-drawer-example",
          "title": "Basic drawer",
          "file": "projects/docs/src/app/components/drawer/_examples/basic-drawer-example/basic-drawer-example.html",
          "source": "<button ngsButton=\"filled\" (click)=\"drawer.open()\">Open Drawer</button>\n<ngs-drawer #drawer=\"ngsDrawer\">\n  <ngs-panel class=\"w-[460px]\">\n    <ngs-panel-header class=\"px-5 py-3\">Header</ngs-panel-header>\n    <ngs-panel-content class=\"p-5\">\n      <button ngsButton=\"filled\" (click)=\"drawer.close()\">Close Drawer</button>\n    </ngs-panel-content>\n    <ngs-panel-footer class=\"px-5 py-3\">Footer</ngs-panel-footer>\n  </ngs-panel>\n</ngs-drawer>"
        },
        {
          "name": "drawer-without-backdrop-example",
          "title": "Drawer without backdrop",
          "file": "projects/docs/src/app/components/drawer/_examples/drawer-without-backdrop-example/drawer-without-backdrop-example.html",
          "source": "<button ngsButton=\"filled\" (click)=\"drawer.open()\">Open Drawer</button>\n<ngs-drawer #drawer=\"ngsDrawer\" [showBackdrop]=\"false\">\n  <ngs-panel class=\"w-[460px]\">\n    <ngs-panel-header class=\"px-5 py-3\">Header</ngs-panel-header>\n    <ngs-panel-content class=\"p-5\">\n      <button ngsButton=\"filled\" (click)=\"drawer.close()\">Close Drawer</button>\n    </ngs-panel-content>\n    <ngs-panel-footer class=\"px-5 py-3\">Footer</ngs-panel-footer>\n  </ngs-panel>\n</ngs-drawer>"
        }
      ],
      "previewAsset": "projects/components/drawer/preview.svg",
      "selectors": [
        "[ngsDrawerIgnoreOutsideClick]",
        "ngs-drawer"
      ],
      "exportedSymbols": [
        "Drawer",
        "DRAWER",
        "DrawerIgnoreOutsideClickDirective"
      ],
      "inputs": [
        "isOpen",
        "showBackdrop"
      ],
      "outputs": [
        "closed",
        "opened"
      ],
      "cssTokens": [
        "--ngs-color-surface-container-lowest",
        "--ngs-drawer-transition",
        "--ngs-drawer-transition-duration",
        "--ngs-dropdown-border"
      ],
      "example": null
    },
    {
      "name": "emoji-picker",
      "title": "Emoji Picker",
      "overviewName": "Emoji Picker",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/emoji-picker",
      "publicApi": "projects/components/emoji-picker/public-api.ts",
      "sourceRoot": "projects/components/emoji-picker/src",
      "docsPath": "/components/emoji-picker",
      "docsOverviewSource": "projects/docs/src/app/components/emoji-picker/overview/overview.html",
      "purpose": "Let users choose one Unicode emoji from an overlay picker.",
      "useWhen": "Use in comments, chats, quick messages, reactions, comment/editor toolbars, social features, and any text entry flow where users need to insert or choose an emoji. Open from a button or toolbar action with [ngsEmojiPickerTriggerFor], then handle emojiSelected as the selected emoji string. It supports categorized emoji data, language from LOCALE_ID or the language input, hover preview, and loading skeletons. Do not use for interface icons; use Icon. Do not use for normal action menus; use Menu. Do not use as a full editor; use CommentEditor or TextEditor. Do not use for custom stickers, GIFs, or media pickers unless the value is a Unicode emoji.",
      "exampleTopics": [
        "Basic emoji picker"
      ],
      "minimalExample": "<button ngsButton=\"filled\" [ngsEmojiPickerTriggerFor]=\"emojiPicker\">Pick an emoji</button>\n<ng-template #emojiPicker>\n  <ngs-emoji-picker language=\"en\" (emojiSelected)=\"onEmojiSelected($event)\"/>\n</ng-template>\n@if (selectedEmoji()) {\n  <div class=\"mt-5 text-2xl\">\n    {{ selectedEmoji() }}\n  </div>\n}",
      "exampleFiles": [
        {
          "name": "basic-emoji-picker-example",
          "title": "Basic emoji picker",
          "file": "projects/docs/src/app/components/emoji-picker/_examples/basic-emoji-picker-example/basic-emoji-picker-example.html",
          "source": "<button ngsButton=\"filled\" [ngsEmojiPickerTriggerFor]=\"emojiPicker\">Pick an emoji</button>\n<ng-template #emojiPicker>\n  <ngs-emoji-picker language=\"en\" (emojiSelected)=\"onEmojiSelected($event)\"/>\n</ng-template>\n@if (selectedEmoji()) {\n  <div class=\"mt-5 text-2xl\">\n    {{ selectedEmoji() }}\n  </div>\n}"
        }
      ],
      "previewAsset": "projects/components/emoji-picker/preview.svg",
      "selectors": [
        "[ngsEmojiPickerTriggerFor]",
        "ngs-emoji-picker"
      ],
      "exportedSymbols": [
        "EMOJI_PICKER_TRIGGER_FOR",
        "EmojiPicker",
        "EmojiPickerTriggerForDirective"
      ],
      "inputs": [
        "language",
        "position",
        "selectEmojiLabel"
      ],
      "outputs": [
        "closed",
        "emojiSelected",
        "opened"
      ],
      "cssTokens": [
        "--ngs-color-neutral-500",
        "--ngs-color-subtle",
        "--ngs-color-surface-container-high",
        "--ngs-color-surface-container-highest",
        "--ngs-color-surface-container-low",
        "--ngs-color-surface-container-lowest",
        "--ngs-dropdown-bg",
        "--ngs-dropdown-border",
        "--ngs-dropdown-radius",
        "--ngs-dropdown-shadow",
        "--ngs-emoji-picker-bg",
        "--ngs-emoji-picker-border",
        "--ngs-emoji-picker-border-radius",
        "--ngs-emoji-picker-list-height",
        "--ngs-emoji-picker-list-width",
        "--ngs-emoji-picker-margin",
        "--ngs-emoji-picker-shadow",
        "--ngs-font-size-sm",
        "--ngs-font-size-xl",
        "--ngs-font-size-xs",
        "--ngs-menu-border",
        "--ngs-skeleton-from-bg",
        "--ngs-skeleton-to-bg"
      ],
      "example": null
    },
    {
      "name": "empty-state",
      "title": "Empty State",
      "overviewName": "Empty State",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/empty-state",
      "publicApi": "projects/components/empty-state/public-api.ts",
      "sourceRoot": "projects/components/empty-state/src",
      "docsPath": "/components/empty-state",
      "docsOverviewSource": "projects/docs/src/app/components/empty-state/overview/overview.html",
      "purpose": "Explain why an expected content area is empty and optionally offer a next action.",
      "useWhen": "Use for empty tables, lists, folders, dashboard sections, first-run screens, no search results, no filtered data, no projects yet, no messages yet, and similar no-content states. Compose with ngs-empty-state, ngs-empty-state-title, ngs-empty-state-content, optional ngs-empty-state-icon or ngs-empty-state-image, and ngs-empty-state-actions for useful next steps such as Create, Clear filters, Invite, or Upload. In DataView, prefer EmptyState inside empty templates for custom dataset empty states. Do not use for loading states; use BlockLoader, Skeleton, or ProgressSpinner. Do not use for critical errors; use Alert or ActionRequired. Do not use as a decorative placeholder, hero block, or marketing section.",
      "exampleTopics": [
        "Basic empty state",
        "Empty state with image",
        "Empty state with icon",
        "Empty state with custom icon",
        "Empty state with actions"
      ],
      "minimalExample": "<div class=\"h-[500px]\">\n  <ngs-empty-state>\n    <ngs-empty-state-title>\n      Something has been achieved\n    </ngs-empty-state-title>\n    <ngs-empty-state-content>\n      You can do something with it, or you can not do it. And the description text can be quite long.\n    </ngs-empty-state-content>\n  </ngs-empty-state>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-empty-state-example",
          "title": "Basic empty state",
          "file": "projects/docs/src/app/components/empty-state/_examples/basic-empty-state-example/basic-empty-state-example.html",
          "source": "<div class=\"h-[500px]\">\n  <ngs-empty-state>\n    <ngs-empty-state-title>\n      Something has been achieved\n    </ngs-empty-state-title>\n    <ngs-empty-state-content>\n      You can do something with it, or you can not do it. And the description text can be quite long.\n    </ngs-empty-state-content>\n  </ngs-empty-state>\n</div>"
        },
        {
          "name": "empty-state-with-actions-example",
          "title": "Empty state with actions",
          "file": "projects/docs/src/app/components/empty-state/_examples/empty-state-with-actions-example/empty-state-with-actions-example.html",
          "source": "<div class=\"h-[500px]\">\n  <ngs-empty-state>\n    <ngs-empty-state-title>\n      Something has been achieved\n    </ngs-empty-state-title>\n    <ngs-empty-state-content>\n      You can do something with it, or you can not do it. And the description text can be quite long.\n    </ngs-empty-state-content>\n    <ngs-empty-state-actions>\n      <button ngsButton>Cancel</button>\n      <button ngsButton=\"filled\">Apply Changes</button>\n    </ngs-empty-state-actions>\n  </ngs-empty-state>\n</div>"
        },
        {
          "name": "empty-state-with-custom-icon-example",
          "title": "Empty state with custom icon",
          "file": "projects/docs/src/app/components/empty-state/_examples/empty-state-with-custom-icon-example/empty-state-with-custom-icon-example.html",
          "source": "<div class=\"h-[500px]\">\n  <ngs-empty-state>\n    <ngs-empty-state-icon>\n      <ngs-icon name=\"fluent:info-24-regular\"/>\n    </ngs-empty-state-icon>\n    <ngs-empty-state-content>\n      No results for the term \"Info\" on the our planet.\n    </ngs-empty-state-content>\n  </ngs-empty-state>\n</div>"
        }
      ],
      "previewAsset": "projects/components/empty-state/preview.svg",
      "selectors": [
        "[ngs-empty-state-title]",
        "ngs-empty-state",
        "ngs-empty-state-actions",
        "ngs-empty-state-content",
        "ngs-empty-state-icon",
        "ngs-empty-state-image",
        "ngs-empty-state-title"
      ],
      "exportedSymbols": [
        "EmptyState",
        "EmptyStateActions",
        "EmptyStateContent",
        "EmptyStateIcon",
        "EmptyStateImage",
        "EmptyStateTitle"
      ],
      "inputs": [],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-neutral-500",
        "--ngs-color-neutral-600",
        "--ngs-color-surface-container",
        "--ngs-empty-state-padding",
        "--ngs-empty-state-title-font-size",
        "--ngs-empty-state-title-font-weight",
        "--ngs-font-size-sm",
        "--ngs-icon-size"
      ],
      "example": null
    },
    {
      "name": "events",
      "title": "Events",
      "overviewName": "Events",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/events",
      "publicApi": "projects/components/events/public-api.ts",
      "sourceRoot": "projects/components/events/src",
      "docsPath": "/components/events",
      "docsOverviewSource": "projects/docs/src/app/components/events/overview/overview.html",
      "purpose": "The NgStarter Angular Events components let you build grouped schedule lists with day markers, event cards, inline statuses, time ranges, status tones, and attendee actions.",
      "useWhen": "Choose Events when the workflow matches examples such as Basic Events, Weekly Grouping, Weekly events.",
      "exampleTopics": [
        "Basic Events",
        "Weekly Grouping",
        "Weekly events"
      ],
      "minimalExample": "<ngs-events-list>\n  <ngs-events-section label=\"This week\">\n    <ngs-event>\n      <ngs-event-date weekday=\"Thu\" day=\"19\"/>\n      <ngs-event-title>Octolane Check-in</ngs-event-title>\n      <ngs-event-status tone=\"success\">Confirmed</ngs-event-status>\n      <ngs-event-time>9:00 - 9:30 AM</ngs-event-time>\n      <ngs-avatar-group ngsEventActions>\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/32.jpg\" label=\"AM\" class=\"size-9\"/>\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/75.jpg\" label=\"DK\" class=\"size-9\"/>\n      </ngs-avatar-group>\n    </ngs-event>\n    <ngs-event>\n      <ngs-event-date weekday=\"Fri\" day=\"20\"/>\n      <ngs-event-title>POC Progress</ngs-event-title>\n      <ngs-event-status tone=\"neutral\">Draft</ngs-event-status>\n      <ngs-event-time>9:00 - 9:15 AM</ngs-event-time>\n      <ngs-avatar-group ngsEventActions>\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/32.jpg\" label=\"AM\" class=\"size-9\"/>\n        <ngs-avatar label=\"PO\" class=\"size-9 bg-neutral-950 text-white\"/>\n      </ngs-avatar-group>\n    </ngs-event>\n    <ngs-event>\n      <ngs-event-date weekday=\"Sat\" day=\"21\"/>\n      <ngs-event-title>Octolane Weekly Review</ngs-event-title>\n      <ngs-event-time>9:00 - 10:00 AM</ngs-event-time>\n      <ngs-avatar-group ngsEventActions>\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/32.jpg\" label=\"AM\" class=\"size-9\"/>\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/46.jpg\" label=\"MR\" class=\"size-9\"/>\n      </ngs-avatar-group>\n    </ngs-event>\n  </ngs-events-section>\n</ngs-events-li\n...",
      "exampleFiles": [
        {
          "name": "basic-events-example",
          "title": "Basic events",
          "file": "projects/docs/src/app/components/events/_examples/basic-events-example/basic-events-example.html",
          "source": "<ngs-events-list>\n  <ngs-events-section label=\"This week\">\n    <ngs-event>\n      <ngs-event-date weekday=\"Thu\" day=\"19\"/>\n      <ngs-event-title>Octolane Check-in</ngs-event-title>\n      <ngs-event-status tone=\"success\">Confirmed</ngs-event-status>\n      <ngs-event-time>9:00 - 9:30 AM</ngs-event-time>\n      <ngs-avatar-group ngsEventActions>\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/32.jpg\" label=\"AM\" class=\"size-9\"/>\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/75.jpg\" label=\"DK\" class=\"size-9\"/>\n      </ngs-avatar-group>\n    </ngs-event>\n    <ngs-event>\n      <ngs-event-date weekday=\"Fri\" day=\"20\"/>\n      <ngs-event-title>POC Progress</ngs-event-title>\n      <ngs-event-status tone=\"neutral\">Draft</ngs-event-status>\n      <ngs-event-time>9:00 - 9:15 AM</ngs-event-time>\n      <ngs-avatar-group ngsEventActions>\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/32.jpg\" label=\"AM\" class=\"size-9\"/>\n        <ngs-avatar label=\"PO\" class=\"size-9 bg-neutral-950 text-white\"/>\n      </ngs-avatar-group>\n    </ngs-event>\n    <ngs-event>\n      <ngs-event-date weekday=\"Sat\" day=\"21\"/>\n      <ngs-event-title>Octolane Weekly Review</ngs-event-title>\n      <ngs-event-time>9:00 - 10:00 AM</ngs-event-time>\n      <ngs-avatar-group ngsEventActions>\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/32.jpg\" label=\"AM\" class=\"size-9\"/>\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/46.jpg\" label=\"MR\" class=\"size-9\"/>\n      </ngs-avatar-group>\n    </ngs-event>\n  </ngs-events-section>\n</ngs-events-li\n..."
        },
        {
          "name": "weekly-events-example",
          "title": "Weekly events",
          "file": "projects/docs/src/app/components/events/_examples/weekly-events-example/weekly-events-example.html",
          "source": "<ngs-events-list groupBy=\"week\">\n  <ngs-events-section label=\"This week\">\n    <ngs-event>\n      <ngs-event-date weekday=\"Sat\" day=\"21\"/>\n      <ngs-event-title>Octolane Weekly Review</ngs-event-title>\n      <ngs-event-status tone=\"success\">Confirmed</ngs-event-status>\n      <ngs-event-time>9:00 - 10:00 AM</ngs-event-time>\n      <ngs-avatar-group ngsEventActions>\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/32.jpg\" label=\"AM\" class=\"size-9\"/>\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/46.jpg\" label=\"MR\" class=\"size-9\"/>\n      </ngs-avatar-group>\n    </ngs-event>\n  </ngs-events-section>\n  <ngs-events-section label=\"Next week\">\n    <ngs-event>\n      <ngs-event-date weekday=\"Mon\" day=\"23\"/>\n      <ngs-event-title>POC Progress</ngs-event-title>\n      <ngs-event-status tone=\"neutral\">Draft</ngs-event-status>\n      <ngs-event-time>9:00 - 9:15 AM</ngs-event-time>\n      <ngs-avatar-group ngsEventActions>\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/32.jpg\" label=\"AM\" class=\"size-9\"/>\n        <ngs-avatar label=\"PO\" class=\"size-9 bg-neutral-950 text-white\"/>\n      </ngs-avatar-group>\n    </ngs-event>\n  </ngs-events-section>\n</ngs-events-list>"
        }
      ],
      "previewAsset": "projects/components/events/preview.svg",
      "selectors": [
        "[ngs-event-date]",
        "[ngs-event-description]",
        "[ngs-event-status]",
        "[ngs-event-time]",
        "[ngs-event-title]",
        "[ngsEventActions]",
        "ngs-event",
        "ngs-event-date",
        "ngs-event-description",
        "ngs-event-status",
        "ngs-event-time",
        "ngs-event-title",
        "ngs-events-list",
        "ngs-events-section"
      ],
      "exportedSymbols": [
        "Event",
        "EventActionsDirective",
        "EventDate",
        "EventDescription",
        "EventsList",
        "EventsListGroupBy",
        "EventsSection",
        "EventStatus",
        "EventTime",
        "EventTitle",
        "EventTone"
      ],
      "inputs": [
        "day",
        "groupBy",
        "label",
        "tone",
        "weekday"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-border",
        "--ngs-color-danger",
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-primary",
        "--ngs-color-success",
        "--ngs-color-warning",
        "--ngs-event-bg",
        "--ngs-event-border-color",
        "--ngs-event-date-border-color",
        "--ngs-event-date-day-color",
        "--ngs-event-date-day-font-size",
        "--ngs-event-date-day-font-weight",
        "--ngs-event-date-divider-height",
        "--ngs-event-date-height",
        "--ngs-event-date-weekday-color",
        "--ngs-event-date-weekday-font-size",
        "--ngs-event-date-weekday-font-weight",
        "--ngs-event-date-width",
        "--ngs-event-description-color",
        "--ngs-event-description-font-size",
        "--ngs-event-description-font-weight",
        "--ngs-event-gap",
        "--ngs-event-meta-gap",
        "--ngs-event-min-height",
        "--ngs-event-padding",
        "--ngs-event-radius",
        "--ngs-event-shadow",
        "--ngs-event-status-color",
        "--ngs-event-status-dot-color",
        "--ngs-event-status-dot-size",
        "--ngs-event-status-font-size",
        "--ngs-event-status-font-weight",
        "--ngs-event-status-gap",
        "--ngs-event-time-color",
        "--ngs-event-time-font-size",
        "--ngs-event-time-font-weight",
        "--ngs-event-title-color",
        "--ngs-event-title-font-size",
        "--ngs-event-title-font-weight",
        "--ngs-events-list-gap",
        "--ngs-events-section-gap",
        "--ngs-events-section-item-gap",
        "--ngs-events-section-label-color",
        "--ngs-events-section-label-font-size",
        "--ngs-events-section-label-font-weight",
        "--ngs-shadow-xs"
      ],
      "example": null
    },
    {
      "name": "expand",
      "title": "Expand",
      "overviewName": "Expand",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/expand",
      "publicApi": "projects/components/expand/public-api.ts",
      "sourceRoot": "projects/components/expand/src",
      "docsPath": "/components/expand",
      "docsOverviewSource": "projects/docs/src/app/components/expand/overview/overview.html",
      "purpose": "Collapse one long content block to a limited-height preview with a fade and show-more control.",
      "useWhen": "Use for long descriptions, comments, changelog entries, release notes, activity text, terms snippets, card descriptions, and compact summaries where the page should stay scannable but users can reveal the full content inline. Supports expanded, expandedChange, height, color, expandLabel, collapseLabel, and showButtonIfExpanded. Do not use for independent collapsible sections; use ExpansionPanel or accordion. Do not use for hierarchical expandable nodes; use Tree. Do not use for read-more navigation to another page, tabs, steppers, form disclosure logic, or as a generic container/card.",
      "exampleTopics": [
        "Basic Expand",
        "Show button if expanded",
        "Custom button labels",
        "Expand show button if expanded",
        "Expand custom button labels"
      ],
      "minimalExample": "<ngs-expand [expanded]=\"expanded\" class=\"border border-muted rounded-2xl p-5 text-sm leading-relaxed\">\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hop\n...",
      "exampleFiles": [
        {
          "name": "basic-expand-example",
          "title": "Basic expand",
          "file": "projects/docs/src/app/components/expand/_examples/basic-expand-example/basic-expand-example.html",
          "source": "<ngs-expand [expanded]=\"expanded\" class=\"border border-muted rounded-2xl p-5 text-sm leading-relaxed\">\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hop\n..."
        },
        {
          "name": "expand-custom-button-labels-example",
          "title": "Expand custom button labels",
          "file": "projects/docs/src/app/components/expand/_examples/expand-custom-button-labels-example/expand-custom-button-labels-example.html",
          "source": "<ngs-expand showButtonIfExpanded\n            expandLabel=\"Expand\"\n            collapseLabel=\"Collapse\"\n            class=\"border border-muted rounded-2xl p-5 text-sm leading-relaxed\">\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no o\n..."
        },
        {
          "name": "expand-show-button-if-expanded-example",
          "title": "Expand show button if expanded",
          "file": "projects/docs/src/app/components/expand/_examples/expand-show-button-if-expanded-example/expand-show-button-if-expanded-example.html",
          "source": "<ngs-expand showButtonIfExpanded class=\"border border-muted rounded-2xl p-5 text-sm leading-relaxed\">\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hoping I had a magical, complete solution to this problem, <br>\n  I’m sorry to disappoint you. There’s no one solution that achieves the desired effect without downsides.\n  If you were hopi\n..."
        }
      ],
      "previewAsset": "projects/components/expand/preview.svg",
      "selectors": [
        "ngs-expand"
      ],
      "exportedSymbols": [
        "Expand"
      ],
      "inputs": [
        "collapseLabel",
        "color",
        "expanded",
        "expandLabel",
        "height",
        "showButtonIfExpanded"
      ],
      "outputs": [
        "expandedChange"
      ],
      "cssTokens": [
        "--ngs-color-background",
        "--ngs-color-on-surface",
        "--ngs-color-surface-container",
        "--ngs-color-surface-container-high",
        "--ngs-expand-button-bg",
        "--ngs-expand-button-border-radius",
        "--ngs-expand-button-box-shadow",
        "--ngs-expand-button-color",
        "--ngs-expand-button-font-size",
        "--ngs-expand-button-hover-bg",
        "--ngs-expand-button-hover-opacity",
        "--ngs-expand-button-padding",
        "--ngs-expand-expanded-height",
        "--ngs-expand-fade-color",
        "--ngs-shadow-md"
      ],
      "example": null
    },
    {
      "name": "expansion",
      "title": "Expansion",
      "overviewName": "Expansion Panel",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/expansion",
      "publicApi": "projects/components/expansion/public-api.ts",
      "sourceRoot": "projects/components/expansion/src",
      "docsPath": "/components/expansion-panel",
      "docsOverviewSource": "projects/docs/src/app/components/expansion-panel/overview/overview.html",
      "purpose": "Group independent collapsible sections with headers and bodies.",
      "useWhen": "Use ngs-expansion-panel for one collapsible section and ngs-accordion for a coordinated group of panels. Use for settings groups, FAQs, advanced options, filters, grouped form sections, detail sections, onboarding or setup steps, and inspector groups where each section has its own title and content. Supports expanded, expandedChange, opened, closed, disabled, hideToggle, ngs-expansion-panel-header, ngs-expansion-panel-title, ngs-expansion-panel-description, ngs-action-row, accordion multi, openAll(), and closeAll(). Do not use to truncate one long text block; use Expand. Do not use for hierarchical nodes; use Tree. Do not use as tabs, a strict stepper flow, or a plain card/container without collapse behavior.",
      "exampleTopics": [
        "Basic Expansion Panel",
        "Expansion Panel with expand/collapse all toggles",
        "Expansion Panel as Accordion",
        "Expansion panel expand collapse toggles"
      ],
      "minimalExample": "<ngs-accordion>\n  <ngs-expansion-panel hideToggle>\n    <ngs-expansion-panel-header>\n      <ngs-expansion-panel-title>\n        This is the expansion title\n      </ngs-expansion-panel-title>\n      <ngs-expansion-panel-description>\n        This is a summary of the content\n      </ngs-expansion-panel-description>\n    </ngs-expansion-panel-header>\n    <p>This is the primary content of the panel.</p>\n  </ngs-expansion-panel>\n  <ngs-expansion-panel (opened)=\"panelOpenState = true\"\n                       (closed)=\"panelOpenState = false\">\n    <ngs-expansion-panel-header>\n      <ngs-expansion-panel-title>\n        Self aware panel\n      </ngs-expansion-panel-title>\n      <ngs-expansion-panel-description>\n        Currently I am {{ panelOpenState ? 'open' : 'closed' }}\n      </ngs-expansion-panel-description>\n    </ngs-expansion-panel-header>\n    <p>I'm visible because I am open</p>\n  </ngs-expansion-panel>\n</ngs-accordion>",
      "exampleFiles": [
        {
          "name": "basic-expansion-panel-example",
          "title": "Basic expansion panel",
          "file": "projects/docs/src/app/components/expansion-panel/_examples/basic-expansion-panel-example/basic-expansion-panel-example.html",
          "source": "<ngs-accordion>\n  <ngs-expansion-panel hideToggle>\n    <ngs-expansion-panel-header>\n      <ngs-expansion-panel-title>\n        This is the expansion title\n      </ngs-expansion-panel-title>\n      <ngs-expansion-panel-description>\n        This is a summary of the content\n      </ngs-expansion-panel-description>\n    </ngs-expansion-panel-header>\n    <p>This is the primary content of the panel.</p>\n  </ngs-expansion-panel>\n  <ngs-expansion-panel (opened)=\"panelOpenState = true\"\n                       (closed)=\"panelOpenState = false\">\n    <ngs-expansion-panel-header>\n      <ngs-expansion-panel-title>\n        Self aware panel\n      </ngs-expansion-panel-title>\n      <ngs-expansion-panel-description>\n        Currently I am {{ panelOpenState ? 'open' : 'closed' }}\n      </ngs-expansion-panel-description>\n    </ngs-expansion-panel-header>\n    <p>I'm visible because I am open</p>\n  </ngs-expansion-panel>\n</ngs-accordion>"
        },
        {
          "name": "expansion-panel-as-accordion-example",
          "title": "Expansion panel as accordion",
          "file": "projects/docs/src/app/components/expansion-panel/_examples/expansion-panel-as-accordion-example/expansion-panel-as-accordion-example.html",
          "source": "<ngs-accordion class=\"example-headers-align\">\n  <ngs-expansion-panel [expanded]=\"step === 0\" (opened)=\"setStep(0)\" hideToggle>\n    <ngs-expansion-panel-header>\n      <ngs-expansion-panel-title>\n        Personal data\n      </ngs-expansion-panel-title>\n      <ngs-expansion-panel-description>\n        Type your name and age\n        <ngs-icon name=\"fluent:person-circle-24-regular\"/>\n      </ngs-expansion-panel-description>\n    </ngs-expansion-panel-header>\n    <ngs-form-field>\n      <ngs-label>First name</ngs-label>\n      <input ngsInput>\n    </ngs-form-field>\n    <ngs-form-field>\n      <ngs-label>Age</ngs-label>\n      <input ngsInput type=\"number\" min=\"1\">\n    </ngs-form-field>\n    <ngs-action-row>\n      <button ngsButton (click)=\"nextStep()\">Next</button>\n    </ngs-action-row>\n  </ngs-expansion-panel>\n  <ngs-expansion-panel [expanded]=\"step === 1\" (opened)=\"setStep(1)\" hideToggle>\n    <ngs-expansion-panel-header>\n      <ngs-expansion-panel-title>\n        Destination\n      </ngs-expansion-panel-title>\n      <ngs-expansion-panel-description>\n        Type the country name\n        <ngs-icon name=\"fluent:map-24-regular\"/>\n      </ngs-expansion-panel-description>\n    </ngs-expansion-panel-header>\n    <ngs-form-field>\n      <ngs-label>Country</ngs-label>\n      <input ngsInput>\n    </ngs-form-field>\n    <ngs-action-row>\n      <button ngsButton (click)=\"prevStep()\">Previous</button>\n      <button ngsButton (click)=\"nextStep()\">Next</button>\n    </ngs-action-row>\n  </ngs-expansion-panel>\n  <ngs-expansion-panel [expanded]=\"step === 2\" (opened)=\"setStep(2)\" hideToggle>\n    <ngs-expansion-\n..."
        },
        {
          "name": "expansion-panel-expand-collapse-toggles-example",
          "title": "Expansion panel expand collapse toggles",
          "file": "projects/docs/src/app/components/expansion-panel/_examples/expansion-panel-expand-collapse-toggles-example/expansion-panel-expand-collapse-toggles-example.html",
          "source": "<div class=\"flex items-center gap-4 mb-6\">\n  <button ngsButton (click)=\"accordion().openAll()\">Expand All</button>\n  <button ngsButton (click)=\"accordion().closeAll()\">Collapse All</button>\n</div>\n<ngs-accordion class=\"example-headers-align\" multi>\n  <ngs-expansion-panel>\n    <ngs-expansion-panel-header>\n      <ngs-expansion-panel-title>\n        Personal data\n      </ngs-expansion-panel-title>\n      <ngs-expansion-panel-description>\n        Type your name and age\n        <ngs-icon name=\"fluent:person-circle-24-regular\"/>\n      </ngs-expansion-panel-description>\n    </ngs-expansion-panel-header>\n    <ngs-form-field>\n      <ngs-label>First name</ngs-label>\n      <input ngsInput>\n    </ngs-form-field>\n    <ngs-form-field>\n      <ngs-label>Age</ngs-label>\n      <input ngsInput type=\"number\" min=\"1\">\n    </ngs-form-field>\n  </ngs-expansion-panel>\n  <ngs-expansion-panel disabled>\n    <ngs-expansion-panel-header>\n      <ngs-expansion-panel-title>\n        Destination\n      </ngs-expansion-panel-title>\n      <ngs-expansion-panel-description>\n        Type the country name\n        <ngs-icon name=\"fluent:map-24-regular\"/>\n      </ngs-expansion-panel-description>\n    </ngs-expansion-panel-header>\n    <ngs-form-field>\n      <ngs-label>Country</ngs-label>\n      <input ngsInput>\n    </ngs-form-field>\n  </ngs-expansion-panel>\n  <ngs-expansion-panel>\n    <ngs-expansion-panel-header>\n      <ngs-expansion-panel-title>\n        Day of the trip\n      </ngs-expansion-panel-title>\n      <ngs-expansion-panel-description>\n        Inform the date you wish to travel\n        <ngs-icon name=\"fluent:calen\n..."
        }
      ],
      "previewAsset": "projects/components/expansion/preview.svg",
      "selectors": [
        "ngs-accordion",
        "ngs-action-row",
        "ngs-expansion-panel",
        "ngs-expansion-panel-description",
        "ngs-expansion-panel-header",
        "ngs-expansion-panel-title"
      ],
      "exportedSymbols": [
        "Accordion",
        "ActionRow",
        "ExpansionPanel",
        "ExpansionPanelDescription",
        "ExpansionPanelHeader",
        "ExpansionPanelTitle"
      ],
      "inputs": [
        "disabled",
        "expanded",
        "hideToggle",
        "multi"
      ],
      "outputs": [
        "closed",
        "expandedChange",
        "opened"
      ],
      "cssTokens": [
        "--ngs-color-neutral-300",
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-subtle",
        "--ngs-color-surface",
        "--ngs-expansion-panel-background",
        "--ngs-expansion-panel-color",
        "--ngs-expansion-panel-content-padding",
        "--ngs-expansion-panel-description-color",
        "--ngs-expansion-panel-disabled-color",
        "--ngs-expansion-panel-divider-color",
        "--ngs-expansion-panel-header-expanded-height",
        "--ngs-expansion-panel-header-height",
        "--ngs-expansion-panel-radius",
        "--ngs-radius-xl"
      ],
      "example": null
    },
    {
      "name": "file-type",
      "title": "File Type",
      "overviewName": "File Type",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/file-type",
      "publicApi": "projects/components/file-type/public-api.ts",
      "sourceRoot": "projects/components/file-type/src",
      "docsPath": "/components/file-type",
      "docsOverviewSource": "projects/docs/src/app/components/file-type/overview/overview.html",
      "purpose": "The NgStarter Angular File Type component renders built-in SVG file icons from a MIME type, extension, or file name.",
      "useWhen": "Choose File Type when the workflow matches examples such as Basic File Type, Icon Sizes, MIME Type Detection, File Type Gallery, File type sizes.",
      "exampleTopics": [
        "Basic File Type",
        "Icon Sizes",
        "MIME Type Detection",
        "File Type Gallery",
        "File type sizes",
        "File type mime"
      ],
      "minimalExample": "<div class=\"flex items-center gap-4\">\n  <ngs-file-type fileName=\"contract.pdf\" class=\"size-14\"/>\n  <div>\n    <div class=\"text-sm\">contract.pdf</div>\n    <div class=\"text-xs text-secondary\">Resolved from fileName</div>\n  </div>\n</div>\n<div class=\"flex items-center gap-4 mt-5\">\n  <ngs-file-type extension=\"xlsx\" class=\"size-14\"/>\n  <div>\n    <div class=\"text-sm\">Financial model</div>\n    <div class=\"text-xs text-secondary\">Resolved from extension</div>\n  </div>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-file-type-example",
          "title": "Basic file type",
          "file": "projects/docs/src/app/components/file-type/_examples/basic-file-type-example/basic-file-type-example.html",
          "source": "<div class=\"flex items-center gap-4\">\n  <ngs-file-type fileName=\"contract.pdf\" class=\"size-14\"/>\n  <div>\n    <div class=\"text-sm\">contract.pdf</div>\n    <div class=\"text-xs text-secondary\">Resolved from fileName</div>\n  </div>\n</div>\n<div class=\"flex items-center gap-4 mt-5\">\n  <ngs-file-type extension=\"xlsx\" class=\"size-14\"/>\n  <div>\n    <div class=\"text-sm\">Financial model</div>\n    <div class=\"text-xs text-secondary\">Resolved from extension</div>\n  </div>\n</div>"
        },
        {
          "name": "file-type-gallery-example",
          "title": "File type gallery",
          "file": "projects/docs/src/app/components/file-type/_examples/file-type-gallery-example/file-type-gallery-example.html",
          "source": "<div class=\"grid grid-cols-3 gap-4 sm:grid-cols-4 md:grid-cols-5\">\n  @for (type of types(); track type) {\n    <div class=\"flex flex-col items-center gap-2 rounded-lg border border-border p-4\">\n      <ngs-file-type [extension]=\"type\" class=\"size-16\"/>\n      <div class=\"text-xs uppercase text-secondary\">{{ type }}</div>\n    </div>\n  }\n</div>"
        },
        {
          "name": "file-type-mime-example",
          "title": "File type mime",
          "file": "projects/docs/src/app/components/file-type/_examples/file-type-mime-example/file-type-mime-example.html",
          "source": "<div class=\"grid gap-4 sm:grid-cols-2\">\n  @for (file of files(); track file.name) {\n    <div class=\"flex items-center gap-4 rounded-lg border border-border p-4\">\n      <ngs-file-type [mimeType]=\"file.mimeType\" [fallback]=\"file.fallback\" class=\"size-12\"/>\n      <div class=\"min-w-0\">\n        <div class=\"truncate text-sm\">{{ file.name }}</div>\n        <div class=\"truncate text-xs text-secondary\">{{ file.mimeType }}</div>\n      </div>\n    </div>\n  }\n</div>"
        }
      ],
      "previewAsset": "projects/components/file-type/preview.svg",
      "selectors": [
        "ngs-file-type"
      ],
      "exportedSymbols": [
        "FileType",
        "FileTypeName"
      ],
      "inputs": [
        "decorative",
        "extension",
        "fallback",
        "fileName",
        "label",
        "mimeType"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-file-type-size"
      ],
      "example": null
    },
    {
      "name": "filter-builder",
      "title": "Filter Builder",
      "overviewName": "Filter Builder",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/filter-builder",
      "publicApi": "projects/components/filter-builder/public-api.ts",
      "sourceRoot": "projects/components/filter-builder/src",
      "docsPath": "/components/filter-builder",
      "docsOverviewSource": "projects/docs/src/app/components/filter-builder/overview/overview.html",
      "purpose": "Let users construct a structured tree of filtering rules from fields, operations, and values.",
      "useWhen": "Use for advanced filters, saved views, report builders, admin datasets, CRM or ERP records, audit logs, catalogs, product filtering, and segmentation workflows where a simple search field is not enough. Configure fields with fieldDefs using dataField, name, dataType, optional lookup, and filterOperations. Users can build conditions and nested groups with and/or, and valueChanged emits FilterBuilderGroup[]. The app must translate that emitted tree into an API query, SQL or DSL condition, DataView datasource params, or local filtering logic. Do not use for ordinary text search; use Input or a search field. Do not use for a simple table filter string; use DataView/Table filtering. Do not use as a data-editing form, query-language editor, chart filter chip bar, or full report builder with visualizations.",
      "exampleTopics": [
        "Basic filter builder"
      ],
      "minimalExample": "<ngs-filter-builder [fieldDefs]=\"fieldDefs\"\n                    [value]=\"value\"\n                    (valueChanged)=\"value = $event\"/>\n<div class=\"mt-7\">\n  <div class=\"mb-4 text-sm font-bold\">Value:</div>\n  <pre class=\"text-sm\">{{ value | json }}</pre>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-filter-builder-example",
          "title": "Basic filter builder",
          "file": "projects/docs/src/app/components/filter-builder/_examples/basic-filter-builder-example/basic-filter-builder-example.html",
          "source": "<ngs-filter-builder [fieldDefs]=\"fieldDefs\"\n                    [value]=\"value\"\n                    (valueChanged)=\"value = $event\"/>\n<div class=\"mt-7\">\n  <div class=\"mb-4 text-sm font-bold\">Value:</div>\n  <pre class=\"text-sm\">{{ value | json }}</pre>\n</div>"
        }
      ],
      "previewAsset": "projects/components/filter-builder/preview.svg",
      "selectors": [
        "[ngsFilterBuilderOperationDef]",
        "[ngsFilterBuilderOperationIcon]",
        "[ngsFilterBuilderOperationName]",
        "ngs-filter-builder"
      ],
      "exportedSymbols": [
        "FilterBuilder",
        "FilterBuilderCondition",
        "FilterBuilderFieldDataSourceItem",
        "FilterBuilderFieldDef",
        "FilterBuilderGroup",
        "FilterBuilderItemType",
        "FilterBuilderOperationDefDirective",
        "FilterBuilderOperationIconDirective",
        "FilterBuilderOperationNameDirective"
      ],
      "inputs": [
        "allowedDataTypes",
        "categories",
        "customOperations",
        "fieldDefs",
        "groupOperations",
        "ngsFilterBuilderOperationDef",
        "value"
      ],
      "outputs": [
        "valueChanged"
      ],
      "cssTokens": [
        "--ngs-color-border",
        "--ngs-color-danger",
        "--ngs-color-neutral-100",
        "--ngs-color-neutral-200",
        "--ngs-color-neutral-50",
        "--ngs-color-neutral-600",
        "--ngs-color-neutral-650",
        "--ngs-color-on-primary",
        "--ngs-color-on-primary-container",
        "--ngs-color-on-secondary",
        "--ngs-color-on-secondary-container",
        "--ngs-color-on-surface",
        "--ngs-color-primary",
        "--ngs-color-primary-400",
        "--ngs-color-primary-container",
        "--ngs-color-secondary",
        "--ngs-color-secondary-400",
        "--ngs-color-secondary-container",
        "--ngs-color-surface-container",
        "--ngs-color-surface-container-high",
        "--ngs-color-surface-container-highest",
        "--ngs-filter-builder-condition-field-active-bg",
        "--ngs-filter-builder-condition-field-active-color",
        "--ngs-filter-builder-condition-field-bg",
        "--ngs-filter-builder-condition-field-border-radius",
        "--ngs-filter-builder-condition-field-bpadding",
        "--ngs-filter-builder-condition-field-color",
        "--ngs-filter-builder-condition-field-font-size",
        "--ngs-filter-builder-condition-field-font-weight",
        "--ngs-filter-builder-condition-field-height",
        "--ngs-filter-builder-condition-field-hover-bg",
        "--ngs-filter-builder-condition-field-hover-color",
        "--ngs-filter-builder-condition-gap",
        "--ngs-filter-builder-condition-operation-active-bg",
        "--ngs-filter-builder-condition-operation-active-color",
        "--ngs-filter-builder-condition-operation-bg",
        "--ngs-filter-builder-condition-operation-border-radius",
        "--ngs-filter-builder-condition-operation-bpadding",
        "--ngs-filter-builder-condition-operation-color",
        "--ngs-filter-builder-condition-operation-font-size",
        "--ngs-filter-builder-condition-operation-font-weight",
        "--ngs-filter-builder-condition-operation-height",
        "--ngs-filter-builder-condition-operation-hover-bg",
        "--ngs-filter-builder-condition-operation-hover-color",
        "--ngs-filter-builder-condition-remove-color",
        "--ngs-filter-builder-condition-remove-hover-color",
        "--ngs-filter-builder-condition-value-bg",
        "--ngs-filter-builder-condition-value-border-radius",
        "--ngs-filter-builder-condition-value-bpadding",
        "--ngs-filter-builder-condition-value-color",
        "--ngs-filter-builder-condition-value-font-size",
        "--ngs-filter-builder-condition-value-font-weight",
        "--ngs-filter-builder-condition-value-height",
        "--ngs-filter-builder-condition-value-hover-bg",
        "--ngs-filter-builder-condition-value-hover-color",
        "--ngs-filter-builder-group-add-color",
        "--ngs-filter-builder-group-add-hover-color",
        "--ngs-filter-builder-group-gap",
        "--ngs-filter-builder-group-margin",
        "--ngs-filter-builder-group-operation-active-bg",
        "--ngs-filter-builder-group-operation-active-color",
        "--ngs-filter-builder-group-operation-bg",
        "--ngs-filter-builder-group-operation-border",
        "--ngs-filter-builder-group-operation-border-radius",
        "--ngs-filter-builder-group-operation-bpadding",
        "--ngs-filter-builder-group-operation-color",
        "--ngs-filter-builder-group-operation-font-size",
        "--ngs-filter-builder-group-operation-font-weight",
        "--ngs-filter-builder-group-operation-height",
        "--ngs-filter-builder-group-operation-hover-bg",
        "--ngs-filter-builder-group-operation-hover-color",
        "--ngs-filter-builder-group-operations-gap",
        "--ngs-filter-builder-group-padding",
        "--ngs-form-field-container-height",
        "--ngs-form-field-container-vertical-padding",
        "--ngs-radius-lg"
      ],
      "example": null
    },
    {
      "name": "form-builder",
      "title": "Form Builder",
      "overviewName": "Form Builder",
      "category": "libraries",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/form-builder",
      "publicApi": "projects/components/form-builder/public-api.ts",
      "sourceRoot": "projects/components/form-builder/src",
      "docsPath": "/libraries/form-builder",
      "docsOverviewSource": "projects/docs/src/app/libraries/form-builder/overview/overview.html",
      "purpose": "The NgStarter Angular Form Builder library provides a drag-and-drop form designer, schema model, runtime renderer, and provider registration API for custom field types and field-specific settings.",
      "useWhen": "Choose Form Builder when the workflow matches examples such as Basic form builder, Custom field registration, Form builder renderer.",
      "schemaFormat": [
        "FormBuilderSchema shape: { title?: string; fields?: FormBuilderField[]; layout?: FormBuilderLayoutItem[]; sections: FormBuilderSection[] }.",
        "Root-level fields live in schema.fields and can be placed outside sections. Sections live in schema.sections and contain section.fields. The optional schema.layout array controls top-level canvas order with items like { kind: \"field\" | \"section\", id }.",
        "FormBuilderSection shape: { id: string; title: string; description?: string; collapsed?: boolean; fields: FormBuilderField[] }.",
        "FormBuilderField shape: { id: string; name: string; type: string; kind?: \"field\" | \"layout\" | \"static\"; label: string; placeholder?: string; hint?: string; defaultValue?: any; width?: 1..12; multiple?: boolean; clearable?: boolean; required?: boolean; disabled?: boolean; readonly?: boolean; options?: FormBuilderOption[]; validation?: FormBuilderValidationRule[]; settings?: Record<string, any>; children?: FormBuilderField[] }.",
        "Layout blocks are represented as fields with kind: \"layout\". The built-in group block uses type: \"group\", width: 12, and children: FormBuilderField[]. Section is a top-level FormBuilderSection, not a child field, and should not be nested inside another section/group.",
        "Static blocks are represented as fields with kind: \"static\". The built-in spacer block uses type: \"spacer\", width: 12, and settings.height with one of 8, 16, 24, 32, 48, or 64.",
        "Use width as a 12-column span. Default fields are 12 columns unless a narrower width is set. Nested children in group are sorted and rendered inside that group container.",
        "Option fields use options entries { label: string; value: any; selected?: boolean }. For select, multiple controls array values; clearable enables the clear action. For radio, settings.orientation is \"vertical\" by default and can be \"horizontal\". Hidden fields use type: \"hidden\" and render as native <input type=\"hidden\"> controls included in raw form values. Date and time fields include type: \"date\" for a single date, type: \"time\" for HH:mm time values, and type: \"date-range\" for a DateRange-like value with start/end dates. Upload fields use type: \"upload\", multiple for File[] values, and settings.accept for comma-separated MIME types such as \"*/*\" or \"image/*,application/pdf\". Upload handling can be provided with [uploadCallback] on ngs-form-builder/ngs-form-renderer or globally through provideFormBuilder({ uploadCallback }). The callback receives { field, control, event, files, fileList, multiple } and may return sync/async value stored in the form control.",
        "Use <ngs-form-renderer> from @ngstarter-ui/components/form-builder to render a saved FormBuilderSchema as a runtime form. The Angular class export is FormRenderer.",
        "Register custom placeholders through provideFormBuilder({ fields/items/settings }) using formBuilderField(), formBuilderItem(), and formBuilderSettings(). Custom field definitions can provide defaults, renderer, settings, validators, acceptsChildren, group, icon, and kind."
      ],
      "exampleTopics": [
        "Basic form builder",
        "Custom field registration",
        "Form builder renderer"
      ],
      "minimalExample": "<div class=\"flex flex-col gap-6\">\n  <ngs-form-builder [(schema)]=\"schema\"/>\n  <ngs-card>\n    <ngs-card-header>\n      <ngs-card-title>Current schema</ngs-card-title>\n    </ngs-card-header>\n    <ngs-card-content>\n      <ngs-code-highlighter\n        [code]=\"schemaCode()\"\n        language=\"json\"\n        appearance=\"none\"\n        disableOverflow/>\n    </ngs-card-content>\n  </ngs-card>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-form-builder-example",
          "title": "Basic form builder",
          "file": "projects/docs/src/app/libraries/form-builder/_examples/basic-form-builder-example/basic-form-builder-example.html",
          "source": "<div class=\"flex flex-col gap-6\">\n  <ngs-form-builder [(schema)]=\"schema\"/>\n  <ngs-card>\n    <ngs-card-header>\n      <ngs-card-title>Current schema</ngs-card-title>\n    </ngs-card-header>\n    <ngs-card-content>\n      <ngs-code-highlighter\n        [code]=\"schemaCode()\"\n        language=\"json\"\n        appearance=\"none\"\n        disableOverflow/>\n    </ngs-card-content>\n  </ngs-card>\n</div>"
        },
        {
          "name": "custom-field-registration-example",
          "title": "Custom field registration",
          "file": "projects/docs/src/app/libraries/form-builder/_examples/custom-field-registration-example/custom-field-registration-example.html",
          "source": "<ngs-form-builder [(schema)]=\"schema\"/>"
        },
        {
          "name": "form-builder-renderer-example",
          "title": "Form builder renderer",
          "file": "projects/docs/src/app/libraries/form-builder/_examples/form-builder-renderer-example/form-builder-renderer-example.html",
          "source": "<div class=\"grid gap-6 lg:grid-cols-[minmax(0,1fr)_320px]\">\n  <ngs-form-renderer\n    [schema]=\"schema\"\n    [uploadCallback]=\"uploadCallback\"\n    [(value)]=\"value\"\n    submitLabel=\"Save profile\"\n    (formSubmit)=\"submittedValue.set($event)\"/>\n  <ngs-card>\n    <ngs-card-header>\n      <ngs-card-title>Submitted value</ngs-card-title>\n    </ngs-card-header>\n    <ngs-card-content>\n      <pre>{{ submittedValue() || value() | json }}</pre>\n    </ngs-card-content>\n  </ngs-card>\n</div>"
        }
      ],
      "previewAsset": null,
      "selectors": [
        "ngs-basic-form-builder-field-settings",
        "ngs-basic-form-builder-layout-settings",
        "ngs-basic-form-builder-section-settings",
        "ngs-form-builder",
        "ngs-form-builder-field-host",
        "ngs-form-builder-settings-host",
        "ngs-form-logic",
        "ngs-form-renderer"
      ],
      "exportedSymbols": [
        "asyncValidatorsFromRules",
        "BasicFormBuilderFieldSettings",
        "BasicFormBuilderLayoutSettings",
        "BasicFormBuilderSectionSettings",
        "createDefaultFormBuilderSchema",
        "DEFAULT_FORM_BUILDER_FIELDS",
        "DEFAULT_FORM_BUILDER_ITEMS",
        "DEFAULT_FORM_BUILDER_VALIDATORS",
        "FORM_BUILDER_FIELD_BASE_SETTINGS_SCHEMA",
        "FORM_BUILDER_FIELDS",
        "FORM_BUILDER_INPUT_FIELD_BASE_SETTINGS_SCHEMA",
        "FORM_BUILDER_ITEMS",
        "FORM_BUILDER_LAYOUT_BASE_SETTINGS_SCHEMA",
        "FORM_BUILDER_LAYOUT_CONTAINER_BASE_SETTINGS_SCHEMA",
        "FORM_BUILDER_SECTION_BASE_SETTINGS_SCHEMA",
        "FORM_BUILDER_SELECT_DATA_SOURCES",
        "FORM_BUILDER_SETTINGS",
        "FORM_BUILDER_STATIC_BASE_SETTINGS_SCHEMA",
        "FORM_BUILDER_UPLOAD_CALLBACK",
        "FORM_BUILDER_VALIDATORS",
        "FormBuilder",
        "FormBuilderComponentImporter",
        "formBuilderField",
        "FormBuilderField",
        "FormBuilderFieldChange",
        "FormBuilderFieldDefinition",
        "FormBuilderFieldHost",
        "FormBuilderFieldRenderContext",
        "FormBuilderFieldSettingsContext",
        "FormBuilderFieldWidth",
        "formBuilderItem",
        "FormBuilderItemDefinition",
        "FormBuilderItemKind",
        "FormBuilderLayoutItem",
        "FormBuilderOption",
        "FormBuilderSchema",
        "FormBuilderSection",
        "FormBuilderSectionSettingsContext",
        "FormBuilderSelectDataSourceDefinition",
        "FormBuilderSelectDataSourceOptions",
        "FormBuilderSelectOptionsSource",
        "formBuilderSettings",
        "FormBuilderSettingsConfig",
        "FormBuilderSettingsContext",
        "FormBuilderSettingsDefinition",
        "FormBuilderSettingsHost",
        "FormBuilderSettingsInheritance",
        "FormBuilderSettingsSchemaFactory",
        "FormBuilderUploadCallback",
        "FormBuilderUploadContext",
        "FormBuilderValidationRule",
        "formBuilderValidator",
        "FormBuilderValidatorDefinition",
        "FormBuilderValidatorFactory",
        "FormBuilderValidatorValueType",
        "FormLogic",
        "FormRenderer",
        "mergeFormBuilderValidatorDefinitions",
        "provideFormBuilder",
        "provideFormBuilderField",
        "provideFormBuilderFields",
        "provideFormBuilderSelectDataSource",
        "provideFormBuilderSelectDataSources",
        "provideFormBuilderValidator",
        "provideFormBuilderValidators",
        "validatorsFromRules"
      ],
      "inputs": [
        "canvasDropPlaceholderDelay",
        "control",
        "definitions",
        "description",
        "editableCanvas",
        "field",
        "inspectorTitle",
        "paletteTitle",
        "readonly",
        "schema",
        "section",
        "settingsDefinitions",
        "showSubmit",
        "submitLabel",
        "title",
        "uploadCallback"
      ],
      "outputs": [
        "fieldAdded",
        "fieldRemoved",
        "fieldSelected",
        "formReady"
      ],
      "cssTokens": [
        "--ngs-avatar-font-weight",
        "--ngs-avatar-size",
        "--ngs-card-padding",
        "--ngs-color-border",
        "--ngs-color-danger",
        "--ngs-color-on-primary-container",
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-outline-variant",
        "--ngs-color-primary",
        "--ngs-color-primary-container",
        "--ngs-color-surface",
        "--ngs-color-surface-container-lowest",
        "--ngs-field-radius",
        "--ngs-font-size-base",
        "--ngs-font-size-lg",
        "--ngs-font-size-sm",
        "--ngs-font-size-xs",
        "--ngs-line-height-base",
        "--ngs-radio-card-border-radius",
        "--ngs-radio-card-group-gap",
        "--ngs-radio-card-padding",
        "--ngs-radio-card-title-gap",
        "--ngs-radius-current",
        "--ngs-radius-lg",
        "--ngs-radius-md",
        "--ngs-radius-sm",
        "--ngs-state-focus-ring",
        "--ngs-stepper-content-padding",
        "--ngs-tab-label-height",
        "--ngs-tree-node-gap",
        "--ngs-upload-area-border",
        "--ngs-upload-area-border-radius",
        "--ngs-upload-area-drop-active-border",
        "--ngs-upload-area-padding"
      ],
      "example": null
    },
    {
      "name": "form-field",
      "title": "Form Field",
      "overviewName": "Form Field",
      "category": null,
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/form-field",
      "publicApi": "projects/components/form-field/public-api.ts",
      "sourceRoot": "projects/components/form-field/src",
      "docsPath": null,
      "docsOverviewSource": null,
      "purpose": "Wrap one form control with the standard NgStarter field layout, label, hint, error, and prefix/suffix slots.",
      "useWhen": "Use one ngs-form-field around one form control: input ngsInput, textarea ngsInput, ngs-select, ngs-autocomplete input, datepicker input, CountrySelect, CurrencySelect, DateFormatSelect, PhoneInput, NumberInput, and custom controls that implement FormFieldControl. Use ngs-label for labels, ngs-hint for helper text, ngs-error for validation messages, and ngsIconPrefix/ngsIconButtonPrefix/ngsTextPrefix/ngsIconSuffix/ngsIconButtonSuffix/ngsTextSuffix for field adornments. For groups of fields, use TailwindCSS grid/flex/layout classes around multiple form fields; each individual control still gets its own ngs-form-field. Do not use ngs-form-field as a layout container, card, spacing wrapper, or wrapper around non-form UI. Do not wrap checkbox, radio, button, or toggle controls when they have their own label pattern.",
      "exampleTopics": [],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/form-field/preview.svg",
      "selectors": [
        "[ngsIconButtonPrefix]",
        "[ngsIconButtonSuffix]",
        "[ngsIconPrefix]",
        "[ngsIconSuffix]",
        "[ngsPrefix]",
        "[ngsSuffix]",
        "[ngsTextPrefix]",
        "[ngsTextSuffix]",
        "ngs-error",
        "ngs-form-field",
        "ngs-hint",
        "ngs-label"
      ],
      "exportedSymbols": [
        "Error",
        "FORM_FIELD",
        "FORM_FIELD_DEFAULT_OPTIONS",
        "FormField",
        "FormFieldControl",
        "FormFieldDefaultOptions",
        "Hint",
        "IconButtonPrefix",
        "IconButtonSuffix",
        "IconPrefix",
        "IconSuffix",
        "Label",
        "Prefix",
        "Suffix",
        "TextPrefix",
        "TextSuffix"
      ],
      "inputs": [
        "align",
        "sameHeightAsButton",
        "subscriptHiddenIfEmpty"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-button-height",
        "--ngs-field-bg",
        "--ngs-field-border-color",
        "--ngs-field-border-focus-color",
        "--ngs-field-border-width",
        "--ngs-field-color",
        "--ngs-field-container-height",
        "--ngs-field-disabled-bg",
        "--ngs-field-error-color",
        "--ngs-field-font-size",
        "--ngs-field-height",
        "--ngs-field-infix-padding-bottom",
        "--ngs-field-infix-padding-top",
        "--ngs-field-input-height",
        "--ngs-field-label-color",
        "--ngs-field-label-float-font-size",
        "--ngs-field-line-height",
        "--ngs-field-no-label-padding-y",
        "--ngs-field-padding-x",
        "--ngs-field-radius",
        "--ngs-form-field-affix-gap",
        "--ngs-form-field-bg",
        "--ngs-form-field-border-color",
        "--ngs-form-field-border-radius",
        "--ngs-form-field-border-width",
        "--ngs-form-field-color",
        "--ngs-form-field-container-min-height",
        "--ngs-form-field-disabled-bg",
        "--ngs-form-field-error-color",
        "--ngs-form-field-icon-affix-padding-x",
        "--ngs-form-field-icon-button-affix-padding-x",
        "--ngs-form-field-infix-padding-bottom",
        "--ngs-form-field-infix-padding-top",
        "--ngs-form-field-input-height",
        "--ngs-form-field-input-text-align",
        "--ngs-form-field-label-color",
        "--ngs-form-field-no-label-padding-y",
        "--ngs-form-field-padding-x",
        "--ngs-form-field-width",
        "--ngs-state-disabled-bg",
        "--ngs-state-disabled-border",
        "--ngs-state-disabled-color"
      ],
      "example": null
    },
    {
      "name": "gauge",
      "title": "Gauge",
      "overviewName": "Gauge",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/gauge",
      "publicApi": "projects/components/gauge/public-api.ts",
      "sourceRoot": "projects/components/gauge/src",
      "docsPath": "/components/gauge",
      "docsOverviewSource": "projects/docs/src/app/components/gauge/overview/overview.html",
      "purpose": "Visualize one compact 0–100 percentage-like value as a circular radial metric.",
      "useWhen": "Use in dashboard cards, sidebar widgets, KPI panels, usage or quota blocks, storage usage, completion score, health score, capacity, and utilization indicators. Use ngs-gauge-value to show a number or short label inside the gauge, and customize size with Tailwind size classes or strokeWidth/radius. Do not use for linear process progress; use ProgressBar. Do not use for loading; use ProgressSpinner, BlockLoader, or Skeleton. Do not use for full analytical charts with axes, legends, multiple series, or trends. Do not use for small table-row statuses; use Badge or Status.",
      "exampleTopics": [
        "Basic Gauge",
        "Gauge With Value",
        "Gauge Custom Size",
        "Gauge Custom Stroke Width"
      ],
      "minimalExample": "<ngs-gauge [value]=\"50\"/>",
      "exampleFiles": [
        {
          "name": "basic-gauge-example",
          "title": "Basic gauge",
          "file": "projects/docs/src/app/components/gauge/_examples/basic-gauge-example/basic-gauge-example.html",
          "source": "<ngs-gauge [value]=\"50\"/>"
        },
        {
          "name": "gauge-custom-size-example",
          "title": "Gauge custom size",
          "file": "projects/docs/src/app/components/gauge/_examples/gauge-custom-size-example/gauge-custom-size-example.html",
          "source": "<div class=\"flex items-center gap-8\">\n  <ngs-gauge [value]=\"50\" class=\"size-10\"/>\n  <ngs-gauge [value]=\"75\" class=\"size-40\">\n    <ngs-gauge-value>75</ngs-gauge-value>\n  </ngs-gauge>\n  <ngs-gauge [value]=\"22\" class=\"size-32\">\n    <ngs-gauge-value>75</ngs-gauge-value>\n  </ngs-gauge>\n  <ngs-gauge [value]=\"50\" class=\"size-6\"/>\n</div>"
        },
        {
          "name": "gauge-custom-stroke-width-example",
          "title": "Gauge custom stroke width",
          "file": "projects/docs/src/app/components/gauge/_examples/gauge-custom-stroke-width-example/gauge-custom-stroke-width-example.html",
          "source": "<div class=\"flex items-center gap-8\">\n  <ngs-gauge [value]=\"50\" strokeWidth=\"2\"/>\n  <ngs-gauge [value]=\"50\" strokeWidth=\"4\"/>\n  <ngs-gauge [value]=\"50\" strokeWidth=\"8\"/>\n  <ngs-gauge [value]=\"50\" strokeWidth=\"24\" radius=\"48\"/>\n</div>"
        }
      ],
      "previewAsset": "projects/components/gauge/preview.svg",
      "selectors": [
        "ngs-gauge",
        "ngs-gauge-value"
      ],
      "exportedSymbols": [
        "Gauge",
        "GaugeValue"
      ],
      "inputs": [
        "radius",
        "strokeWidth",
        "value"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-neutral-300",
        "--ngs-color-neutral-600",
        "--ngs-color-neutral-700",
        "--ngs-color-primary",
        "--ngs-gauge-bg",
        "--ngs-gauge-fill",
        "--ngs-gauge-size",
        "--ngs-gauge-value-color"
      ],
      "example": null
    },
    {
      "name": "grid",
      "title": "Grid",
      "overviewName": "Grid",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/grid",
      "publicApi": "projects/components/grid/public-api.ts",
      "sourceRoot": "projects/components/grid/src",
      "docsPath": "/components/grid",
      "docsOverviewSource": "projects/docs/src/app/components/grid/overview/overview.html",
      "purpose": "Render static dashboard widgets in a predefined 12-column layout.",
      "useWhen": "Use ngs-grid when the application defines a static dashboard or widget layout and users do not need to rearrange, customize, or save the dashboard order. Provide configs that map item types to components and items with id, type, columns, optional responsive columnsSm/columnsMd/columnsLg/columnsXl, height, optional responsive heightSm/heightMd/heightLg/heightXl, content, skeletonHeight, and children. Widgets can inject GRID and call markItemAsLoaded(id), especially with waitWhenAllItemsLoaded. Use Grid for fixed analytics sections, portal start pages, and nested dashboard sections where the structure is known. Do not use Grid as a normal CSS layout helper for forms, pages, cards, or repeated elements; use TailwindCSS grid/flex classes. Do not use Grid for dashboards users can rearrange or change; use Tiles. Do not use for tables or datasets; use Table or DataView. Do not use for file/media grids; use upload/media components.",
      "exampleTopics": [],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/grid/preview.svg",
      "selectors": [
        "ngs-grid"
      ],
      "exportedSymbols": [
        "Grid",
        "GRID",
        "GridItem",
        "GridItemAware",
        "GridItemConfig"
      ],
      "inputs": [
        "configs",
        "items",
        "plain",
        "waitWhenAllItemsLoaded"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-border",
        "--ngs-grid-gap",
        "--ngs-grid-item-colspan",
        "--ngs-grid-item-colspan-lg",
        "--ngs-grid-item-colspan-md",
        "--ngs-grid-item-colspan-sm",
        "--ngs-grid-item-colspan-xl",
        "--ngs-grid-item-effective-colspan",
        "--ngs-grid-item-effective-height",
        "--ngs-grid-item-height",
        "--ngs-grid-item-height-lg",
        "--ngs-grid-item-height-md",
        "--ngs-grid-item-height-sm",
        "--ngs-grid-item-height-xl",
        "--ngs-grid-item-skeleton-min-height",
        "--ngs-radius-xl"
      ],
      "example": null
    },
    {
      "name": "guided-tour",
      "title": "Guided Tour",
      "overviewName": "Guided Tour",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/guided-tour",
      "publicApi": "projects/components/guided-tour/public-api.ts",
      "sourceRoot": "projects/components/guided-tour/src",
      "docsPath": "/components/guided-tour",
      "docsOverviewSource": "projects/docs/src/app/components/guided-tour/overview/overview.html",
      "purpose": "Guide users through the real UI with ordered steps attached to existing elements.",
      "useWhen": "Use for first-run onboarding, feature discovery, setup guidance, new feature education, and complex screen walkthroughs where each step points at a real element through ngsTourAnchor, a selector, or an element callback. Use withBackdrop to highlight the current element, waitFor for dynamic content, route for tours that continue across pages, and template/htmlContent for richer step content. Do not use for simple hover hints; use Tooltip. Do not use for anchored menus or arbitrary floating content; use Popover. Do not use for confirmations or modal workflows; use Confirm or Dialog. Do not use for form wizards or multi-step data entry; use Stepper or HeadlessStepper. Do not use for documentation pages or marketing onboarding screens; use normal page content.",
      "exampleTopics": [
        "Basic Guided Tour",
        "Backdrop Guided Tour",
        "Wait For Guided Tour",
        "Close On Backdrop Click",
        "HTML and Template Support",
        "Custom Buttons",
        "Global Configuration",
        "Keyboard Navigation",
        "Positioning",
        "Route Navigation",
        "Template guided tour",
        "Custom buttons guided tour",
        "Global config guided tour",
        "Keyboard navigation guided tour",
        "Positioning guided tour",
        "Route navigation guided tour"
      ],
      "minimalExample": "<div class=\"flex flex-col gap-4 p-4\">\n  <button ngsButton=\"filled\" (click)=\"startTour()\" class=\"w-fit\">Start Tour</button>\n  <div class=\"flex gap-4\">\n    <div ngsTourAnchor=\"step1\" class=\"p-4 border border-muted rounded-xl shadow-sm bg-surface text-on-surface\">\n      Step 1 Anchor\n    </div>\n    <div ngsTourAnchor=\"step2\" class=\"p-4 border border-muted rounded-xl shadow-sm bg-surface text-on-surface\">\n      Step 2 Anchor\n    </div>\n    <div ngsTourAnchor=\"step3\" class=\"p-4 border border-muted rounded-xl shadow-sm bg-surface text-on-surface\">\n      Step 3 Anchor\n    </div>\n    <div class=\"dynamic-anchor p-4 border border-muted rounded-xl shadow-sm bg-surface text-on-surface\">\n      Dynamic Anchor (No Directive)\n    </div>\n  </div>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-guided-tour-example",
          "title": "Basic guided tour",
          "file": "projects/docs/src/app/components/guided-tour/_examples/basic-guided-tour-example/basic-guided-tour-example.html",
          "source": "<div class=\"flex flex-col gap-4 p-4\">\n  <button ngsButton=\"filled\" (click)=\"startTour()\" class=\"w-fit\">Start Tour</button>\n  <div class=\"flex gap-4\">\n    <div ngsTourAnchor=\"step1\" class=\"p-4 border border-muted rounded-xl shadow-sm bg-surface text-on-surface\">\n      Step 1 Anchor\n    </div>\n    <div ngsTourAnchor=\"step2\" class=\"p-4 border border-muted rounded-xl shadow-sm bg-surface text-on-surface\">\n      Step 2 Anchor\n    </div>\n    <div ngsTourAnchor=\"step3\" class=\"p-4 border border-muted rounded-xl shadow-sm bg-surface text-on-surface\">\n      Step 3 Anchor\n    </div>\n    <div class=\"dynamic-anchor p-4 border border-muted rounded-xl shadow-sm bg-surface text-on-surface\">\n      Dynamic Anchor (No Directive)\n    </div>\n  </div>\n</div>"
        },
        {
          "name": "backdrop-guided-tour-example",
          "title": "Backdrop guided tour",
          "file": "projects/docs/src/app/components/guided-tour/_examples/backdrop-guided-tour-example/backdrop-guided-tour-example.html",
          "source": "<div class=\"flex flex-col gap-8 p-4 bg-background border rounded-xl relative overflow-hidden min-h-[1200px]\">\n  <div>\n    <button ngsButton=\"filled\" (click)=\"startTour()\" class=\"w-fit\">Start Backdrop Tour</button>\n  </div>\n  <!-- Level 1: Root level block -->\n  <div ngsTourAnchor=\"level1\" class=\"p-6 border-2 border-primary border-dashed rounded-lg bg-primary/5 text-primary text-center\">\n    Level 1: Root Block\n    <div class=\"mt-2\">\n      <button ngsButton=\"outlined\" size=\"sm\" (click)=\"onLevel1Click()\">Click me!</button>\n    </div>\n  </div>\n  <!-- Level 2: Nested block -->\n  <div class=\"p-8 bg-secondary/10 border border-secondary rounded-2xl\">\n    <div class=\"mb-4 text-sm font-medium text-secondary\">Container Level 2</div>\n    <div ngsTourAnchor=\"level2\" class=\"p-4 border-2 border-secondary border-dashed rounded-lg bg-surface text-secondary text-center\">\n      Level 2: Nested Block\n      <div class=\"mt-2\">\n        <input type=\"checkbox\" id=\"check2\"> <label for=\"check2\">Selectable text</label>\n      </div>\n    </div>\n  </div>\n  <!-- Level 3: Deeply nested and positioned block -->\n  <div class=\"mt-[600px] relative h-32 bg-muted/20 rounded-xl p-4\">\n    <div class=\"text-xs text-muted-foreground\">Relative Container (Scrolled down)</div>\n    <div class=\"absolute bottom-4 right-4 p-4 bg-error/10 border border-error rounded-xl\">\n      <div ngsTourAnchor=\"level3\" class=\"px-4 py-2 border-2 border-error border-dashed rounded-lg bg-surface text-error text-center\">\n        Level 3: Absolute Block\n      </div>\n    </div>\n  </div>\n</div>"
        },
        {
          "name": "close-on-backdrop-click-example",
          "title": "Close on backdrop click",
          "file": "projects/docs/src/app/components/guided-tour/_examples/close-on-backdrop-click-example/close-on-backdrop-click-example.html",
          "source": "<div class=\"flex flex-col gap-4\">\n  <div class=\"flex gap-4\">\n    <button ngsButton=\"filled\" (click)=\"startTour()\">Start Tour (Close on Backdrop Click)</button>\n  </div>\n  <div class=\"flex gap-10 mt-10\">\n    <div id=\"close-step1\" class=\"p-4 border rounded\">Step 1</div>\n    <div id=\"close-step2\" class=\"p-4 border rounded\">Step 2</div>\n  </div>\n</div>"
        }
      ],
      "previewAsset": "projects/components/guided-tour/preview.svg",
      "selectors": [
        "[ngsTourAnchor]",
        "ngs-tour-backdrop",
        "ngs-tour-step"
      ],
      "exportedSymbols": [
        "provideTourConfig",
        "TOUR_CONFIG",
        "TOUR_STEP_COMPONENT",
        "TourAnchorDirective",
        "TourBackdrop",
        "TourConfig",
        "TourService",
        "TourState",
        "TourStep",
        "TourStepConfig",
        "TourStepPosition"
      ],
      "inputs": [
        "animateEnterClass",
        "animateLeaveClass",
        "isFirst",
        "isLast",
        "ngsTourAnchor",
        "position",
        "step"
      ],
      "outputs": [
        "backdropClick"
      ],
      "cssTokens": [
        "--ngs-button-height",
        "--ngs-button-padding",
        "--ngs-color-primary",
        "--ngs-color-subtle",
        "--ngs-color-surface-container-lowest",
        "--ngs-guided-tour-arrow-border-color",
        "--ngs-guided-tour-step-bg",
        "--ngs-guided-tour-step-border",
        "--ngs-guided-tour-step-max-width",
        "--ngs-guided-tour-step-radius",
        "--ngs-guided-tour-step-shadow",
        "--ngs-guided-tour-step-step-padding",
        "--ngs-overlay-backdrop-bg",
        "--ngs-radius-xl",
        "--ngs-shadow-lg"
      ],
      "example": null
    },
    {
      "name": "headless-stepper",
      "title": "Headless Stepper",
      "overviewName": "Headless Stepper",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/headless-stepper",
      "publicApi": "projects/components/headless-stepper/public-api.ts",
      "sourceRoot": "projects/components/headless-stepper/src",
      "docsPath": "/components/headless-stepper",
      "docsOverviewSource": "projects/docs/src/app/components/headless-stepper/overview/overview.html",
      "purpose": "Provide stepper state and validation logic without rendering a fixed visual stepper UI.",
      "useWhen": "Use for custom multi-step workflows where the product needs its own header, progress indicator, buttons, layout, or responsive presentation while keeping standard NgStarter step behavior. Use ngs-headless-stepper with ngs-headless-step when you need selectedIndex, selected step state, progressPercent, canMoveNext, next(), previous(), reset(), linear mode, optional steps, and stepControl validation. Good for custom wizards, onboarding forms, checkout flows, setup flows, and complex forms with a bespoke layout. Do not use when the standard visual Stepper fits; use Stepper. Do not use for guided tours over existing UI; use GuidedTour. Do not use as Tabs, Accordion, or for a simple single-page form without steps.",
      "exampleTopics": [
        "Basic Headless Stepper",
        "Linear Headless Stepper"
      ],
      "minimalExample": "<ngs-headless-stepper #stepper [(selectedIndex)]=\"selectedIndex\">\n  <div class=\"mb-5 flex flex-col gap-4\">\n    <div class=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\">\n      <div>\n        <p class=\"text-sm text-neutral-600\">Step {{ stepper.selectedIndex() + 1 }} of {{ stepper.stepsCount() }}</p>\n        <h4 class=\"mt-1 text-base font-semibold\">{{ steps[selectedIndex()].title }}</h4>\n        <p class=\"mt-1 text-sm text-neutral-600\">{{ steps[selectedIndex()].description }}</p>\n      </div>\n      <div class=\"flex flex-wrap gap-2\">\n        @for (item of steps; track item.title; let index = $index) {\n          <button\n            ngsButton=\"tonal\"\n            type=\"button\"\n            [class.headless-stepper-example-active]=\"selectedIndex() === index\"\n            (click)=\"stepper.selectedIndex.set(index)\">\n            {{ index + 1 }}\n          </button>\n        }\n      </div>\n    </div>\n    <ngs-progress-bar mode=\"determinate\" [value]=\"stepper.progressPercent()\"/>\n  </div>\n  <ngs-headless-step>\n    <ngs-card>\n      <ngs-card-content>\n        <h5 class=\"text-base font-semibold\">Workspace details</h5>\n        <p class=\"mt-2 text-sm text-neutral-600\">\n          Pick a workspace name, region, and owner. This example keeps the content simple while the stepper owns the\n          active step state.\n        </p>\n      </ngs-card-content>\n    </ngs-card>\n  </ngs-headless-step>\n  <ngs-headless-step>\n    <ngs-card>\n      <ngs-card-content>\n        <h5 class=\"text-base font-semibold\">Team access</h5>\n        <p class=\"mt-2 text-sm text-neutral-600\">\n          Show a c\n...",
      "exampleFiles": [
        {
          "name": "basic-headless-stepper-example",
          "title": "Basic headless stepper",
          "file": "projects/docs/src/app/components/headless-stepper/_examples/basic-headless-stepper-example/basic-headless-stepper-example.html",
          "source": "<ngs-headless-stepper #stepper [(selectedIndex)]=\"selectedIndex\">\n  <div class=\"mb-5 flex flex-col gap-4\">\n    <div class=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\">\n      <div>\n        <p class=\"text-sm text-neutral-600\">Step {{ stepper.selectedIndex() + 1 }} of {{ stepper.stepsCount() }}</p>\n        <h4 class=\"mt-1 text-base font-semibold\">{{ steps[selectedIndex()].title }}</h4>\n        <p class=\"mt-1 text-sm text-neutral-600\">{{ steps[selectedIndex()].description }}</p>\n      </div>\n      <div class=\"flex flex-wrap gap-2\">\n        @for (item of steps; track item.title; let index = $index) {\n          <button\n            ngsButton=\"tonal\"\n            type=\"button\"\n            [class.headless-stepper-example-active]=\"selectedIndex() === index\"\n            (click)=\"stepper.selectedIndex.set(index)\">\n            {{ index + 1 }}\n          </button>\n        }\n      </div>\n    </div>\n    <ngs-progress-bar mode=\"determinate\" [value]=\"stepper.progressPercent()\"/>\n  </div>\n  <ngs-headless-step>\n    <ngs-card>\n      <ngs-card-content>\n        <h5 class=\"text-base font-semibold\">Workspace details</h5>\n        <p class=\"mt-2 text-sm text-neutral-600\">\n          Pick a workspace name, region, and owner. This example keeps the content simple while the stepper owns the\n          active step state.\n        </p>\n      </ngs-card-content>\n    </ngs-card>\n  </ngs-headless-step>\n  <ngs-headless-step>\n    <ngs-card>\n      <ngs-card-content>\n        <h5 class=\"text-base font-semibold\">Team access</h5>\n        <p class=\"mt-2 text-sm text-neutral-600\">\n          Show a c\n..."
        },
        {
          "name": "linear-headless-stepper-example",
          "title": "Linear headless stepper",
          "file": "projects/docs/src/app/components/headless-stepper/_examples/linear-headless-stepper-example/linear-headless-stepper-example.html",
          "source": "<ngs-headless-stepper #stepper linear>\n  <div class=\"mb-5\">\n    <div class=\"flex items-center justify-between gap-4\">\n      <div>\n        <p class=\"text-sm text-neutral-600\">Linear setup</p>\n        <h4 class=\"mt-1 text-base font-semibold\">Step {{ stepper.selectedIndex() + 1 }} of {{ stepper.stepsCount() }}</h4>\n      </div>\n      <p class=\"text-sm text-neutral-600\">{{ stepper.progressPercent() | number: '1.0-0' }}%</p>\n    </div>\n    <ngs-progress-bar class=\"mt-4\" mode=\"determinate\" [value]=\"stepper.progressPercent()\"/>\n  </div>\n  <ngs-headless-step [stepControl]=\"accountForm\">\n    <form [formGroup]=\"accountForm\" class=\"flex flex-col gap-4\">\n      <ngs-form-field>\n        <ngs-label>Company</ngs-label>\n        <input ngsInput formControlName=\"company\" placeholder=\"Acme Operations\" required>\n      </ngs-form-field>\n      <p class=\"text-sm text-neutral-600\">\n        The next button becomes available when this form group is valid.\n      </p>\n    </form>\n  </ngs-headless-step>\n  <ngs-headless-step [stepControl]=\"billingForm\">\n    <form [formGroup]=\"billingForm\" class=\"flex flex-col gap-4\">\n      <ngs-form-field>\n        <ngs-label>Billing email</ngs-label>\n        <input ngsInput formControlName=\"email\" placeholder=\"billing@example.com\" required>\n      </ngs-form-field>\n      <p class=\"text-sm text-neutral-600\">\n        Headless Stepper tracks the connected control status and uses it for linear navigation.\n      </p>\n    </form>\n  </ngs-headless-step>\n  <ngs-headless-step optional>\n    <div class=\"rounded-lg border border-muted p-5\">\n      <h5 class=\"text-base font-semibold\">O\n..."
        }
      ],
      "previewAsset": "projects/components/headless-stepper/preview.svg",
      "selectors": [
        "ngs-headless-step",
        "ngs-headless-stepper"
      ],
      "exportedSymbols": [
        "HeadlessStep",
        "HeadlessStepper",
        "StepperSelectionEvent"
      ],
      "inputs": [
        "linear",
        "optional",
        "selectedIndex",
        "stepControl"
      ],
      "outputs": [],
      "cssTokens": [],
      "example": null
    },
    {
      "name": "icon",
      "title": "Icon",
      "overviewName": "Icon",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/icon",
      "publicApi": "projects/components/icon/public-api.ts",
      "sourceRoot": "projects/components/icon/src",
      "docsPath": "/components/icon",
      "docsOverviewSource": "projects/docs/src/app/components/icon/overview/overview.html",
      "purpose": "Render consistent SVG interface icons from installed Iconify icon sets.",
      "useWhen": "Use ngs-icon with a full Iconify name such as fluent:grid-24-regular or circle-flags:us for icons in NgStarter buttons, navigation, menus, form field prefixes and suffixes, statuses, metadata, empty states, alerts, announcements, table actions, toolbar actions, and compact flag markers. Size icons with Tailwind classes such as size-4, w-5, or h-5, or use the default --ngs-icon-size. Color icons with text color classes or --ngs-icon-color. Do not use ngs-icon as a clickable action by itself; wrap it in an NgStarter button such as button[ngsIconButton]. Do not use Icon for people or entities; use Avatar. Do not use Icon for counters or small labels; use Badge. Do not use Icon for large artwork, product illustrations, screenshots, or logos. Do not hand-roll inline SVG when an approved Iconify icon exists.",
      "exampleTopics": [
        "Symbols Icons (Default)",
        "Phosphor Icons",
        "Circle Flags Icons",
        "Material symbols icons",
        "Circle flags"
      ],
      "minimalExample": "<div class=\"flex gap-4\">\n  <ngs-icon name=\"circle-flags:us\"/>\n  <ngs-icon name=\"circle-flags:ge\"/>\n  <ngs-icon name=\"circle-flags:de\"/>\n</div>\n<div class=\"mt-8 flex gap-4 items-center\">\n  <ngs-icon name=\"circle-flags:us\" class=\"size-4\"/>\n  <ngs-icon name=\"circle-flags:ge\" class=\"size-10\"/>\n  <ngs-icon name=\"circle-flags:de\" class=\"size-16\"/>\n</div>",
      "exampleFiles": [
        {
          "name": "circle-flags-example",
          "title": "Circle flags",
          "file": "projects/docs/src/app/components/icon/_examples/circle-flags-example/circle-flags-example.html",
          "source": "<div class=\"flex gap-4\">\n  <ngs-icon name=\"circle-flags:us\"/>\n  <ngs-icon name=\"circle-flags:ge\"/>\n  <ngs-icon name=\"circle-flags:de\"/>\n</div>\n<div class=\"mt-8 flex gap-4 items-center\">\n  <ngs-icon name=\"circle-flags:us\" class=\"size-4\"/>\n  <ngs-icon name=\"circle-flags:ge\" class=\"size-10\"/>\n  <ngs-icon name=\"circle-flags:de\" class=\"size-16\"/>\n</div>"
        },
        {
          "name": "material-symbols-icons-example",
          "title": "Material symbols icons",
          "file": "projects/docs/src/app/components/icon/_examples/material-symbols-icons-example/material-symbols-icons-example.html",
          "source": "<div class=\"flex gap-4\">\n  <ngs-icon name=\"fluent:person-24-regular\"/>\n  <ngs-icon name=\"fluent:person-24-regular\"/>\n  <ngs-icon name=\"fluent:grid-24-regular\"/>\n  <ngs-icon name=\"fluent:grid-24-regular\"/>\n  <ngs-icon name=\"fluent:weather-moon-24-regular\"/>\n  <ngs-icon name=\"fluent:weather-moon-24-regular\"/>\n  <ngs-icon name=\"fluent:weather-sunny-24-regular\"/>\n  <ngs-icon name=\"fluent:weather-sunny-24-regular\"/>\n</div>"
        },
        {
          "name": "phosphor-icons-example",
          "title": "Phosphor icons",
          "file": "projects/docs/src/app/components/icon/_examples/phosphor-icons-example/phosphor-icons-example.html",
          "source": "<div class=\"flex gap-4\">\n  <ngs-icon name=\"fluent:book-contacts-24-regular\"/>\n  <ngs-icon name=\"fluent:book-contacts-24-regular\"/>\n  <ngs-icon name=\"fluent:book-contacts-24-regular\"/>\n  <ngs-icon name=\"fluent:book-contacts-24-regular\"/>\n  <ngs-icon name=\"fluent:book-contacts-24-regular\"/>\n  <ngs-icon name=\"fluent:book-contacts-24-filled\"/>\n</div>"
        }
      ],
      "previewAsset": "projects/components/icon/preview.svg",
      "selectors": [
        "ngs-icon"
      ],
      "exportedSymbols": [
        "Icon",
        "IconData",
        "IconRegistry"
      ],
      "inputs": [
        "name"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-icon-color",
        "--ngs-icon-size"
      ],
      "example": null
    },
    {
      "name": "image-designer",
      "title": "Image Designer",
      "overviewName": "Image Designer",
      "category": "libraries",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/image-designer",
      "publicApi": "projects/components/image-designer/public-api.ts",
      "sourceRoot": "projects/components/image-designer/src",
      "docsPath": "/libraries/image-designer",
      "docsOverviewSource": "projects/docs/src/app/libraries/image-designer/overview/overview.html",
      "purpose": "Provide a full canvas-based image composition editor with layers, assets, text, backgrounds, effects, and snapshots.",
      "useWhen": "Use when users need to create or customize an image by composing multiple layers such as text, photos, uploaded assets, shapes, patterns, gradients, backgrounds, effects, opacity, typography, fit, flip, lock, and resize presets. Use for banner designers, social image builders, thumbnail editors, promo card creators, template-based creative tools, and embedded product design studios. Persist and restore work with ImageDesignerSnapshot, provide asset libraries with assetsDataSource or photosDataSource, handle uploads with uploadFn, and listen to snapshotChanged. Do not use for simple image viewing; use ImageViewer. Do not use for zoom/pan inspection; use ImageZoomViewer. Do not use for crop-only work; use Crop. Do not use for resize-only flows; use ImageResizer. Do not use for loading or missing-image placeholders; use ImagePlaceholder. Do not use for plain upload previews, color picking, or simple avatar/banner settings; use the smaller dedicated components or a normal form.",
      "exampleTopics": [
        "Visual Builder",
        "Image Designer"
      ],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/image-designer/preview.svg",
      "selectors": [
        "ngs-effects",
        "ngs-image-designer",
        "ngs-settings"
      ],
      "exportedSymbols": [
        "AssetsDataSource",
        "AssetsGetRowsParams",
        "createDefaultPhotosDataSource",
        "Effects",
        "ElementConfig",
        "GradientConfig",
        "IMAGE_DESIGNER",
        "ImageDesigner",
        "ImageDesignerPhoto",
        "ImageDesignerService",
        "ImageDesignerSnapshot",
        "ImageDesignerUploadFn",
        "ImagePreset",
        "ImagePresetCategory",
        "ImageSize",
        "LayerConfig",
        "PhotosDataSource",
        "PhotosGetRowsParams",
        "PicsumImage",
        "PRESET_CATEGORIES",
        "Settings",
        "SVG_ELEMENTS",
        "SVG_PATTERNS"
      ],
      "inputs": [
        "assetsDataSource",
        "defaultFont",
        "guidelineColor",
        "historyLimit",
        "imageSize",
        "maxScale",
        "minScale",
        "photosDataSource",
        "scale",
        "showDownloadButton",
        "showGuidelines",
        "snapRange",
        "snapshot",
        "snapToShapes",
        "snapToStageBorders",
        "snapToStageCenter",
        "title",
        "uploadFn"
      ],
      "outputs": [
        "snapshotChanged"
      ],
      "cssTokens": [
        "--ngs-color-picker-thumbnail-bg",
        "--ngs-list-item-radius",
        "--ngs-list-padding",
        "--ngs-slider-thumb-size",
        "--ngs-slider-track-height",
        "--ngs-tab-label-padding",
        "--ngs-tab-panel-aside-width",
        "--ngs-tab-panel-nav-padding"
      ],
      "example": null
    },
    {
      "name": "image-placeholder",
      "title": "Image Placeholder",
      "overviewName": "Image Placeholder",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/image-placeholder",
      "publicApi": "projects/components/image-placeholder/public-api.ts",
      "sourceRoot": "projects/components/image-placeholder/src",
      "docsPath": "/components/image-placeholder",
      "docsOverviewSource": "projects/docs/src/app/components/image-placeholder/overview/overview.html",
      "purpose": "Render a simple SVG placeholder inside an image slot when the real image is not available yet.",
      "useWhen": "Use for image cards, media grids, upload slots, attachment previews, product thumbnails, gallery cells, banner areas, and image preview areas when an image is loading, missing, unavailable, or failed to load and the layout should keep a stable size. Give ngs-image-placeholder an explicit width, height, or aspect ratio with Tailwind classes. The component does not load images, handle upload state, or manage errors; it only renders a visual placeholder. Do not use for full empty states; use EmptyState. Do not use for skeleton loading of a full block; use Skeleton. Do not use for spinners or blocking progress; use ProgressSpinner or BlockLoader. Do not use for viewing, crop, resize, or editing; use ImageViewer, Crop, ImageResizer, or ImageDesigner. Do not use for user or team identity fallback; use Avatar.",
      "exampleTopics": [
        "Basic image placeholder"
      ],
      "minimalExample": "<ngs-image-placeholder class=\"w-[300px] h-[200px]\"/>\n<ngs-image-placeholder class=\"w-[500px] h-[500px] mt-10\"/>",
      "exampleFiles": [
        {
          "name": "basic-image-placeholder-example",
          "title": "Basic image placeholder",
          "file": "projects/docs/src/app/components/image-placeholder/_examples/basic-image-placeholder-example/basic-image-placeholder-example.html",
          "source": "<ngs-image-placeholder class=\"w-[300px] h-[200px]\"/>\n<ngs-image-placeholder class=\"w-[500px] h-[500px] mt-10\"/>"
        }
      ],
      "previewAsset": "projects/components/image-placeholder/preview.svg",
      "selectors": [
        "ngs-image-placeholder"
      ],
      "exportedSymbols": [
        "ImagePlaceholder"
      ],
      "inputs": [],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-neutral-100",
        "--ngs-color-neutral-300",
        "--ngs-color-neutral-400",
        "--ngs-color-surface-container"
      ],
      "example": null
    },
    {
      "name": "image-resizer",
      "title": "Image Resizer",
      "overviewName": "Image Resizer",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/image-resizer",
      "publicApi": "projects/components/image-resizer/public-api.ts",
      "sourceRoot": "projects/components/image-resizer/src",
      "docsPath": "/components/image-resizer",
      "docsOverviewSource": "projects/docs/src/app/components/image-resizer/overview/overview.html",
      "purpose": "Let users interactively change the displayed width of an img element with side drag handles.",
      "useWhen": "Use ngs-image-resizer around a standard img marked with ngsImageResizerImage when users need to manually choose how large an image appears in an editor, content form, thumbnail preview, banner preview, or media preparation flow. Configure imageMinWidth and imageMaxWidth and listen to imageResized for rendered width, rendered height, naturalWidth, and naturalHeight. The component changes the displayed CSS width of the image; it does not crop, compress, upload, optimize, or rewrite the source file. Do not use for crop selection; use Crop. Do not use for zoom and pan inspection; use ImageZoomViewer. Do not use for simple viewing; use ImageViewer. Do not use for full canvas/layer editing; use ImageDesigner. Do not use for resizing panels or layout containers; use ResizableContainer. Do not use for backend image processing or placeholders.",
      "exampleTopics": [
        "Basic image resizer"
      ],
      "minimalExample": "<div #container class=\"w-[818px] min-h-[545px] flex items-center justify-center\">\n  <ngs-image-resizer (imageResized)=\"onImageResized($event)\" [imageMaxWidth]=\"818\">\n    <img src=\"assets/image/image.jpg\" alt=\"\" ngsImageResizerImage width=\"525\">\n  </ngs-image-resizer>\n</div>\n@if (imageDimensionsInfo()) {\n  <div class=\"mt-5\">{{ imageDimensionsInfo() | json }}</div>\n}",
      "exampleFiles": [
        {
          "name": "basic-image-resizer-example",
          "title": "Basic image resizer",
          "file": "projects/docs/src/app/components/image-resizer/_examples/basic-image-resizer-example/basic-image-resizer-example.html",
          "source": "<div #container class=\"w-[818px] min-h-[545px] flex items-center justify-center\">\n  <ngs-image-resizer (imageResized)=\"onImageResized($event)\" [imageMaxWidth]=\"818\">\n    <img src=\"assets/image/image.jpg\" alt=\"\" ngsImageResizerImage width=\"525\">\n  </ngs-image-resizer>\n</div>\n@if (imageDimensionsInfo()) {\n  <div class=\"mt-5\">{{ imageDimensionsInfo() | json }}</div>\n}"
        }
      ],
      "previewAsset": "projects/components/image-resizer/preview.svg",
      "selectors": [
        "[ngsImageResizeHandler]",
        "[ngsImageResizerImage]",
        "ngs-image-resizer"
      ],
      "exportedSymbols": [
        "ImageResizedEvent",
        "ImageResizeHandlerDirective",
        "ImageResizer",
        "ImageResizerImageDirective"
      ],
      "inputs": [
        "direction",
        "imageMaxWidth",
        "imageMinWidth",
        "maxWidth",
        "minWidth",
        "targetElement"
      ],
      "outputs": [
        "dimensionsChanged",
        "imageResized"
      ],
      "cssTokens": [
        "--ngs-color-on-secondary-fixed",
        "--ngs-color-white"
      ],
      "example": null
    },
    {
      "name": "image-viewer",
      "title": "Image Viewer",
      "overviewName": "Image Viewer",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/image-viewer",
      "publicApi": "projects/components/image-viewer/public-api.ts",
      "sourceRoot": "projects/components/image-viewer/src",
      "docsPath": "/components/image-viewer",
      "docsOverviewSource": "projects/docs/src/app/components/image-viewer/overview/overview.html",
      "purpose": "Open a full-size image in a focused lightbox-style overlay from a thumbnail, card, or gallery item.",
      "useWhen": "Use ngsImageViewer on a group and ngsImageViewerPicture on each clickable preview item when users should click a thumbnail or card to inspect a full-size image from sourceUrl. The overlay supports close, loading spinner, zoom in/out, drag and pan when zoomed, and optional title, caption, and description via inputs or templates. Use for galleries, attachment previews, product images, media detail previews, portfolio images, and image cards. Do not use for inline zoom inspection without an overlay; use ImageZoomViewer. Do not use for image editing, layers, crop, or resizing; use ImageDesigner, Crop, or ImageResizer. Do not use for before/after comparison; use ComparisonSlider. Do not use for static non-clickable images; use normal img. Do not use for video previews; use VideoViewer. Do not use for missing or loading placeholders; use ImagePlaceholder.",
      "exampleTopics": [
        "Basic image viewer",
        "Image viewer with caption and description",
        "Image viewer with title"
      ],
      "minimalExample": "<div ngsImageViewer class=\"flex items-start gap-7 flex-wrap \">\n  <div ngsImageViewerPicture\n       sourceUrl=\"https://lipsum.app/id/61/1600x900\"\n       class=\"size-32 flex items-center justify-center border border-muted  rounded p-2\">\n    <img src=\"https://lipsum.app/id/61/400x300\" alt=\"\" class=\"rounded bg-cover cursor-pointer\">\n  </div>\n  <div ngsImageViewerPicture sourceUrl=\"https://lipsum.app/id/3/1600x900\"\n       class=\"size-32 flex items-center justify-center border border-muted  rounded p-2\">\n    <img src=\"https://lipsum.app/id/3/400x300\" alt=\"\" class=\"rounded bg-cover cursor-pointer\">\n  </div>\n  <div ngsImageViewerPicture sourceUrl=\"https://lipsum.app/id/10/900x1600\"\n       class=\"size-32 rounded overflow-hidden flex items-center justify-center border border-muted  p-2\">\n    <img src=\"https://lipsum.app/id/10/300x400\" alt=\"\" class=\"rounded bg-cover max-h-full cursor-pointer\">\n  </div>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-image-viewer-example",
          "title": "Basic image viewer",
          "file": "projects/docs/src/app/components/image-viewer/_examples/basic-image-viewer-example/basic-image-viewer-example.html",
          "source": "<div ngsImageViewer class=\"flex items-start gap-7 flex-wrap \">\n  <div ngsImageViewerPicture\n       sourceUrl=\"https://lipsum.app/id/61/1600x900\"\n       class=\"size-32 flex items-center justify-center border border-muted  rounded p-2\">\n    <img src=\"https://lipsum.app/id/61/400x300\" alt=\"\" class=\"rounded bg-cover cursor-pointer\">\n  </div>\n  <div ngsImageViewerPicture sourceUrl=\"https://lipsum.app/id/3/1600x900\"\n       class=\"size-32 flex items-center justify-center border border-muted  rounded p-2\">\n    <img src=\"https://lipsum.app/id/3/400x300\" alt=\"\" class=\"rounded bg-cover cursor-pointer\">\n  </div>\n  <div ngsImageViewerPicture sourceUrl=\"https://lipsum.app/id/10/900x1600\"\n       class=\"size-32 rounded overflow-hidden flex items-center justify-center border border-muted  p-2\">\n    <img src=\"https://lipsum.app/id/10/300x400\" alt=\"\" class=\"rounded bg-cover max-h-full cursor-pointer\">\n  </div>\n</div>"
        },
        {
          "name": "image-viewer-with-caption-and-description-example",
          "title": "Image viewer with caption and description",
          "file": "projects/docs/src/app/components/image-viewer/_examples/image-viewer-with-caption-and-description-example/image-viewer-with-caption-and-description-example.html",
          "source": "<div ngsImageViewer class=\"flex items-start gap-7 flex-wrap \">\n  <div ngsImageViewerPicture\n       sourceUrl=\"https://lipsum.app/id/50/1600x900\"\n       class=\"size-32 flex items-center justify-center border border-muted  p-2 rounded\">\n    <img src=\"https://lipsum.app/id/50/400x300\" alt=\"\" class=\"rounded bg-cover cursor-pointer\">\n    <ng-template ngsImageViewerPictureCaption>Just Caption</ng-template>\n    <ng-template ngsImageViewerPictureDescription>\n      Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n    </ng-template>\n  </div>\n  <div ngsImageViewerPicture sourceUrl=\"https://lipsum.app/id/51/1600x900\"\n       class=\"size-32 flex items-center justify-center border border-muted  p-2 rounded\">\n    <img src=\"https://lipsum.app/id/51/400x300\" alt=\"\" class=\"rounded bg-cover cursor-pointer\">\n    <ng-template ngsImageViewerPictureCaption>Awesome Picture</ng-template>\n    <ng-template ngsImageViewerPictureDescription>\n      Advancing to the 1960s, Lorem Ipsum was made popular by typeface manufacturer Letraset,\n      who used it in their advertising campaigns. Letraset offered pages of Lorem Ipsum as rub down\n      transfer sheets, which were widely used in the pre-computer era for layouts.\n      These transfer pages, known as Letraset Body Type, were featured in the company's advertising and their popular catalogue.\n    </ng-template>\n  </div>\n  <div ngsImageViewerPicture sourceUrl=\"https://lipsum.app/id/53/900x1600\"\n       class=\"size-32 flex items-center justify-center border border-muted  p-2 rounded overflow-hidden\">\n    <\n..."
        },
        {
          "name": "image-viewer-with-title-example",
          "title": "Image viewer with title",
          "file": "projects/docs/src/app/components/image-viewer/_examples/image-viewer-with-title-example/image-viewer-with-title-example.html",
          "source": "<div ngsImageViewer class=\"flex items-start gap-7 flex-wrap \">\n  <div ngsImageViewerPicture\n       sourceUrl=\"https://lipsum.app/id/40/1600x900\"\n       class=\"size-32 flex items-center justify-center border border-muted  p-2 rounded\">\n    <img src=\"https://lipsum.app/id/40/400x300\" alt=\"\" class=\"rounded bg-cover cursor-pointer\">\n    <ng-template ngsImageViewerPictureTitle>Just Title</ng-template>\n  </div>\n  <div ngsImageViewerPicture sourceUrl=\"https://lipsum.app/id/41/1600x900\"\n       class=\"size-32 flex items-center justify-center border border-muted  p-2 rounded\">\n    <img src=\"https://lipsum.app/id/41/400x300\" alt=\"\" class=\"rounded bg-cover cursor-pointer\">\n    <ng-template ngsImageViewerPictureTitle>Author: Pavel Salauyou</ng-template>\n    <ng-template ngsImageViewerPictureCaption>Awesome Picture</ng-template>\n    <ng-template ngsImageViewerPictureDescription>\n      Advancing to the 1960s, Lorem Ipsum was made popular by typeface manufacturer Letraset,\n      who used it in their advertising campaigns. Letraset offered pages of Lorem Ipsum as rub down\n      transfer sheets, which were widely used in the pre-computer era for layouts.\n      These transfer pages, known as Letraset Body Type, were featured in the company's advertising and their popular catalogue.\n    </ng-template>\n  </div>\n  <div ngsImageViewerPicture sourceUrl=\"https://lipsum.app/id/42/900x1600\"\n       class=\"size-32 flex items-center justify-center overflow-hidden border border-muted  p-2 rounded\">\n    <img src=\"https://lipsum.app/id/42/300x400\" alt=\"\" class=\"rounded bg-cover max-h-full cursor-pointer\">\n..."
        }
      ],
      "previewAsset": "projects/components/image-viewer/preview.svg",
      "selectors": [
        "[ngsImageViewer]",
        "[ngsImageViewerPicture]",
        "[ngsImageViewerPictureCaption]",
        "[ngsImageViewerPictureDescription]",
        "[ngsImageViewerPictureTitle]",
        "ngs-image-viewer"
      ],
      "exportedSymbols": [
        "IMAGE_VIEWER",
        "IMAGE_VIEWER_PICTURE_DATA",
        "IMAGE_VIEWER_PICTURE_REF",
        "ImageViewer",
        "ImageViewerDirective",
        "ImageViewerPictureCaptionDirective",
        "ImageViewerPictureDescriptionDirective",
        "ImageViewerPictureDirective",
        "ImageViewerPictureTitleDirective",
        "PictureOptions",
        "PictureRef"
      ],
      "inputs": [
        "caption",
        "description",
        "sourceUrl",
        "title"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-neutral-100",
        "--ngs-color-neutral-200",
        "--ngs-color-neutral-300",
        "--ngs-color-neutral-400",
        "--ngs-color-neutral-50",
        "--ngs-color-neutral-600",
        "--ngs-color-neutral-700",
        "--ngs-color-neutral-800",
        "--ngs-color-neutral-900",
        "--ngs-color-neutral-950",
        "--ngs-font-size-sm",
        "--ngs-image-viewer-picture-scale",
        "--ngs-shadow-sm"
      ],
      "example": null
    },
    {
      "name": "image-zoom-viewer",
      "title": "Image Zoom Viewer",
      "overviewName": "Image Zoom Viewer",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/image-zoom-viewer",
      "publicApi": "projects/components/image-zoom-viewer/public-api.ts",
      "sourceRoot": "projects/components/image-zoom-viewer/src",
      "docsPath": "/components/image-zoom-viewer",
      "docsOverviewSource": "projects/docs/src/app/components/image-zoom-viewer/overview/overview.html",
      "purpose": "Give an inline image a Medium-style click-to-zoom overlay animation from its current page position.",
      "useWhen": "Use ngs-image-zoom-viewer around a normal image marked with ngsImageZoomViewerImage when users should quickly enlarge one inline image without a gallery structure. Good for articles, product pages, portfolios, documentation screenshots, reports, and image-rich content. The component clones the same image into an overlay, animates it from the original position to a larger centered view, closes on backdrop click or Escape, and recalculates zoom on window resize. Do not use for thumbnail galleries that need full-size sourceUrl, title, caption, or description; use ImageViewer. Do not use for image editing, crop selection, displayed-width resizing, or before/after comparison; use ImageDesigner, Crop, ImageResizer, or ComparisonSlider. Do not use for plain static images or placeholders.",
      "exampleTopics": [
        "Basic image zoom viewer"
      ],
      "minimalExample": "<div class=\"example-container\">\n  <h3>Medium-style Image Zoom</h3>\n  <p>Click the image below to see it zoom to full screen.</p>\n  <ngs-image-zoom-viewer>\n    <img ngsImageZoomViewerImage\n         src=\"https://images.unsplash.com/photo-1441974231531-c6227db76b6e?ixlib=rb-4.0.3&auto=format&fit=crop&w=1000&q=80\"\n         alt=\"Forest\"\n         class=\"max-w-[400px]\"\n    />\n  </ngs-image-zoom-viewer>\n  <p>Another example with a different aspect ratio:</p>\n  <ngs-image-zoom-viewer>\n    <img ngsImageZoomViewerImage\n         src=\"https://images.unsplash.com/photo-1501785888041-af3ef285b470?ixlib=rb-4.0.3&auto=format&fit=crop&w=1000&q=80\"\n         alt=\"Lake\"\n         class=\"max-w-[400px]\"\n    />\n  </ngs-image-zoom-viewer>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-image-zoom-viewer-example",
          "title": "Basic image zoom viewer",
          "file": "projects/docs/src/app/components/image-zoom-viewer/_examples/basic-image-zoom-viewer-example/basic-image-zoom-viewer-example.html",
          "source": "<div class=\"example-container\">\n  <h3>Medium-style Image Zoom</h3>\n  <p>Click the image below to see it zoom to full screen.</p>\n  <ngs-image-zoom-viewer>\n    <img ngsImageZoomViewerImage\n         src=\"https://images.unsplash.com/photo-1441974231531-c6227db76b6e?ixlib=rb-4.0.3&auto=format&fit=crop&w=1000&q=80\"\n         alt=\"Forest\"\n         class=\"max-w-[400px]\"\n    />\n  </ngs-image-zoom-viewer>\n  <p>Another example with a different aspect ratio:</p>\n  <ngs-image-zoom-viewer>\n    <img ngsImageZoomViewerImage\n         src=\"https://images.unsplash.com/photo-1501785888041-af3ef285b470?ixlib=rb-4.0.3&auto=format&fit=crop&w=1000&q=80\"\n         alt=\"Lake\"\n         class=\"max-w-[400px]\"\n    />\n  </ngs-image-zoom-viewer>\n</div>"
        }
      ],
      "previewAsset": "projects/components/image-zoom-viewer/preview.svg",
      "selectors": [
        "[ngsImageZoomViewerImage]",
        "ngs-image-zoom-viewer",
        "ngs-image-zoom-viewer-style"
      ],
      "exportedSymbols": [
        "ImageZoomViewer",
        "ImageZoomViewerImage",
        "ImageZoomViewerStyle"
      ],
      "inputs": [],
      "outputs": [],
      "cssTokens": [
        "--ngs-overlay-backdrop-bg"
      ],
      "example": null
    },
    {
      "name": "incidents",
      "title": "Incidents",
      "overviewName": "Incidents",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/incidents",
      "publicApi": "projects/components/incidents/public-api.ts",
      "sourceRoot": "projects/components/incidents/src",
      "docsPath": "/components/incidents",
      "docsOverviewSource": "projects/docs/src/app/components/incidents/overview/overview.html",
      "purpose": "Show an application-level service incident or operational notice with a compact bar and expandable incident updates.",
      "useWhen": "Use for service outages, degraded service, maintenance windows, global system status, and important operational notices that users should see across the app or portal. Compose manually with ngs-incidents, ngs-incidents-bar, ngs-incidents-title, ngs-incidents-description, ngs-incidents-list, ngs-incident, ngs-incident-title, ngs-incident-details, ngsIncidentIcon, ngsIncidentButton, and ngsIncidentClose. For global dynamic incidents, place ngs-incidents-global near the app root and call IncidentsStore.show({ title, description, incidents }) or hide(). Do not use for local inline messages; use Alert. Do not use for user-required critical actions; use ActionRequired. Do not use for toast notifications, table row statuses, empty states, or full incident management/history pages; use notification components, Badge, Status, EmptyState, Table, or DataView.",
      "exampleTopics": [
        "Basic Incidents",
        "Show/Hide Dynamicly",
        "Incidents show hide dynamicly"
      ],
      "minimalExample": "<div class=\"h-[400px] overflow-hidden\">\n  <ngs-incidents>\n    <ngs-incidents-bar>\n      <ngs-incidents-title>Maintenance work on the DNS</ngs-incidents-title>\n      <ngs-incidents-description>Description</ngs-incidents-description>\n      <ngs-icon name=\"fluent:chevron-down-24-regular\" ngsIncidentsToggleIcon/>\n    </ngs-incidents-bar>\n    <ngs-incidents-list>\n      @for (incident of incidents; track incident) {\n        <ngs-incident>\n          <ngs-icon name=\"fluent:info-24-regular\" ngsIncidentIcon/>\n          <ngs-icon name=\"fluent:dismiss-24-regular\" ngsIncidentClose/>\n          <ngs-incident-title>{{ incident.title }}</ngs-incident-title>\n          <ngs-incident-details>{{ incident.details }}</ngs-incident-details>\n        </ngs-incident>\n      }\n    </ngs-incidents-list>\n  </ngs-incidents>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-incidents-example",
          "title": "Basic incidents",
          "file": "projects/docs/src/app/components/incidents/_examples/basic-incidents-example/basic-incidents-example.html",
          "source": "<div class=\"h-[400px] overflow-hidden\">\n  <ngs-incidents>\n    <ngs-incidents-bar>\n      <ngs-incidents-title>Maintenance work on the DNS</ngs-incidents-title>\n      <ngs-incidents-description>Description</ngs-incidents-description>\n      <ngs-icon name=\"fluent:chevron-down-24-regular\" ngsIncidentsToggleIcon/>\n    </ngs-incidents-bar>\n    <ngs-incidents-list>\n      @for (incident of incidents; track incident) {\n        <ngs-incident>\n          <ngs-icon name=\"fluent:info-24-regular\" ngsIncidentIcon/>\n          <ngs-icon name=\"fluent:dismiss-24-regular\" ngsIncidentClose/>\n          <ngs-incident-title>{{ incident.title }}</ngs-incident-title>\n          <ngs-incident-details>{{ incident.details }}</ngs-incident-details>\n        </ngs-incident>\n      }\n    </ngs-incidents-list>\n  </ngs-incidents>\n</div>"
        },
        {
          "name": "incidents-show-hide-dynamicly-example",
          "title": "Incidents show hide dynamicly",
          "file": "projects/docs/src/app/components/incidents/_examples/incidents-show-hide-dynamicly-example/incidents-show-hide-dynamicly-example.html",
          "source": "<button ngsButton=\"filled\" (click)=\"toggleIncidents()\">Show Incidents</button>"
        }
      ],
      "previewAsset": "projects/components/incidents/preview.svg",
      "selectors": [
        "[ngs-incident]",
        "[ngsIncidentButton]",
        "[ngsIncidentClose]",
        "[ngsIncidentIcon]",
        "[ngsIncidentsToggleIcon]",
        "ngs-incident",
        "ngs-incident-details",
        "ngs-incident-title",
        "ngs-incidents",
        "ngs-incidents-bar",
        "ngs-incidents-container",
        "ngs-incidents-description",
        "ngs-incidents-global",
        "ngs-incidents-list",
        "ngs-incidents-title"
      ],
      "exportedSymbols": [
        "Incident",
        "IncidentButtonDirective",
        "IncidentCloseDirective",
        "IncidentDetails",
        "IncidentIconDirective",
        "Incidents",
        "INCIDENTS",
        "IncidentsBar",
        "IncidentsContainer",
        "IncidentsDescription",
        "IncidentsList",
        "IncidentsState",
        "IncidentsStore",
        "IncidentsTitle",
        "IncidentsToggleIconDirective",
        "IncidentTitle"
      ],
      "inputs": [
        "fixed",
        "incidentId"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-neutral-500",
        "--ngs-color-neutral-700",
        "--ngs-color-neutral-900",
        "--ngs-color-on-orange-container",
        "--ngs-color-orange-container",
        "--ngs-font-size-sm",
        "--ngs-incident-bg",
        "--ngs-incident-border-radius",
        "--ngs-incident-border-start",
        "--ngs-incident-close-color",
        "--ngs-incident-close-hover-color",
        "--ngs-incident-color",
        "--ngs-incident-details-color",
        "--ngs-incident-details-font-size",
        "--ngs-incident-gap",
        "--ngs-incident-padding",
        "--ngs-incident-title-font-size",
        "--ngs-incident-title-font-weight",
        "--ngs-incidents-bar-bg",
        "--ngs-incidents-bar-box-shadow",
        "--ngs-incidents-bar-color",
        "--ngs-incidents-bar-height",
        "--ngs-incidents-bar-hover-box-shadow",
        "--ngs-incidents-bar-padding",
        "--ngs-incidents-description-font-size",
        "--ngs-incidents-description-opacity",
        "--ngs-incidents-list-bg",
        "--ngs-incidents-list-gap",
        "--ngs-incidents-list-padding",
        "--ngs-incidents-title-font-size",
        "--ngs-incidents-title-font-weight",
        "--ngs-layout-top-header-height",
        "--ngs-layout-top-header-top",
        "--ngs-radius-md",
        "--ngs-shadow-sm"
      ],
      "example": null
    },
    {
      "name": "inline-text-edit",
      "title": "Inline Text Edit",
      "overviewName": "Inline Text Edit",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/inline-text-edit",
      "publicApi": "projects/components/inline-text-edit/public-api.ts",
      "sourceRoot": "projects/components/inline-text-edit/src",
      "docsPath": "/forms/inline-text-edit",
      "docsOverviewSource": "projects/docs/src/app/forms/inline-text-edit/overview/overview.html",
      "purpose": "Let users edit already visible plain text directly in place with a contenteditable host.",
      "useWhen": "Use for quick rename and edit-in-place flows such as project names, task names, card titles, table labels, short descriptions, headings, and other small text values where opening a separate form would be too heavy. It saves on Enter or blur, cancels on Escape, emits the trimmed value through contentChanged, supports placeholder, and can delay emissions with delay. Do not use for normal labeled forms, validation-heavy fields, or textarea workflows; use ngs-form-field with ngsInput or textarea. Do not use for rich text, long content, comments, replies, or documents; use TextEditor, ContentEditor, or CommentEditor. Do not use for value selection or complex save/cancel flows with explicit buttons.",
      "exampleTopics": [
        "Basic inline text edit"
      ],
      "minimalExample": "<ngs-alert variant=\"informative\">\n  Hover and edit, then press <strong>Enter</strong> or click outside to save. Press <strong>Esc</strong> to cancel.\n</ngs-alert>\n<div class=\"w-1/2 mt-10\">\n  <ngs-inline-text-edit\n    placeholder=\"Project Name\"\n    (contentChanged)=\"onSaveName($event)\" class=\"text-2xl font-bold leading-[2]\">\n    {{ projectName() }}\n  </ngs-inline-text-edit>\n  <ngs-inline-text-edit (contentChanged)=\"onSaveDescription($event)\" class=\"mt-1\">\n    {{ projectDescription() }}\n  </ngs-inline-text-edit>\n</div>\n<div class=\"mt-10\">\n  <ngs-divider/>\n</div>\n<div class=\"mt-5 text-sm\">\n  Project Name: {{ projectName() }}\n</div>\n<div class=\"mt-3 text-sm\">\n  Project Description: {{ projectDescription() }}\n</div>",
      "exampleFiles": [
        {
          "name": "basic-inline-text-edit-example",
          "title": "Basic inline text edit",
          "file": "projects/docs/src/app/forms/inline-text-edit/_examples/basic-inline-text-edit-example/basic-inline-text-edit-example.html",
          "source": "<ngs-alert variant=\"informative\">\n  Hover and edit, then press <strong>Enter</strong> or click outside to save. Press <strong>Esc</strong> to cancel.\n</ngs-alert>\n<div class=\"w-1/2 mt-10\">\n  <ngs-inline-text-edit\n    placeholder=\"Project Name\"\n    (contentChanged)=\"onSaveName($event)\" class=\"text-2xl font-bold leading-[2]\">\n    {{ projectName() }}\n  </ngs-inline-text-edit>\n  <ngs-inline-text-edit (contentChanged)=\"onSaveDescription($event)\" class=\"mt-1\">\n    {{ projectDescription() }}\n  </ngs-inline-text-edit>\n</div>\n<div class=\"mt-10\">\n  <ngs-divider/>\n</div>\n<div class=\"mt-5 text-sm\">\n  Project Name: {{ projectName() }}\n</div>\n<div class=\"mt-3 text-sm\">\n  Project Description: {{ projectDescription() }}\n</div>"
        }
      ],
      "previewAsset": "projects/components/inline-text-edit/preview.svg",
      "selectors": [
        "[ngs-inline-text-edit]",
        "ngs-inline-text-edit"
      ],
      "exportedSymbols": [
        "InlineTextEdit"
      ],
      "inputs": [
        "delay",
        "enabled",
        "placeholder"
      ],
      "outputs": [
        "contentChanged"
      ],
      "cssTokens": [
        "--ngs-color-neutral-500",
        "--ngs-color-on-surface",
        "--ngs-color-outline",
        "--ngs-color-primary",
        "--ngs-field-radius",
        "--ngs-form-field-outlined-caret-color",
        "--ngs-form-field-outlined-input-text-color",
        "--ngs-form-field-outlined-outline-color",
        "--ngs-form-field-outlined-outline-width"
      ],
      "example": null
    },
    {
      "name": "input",
      "title": "Input",
      "overviewName": "Input",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/input",
      "publicApi": "projects/components/input/public-api.ts",
      "sourceRoot": "projects/components/input/src",
      "docsPath": "/forms/input",
      "docsOverviewSource": "projects/docs/src/app/forms/input/overview/overview.html",
      "purpose": "Apply NgStarter form styling and FormField integration to native input and textarea controls.",
      "useWhen": "Use input[ngsInput] or textarea[ngsInput] for regular text entry such as search, email, password, URL, plain phone-like text, textarea values in forms, filters, settings forms, profile forms, and admin forms. Usually place exactly one ngsInput control inside one ngs-form-field with ngs-label, ngs-hint, ngs-error, and optional prefix or suffix. It supports placeholder, required, disabled, readonly, focus behavior, Angular forms, and ErrorStateMatcher. Do not use for numeric controls with step/min/max UX; use NumberInput. Do not use for phone country/dial-code input; use PhoneInput. Do not use for masked formats by itself; pair ngsInput with InputMask directives. Do not use for Select, Autocomplete, Datepicker, Timepicker, CurrencySelect, CountrySelect, checkbox, radio, toggle, or buttons. Do not use for inline rename; use InlineTextEdit. Do not use for comments/replies or rich/block content; use CommentEditor, TextEditor, or ContentEditor. Do not use ngsInput as a layout wrapper or standalone replacement for FormField when label, hint, and error behavior are needed.",
      "exampleTopics": [
        "Basic Inputs",
        "Disabled Inputs",
        "Textarea Autosize",
        "Clear Button",
        "Error Messages",
        "Input with Hints",
        "Input with Prefixes and Suffixes",
        "Disabled",
        "Prefixes and suffixes"
      ],
      "minimalExample": "<form class=\"w-1/2\">\n  <ngs-form-field class=\"w-full\">\n    <ngs-label>Favorite food</ngs-label>\n    <input ngsInput placeholder=\"Ex. Pizza\" value=\"Sushi\" required>\n  </ngs-form-field>\n  <ngs-form-field class=\"w-full\">\n    <ngs-label>Leave a comment</ngs-label>\n    <textarea ngsInput placeholder=\"Ex. It makes me feel...\"></textarea>\n  </ngs-form-field>\n</form>",
      "exampleFiles": [
        {
          "name": "basic-inputs-example",
          "title": "Basic inputs",
          "file": "projects/docs/src/app/forms/input/_examples/basic-inputs-example/basic-inputs-example.html",
          "source": "<form class=\"w-1/2\">\n  <ngs-form-field class=\"w-full\">\n    <ngs-label>Favorite food</ngs-label>\n    <input ngsInput placeholder=\"Ex. Pizza\" value=\"Sushi\" required>\n  </ngs-form-field>\n  <ngs-form-field class=\"w-full\">\n    <ngs-label>Leave a comment</ngs-label>\n    <textarea ngsInput placeholder=\"Ex. It makes me feel...\"></textarea>\n  </ngs-form-field>\n</form>"
        },
        {
          "name": "clear-button-example",
          "title": "Clear button",
          "file": "projects/docs/src/app/forms/input/_examples/clear-button-example/clear-button-example.html",
          "source": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Clearable input</ngs-label>\n  <input ngsInput type=\"text\" [(ngModel)]=\"value\">\n  @if (value) {\n    <button ngsIconButtonSuffix ngsIconButton aria-label=\"Clear\" (click)=\"value=''\">\n      <ngs-icon name=\"fluent:dismiss-24-regular\"/>\n    </button>\n  }\n</ngs-form-field>"
        },
        {
          "name": "disabled-example",
          "title": "Disabled",
          "file": "projects/docs/src/app/forms/input/_examples/disabled-example/disabled-example.html",
          "source": "<form class=\"w-1/2\">\n  <ngs-form-field class=\"w-full\">\n    <ngs-label>Favorite food</ngs-label>\n    <input ngsInput placeholder=\"Ex. Pizza\" value=\"Sushi\" disabled>\n  </ngs-form-field>\n  <ngs-form-field class=\"w-full\">\n    <ngs-label>Leave a comment</ngs-label>\n    <textarea ngsInput placeholder=\"Ex. It makes me feel...\" disabled></textarea>\n  </ngs-form-field>\n</form>"
        }
      ],
      "previewAsset": "projects/components/input/preview.svg",
      "selectors": [
        "input[ngsInput]",
        "textarea[ngsInput]"
      ],
      "exportedSymbols": [
        "Input"
      ],
      "inputs": [
        "disabled",
        "errorStateMatcher",
        "id",
        "placeholder",
        "readonly",
        "required"
      ],
      "outputs": [],
      "cssTokens": [],
      "example": "<input ngsInput placeholder=\"Email\" />"
    },
    {
      "name": "input-mask",
      "title": "Input Mask",
      "overviewName": "Input Mask",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/input-mask",
      "publicApi": "projects/components/input-mask/public-api.ts",
      "sourceRoot": "projects/components/input-mask/src",
      "docsPath": "/forms/input-mask",
      "docsOverviewSource": "projects/docs/src/app/forms/input-mask/overview/overview.html",
      "purpose": "Format credit card input fields while the user types with ready-made mask directives.",
      "useWhen": "Use on native inputs, usually with ngsInput inside ngs-form-field, for payment or billing fields that need credit card formatting. Available directives are ngsCreditCardNumberMask for grouped card numbers, ngsCreditCardExpiryDateMask for MM/YY expiry, and ngsCreditCardCvvMask for CVV/CVC. The directives format the visible input, set useful mobile keyboard and autocomplete attributes where applicable, and keep the Angular form value cleaned for card number and expiry. Do not use as a universal mask engine, validator, payment security layer, or compliance solution. Do not use for phone numbers; use PhoneInput. Do not use for custom IDs, tax numbers, IBAN, postal codes, arbitrary structured text, date pickers, selects, currency fields, country fields, or formatting saved display values; use dedicated components, validators, backend checks, or a custom mask directive.",
      "exampleTopics": [
        "Credit card number input mask",
        "Credit card expiry date input mask",
        "Credit card cvv input mask",
        "Credit card input mask",
        "Credit card expiry input mask"
      ],
      "minimalExample": "<ngs-form-field>\n  <ngs-label>CVV</ngs-label>\n  <input ngsInput type=\"password\" maxlength=\"3\" ngsCreditCardCvvMask placeholder=\"•••\">\n</ngs-form-field>",
      "exampleFiles": [
        {
          "name": "credit-card-cvv-input-mask-example",
          "title": "Credit card cvv input mask",
          "file": "projects/docs/src/app/forms/input-mask/_examples/credit-card-cvv-input-mask-example/credit-card-cvv-input-mask-example.html",
          "source": "<ngs-form-field>\n  <ngs-label>CVV</ngs-label>\n  <input ngsInput type=\"password\" maxlength=\"3\" ngsCreditCardCvvMask placeholder=\"•••\">\n</ngs-form-field>"
        },
        {
          "name": "credit-card-expiry-input-mask-example",
          "title": "Credit card expiry input mask",
          "file": "projects/docs/src/app/forms/input-mask/_examples/credit-card-expiry-input-mask-example/credit-card-expiry-input-mask-example.html",
          "source": "<ngs-form-field>\n  <ngs-label>Expiry</ngs-label>\n  <input ngsInput ngsCreditCardExpiryDateMask>\n</ngs-form-field>"
        },
        {
          "name": "credit-card-input-mask-example",
          "title": "Credit card input mask",
          "file": "projects/docs/src/app/forms/input-mask/_examples/credit-card-input-mask-example/credit-card-input-mask-example.html",
          "source": "<ngs-form-field>\n  <ngs-label>Card number</ngs-label>\n  <ngs-icon name=\"fluent:payment-24-regular\" ngsPrefix/>\n  <input ngsInput ngsCreditCardNumberMask>\n</ngs-form-field>"
        }
      ],
      "previewAsset": "projects/components/input-mask/preview.svg",
      "selectors": [
        "[ngsCreditCardCvvMask]",
        "[ngsCreditCardExpiryDateMask]",
        "[ngsCreditCardNumberMask]"
      ],
      "exportedSymbols": [
        "CreditCardCvvMaskDirective",
        "CreditCardExpiryDateMaskDirective",
        "CreditCardNumberMaskDirective"
      ],
      "inputs": [
        "placeholder"
      ],
      "outputs": [],
      "cssTokens": [],
      "example": null
    },
    {
      "name": "input-validator",
      "title": "Input Validator",
      "overviewName": "Input Validator",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/input-validator",
      "publicApi": "projects/components/input-validator/public-api.ts",
      "sourceRoot": "projects/components/input-validator/src",
      "docsPath": "/forms/input-validator",
      "docsOverviewSource": "projects/docs/src/app/forms/input-validator/overview/overview.html",
      "purpose": "Provide ready-made Angular ValidatorFn helpers for common reusable form validation rules.",
      "useWhen": "Use in reactive forms with ngs-form-field, ngsInput, Angular Validators, and ngs-error when a preset client-side validator fits. Current payment presets include creditCardNumberValidator() for cleaned card number length and Luhn checksum, expiryDateValidator() for MMYY expiry format, valid month, and not-in-past checks, and creditCardCvvValidator() for numeric CVV/CVC length with optional minLength and maxLength. Pair these validators with InputMask directives when the user also needs formatted payment input. Do not use InputValidator as a UI component, input formatter, input mask, replacement for Angular built-in validators, backend validation, payment processor validation, or security/compliance layer. Do not use for arbitrary custom business rules unless a dedicated preset exists; write a project validator.",
      "exampleTopics": [
        "Credit card input validators"
      ],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/input-validator/preview.svg",
      "selectors": [],
      "exportedSymbols": [
        "creditCardCvvValidator",
        "CreditCardCvvValidatorOptions",
        "creditCardNumberValidator",
        "expiryDateValidator"
      ],
      "inputs": [],
      "outputs": [],
      "cssTokens": [],
      "example": null
    },
    {
      "name": "kanban-board",
      "title": "Kanban Board",
      "overviewName": "Kanban Board",
      "category": "libraries",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/kanban-board",
      "publicApi": "projects/components/kanban-board/public-api.ts",
      "sourceRoot": "projects/components/kanban-board/src",
      "docsPath": "/libraries/kanban-board",
      "docsOverviewSource": "projects/docs/src/app/libraries/kanban-board/overview/overview.html",
      "purpose": "Render a horizontal workflow board with status columns and draggable cards.",
      "useWhen": "Use ngs-kanban-board for tasks, issues, CRM deals, hiring pipelines, content workflows, support tickets, and other status-based boards where users drag items within a column or between columns. Provide columns with id, name, color, and items; each item should include at least name and position. Render cards through a custom ngsKanbanItemDef template and compose card content with NgStarter components such as Avatar, Badge, Icon, Button, and text. The board mutates local arrays with CDK moveItemInArray and transferArrayItem and emits itemSorted, itemTransferred, itemDropped, itemClick, itemAdd, columnEdit, and columnDelete; the app must persist the new order, status, and business data to the backend. Do not use for simple record tables; use Table or DataView. Do not use for static lists; use List. Do not use for dashboard widget layouts; use Grid. Do not use for calendars, timelines, arbitrary drag-and-drop builders, or screens without real workflow/status columns.",
      "exampleTopics": [
        "Kanban Board"
      ],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/kanban-board/preview.svg",
      "selectors": [
        "[ngsKanbanItemDef]",
        "ngs-kanban-board"
      ],
      "exportedSymbols": [
        "KanbanBoard",
        "KanbanColumn",
        "KanbanItem",
        "KanbanItemDefDirective",
        "KanbanItemSortedEvent",
        "KanbanItemTransferredEvent"
      ],
      "inputs": [
        "colors",
        "columns"
      ],
      "outputs": [
        "columnDelete",
        "columnEdit",
        "itemAdd",
        "itemClick",
        "itemSorted"
      ],
      "cssTokens": [
        "--ngs-color-surface-container-lowest",
        "--ngs-kanban-board-col-width",
        "--ngs-kanban-board-column-gap",
        "--ngs-kanban-board-padding-x",
        "--ngs-radius-xl",
        "--ngs-shadow-sm"
      ],
      "example": null
    },
    {
      "name": "kbd",
      "title": "Kbd",
      "overviewName": "Kbd",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/kbd",
      "publicApi": "projects/components/kbd/public-api.ts",
      "sourceRoot": "projects/components/kbd/src",
      "docsPath": "/components/kbd",
      "docsOverviewSource": "projects/docs/src/app/components/kdb/overview/overview.html",
      "purpose": "Display visual keyboard keys and shortcut hints.",
      "useWhen": "Use ngs-kbd for a single key such as Cmd, Shift, K, Esc, or an arrow key, and ngs-kbd-group for key combinations with plus signs between keys. Use in menus, command palettes, toolbars, help text, onboarding, documentation, and shortcut hints next to commands. Kbd is visual only: it does not register shortcuts, handle keyboard events, trigger actions, or provide command logic. Do not use as a clickable button; use Button or IconButton. Do not use for statuses or counts; use Badge. Do not use for tags or categories; use Chips. Do not use as normal body text or for actions that do not have a real shortcut handled elsewhere.",
      "exampleTopics": [
        "Basic Keyboard",
        "Keyboard group",
        "Keyboard in menu",
        "Basic kbd",
        "Kbd group",
        "Kbd with menu"
      ],
      "minimalExample": "<div class=\"flex gap-2\">\n  <ngs-kbd>⌘</ngs-kbd>\n  <ngs-kbd>⇧</ngs-kbd>\n  <ngs-kbd>⌥</ngs-kbd>\n  <ngs-kbd>⌃</ngs-kbd>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-kbd-example",
          "title": "Basic kbd",
          "file": "projects/docs/src/app/components/kdb/_examples/basic-kbd-example/basic-kbd-example.html",
          "source": "<div class=\"flex gap-2\">\n  <ngs-kbd>⌘</ngs-kbd>\n  <ngs-kbd>⇧</ngs-kbd>\n  <ngs-kbd>⌥</ngs-kbd>\n  <ngs-kbd>⌃</ngs-kbd>\n</div>"
        },
        {
          "name": "kbd-group-example",
          "title": "Kbd group",
          "file": "projects/docs/src/app/components/kdb/_examples/kbd-group-example/kbd-group-example.html",
          "source": "<div>\n  <ngs-kbd-group>\n    <ngs-kbd>⌘</ngs-kbd>\n    <ngs-kbd>⌥</ngs-kbd>\n  </ngs-kbd-group>\n</div>\n<div class=\"mt-5\">\n  <ngs-kbd-group>\n    <ngs-kbd>⌘</ngs-kbd>\n    <ngs-kbd>⇧</ngs-kbd>\n    <ngs-kbd>⌃</ngs-kbd>\n  </ngs-kbd-group>\n</div>"
        },
        {
          "name": "kbd-with-menu-example",
          "title": "Kbd with menu",
          "file": "projects/docs/src/app/components/kdb/_examples/kbd-with-menu-example/kbd-with-menu-example.html",
          "source": "<button ngsButton [ngsMenuTriggerFor]=\"menu\">\n  Actions\n</button>\n<ngs-menu #menu=\"ngsMenu\">\n  <button ngs-menu-item>\n    <ngs-icon name=\"fluent:copy-24-regular\"/>\n    Copy\n    <ngs-kbd-group>\n      <ngs-kbd>⌘</ngs-kbd>\n      <ngs-kbd>C</ngs-kbd>\n    </ngs-kbd-group>\n  </button>\n  <button ngs-menu-item>\n    <ngs-icon name=\"fluent:clipboard-paste-24-regular\"/>\n    Paste\n    <ngs-kbd-group>\n      <ngs-kbd>⌘</ngs-kbd>\n      <ngs-kbd>V</ngs-kbd>\n    </ngs-kbd-group>\n  </button>\n  <button ngs-menu-item>\n    <ngs-icon name=\"fluent:cut-24-regular\"/>\n    Cut\n    <ngs-kbd-group>\n      <ngs-kbd>⌘</ngs-kbd>\n      <ngs-kbd>X</ngs-kbd>\n    </ngs-kbd-group>\n  </button>\n</ngs-menu>"
        }
      ],
      "previewAsset": "projects/components/kbd/preview.svg",
      "selectors": [
        "ngs-kbd",
        "ngs-kbd-group"
      ],
      "exportedSymbols": [
        "Kbd",
        "KbdGroup"
      ],
      "inputs": [],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-surface-container",
        "--ngs-font-size-xs",
        "--ngs-radius-lg"
      ],
      "example": null
    },
    {
      "name": "layout",
      "title": "Layout",
      "overviewName": "Layout",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/layout",
      "publicApi": "projects/components/layout/public-api.ts",
      "sourceRoot": "projects/components/layout/src",
      "docsPath": "/components/layout",
      "docsOverviewSource": "projects/docs/src/app/components/layout/overview/overview.html",
      "purpose": "Provide the base top-level shell for an application, admin area, dashboard, or large workspace page.",
      "useWhen": "Use ngs-layout as the outer structural frame when the whole screen needs topbar, header, sidebar, scrollable content, aside, or footer regions. Use root for a full viewport application shell. Use ngs-layout-content for the main scroll container, and LayoutApiService with layoutId when the sidebar must be shown, hidden, or toggled. Nested layouts are appropriate when a large app shell contains another structured workspace with its own header/content/footer. Do not use Layout as a small wrapper, card, spacing helper, form grouping tool, or generic grid system. Use TailwindCSS grid, flex, and spacing classes inside layout regions. Use Grid for static dashboard widgets, Tiles for dashboards users can rearrange or customize, DataView or Table for datasets, Drawer for overlay side panels, and Navigation, Sidebar, or Sidenav components inside sidebars.",
      "exampleTopics": [
        "Layout header",
        "Layout sidebar",
        "Layout header with sidebar",
        "Layout header with topbar",
        "Layout footer",
        "Layout header with footer",
        "Layout aside",
        "Layout with nested layouts example",
        "Layout with nested layouts"
      ],
      "minimalExample": "<div class=\"h-[300px] border border-muted\">\n  <ngs-layout>\n    <ngs-layout-sidebar>\n      <div class=\"p-6 border-r border-e-muted h-full w-[240px]\">Sidebar</div>\n    </ngs-layout-sidebar>\n    <ngs-layout-content class=\"p-6\">\n      Body\n    </ngs-layout-content>\n    <ngs-layout-aside>\n      <div class=\"p-6 border-s border-s-muted h-full w-[200px]\">Aside</div>\n    </ngs-layout-aside>\n  </ngs-layout>\n</div>",
      "exampleFiles": [
        {
          "name": "layout-aside-example",
          "title": "Layout aside",
          "file": "projects/docs/src/app/components/layout/_examples/layout-aside-example/layout-aside-example.html",
          "source": "<div class=\"h-[300px] border border-muted\">\n  <ngs-layout>\n    <ngs-layout-sidebar>\n      <div class=\"p-6 border-r border-e-muted h-full w-[240px]\">Sidebar</div>\n    </ngs-layout-sidebar>\n    <ngs-layout-content class=\"p-6\">\n      Body\n    </ngs-layout-content>\n    <ngs-layout-aside>\n      <div class=\"p-6 border-s border-s-muted h-full w-[200px]\">Aside</div>\n    </ngs-layout-aside>\n  </ngs-layout>\n</div>"
        },
        {
          "name": "layout-footer-example",
          "title": "Layout footer",
          "file": "projects/docs/src/app/components/layout/_examples/layout-footer-example/layout-footer-example.html",
          "source": "<div class=\"h-[300px] border border-muted\">\n  <ngs-layout>\n    <ngs-layout-content class=\"p-6\">\n      Body\n    </ngs-layout-content>\n    <ngs-layout-footer>\n      <div class=\"border-t border-t-muted px-6 h-10 flex items-center text-xs\">\n        This is footer example &copy; 2024\n      </div>\n    </ngs-layout-footer>\n  </ngs-layout>\n</div>"
        },
        {
          "name": "layout-header-example",
          "title": "Layout header",
          "file": "projects/docs/src/app/components/layout/_examples/layout-header-example/layout-header-example.html",
          "source": "<div class=\"h-[300px] border border-muted\">\n  <ngs-layout>\n    <ngs-layout-header>\n      <div class=\"border-b border-b-muted px-6 h-14 flex items-center\">\n        Header\n      </div>\n    </ngs-layout-header>\n    <ngs-layout-content class=\"p-6\">\n      Body\n    </ngs-layout-content>\n  </ngs-layout>\n</div>"
        }
      ],
      "previewAsset": "projects/components/layout/preview.svg",
      "selectors": [
        "ngs-layout",
        "ngs-layout-aside",
        "ngs-layout-content",
        "ngs-layout-footer",
        "ngs-layout-header",
        "ngs-layout-sidebar",
        "ngs-layout-topbar"
      ],
      "exportedSymbols": [
        "Layout",
        "LAYOUT",
        "LAYOUT_CONTENT",
        "LayoutApiService",
        "LayoutAside",
        "LayoutContent",
        "LayoutContentInterface",
        "LayoutFooter",
        "LayoutHeader",
        "LayoutSidebar",
        "LayoutSidebarStore",
        "LayoutSidebarVisibilityChange",
        "LayoutTopbar"
      ],
      "inputs": [
        "autoscrollToTop",
        "layoutId",
        "root"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-layout-aside-width"
      ],
      "example": null
    },
    {
      "name": "list",
      "title": "List",
      "overviewName": "List",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/list",
      "publicApi": "projects/components/list/public-api.ts",
      "sourceRoot": "projects/components/list/src",
      "docsPath": "/components/list",
      "docsOverviewSource": "projects/docs/src/app/components/list/overview/overview.html",
      "purpose": "Display a vertical group of related rows with consistent icon, avatar, title, line, meta, action, and selection structure.",
      "useWhen": "Use ngs-list with ngs-list-item for settings rows, files, messages, activity feed items, compact collections, simple action rows, and small repeated row groups. Use ngs-selection-list with ngs-list-option when users choose one or more rows. Use ngs-nav-list for simple navigation rows in sidebars or compact navigation areas. Use ngs-action-list for vertical action groups that are not dropdown menus. Compose each row with ngsListItemIcon or ngsListItemAvatar, ngsListItemTitle, ngsListItemLine, and ngsListItemMeta. Do not use List for large tabular datasets, columns, sorting, pagination, or bulk operations; use Table or DataView. Do not use for trigger-based dropdown or context actions; use Menu. Do not use as a full app navigation system when Navigation fits better. Do not use as a generic layout container.",
      "exampleTopics": [
        "Basic List",
        "List With Sections",
        "List With Selection",
        "List With Single Selection",
        "List Variants",
        "Nav List"
      ],
      "minimalExample": "<ngs-list role=\"list\">\n  <ngs-list-item role=\"listitem\">Item 1</ngs-list-item>\n  <ngs-list-item role=\"listitem\">Item 2</ngs-list-item>\n  <ngs-list-item role=\"listitem\">Item 3</ngs-list-item>\n</ngs-list>",
      "exampleFiles": [
        {
          "name": "basic-list-example",
          "title": "Basic list",
          "file": "projects/docs/src/app/components/list/_examples/basic-list-example/basic-list-example.html",
          "source": "<ngs-list role=\"list\">\n  <ngs-list-item role=\"listitem\">Item 1</ngs-list-item>\n  <ngs-list-item role=\"listitem\">Item 2</ngs-list-item>\n  <ngs-list-item role=\"listitem\">Item 3</ngs-list-item>\n</ngs-list>"
        },
        {
          "name": "list-variants-example",
          "title": "List variants",
          "file": "projects/docs/src/app/components/list/_examples/list-variants-example/list-variants-example.html",
          "source": "<h3 class=\"ngs-title-large\">Single line lists</h3>\n<ngs-list>\n  <ngs-list-item>\n    <span ngsListItemTitle>This is the title</span>\n  </ngs-list-item>\n  <ngs-list-item>Also the title</ngs-list-item>\n</ngs-list>\n<h3 class=\"ngs-title-large\">Two line lists</h3>\n<ngs-list>\n  <ngs-list-item>\n    <span ngsListItemTitle>Title</span>\n    <span ngsListItemLine>Second line</span>\n  </ngs-list-item>\n  <ngs-list-item>\n    <span ngsListItemTitle>Title</span>\n    <span>Second line</span>\n  </ngs-list-item>\n  <ngs-list-item>\n    <span ngsListItemTitle>Title</span>\n    Second line\n  </ngs-list-item>\n</ngs-list>\n<h3 class=\"ngs-title-large\">Three line lists</h3>\n<ngs-list>\n  <ngs-list-item>\n    <span ngsListItemTitle>Title</span>\n    <span ngsListItemLine>Second line</span>\n    <span ngsListItemLine>Third line</span>\n  </ngs-list-item>\n  <ngs-list-item>\n    <span ngsListItemTitle>Title</span>\n    <span ngsListItemLine>Second line. This line will truncate.</span>\n    <span>Third line</span>\n  </ngs-list-item>\n  <ngs-list-item>\n    <span ngsListItemTitle>Title</span>\n    <span ngsListItemLine>Second line. This line will truncate.</span>\n    Third line\n  </ngs-list-item>\n</ngs-list>\n<h3 class=\"ngs-title-large\">Three line list with secondary text wrapping</h3>\n<ngs-list>\n  <ngs-list-item lines=\"3\">\n    <span ngsListItemTitle>Title</span>\n    <span>\n      Secondary line that will wrap because the list lines is explicitly set to 3 lines. Text\n      inside of a `ngsListItemTitle` or `ngsListItemLine` will never wrap.\n    </span>\n  </ngs-list-item>\n  <ngs-list-item lines=\"3\">\n    <span ngsListItemTi\n..."
        },
        {
          "name": "list-with-sections-example",
          "title": "List with sections",
          "file": "projects/docs/src/app/components/list/_examples/list-with-sections-example/list-with-sections-example.html",
          "source": "<ngs-list>\n  <div ngsSubheader>Folders</div>\n  @for (folder of folders(); track folder) {\n    <ngs-list-item>\n      <ngs-icon name=\"fluent:folder-24-regular\" ngsListItemIcon/>\n      <div ngsListItemTitle>{{ folder.name }}</div>\n      <div ngsListItemLine>{{ folder.updated | date }}</div>\n    </ngs-list-item>\n  }\n  <ngs-divider class=\"my-5\"/>\n  <div ngsSubheader>Notes</div>\n  @for (note of notes(); track note) {\n    <ngs-list-item>\n      <ngs-icon name=\"fluent:note-24-regular\" ngsListItemIcon/>\n      <div ngsListItemTitle>{{ note.name }}</div>\n      <div ngsListItemLine>{{ note.updated | date }}</div>\n    </ngs-list-item>\n  }\n</ngs-list>"
        }
      ],
      "previewAsset": "projects/components/list/preview.svg",
      "selectors": [
        "[ngsLine]",
        "[ngsListItemAvatar]",
        "[ngsListItemIcon]",
        "[ngsListItemLine]",
        "[ngsListItemMeta]",
        "[ngsListItemTitle]",
        "[ngsSubheader]",
        "a[ngs-list-item]",
        "button[ngs-list-item]",
        "ngs-action-list",
        "ngs-list",
        "ngs-list-item",
        "ngs-list-option",
        "ngs-nav-list",
        "ngs-selection-list"
      ],
      "exportedSymbols": [
        "ActionList",
        "List",
        "ListItem",
        "ListItemAvatar",
        "ListItemIcon",
        "ListItemLine",
        "ListItemMeta",
        "ListItemTitle",
        "ListOption",
        "NavList",
        "SelectionList",
        "Subheader"
      ],
      "inputs": [
        "disabled",
        "disableRipple",
        "lines",
        "multiple",
        "ngsRippleDisabled",
        "selected",
        "value"
      ],
      "outputs": [
        "selectedChange",
        "selectionChange"
      ],
      "cssTokens": [
        "--ngs-color-neutral",
        "--ngs-list-gap",
        "--ngs-list-item-active-bg",
        "--ngs-list-item-active-color",
        "--ngs-list-item-color",
        "--ngs-list-item-disabled-opacity",
        "--ngs-list-item-font-size",
        "--ngs-list-item-gap",
        "--ngs-list-item-hover-bg",
        "--ngs-list-item-hover-color",
        "--ngs-list-item-line-color",
        "--ngs-list-item-line-font-size",
        "--ngs-list-item-min-height",
        "--ngs-list-item-padding",
        "--ngs-list-item-radius",
        "--ngs-list-item-title-font-size",
        "--ngs-list-padding",
        "--ngs-nav-item-active-bg",
        "--ngs-nav-item-active-color",
        "--ngs-nav-item-color",
        "--ngs-nav-item-font-size",
        "--ngs-nav-item-gap",
        "--ngs-nav-item-height",
        "--ngs-nav-item-hover-bg",
        "--ngs-nav-item-hover-color",
        "--ngs-nav-item-padding",
        "--ngs-nav-item-radius"
      ],
      "example": null
    },
    {
      "name": "logo",
      "title": "Logo",
      "overviewName": "Logo",
      "category": null,
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/logo",
      "publicApi": "projects/components/logo/public-api.ts",
      "sourceRoot": "projects/components/logo/src",
      "docsPath": null,
      "docsOverviewSource": null,
      "purpose": "Render a product or brand logo as a composed mark, name, and optional description.",
      "useWhen": "Use ngs-logo or a[ngs-logo] in app shells, headers, sidebars, auth screens, splash screens, and branding areas. Compose it with ngs-logo-shape for the brand mark or image, ngs-logo-text for the product name with size small, default, or large, and ngs-logo-description for a short subtitle, version, or status. Use a[ngs-logo] when the logo navigates to the home page. Do not use Logo for user or team identity; use Avatar. Do not use for standalone action icons; use Icon inside Button or IconButton. Do not use for product thumbnails, decorative images, empty states, arbitrary SVG illustrations, or general image display.",
      "exampleTopics": [],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/logo/preview.svg",
      "selectors": [
        "[ngs-logo]",
        "ngs-logo",
        "ngs-logo-description",
        "ngs-logo-shape",
        "ngs-logo-text"
      ],
      "exportedSymbols": [
        "Logo",
        "LogoDescription",
        "LogoShape",
        "LogoText",
        "LogoTextSize"
      ],
      "inputs": [
        "size"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-primary",
        "--ngs-color-tertiary",
        "--ngs-font-size-sm",
        "--ngs-font-size-xl",
        "--ngs-font-size-xs",
        "--ngs-logo-text-color",
        "--ngs-logo-text-font-size",
        "--ngs-logo-text-font-weight"
      ],
      "example": null
    },
    {
      "name": "marquee",
      "title": "Marquee",
      "overviewName": "Marquee",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/marquee",
      "publicApi": "projects/components/marquee/public-api.ts",
      "sourceRoot": "projects/components/marquee/src",
      "docsPath": "/components/marquee",
      "docsOverviewSource": "projects/docs/src/app/components/marquee/overview/overview.html",
      "purpose": "Display an infinite horizontal stream of repeated non-critical content.",
      "useWhen": "Use ngs-marquee for motion content that can move and repeat without losing meaning: promo text, short highlights, logos, badges, partner names, compact news, and decorative content showcases. Use reverse to change direction. Use pauseOnHover when users may need more time to read or interact with the moving content. Do not use Marquee for important system notices, errors, warnings, required actions, or content the user must read; use Announcement, Alert, ActionRequired, or Incidents. Do not use for navigation, tables, task lists, precise ticker data, forms, or interactive work surfaces.",
      "exampleTopics": [
        "Basic marquee",
        "Marquee reverse",
        "Marquee with pause on hover",
        "Marquee pause on hover"
      ],
      "minimalExample": "<ngs-marquee class=\"text-md\">\n  Contributions are welcome. Please submit a pull request or open an issue to discuss your ideas.\n</ngs-marquee>",
      "exampleFiles": [
        {
          "name": "basic-marquee-example",
          "title": "Basic marquee",
          "file": "projects/docs/src/app/components/marquee/_examples/basic-marquee-example/basic-marquee-example.html",
          "source": "<ngs-marquee class=\"text-md\">\n  Contributions are welcome. Please submit a pull request or open an issue to discuss your ideas.\n</ngs-marquee>"
        },
        {
          "name": "marquee-pause-on-hover-example",
          "title": "Marquee pause on hover",
          "file": "projects/docs/src/app/components/marquee/_examples/marquee-pause-on-hover-example/marquee-pause-on-hover-example.html",
          "source": "<ngs-marquee pauseOnHover class=\"text-md\">\n  Contributions are welcome. Please submit a pull request or open an issue to discuss your ideas.\n</ngs-marquee>"
        },
        {
          "name": "marquee-reverse-example",
          "title": "Marquee reverse",
          "file": "projects/docs/src/app/components/marquee/_examples/marquee-reverse-example/marquee-reverse-example.html",
          "source": "<ngs-marquee [reverse]=\"true\" class=\"text-md\">\n  Contributions are welcome. Please submit a pull request or open an issue to discuss your ideas.\n</ngs-marquee>"
        }
      ],
      "previewAsset": "projects/components/marquee/preview.svg",
      "selectors": [
        "[ngsMarqueeItem]",
        "ngs-marquee"
      ],
      "exportedSymbols": [
        "Marquee",
        "MarqueeItemDirective"
      ],
      "inputs": [
        "pauseOnHover",
        "reverse"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-marquee-animation-duration",
        "--ngs-marquee-gap",
        "--ngs-marquee-item-width",
        "--ngs-marquee-pause",
        "--ngs-marquee-repeat-gap",
        "--ngs-marquee-reverse"
      ],
      "example": null
    },
    {
      "name": "menu",
      "title": "Menu",
      "overviewName": "Menu",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/menu",
      "publicApi": "projects/components/menu/public-api.ts",
      "sourceRoot": "projects/components/menu/src",
      "docsPath": "/components/menu",
      "docsOverviewSource": "projects/docs/src/app/components/menu/overview/overview.html",
      "purpose": "Show a short contextual set of commands in an overlay opened from a trigger or right-click area.",
      "useWhen": "Use ngs-menu for row actions, overflow more actions, user menus, context menus, toolbar actions, and nested command groups. Put ngsMenuTriggerFor on a button ngsButton, button ngsIconButton, row action, or toolbar control. Use ngsContextMenuTriggerFor for right-click menus. Use button ngs-menu-item for commands, and ngs-menu-divider, ngs-menu-heading, ngs-menu-header, and ngs-menu-footer for structure. Use nested menus when a command opens a secondary command group. Use ngsMenuContent with ngsMenuTriggerData when the same menu template must render lazily for a specific row, user, or item. Do not use Menu for selecting form values; use Select, Autocomplete, ColorSwitcher, Datepicker, or another dedicated form control. Do not use for persistent navigation; use Navigation, Sidebar, Sidenav, or NavList. Do not use for long lists, tables, filters, forms, modal workflows, command palettes, or bulk action bars; use List, Table/DataView, Dialog, CommandBar, or Overlay/Popover as appropriate.",
      "exampleTopics": [
        "Basic Menu",
        "Menu With Icons",
        "Menu Divider",
        "Menu Heading",
        "Data Driven Menu",
        "Menu Header & Footer",
        "Nested Menu",
        "Menu Positioning",
        "Context Menu",
        "Lazy Rendering Menu",
        "Lazy rendering"
      ],
      "minimalExample": "<button ngsButton [ngsMenuTriggerFor]=\"menu\">Menu</button>\n<ngs-menu #menu=\"ngsMenu\">\n  <button ngs-menu-item>Item 1</button>\n  <button ngs-menu-item>Item 2</button>\n</ngs-menu>",
      "exampleFiles": [
        {
          "name": "basic-menu-example",
          "title": "Basic menu",
          "file": "projects/docs/src/app/components/menu/_examples/basic-menu-example/basic-menu-example.html",
          "source": "<button ngsButton [ngsMenuTriggerFor]=\"menu\">Menu</button>\n<ngs-menu #menu=\"ngsMenu\">\n  <button ngs-menu-item>Item 1</button>\n  <button ngs-menu-item>Item 2</button>\n</ngs-menu>"
        },
        {
          "name": "context-menu-example",
          "title": "Context menu",
          "file": "projects/docs/src/app/components/menu/_examples/context-menu-example/context-menu-example.html",
          "source": "<div class=\"w-[300px] h-[300px] p-10 rounded-2xl text-center border border-muted flex items-center justify-center\"\n     [ngsContextMenuTriggerFor]=\"contextMenu\">\n  Right click here to trigger a context menu\n</div>\n<ngs-menu #contextMenu>\n  <button ngs-menu-item>\n    <ngs-icon name=\"fluent:cut-24-regular\"/>\n    Cut\n  </button>\n  <button ngs-menu-item>\n    <ngs-icon name=\"fluent:copy-24-regular\"/>\n    Copy\n  </button>\n  <button ngs-menu-item>\n    <ngs-icon name=\"fluent:clipboard-text-24-regular\"/>\n    Paste\n  </button>\n  <button ngs-menu-item>\n    <ngs-icon name=\"fluent:print-24-regular\"/>\n    Print\n  </button>\n</ngs-menu>"
        },
        {
          "name": "data-driven-menu-example",
          "title": "Data driven menu",
          "file": "projects/docs/src/app/components/menu/_examples/data-driven-menu-example/data-driven-menu-example.html",
          "source": "<div class=\"flex flex-col items-start gap-3\">\n  <button ngsButton [ngsMenuTriggerFor]=\"projectMenu\">\n    Project actions\n  </button>\n  <span class=\"text-sm text-neutral-600\">{{ selectedAction() }}</span>\n</div>\n<ngs-menu #projectMenu=\"ngsMenu\">\n  @for (action of actions; track action.id) {\n    <button ngs-menu-item [disabled]=\"action.disabled ?? false\" (click)=\"selectAction(action)\">\n      <ngs-icon [name]=\"action.icon\"/>\n      <span>{{ action.label }}</span>\n    </button>\n  }\n</ngs-menu>"
        }
      ],
      "previewAsset": "projects/components/menu/preview.svg",
      "selectors": [
        "[ngs-menu-item]",
        "[ngsContextMenuTriggerFor]",
        "[ngsMenuContent]",
        "[ngsMenuOptionGroup]",
        "[ngsMenuTriggerFor]",
        "ngs-menu",
        "ngs-menu-divider",
        "ngs-menu-footer",
        "ngs-menu-header",
        "ngs-menu-heading",
        "ngs-menu-item"
      ],
      "exportedSymbols": [
        "ContextMenuTrigger",
        "Menu",
        "MENU_ITEM",
        "MENU_TRIGGER",
        "MenuCloseReason",
        "MenuContent",
        "MenuDivider",
        "MenuFooter",
        "MenuHeader",
        "MenuHeading",
        "MenuItem",
        "MenuOptionGroupDirective",
        "MenuTrigger",
        "OPTION_PARENT_COMPONENT",
        "OptionParentComponent"
      ],
      "inputs": [
        "classList",
        "disabled",
        "multiple",
        "ngsContextMenuTriggerData",
        "ngsContextMenuTriggerFor",
        "ngsMenuDisabled",
        "ngsMenuTriggerData",
        "ngsMenuTriggerFor",
        "ngsMenuTriggerRestoreFocus",
        "role",
        "selected",
        "xPosition",
        "yPosition"
      ],
      "outputs": [
        "_triggered",
        "closed",
        "menuClosed",
        "menuOpened",
        "valueChange"
      ],
      "cssTokens": [
        "--ngs-color-neutral-500",
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-subtle",
        "--ngs-color-surface-container-high",
        "--ngs-color-surface-container-highest",
        "--ngs-control-radius",
        "--ngs-dropdown-bg",
        "--ngs-dropdown-border",
        "--ngs-dropdown-height",
        "--ngs-dropdown-item-active-bg",
        "--ngs-dropdown-item-color",
        "--ngs-dropdown-item-disabled-color",
        "--ngs-dropdown-item-font-size",
        "--ngs-dropdown-item-gap",
        "--ngs-dropdown-item-hover-bg",
        "--ngs-dropdown-item-padding",
        "--ngs-dropdown-item-radius",
        "--ngs-dropdown-padding",
        "--ngs-dropdown-radius",
        "--ngs-dropdown-shadow",
        "--ngs-font-size-sm",
        "--ngs-font-size-xs",
        "--ngs-menu-background",
        "--ngs-menu-border",
        "--ngs-menu-divider-color",
        "--ngs-menu-divider-margin",
        "--ngs-menu-item-active-background",
        "--ngs-menu-item-color",
        "--ngs-menu-item-disabled-color",
        "--ngs-menu-item-font-size",
        "--ngs-menu-item-font-weight",
        "--ngs-menu-item-gap",
        "--ngs-menu-item-height",
        "--ngs-menu-item-hover-background",
        "--ngs-menu-item-padding",
        "--ngs-menu-item-radius",
        "--ngs-menu-max-height",
        "--ngs-menu-max-width",
        "--ngs-menu-min-width",
        "--ngs-menu-padding",
        "--ngs-menu-panel-bg",
        "--ngs-menu-shadow"
      ],
      "example": null
    },
    {
      "name": "micro-chart",
      "title": "Micro Chart",
      "overviewName": "Micro Chart",
      "category": "micro-charts",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/micro-chart",
      "publicApi": "projects/components/micro-chart/public-api.ts",
      "sourceRoot": "projects/components/micro-chart/src",
      "docsPath": "/micro-charts",
      "docsOverviewSource": null,
      "purpose": "Render compact line, bar, and pie charts for small trends, comparisons, and proportional breakdowns.",
      "useWhen": "Use ngs-mchart-line for a small trend over time or ordered values, ngs-mchart-bar for a compact comparison of several numeric values, and ngs-mchart-pie for a small proportional breakdown. Use MicroChart inside KPI cards, dashboard summaries, table cells, list rows, reports, and dense admin panels. It can also be used as a simple standalone dashboard chart when the chart type and level of detail match what MicroChart can display. Provide fixed dimensions with TailwindCSS classes such as w-*, h-*, or size-* because the chart renders inside its container. Use ngs-mchart-tooltip, ngs-mchart-tooltip-title, and ngs-mchart-tooltip-body when hover context is needed. Do not use MicroChart for complex analytics, detailed axes, advanced legends, drilldown, zooming, financial charting, or advanced interactions; use ECharts for complex charts. Do not use instead of ProgressBar or Gauge for a single progress percentage, Badge for status, or DataView/Table for tabular data.",
      "exampleTopics": [],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/micro-chart/preview.svg",
      "selectors": [
        "ngs-mchart-bar",
        "ngs-mchart-line",
        "ngs-mchart-pie",
        "ngs-mchart-tooltip",
        "ngs-mchart-tooltip-body",
        "ngs-mchart-tooltip-title"
      ],
      "exportedSymbols": [
        "BaseChartTooltip",
        "MchartBar",
        "MchartLine",
        "MchartLineCurveType",
        "MchartPie",
        "MchartTooltip",
        "MchartTooltipBody",
        "MchartTooltipTitle"
      ],
      "inputs": [
        "compact",
        "curve",
        "data",
        "dataItemStrokeWidth",
        "fillAreaGradient",
        "fillGradient",
        "gap",
        "highlight",
        "labels",
        "legendContainerWidth",
        "legendItemFontSize",
        "legendItemHeight",
        "legendItemSymbolBorderRadius",
        "legendItemSymbolSize",
        "legendOffset",
        "markerDotSize",
        "radius",
        "responsive",
        "showArea",
        "showDataAnimation",
        "showLegend",
        "showMarkers",
        "showValueOnSlices",
        "strokeWidth",
        "tooltipPosition",
        "valueAccessor",
        "valueFontSize",
        "xAccessor",
        "yAccessor"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-background",
        "--ngs-color-neutral",
        "--ngs-color-neutral-200",
        "--ngs-color-neutral-300",
        "--ngs-color-neutral-700",
        "--ngs-color-neutral-800",
        "--ngs-color-neutral-900",
        "--ngs-color-neutral-950",
        "--ngs-color-primary",
        "--ngs-color-primary-200",
        "--ngs-color-primary-500",
        "--ngs-color-tertiary-200",
        "--ngs-font-size-xs",
        "--ngs-mchart-bar-bar-bg",
        "--ngs-mchart-bar-bar-gradient-end-color",
        "--ngs-mchart-bar-bar-gradient-start-color",
        "--ngs-mchart-bar-highlight-bg",
        "--ngs-mchart-line-area-bg",
        "--ngs-mchart-line-area-gradient-end-color",
        "--ngs-mchart-line-area-gradient-start-color",
        "--ngs-mchart-line-line-bg",
        "--ngs-mchart-line-marker-dot-bg",
        "--ngs-mchart-line-marker-line-bg",
        "--ngs-mchart-pie-legend-item-color",
        "--ngs-mchart-pie-legend-item-hover-color",
        "--ngs-mchart-pie-stroke-color",
        "--ngs-mchart-pie-value-color",
        "--ngs-radius-lg",
        "--ngs-shadow-sm"
      ],
      "example": null
    },
    {
      "name": "motion",
      "title": "Motion",
      "overviewName": "Motion",
      "category": null,
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/motion",
      "publicApi": "projects/components/motion/public-api.ts",
      "sourceRoot": "projects/components/motion/src",
      "docsPath": null,
      "docsOverviewSource": null,
      "purpose": "Use Motion when an Angular admin or dashboard screen needs this UI pattern.",
      "useWhen": "Use Motion as the standard NgStarter component for this UI need.",
      "exampleTopics": [],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": null,
      "selectors": [
        "ngs-motion-player",
        "ngs-motion-studio"
      ],
      "exportedSymbols": [
        "MotionPlayer",
        "MotionStudio"
      ],
      "inputs": [],
      "outputs": [],
      "cssTokens": [],
      "example": null
    },
    {
      "name": "navigation",
      "title": "Navigation",
      "overviewName": "Navigation",
      "category": "navigation",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/navigation",
      "publicApi": "projects/components/navigation/public-api.ts",
      "sourceRoot": "projects/components/navigation/src",
      "docsPath": "/navigation/navigation",
      "docsOverviewSource": "projects/docs/src/app/navigation/nav/overview/overview.html",
      "purpose": "Render a persistent product navigation structure when ngs-sidebar is not used.",
      "useWhen": "Use ngs-navigation for custom navigation areas, section navigation, settings navigation, admin navigation, and nested navigation groups when the screen needs product links but does not use ngs-sidebar. ngs-sidebar has its own navigation model, so do not duplicate ngs-navigation inside ngs-sidebar. Use ngs-navigation-item or [ngs-navigation-item] for destinations, key with activeKey for active state, activateByRoute for URL-based activation, autoScrollToActiveItem for long navigation, ngs-navigation-heading for sections, ngs-navigation-divider for group separation, and ngs-navigation-group with ngs-navigation-group-toggle and ngs-navigation-group-menu for expandable nested destinations. Use ngsNavigationItemIcon, ngsNavigationGroupToggleIcon, and ngsNavigationItemBadge for icons, toggles, and badges. Use dataSource with ngsNavigationItemDef when navigation comes from config or backend data. Do not use Navigation for trigger-based action menus; use Menu. Do not use for ordinary row lists; use List or NavList. Do not use for breadcrumbs, tabs, wizard steps, command palettes, form selection, table row actions, or bulk actions.",
      "exampleTopics": [
        "Basic Navigation",
        "Navigation with heading",
        "Navigation with divider",
        "Navigation with icons",
        "Navigation with nested menu",
        "Navigation with badges"
      ],
      "minimalExample": "<ngs-navigation activeKey=\"dashboard\" class=\"border border-muted p-4 rounded-2xl w-[340px]\">\n  <ngs-navigation-item key=\"dashboard\">\n    Dashboard\n  </ngs-navigation-item>\n  <ngs-navigation-item>\n    Projects\n  </ngs-navigation-item>\n  <ngs-navigation-item>Tasks</ngs-navigation-item>\n  <ngs-navigation-item>\n    <div class=\"overflow-hidden overflow-ellipsis\">\n      Really long menu item text, really long menu item text\n    </div>\n  </ngs-navigation-item>\n  <ngs-navigation-item>Support</ngs-navigation-item>\n</ngs-navigation>",
      "exampleFiles": [
        {
          "name": "basic-navigation-example",
          "title": "Basic navigation",
          "file": "projects/docs/src/app/navigation/nav/_examples/basic-navigation-example/basic-navigation-example.html",
          "source": "<ngs-navigation activeKey=\"dashboard\" class=\"border border-muted p-4 rounded-2xl w-[340px]\">\n  <ngs-navigation-item key=\"dashboard\">\n    Dashboard\n  </ngs-navigation-item>\n  <ngs-navigation-item>\n    Projects\n  </ngs-navigation-item>\n  <ngs-navigation-item>Tasks</ngs-navigation-item>\n  <ngs-navigation-item>\n    <div class=\"overflow-hidden overflow-ellipsis\">\n      Really long menu item text, really long menu item text\n    </div>\n  </ngs-navigation-item>\n  <ngs-navigation-item>Support</ngs-navigation-item>\n</ngs-navigation>"
        },
        {
          "name": "navigation-with-badges-example",
          "title": "Navigation with badges",
          "file": "projects/docs/src/app/navigation/nav/_examples/navigation-with-badges-example/navigation-with-badges-example.html",
          "source": "<ngs-navigation activeKey=\"profile\" class=\"border border-muted p-4 rounded-2xl h-[500px] w-[340px]\">\n  <ngs-navigation-item badgeTextOnly>\n    Dashboard <span ngsNavigationItemBadge>1</span>\n  </ngs-navigation-item>\n  <ngs-navigation-item>Projects</ngs-navigation-item>\n  <div ngs-navigation-item>Tasks</div>\n  <ngs-navigation-group>\n    <ngs-navigation-group-toggle>\n      Settings\n      <span ngsNavigationItemBadge>3</span>\n      <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"size-4.5\" ngsNavigationGroupToggleIcon/>\n    </ngs-navigation-group-toggle>\n    <ngs-navigation-group-menu>\n      <ngs-navigation-item key=\"profile\">Profile</ngs-navigation-item>\n      <div ngs-navigation-item>Security</div>\n    </ngs-navigation-group-menu>\n  </ngs-navigation-group>\n  <ngs-navigation-item>Support</ngs-navigation-item>\n</ngs-navigation>"
        },
        {
          "name": "navigation-with-divider-example",
          "title": "Navigation with divider",
          "file": "projects/docs/src/app/navigation/nav/_examples/navigation-with-divider-example/navigation-with-divider-example.html",
          "source": "<ngs-navigation activeKey=\"dashboard\" class=\"border border-muted p-4 rounded-2xl w-[340px]\">\n  <ngs-navigation-item key=\"dashboard\">Dashboard</ngs-navigation-item>\n  <ngs-navigation-item>Projects</ngs-navigation-item>\n  <ngs-navigation-divider />\n  <ngs-navigation-item>Tasks</ngs-navigation-item>\n  <ngs-navigation-item>Support</ngs-navigation-item>\n</ngs-navigation>"
        }
      ],
      "previewAsset": "projects/components/navigation/preview.svg",
      "selectors": [
        "[ngs-navigation-item]",
        "[ngsNavigationGroupToggleIcon]",
        "[ngsNavigationItemBadge]",
        "[ngsNavigationItemDef]",
        "[ngsNavigationItemIcon]",
        "ngs-navigation",
        "ngs-navigation-divider",
        "ngs-navigation-group",
        "ngs-navigation-group-menu",
        "ngs-navigation-group-toggle",
        "ngs-navigation-heading",
        "ngs-navigation-item"
      ],
      "exportedSymbols": [
        "Navigation",
        "NAVIGATION",
        "NAVIGATION_GROUP",
        "NavigationDivider",
        "NavigationGroup",
        "NavigationGroupInterface",
        "NavigationGroupMenu",
        "NavigationGroupToggle",
        "NavigationGroupToggleIconDirective",
        "NavigationHeading",
        "NavigationItem",
        "NavigationItemBadgeDirective",
        "NavigationItemData",
        "NavigationItemDefDirective",
        "NavigationItemIconDirective",
        "NavigationItemInterface",
        "NavigationState",
        "NavigationStore"
      ],
      "inputs": [
        "activateByRoute",
        "activeKey",
        "appearance",
        "badgeTextOnly",
        "dataSource",
        "forceActive",
        "itemTypeProperty",
        "key"
      ],
      "outputs": [
        "itemClicked"
      ],
      "cssTokens": [
        "--ngs-color-on-primary",
        "--ngs-color-on-surface-variant",
        "--ngs-color-outline",
        "--ngs-color-primary",
        "--ngs-color-subtle",
        "--ngs-font-size-xs",
        "--ngs-nav-arrow-size",
        "--ngs-nav-badge-padding",
        "--ngs-nav-badge-size",
        "--ngs-nav-divider-height",
        "--ngs-nav-divider-margin",
        "--ngs-nav-group-toggle-icon-position-end",
        "--ngs-nav-group-toggle-icon-size",
        "--ngs-nav-group-toggle-padding-end",
        "--ngs-nav-heading-after-margin",
        "--ngs-nav-heading-font-size",
        "--ngs-nav-heading-font-weight",
        "--ngs-nav-heading-height",
        "--ngs-nav-heading-margin-bottom",
        "--ngs-nav-heading-padding",
        "--ngs-nav-heading-text-align",
        "--ngs-nav-heading-text-transform",
        "--ngs-nav-item-active-bg",
        "--ngs-nav-item-active-color",
        "--ngs-nav-item-active-icon-color",
        "--ngs-nav-item-border-color",
        "--ngs-nav-item-border-width",
        "--ngs-nav-item-color",
        "--ngs-nav-item-font-size",
        "--ngs-nav-item-font-weight",
        "--ngs-nav-item-gap",
        "--ngs-nav-item-height",
        "--ngs-nav-item-hover-bg",
        "--ngs-nav-item-hover-color",
        "--ngs-nav-item-hover-icon-color",
        "--ngs-nav-item-icon-color",
        "--ngs-nav-item-icon-size",
        "--ngs-nav-item-icon-width",
        "--ngs-nav-item-padding",
        "--ngs-nav-item-radius",
        "--ngs-nav-item-width",
        "--ngs-nav-items-gap",
        "--ngs-nav-nested-item-border-radius",
        "--ngs-nav-nested-item-height",
        "--ngs-nav-nested-item-indicator-height",
        "--ngs-nav-nested-item-indicator-position-start",
        "--ngs-nav-nested-item-indicator-width",
        "--ngs-nav-nested-item-margin",
        "--ngs-nav-nested-item-padding",
        "--ngs-navigation-bg",
        "--ngs-navigation-divider-bg",
        "--ngs-navigation-divider-height",
        "--ngs-navigation-divider-margin",
        "--ngs-navigation-group-active-bg",
        "--ngs-navigation-group-border-radius",
        "--ngs-navigation-group-menu-padding-start",
        "--ngs-navigation-group-toggle-active-bg",
        "--ngs-navigation-group-toggle-active-color",
        "--ngs-navigation-group-toggle-bg",
        "--ngs-navigation-group-toggle-has-icon-padding-end",
        "--ngs-navigation-group-toggle-icon-color",
        "--ngs-navigation-group-toggle-icon-position-end",
        "--ngs-navigation-group-toggle-icon-size",
        "--ngs-navigation-group-tree-lines-color",
        "--ngs-navigation-heading-after-margin",
        "--ngs-navigation-heading-color",
        "--ngs-navigation-heading-font-size",
        "--ngs-navigation-heading-font-weight",
        "--ngs-navigation-heading-margin-bottom",
        "--ngs-navigation-heading-padding",
        "--ngs-navigation-heading-text-align",
        "--ngs-navigation-heading-text-transform",
        "--ngs-navigation-item-active-bg",
        "--ngs-navigation-item-active-color",
        "--ngs-navigation-item-active-icon-color",
        "--ngs-navigation-item-bg",
        "--ngs-navigation-item-border-color",
        "--ngs-navigation-item-border-radius",
        "--ngs-navigation-item-border-width",
        "--ngs-navigation-item-color",
        "--ngs-navigation-item-font-size",
        "--ngs-navigation-item-font-weight",
        "--ngs-navigation-item-gap",
        "--ngs-navigation-item-has-icon-padding-start",
        "--ngs-navigation-item-height",
        "--ngs-navigation-item-hover-bg",
        "--ngs-navigation-item-hover-color",
        "--ngs-navigation-item-hover-icon-color",
        "--ngs-navigation-item-icon-color",
        "--ngs-navigation-item-icon-size",
        "--ngs-navigation-item-icon-width",
        "--ngs-navigation-item-padding",
        "--ngs-navigation-item-space-y",
        "--ngs-navigation-item-width",
        "--ngs-navigation-items-gap",
        "--ngs-navigation-nested-item-active-bg",
        "--ngs-navigation-nested-item-active-color",
        "--ngs-navigation-nested-item-bg",
        "--ngs-navigation-nested-item-border-radius",
        "--ngs-navigation-nested-item-color",
        "--ngs-navigation-nested-item-height",
        "--ngs-navigation-nested-item-hover-bg",
        "--ngs-navigation-nested-item-hover-color",
        "--ngs-navigation-nested-item-indicator-bg",
        "--ngs-navigation-nested-item-indicator-height",
        "--ngs-navigation-nested-item-indicator-position-start",
        "--ngs-navigation-nested-item-indicator-width",
        "--ngs-navigation-nested-item-margin",
        "--ngs-navigation-nested-item-padding"
      ],
      "example": null
    },
    {
      "name": "notifications",
      "title": "Notifications",
      "overviewName": "Notifications",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/notifications",
      "publicApi": "projects/components/notifications/public-api.ts",
      "sourceRoot": "projects/components/notifications/src",
      "docsPath": "/components/notifications",
      "docsOverviewSource": "projects/docs/src/app/components/notifications/overview/overview.html",
      "purpose": "Display user-facing notification events in a structured feed or inbox.",
      "useWhen": "Use Notifications for events addressed to the current user: comments, mentions, invitations, assignments, access requests, status changes, completed processes, and user-specific updates. Use ngs-notification for one event, ngsNotificationAvatar for the source avatar or icon, ngs-notification-message for the main sentence, ngs-notification-actor for the actor, ngs-notification-content for nested context such as a comment, file, quote, card, or preview, and ngs-notification-time for time. Use isUnread for unread state. Use ngs-notification-list with ngsNotificationDef when notifications come from an array and each type needs its own template. Use ngsNotificationControlsDef for per-notification controls such as mute, delete, or mark as read, often with Menu. Do not use Notifications for page-level system messages; use Alert or Announcement. Do not use for critical required actions; use ActionRequired. Do not use for service health; use Incidents. Do not use for generic activity feeds that are not user notifications; use List. Do not use for transient toast/snackbar messages.",
      "exampleTopics": [
        "Basic notifications",
        "Notification variants",
        "Notification list"
      ],
      "minimalExample": "<ngs-notification class=\"w-2/3 p-4\">\n  <ngs-avatar appearance=\"identicon\" ngsNotificationAvatar/>\n  <ngs-notification-message>\n    <a routerLink=\"/\" ngs-notification-actor>Sam Anderson</a>\n    commented your post <a routerLink=\"/\" class=\"link\">Super article</a>\n  </ngs-notification-message>\n  <ngs-notification-content class=\"border border-muted rounded-lg p-2.5 text-sm\">\n    This is a comment.\n  </ngs-notification-content>\n  <ngs-notification-time>1 day ago</ngs-notification-time>\n</ngs-notification>\n<ngs-notification class=\"w-2/3 border border-muted rounded-xl p-4 mt-7\">\n  <ngs-avatar appearance=\"identicon\" ngsNotificationAvatar/>\n  <ngs-notification-message>\n    <a routerLink=\"/\" ngs-notification-actor>Sam Anderson</a>\n    commented your post <a routerLink=\"/\" class=\"link\">Super article</a>\n  </ngs-notification-message>\n  <ngs-notification-content class=\"border border-muted rounded-lg p-2.5 text-sm\">\n    This is a comment.\n  </ngs-notification-content>\n  <ngs-notification-time>1 day ago</ngs-notification-time>\n</ngs-notification>\n<ngs-notification class=\"w-2/3 bg-surface-container-low rounded-xl p-4 mt-7\">\n  <ngs-avatar appearance=\"identicon\" ngsNotificationAvatar/>\n  <ngs-notification-message>\n    <a routerLink=\"/\" ngs-notification-actor>Sam Anderson</a>\n    commented your post <a routerLink=\"/\" class=\"link\">Super article</a>\n  </ngs-notification-message>\n  <ngs-notification-content class=\"border border-muted rounded-lg p-2.5 text-sm\">\n    This is a comment.\n  </ngs-notification-content>\n  <ngs-notification-time>1 day ago</ngs-notification-time>\n</ngs-notification>\n<ngs-\n...",
      "exampleFiles": [
        {
          "name": "basic-notifications-example",
          "title": "Basic notifications",
          "file": "projects/docs/src/app/components/notifications/_examples/basic-notifications-example/basic-notifications-example.html",
          "source": "<ngs-notification class=\"w-2/3 p-4\">\n  <ngs-avatar appearance=\"identicon\" ngsNotificationAvatar/>\n  <ngs-notification-message>\n    <a routerLink=\"/\" ngs-notification-actor>Sam Anderson</a>\n    commented your post <a routerLink=\"/\" class=\"link\">Super article</a>\n  </ngs-notification-message>\n  <ngs-notification-content class=\"border border-muted rounded-lg p-2.5 text-sm\">\n    This is a comment.\n  </ngs-notification-content>\n  <ngs-notification-time>1 day ago</ngs-notification-time>\n</ngs-notification>\n<ngs-notification class=\"w-2/3 border border-muted rounded-xl p-4 mt-7\">\n  <ngs-avatar appearance=\"identicon\" ngsNotificationAvatar/>\n  <ngs-notification-message>\n    <a routerLink=\"/\" ngs-notification-actor>Sam Anderson</a>\n    commented your post <a routerLink=\"/\" class=\"link\">Super article</a>\n  </ngs-notification-message>\n  <ngs-notification-content class=\"border border-muted rounded-lg p-2.5 text-sm\">\n    This is a comment.\n  </ngs-notification-content>\n  <ngs-notification-time>1 day ago</ngs-notification-time>\n</ngs-notification>\n<ngs-notification class=\"w-2/3 bg-surface-container-low rounded-xl p-4 mt-7\">\n  <ngs-avatar appearance=\"identicon\" ngsNotificationAvatar/>\n  <ngs-notification-message>\n    <a routerLink=\"/\" ngs-notification-actor>Sam Anderson</a>\n    commented your post <a routerLink=\"/\" class=\"link\">Super article</a>\n  </ngs-notification-message>\n  <ngs-notification-content class=\"border border-muted rounded-lg p-2.5 text-sm\">\n    This is a comment.\n  </ngs-notification-content>\n  <ngs-notification-time>1 day ago</ngs-notification-time>\n</ngs-notification>\n<ngs-\n..."
        },
        {
          "name": "notification-list-example",
          "title": "Notification list",
          "file": "projects/docs/src/app/components/notifications/_examples/notification-list-example/notification-list-example.html",
          "source": "<ngs-notification-list [notifications]=\"notifications\" [static]=\"false\">\n  <ng-template ngsNotificationDef=\"mentionedInComment\" let-notification>\n    <ngs-notification [isUnread]=\"notification.isUnread\">\n      <ngs-avatar appearance=\"identicon\" [key]=\"notification.actor.id\"\n                    [image]=\"notification.actor.avatarUrl\"\n                    ngsNotificationAvatar/>\n      <ngs-notification-message>\n        <a routerLink=\"/\" ngs-notification-actor>{{ notification.actor.name }}</a>\n        {{ notification.message }}\n      </ngs-notification-message>\n      <ngs-notification-content class=\"border border-muted rounded-lg p-2.5 text-sm\">\n       This is a comment.\n      </ngs-notification-content>\n      <ngs-notification-time>{{ notification.createdAt }}</ngs-notification-time>\n    </ngs-notification>\n  </ng-template>\n  <ng-template ngsNotificationDef=\"inviteToEditFilesInFolder\" let-notification>\n    <ngs-notification [isUnread]=\"notification.isUnread\">\n      <ngs-avatar appearance=\"identicon\" [key]=\"notification.actor.id\"\n                    [image]=\"notification.actor.avatarUrl\"\n                    ngsNotificationAvatar/>\n      <ngs-notification-message>\n        <a routerLink=\"/\" ngs-notification-actor>{{ notification.actor.name }}</a>\n        invited you to edit <a routerLink=\"/\" class=\"link\">{{ notification.payload.folderName }}</a>\n      </ngs-notification-message>\n      <ngs-notification-content class=\"border border-muted rounded-lg p-2.5 text-sm\">\n        <div class=\"flex items-center gap-2\">\n          <ngs-icon name=\"fluent:folder-24-regular\" class=\"text-on-surfac\n..."
        },
        {
          "name": "notification-variants-example",
          "title": "Notification variants",
          "file": "projects/docs/src/app/components/notifications/_examples/notification-variants-example/notification-variants-example.html",
          "source": "<div class=\"flex flex-col gap-5\">\n  <ngs-notification class=\"border border-muted\">\n    <ngs-avatar appearance=\"identicon\" key=\"mila-ray\" image=\"assets/avatars/1.svg\" ngsNotificationAvatar/>\n    <ngs-notification-message>\n      <a routerLink=\"/\" ngs-notification-actor>Mila Ray</a>\n      mentioned you in <a routerLink=\"/\" class=\"link\">Launch planning</a>\n    </ngs-notification-message>\n    <ngs-notification-content class=\"notification-preview\">\n      Can you confirm the rollout window before we lock the customer email?\n    </ngs-notification-content>\n    <ngs-notification-time>Just now</ngs-notification-time>\n  </ngs-notification>\n  <ngs-notification isUnread class=\"border border-muted\">\n    <ngs-avatar appearance=\"identicon\" key=\"nolan-kim\" image=\"assets/avatars/2.svg\" ngsNotificationAvatar/>\n    <ngs-notification-message>\n      <a routerLink=\"/\" ngs-notification-actor>Nolan Kim</a>\n      requested access to <a routerLink=\"/\" class=\"link\">Q3 Pipeline</a>\n    </ngs-notification-message>\n    <ngs-notification-content>\n      <div class=\"notification-preview\">\n        Workspace role: Editor\n      </div>\n      <div class=\"mt-3 flex flex-wrap gap-2\">\n        <button ngsButton=\"filled\">Approve</button>\n        <button ngsButton=\"outlined\">Decline</button>\n      </div>\n    </ngs-notification-content>\n    <ngs-notification-time>8 minutes ago</ngs-notification-time>\n  </ngs-notification>\n  <ngs-notification class=\"border border-muted\">\n    <ngs-icon\n      name=\"fluent:checkmark-circle-24-regular\"\n      class=\"notification-icon-avatar notification-icon-avatar--success\"\n      ngsNotific\n..."
        }
      ],
      "previewAsset": "projects/components/notifications/preview.svg",
      "selectors": [
        "[ngs-notification-actor]",
        "[ngs-notification-content]",
        "[ngs-notification-time]",
        "[ngs-notification]",
        "[ngsNotificationAvatar]",
        "[ngsNotificationControlsDef]",
        "[ngsNotificationDef]",
        "[ngsNotificationProps]",
        "ngs-notification",
        "ngs-notification-actor",
        "ngs-notification-content",
        "ngs-notification-list",
        "ngs-notification-message",
        "ngs-notification-skeleton",
        "ngs-notification-time"
      ],
      "exportedSymbols": [
        "Notification",
        "NotificationActor",
        "NotificationActorLike",
        "NotificationAvatarDirective",
        "NotificationContent",
        "NotificationControlsDefDirective",
        "NotificationDefDirective",
        "NotificationInterface",
        "NotificationList",
        "NotificationMessage",
        "NotificationPropsDirective",
        "NotificationSkeleton",
        "NotificationTime"
      ],
      "inputs": [
        "isUnread",
        "ngsNotificationDef",
        "notifications",
        "static"
      ],
      "outputs": [
        "notificationClick"
      ],
      "cssTokens": [
        "--ngs-color-neutral-900",
        "--ngs-color-neutral-950",
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-primary",
        "--ngs-color-surface-container",
        "--ngs-color-surface-container-low",
        "--ngs-color-surface-container-lowest",
        "--ngs-font-size-sm",
        "--ngs-font-size-xs",
        "--ngs-notification-bg",
        "--ngs-notification-content-margin",
        "--ngs-notification-gap",
        "--ngs-notification-hover-bg",
        "--ngs-notification-is-unread-bg",
        "--ngs-notification-is-unread-hover-bg",
        "--ngs-notification-list-gap",
        "--ngs-notification-padding",
        "--ngs-notification-radius",
        "--ngs-radius-xl"
      ],
      "example": null
    },
    {
      "name": "number-input",
      "title": "Number Input",
      "overviewName": "Number Input",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/number-input",
      "publicApi": "projects/components/number-input/public-api.ts",
      "sourceRoot": "projects/components/number-input/src",
      "docsPath": "/forms/number-input",
      "docsOverviewSource": "projects/docs/src/app/forms/number-input/overview/overview.html",
      "purpose": "Capture a numeric form value with typing, stepper controls, min/max limits, and Angular forms integration.",
      "useWhen": "Use ngs-number-input inside one ngs-form-field when users need to type a number or adjust it with increase/decrease controls. Good for quantities, limits, thresholds, durations, percentages, ratings, numeric settings, seat counts, day counts, and budget-like numeric values. Use ngModel or formControlName, min and max for allowed bounds, step for increment/decrement size, readonly/disabled/required as normal form states, and ngsDecreaseControl or ngsIncreaseControl only when custom control icons are needed. Use TailwindCSS classes on ngs-form-field or surrounding layout for width and grouping. Do not use for normal text; use ngsInput. Do not use for phone numbers; use PhoneInput. Do not use for OTP, MFA, passcodes, or invite codes; use PinInput. Do not use for selecting currency; use CurrencySelect plus a numeric amount field when needed. Do not use for sliders/ranges, display-only KPI values, progress, or charts; use the dedicated component such as Gauge, ProgressBar, MicroChart, or a text/KPI layout.",
      "exampleTopics": [
        "Basic Number Input",
        "Custom Controls",
        "Min, Max Value",
        "Number input custom controls",
        "Number input min max"
      ],
      "minimalExample": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Type Number</ngs-label>\n  <ngs-number-input [(ngModel)]=\"value\" required/>\n</ngs-form-field>\n<p>Value: {{ value() }}</p>",
      "exampleFiles": [
        {
          "name": "basic-number-input-example",
          "title": "Basic number input",
          "file": "projects/docs/src/app/forms/number-input/_examples/basic-number-input-example/basic-number-input-example.html",
          "source": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Type Number</ngs-label>\n  <ngs-number-input [(ngModel)]=\"value\" required/>\n</ngs-form-field>\n<p>Value: {{ value() }}</p>"
        },
        {
          "name": "number-input-custom-controls-example",
          "title": "Number input custom controls",
          "file": "projects/docs/src/app/forms/number-input/_examples/number-input-custom-controls-example/number-input-custom-controls-example.html",
          "source": "<div class=\"flex flex-col gap-8\">\n  <div>\n    <ngs-form-field class=\"w-1/2\">\n      <ngs-label>Type Number</ngs-label>\n      <ngs-number-input>\n        <ng-template ngsDecreaseControl>\n          <ngs-icon name=\"fluent:add-24-regular\"/>\n        </ng-template>\n        <ng-template ngsIncreaseControl>\n          <ngs-icon name=\"fluent:subtract-24-regular\"/>\n        </ng-template>\n      </ngs-number-input>\n    </ngs-form-field>\n  </div>\n  <div>\n    <ngs-form-field class=\"w-1/2\">\n      <ngs-label>Type Number</ngs-label>\n      <ngs-number-input>\n        <ng-template ngsDecreaseControl>\n          <ngs-icon name=\"fluent:chevron-down-24-regular\"/>\n        </ng-template>\n        <ng-template ngsIncreaseControl>\n          <ngs-icon name=\"fluent:chevron-up-24-regular\"/>\n        </ng-template>\n      </ngs-number-input>\n    </ngs-form-field>\n  </div>\n</div>"
        },
        {
          "name": "number-input-min-max-example",
          "title": "Number input min max",
          "file": "projects/docs/src/app/forms/number-input/_examples/number-input-min-max-example/number-input-min-max-example.html",
          "source": "<form [formGroup]=\"form\">\n  <ngs-form-field class=\"w-1/2\">\n    <ngs-label>Min 2, Max 5</ngs-label>\n    <ngs-number-input formControlName=\"control\" min=\"2\" max=\"5\"/>\n  </ngs-form-field>\n</form>\n<p>Value: {{ form.value.control }}</p>"
        }
      ],
      "previewAsset": "projects/components/number-input/preview.svg",
      "selectors": [
        "[ngsDecreaseControl]",
        "[ngsIncreaseControl]",
        "[ngsNumberInputPrefix]",
        "[ngsNumberInputSuffix]",
        "ngs-number-input"
      ],
      "exportedSymbols": [
        "DecreaseControlDirective",
        "IncreaseControlDirective",
        "NumberInput",
        "NumberInputPrefixDirective",
        "NumberInputSuffixDirective"
      ],
      "inputs": [
        "disabled",
        "max",
        "min",
        "placeholder",
        "readonly",
        "required",
        "step"
      ],
      "outputs": [
        "valueChange"
      ],
      "cssTokens": [
        "--ngs-color-neutral-200",
        "--ngs-color-neutral-300",
        "--ngs-color-neutral-500",
        "--ngs-color-neutral-600",
        "--ngs-color-neutral-700",
        "--ngs-color-surface-container",
        "--ngs-color-surface-container-high",
        "--ngs-icon-size",
        "--ngs-number-input-control-active-bg",
        "--ngs-number-input-control-active-color",
        "--ngs-number-input-control-bg",
        "--ngs-number-input-control-border",
        "--ngs-number-input-control-border-radius",
        "--ngs-number-input-control-color",
        "--ngs-number-input-control-font-size",
        "--ngs-number-input-control-hover-bg",
        "--ngs-number-input-control-hover-color",
        "--ngs-number-input-control-size",
        "--ngs-number-input-controls-wdith",
        "--ngs-number-input-gap",
        "--ngs-number-input-suffix-gap",
        "--ngs-radius-md"
      ],
      "example": null
    },
    {
      "name": "option",
      "title": "Option",
      "overviewName": "Option",
      "category": null,
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/option",
      "publicApi": "projects/components/option/public-api.ts",
      "sourceRoot": "projects/components/option/src",
      "docsPath": null,
      "docsOverviewSource": null,
      "purpose": "Provide a low-level selectable option primitive for Select, Autocomplete, and other option-parent controls.",
      "useWhen": "Use ngs-option inside ngs-select, ngs-autocomplete, and other NgStarter dropdown/listbox controls that explicitly expect options, such as CountrySelect, CurrencySelect, DateFormatSelect, Timepicker, FilterBuilder, and similar controls. Use [value] for the form value and disabled when the option cannot be selected. Use ngs-optgroup to group related options under a label. Keep option text short and readable because the viewValue is derived from the rendered text. Do not use ngs-option as a generic list row, button, menu item, navigation item, table row, card, or custom layout block. Use MenuItem or Button for actions, Navigation/List/NavList for navigation and lists, RadioCard for rich card selection, and ColorSwitcher for fixed color choices. Agents usually should not import Option separately unless they are composing Select, Autocomplete, or another option-based component.",
      "exampleTopics": [],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/option/preview.svg",
      "selectors": [
        "ngs-optgroup",
        "ngs-option"
      ],
      "exportedSymbols": [
        "_Option",
        "_OptionParent",
        "Optgroup",
        "Option",
        "OPTION",
        "OPTION_PARENT"
      ],
      "inputs": [
        "data",
        "disabled",
        "label",
        "selected",
        "value"
      ],
      "outputs": [
        "onSelectionChange"
      ],
      "cssTokens": [
        "--ngs-color-on-primary-container",
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-primary-container",
        "--ngs-color-surface-container-high",
        "--ngs-color-surface-container-highest",
        "--ngs-control-radius",
        "--ngs-dropdown-height",
        "--ngs-dropdown-item-active-bg",
        "--ngs-dropdown-item-color",
        "--ngs-dropdown-item-disabled-color",
        "--ngs-dropdown-item-font-size",
        "--ngs-dropdown-item-gap",
        "--ngs-dropdown-item-hover-bg",
        "--ngs-dropdown-item-nested-padding-start",
        "--ngs-dropdown-item-padding",
        "--ngs-dropdown-item-padding-x",
        "--ngs-dropdown-item-radius",
        "--ngs-dropdown-item-selected-bg",
        "--ngs-dropdown-item-selected-color",
        "--ngs-font-size-sm",
        "--ngs-option-active-background",
        "--ngs-option-color",
        "--ngs-option-disabled-color",
        "--ngs-option-font-size",
        "--ngs-option-gap",
        "--ngs-option-group-padding-start",
        "--ngs-option-height",
        "--ngs-option-hover-background",
        "--ngs-option-padding",
        "--ngs-option-radius",
        "--ngs-option-selected-background",
        "--ngs-option-selected-color"
      ],
      "example": null
    },
    {
      "name": "overlay",
      "title": "Overlay",
      "overviewName": "Overlay",
      "category": null,
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/overlay",
      "publicApi": "projects/components/overlay/public-api.ts",
      "sourceRoot": "projects/components/overlay/src",
      "docsPath": null,
      "docsOverviewSource": null,
      "purpose": "Provide low-level shared positioning utilities for components that create Angular CDK floating overlays.",
      "useWhen": "Use Overlay only when implementing a new NgStarter component or custom directive that directly manages Angular CDK Overlay, portal rendering, backdrop or outside-click behavior, close behavior, keyboard/focus handling, and anchored positioning. Use OverlayPosition values such as below-start, below-center, below-end, above-*, before-*, and after-*. Use new PositionManager().build(position) to create fallback ConnectedPosition[] pairs. Do not use Overlay directly when building a normal admin page or feature screen. Prefer higher-level components: Menu for action dropdowns and context menus, Popover for lightweight anchored content, Dialog for modal workflows, Drawer for side overlays, Select/Autocomplete/Datepicker/ColorPicker for form dropdowns, and Tooltip for simple hints.",
      "exampleTopics": [],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/overlay/preview.svg",
      "selectors": [],
      "exportedSymbols": [
        "OverlayPosition",
        "PositionManager"
      ],
      "inputs": [],
      "outputs": [],
      "cssTokens": [],
      "example": null
    },
    {
      "name": "page-loading-bar",
      "title": "Page Loading Bar",
      "overviewName": "Page Loading Bar",
      "category": null,
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/page-loading-bar",
      "publicApi": "projects/components/page-loading-bar/public-api.ts",
      "sourceRoot": "projects/components/page-loading-bar/src",
      "docsPath": null,
      "docsOverviewSource": null,
      "purpose": "Show a global thin loading bar during Angular Router navigation.",
      "useWhen": "Use ngs-page-loading-bar once in the top-level app shell or root layout, usually near the root layout or router outlet, to provide navigation feedback. It listens to Angular Router events automatically: NavigationStart shows the bar, and NavigationEnd, NavigationCancel, or NavigationError finish it. Use fixed when the bar should stay attached to the viewport. Do not use PageLoadingBar for loading a specific block, table, card, form, submit/save/upload operation, or async work inside a page. Use ProgressBar, ProgressSpinner, BlockLoader, Skeleton, ScreenLoader, or the component-specific loading state for local loading. Do not use it as a real task completion percentage; it is route navigation feedback only.",
      "exampleTopics": [],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/page-loading-bar/preview.svg",
      "selectors": [
        "ngs-page-loading-bar"
      ],
      "exportedSymbols": [
        "PageLoadingBar"
      ],
      "inputs": [
        "fixed"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-loading-bar-bg",
        "--ngs-loading-bar-height"
      ],
      "example": null
    },
    {
      "name": "paginator",
      "title": "Paginator",
      "overviewName": "Paginator",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/paginator",
      "publicApi": "projects/components/paginator/public-api.ts",
      "sourceRoot": "projects/components/paginator/src",
      "docsPath": "/components/paginator",
      "docsOverviewSource": "projects/docs/src/app/components/paginator/overview/overview.html",
      "purpose": "Control pages of a dataset with range label, previous/next navigation, optional first/last buttons, and page size selection.",
      "useWhen": "Use ngs-paginator next to paged tables, DataView screens, search results, record lists, and server-side browsing. Provide length for total records, pageSize for records per page, zero-based pageIndex for the current page, and pageSizeOptions for allowed page sizes. Handle the page event to update local data or request the next page from an API; PageEvent includes previousPageIndex, pageIndex, pageSize, and length. Use hidePageSize when the page size is fixed. Use showFirstLastButtons when users need quick first/last navigation. Use PaginatorIntl to localize labels and range text. Do not use Paginator for app route navigation; use Navigation, Tabs, or Breadcrumbs. Do not use for wizard or onboarding steps; use Stepper or HeadlessStepper. Do not use for carousel slides, media browsing, or standalone UI without a paged dataset. If DataView already owns pagination, use its pagination model instead of adding a separate paginator.",
      "exampleTopics": [
        "Basic Paginator",
        "Configurable Paginator"
      ],
      "minimalExample": "<ngs-paginator [length]=\"100\"\n               [pageSize]=\"10\"\n               [pageSizeOptions]=\"[5, 10, 25, 100]\"\n               aria-label=\"Select page\" />",
      "exampleFiles": [
        {
          "name": "basic-paginator-example",
          "title": "Basic paginator",
          "file": "projects/docs/src/app/components/paginator/_examples/basic-paginator-example/basic-paginator-example.html",
          "source": "<ngs-paginator [length]=\"100\"\n               [pageSize]=\"10\"\n               [pageSizeOptions]=\"[5, 10, 25, 100]\"\n               aria-label=\"Select page\" />"
        },
        {
          "name": "configurable-paginator-example",
          "title": "Configurable paginator",
          "file": "projects/docs/src/app/components/paginator/_examples/configurable-paginator-example/configurable-paginator-example.html",
          "source": "<div class=\"w-1/2\">\n  <ngs-form-field class=\"w-full\">\n    <ngs-label>Length</ngs-label>\n    <input ngsInput placeholder=\"Length\" type=\"number\" [(ngModel)]=\"length\">\n  </ngs-form-field>\n  <ngs-form-field class=\"w-full\">\n    <ngs-label>Page Size</ngs-label>\n    <input ngsInput placeholder=\"Page Size\" type=\"number\" [(ngModel)]=\"pageSize\">\n  </ngs-form-field>\n  <ngs-form-field class=\"w-full\">\n    <ngs-label>Page Index</ngs-label>\n    <input ngsInput placeholder=\"Page Index\" type=\"number\" [(ngModel)]=\"pageIndex\">\n  </ngs-form-field>\n  <ngs-form-field class=\"w-full\">\n    <ngs-label>Page Size Options</ngs-label>\n    <input ngsInput [ngModel]=\"pageSizeOptions\" (ngModelChange)=\"setPageSizeOptions($event)\"\n           [ngModelOptions]=\"{updateOn: 'blur'}\" placeholder=\"Ex. 10,25,50\">\n  </ngs-form-field>\n  <div class=\"flex flex-col gap-4\">\n    <ngs-slide-toggle [(ngModel)]=\"hidePageSize\" class=\"w-full\">Hide page size</ngs-slide-toggle>\n    <ngs-slide-toggle [(ngModel)]=\"showPageSizeOptions\" class=\"w-full\">Show multiple page size options</ngs-slide-toggle>\n    <ngs-slide-toggle [(ngModel)]=\"showFirstLastButtons\" class=\"w-full\">Show first/last buttons</ngs-slide-toggle>\n    <ngs-slide-toggle [(ngModel)]=\"disabled\" class=\"w-full\">Disabled</ngs-slide-toggle>\n  </div>\n</div>\n<div class=\"my-8\">\n  <ngs-paginator #paginator\n                 (page)=\"handlePageEvent($event)\"\n                 [length]=\"length\"\n                 [pageSize]=\"pageSize\"\n                 [disabled]=\"disabled\"\n                 [showFirstLastButtons]=\"showFirstLastButtons\"\n                 [pageSizeOptions]=\"showPageSizeO\n..."
        }
      ],
      "previewAsset": "projects/components/paginator/preview.svg",
      "selectors": [
        "ngs-paginator"
      ],
      "exportedSymbols": [
        "DEFAULT_PAGE_SIZE",
        "PageEvent",
        "Paginator",
        "PAGINATOR_DEFAULT_OPTIONS",
        "PaginatorDefaultOptions",
        "PaginatorIntl"
      ],
      "inputs": [
        "disabled",
        "hidePageSize",
        "length",
        "pageIndex",
        "pageSize",
        "pageSizeOptions",
        "showFirstLastButtons"
      ],
      "outputs": [
        "page"
      ],
      "cssTokens": [
        "--ngs-color-on-surface",
        "--ngs-font-size-sm",
        "--ngs-form-field-container-min-height",
        "--ngs-form-field-infix-min-height",
        "--ngs-form-field-infix-padding-bottom",
        "--ngs-form-field-infix-padding-top",
        "--ngs-paginator-container-background",
        "--ngs-paginator-container-background-color",
        "--ngs-paginator-container-text-color",
        "--ngs-paginator-container-text-font",
        "--ngs-paginator-container-text-line-height",
        "--ngs-paginator-container-text-size",
        "--ngs-paginator-container-text-tracking",
        "--ngs-paginator-container-text-weight",
        "--ngs-paginator-items-per-page-label-margin",
        "--ngs-paginator-page-size-margin-right",
        "--ngs-paginator-range-label-margin",
        "--ngs-select-min-width"
      ],
      "example": null
    },
    {
      "name": "panel",
      "title": "Panel",
      "overviewName": "Panel",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/panel",
      "publicApi": "projects/components/panel/public-api.ts",
      "sourceRoot": "projects/components/panel/src",
      "docsPath": "/components/panel",
      "docsOverviewSource": "projects/docs/src/app/components/panel/overview/overview.html",
      "purpose": "Create a local structured work area with header, subheader, sidebar, scrollable content, aside, and footer regions.",
      "useWhen": "Use ngs-panel inside a page or workspace for admin modules, settings areas, editors, detail panes, inspectors, dashboard sections, and local surfaces that need their own header, footer, side columns, and scrollable body. Use ngs-panel-header for local title, toolbar, or actions; ngs-panel-subheader for filters or secondary status; ngs-panel-sidebar for a local left column; ngs-panel-content for the main scrollable area; ngs-panel-aside for a local right column; and ngs-panel-footer for local footer actions or status. Use absolute when the panel should fill the parent bounds. Use TailwindCSS classes for sizing, borders, spacing, and inner layout. Do not use Panel as the top-level application shell; use Layout. Do not use for small content blocks; use Card. Do not use for overlay side panels; use Drawer. Do not use as a generic spacing wrapper or form grid; use TailwindCSS grid/flex and FormField.",
      "exampleTopics": [
        "Basic panel",
        "Basic with extra columns (sidebar and aside)",
        "Panel with extra columns"
      ],
      "minimalExample": "<div class=\"h-[500px]\">\n  <ngs-panel class=\"border border-muted\">\n    <ngs-panel-header class=\"bg-surface-container flex items-center px-6\">Header</ngs-panel-header>\n    <ngs-panel-content>\n      <ngs-scrollbar-area>\n        <div class=\"p-6 h-[1000px]\">Body</div>\n      </ngs-scrollbar-area>\n    </ngs-panel-content>\n    <ngs-panel-footer class=\"bg-surface-container-low flex items-center px-6\">Footer</ngs-panel-footer>\n  </ngs-panel>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-panel-example",
          "title": "Basic panel",
          "file": "projects/docs/src/app/components/panel/_examples/basic-panel-example/basic-panel-example.html",
          "source": "<div class=\"h-[500px]\">\n  <ngs-panel class=\"border border-muted\">\n    <ngs-panel-header class=\"bg-surface-container flex items-center px-6\">Header</ngs-panel-header>\n    <ngs-panel-content>\n      <ngs-scrollbar-area>\n        <div class=\"p-6 h-[1000px]\">Body</div>\n      </ngs-scrollbar-area>\n    </ngs-panel-content>\n    <ngs-panel-footer class=\"bg-surface-container-low flex items-center px-6\">Footer</ngs-panel-footer>\n  </ngs-panel>\n</div>"
        },
        {
          "name": "panel-with-extra-columns-example",
          "title": "Panel with extra columns",
          "file": "projects/docs/src/app/components/panel/_examples/panel-with-extra-columns-example/panel-with-extra-columns-example.html",
          "source": "<div class=\"h-[500px]\">\n  <ngs-panel class=\"border border-muted\">\n    <ngs-panel-header class=\"bg-surface-container flex items-center px-6\">Header</ngs-panel-header>\n    <ngs-panel-sidebar class=\"border-r border-e-muted w-[200px]\">\n      <ngs-scrollbar-area>\n        <div class=\"p-6 h-[1000px]\" [style.width.px]=\"width()\" (click)=\"setSidebarLongWidth()\">Sidebar</div>\n      </ngs-scrollbar-area>\n    </ngs-panel-sidebar>\n    <ngs-panel-content>\n      <ngs-scrollbar-area>\n        <div class=\"p-6 h-[1000px] w-[1000px]\">Body</div>\n      </ngs-scrollbar-area>\n    </ngs-panel-content>\n    <ngs-panel-aside class=\"border-s border-s-muted w-[120px]\">\n      <div class=\"p-6\">Aside</div>\n    </ngs-panel-aside>\n    <ngs-panel-footer class=\"bg-surface-container-low flex items-center px-6\">Footer</ngs-panel-footer>\n  </ngs-panel>\n</div>"
        }
      ],
      "previewAsset": "projects/components/panel/preview.svg",
      "selectors": [
        "ngs-panel",
        "ngs-panel-aside",
        "ngs-panel-content",
        "ngs-panel-footer",
        "ngs-panel-header",
        "ngs-panel-sidebar",
        "ngs-panel-subheader"
      ],
      "exportedSymbols": [
        "Panel",
        "PANEL_CONTENT",
        "PanelAside",
        "PanelContent",
        "PanelContentInterface",
        "PanelFooter",
        "PanelHeader",
        "PanelSidebar",
        "PanelSubheader"
      ],
      "inputs": [
        "absolute",
        "autoHeight",
        "block",
        "flex"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-panel-footer-height",
        "--ngs-panel-header-height",
        "--ngs-panel-subheader-height"
      ],
      "example": null
    },
    {
      "name": "password-strength",
      "title": "Password Strength",
      "overviewName": "Password Strength",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/password-strength",
      "publicApi": "projects/components/password-strength/public-api.ts",
      "sourceRoot": "projects/components/password-strength/src",
      "docsPath": "/forms/password-strength",
      "docsOverviewSource": "projects/docs/src/app/forms/password-strength/overview/overview.html",
      "purpose": "Show real-time password strength feedback and requirement status while users create or change a password.",
      "useWhen": "Use PasswordStrength in signup, reset password, change password, account security, and credential setup forms. Use input type=\"password\" ngsInput inside one ngs-form-field for the actual password field, then place ngs-password-strength [password]=\"password.value\" below it for the strength bar. Use ngs-password-strength-info with a template reference to the strength component when users need to see requirement status for lowercase, uppercase, digit, special character, min length, or custom rules. Use ngs-pass-toggle-visibility as a suffix control inside the password form field when users need show/hide password behavior. Configure min, max, enableLengthRule, enableDigitRule, enableSpecialCharRule, and customValidator as needed, and listen to strengthChanged when the screen needs the score. Do not use PasswordStrength for OTP, MFA, invite codes, or passcodes; use PinInput. Do not use for generic text validation. Do not use for a login password field unless the user is creating or changing a password and strength feedback is useful. Do not rely on it as the only password security policy; backend validation is still required.",
      "exampleTopics": [
        "Basic password strength",
        "Password strength info",
        "Password toggle visibility"
      ],
      "minimalExample": "<div class=\"w-1/2\">\n  <ngs-form-field class=\"w-full\">\n    <ngs-label>Password</ngs-label>\n    <input type=\"password\" ngsInput [formControl]=\"password\" autocomplete=\"off\">\n  </ngs-form-field>\n  <ngs-password-strength [password]=\"password.value\" class=\"relative -top-4\"/>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-password-strength-example",
          "title": "Basic password strength",
          "file": "projects/docs/src/app/forms/password-strength/_examples/basic-password-strength-example/basic-password-strength-example.html",
          "source": "<div class=\"w-1/2\">\n  <ngs-form-field class=\"w-full\">\n    <ngs-label>Password</ngs-label>\n    <input type=\"password\" ngsInput [formControl]=\"password\" autocomplete=\"off\">\n  </ngs-form-field>\n  <ngs-password-strength [password]=\"password.value\" class=\"relative -top-4\"/>\n</div>"
        },
        {
          "name": "password-strength-info-example",
          "title": "Password strength info",
          "file": "projects/docs/src/app/forms/password-strength/_examples/password-strength-info-example/password-strength-info-example.html",
          "source": "<div class=\"w-1/2\">\n  <ngs-form-field class=\"w-full\">\n    <ngs-label>Password</ngs-label>\n    <input type=\"text\" ngsInput [formControl]=\"password\" autocomplete=\"off\">\n    <ngs-hint align=\"end\" aria-live=\"polite\">\n      {{ password.value?.length }} / 25\n    </ngs-hint>\n  </ngs-form-field>\n  <ngs-password-strength #passwordStrengthComponent [password]=\"password.value!\" />\n  <ngs-password-strength-info [passwordComponent]=\"passwordStrengthComponent\" />\n</div>"
        },
        {
          "name": "password-toggle-visibility-example",
          "title": "Password toggle visibility",
          "file": "projects/docs/src/app/forms/password-strength/_examples/password-toggle-visibility-example/password-toggle-visibility-example.html",
          "source": "<div class=\"w-1/2\">\n  <ngs-form-field class=\"w-full\">\n    <ngs-label>Password</ngs-label>\n    <ngs-pass-toggle-visibility #toggle ngsSuffix/>\n    <input [type]=\"toggle.type\" ngsInput [formControl]=\"password\" required autocomplete=\"off\">\n  </ngs-form-field>\n  <ngs-password-strength [password]=\"password.value!\" class=\"relative -top-4\"/>\n</div>"
        }
      ],
      "previewAsset": "projects/components/password-strength/preview.svg",
      "selectors": [
        "ngs-pass-toggle-visibility",
        "ngs-password-strength",
        "ngs-password-strength-info"
      ],
      "exportedSymbols": [
        "Colors",
        "Criteria",
        "PassToggleVisibility",
        "PasswordStrength",
        "PasswordStrengthInfo",
        "PasswordStrengthValidator",
        "RegExpValidator"
      ],
      "inputs": [
        "accentThreshold",
        "customCharsCriteriaMessage",
        "customValidator",
        "digitsCriteriaMessage",
        "enableDigitRule",
        "enableLengthRule",
        "enableLowerCaseLetterRule",
        "enableScoreInfo",
        "enableSpecialCharRule",
        "enableUpperCaseLetterRule",
        "externalError",
        "lowerCaseCriteriaMessage",
        "max",
        "min",
        "minCharsCriteriaMessage",
        "ngsIconDone",
        "ngsIconError",
        "password",
        "passwordComponent",
        "specialCharsCriteriaMessage",
        "tabindex",
        "upperCaseCriteriaMessage",
        "visible",
        "warnThreshold"
      ],
      "outputs": [
        "strengthChanged"
      ],
      "cssTokens": [
        "--ngs-color-danger",
        "--ngs-color-green-500",
        "--ngs-color-warning",
        "--ngs-progress-bar-active-indicator-color",
        "--ngs-progress-bar-active-indicator-height",
        "--ngs-progress-bar-track-height"
      ],
      "example": null
    },
    {
      "name": "pdf-viewer",
      "title": "Pdf Viewer",
      "overviewName": "PDF Viewer",
      "category": "libraries",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/pdf-viewer",
      "publicApi": "projects/components/pdf-viewer/public-api.ts",
      "sourceRoot": "projects/components/pdf-viewer/src",
      "docsPath": "/libraries/pdf-viewer",
      "docsOverviewSource": "projects/docs/src/app/libraries/pdf-viewer/overview/overview.html",
      "purpose": "Import PDF Viewer from &#64;ngstarter-ui/components/pdf-viewer .",
      "useWhen": "Choose Pdf Viewer when the workflow matches examples such as Basic pdf viewer.",
      "exampleTopics": [
        "Basic pdf viewer"
      ],
      "minimalExample": "<ngs-pdf-viewer\n  [src]=\"src()\"\n  [documentName]=\"documentName()\"\n  [wasmUrl]=\"wasmUrl\"\n  [showAnnotationsPanel]=\"true\"\n  [annotationsDataSource]=\"annotationsDataSource\"\n  class=\"pdf-viewer-example\">\n  <ng-template ngsPdfViewerAnnotation=\"risk\" let-annotation let-goToPage=\"goToPage\">\n    <article class=\"rounded-2xl border border-border bg-surface p-4 shadow-xs\">\n      <header class=\"flex items-start gap-3\">\n        <span class=\"flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-full bg-primary-container text-xs font-semibold text-on-primary-container\">\n          {{ annotation.avatarLabel || annotation.author.charAt(0) }}\n        </span>\n        <span class=\"min-w-0 flex-1\">\n          <span class=\"block truncate text-sm font-semibold text-on-surface\">{{ annotation.author }}</span>\n          @if (annotation.time) {\n            <span class=\"block truncate text-xs text-on-surface-variant\">{{ annotation.time }}</span>\n          }\n        </span>\n        <span class=\"rounded-full bg-surface-container-high px-2 py-1 text-xs font-medium tracking-normal text-on-surface-variant uppercase\">\n          Risk\n        </span>\n      </header>\n      <p class=\"mt-3 mb-0 text-base leading-relaxed text-on-surface\">{{ annotation.text }}</p>\n      <footer class=\"mt-4 flex items-center justify-between gap-2\">\n        <button\n          ngsButton=\"tonal\"\n          type=\"button\"\n          (click)=\"goToPage(annotation.pageNumber)\">\n          Page {{ annotation.pageNumber }}\n        </button>\n        <button ngsButton=\"text\" type=\"button\">\n          Reply\n        </button>\n      <\n...",
      "exampleFiles": [
        {
          "name": "basic-pdf-viewer-example",
          "title": "Basic pdf viewer",
          "file": "projects/docs/src/app/libraries/pdf-viewer/_examples/basic-pdf-viewer-example/basic-pdf-viewer-example.html",
          "source": "<ngs-pdf-viewer\n  [src]=\"src()\"\n  [documentName]=\"documentName()\"\n  [wasmUrl]=\"wasmUrl\"\n  [showAnnotationsPanel]=\"true\"\n  [annotationsDataSource]=\"annotationsDataSource\"\n  class=\"pdf-viewer-example\">\n  <ng-template ngsPdfViewerAnnotation=\"risk\" let-annotation let-goToPage=\"goToPage\">\n    <article class=\"rounded-2xl border border-border bg-surface p-4 shadow-xs\">\n      <header class=\"flex items-start gap-3\">\n        <span class=\"flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-full bg-primary-container text-xs font-semibold text-on-primary-container\">\n          {{ annotation.avatarLabel || annotation.author.charAt(0) }}\n        </span>\n        <span class=\"min-w-0 flex-1\">\n          <span class=\"block truncate text-sm font-semibold text-on-surface\">{{ annotation.author }}</span>\n          @if (annotation.time) {\n            <span class=\"block truncate text-xs text-on-surface-variant\">{{ annotation.time }}</span>\n          }\n        </span>\n        <span class=\"rounded-full bg-surface-container-high px-2 py-1 text-xs font-medium tracking-normal text-on-surface-variant uppercase\">\n          Risk\n        </span>\n      </header>\n      <p class=\"mt-3 mb-0 text-base leading-relaxed text-on-surface\">{{ annotation.text }}</p>\n      <footer class=\"mt-4 flex items-center justify-between gap-2\">\n        <button\n          ngsButton=\"tonal\"\n          type=\"button\"\n          (click)=\"goToPage(annotation.pageNumber)\">\n          Page {{ annotation.pageNumber }}\n        </button>\n        <button ngsButton=\"text\" type=\"button\">\n          Reply\n        </button>\n      <\n..."
        }
      ],
      "previewAsset": "projects/components/pdf-viewer/preview.svg",
      "selectors": [
        "[ngsPdfViewerAnnotation]",
        "[ngsPdfViewerAnnotationDef]",
        "ngs-pdf-viewer",
        "ngs-pdf-viewer-annotation-test-host",
        "ngs-pdf-viewer-annotations",
        "ngs-pdf-viewer-search"
      ],
      "exportedSymbols": [
        "PdfViewer",
        "PdfViewerAnnotationDataSource",
        "PdfViewerAnnotationDataSourceContext",
        "PdfViewerAnnotationDataSourceParams",
        "PdfViewerAnnotationDataSourceResult",
        "PdfViewerAnnotationDef",
        "PdfViewerAnnotations",
        "PdfViewerAnnotationTemplateContext",
        "PdfViewerAnnotationView",
        "PdfViewerAnnotationWhen",
        "PdfViewerEngineService",
        "PdfViewerLoadedEvent",
        "PdfViewerPageRenderedEvent",
        "PdfViewerPageView",
        "PdfViewerSearch",
        "PdfViewerSearchOptions",
        "PdfViewerSearchResultView",
        "PdfViewerSelectionRectView",
        "PdfViewerServerAnnotationDataSource",
        "PdfViewerSource",
        "PdfViewerTextGlyphView",
        "PdfViewerTextRectView",
        "PdfViewerThumbnailView"
      ],
      "inputs": [
        "annotationDefs",
        "annotations",
        "annotationsDataSource",
        "annotationTypeProperty",
        "documentName",
        "maxRenderDimension",
        "maxRenderPixels",
        "maxScale",
        "minScale",
        "ngsPdfViewerAnnotation",
        "ngsPdfViewerAnnotationDef",
        "ngsPdfViewerAnnotationWhen",
        "page",
        "query",
        "renderAll",
        "results",
        "scale",
        "searchQuery",
        "showAnnotationsPanel",
        "showPageList",
        "showSearchPanel",
        "showToolbar",
        "src",
        "wasmUrl",
        "withAnnotations",
        "withForms",
        "zoomStep"
      ],
      "outputs": [
        "closed",
        "error",
        "loaded",
        "pageChanged",
        "pageRendered",
        "pageSelected",
        "resultSelected",
        "searchChanged"
      ],
      "cssTokens": [
        "--ngs-color-primary",
        "--ngs-pdf-viewer-aside-width",
        "--ngs-pdf-viewer-height",
        "--ngs-pdf-viewer-min-height",
        "--ngs-pdf-viewer-page-gap",
        "--ngs-pdf-viewer-page-padding",
        "--ngs-pdf-viewer-sidebar-width",
        "--ngs-pdf-viewer-spread-gap"
      ],
      "example": null
    },
    {
      "name": "phone-input",
      "title": "Phone Input",
      "overviewName": "Phone Input",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/phone-input",
      "publicApi": "projects/components/phone-input/public-api.ts",
      "sourceRoot": "projects/components/phone-input/src",
      "docsPath": "/forms/phone-input",
      "docsOverviewSource": "projects/docs/src/app/forms/phone-input/overview/overview.html",
      "purpose": "Capture real phone numbers with country selection, flag, dial code, formatting, and libphonenumber-js validation.",
      "useWhen": "Use ngs-phone-input inside one ngs-form-field for profile, contact, billing, onboarding, checkout, support, invite, and contact forms when the value must be a real phone number. Use formControlName or ngModel, show invalidPhone with ngs-error, set defaultSelectedCountryCode when the initial country should not be us, use onlyCountries to restrict available countries, preferredCountries to pin common countries to the top, format=\"default | national | international\" for display formatting, and countryChanged when the screen needs to react to country changes. Do not use plain ngsInput, NumberInput, or InputMask for country-aware phone numbers. Do not use CountrySelect instead of PhoneInput; CountrySelect chooses a country but does not capture a phone number. Do not use for OTP, MFA, passcodes, or invite codes; use PinInput.",
      "exampleTopics": [
        "Basic phone input",
        "Phone input with custom country list",
        "Phone input with preferred country list",
        "Phone input only countries",
        "Phone input preferred countries"
      ],
      "minimalExample": "<form [formGroup]=\"form\">\n  <ngs-form-field class=\"w-1/2\">\n    <ngs-label>Phone</ngs-label>\n    <ngs-phone-input formControlName=\"phone\"/>\n    @if (form.get('phone')?.hasError('invalidPhone')) {\n      <ngs-error>Invalid phone</ngs-error>\n    }\n  </ngs-form-field>\n</form>\n<p>\n  Value: {{ form.value['phone'] }}\n</p>",
      "exampleFiles": [
        {
          "name": "basic-phone-input-example",
          "title": "Basic phone input",
          "file": "projects/docs/src/app/forms/phone-input/_examples/basic-phone-input-example/basic-phone-input-example.html",
          "source": "<form [formGroup]=\"form\">\n  <ngs-form-field class=\"w-1/2\">\n    <ngs-label>Phone</ngs-label>\n    <ngs-phone-input formControlName=\"phone\"/>\n    @if (form.get('phone')?.hasError('invalidPhone')) {\n      <ngs-error>Invalid phone</ngs-error>\n    }\n  </ngs-form-field>\n</form>\n<p>\n  Value: {{ form.value['phone'] }}\n</p>"
        },
        {
          "name": "phone-input-only-countries-example",
          "title": "Phone input only countries",
          "file": "projects/docs/src/app/forms/phone-input/_examples/phone-input-only-countries-example/phone-input-only-countries-example.html",
          "source": "<form [formGroup]=\"form\">\n  <ngs-form-field class=\"w-1/2\">\n    <ngs-label>Phone</ngs-label>\n    <ngs-phone-input formControlName=\"phone\" [onlyCountries]=\"['gb', 'us']\"/>\n    @if (form.get('phone')?.hasError('invalidPhone')) {\n      <ngs-error>Invalid phone</ngs-error>\n    }\n  </ngs-form-field>\n</form>\n<p>\n  Value: {{ form.value['phone'] }}\n</p>"
        },
        {
          "name": "phone-input-preferred-countries-example",
          "title": "Phone input preferred countries",
          "file": "projects/docs/src/app/forms/phone-input/_examples/phone-input-preferred-countries-example/phone-input-preferred-countries-example.html",
          "source": "<form [formGroup]=\"form\">\n  <ngs-form-field class=\"w-1/2\">\n    <ngs-label>Phone</ngs-label>\n    <ngs-phone-input formControlName=\"phone\" [preferredCountries]=\"['cn','it','pl']\"/>\n    @if (form.get('phone')?.hasError('invalidPhone')) {\n      <ngs-error>Invalid phone</ngs-error>\n    }\n  </ngs-form-field>\n</form>\n<p>\n  Value: {{ form.value['phone'] }}\n</p>"
        }
      ],
      "previewAsset": "projects/components/phone-input/preview.svg",
      "selectors": [
        "ngs-phone-input"
      ],
      "exportedSymbols": [
        "Country",
        "CountryCode",
        "PhoneInput",
        "PhoneNumberFormat",
        "phoneValidator",
        "SearchPipe"
      ],
      "inputs": [
        "autocomplete",
        "defaultSelectedCountryCode",
        "disabled",
        "errorStateMatcher",
        "format",
        "onlyCountries",
        "placeholder",
        "preferredCountries"
      ],
      "outputs": [
        "countryChanged"
      ],
      "cssTokens": [
        "--ngs-color-neutral-500",
        "--ngs-color-neutral-600",
        "--ngs-color-on-surface-variant",
        "--ngs-font-size-sm",
        "--ngs-phone-input-color",
        "--ngs-phone-input-flag-display",
        "--ngs-phone-input-opacity"
      ],
      "example": null
    },
    {
      "name": "pin-input",
      "title": "Pin Input",
      "overviewName": "Pin Input",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/pin-input",
      "publicApi": "projects/components/pin-input/public-api.ts",
      "sourceRoot": "projects/components/pin-input/src",
      "docsPath": "/forms/pin-input",
      "docsOverviewSource": "projects/docs/src/app/forms/pin-input/overview/overview.html",
      "purpose": "Capture short one-character-per-cell codes for verification and secure access flows.",
      "useWhen": "Use ngs-pin-input as a standalone form control for OTP, MFA, SMS or email verification codes, invite codes, passcodes, payment verification, and secure access codes. Use ngModel or formControlName, length for the number of cells, placeholder for the empty-cell hint, acceptOnly for allowed symbols with digits as the default, and disabled for disabled state. The component manages one-character cells and focus movement between them. Do not use PinInput for phone numbers; use PhoneInput. Do not use for creating or changing passwords; use ngsInput with PasswordStrength. Do not use for numeric settings or quantities; use NumberInput. Do not use for long codes, serial numbers, coupons, or arbitrary text; use a normal ngsInput. Do not wrap it in ngs-form-field as if it were a single text input; the component renders its own internal form fields.",
      "exampleTopics": [
        "Basic Pin Input",
        "Placeholder",
        "Custom Length",
        "Custom Symbols",
        "Pin input with placeholder",
        "Pin input length",
        "Pin input accept custom symbols"
      ],
      "minimalExample": "<ngs-pin-input [(ngModel)]=\"value\" class=\"mb-6\"/>\n<p>Value: {{ value || '-' }}</p>",
      "exampleFiles": [
        {
          "name": "basic-pin-input-example",
          "title": "Basic pin input",
          "file": "projects/docs/src/app/forms/pin-input/_examples/basic-pin-input-example/basic-pin-input-example.html",
          "source": "<ngs-pin-input [(ngModel)]=\"value\" class=\"mb-6\"/>\n<p>Value: {{ value || '-' }}</p>"
        },
        {
          "name": "pin-input-accept-custom-symbols-example",
          "title": "Pin input accept custom symbols",
          "file": "projects/docs/src/app/forms/pin-input/_examples/pin-input-accept-custom-symbols-example/pin-input-accept-custom-symbols-example.html",
          "source": "<ngs-pin-input [(ngModel)]=\"value\" [acceptOnly]=\"acceptOnly\" class=\"mb-6\"/>\n<p>Value: {{ value || '-' }}</p>"
        },
        {
          "name": "pin-input-length-example",
          "title": "Pin input length",
          "file": "projects/docs/src/app/forms/pin-input/_examples/pin-input-length-example/pin-input-length-example.html",
          "source": "<div class=\"flex flex-col gap-8\">\n  <ngs-pin-input length=\"3\"/>\n  <ngs-pin-input placeholder=\"⚬\" length=\"6\"/>\n  <ngs-pin-input placeholder=\"-\" length=\"10\"/>\n</div>"
        }
      ],
      "previewAsset": "projects/components/pin-input/preview.svg",
      "selectors": [
        "[ngsPinInput]",
        "ngs-pin-input"
      ],
      "exportedSymbols": [
        "PinInput",
        "PinInputDirective"
      ],
      "inputs": [
        "acceptOnly",
        "disabled",
        "index",
        "length",
        "placeholder"
      ],
      "outputs": [
        "valuePaste"
      ],
      "cssTokens": [
        "--ngs-form-field-input-text-align",
        "--ngs-form-field-width",
        "--ngs-pin-gap",
        "--ngs-pin-input-width"
      ],
      "example": null
    },
    {
      "name": "popover",
      "title": "Popover",
      "overviewName": "Popover",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/popover",
      "publicApi": "projects/components/popover/public-api.ts",
      "sourceRoot": "projects/components/popover/src",
      "docsPath": "/components/popover",
      "docsOverviewSource": "projects/docs/src/app/components/popover/overview/overview.html",
      "purpose": "Show lightweight contextual content in an overlay anchored to a trigger element.",
      "useWhen": "Use Popover for short details, previews, small interactive content, compact forms, and richer explanations that need more than a plain tooltip but do not require a modal workflow. Put ngsPopoverTriggerFor on the trigger element and point it to ngs-popover or a TemplateRef. Use trigger=\"click\" for explicit opening and trigger=\"hover\" only for preview-style content that can disappear safely. Use position for below/above/before/after placement. Use ngsPopoverContext with ngsPopoverContent for lazy content that needs trigger data. Use a raw TemplateRef only when the standard ngs-popover-panel wrapper should be replaced. Use hasBackdrop, closeOnOriginClick, closeOnOriginMouseLeave, and origin only when custom close or anchoring behavior is needed. Do not use Popover for command lists; use Menu. Do not use for short plain hints; use Tooltip. Do not use for modal workflows, confirmations, or complex forms; use Dialog or Confirm. Do not use for side panels; use Drawer. Do not use for form dropdowns; use Select, Autocomplete, Datepicker, or ColorPicker. Do not use low-level Overlay directly when Popover fits.",
      "exampleTopics": [
        "Basic Popover",
        "Show popover by hover",
        "Popover custom position",
        "Popover lazy content",
        "Popover with TemplateRef",
        "Popover hover",
        "Popover with custom position",
        "Popover template ref"
      ],
      "minimalExample": "<button ngsButton=\"outlined\" [ngsPopoverTriggerFor]=\"basicPopover\">Click me!</button>\n<ngs-popover #basicPopover=\"ngsPopover\">\n  <div class=\"text-sm p-4\">Some text content</div>\n</ngs-popover>",
      "exampleFiles": [
        {
          "name": "basic-popover-example",
          "title": "Basic popover",
          "file": "projects/docs/src/app/components/popover/_examples/basic-popover-example/basic-popover-example.html",
          "source": "<button ngsButton=\"outlined\" [ngsPopoverTriggerFor]=\"basicPopover\">Click me!</button>\n<ngs-popover #basicPopover=\"ngsPopover\">\n  <div class=\"text-sm p-4\">Some text content</div>\n</ngs-popover>"
        },
        {
          "name": "popover-hover-example",
          "title": "Popover hover",
          "file": "projects/docs/src/app/components/popover/_examples/popover-hover-example/popover-hover-example.html",
          "source": "<button ngsButton=\"outlined\" [ngsPopoverTriggerFor]=\"triggerHoverPopover\" trigger=\"hover\">Hover Me!</button>\n<ngs-popover #triggerHoverPopover=\"ngsPopover\">\n  <div class=\"text-sm p-4\">Some text content</div>\n</ngs-popover>"
        },
        {
          "name": "popover-lazy-content-example",
          "title": "Popover lazy content",
          "file": "projects/docs/src/app/components/popover/_examples/popover-lazy-content-example/popover-lazy-content-example.html",
          "source": "<button ngsButton=\"outlined\"\n        [ngsPopoverTriggerFor]=\"lazyPopover\"\n        [ngsPopoverContext]=\"{ name: 'Angular Developer' }\">\n  Open Lazy Popover\n</button>\n<ngs-popover #lazyPopover=\"ngsPopover\">\n  <ng-template ngsPopoverContent let-name=\"name\">\n    <div class=\"text-sm p-4\">\n      Hello, <strong>{{ name }}</strong>!<br>\n      This content was loaded lazily.\n    </div>\n  </ng-template>\n</ngs-popover>"
        }
      ],
      "previewAsset": "projects/components/popover/preview.svg",
      "selectors": [
        "[ngsPopoverContent]",
        "[ngsPopoverOrigin]",
        "[ngsPopoverTriggerFor]",
        "ngs-popover"
      ],
      "exportedSymbols": [
        "Popover",
        "POPOVER_TRIGGER",
        "PopoverContent",
        "PopoverOriginDirective",
        "PopoverPosition",
        "PopoverTrigger",
        "PopoverTriggerFor",
        "PopoverTriggerForDirective"
      ],
      "inputs": [
        "closeOnOriginClick",
        "closeOnOriginMouseLeave",
        "delay",
        "hasBackdrop",
        "ngsPopoverContext",
        "origin",
        "position",
        "trigger"
      ],
      "outputs": [
        "closed",
        "opened"
      ],
      "cssTokens": [
        "--ngs-dropdown-bg",
        "--ngs-dropdown-border",
        "--ngs-dropdown-radius",
        "--ngs-dropdown-shadow",
        "--ngs-popover-bg",
        "--ngs-popover-border",
        "--ngs-popover-border-radius",
        "--ngs-popover-margin",
        "--ngs-popover-shadow"
      ],
      "example": null
    },
    {
      "name": "progress-bar",
      "title": "Progress Bar",
      "overviewName": "Progress Bar",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/progress-bar",
      "publicApi": "projects/components/progress-bar/public-api.ts",
      "sourceRoot": "projects/components/progress-bar/src",
      "docsPath": "/components/progress-bar",
      "docsOverviewSource": "projects/docs/src/app/components/progress-bar/overview/overview.html",
      "purpose": "Show linear progress for an operation or process.",
      "useWhen": "Use ngs-progress-bar for uploads, downloads, imports, setup completion, sync, processing, form completion, buffering, and other horizontal progress states. Use mode=\"determinate\" with value from 0 to 100 when the percentage is known. Use mode=\"indeterminate\" when work is happening but the percentage is unknown. Use mode=\"buffer\" with value and bufferValue when both primary and buffered progress should be visible. Use mode=\"query\" while waiting before known progress starts. Use animationEnd only when the screen must react after the transition finishes. Do not use ProgressBar for Angular Router navigation; use PageLoadingBar. Do not use to block a whole area; use BlockLoader. Do not use for skeleton content loading; use Skeleton. Do not use for circular KPI or percent metrics; use Gauge. Do not use for mini trends or charts; use MicroChart. Do not use as a status label; use Badge or text.",
      "exampleTopics": [
        "Basic Progress Bar",
        "Intermediate Progress Bar",
        "Buffer Progress Bar",
        "Query Progress Bar"
      ],
      "minimalExample": "<ngs-progress-bar mode=\"determinate\" value=\"40\"/>",
      "exampleFiles": [
        {
          "name": "basic-progress-bar-example",
          "title": "Basic progress bar",
          "file": "projects/docs/src/app/components/progress-bar/_examples/basic-progress-bar-example/basic-progress-bar-example.html",
          "source": "<ngs-progress-bar mode=\"determinate\" value=\"40\"/>"
        },
        {
          "name": "buffer-progress-bar-example",
          "title": "Buffer progress bar",
          "file": "projects/docs/src/app/components/progress-bar/_examples/buffer-progress-bar-example/buffer-progress-bar-example.html",
          "source": "<div class=\"flex flex-col gap-4\">\n  <ngs-progress-bar mode=\"buffer\" [value]=\"value\" [bufferValue]=\"bufferValue\"/>\n  <div class=\"flex gap-2\">\n    <span>Value: {{value}}</span>\n    <input type=\"range\" [(ngModel)]=\"value\" min=\"0\" max=\"100\">\n  </div>\n  <div class=\"flex gap-2\">\n    <span>Buffer: {{bufferValue}}</span>\n    <input type=\"range\" [(ngModel)]=\"ngModelBufferValue\" min=\"0\" max=\"100\">\n  </div>\n</div>"
        },
        {
          "name": "intermediate-progress-bar-example",
          "title": "Intermediate progress bar",
          "file": "projects/docs/src/app/components/progress-bar/_examples/intermediate-progress-bar-example/intermediate-progress-bar-example.html",
          "source": "<ngs-progress-bar mode=\"indeterminate\"/>"
        }
      ],
      "previewAsset": "projects/components/progress-bar/preview.svg",
      "selectors": [
        "ngs-progress-bar"
      ],
      "exportedSymbols": [
        "ProgressBar",
        "ProgressBarMode"
      ],
      "inputs": [
        "bufferValue",
        "color",
        "mode",
        "value"
      ],
      "outputs": [
        "animationEnd"
      ],
      "cssTokens": [
        "--ngs-color-primary",
        "--ngs-color-surface-container-highest",
        "--ngs-progress-bar-animation-multiplier",
        "--ngs-progress-bar-height",
        "--ngs-progress-bar-indicator-color",
        "--ngs-progress-bar-track-color"
      ],
      "example": null
    },
    {
      "name": "radio",
      "title": "Radio",
      "overviewName": "Radio",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/radio",
      "publicApi": "projects/components/radio/public-api.ts",
      "sourceRoot": "projects/components/radio/src",
      "docsPath": "/forms/radio",
      "docsOverviewSource": "projects/docs/src/app/forms/radio/overview/overview.html",
      "purpose": "Let users choose exactly one option from a small visible set of mutually exclusive choices.",
      "useWhen": "Use ngs-radio-group with ngs-radio-button for simple text options in forms, settings, filters, and preference screens where all options should be visible and the user can choose only one. Put value on each radio button and bind the group value with value, ngModel, or formControlName. Use name when native form grouping matters, disabled on the group or individual radio button when needed, and change when the screen must react to selection changes. Do not use Radio for multiple selection; use Checkbox. Do not use for long option lists; use Select or Autocomplete. Do not use for rich options with descriptions, icons, or large clickable blocks; use RadioCard. Do not use as a segmented view switcher; use Segmented or ButtonToggle. Do not use for yes/no boolean settings when SlideToggle or Checkbox better matches the meaning.",
      "exampleTopics": [
        "Basic Radios",
        "Radio Orientation",
        "Radio Card",
        "Basic radio"
      ],
      "minimalExample": "<ngs-radio-group aria-label=\"Select an option\">\n  <ngs-radio-button value=\"1\">Option 1</ngs-radio-button>\n  <ngs-radio-button value=\"2\">Option 2</ngs-radio-button>\n</ngs-radio-group>",
      "exampleFiles": [
        {
          "name": "basic-radio-example",
          "title": "Basic radio",
          "file": "projects/docs/src/app/forms/radio/_examples/basic-radio-example/basic-radio-example.html",
          "source": "<ngs-radio-group aria-label=\"Select an option\">\n  <ngs-radio-button value=\"1\">Option 1</ngs-radio-button>\n  <ngs-radio-button value=\"2\">Option 2</ngs-radio-button>\n</ngs-radio-group>"
        },
        {
          "name": "radio-card-example",
          "title": "Radio card",
          "file": "projects/docs/src/app/forms/radio/_examples/radio-card-example/radio-card-example.html",
          "source": "<form [formGroup]=\"form\">\n  <ngs-radio-card-group formControlName=\"privacy\" class=\"grid-cols-12\">\n    <ngs-radio-card value=\"open\" class=\"col-span-6\">\n      <ngs-radio-card-title>\n        <ngs-icon name=\"fluent:globe-24-regular\"/>\n        Open\n      </ngs-radio-card-title>\n      <ngs-radio-card-content>\n        Posts and community members are public and visible to search engines.\n      </ngs-radio-card-content>\n    </ngs-radio-card>\n    <ngs-radio-card value=\"closed\" class=\"col-span-6\">\n      <ngs-radio-card-title>\n        <ngs-icon name=\"fluent:lock-closed-24-regular\"/>\n        Closed\n      </ngs-radio-card-title>\n      <ngs-radio-card-content>\n        Only members can view community members and posts. Content is not visible to search engines.\n      </ngs-radio-card-content>\n    </ngs-radio-card>\n  </ngs-radio-card-group>\n</form>\n<div class=\"mt-10\">\n  <p>\n    <button ngsButton=\"filled\" (click)=\"toggleDisabled()\">\n      {{ form.get('privacy')?.disabled ? 'Enable' : 'Disable' }} Control\n    </button>\n  </p>\n  <p>Control value: {{ form.get('privacy')?.value }}</p>\n</div>"
        },
        {
          "name": "radio-orientation-example",
          "title": "Radio orientation",
          "file": "projects/docs/src/app/forms/radio/_examples/radio-orientation-example/radio-orientation-example.html",
          "source": "<div class=\"grid gap-8 md:grid-cols-2\">\n  <div class=\"flex flex-col gap-4\">\n    <h4 class=\"text-sm font-medium\">Vertical</h4>\n    <ngs-radio-group orientation=\"vertical\" aria-label=\"Notification frequency\">\n      <ngs-radio-button value=\"instant\">Instant</ngs-radio-button>\n      <ngs-radio-button value=\"daily\">Daily summary</ngs-radio-button>\n      <ngs-radio-button value=\"weekly\">Weekly digest</ngs-radio-button>\n    </ngs-radio-group>\n  </div>\n  <div class=\"flex flex-col gap-4\">\n    <h4 class=\"text-sm font-medium\">Horizontal</h4>\n    <ngs-radio-group orientation=\"horizontal\" aria-label=\"Billing cycle\">\n      <ngs-radio-button value=\"monthly\">Monthly</ngs-radio-button>\n      <ngs-radio-button value=\"annual\">Annual</ngs-radio-button>\n    </ngs-radio-group>\n  </div>\n</div>"
        }
      ],
      "previewAsset": "projects/components/radio/preview.svg",
      "selectors": [
        "ngs-radio-button",
        "ngs-radio-group"
      ],
      "exportedSymbols": [
        "RadioButton",
        "RadioGroup",
        "RadioGroupOrientation"
      ],
      "inputs": [
        "checked",
        "disabled",
        "id",
        "name",
        "orientation",
        "value"
      ],
      "outputs": [
        "change"
      ],
      "cssTokens": [
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-primary",
        "--ngs-field-border-color",
        "--ngs-radio-button-border-width",
        "--ngs-radio-button-checked-color",
        "--ngs-radio-button-disabled-color",
        "--ngs-radio-button-disabled-label-color",
        "--ngs-radio-button-gap",
        "--ngs-radio-button-inner-circle-size",
        "--ngs-radio-button-label-color",
        "--ngs-radio-button-size",
        "--ngs-radio-button-unchecked-color",
        "--ngs-radio-group-gap"
      ],
      "example": null
    },
    {
      "name": "radio-card",
      "title": "Radio Card",
      "overviewName": "Radio Card",
      "category": null,
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/radio-card",
      "publicApi": "projects/components/radio-card/public-api.ts",
      "sourceRoot": "projects/components/radio-card/src",
      "docsPath": null,
      "docsOverviewSource": null,
      "purpose": "Let users choose exactly one option from a small set of rich card-like choices.",
      "useWhen": "Use ngs-radio-card-group as a form control group and ngs-radio-card for each option when every option needs a large clickable card with title, icon, description, or supporting content. Use ngs-radio-card-title for the option name and optional icon, ngs-radio-card-content for details, value on each card, and formControlName or ngModel on the group. Use TailwindCSS grid or flex around the group to lay cards out in columns or rows. Good for plan selection, privacy modes, template choices, payment methods, layout options, delivery methods, onboarding choices, and settings choices with explanation. Do not use for simple short text options; use Radio. Do not use for multiple selection; use Checkbox or a dedicated checkbox-card pattern when available. Do not use for long lists; use Select or Autocomplete. Do not use as a normal content card without selection; use Card. Do not use as a segmented mode switch; use Segmented or ButtonToggle.",
      "exampleTopics": [],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/radio-card/preview.svg",
      "selectors": [
        "ngs-radio-card",
        "ngs-radio-card-content",
        "ngs-radio-card-group",
        "ngs-radio-card-title"
      ],
      "exportedSymbols": [
        "RadioCard",
        "RadioCardContent",
        "RadioCardGroup",
        "RadioCardTitle"
      ],
      "inputs": [
        "value"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-border",
        "--ngs-color-neutral-600",
        "--ngs-color-primary",
        "--ngs-color-primary-100",
        "--ngs-font-size-sm",
        "--ngs-radio-card-border-radius",
        "--ngs-radio-card-color-border-hover",
        "--ngs-radio-card-color-selected-bg",
        "--ngs-radio-card-color-selected-border",
        "--ngs-radio-card-content-color",
        "--ngs-radio-card-content-font-size",
        "--ngs-radio-card-group-gap",
        "--ngs-radio-card-padding",
        "--ngs-radio-card-title-font-size",
        "--ngs-radio-card-title-gap",
        "--ngs-radio-card-transition",
        "--ngs-radius-xl"
      ],
      "example": null
    },
    {
      "name": "rail-nav",
      "title": "Rail Nav",
      "overviewName": "Rail Navigation",
      "category": "navigation",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/rail-nav",
      "publicApi": "projects/components/rail-nav/public-api.ts",
      "sourceRoot": "projects/components/rail-nav/src",
      "docsPath": "/navigation/rail-nav",
      "docsOverviewSource": "projects/docs/src/app/navigation/rail-nav/overview/overview.html",
      "purpose": "Provide a compact vertical navigation rail with icons and short labels.",
      "useWhen": "Use ngs-rail-nav when an app or workspace shell needs compact vertical navigation but there is not enough space for a full sidebar. Use ngs-rail-nav-item or [ngs-rail-nav-item] for destinations, ngsRailNavItemIcon for icons, key on each item, activeKey on the rail, and railNav.api.isActive(key) when the active item should change icon or styling. Good for narrow editor or workspace navigation, secondary product navigation, compact admin shells, and switching between primary sections. Do not use when you need a full sidebar with groups, nested navigation, or supporting content; use Sidebar or Sidenav. Do not use inside ngs-sidebar because Sidebar has its own navigation. Do not use for normal section navigation in content; use Navigation. Do not use for tabs, breadcrumbs, menu actions, segmented controls, or one-off icon buttons.",
      "exampleTopics": [
        "Basic rail navigation",
        "Rail navigation customization",
        "Basic rail nav",
        "Rail nav customization"
      ],
      "minimalExample": "<ngs-rail-nav #railNav activeKey=\"fonts\">\n  <button key=\"fonts\" ngs-rail-nav-item>\n    <ngs-icon name=\"fluent:text-font-size-24-regular\" ngsRailNavItemIcon\n              [class.filled]=\"railNav.api.isActive('fonts')\"/>\n    Fonts\n  </button>\n  <button key=\"noto\" ngs-rail-nav-item>\n    <ngs-icon name=\"fluent:globe-24-regular\" ngsRailNavItemIcon\n              [class.filled]=\"railNav.api.isActive('noto')\"/>\n    Noto\n  </button>\n  <button key=\"icons\" ngs-rail-nav-item>\n    <ngs-icon name=\"fluent:star-24-regular\" ngsRailNavItemIcon\n              [class.filled]=\"railNav.api.isActive('icons')\"/>\n    Icons\n  </button>\n  <button key=\"knowlenge\" ngs-rail-nav-item>\n    <ngs-icon name=\"fluent:hat-graduation-24-regular\" ngsRailNavItemIcon\n              [class.filled]=\"railNav.api.isActive('knowlenge')\"/>\n    Knowlenge\n  </button>\n</ngs-rail-nav>",
      "exampleFiles": [
        {
          "name": "basic-rail-nav-example",
          "title": "Basic rail nav",
          "file": "projects/docs/src/app/navigation/rail-nav/_examples/basic-rail-nav-example/basic-rail-nav-example.html",
          "source": "<ngs-rail-nav #railNav activeKey=\"fonts\">\n  <button key=\"fonts\" ngs-rail-nav-item>\n    <ngs-icon name=\"fluent:text-font-size-24-regular\" ngsRailNavItemIcon\n              [class.filled]=\"railNav.api.isActive('fonts')\"/>\n    Fonts\n  </button>\n  <button key=\"noto\" ngs-rail-nav-item>\n    <ngs-icon name=\"fluent:globe-24-regular\" ngsRailNavItemIcon\n              [class.filled]=\"railNav.api.isActive('noto')\"/>\n    Noto\n  </button>\n  <button key=\"icons\" ngs-rail-nav-item>\n    <ngs-icon name=\"fluent:star-24-regular\" ngsRailNavItemIcon\n              [class.filled]=\"railNav.api.isActive('icons')\"/>\n    Icons\n  </button>\n  <button key=\"knowlenge\" ngs-rail-nav-item>\n    <ngs-icon name=\"fluent:hat-graduation-24-regular\" ngsRailNavItemIcon\n              [class.filled]=\"railNav.api.isActive('knowlenge')\"/>\n    Knowlenge\n  </button>\n</ngs-rail-nav>"
        },
        {
          "name": "rail-nav-customization-example",
          "title": "Rail nav customization",
          "file": "projects/docs/src/app/navigation/rail-nav/_examples/rail-nav-customization-example/rail-nav-customization-example.html",
          "source": "<div class=\"flex gap-10\">\n  <ngs-rail-nav #railNav1 activeKey=\"fonts\" class=\"style-vibrant\">\n    <button key=\"fonts\" ngs-rail-nav-item>\n      <ngs-icon name=\"fluent:text-font-size-24-regular\" ngsRailNavItemIcon\n                [class.filled]=\"railNav1.api.isActive('fonts')\"/>\n      Fonts\n    </button>\n    <button key=\"noto\" ngs-rail-nav-item>\n      <ngs-icon name=\"fluent:globe-24-regular\" ngsRailNavItemIcon\n                [class.filled]=\"railNav1.api.isActive('noto')\"/>\n      Noto\n    </button>\n    <button key=\"icons\" ngs-rail-nav-item>\n      <ngs-icon name=\"fluent:star-24-regular\" ngsRailNavItemIcon\n                [class.filled]=\"railNav1.api.isActive('icons')\"/>\n      Icons\n    </button>\n    <button key=\"knowlenge\" ngs-rail-nav-item>\n      <ngs-icon name=\"fluent:hat-graduation-24-regular\" ngsRailNavItemIcon\n                [class.filled]=\"railNav1.api.isActive('knowlenge')\"/>\n      Knowlenge\n    </button>\n  </ngs-rail-nav>\n  <ngs-rail-nav #railNav2 activeKey=\"noto\" class=\"style-ocean\">\n    <button key=\"fonts\" ngs-rail-nav-item>\n      <ngs-icon name=\"fluent:text-font-size-24-regular\" ngsRailNavItemIcon\n                [class.filled]=\"railNav2.api.isActive('fonts')\"/>\n      Fonts\n    </button>\n    <button key=\"noto\" ngs-rail-nav-item>\n      <ngs-icon name=\"fluent:globe-24-regular\" ngsRailNavItemIcon\n                [class.filled]=\"railNav2.api.isActive('noto')\"/>\n      Noto\n    </button>\n    <button key=\"icons\" ngs-rail-nav-item>\n      <ngs-icon name=\"fluent:star-24-regular\" ngsRailNavItemIcon\n                [class.filled]=\"railNav2.api.isActive('icons')\"/>\n      Icons\n..."
        }
      ],
      "previewAsset": "projects/components/rail-nav/preview.svg",
      "selectors": [
        "[ngs-rail-nav-item]",
        "[ngsRailNavItemIcon]",
        "ngs-rail-nav",
        "ngs-rail-nav-item"
      ],
      "exportedSymbols": [
        "RAIL_NAV",
        "RailNav",
        "RailNavAPI",
        "RailNavComponent",
        "RailNavItem",
        "RailNavItemIconDirective"
      ],
      "inputs": [
        "activeKey",
        "key"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-font-size-xs",
        "--ngs-icon-color",
        "--ngs-nav-item-active-bg",
        "--ngs-nav-item-active-color",
        "--ngs-nav-item-active-icon-color",
        "--ngs-nav-item-color",
        "--ngs-nav-item-hover-bg",
        "--ngs-nav-item-icon-color",
        "--ngs-nav-items-gap",
        "--ngs-radius-full",
        "--ngs-rail-nav-bg",
        "--ngs-rail-nav-bg-item-active-color",
        "--ngs-rail-nav-bg-item-color",
        "--ngs-rail-nav-bg-item-icon-active-bg",
        "--ngs-rail-nav-bg-item-icon-color",
        "--ngs-rail-nav-bg-item-icon-hover-bg",
        "--ngs-rail-nav-bg-item-icon-is-active-active-bg",
        "--ngs-rail-nav-bg-item-icon-is-active-bg",
        "--ngs-rail-nav-bg-item-icon-is-active-color",
        "--ngs-rail-nav-gap",
        "--ngs-rail-nav-item-gap",
        "--ngs-rail-nav-item-icon-padding",
        "--ngs-rail-nav-item-icon-radius",
        "--ngs-rail-nav-label-font-size",
        "--ngs-rail-nav-padding",
        "--ngs-rail-nav-width"
      ],
      "example": null
    },
    {
      "name": "resizable-container",
      "title": "Resizable Container",
      "overviewName": "Resizable Container",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/resizable-container",
      "publicApi": "projects/components/resizable-container/public-api.ts",
      "sourceRoot": "projects/components/resizable-container/src",
      "docsPath": "/components/resizable-container",
      "docsOverviewSource": "projects/docs/src/app/components/resizable-container/overview/overview.html",
      "purpose": "Let users manually resize the width of one container with a vertical drag handle.",
      "useWhen": "Use ngs-resizable-container around content when the user should manually adjust the width of a single block. Good for resizable preview panes, editor canvas or containers, inspector or detail panels, side content areas, responsive demo areas, chart previews, and docs playgrounds. Use minWidth for the minimum allowed width, resized to persist or synchronize the new width, and TailwindCSS classes for border, height, initial width, layout, and inner content. Do not use as a full split layout between two panels; use Split or a dedicated splitter when available. Do not use for image resizing; use ImageResizer. Do not use for table or DataView column resizing; use the table/DataView resizing feature. Do not use as a normal responsive container when users should not manually resize it; use TailwindCSS responsive utilities or container queries. Do not use for Drawer or Sidebar resizing when those components own their sizing model.",
      "exampleTopics": [
        "Basic Resizable Container"
      ],
      "minimalExample": "<ngs-resizable-container minWidth=\"400\" class=\"border border-muted rounded-xl @container\">\n  <div class=\"p-6\">\n    <div class=\"grid grid-cols-1 @xl:grid-cols-2 @4xl:grid-cols-4 gap-4 text-white text-sm\n              text-center font-bold leading-6 bg-stripes-fuchsia rounded-xl\">\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">01</div>\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">02</div>\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">03</div>\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">04</div>\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">05</div>\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">06</div>\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">07</div>\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">08</div>\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">09</div>\n    </div>\n  </div>\n</ngs-resizable-container>",
      "exampleFiles": [
        {
          "name": "basic-resizable-container-example",
          "title": "Basic resizable container",
          "file": "projects/docs/src/app/components/resizable-container/_examples/basic-resizable-container-example/basic-resizable-container-example.html",
          "source": "<ngs-resizable-container minWidth=\"400\" class=\"border border-muted rounded-xl @container\">\n  <div class=\"p-6\">\n    <div class=\"grid grid-cols-1 @xl:grid-cols-2 @4xl:grid-cols-4 gap-4 text-white text-sm\n              text-center font-bold leading-6 bg-stripes-fuchsia rounded-xl\">\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">01</div>\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">02</div>\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">03</div>\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">04</div>\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">05</div>\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">06</div>\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">07</div>\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">08</div>\n      <div class=\"p-4 rounded-xl shadow-lg bg-fuchsia-500\">09</div>\n    </div>\n  </div>\n</ngs-resizable-container>"
        }
      ],
      "previewAsset": "projects/components/resizable-container/preview.svg",
      "selectors": [
        "ngs-resizable-container"
      ],
      "exportedSymbols": [
        "ResizableContainer"
      ],
      "inputs": [
        "minWidth"
      ],
      "outputs": [
        "resized"
      ],
      "cssTokens": [
        "--ngs-color-secondary",
        "--ngs-color-surface-container-highest"
      ],
      "example": null
    },
    {
      "name": "screen-loader",
      "title": "Screen Loader",
      "overviewName": "Screen Loader",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/screen-loader",
      "publicApi": "projects/components/screen-loader/public-api.ts",
      "sourceRoot": "projects/components/screen-loader/src",
      "docsPath": "/components/screen-loader",
      "docsOverviewSource": "projects/docs/src/app/components/screen-loader/overview/overview.html",
      "purpose": "Show a full-screen blocking loading state for large global operations.",
      "useWhen": "Use ScreenLoader when the user must wait and should not interact with the app: initial app load, major route or page data loading, account switching, tenant switching, auth or session restore, heavy backend tasks, and large global operations. Prefer ScreenLoaderService.open(messageOrTemplate) for programmatic full-screen overlays, keep the returned ScreenLoaderRef, and always call ref.close() when the operation finishes. Use afterOpened() and afterClosed() only for side effects. Use ngs-screen-loader with opened and message only when the open state is controlled directly in a template. message can be a short string or TemplateRef. Do not use ScreenLoader for local block, card, table, or form loading; use BlockLoader, Skeleton, ProgressSpinner, ProgressBar, or component-specific loading states. Do not use for route navigation progress; use PageLoadingBar. Do not use for known percentage progress; use ProgressBar. Do not leave a service-opened loader without closing its ref.",
      "exampleTopics": [
        "Basic screen loader"
      ],
      "minimalExample": "<button ngsButton=\"filled\" (click)=\"openScreenLoader()\">Open screen loader</button>",
      "exampleFiles": [
        {
          "name": "basic-screen-loader-example",
          "title": "Basic screen loader",
          "file": "projects/docs/src/app/components/screen-loader/_examples/basic-screen-loader-example/basic-screen-loader-example.html",
          "source": "<button ngsButton=\"filled\" (click)=\"openScreenLoader()\">Open screen loader</button>"
        }
      ],
      "previewAsset": "projects/components/screen-loader/preview.svg",
      "selectors": [
        "ngs-screen-loader"
      ],
      "exportedSymbols": [
        "ScreenLoader",
        "ScreenLoaderRef",
        "ScreenLoaderService"
      ],
      "inputs": [
        "opened"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-background",
        "--ngs-screen-loader-bg"
      ],
      "example": null
    },
    {
      "name": "scroll-spy",
      "title": "Scroll Spy",
      "overviewName": "Scroll Spy",
      "category": null,
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/scroll-spy",
      "publicApi": "projects/components/scroll-spy/public-api.ts",
      "sourceRoot": "projects/components/scroll-spy/src",
      "docsPath": null,
      "docsOverviewSource": null,
      "purpose": "Provide in-page navigation for sections inside a long scrollable page or local scroll container.",
      "useWhen": "Use ScrollSpy when a long page or panel has stable section ids and needs a table-of-contents style navigation that highlights the active section while scrolling and smooth-scrolls to sections on click. Use ngs-scroll-spy-nav as the nav container, ngs-scroll-spy-on with targetId matching a section id, ngs-scroll-spy-title for the nav heading, and ngs-scroll-spy-back-to-top for a top shortcut. It uses ngs-layout-content or ngs-panel-content as the scroll container when present, otherwise document body. Good for docs pages, long settings pages, profile or detail pages with many sections, policy/help pages, long form review pages, and article-like admin pages. Do not use for primary product navigation; use Navigation, Sidebar, Sidenav, or RailNav. Do not use for tabs between views; use Tabs. Do not use for route breadcrumbs; use Breadcrumbs. Do not use for wizard steps; use Stepper or HeadlessStepper. Do not use on short pages without real scrolling or without stable section ids.",
      "exampleTopics": [],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/scroll-spy/preview.svg",
      "selectors": [
        "[ngs-scroll-spy-back-to-top]",
        "[ngs-scroll-spy-nav]",
        "[ngs-scroll-spy-on]",
        "[ngs-scroll-spy-title]",
        "[ngsScrollSpyContainer]",
        "ngs-scroll-spy-back-to-top",
        "ngs-scroll-spy-nav",
        "ngs-scroll-spy-on",
        "ngs-scroll-spy-title"
      ],
      "exportedSymbols": [
        "SCROLL_SPY_NAV",
        "ScrollSpyBackToTop",
        "ScrollSpyContainerDirective",
        "ScrollSpyNav",
        "ScrollSpyOn",
        "ScrollSpyTitle"
      ],
      "inputs": [
        "targetId"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-primary",
        "--ngs-color-subtle",
        "--ngs-font-size-sm",
        "--ngs-font-size-xl",
        "--ngs-icon-size"
      ],
      "example": null
    },
    {
      "name": "scrollbar-area",
      "title": "Scrollbar Area",
      "overviewName": "Scrollbar Area",
      "category": null,
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/scrollbar-area",
      "publicApi": "projects/components/scrollbar-area/public-api.ts",
      "sourceRoot": "projects/components/scrollbar-area/src",
      "docsPath": null,
      "docsOverviewSource": null,
      "purpose": "Provide a styled scroll container for bounded UI regions.",
      "useWhen": "Use ngs-scrollbar-area when a sized panel, grid body, editor sidebar, asset list, menu, or similar surface needs consistent NgStarter scrollbars instead of native browser scrollbars. It hides native scrollbars, renders vertical and horizontal thumbs, supports auto-hide, thumb dragging, resize and mutation tracking, scrollbarWidth, autoHide, absolute fill mode, and scrolled output. Use [absolute]=\"true\" when the scroll area should fill a positioned parent region such as ngs-panel-content or a DataView viewport; make sure the parent already has a stable height and width. Do not use as a generic layout wrapper, spacing helper, page-level replacement for normal browser scrolling, carousel or scroll-snap component, virtualization engine, or a workaround for missing parent sizing.",
      "exampleTopics": [],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/scrollbar-area/preview.svg",
      "selectors": [
        "[ngsScrollContainerFixed]",
        "ngs-scrollbar-area"
      ],
      "exportedSymbols": [
        "ScrollbarArea",
        "ScrollContainerFixed"
      ],
      "inputs": [
        "absolute",
        "autoHide",
        "ngsScrollContainerFixed",
        "ngsScrollContainerFixedBottomOffset",
        "ngsScrollContainerFixedMinHeight",
        "scrollbarWidth"
      ],
      "outputs": [
        "scrolled"
      ],
      "cssTokens": [
        "--ngs-color-neutral-200",
        "--ngs-color-neutral-300",
        "--ngs-radius-sm",
        "--ngs-scrollbar-area-scroll-track-bg",
        "--ngs-scrollbar-area-thumb-active-bg",
        "--ngs-scrollbar-area-thumb-bg",
        "--ngs-scrollbar-area-thumb-hover-bg",
        "--ngs-scrollbar-area-width"
      ],
      "example": null
    },
    {
      "name": "segmented",
      "title": "Segmented",
      "overviewName": "Segmented",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/segmented",
      "publicApi": "projects/components/segmented/public-api.ts",
      "sourceRoot": "projects/components/segmented/src",
      "docsPath": "/forms/segmented",
      "docsOverviewSource": "projects/docs/src/app/forms/segmented/overview/overview.html",
      "purpose": "Let users choose one value from a compact set of mutually exclusive modes or options.",
      "useWhen": "Use ngs-segmented with ngs-segmented-button when a short set of options should stay visible and only one value can be selected. Good for view modes, time ranges, display density, selection mode, chart or table mode, compact filters, and short settings. It works as an Angular form control through value, valueChange, ngModel, or formControlName, supports disabled state, sizes, text buttons, icons with ngsSegmentedIcon, and iconOnly buttons. Do not use Segmented for route or page navigation; use Tabs, Navigation, Sidebar, Sidenav, or RailNav. Do not use for independent on/off toggles; use ButtonToggle or SlideToggle. Do not use for long lists, rich option cards, dropdown choices, or fixed color palettes; use Radio, RadioCard, Select, Autocomplete, or ColorSwitcher.",
      "exampleTopics": [
        "Basic segmented control",
        "Segmented control sizes",
        "Segmented control disabled",
        "Segmented control with icons",
        "Segmented control with icons only",
        "Segmented control with FormControl",
        "Segmented control with ngModel",
        "Basic segmented",
        "Segmented sizes",
        "Segmented disabled",
        "Segmented with icons",
        "Segmented icons only",
        "Segmented form control",
        "Segmented ng model"
      ],
      "minimalExample": "<ngs-segmented [(ngModel)]=\"period\">\n  <button ngs-segmented-button value=\"daily\">Daily</button>\n  <button ngs-segmented-button value=\"weekly\">Weekly</button>\n  <button ngs-segmented-button value=\"monthly\">Monthly</button>\n</ngs-segmented>\n<div class=\"mt-6\">Selected value: {{ period }}</div>",
      "exampleFiles": [
        {
          "name": "basic-segmented-example",
          "title": "Basic segmented",
          "file": "projects/docs/src/app/forms/segmented/_examples/basic-segmented-example/basic-segmented-example.html",
          "source": "<ngs-segmented [(ngModel)]=\"period\">\n  <button ngs-segmented-button value=\"daily\">Daily</button>\n  <button ngs-segmented-button value=\"weekly\">Weekly</button>\n  <button ngs-segmented-button value=\"monthly\">Monthly</button>\n</ngs-segmented>\n<div class=\"mt-6\">Selected value: {{ period }}</div>"
        },
        {
          "name": "segmented-disabled-example",
          "title": "Segmented disabled",
          "file": "projects/docs/src/app/forms/segmented/_examples/segmented-disabled-example/segmented-disabled-example.html",
          "source": "<div class=\"flex flex-col gap-8\">\n  <ngs-segmented value=\"daily\">\n    <button ngs-segmented-button value=\"daily\" disabled>Daily</button>\n    <button ngs-segmented-button value=\"weekly\" disabled>Weekly</button>\n    <button ngs-segmented-button value=\"monthly\" disabled>Monthly</button>\n  </ngs-segmented>\n  <ngs-segmented value=\"daily\">\n    <button ngs-segmented-button value=\"daily\" disabled>Daily</button>\n    <button ngs-segmented-button value=\"weekly\">Weekly</button>\n    <button ngs-segmented-button value=\"monthly\">Monthly</button>\n  </ngs-segmented>\n</div>"
        },
        {
          "name": "segmented-form-control-example",
          "title": "Segmented form control",
          "file": "projects/docs/src/app/forms/segmented/_examples/segmented-form-control-example/segmented-form-control-example.html",
          "source": "<div class=\"flex flex-col gap-4\">\n  <ngs-segmented [formControl]=\"segmentedControl\">\n    <ngs-segmented-button value=\"daily\">Daily</ngs-segmented-button>\n    <ngs-segmented-button value=\"weekly\">Weekly</ngs-segmented-button>\n    <ngs-segmented-button value=\"monthly\">Monthly</ngs-segmented-button>\n    <ngs-segmented-button value=\"yearly\">Yearly</ngs-segmented-button>\n  </ngs-segmented>\n  <div class=\"text-sm text-neutral-600\">\n    Selected value: <strong>{{ segmentedControl.value }}</strong>\n  </div>\n  <button\n    ngsButton=\"filled\"\n    (click)=\"segmentedControl.setValue('monthly')\"\n  >\n    Set Monthly\n  </button>\n</div>"
        }
      ],
      "previewAsset": "projects/components/segmented/preview.svg",
      "selectors": [
        "[ngs-segmented-button]",
        "[ngsSegmentedIcon]",
        "ngs-segmented",
        "ngs-segmented-button"
      ],
      "exportedSymbols": [
        "Segmented",
        "SEGMENTED",
        "SegmentedButton",
        "SegmentedIconDirective",
        "SegmentedTriggerSize"
      ],
      "inputs": [
        "disabled",
        "iconOnly",
        "size",
        "value"
      ],
      "outputs": [
        "valueChange"
      ],
      "cssTokens": [
        "--ngs-button-radius",
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-primary",
        "--ngs-color-surface",
        "--ngs-color-surface-container",
        "--ngs-color-surface-container-highest",
        "--ngs-font-size-sm",
        "--ngs-font-size-xs",
        "--ngs-icon-size",
        "--ngs-segmented-bg",
        "--ngs-segmented-button-color",
        "--ngs-segmented-button-font-size",
        "--ngs-segmented-button-gap",
        "--ngs-segmented-button-height",
        "--ngs-segmented-button-hover-bg",
        "--ngs-segmented-button-hover-color",
        "--ngs-segmented-button-icon-offset-margin",
        "--ngs-segmented-button-min-width",
        "--ngs-segmented-button-padding",
        "--ngs-segmented-button-radius",
        "--ngs-segmented-button-selected-bg",
        "--ngs-segmented-button-selected-color",
        "--ngs-segmented-button-selected-shadow",
        "--ngs-segmented-gap",
        "--ngs-segmented-padding",
        "--ngs-segmented-radius",
        "--ngs-shadow-sm"
      ],
      "example": null
    },
    {
      "name": "select",
      "title": "Select",
      "overviewName": "Select",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/select",
      "publicApi": "projects/components/select/public-api.ts",
      "sourceRoot": "projects/components/select/src",
      "docsPath": "/forms/select",
      "docsOverviewSource": "projects/docs/src/app/forms/select/overview/overview.html",
      "purpose": "Let users choose one or multiple values from a known dropdown list.",
      "useWhen": "Use ngs-select inside one ngs-form-field when a form, filter, setting, table filter, DataView filter, or admin configuration field should choose from predefined options. Use ngs-option for options, ngs-optgroup for visible grouping, multiple for array values, placeholder, required, disabled, Angular forms, value, and selectionChange for state. Use ngs-select-trigger to customize the closed label, and ngs-select-header, ngs-select-body, or ngs-select-footer when the dropdown panel needs search, custom scrolling, or supporting controls. Do not use Select as a command menu or action list; use Menu. Do not use for route or page navigation; use Navigation, Tabs, Sidebar, Sidenav, or RailNav. Do not use for compact visible mode switching; use Segmented. Do not use for simple visible choices or rich card choices; use Radio or RadioCard. Do not use for arbitrary free text or large remote search suggestion flows; use Autocomplete or a dedicated async picker. Do not use generic Select when a domain-specific control exists, such as CountrySelect, CurrencySelect, DateFormatSelect, or TimezoneSelect.",
      "exampleTopics": [
        "Basic Select",
        "Clearable Select",
        "Getting and setting the select value",
        "Form Field Features",
        "Disabled",
        "Resetting the select value",
        "Groups of Options",
        "Multiple Selection",
        "Customizing the trigger label",
        "Select with search feature",
        "Async Data Source",
        "Get set value",
        "Resetting value",
        "Custom trigger",
        "Select search",
        "Async data source select"
      ],
      "minimalExample": "<p>Basic ngs-select</p>\n<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Favorite food</ngs-label>\n  <ngs-select>\n    @for (food of foods; track food) {\n      <ngs-option [value]=\"food.value\">{{food.viewValue}}</ngs-option>\n    }\n  </ngs-select>\n</ngs-form-field>",
      "exampleFiles": [
        {
          "name": "basic-select-example",
          "title": "Basic select",
          "file": "projects/docs/src/app/forms/select/_examples/basic-select-example/basic-select-example.html",
          "source": "<p>Basic ngs-select</p>\n<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Favorite food</ngs-label>\n  <ngs-select>\n    @for (food of foods; track food) {\n      <ngs-option [value]=\"food.value\">{{food.viewValue}}</ngs-option>\n    }\n  </ngs-select>\n</ngs-form-field>"
        },
        {
          "name": "async-data-source-select-example",
          "title": "Async data source select",
          "file": "projects/docs/src/app/forms/select/_examples/async-data-source-select-example/async-data-source-select-example.html",
          "source": "<ngs-form-field class=\"w-full max-w-md\">\n  <ngs-label>Owner</ngs-label>\n  <ngs-select\n    [formControl]=\"owner\"\n    [dataSource]=\"usersDataSource\"\n    placeholder=\"Assign owner\"\n    searchable\n    clearable\n    [pageSize]=\"20\"\n    [searchDebounce]=\"150\">\n    <ng-template ngsOptionContentDef let-user let-label=\"label\">\n      <span class=\"flex min-w-0 flex-col\">\n        <span class=\"truncate\">{{ user.name }}</span>\n        <span class=\"truncate text-xs text-neutral-500\">{{ user.team }} - {{ label }}</span>\n      </span>\n    </ng-template>\n    <ng-template ngsSelectValueDef let-user>\n      {{ user.name }} - {{ user.team }}\n    </ng-template>\n  </ngs-select>\n</ngs-form-field>"
        },
        {
          "name": "clearable-select-example",
          "title": "Clearable select",
          "file": "projects/docs/src/app/forms/select/_examples/clearable-select-example/clearable-select-example.html",
          "source": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Status</ngs-label>\n  <ngs-select [formControl]=\"status()\" clearable>\n    @for (statusOption of statuses(); track statusOption.value) {\n      <ngs-option [value]=\"statusOption.value\">{{ statusOption.label }}</ngs-option>\n    }\n  </ngs-select>\n</ngs-form-field>"
        }
      ],
      "previewAsset": "projects/components/select/preview.svg",
      "selectors": [
        "ng-template[ngsFilterTriggerValue]",
        "ng-template[ngsOptionContentDef]",
        "ng-template[ngsSelectValueDef]",
        "ngs-filter-trigger",
        "ngs-select",
        "ngs-select-body",
        "ngs-select-footer",
        "ngs-select-header",
        "ngs-select-trigger"
      ],
      "exportedSymbols": [
        "_Select",
        "FilterTrigger",
        "FilterTriggerValueDirective",
        "Select",
        "SELECT",
        "SelectBody",
        "SelectChange",
        "SelectDataSource",
        "SelectDataSourceOption",
        "SelectDataSourceRequest",
        "SelectDataSourceResult",
        "SelectFooter",
        "SelectHeader",
        "SelectOptionContentContext",
        "SelectOptionContentDef",
        "SelectTrigger",
        "SelectValueContext",
        "SelectValueDef"
      ],
      "inputs": [
        "aria-describedby",
        "aria-label",
        "clearable",
        "dataSource",
        "disabled",
        "hideCheckIcon",
        "id",
        "loadOnOpen",
        "maxCount",
        "minSearchLength",
        "multiple",
        "pageSize",
        "placeholder",
        "required",
        "searchable",
        "searchDebounce",
        "showZero",
        "tabIndex",
        "value"
      ],
      "outputs": [
        "closed",
        "opened",
        "selectionChange"
      ],
      "cssTokens": [
        "--ngs-color-danger",
        "--ngs-color-on-primary",
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-outline",
        "--ngs-color-outline-variant",
        "--ngs-color-primary",
        "--ngs-color-surface-container-high",
        "--ngs-color-surface-container-lowest",
        "--ngs-dropdown-bg",
        "--ngs-dropdown-border",
        "--ngs-dropdown-item-gap",
        "--ngs-dropdown-max-height",
        "--ngs-dropdown-padding",
        "--ngs-dropdown-radius",
        "--ngs-dropdown-shadow",
        "--ngs-field-border-color",
        "--ngs-field-font-size",
        "--ngs-field-label-color",
        "--ngs-field-line-height",
        "--ngs-filter-trigger-badge-background",
        "--ngs-filter-trigger-badge-color",
        "--ngs-filter-trigger-badge-font-size",
        "--ngs-filter-trigger-badge-font-weight",
        "--ngs-filter-trigger-badge-padding-inline",
        "--ngs-filter-trigger-badge-radius",
        "--ngs-filter-trigger-badge-size",
        "--ngs-filter-trigger-color",
        "--ngs-filter-trigger-font-size",
        "--ngs-filter-trigger-font-weight",
        "--ngs-filter-trigger-gap",
        "--ngs-filter-trigger-value-color",
        "--ngs-filter-trigger-value-font-weight",
        "--ngs-font-size-sm",
        "--ngs-select-arrow-color",
        "--ngs-select-arrow-container-width",
        "--ngs-select-arrow-size",
        "--ngs-select-border-color",
        "--ngs-select-clear-color",
        "--ngs-select-clear-container-width",
        "--ngs-select-clear-hover-color",
        "--ngs-select-clear-icon-size",
        "--ngs-select-clear-overlap",
        "--ngs-select-content-padding",
        "--ngs-select-font-size",
        "--ngs-select-min-width",
        "--ngs-select-panel-bg",
        "--ngs-select-panel-border",
        "--ngs-select-panel-max-height",
        "--ngs-select-panel-shadow",
        "--ngs-select-placeholder-color",
        "--ngs-select-search-bg",
        "--ngs-select-search-border",
        "--ngs-select-search-color",
        "--ngs-select-search-focus-border-color",
        "--ngs-select-search-font-size",
        "--ngs-select-search-height",
        "--ngs-select-search-padding-inline",
        "--ngs-select-state-action-color",
        "--ngs-select-state-color",
        "--ngs-select-state-font-size",
        "--ngs-select-state-min-height",
        "--ngs-select-state-padding",
        "--ngs-select-trigger-gap"
      ],
      "example": "<ngs-select [value]=\"value\">...</ngs-select>"
    },
    {
      "name": "side-panel",
      "title": "Side Panel",
      "overviewName": "Side Panel",
      "category": "navigation",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/side-panel",
      "publicApi": "projects/components/side-panel/public-api.ts",
      "sourceRoot": "projects/components/side-panel/src",
      "docsPath": "/navigation/side-panel",
      "docsOverviewSource": "projects/docs/src/app/navigation/side-panel/overview/overview.html",
      "purpose": "Provide an embedded side utility panel with tabbed tools beside the main content.",
      "useWhen": "Use ngs-side-panel inside an app or workspace layout when the page needs persistent secondary tools or inspectors next to the primary content. Add ngs-side-panel-tab for each tab with tabId, label, and an optional Iconify icon name or custom icon TemplateRef. Good for info, outline, layers, activity, comments, assets, properties, preview settings, contextual inspectors, and quick tools in editors or admin workspaces. It can be positioned left or right and emits opened and closed. Do not use SidePanel as a temporary overlay; use Drawer. Do not use for modal workflows or confirmations; use Dialog or Confirm. Do not use as a generic page section; use Panel or Card. Do not use for primary app navigation; use Sidebar, Sidenav, Navigation, or RailNav. Do not use for tabs inside normal content; use Tabs. Do not use for simple action lists; use Menu.",
      "exampleTopics": [
        "Basic side panel"
      ],
      "minimalExample": "<div class=\"h-[700px] border border-muted rounded-2xl overflow-hidden\">\n  <ngs-layout>\n    <ngs-layout-header>\n      <div class=\"h-14 px-5 flex items-center border-b border-b-muted\">Header</div>\n    </ngs-layout-header>\n    <ngs-layout-content>\n      <div class=\"absolute inset-y-5 start-5 end-0 p-5 border border-muted rounded-2xl\"\n           [class.end-5]=\"sidePanel.isOpen()\">\n        Body content\n      </div>\n    </ngs-layout-content>\n    <ngs-layout-aside>\n      <ngs-side-panel #sidePanel class=\"overridable-side-panel\">\n        <ngs-side-panel-tab tabId=\"info\" label=\"Info\" icon=\"fluent:info-24-regular\">\n          <div class=\"p-5 border border-muted rounded-2xl\">\n            <p>This is the contents of the first tab.</p>\n          </div>\n        </ngs-side-panel-tab>\n        <ngs-side-panel-tab tabId=\"list\" label=\"List\" icon=\"fluent:text-bullet-list-ltr-24-regular\">\n          <div class=\"p-5\">\n            <p>This is the contents of the second tab.</p>\n          </div>\n        </ngs-side-panel-tab>\n        <ngs-side-panel-tab tabId=\"svg\" label=\"Custom\" [icon]=\"customIconTpl\">\n          <div class=\"p-5\">\n            <p>Tab with custom SVG icon.</p>\n          </div>\n        </ngs-side-panel-tab>\n      </ngs-side-panel>\n    </ngs-layout-aside>\n  </ngs-layout>\n</div>\n<ng-template #customIconTpl>\n  OP\n</ng-template>",
      "exampleFiles": [
        {
          "name": "basic-side-panel-example",
          "title": "Basic side panel",
          "file": "projects/docs/src/app/navigation/side-panel/_examples/basic-side-panel-example/basic-side-panel-example.html",
          "source": "<div class=\"h-[700px] border border-muted rounded-2xl overflow-hidden\">\n  <ngs-layout>\n    <ngs-layout-header>\n      <div class=\"h-14 px-5 flex items-center border-b border-b-muted\">Header</div>\n    </ngs-layout-header>\n    <ngs-layout-content>\n      <div class=\"absolute inset-y-5 start-5 end-0 p-5 border border-muted rounded-2xl\"\n           [class.end-5]=\"sidePanel.isOpen()\">\n        Body content\n      </div>\n    </ngs-layout-content>\n    <ngs-layout-aside>\n      <ngs-side-panel #sidePanel class=\"overridable-side-panel\">\n        <ngs-side-panel-tab tabId=\"info\" label=\"Info\" icon=\"fluent:info-24-regular\">\n          <div class=\"p-5 border border-muted rounded-2xl\">\n            <p>This is the contents of the first tab.</p>\n          </div>\n        </ngs-side-panel-tab>\n        <ngs-side-panel-tab tabId=\"list\" label=\"List\" icon=\"fluent:text-bullet-list-ltr-24-regular\">\n          <div class=\"p-5\">\n            <p>This is the contents of the second tab.</p>\n          </div>\n        </ngs-side-panel-tab>\n        <ngs-side-panel-tab tabId=\"svg\" label=\"Custom\" [icon]=\"customIconTpl\">\n          <div class=\"p-5\">\n            <p>Tab with custom SVG icon.</p>\n          </div>\n        </ngs-side-panel-tab>\n      </ngs-side-panel>\n    </ngs-layout-aside>\n  </ngs-layout>\n</div>\n<ng-template #customIconTpl>\n  OP\n</ng-template>"
        }
      ],
      "previewAsset": "projects/components/side-panel/preview.svg",
      "selectors": [
        "ngs-side-panel",
        "ngs-side-panel-tab"
      ],
      "exportedSymbols": [
        "PanelPosition",
        "SidePanel",
        "SidePanelTab",
        "SidePanelTabConfig"
      ],
      "inputs": [
        "label",
        "position",
        "tabId"
      ],
      "outputs": [
        "closed",
        "opened"
      ],
      "cssTokens": [
        "--ngs-nav-item-active-bg",
        "--ngs-nav-item-active-color",
        "--ngs-side-panel-button-active-bg",
        "--ngs-side-panel-button-active-color",
        "--ngs-side-panel-button-strip-width",
        "--ngs-side-panel-content-bg",
        "--ngs-side-panel-content-width",
        "--ngs-side-panel-offset-y",
        "--ngs-side-panel-transition-timing"
      ],
      "example": null
    },
    {
      "name": "sidebar",
      "title": "Sidebar",
      "overviewName": "Sidebar",
      "category": "navigation",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/sidebar",
      "publicApi": "projects/components/sidebar/public-api.ts",
      "sourceRoot": "projects/components/sidebar/src",
      "docsPath": "/navigation/sidebar",
      "docsOverviewSource": "projects/docs/src/app/navigation/sidebar/overview/overview.html",
      "purpose": "Provide a complete vertical app or workspace sidebar with its own navigation system.",
      "useWhen": "Use ngs-sidebar as the content inside a shell sidebar region, usually inside Sidenav or LayoutSidebar, when an admin app or workspace needs persistent sidebar navigation and supporting sidebar content. Compose it with ngs-sidebar-header, ngs-sidebar-body, ngs-sidebar-footer, ngs-sidebar-nav, ngs-sidebar-nav-item, ngs-sidebar-nav-group, ngs-sidebar-nav-group-toggle, ngs-sidebar-nav-group-menu, ngs-sidebar-heading, ngs-sidebar-divider, ngsSidebarNavItemIcon, ngsSidebarNavItemBadge, and ngsSidebarNavGroupToggleIcon. Good for brand or workspace header, main app navigation, grouped routes, badges, active item state through activeKey, autoScrollToActiveItem, and data-driven nav templates. Sidebar owns navigation; when ngs-sidebar is not used and persistent navigation is needed, use Navigation. Do not use Sidebar as a generic left column, card, drawer content, inspector, page section, tabs, menu, or compact icon rail. Use Sidenav for responsive open, collapse, or overlay shell behavior, RailNav for compact icon navigation, SidePanel for secondary tabbed tools, Drawer for temporary overlay side content, and Panel or Card for content grouping.",
      "exampleTopics": [
        "Basic sidebar",
        "Sidebar structure helpers",
        "Dynamic compact sidebar",
        "Only compact sidebar",
        "Sidebar with custom icons"
      ],
      "minimalExample": "<div class=\"h-[600px] w-[300px] relative\">\n  <ngs-sidebar class=\"border border-muted rounded-2xl\">\n    <ngs-sidebar-header class=\"h-14 px-4 font-bold text-primary border-b border-b-muted\">\n      NGSTARTER\n    </ngs-sidebar-header>\n    <ngs-sidebar-body>\n      <ngs-sidebar-nav activeKey=\"home\" class=\"p-4\">\n        @for (navItem of navItems; track navItem) {\n          @switch (navItem.type) {\n            @case ('group') {\n              <ngs-sidebar-nav-group>\n                <ngs-sidebar-nav-group-toggle>\n                  <ng-container ngsSidebarNavItemIcon>\n                    @if (navItem.icon) {\n                      <ngs-icon name=\"fluent:{{ navItem.icon }}\"/>\n                    }\n                  </ng-container>\n                  {{ navItem.label }}\n                  <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"size-4\" ngsSidebarNavGroupToggleIcon/>\n                </ngs-sidebar-nav-group-toggle>\n                <ngs-sidebar-nav-group-menu>\n                  @for (childNavItem of navItem.children; track childNavItem) {\n                    <ngs-sidebar-nav-item [key]=\"childNavItem.key\">\n                      <ng-container ngsSidebarNavItemIcon>\n                        @if (childNavItem.icon) {\n                          <ngs-icon name=\"fluent:{{ childNavItem.icon }}\"/>\n                        }\n                      </ng-container>\n                      {{ childNavItem.label }}\n                    </ngs-sidebar-nav-item>\n                  }\n                </ngs-sidebar-nav-group-menu>\n              </ngs-sidebar-nav-group>\n            }\n            @case ('he\n...",
      "exampleFiles": [
        {
          "name": "basic-sidebar-example",
          "title": "Basic sidebar",
          "file": "projects/docs/src/app/navigation/sidebar/_examples/basic-sidebar-example/basic-sidebar-example.html",
          "source": "<div class=\"h-[600px] w-[300px] relative\">\n  <ngs-sidebar class=\"border border-muted rounded-2xl\">\n    <ngs-sidebar-header class=\"h-14 px-4 font-bold text-primary border-b border-b-muted\">\n      NGSTARTER\n    </ngs-sidebar-header>\n    <ngs-sidebar-body>\n      <ngs-sidebar-nav activeKey=\"home\" class=\"p-4\">\n        @for (navItem of navItems; track navItem) {\n          @switch (navItem.type) {\n            @case ('group') {\n              <ngs-sidebar-nav-group>\n                <ngs-sidebar-nav-group-toggle>\n                  <ng-container ngsSidebarNavItemIcon>\n                    @if (navItem.icon) {\n                      <ngs-icon name=\"fluent:{{ navItem.icon }}\"/>\n                    }\n                  </ng-container>\n                  {{ navItem.label }}\n                  <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"size-4\" ngsSidebarNavGroupToggleIcon/>\n                </ngs-sidebar-nav-group-toggle>\n                <ngs-sidebar-nav-group-menu>\n                  @for (childNavItem of navItem.children; track childNavItem) {\n                    <ngs-sidebar-nav-item [key]=\"childNavItem.key\">\n                      <ng-container ngsSidebarNavItemIcon>\n                        @if (childNavItem.icon) {\n                          <ngs-icon name=\"fluent:{{ childNavItem.icon }}\"/>\n                        }\n                      </ng-container>\n                      {{ childNavItem.label }}\n                    </ngs-sidebar-nav-item>\n                  }\n                </ngs-sidebar-nav-group-menu>\n              </ngs-sidebar-nav-group>\n            }\n            @case ('he\n..."
        },
        {
          "name": "dynamic-compact-sidebar-example",
          "title": "Dynamic compact sidebar",
          "file": "projects/docs/src/app/navigation/sidebar/_examples/dynamic-compact-sidebar-example/dynamic-compact-sidebar-example.html",
          "source": "<div class=\"flex flex-col gap-4\">\n  <button ngsButton=\"tonal\" type=\"button\" class=\"w-fit\" (click)=\"toggleCompact()\">\n    <ngs-icon [name]=\"compact() ? 'fluent:panel-left-expand-24-regular' : 'fluent:panel-left-contract-24-regular'\"/>\n    {{ compact() ? 'Expand sidebar' : 'Compact sidebar' }}\n  </button>\n  <div class=\"h-[420px] w-full relative border border-muted rounded-2xl overflow-hidden\">\n    <ngs-sidenav-container autosize hasBackdrop=\"false\">\n      <ngs-sidenav [opened]=\"true\" mode=\"side\" [collapsed]=\"compact()\" disableClose>\n        <ngs-sidebar class=\"border-r border-r-muted\">\n          <ngs-sidebar-header class=\"h-14 px-4 border-b border-b-muted text-primary font-bold\">\n            <div *ngsSidenavCollapsed class=\"text-center w-full\">NG</div>\n            <span *ngsSidenavExpanded>NgStarter</span>\n          </ngs-sidebar-header>\n          <ngs-sidebar-body>\n            <ngs-sidebar-nav activeKey=\"home\" class=\"p-4\">\n              @for (navItem of navItems; track navItem.key) {\n                <ngs-sidebar-nav-item [key]=\"navItem.key\" [attr.aria-label]=\"navItem.label\">\n                  <ngs-icon [name]=\"navItem.icon\" ngsSidebarNavItemIcon/>\n                  {{ navItem.label }}\n                </ngs-sidebar-nav-item>\n              }\n            </ngs-sidebar-nav>\n          </ngs-sidebar-body>\n          <ngs-sidebar-footer class=\"h-14 px-4 border-t border-t-muted text-sm\">\n            <div *ngsSidenavCollapsed class=\"text-center w-full\">WS</div>\n            <span *ngsSidenavExpanded>Workspace</span>\n          </ngs-sidebar-footer>\n        </ngs-sidebar>\n      </ngs-sid\n..."
        },
        {
          "name": "only-compact-sidebar-example",
          "title": "Only compact sidebar",
          "file": "projects/docs/src/app/navigation/sidebar/_examples/only-compact-sidebar-example/only-compact-sidebar-example.html",
          "source": "<div class=\"h-[420px] w-24 relative\">\n  <ngs-sidebar onlyCompact class=\"border border-muted rounded-2xl\">\n    <ngs-sidebar-header class=\"h-14 px-4 border-b border-b-muted text-primary font-bold justify-center\">\n      NG\n    </ngs-sidebar-header>\n    <ngs-sidebar-body>\n      <ngs-sidebar-nav activeKey=\"dashboard\" class=\"p-3\">\n        @for (navItem of navItems; track navItem.key) {\n          <ngs-sidebar-nav-item [key]=\"navItem.key\" [attr.aria-label]=\"navItem.label\">\n            <ngs-icon [name]=\"navItem.icon\" ngsSidebarNavItemIcon/>\n            {{ navItem.label }}\n          </ngs-sidebar-nav-item>\n        }\n      </ngs-sidebar-nav>\n    </ngs-sidebar-body>\n    <ngs-sidebar-footer class=\"h-14 px-4 border-t border-t-muted justify-center\">\n      <ngs-icon name=\"fluent:person-circle-24-regular\"/>\n    </ngs-sidebar-footer>\n  </ngs-sidebar>\n</div>"
        }
      ],
      "previewAsset": "projects/components/sidebar/preview.svg",
      "selectors": [
        "[ngs-sidebar-nav-item]",
        "[ngsSidebarNavGroupToggleIcon]",
        "[ngsSidebarNavItemBadge]",
        "[ngsSidebarNavItemDef]",
        "[ngsSidebarNavItemIcon]",
        "ngs-sidebar",
        "ngs-sidebar-body",
        "ngs-sidebar-content",
        "ngs-sidebar-divider",
        "ngs-sidebar-footer",
        "ngs-sidebar-header",
        "ngs-sidebar-heading",
        "ngs-sidebar-nav",
        "ngs-sidebar-nav-group",
        "ngs-sidebar-nav-group-menu",
        "ngs-sidebar-nav-group-toggle",
        "ngs-sidebar-nav-item",
        "ngs-sidebar-spacer"
      ],
      "exportedSymbols": [
        "Sidebar",
        "SIDEBAR_NAVIGATION",
        "SIDEBAR_NAVIGATION_GROUP",
        "SidebarBody",
        "SidebarDivider",
        "SidebarFooter",
        "SidebarHeader",
        "SidebarHeading",
        "SidebarNav",
        "SidebarNavGroup",
        "SidebarNavGroupMenu",
        "SidebarNavGroupToggle",
        "SidebarNavGroupToggleIconDirective",
        "SidebarNavItem",
        "SidebarNavItemBadgeDirective",
        "SidebarNavItemDefDirective",
        "SidebarNavItemIconDirective",
        "SidebarNavItemInterface",
        "SidebarNavState",
        "SidebarNavStore",
        "SidebarSpacer"
      ],
      "inputs": [
        "activeKey",
        "autoScrollToActiveItem",
        "block",
        "dataSource",
        "forceActive",
        "itemTypeProperty",
        "key",
        "onlyCompact"
      ],
      "outputs": [
        "itemClicked"
      ],
      "cssTokens": [
        "--ngs-color-border",
        "--ngs-color-emphasis",
        "--ngs-color-on-primary",
        "--ngs-color-on-surface-variant",
        "--ngs-color-outline",
        "--ngs-color-primary",
        "--ngs-color-subtle",
        "--ngs-font-size-xs",
        "--ngs-nav-arrow-size",
        "--ngs-nav-badge-padding",
        "--ngs-nav-badge-size",
        "--ngs-nav-divider-height",
        "--ngs-nav-divider-margin",
        "--ngs-nav-group-toggle-icon-position-end",
        "--ngs-nav-group-toggle-icon-size",
        "--ngs-nav-group-toggle-padding-end",
        "--ngs-nav-heading-after-margin",
        "--ngs-nav-heading-font-weight",
        "--ngs-nav-heading-height",
        "--ngs-nav-heading-margin-bottom",
        "--ngs-nav-heading-margin-top",
        "--ngs-nav-heading-padding",
        "--ngs-nav-heading-text-align",
        "--ngs-nav-heading-text-transform",
        "--ngs-nav-item-active-bg",
        "--ngs-nav-item-active-color",
        "--ngs-nav-item-active-icon-color",
        "--ngs-nav-item-border-color",
        "--ngs-nav-item-border-width",
        "--ngs-nav-item-color",
        "--ngs-nav-item-font-size",
        "--ngs-nav-item-font-weight",
        "--ngs-nav-item-gap",
        "--ngs-nav-item-height",
        "--ngs-nav-item-hover-bg",
        "--ngs-nav-item-hover-color",
        "--ngs-nav-item-hover-icon-color",
        "--ngs-nav-item-icon-color",
        "--ngs-nav-item-icon-font-size",
        "--ngs-nav-item-icon-size",
        "--ngs-nav-item-icon-width",
        "--ngs-nav-item-padding",
        "--ngs-nav-item-radius",
        "--ngs-nav-item-width",
        "--ngs-nav-items-gap",
        "--ngs-nav-nested-item-border-radius",
        "--ngs-nav-nested-item-height",
        "--ngs-nav-nested-item-indicator-height",
        "--ngs-nav-nested-item-indicator-position-start",
        "--ngs-nav-nested-item-indicator-width",
        "--ngs-nav-nested-item-margin",
        "--ngs-nav-nested-item-padding",
        "--ngs-sidebar-bg",
        "--ngs-sidebar-divider-bg",
        "--ngs-sidebar-divider-height",
        "--ngs-sidebar-divider-margin",
        "--ngs-sidebar-header-compact-padding",
        "--ngs-sidebar-heading-after-margin",
        "--ngs-sidebar-heading-color",
        "--ngs-sidebar-heading-font-size",
        "--ngs-sidebar-heading-font-weight",
        "--ngs-sidebar-heading-height",
        "--ngs-sidebar-heading-margin-bottom",
        "--ngs-sidebar-heading-margin-top",
        "--ngs-sidebar-heading-padding",
        "--ngs-sidebar-heading-text-align",
        "--ngs-sidebar-heading-text-transform",
        "--ngs-sidebar-nav-bg",
        "--ngs-sidebar-nav-divider-bg",
        "--ngs-sidebar-nav-divider-height",
        "--ngs-sidebar-nav-divider-margin",
        "--ngs-sidebar-nav-group-active-bg",
        "--ngs-sidebar-nav-group-arrow-color",
        "--ngs-sidebar-nav-group-border-radius",
        "--ngs-sidebar-nav-group-menu-padding-start",
        "--ngs-sidebar-nav-group-toggle-active-bg",
        "--ngs-sidebar-nav-group-toggle-active-color",
        "--ngs-sidebar-nav-group-toggle-active-icon-color",
        "--ngs-sidebar-nav-group-toggle-bg",
        "--ngs-sidebar-nav-group-toggle-has-icon-padding-end",
        "--ngs-sidebar-nav-group-toggle-hover-icon-color",
        "--ngs-sidebar-nav-group-toggle-icon-color",
        "--ngs-sidebar-nav-group-toggle-icon-position-end",
        "--ngs-sidebar-nav-group-toggle-icon-size",
        "--ngs-sidebar-nav-group-tree-lines-color",
        "--ngs-sidebar-nav-heading-after-margin",
        "--ngs-sidebar-nav-heading-color",
        "--ngs-sidebar-nav-heading-font-size",
        "--ngs-sidebar-nav-heading-font-weight",
        "--ngs-sidebar-nav-heading-height",
        "--ngs-sidebar-nav-heading-margin-bottom",
        "--ngs-sidebar-nav-heading-margin-top",
        "--ngs-sidebar-nav-heading-padding",
        "--ngs-sidebar-nav-heading-text-align",
        "--ngs-sidebar-nav-heading-text-transform",
        "--ngs-sidebar-nav-item-active-bg",
        "--ngs-sidebar-nav-item-active-color",
        "--ngs-sidebar-nav-item-active-icon-color",
        "--ngs-sidebar-nav-item-bg",
        "--ngs-sidebar-nav-item-border-color",
        "--ngs-sidebar-nav-item-border-width",
        "--ngs-sidebar-nav-item-color",
        "--ngs-sidebar-nav-item-font-size",
        "--ngs-sidebar-nav-item-font-weight",
        "--ngs-sidebar-nav-item-gap",
        "--ngs-sidebar-nav-item-has-icon-padding-start",
        "--ngs-sidebar-nav-item-height",
        "--ngs-sidebar-nav-item-hover-bg",
        "--ngs-sidebar-nav-item-hover-color",
        "--ngs-sidebar-nav-item-hover-icon-color",
        "--ngs-sidebar-nav-item-icon-color",
        "--ngs-sidebar-nav-item-icon-font-size",
        "--ngs-sidebar-nav-item-icon-size",
        "--ngs-sidebar-nav-item-icon-width",
        "--ngs-sidebar-nav-item-padding",
        "--ngs-sidebar-nav-item-radius",
        "--ngs-sidebar-nav-item-width",
        "--ngs-sidebar-nav-items-gap",
        "--ngs-sidebar-nav-nested-item-active-bg",
        "--ngs-sidebar-nav-nested-item-active-color",
        "--ngs-sidebar-nav-nested-item-bg",
        "--ngs-sidebar-nav-nested-item-border-radius",
        "--ngs-sidebar-nav-nested-item-color",
        "--ngs-sidebar-nav-nested-item-height",
        "--ngs-sidebar-nav-nested-item-hover-bg",
        "--ngs-sidebar-nav-nested-item-hover-color",
        "--ngs-sidebar-nav-nested-item-indicator-bg",
        "--ngs-sidebar-nav-nested-item-indicator-height",
        "--ngs-sidebar-nav-nested-item-indicator-position-start",
        "--ngs-sidebar-nav-nested-item-indicator-width",
        "--ngs-sidebar-nav-nested-item-margin",
        "--ngs-sidebar-nav-nested-item-padding",
        "--ngs-sidebar-nav-padding",
        "--ngs-sidebar-width",
        "--ngs-sidenav-collapsed-width"
      ],
      "example": null
    },
    {
      "name": "sidenav",
      "title": "Sidenav",
      "overviewName": "Sidenav",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/sidenav",
      "publicApi": "projects/components/sidenav/public-api.ts",
      "sourceRoot": "projects/components/sidenav/src",
      "docsPath": "/components/sidenav",
      "docsOverviewSource": "projects/docs/src/app/components/sidenav/overview/overview.html",
      "purpose": "Provide a responsive shell container for side surfaces that can open, close, collapse, overlay, or push content.",
      "useWhen": "Use ngs-sidenav-container with ngs-sidenav and ngs-sidenav-content when a page or app shell needs a side region with behavior: opened state, open/close/toggle methods, mode over/push/side, position start/end, collapsed icon-width state, disableClose, backdrop and backdropClick, adaptive mobile mode through adaptive and adaptiveBreakpoint, fixedWidth, autosize, and autoFocus. Use ngsSidenavCollapsed and ngsSidenavExpanded templates to render different content while collapsed or expanded. In admin shells, put ngs-sidebar inside ngs-sidenav when the side region is primary navigation; Sidebar owns the actual navigation items. Do not use Sidenav as the navigation structure itself; use Sidebar or Navigation inside it. Do not use for temporary task panels; use Drawer. Do not use for persistent tabbed utility tools; use SidePanel. Do not use for static local columns or content sections; use LayoutSidebar, Panel, or Tailwind layout. Do not use for modal workflows, confirmations, or action menus; use Dialog, Confirm, or Menu.",
      "exampleTopics": [
        "Basic sidenav"
      ],
      "minimalExample": "<ngs-sidenav-container class=\"h-[300px] border border-border\" (backdropClick)=\"close('backdrop')\">\n  <ngs-sidenav #sidenav [opened]=\"true\" [mode]=\"mode.value || 'over'\" (keydown.escape)=\"close('escape')\" disableClose\n               class=\"p-5\">\n    <p>\n      <button ngsButton=\"filled\" (click)=\"close('toggle button')\">Close</button>\n    </p>\n  </ngs-sidenav>\n  <ngs-sidenav-content class=\"p-5\">\n    <p>\n      <button ngsButton=\"filled\" (click)=\"sidenav.open()\">Open</button>\n    </p>\n    <p>Closed due to: {{ reason }}</p>\n    <ngs-radio-group [formControl]=\"mode\" class=\"mt-10\">\n      <label>Mode:</label>\n      <ngs-radio-button value=\"over\">Over</ngs-radio-button>\n      <ngs-radio-button value=\"push\">Push</ngs-radio-button>\n    </ngs-radio-group>\n  </ngs-sidenav-content>\n</ngs-sidenav-container>",
      "exampleFiles": [
        {
          "name": "basic-sidenav-example",
          "title": "Basic sidenav",
          "file": "projects/docs/src/app/components/sidenav/_examples/basic-sidenav-example/basic-sidenav-example.html",
          "source": "<ngs-sidenav-container class=\"h-[300px] border border-border\" (backdropClick)=\"close('backdrop')\">\n  <ngs-sidenav #sidenav [opened]=\"true\" [mode]=\"mode.value || 'over'\" (keydown.escape)=\"close('escape')\" disableClose\n               class=\"p-5\">\n    <p>\n      <button ngsButton=\"filled\" (click)=\"close('toggle button')\">Close</button>\n    </p>\n  </ngs-sidenav>\n  <ngs-sidenav-content class=\"p-5\">\n    <p>\n      <button ngsButton=\"filled\" (click)=\"sidenav.open()\">Open</button>\n    </p>\n    <p>Closed due to: {{ reason }}</p>\n    <ngs-radio-group [formControl]=\"mode\" class=\"mt-10\">\n      <label>Mode:</label>\n      <ngs-radio-button value=\"over\">Over</ngs-radio-button>\n      <ngs-radio-button value=\"push\">Push</ngs-radio-button>\n    </ngs-radio-group>\n  </ngs-sidenav-content>\n</ngs-sidenav-container>"
        }
      ],
      "previewAsset": "projects/components/sidenav/preview.svg",
      "selectors": [
        "[ngsSidenavCollapsed]",
        "[ngsSidenavExpanded]",
        "ngs-sidenav",
        "ngs-sidenav-container",
        "ngs-sidenav-content"
      ],
      "exportedSymbols": [
        "AutoFocusTarget",
        "Sidenav",
        "SIDENAV",
        "SidenavCollapsed",
        "SidenavContainer",
        "SidenavContent",
        "SidenavExpanded",
        "SidenavMode",
        "SidenavPosition"
      ],
      "inputs": [
        "adaptive",
        "adaptiveBreakpoint",
        "autoFocus",
        "autosize",
        "collapsed",
        "disableClose",
        "fixedWidth",
        "hasBackdrop",
        "mode",
        "opened",
        "position"
      ],
      "outputs": [
        "backdropClick"
      ],
      "cssTokens": [
        "--ngs-color-background",
        "--ngs-overlay-backdrop-bg",
        "--ngs-sidenav-backdrop-color",
        "--ngs-sidenav-background-color",
        "--ngs-sidenav-collapsed-width",
        "--ngs-sidenav-divider-color",
        "--ngs-sidenav-transition-duration",
        "--ngs-sidenav-transition-timing-function",
        "--ngs-sidenav-width",
        "--ngs-sidenav-z-index"
      ],
      "example": null
    },
    {
      "name": "signature-pad",
      "title": "Signature Pad",
      "overviewName": "Signature Pad",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/signature-pad",
      "publicApi": "projects/components/signature-pad/public-api.ts",
      "sourceRoot": "projects/components/signature-pad/src",
      "docsPath": "/components/signature-pad",
      "docsOverviewSource": "projects/docs/src/app/components/signature-pad/overview/overview.html",
      "purpose": "Capture a handwritten signature and emit it as a PNG data URL.",
      "useWhen": "Use ngs-signature-pad in approval, contract, consent, delivery confirmation, onboarding, checkout, legal acknowledgement, or internal workflow forms where the user must draw a signature. It supports mouse, touch, or pen input, penColor, colors for the fixed allowed pen palette, lineWidth, backgroundColor, lazy brush smoothing through lazyRadius/lazyFriction/lazyEnabled, clear(), save(), signatureSaved with a base64 PNG data URL, and signatureCleared. Use the emitted PNG in app code to store or attach the signature to the workflow or document. Do not use SignaturePad as a general drawing canvas, image editor, annotation tool, sketch board, whiteboard, file upload, typed-name field, or legal validation system by itself. App code still needs to require the signature when needed, persist it, and enforce backend or legal rules.",
      "exampleTopics": [
        "Basic signature pad"
      ],
      "minimalExample": "<ngs-signature-pad class=\"border border-muted rounded-2xl overflow-hidden\"\n                   (signatureSaved)=\"onSignatureSaved($event)\"\n                   (signatureCleared)=\"onSignatureCleared()\"/>\n@if (signature()) {\n  <p class=\"mt-10\">\n    <img [src]=\"signature()\" alt=\"\">\n  </p>\n}",
      "exampleFiles": [
        {
          "name": "basic-signature-pad-example",
          "title": "Basic signature pad",
          "file": "projects/docs/src/app/components/signature-pad/_examples/basic-signature-pad-example/basic-signature-pad-example.html",
          "source": "<ngs-signature-pad class=\"border border-muted rounded-2xl overflow-hidden\"\n                   (signatureSaved)=\"onSignatureSaved($event)\"\n                   (signatureCleared)=\"onSignatureCleared()\"/>\n@if (signature()) {\n  <p class=\"mt-10\">\n    <img [src]=\"signature()\" alt=\"\">\n  </p>\n}"
        }
      ],
      "previewAsset": "projects/components/signature-pad/preview.svg",
      "selectors": [
        "ngs-signature-pad"
      ],
      "exportedSymbols": [
        "LazyBrush",
        "LazyBrushOptions",
        "LazyBrushUpdateOptions",
        "LazyPoint",
        "Point",
        "SignaturePad"
      ],
      "inputs": [
        "backgroundColor",
        "colors",
        "lazyEnabled",
        "lazyFriction",
        "lazyRadius",
        "lineWidth",
        "penColor"
      ],
      "outputs": [
        "signatureCleared",
        "signatureSaved"
      ],
      "cssTokens": [
        "--ngs-brand-colors-color-size",
        "--ngs-brand-colors-gap",
        "--ngs-color-surface-container-highest",
        "--ngs-color-surface-container-lowest"
      ],
      "example": null
    },
    {
      "name": "skeleton",
      "title": "Skeleton",
      "overviewName": "Skeleton",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/skeleton",
      "publicApi": "projects/components/skeleton/public-api.ts",
      "sourceRoot": "projects/components/skeleton/src",
      "docsPath": "/components/skeleton",
      "docsOverviewSource": "projects/docs/src/app/components/skeleton/overview/overview.html",
      "purpose": "Show placeholder blocks for loading content when the final layout is already known.",
      "useWhen": "Use ngs-skeleton to preserve layout while cards, lists, table rows, dashboard widgets, chart areas, avatars, text lines, or media blocks are loading. Shape and size each skeleton with TailwindCSS utilities such as h-*, w-*, size-*, flex, grid, gap, and wrapper layouts so it roughly matches the UI that will replace it. Use roundedFull for circular placeholders such as avatars or icon circles. Do not use Skeleton for unknown long operations where progress matters; use ProgressBar. Do not use for global route or app loading; use PageLoadingBar or ScreenLoader. Do not use for blocking a local section; use BlockLoader. Do not use for empty results; use EmptyState. Do not use for image fallback after load failure; use ImagePlaceholder. Do not use random grey blocks that do not resemble the final content.",
      "exampleTopics": [
        "Basic Skeleton"
      ],
      "minimalExample": "<div class=\"flex flex-col gap-8\">\n  <div class=\"w-1/2 flex flex-col gap-5\">\n    <ngs-skeleton roundedFull class=\"size-24\"/>\n    <ngs-skeleton class=\"h-5\"/>\n    <ngs-skeleton class=\"h-5\"/>\n    <ngs-skeleton class=\"h-5\"/>\n    <ngs-skeleton class=\"h-5\"/>\n  </div>\n  <div class=\"flex gap-5\">\n    <ngs-skeleton class=\"h-7 w-24\"/>\n    <ngs-skeleton class=\"h-7 w-20\"/>\n    <ngs-skeleton class=\"h-7 w-28\"/>\n    <ngs-skeleton class=\"h-7 w-16\"/>\n  </div>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-skeleton-example",
          "title": "Basic skeleton",
          "file": "projects/docs/src/app/components/skeleton/_examples/basic-skeleton-example/basic-skeleton-example.html",
          "source": "<div class=\"flex flex-col gap-8\">\n  <div class=\"w-1/2 flex flex-col gap-5\">\n    <ngs-skeleton roundedFull class=\"size-24\"/>\n    <ngs-skeleton class=\"h-5\"/>\n    <ngs-skeleton class=\"h-5\"/>\n    <ngs-skeleton class=\"h-5\"/>\n    <ngs-skeleton class=\"h-5\"/>\n  </div>\n  <div class=\"flex gap-5\">\n    <ngs-skeleton class=\"h-7 w-24\"/>\n    <ngs-skeleton class=\"h-7 w-20\"/>\n    <ngs-skeleton class=\"h-7 w-28\"/>\n    <ngs-skeleton class=\"h-7 w-16\"/>\n  </div>\n</div>"
        }
      ],
      "previewAsset": "projects/components/skeleton/preview.svg",
      "selectors": [
        "ngs-skeleton"
      ],
      "exportedSymbols": [
        "Skeleton"
      ],
      "inputs": [
        "roundedFull"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-neutral-200",
        "--ngs-color-neutral-300",
        "--ngs-color-neutral-500",
        "--ngs-color-neutral-600",
        "--ngs-radius-xl",
        "--ngs-skeleton-from-bg",
        "--ngs-skeleton-item-border-radius",
        "--ngs-skeleton-to-bg"
      ],
      "example": null
    },
    {
      "name": "slide-toggle",
      "title": "Slide Toggle",
      "overviewName": "Slide Toggle",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/slide-toggle",
      "publicApi": "projects/components/slide-toggle/public-api.ts",
      "sourceRoot": "projects/components/slide-toggle/src",
      "docsPath": "/forms/slide-toggle",
      "docsOverviewSource": "projects/docs/src/app/forms/slide-toggle/overview/overview.html",
      "purpose": "Capture a boolean on/off setting where checked means enabled.",
      "useWhen": "Use ngs-slide-toggle for settings and preferences where checked=true means the feature or state is enabled. Good for live updates, notifications, dark mode option, visibility, sidebar expanded or collapsed, animation on/off, table options, enable Wi-Fi, show archived, and allow comments. It is an Angular form control with checked, disabled, required, ngModel, formControlName, change, and toggleChange, and has its own label pattern, so do not wrap it in ngs-form-field. Do not use SlideToggle for choosing one value from many; use Radio, Segmented, or Select. Do not use for multiple independent selections in a list; use Checkbox. Do not use for button-like mode groups; use ButtonToggle. Do not use for actions, commands, navigation, or rich option cards; use Button, Navigation, or RadioCard. For “I agree” or “accept terms” confirmations, prefer Checkbox because the user is confirming, not enabling a setting.",
      "exampleTopics": [
        "Basic Slide Toggle",
        "Disabled Slide Toggle",
        "Slide Toggle with Forms",
        "Slide toggle disabled"
      ],
      "minimalExample": "<ngs-slide-toggle>Slide me!</ngs-slide-toggle>",
      "exampleFiles": [
        {
          "name": "basic-slide-toggle-example",
          "title": "Basic slide toggle",
          "file": "projects/docs/src/app/forms/slide-toggle/_examples/basic-slide-toggle-example/basic-slide-toggle-example.html",
          "source": "<ngs-slide-toggle>Slide me!</ngs-slide-toggle>"
        },
        {
          "name": "slide-toggle-disabled-example",
          "title": "Slide toggle disabled",
          "file": "projects/docs/src/app/forms/slide-toggle/_examples/slide-toggle-disabled-example/slide-toggle-disabled-example.html",
          "source": "<div class=\"flex flex-col gap-4\">\n  <ngs-slide-toggle [disabled]=\"true\">Disabled Off</ngs-slide-toggle>\n  <ngs-slide-toggle [disabled]=\"true\" [checked]=\"true\">Disabled On</ngs-slide-toggle>\n</div>"
        },
        {
          "name": "slide-toggle-with-forms-example",
          "title": "Slide toggle with forms",
          "file": "projects/docs/src/app/forms/slide-toggle/_examples/slide-toggle-with-forms-example/slide-toggle-with-forms-example.html",
          "source": "<div>\n  <p>Slide Toggle using a simple NgModel.</p>\n  <ngs-slide-toggle [(ngModel)]=\"isChecked\">Slide Toggle Checked: {{ isChecked }}</ngs-slide-toggle>\n</div>\n<div class=\"mt-10\">\n  <p>Slide Toggle inside of a Template-driven form</p>\n  <form class=\"w-full\">\n    <div class=\"flex flex-col gap-3\">\n      <div>\n        <ngs-slide-toggle ngModel name=\"enableWifi\">Enable Wifi</ngs-slide-toggle>\n      </div>\n      <div>\n        <ngs-slide-toggle ngModel name=\"acceptTerms\" required>Accept Terms of Service</ngs-slide-toggle>\n      </div>\n    </div>\n    <div class=\"mt-5\">\n      <button ngsButton=\"tonal\" type=\"button\" class=\"w-40\">Save Settings</button>\n    </div>\n  </form>\n</div>\n<div class=\"mt-10\">\n  <p>Slide Toggle inside of a Reactive form</p>\n  <form class=\"w-full flex flex-col gap-3\" [formGroup]=\"formGroup\">\n    <div class=\"flex flex-col gap-3\">\n      <div>\n        <ngs-slide-toggle formControlName=\"enableWifi\">Enable Wifi</ngs-slide-toggle>\n      </div>\n      <div>\n        <ngs-slide-toggle formControlName=\"acceptTerms\">Accept Terms of Service</ngs-slide-toggle>\n      </div>\n    </div>\n    <p>Form Group Status: {{ formGroup.status }}</p>\n    <button ngsButton=\"tonal\" type=\"button\" class=\"w-40\">Save Settings</button>\n  </form>\n</div>"
        }
      ],
      "previewAsset": "projects/components/slide-toggle/preview.svg",
      "selectors": [
        "ngs-slide-toggle",
        "ngs-slide-toggle-group"
      ],
      "exportedSymbols": [
        "SlideToggle",
        "SlideToggleChange",
        "SlideToggleGroup"
      ],
      "inputs": [
        "aria-describedby",
        "aria-label",
        "aria-labelledby",
        "checked",
        "color",
        "disabled",
        "disableRipple",
        "hideIcon",
        "id",
        "labelPosition",
        "name",
        "required",
        "tabIndex"
      ],
      "outputs": [
        "change",
        "toggleChange"
      ],
      "cssTokens": [
        "--ngs-color-on-primary",
        "--ngs-color-primary",
        "--ngs-color-surface",
        "--ngs-color-surface-container-highest",
        "--ngs-slide-toggle-bar-checked-color",
        "--ngs-slide-toggle-bar-color",
        "--ngs-slide-toggle-group-gap",
        "--ngs-slide-toggle-height",
        "--ngs-slide-toggle-thumb-checked-color",
        "--ngs-slide-toggle-thumb-color",
        "--ngs-slide-toggle-thumb-size",
        "--ngs-slide-toggle-transition-duration",
        "--ngs-slide-toggle-width"
      ],
      "example": null
    },
    {
      "name": "slider",
      "title": "Slider",
      "overviewName": "Slider",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/slider",
      "publicApi": "projects/components/slider/public-api.ts",
      "sourceRoot": "projects/components/slider/src",
      "docsPath": "/components/slider",
      "docsOverviewSource": "projects/docs/src/app/components/slider/overview/overview.html",
      "purpose": "Let users choose one numeric value or a start/end range by dragging thumb controls.",
      "useWhen": "Use ngs-slider when approximate visual numeric adjustment is better than typing. Good for volume, opacity, zoom, size, threshold, percentage, rating or score, price range, numeric date or age range, chart settings, visual tuning, and filter ranges. Use input ngsSliderThumb for one value, or input ngsSliderStartThumb plus input ngsSliderEndThumb for a range. Configure min, max, step, disabled, discrete, showTickMarks, displayWith, Angular forms, and valueChange on thumbs. Do not use Slider to show progress or status; use ProgressBar or Gauge. Do not use when exact numeric entry is primary; use NumberInput or pair NumberInput with Slider. Do not use for named categories; use Select, Radio, or Segmented. Do not use for before/after image comparison; use ComparisonSlider. Do not use for pagination or table sorting/filter builder logic; use Paginator, Sort, or FilterBuilder.",
      "exampleTopics": [
        "Basic Slider",
        "Custom Thumb Label Formatting",
        "Range Slider",
        "Configurable Slider"
      ],
      "minimalExample": "<ngs-slider class=\"!w-1/3\">\n  <input ngsSliderThumb>\n</ngs-slider>",
      "exampleFiles": [
        {
          "name": "basic-slider-example",
          "title": "Basic slider",
          "file": "projects/docs/src/app/components/slider/_examples/basic-slider-example/basic-slider-example.html",
          "source": "<ngs-slider class=\"!w-1/3\">\n  <input ngsSliderThumb>\n</ngs-slider>"
        },
        {
          "name": "configurable-slider-example",
          "title": "Configurable slider",
          "file": "projects/docs/src/app/components/slider/_examples/configurable-slider-example/configurable-slider-example.html",
          "source": "<div>\n  <p>Slider configuration</p>\n  <section class=\"flex gap-3\">\n    <ngs-form-field class=\"w-44\">\n      <ngs-label>Value</ngs-label>\n      <input ngsInput type=\"number\" [(ngModel)]=\"value\">\n    </ngs-form-field>\n    <ngs-form-field class=\"w-44\">\n      <ngs-label>Min value</ngs-label>\n      <input ngsInput type=\"number\" [(ngModel)]=\"min\">\n    </ngs-form-field>\n    <ngs-form-field class=\"w-44\">\n      <ngs-label>Max value</ngs-label>\n      <input ngsInput type=\"number\" [(ngModel)]=\"max\">\n    </ngs-form-field>\n    <ngs-form-field class=\"w-44\">\n      <ngs-label>Step size</ngs-label>\n      <input ngsInput type=\"number\" [(ngModel)]=\"step\">\n    </ngs-form-field>\n  </section>\n  <div>\n    <section class=\"example-section\">\n      <ngs-checkbox [(ngModel)]=\"showTicks\">Show ticks</ngs-checkbox>\n    </section>\n    <section class=\"example-section\">\n      <ngs-checkbox [(ngModel)]=\"thumbLabel\">Show thumb label</ngs-checkbox>\n    </section>\n    <section class=\"example-section\">\n      <ngs-checkbox [(ngModel)]=\"disabled\">Disabled</ngs-checkbox>\n    </section>\n  </div>\n</div>\n<div class=\"my-6\">\n  <ngs-divider/>\n</div>\n<div>\n  <p>Result</p>\n  <div>\n    <label id=\"example-name-label\">Value: </label>\n    <label>{{ value }}</label>\n  </div>\n  <ngs-slider\n    class=\"!w-1/3\"\n    [disabled]=\"disabled\"\n    [max]=\"max\"\n    [min]=\"min\"\n    [step]=\"step\"\n    [discrete]=\"thumbLabel\"\n    [showTickMarks]=\"showTicks\">\n    <input ngsSliderThumb [(ngModel)]=\"value\" #slider>\n  </ngs-slider>\n</div>"
        },
        {
          "name": "custom-thumb-label-formatting-example",
          "title": "Custom thumb label formatting",
          "file": "projects/docs/src/app/components/slider/_examples/custom-thumb-label-formatting-example/custom-thumb-label-formatting-example.html",
          "source": "<ngs-slider min=\"0\" max=\"10000\" step=\"1000\" showTickMarks discrete [displayWith]=\"formatLabel\" class=\"!w-1/3\">\n  <input ngsSliderThumb>\n</ngs-slider>"
        }
      ],
      "previewAsset": "projects/components/slider/preview.svg",
      "selectors": [
        "input[ngsSliderEndThumb]",
        "input[ngsSliderStartThumb]",
        "input[ngsSliderThumb]",
        "ngs-slider"
      ],
      "exportedSymbols": [
        "Slider",
        "SliderEndThumb",
        "SliderStartThumb",
        "SliderThumb"
      ],
      "inputs": [
        "disabled",
        "discrete",
        "max",
        "min",
        "showTickMarks",
        "step",
        "value"
      ],
      "outputs": [
        "valueChange"
      ],
      "cssTokens": [
        "--ngs-color-on-primary",
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-primary",
        "--ngs-color-primary-100",
        "--ngs-color-surface",
        "--ngs-color-surface-container-high",
        "--ngs-slider-thumb-color",
        "--ngs-slider-thumb-ripple-color",
        "--ngs-slider-thumb-size",
        "--ngs-slider-tick-mark-active-color",
        "--ngs-slider-tick-mark-color",
        "--ngs-slider-track-active-color",
        "--ngs-slider-track-active-height",
        "--ngs-slider-track-color",
        "--ngs-slider-track-height",
        "--ngs-slider-value-indicator-color",
        "--ngs-slider-value-indicator-text-color"
      ],
      "example": null
    },
    {
      "name": "snack-bar",
      "title": "Snack Bar",
      "overviewName": "Snackbar",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/snack-bar",
      "publicApi": "projects/components/snack-bar/public-api.ts",
      "sourceRoot": "projects/components/snack-bar/src",
      "docsPath": "/components/snackbar",
      "docsOverviewSource": "projects/docs/src/app/components/snackbar/overview/overview.html",
      "purpose": "Show short transient overlay feedback after an action or background result.",
      "useWhen": "Use the SnackBar service for brief non-blocking messages such as Saved, Copied, Invite sent, Refresh complete, Export started, or Deleted, with an optional quick action such as Undo or View. Open with snackBar.open(message, action?, config?), openFromComponent, or openFromTemplate. Configure duration, horizontalPosition, verticalPosition, data, panelClass, custom component or template content, and use SnackBarRef.dismiss(), afterOpened(), and afterDismissed() for lifecycle handling. SnackBar should be short, temporary, and safe to miss. Do not use for field validation errors; use FormField errors. Do not use for persistent inline messages; use Alert. Do not use for global important header messages; use Announcement. Do not use for critical required actions; use ActionRequired. Do not use for confirmations before destructive actions; use Confirm. Do not use for modal workflows; use Dialog. Do not use for long-lived notification inboxes or event feeds; use Notifications. Do not use for incident/status banners or loading/progress states; use Incidents, ProgressBar, ScreenLoader, BlockLoader, or PageLoadingBar.",
      "exampleTopics": [
        "Basic Snackbar",
        "Snackbar With Custom Component",
        "Configurable Snackbar",
        "Snackbar with custom",
        "Snackbar"
      ],
      "minimalExample": "<div class=\"flex items-center gap-5\">\n  <ngs-form-field subscriptHiddenIfEmpty>\n    <ngs-label>Message</ngs-label>\n    <input ngsInput value=\"Disco party!\" #message>\n  </ngs-form-field>\n  <ngs-form-field subscriptHiddenIfEmpty>\n    <ngs-label>Action</ngs-label>\n    <input ngsInput value=\"Dance\" #action>\n  </ngs-form-field>\n  <button ngsButton=\"outlined\"\n          (click)=\"openSnackBar(message.value, action.value)\">Show snack-bar</button>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-snackbar-example",
          "title": "Basic snackbar",
          "file": "projects/docs/src/app/components/snackbar/_examples/basic-snackbar-example/basic-snackbar-example.html",
          "source": "<div class=\"flex items-center gap-5\">\n  <ngs-form-field subscriptHiddenIfEmpty>\n    <ngs-label>Message</ngs-label>\n    <input ngsInput value=\"Disco party!\" #message>\n  </ngs-form-field>\n  <ngs-form-field subscriptHiddenIfEmpty>\n    <ngs-label>Action</ngs-label>\n    <input ngsInput value=\"Dance\" #action>\n  </ngs-form-field>\n  <button ngsButton=\"outlined\"\n          (click)=\"openSnackBar(message.value, action.value)\">Show snack-bar</button>\n</div>"
        },
        {
          "name": "configurable-snackbar-example",
          "title": "Configurable snackbar",
          "file": "projects/docs/src/app/components/snackbar/_examples/configurable-snackbar-example/configurable-snackbar-example.html",
          "source": "<div class=\"flex items-center gap-5\">\n  <ngs-form-field subscriptHiddenIfEmpty>\n    <ngs-label>Horizontal position</ngs-label>\n    <ngs-select [(ngModel)]=\"horizontalPosition\">\n      <ngs-option value=\"start\">Start</ngs-option>\n      <ngs-option value=\"center\">Center</ngs-option>\n      <ngs-option value=\"end\">End</ngs-option>\n      <ngs-option value=\"left\">Left</ngs-option>\n      <ngs-option value=\"right\">Right</ngs-option>\n    </ngs-select>\n  </ngs-form-field>\n  <ngs-form-field subscriptHiddenIfEmpty>\n    <ngs-label>Vertical position</ngs-label>\n    <ngs-select [(ngModel)]=\"verticalPosition\">\n      <ngs-option value=\"top\">Top</ngs-option>\n      <ngs-option value=\"bottom\">Bottom</ngs-option>\n    </ngs-select>\n  </ngs-form-field>\n  <button ngsButton=\"outlined\" (click)=\"openSnackBar()\" aria-label=\"Show an example snack-bar\">\n    Pool party!\n  </button>\n</div>"
        },
        {
          "name": "snackbar-example",
          "title": "Snackbar",
          "file": "projects/docs/src/app/components/snackbar/_examples/snackbar-example/snackbar-example.html",
          "source": "<div class=\"flex text-amber-400 justify-between\">\n  <div>Pizza party!!!</div> 🍕\n</div>"
        }
      ],
      "previewAsset": "projects/components/snack-bar/preview.svg",
      "selectors": [
        "ngs-simple-snack-bar",
        "ngs-snack-bar-container"
      ],
      "exportedSymbols": [
        "provideSnackBarConfig",
        "SimpleSnackBar",
        "SNACK_BAR_CONFIG",
        "SNACK_BAR_DATA",
        "SnackBar",
        "SnackBarConfig",
        "SnackBarContainer",
        "SnackBarHorizontalPosition",
        "SnackBarRef",
        "SnackBarVerticalPosition"
      ],
      "inputs": [],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-neutral-100",
        "--ngs-color-neutral-950",
        "--ngs-font-size-sm"
      ],
      "example": null
    },
    {
      "name": "sort",
      "title": "Sort",
      "overviewName": "Sort",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/sort",
      "publicApi": "projects/components/sort/public-api.ts",
      "sourceRoot": "projects/components/sort/src",
      "docsPath": "/components/sort",
      "docsOverviewSource": "projects/docs/src/app/components/sort/overview/overview.html",
      "purpose": "Provide sortable header behavior and sort state for table-like data.",
      "useWhen": "Use ngsSort on a sortable table/list/data container and ngs-sort-header=\"fieldName\" on header cells that should cycle through sort states. Sort tracks active column and direction (asc, desc, or cleared), supports ngsSortActive, ngsSortDirection, ngsSortStart, ngsSortDisableClear, ngsSortDisabled, per-header disabled state, sortActionDescription, and emits ngsSortChange with { active, direction }. Use it with Table sortable column headers, custom table-like data surfaces, and when wiring sort state into a local TableDataSource or server/API query. For DataView, usually prefer its built-in sortable column config and sortChange instead of manually adding ngs-sort-header. Do not use Sort as a visual sort icon only, filter builder, search, grouping, drag reorder, tab sorting, or generic “sort these cards” button. Sort only manages header state and emits the selected sort; the app/data source still applies local sorting or sends the sort state to the backend.",
      "exampleTopics": [
        "Basic Sort"
      ],
      "minimalExample": "<div class=\"border border-muted rounded-xl overflow-hidden\">\n  <table ngs-table [dataSource]=\"dataSource\" ngsSort (ngsSortChange)=\"announceSortChange($event)\">\n    <ng-container ngsColumnDef=\"invoice\">\n      <th ngs-header-cell *ngsHeaderCellDef ngs-sort-header=\"invoice\" sortActionDescription=\"Sort by invoice\">\n        Invoice\n      </th>\n      <td ngs-cell *ngsCellDef=\"let invoice\">{{ invoice.invoice }}</td>\n    </ng-container>\n    <ng-container ngsColumnDef=\"customer\">\n      <th ngs-header-cell *ngsHeaderCellDef ngs-sort-header=\"customer\" sortActionDescription=\"Sort by customer\">\n        Customer\n      </th>\n      <td ngs-cell *ngsCellDef=\"let invoice\">{{ invoice.customer }}</td>\n    </ng-container>\n    <ng-container ngsColumnDef=\"total\">\n      <th ngs-header-cell *ngsHeaderCellDef ngs-sort-header=\"total\" sortActionDescription=\"Sort by total\">\n        Total\n      </th>\n      <td ngs-cell *ngsCellDef=\"let invoice\">${{ invoice.total }}</td>\n    </ng-container>\n    <ng-container ngsColumnDef=\"status\">\n      <th ngs-header-cell *ngsHeaderCellDef ngs-sort-header=\"status\" sortActionDescription=\"Sort by status\">\n        Status\n      </th>\n      <td ngs-cell *ngsCellDef=\"let invoice\">{{ invoice.status }}</td>\n    </ng-container>\n    <tr ngs-header-row *ngsHeaderRowDef=\"displayedColumns\"></tr>\n    <tr ngs-row *ngsRowDef=\"let row; columns: displayedColumns;\"></tr>\n  </table>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-sort-example",
          "title": "Basic sort",
          "file": "projects/docs/src/app/components/sort/_examples/basic-sort-example/basic-sort-example.html",
          "source": "<div class=\"border border-muted rounded-xl overflow-hidden\">\n  <table ngs-table [dataSource]=\"dataSource\" ngsSort (ngsSortChange)=\"announceSortChange($event)\">\n    <ng-container ngsColumnDef=\"invoice\">\n      <th ngs-header-cell *ngsHeaderCellDef ngs-sort-header=\"invoice\" sortActionDescription=\"Sort by invoice\">\n        Invoice\n      </th>\n      <td ngs-cell *ngsCellDef=\"let invoice\">{{ invoice.invoice }}</td>\n    </ng-container>\n    <ng-container ngsColumnDef=\"customer\">\n      <th ngs-header-cell *ngsHeaderCellDef ngs-sort-header=\"customer\" sortActionDescription=\"Sort by customer\">\n        Customer\n      </th>\n      <td ngs-cell *ngsCellDef=\"let invoice\">{{ invoice.customer }}</td>\n    </ng-container>\n    <ng-container ngsColumnDef=\"total\">\n      <th ngs-header-cell *ngsHeaderCellDef ngs-sort-header=\"total\" sortActionDescription=\"Sort by total\">\n        Total\n      </th>\n      <td ngs-cell *ngsCellDef=\"let invoice\">${{ invoice.total }}</td>\n    </ng-container>\n    <ng-container ngsColumnDef=\"status\">\n      <th ngs-header-cell *ngsHeaderCellDef ngs-sort-header=\"status\" sortActionDescription=\"Sort by status\">\n        Status\n      </th>\n      <td ngs-cell *ngsCellDef=\"let invoice\">{{ invoice.status }}</td>\n    </ng-container>\n    <tr ngs-header-row *ngsHeaderRowDef=\"displayedColumns\"></tr>\n    <tr ngs-row *ngsRowDef=\"let row; columns: displayedColumns;\"></tr>\n  </table>\n</div>"
        }
      ],
      "previewAsset": "projects/components/sort/preview.svg",
      "selectors": [
        "[ngs-sort-header]",
        "[ngsSort]"
      ],
      "exportedSymbols": [
        "NgsSort",
        "Sort",
        "SORT",
        "SortDirection",
        "SortDirective",
        "SortHeader",
        "SortModule"
      ],
      "inputs": [
        "disabled",
        "ngs-sort-header",
        "ngsSortActive",
        "ngsSortDirection",
        "ngsSortDisableClear",
        "ngsSortDisabled",
        "ngsSortStart",
        "sortActionDescription"
      ],
      "outputs": [
        "ngsSortChange"
      ],
      "cssTokens": [],
      "example": null
    },
    {
      "name": "spinner",
      "title": "Spinner",
      "overviewName": "Progress Spinner",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/spinner",
      "publicApi": "projects/components/spinner/public-api.ts",
      "sourceRoot": "projects/components/spinner/src",
      "docsPath": "/components/progress-spinner",
      "docsOverviewSource": "projects/docs/src/app/components/progress-spinner/overview/overview.html",
      "purpose": "Show a circular indicator for an ongoing operation.",
      "useWhen": "Use ngs-progress-spinner when a compact circular loading indicator is needed inside a button, overlay, media viewer, widget, small page area, or next to an action. Use mode=\"indeterminate\" when the remaining time or amount of work is unknown. Use mode=\"determinate\" with value from 0 to 100 when progress is known. Configure diameter, strokeWidth, and color for the surface. Do not use ProgressSpinner for linear progress; use ProgressBar. Do not use it for known loading layouts; use Skeleton. Do not use it for router or page transition loading; use PageLoadingBar. Do not use it as a full-screen or blocking state by itself; use ScreenLoader or BlockLoader. Do not use it as a KPI or metric display; use Gauge or ProgressBar based on context.",
      "exampleTopics": [
        "Basic Progress Spinner",
        "Configurable Progress Spinner",
        "Configurable spinner"
      ],
      "minimalExample": "<ngs-progress-spinner/>",
      "exampleFiles": [
        {
          "name": "basic-progress-spinner-example",
          "title": "Basic progress spinner",
          "file": "projects/docs/src/app/components/progress-spinner/_examples/basic-progress-spinner-example/basic-progress-spinner-example.html",
          "source": "<ngs-progress-spinner/>"
        },
        {
          "name": "configurable-spinner-example",
          "title": "Configurable spinner",
          "file": "projects/docs/src/app/components/progress-spinner/_examples/configurable-spinner-example/configurable-spinner-example.html",
          "source": "<div>\n  <p class=\"mt-0\">Progress spinner configuration</p>\n  <section>\n    <label>Color:</label>\n    <ngs-radio-group [(ngModel)]=\"color\">\n      <ngs-radio-button class=\"example-margin\" value=\"primary\">\n        Primary\n      </ngs-radio-button>\n      <ngs-radio-button class=\"example-margin\" value=\"accent\">\n        Accent\n      </ngs-radio-button>\n      <ngs-radio-button class=\"example-margin\" value=\"warn\">\n        Warn\n      </ngs-radio-button>\n    </ngs-radio-group>\n  </section>\n  <section class=\"example-section\">\n    <label class=\"example-margin\">Mode:</label>\n    <ngs-radio-group [(ngModel)]=\"mode\">\n      <ngs-radio-button class=\"example-margin\" value=\"determinate\">\n        Determinate\n      </ngs-radio-button>\n      <ngs-radio-button class=\"example-margin\" value=\"indeterminate\">\n        Indeterminate\n      </ngs-radio-button>\n    </ngs-radio-group>\n  </section>\n  @if (mode === 'determinate') {\n    <section>\n      <label>Progress:</label>\n      <ngs-slider>\n        <input ngsSliderThumb type=\"range\" [(ngModel)]=\"value\">\n      </ngs-slider>\n    </section>\n  }\n</div>\n<ngs-divider class=\"my-6\"/>\n<p>Result:</p>\n<ngs-progress-spinner [color]=\"color\"\n  [mode]=\"mode\"\n  [value]=\"value\" />"
        }
      ],
      "previewAsset": "projects/components/spinner/preview.svg",
      "selectors": [
        "ngs-progress-spinner"
      ],
      "exportedSymbols": [
        "ProgressSpinner",
        "ProgressSpinnerModule",
        "SpinnerMode"
      ],
      "inputs": [
        "color",
        "diameter",
        "mode",
        "strokeWidth",
        "value"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-danger",
        "--ngs-color-primary",
        "--ngs-color-secondary",
        "--ngs-progress-spinner-active-indicator-width",
        "--ngs-progress-spinner-animation-multiplier",
        "--ngs-progress-spinner-color"
      ],
      "example": null
    },
    {
      "name": "splash-screen",
      "title": "Splash Screen",
      "overviewName": "Splash Screen",
      "category": null,
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/splash-screen",
      "publicApi": "projects/components/splash-screen/public-api.ts",
      "sourceRoot": "projects/components/splash-screen/src",
      "docsPath": null,
      "docsOverviewSource": null,
      "purpose": "Show one full-screen branded startup overlay during the initial app bootstrap moment.",
      "useWhen": "Use ngs-splash-screen once near the root app template while Angular, routing, theme, auth/session, tenant, or essential startup data initializes. Project ngs-logo or custom branded content into it. It hides automatically after the first NavigationEnd with hideDelay, fades with animationDuration, and can be controlled through SplashScreenStore.show() and SplashScreenStore.hide(). Do not use SplashScreen for normal page loading after startup; use PageLoadingBar. Do not use for full-screen blocking operations after the app is running; use ScreenLoader. Do not use for local card, table, form, or widget loading; use BlockLoader, Skeleton, ProgressBar, or component-specific loading states. Do not use for empty states, route skeletons, modal workflows, or marketing hero screens. SplashScreen should be one per app and short-lived at the beginning, not shown for every action.",
      "exampleTopics": [],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/splash-screen/preview.svg",
      "selectors": [
        "ngs-splash-screen"
      ],
      "exportedSymbols": [
        "SplashScreen",
        "SplashScreenState",
        "SplashScreenStore"
      ],
      "inputs": [
        "animationDuration",
        "hideDelay"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-background",
        "--ngs-splash-screen-bg",
        "--ngs-splash-screen-hide-animation-duration"
      ],
      "example": null
    },
    {
      "name": "split",
      "title": "Split",
      "overviewName": "Split Pane",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/split",
      "publicApi": "projects/components/split/public-api.ts",
      "sourceRoot": "projects/components/split/src",
      "docsPath": "/components/split-pane",
      "docsOverviewSource": "projects/docs/src/app/components/split-pane/overview/overview.html",
      "purpose": "Create a resizable multi-pane layout with draggable gutters between panes.",
      "useWhen": "Use ngs-split with multiple ngs-split-pane regions when a workspace needs two or more panes that users can manually resize. Good for editors, IDE-like screens, analytics workspaces, master-detail-detail layouts, source and preview views, inspector plus canvas plus logs, and dense multi-pane tools. Supports horizontal or vertical direction, nested splits, unit percent or pixel, size, minSize, maxSize, lockSize, visible, order, withHandle dotted gutter affordance, restrictMove, disabled, gutterSize, gutterStep, dragStart, dragEnd, gutterClick, gutterDblClick, transitionEnd, getVisibleAreaSizes(), and setVisibleAreaSizes() for persistence. Do not use Split for ordinary responsive layout or static two-column admin pages; use TailwindCSS grid or flex. Do not use for one manually resized box; use ResizableContainer. Do not use for side navigation shells; use Sidenav or Sidebar. Do not use for temporary side overlays; use Drawer. Do not use for local structured page sections; use Panel. Do not use for table column resizing or image resizing; use table features or ImageResizer. The parent must have a stable height and width.",
      "exampleTopics": [
        "Basic Split Pane",
        "Split Pane with Handle",
        "Vertical Split Pane with Handle",
        "Split Pane with 3 Columns and Minimum Sizes",
        "Split Pane with Restricted Move",
        "Basic split",
        "Split handle",
        "Split vertical handle",
        "Split min max",
        "Split restrict move"
      ],
      "minimalExample": "<div class=\"border border-border h-[500px]\">\n  <ngs-split direction=\"horizontal\" [useTransition]=\"true\">\n    <ngs-split-pane [size]=\"40\">\n      <ngs-split direction=\"vertical\">\n        <ngs-split-pane>\n          <div class=\"p-3\">\n            <p>\n              Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tiam, quis\n              nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute\n              irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla\n              pariatur.\n            </p>\n          </div>\n        </ngs-split-pane>\n        <ngs-split-pane>\n          <div class=\"p-3\">\n            <p>\n              Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque\n              laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi\n              architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas\n              sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eodolor sit amet,\n              consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore\n              et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum\n              exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi\n              consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam\n              nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla\n...",
      "exampleFiles": [
        {
          "name": "basic-split-example",
          "title": "Basic split",
          "file": "projects/docs/src/app/components/split-pane/_examples/basic-split-example/basic-split-example.html",
          "source": "<div class=\"border border-border h-[500px]\">\n  <ngs-split direction=\"horizontal\" [useTransition]=\"true\">\n    <ngs-split-pane [size]=\"40\">\n      <ngs-split direction=\"vertical\">\n        <ngs-split-pane>\n          <div class=\"p-3\">\n            <p>\n              Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tiam, quis\n              nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute\n              irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla\n              pariatur.\n            </p>\n          </div>\n        </ngs-split-pane>\n        <ngs-split-pane>\n          <div class=\"p-3\">\n            <p>\n              Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque\n              laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi\n              architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas\n              sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eodolor sit amet,\n              consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore\n              et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum\n              exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi\n              consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam\n              nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla\n..."
        },
        {
          "name": "split-handle-example",
          "title": "Split handle",
          "file": "projects/docs/src/app/components/split-pane/_examples/split-handle-example/split-handle-example.html",
          "source": "<div class=\"h-[300px] border border-border rounded-lg overflow-hidden\">\n  <ngs-split direction=\"horizontal\">\n    <ngs-split-pane withHandle [size]=\"50\">\n      <div class=\"p-4 h-full flex items-center justify-center bg-surface-container-low\">Left Column</div>\n    </ngs-split-pane>\n    <ngs-split-pane withHandle [size]=\"50\">\n      <div class=\"p-4 h-full flex items-center justify-center bg-surface-container-low\">Right Column</div>\n    </ngs-split-pane>\n  </ngs-split>\n</div>"
        },
        {
          "name": "split-min-max-example",
          "title": "Split min max",
          "file": "projects/docs/src/app/components/split-pane/_examples/split-min-max-example/split-min-max-example.html",
          "source": "<div class=\"h-[300px] border border-border rounded-lg overflow-hidden\">\n  <ngs-split direction=\"horizontal\">\n    <ngs-split-pane [size]=\"30\" [minSize]=\"20\">\n      <div class=\"p-4 h-full flex flex-col items-center justify-center text-center bg-surface-container-low\">\n        Left Column<br>\n        (min: 20%)\n      </div>\n    </ngs-split-pane>\n    <ngs-split-pane [size]=\"40\">\n      <div class=\"p-4 h-full flex flex-col items-center justify-center text-center bg-surface-container-low\">\n        Middle Column<br>\n        (flexible)\n      </div>\n    </ngs-split-pane>\n    <ngs-split-pane [size]=\"30\" [minSize]=\"20\">\n      <div class=\"p-4 h-full flex flex-col items-center justify-center text-center bg-surface-container-low\">\n        Right Column<br>\n        (min: 20%)\n      </div>\n    </ngs-split-pane>\n  </ngs-split>\n</div>"
        }
      ],
      "previewAsset": "projects/components/split/preview.svg",
      "selectors": [
        "[ngs-split-pane]",
        "ngs-split",
        "ngs-split-pane"
      ],
      "exportedSymbols": [
        "getAreaAbsorptionCapacity",
        "getAreaAbsorptionCapacityPercent",
        "getAreaAbsorptionCapacityPixel",
        "getAreaMaxSize",
        "getAreaMinSize",
        "getElementPixelSize",
        "getGutterSideAbsorptionCapacity",
        "getInputPositiveNumber",
        "getPointFromEvent",
        "isUserSizesValid",
        "provideSplit",
        "Split",
        "SPLIT_DEFAULT_OPTIONS",
        "SplitArea",
        "SplitAreaAbsorptionCapacity",
        "SplitAreaSnapshot",
        "SplitDefaultOptions",
        "SplitOutputAreaSizes",
        "SplitOutputData",
        "SplitPane",
        "SplitPoint",
        "SplitSideAbsorptionCapacity",
        "SplitSnapshot",
        "updateAreaSize"
      ],
      "inputs": [
        "dir",
        "direction",
        "disabled",
        "gutterDblClickDuration",
        "gutterSize",
        "gutterStep",
        "lockSize",
        "maxSize",
        "minSize",
        "order",
        "restrictMove",
        "size",
        "unit",
        "useTransition",
        "visible",
        "withHandle"
      ],
      "outputs": [
        "dragEnd",
        "dragStart",
        "gutterClick",
        "gutterDblClick",
        "transitionEnd"
      ],
      "cssTokens": [
        "--ngs-color-on-surface",
        "--ngs-color-primary",
        "--ngs-color-surface-container-high",
        "--ngs-split-gutter-bg",
        "--ngs-split-gutter-hover-bg",
        "--ngs-split-gutter-size",
        "--ngs-split-handle-offset",
        "--ngs-split-handle-size"
      ],
      "example": null
    },
    {
      "name": "step-tracker",
      "title": "Step Tracker",
      "overviewName": "Step Tracker",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/step-tracker",
      "publicApi": "projects/components/step-tracker/public-api.ts",
      "sourceRoot": "projects/components/step-tracker/src",
      "docsPath": "/components/step-tracker",
      "docsOverviewSource": "projects/docs/src/app/components/step-tracker/overview/overview.html",
      "purpose": "Show the status of related steps without owning wizard navigation, validation, or routed content.",
      "useWhen": "Use ngs-step-tracker with ngs-step-tracker-item when users need passive visibility into process stages such as completed, current, pending, error, or disabled. Good for payroll review stages, onboarding checklists, fulfillment status, setup status, approval flows, and compact progress summaries in cards, sidebars, drawers, and page headers. Use StepTracker when steps are status display only. Configure global completed/error indicator icon names with provideStepTracker or STEP_TRACKER_CONFIG; use ngsStepTrackerCompletedIcon and ngsStepTrackerErrorIcon templates for per-tracker overrides. Do not use it for wizard navigation, next/previous buttons, linear validation, or projected step content; use Stepper or HeadlessStepper for those workflows. Do not use it for chronological audit/event history; use Timeline. Do not use it for a single percentage; use ProgressBar.",
      "exampleTopics": [
        "Basic Step Tracker",
        "Horizontal Step Tracker",
        "Step Tracker With Custom Icons",
        "Step Tracker With Projected Content",
        "Step Tracker States",
        "Step tracker icons",
        "Step tracker projected content"
      ],
      "minimalExample": "<ngs-step-tracker class=\"max-w-sm\" [activeIndex]=\"activeIndex()\">\n  <ngs-step-tracker-item label=\"Pay period & Employee\"/>\n  <ngs-step-tracker-item\n    label=\"Total Hours\"\n    description=\"Review your employee total working hour\"\n  />\n  <ngs-step-tracker-item\n    state=\"error\"\n    label=\"Time off\"\n    description=\"Missing time off approval\"\n  />\n  <ngs-step-tracker-item label=\"Review payroll\"/>\n  <ngs-step-tracker-item label=\"Success\"/>\n</ngs-step-tracker>\n<div class=\"mt-6 flex gap-3\">\n  <button ngsButton=\"outlined\" type=\"button\" (click)=\"previousStep()\">Previous step</button>\n  <button ngsButton=\"filled\" type=\"button\" (click)=\"nextStep()\">Next step</button>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-step-tracker-example",
          "title": "Basic step tracker",
          "file": "projects/docs/src/app/components/step-tracker/_examples/basic-step-tracker-example/basic-step-tracker-example.html",
          "source": "<ngs-step-tracker class=\"max-w-sm\" [activeIndex]=\"activeIndex()\">\n  <ngs-step-tracker-item label=\"Pay period & Employee\"/>\n  <ngs-step-tracker-item\n    label=\"Total Hours\"\n    description=\"Review your employee total working hour\"\n  />\n  <ngs-step-tracker-item\n    state=\"error\"\n    label=\"Time off\"\n    description=\"Missing time off approval\"\n  />\n  <ngs-step-tracker-item label=\"Review payroll\"/>\n  <ngs-step-tracker-item label=\"Success\"/>\n</ngs-step-tracker>\n<div class=\"mt-6 flex gap-3\">\n  <button ngsButton=\"outlined\" type=\"button\" (click)=\"previousStep()\">Previous step</button>\n  <button ngsButton=\"filled\" type=\"button\" (click)=\"nextStep()\">Next step</button>\n</div>"
        },
        {
          "name": "horizontal-step-tracker-example",
          "title": "Horizontal step tracker",
          "file": "projects/docs/src/app/components/step-tracker/_examples/horizontal-step-tracker-example/horizontal-step-tracker-example.html",
          "source": "<ngs-step-tracker orientation=\"horizontal\">\n  <ngs-step-tracker-item state=\"completed\" label=\"Created\" description=\"Request opened\"/>\n  <ngs-step-tracker-item state=\"completed\" label=\"Assigned\" description=\"Owner selected\"/>\n  <ngs-step-tracker-item state=\"current\" label=\"Review\" description=\"Waiting on finance\"/>\n  <ngs-step-tracker-item state=\"pending\" label=\"Approval\" description=\"Not started\"/>\n</ngs-step-tracker>"
        },
        {
          "name": "step-tracker-icons-example",
          "title": "Step tracker icons",
          "file": "projects/docs/src/app/components/step-tracker/_examples/step-tracker-icons-example/step-tracker-icons-example.html",
          "source": "<ngs-step-tracker orientation=\"horizontal\">\n  <ng-template ngsStepTrackerCompletedIcon>\n    <ngs-icon name=\"fluent:shield-checkmark-24-regular\" class=\"size-5\"/>\n  </ng-template>\n  <ng-template ngsStepTrackerErrorIcon>\n    <ngs-icon name=\"fluent:warning-24-regular\" class=\"size-5\"/>\n  </ng-template>\n  <ngs-step-tracker-item state=\"completed\" label=\"Created\" description=\"Request opened\"/>\n  <ngs-step-tracker-item state=\"completed\" label=\"Assigned\" description=\"Owner selected\"/>\n  <ngs-step-tracker-item state=\"error\" label=\"Documents\" description=\"Missing approval\"/>\n  <ngs-step-tracker-item state=\"pending\" label=\"Approval\" description=\"Not started\"/>\n</ngs-step-tracker>"
        }
      ],
      "previewAsset": "projects/components/step-tracker/preview.svg",
      "selectors": [
        "[ngsStepTrackerCompletedIcon]",
        "[ngsStepTrackerDescription]",
        "[ngsStepTrackerErrorIcon]",
        "[ngsStepTrackerLabel]",
        "ngs-step-tracker",
        "ngs-step-tracker-description",
        "ngs-step-tracker-item",
        "ngs-step-tracker-label"
      ],
      "exportedSymbols": [
        "provideStepTracker",
        "STEP_TRACKER_CONFIG",
        "STEP_TRACKER_DEFAULT_CONFIG",
        "StepTracker",
        "StepTrackerCompletedIcon",
        "StepTrackerConfig",
        "StepTrackerDescription",
        "StepTrackerErrorIcon",
        "StepTrackerItem",
        "StepTrackerItemState",
        "StepTrackerLabel",
        "StepTrackerOrientation",
        "StepTrackerResolvedItemState"
      ],
      "inputs": [
        "activeIndex",
        "description",
        "label",
        "orientation",
        "state"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-danger",
        "--ngs-color-neutral-400",
        "--ngs-color-neutral-500",
        "--ngs-color-neutral-800",
        "--ngs-color-on-danger",
        "--ngs-color-on-success",
        "--ngs-color-outline",
        "--ngs-color-primary",
        "--ngs-color-success",
        "--ngs-color-surface",
        "--ngs-color-surface-container-high",
        "--ngs-font-size-base",
        "--ngs-font-size-sm",
        "--ngs-icon-size",
        "--ngs-step-tracker-completed-bg",
        "--ngs-step-tracker-completed-color",
        "--ngs-step-tracker-connector-active-color",
        "--ngs-step-tracker-connector-color",
        "--ngs-step-tracker-connector-gap",
        "--ngs-step-tracker-connector-left",
        "--ngs-step-tracker-connector-length",
        "--ngs-step-tracker-connector-right",
        "--ngs-step-tracker-connector-segment",
        "--ngs-step-tracker-connector-space",
        "--ngs-step-tracker-connector-top",
        "--ngs-step-tracker-connector-width",
        "--ngs-step-tracker-current-bg",
        "--ngs-step-tracker-current-border",
        "--ngs-step-tracker-current-color",
        "--ngs-step-tracker-description-color",
        "--ngs-step-tracker-description-font-size",
        "--ngs-step-tracker-disabled-bg",
        "--ngs-step-tracker-disabled-color",
        "--ngs-step-tracker-error-bg",
        "--ngs-step-tracker-error-color",
        "--ngs-step-tracker-gap",
        "--ngs-step-tracker-horizontal-indicator-margin-bottom",
        "--ngs-step-tracker-indicator-font-size",
        "--ngs-step-tracker-indicator-font-weight",
        "--ngs-step-tracker-indicator-size",
        "--ngs-step-tracker-item-gap",
        "--ngs-step-tracker-label-color",
        "--ngs-step-tracker-label-font-size",
        "--ngs-step-tracker-label-font-weight",
        "--ngs-step-tracker-pending-bg",
        "--ngs-step-tracker-pending-color"
      ],
      "example": null
    },
    {
      "name": "stepper",
      "title": "Stepper",
      "overviewName": "Stepper",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/stepper",
      "publicApi": "projects/components/stepper/public-api.ts",
      "sourceRoot": "projects/components/stepper/src",
      "docsPath": "/components/stepper",
      "docsOverviewSource": "projects/docs/src/app/components/stepper/overview/overview.html",
      "purpose": "Render a ready-made visual wizard for several connected steps in one process.",
      "useWhen": "Use ngs-stepper with ngs-step when users must move through related steps and see their current progress. Good for onboarding, checkout, setup, import/export flows, account or tenant creation, review flows, and multi-step forms. Use linear mode with stepControl when each step must be valid before the user continues. Use ngsStepperNext and ngsStepperPrevious on NgStarter buttons for standard wizard navigation, ngsStepLabel or label for step labels, optional/completed/error states for step status, and horizontal or vertical orientation for responsive layouts. Do not use Stepper when you only need step state and validation logic without the default visual UI; use HeadlessStepper. Do not use for independent page sections; use Tabs or ExpansionPanel. Do not use for app route navigation; use Navigation, Breadcrumbs, Sidebar, or routing. Do not use for showing only a percentage; use ProgressBar. Do not use for product tours over existing UI; use GuidedTour.",
      "exampleTopics": [
        "Basic Stepper",
        "Stepper In Dialog",
        "Stepper Vertical",
        "Stepper Header Position",
        "Stepper Without Header Border",
        "Stepper That Displays Errors In The Steps",
        "Stepper Responsive",
        "Stepper Label Bottom Position",
        "Stepper hidden header border",
        "Stepper with errors state"
      ],
      "minimalExample": "<button ngsButton=\"tonal\" (click)=\"isLinear = !isLinear\" id=\"toggle-linear\" class=\"mb-6\">\n  {{ !isLinear ? 'Enable linear mode' : 'Disable linear mode' }}\n</button>\n<ngs-stepper [linear]=\"isLinear\" #stepper>\n  <ngs-step [stepControl]=\"firstFormGroup\">\n    <form [formGroup]=\"firstFormGroup\">\n      <ng-template ngsStepLabel>Fill out your name</ng-template>\n      <ngs-form-field class=\"w-1/2 mt-2\">\n        <ngs-label>Name</ngs-label>\n        <input ngsInput placeholder=\"Last name, First name\" formControlName=\"firstCtrl\" required>\n      </ngs-form-field>\n      <div>\n        <button ngsButton=\"filled\" ngsStepperNext>Next</button>\n      </div>\n    </form>\n  </ngs-step>\n  <ngs-step [stepControl]=\"secondFormGroup\" label=\"Fill out your address\">\n    <form [formGroup]=\"secondFormGroup\">\n      <ngs-form-field class=\"w-1/2 mt-2\">\n        <ngs-label>Address</ngs-label>\n        <input ngsInput formControlName=\"secondCtrl\" placeholder=\"Ex. 1 Main St, New York, NY\" required>\n      </ngs-form-field>\n      <div class=\"flex gap-3\">\n        <button ngsButton=\"outlined\" ngsStepperPrevious>Back</button>\n        <button ngsButton=\"filled\" ngsStepperNext>Next</button>\n      </div>\n    </form>\n  </ngs-step>\n  <ngs-step>\n    <ng-template ngsStepLabel>Done</ng-template>\n    <p>You are now done.</p>\n    <div class=\"flex gap-3\">\n      <button ngsButton=\"outlined\" ngsStepperPrevious>Back</button>\n      <button ngsButton=\"filled\" (click)=\"stepper.reset()\">Reset</button>\n    </div>\n  </ngs-step>\n</ngs-stepper>",
      "exampleFiles": [
        {
          "name": "basic-stepper-example",
          "title": "Basic stepper",
          "file": "projects/docs/src/app/components/stepper/_examples/basic-stepper-example/basic-stepper-example.html",
          "source": "<button ngsButton=\"tonal\" (click)=\"isLinear = !isLinear\" id=\"toggle-linear\" class=\"mb-6\">\n  {{ !isLinear ? 'Enable linear mode' : 'Disable linear mode' }}\n</button>\n<ngs-stepper [linear]=\"isLinear\" #stepper>\n  <ngs-step [stepControl]=\"firstFormGroup\">\n    <form [formGroup]=\"firstFormGroup\">\n      <ng-template ngsStepLabel>Fill out your name</ng-template>\n      <ngs-form-field class=\"w-1/2 mt-2\">\n        <ngs-label>Name</ngs-label>\n        <input ngsInput placeholder=\"Last name, First name\" formControlName=\"firstCtrl\" required>\n      </ngs-form-field>\n      <div>\n        <button ngsButton=\"filled\" ngsStepperNext>Next</button>\n      </div>\n    </form>\n  </ngs-step>\n  <ngs-step [stepControl]=\"secondFormGroup\" label=\"Fill out your address\">\n    <form [formGroup]=\"secondFormGroup\">\n      <ngs-form-field class=\"w-1/2 mt-2\">\n        <ngs-label>Address</ngs-label>\n        <input ngsInput formControlName=\"secondCtrl\" placeholder=\"Ex. 1 Main St, New York, NY\" required>\n      </ngs-form-field>\n      <div class=\"flex gap-3\">\n        <button ngsButton=\"outlined\" ngsStepperPrevious>Back</button>\n        <button ngsButton=\"filled\" ngsStepperNext>Next</button>\n      </div>\n    </form>\n  </ngs-step>\n  <ngs-step>\n    <ng-template ngsStepLabel>Done</ng-template>\n    <p>You are now done.</p>\n    <div class=\"flex gap-3\">\n      <button ngsButton=\"outlined\" ngsStepperPrevious>Back</button>\n      <button ngsButton=\"filled\" (click)=\"stepper.reset()\">Reset</button>\n    </div>\n  </ngs-step>\n</ngs-stepper>"
        },
        {
          "name": "stepper-header-position-example",
          "title": "Stepper header position",
          "file": "projects/docs/src/app/components/stepper/_examples/stepper-header-position-example/stepper-header-position-example.html",
          "source": "<ngs-stepper headerPosition=\"bottom\" #stepper>\n  <ngs-step [stepControl]=\"firstFormGroup\">\n    <form [formGroup]=\"firstFormGroup\">\n      <ng-template ngsStepLabel>Fill out your name</ng-template>\n      <ngs-form-field class=\"w-1/2\">\n        <input ngsInput placeholder=\"Last name, First name\" formControlName=\"firstCtrl\" required>\n      </ngs-form-field>\n      <div>\n        <button ngsButton=\"filled\" ngsStepperNext>Next</button>\n      </div>\n    </form>\n  </ngs-step>\n  <ngs-step [stepControl]=\"secondFormGroup\" optional>\n    <form [formGroup]=\"secondFormGroup\">\n      <ng-template ngsStepLabel>Fill out your address</ng-template>\n      <ngs-form-field class=\"w-1/2\">\n        <input ngsInput placeholder=\"Address\" formControlName=\"secondCtrl\" required>\n      </ngs-form-field>\n      <div class=\"flex gap-3\">\n        <button ngsButton=\"outlined\" ngsStepperPrevious>Back</button>\n        <button ngsButton=\"filled\" ngsStepperNext>Next</button>\n      </div>\n    </form>\n  </ngs-step>\n  <ngs-step>\n    <ng-template ngsStepLabel>Done</ng-template>\n    You are now done.\n    <div class=\"flex gap-3\">\n      <button ngsButton=\"outlined\" ngsStepperPrevious>Back</button>\n      <button ngsButton=\"filled\" (click)=\"stepper.reset()\">Reset</button>\n    </div>\n  </ngs-step>\n</ngs-stepper>"
        },
        {
          "name": "stepper-hidden-header-border-example",
          "title": "Stepper hidden header border",
          "file": "projects/docs/src/app/components/stepper/_examples/stepper-hidden-header-border-example/stepper-hidden-header-border-example.html",
          "source": "<ngs-stepper hideHeaderBorder headerPosition=\"bottom\" #stepper>\n  <ngs-step [stepControl]=\"accountForm\">\n    <form [formGroup]=\"accountForm\">\n      <ng-template ngsStepLabel>Account</ng-template>\n      <ngs-form-field class=\"w-1/2 mt-2\">\n        <ngs-label>Account name</ngs-label>\n        <input ngsInput formControlName=\"accountName\" placeholder=\"Acme Finance\" required>\n      </ngs-form-field>\n      <div>\n        <button ngsButton=\"filled\" ngsStepperNext>Next</button>\n      </div>\n    </form>\n  </ngs-step>\n  <ngs-step [stepControl]=\"workspaceForm\">\n    <form [formGroup]=\"workspaceForm\">\n      <ng-template ngsStepLabel>Workspace</ng-template>\n      <ngs-form-field class=\"w-1/2 mt-2\">\n        <ngs-label>Workspace name</ngs-label>\n        <input ngsInput formControlName=\"workspaceName\" placeholder=\"Revenue operations\" required>\n      </ngs-form-field>\n      <div class=\"flex gap-3\">\n        <button ngsButton=\"outlined\" ngsStepperPrevious>Back</button>\n        <button ngsButton=\"filled\" ngsStepperNext>Next</button>\n      </div>\n    </form>\n  </ngs-step>\n  <ngs-step>\n    <ng-template ngsStepLabel>Review</ng-template>\n    <p>Review the setup before creating the workspace.</p>\n    <div class=\"flex gap-3\">\n      <button ngsButton=\"outlined\" ngsStepperPrevious>Back</button>\n      <button ngsButton=\"filled\" (click)=\"stepper.reset()\">Reset</button>\n    </div>\n  </ngs-step>\n</ngs-stepper>"
        }
      ],
      "previewAsset": "projects/components/stepper/preview.svg",
      "selectors": [
        "[ngsStepLabel]",
        "button[ngsStepperNext]",
        "button[ngsStepperPrevious]",
        "ngs-step",
        "ngs-stepper"
      ],
      "exportedSymbols": [
        "Step",
        "StepLabel",
        "Stepper",
        "StepperNext",
        "StepperPrevious"
      ],
      "inputs": [
        "headerPosition",
        "hideHeaderBorder",
        "labelPosition",
        "stickyHeader"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-border",
        "--ngs-color-on-primary",
        "--ngs-color-on-success",
        "--ngs-color-on-surface",
        "--ngs-color-on-surface-variant",
        "--ngs-color-primary",
        "--ngs-color-success",
        "--ngs-color-surface-container-high",
        "--ngs-color-surface-container-highest",
        "--ngs-color-surface-container-lowest",
        "--ngs-stepper-content-padding",
        "--ngs-stepper-header-border-color",
        "--ngs-stepper-header-gap",
        "--ngs-stepper-header-padding",
        "--ngs-stepper-icon-active-bg",
        "--ngs-stepper-icon-active-color",
        "--ngs-stepper-icon-bg",
        "--ngs-stepper-icon-color",
        "--ngs-stepper-icon-completed-bg",
        "--ngs-stepper-icon-completed-color",
        "--ngs-stepper-icon-size",
        "--ngs-stepper-label-active-color",
        "--ngs-stepper-label-color",
        "--ngs-stepper-line-color"
      ],
      "example": null
    },
    {
      "name": "suggestions",
      "title": "Suggestions",
      "overviewName": "Suggestions",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/suggestions",
      "publicApi": "projects/components/suggestions/public-api.ts",
      "sourceRoot": "projects/components/suggestions/src",
      "docsPath": "/components/suggestions",
      "docsOverviewSource": "projects/docs/src/app/components/suggestions/overview/overview.html",
      "purpose": "Render a grouped visual list of contextual suggestions, search results, recent items, or shortcuts.",
      "useWhen": "Use ngs-suggestions as the visual list inside search dropdowns, assistant inputs, command-like panels, or contextual suggestion popovers. Group related rows with ngs-suggestion-block, use ngs-suggestion for each clickable row, place icons with ngsSuggestionIcon, thumbnails or avatars with ngsSuggestionThumb, and use inline blocks for quick actions such as create buttons. Good for recently viewed items, users, files, pages, matching search results, and quick create shortcuts. Do not use Suggestions as a form value picker; use Autocomplete or Select. Do not use it for a short contextual command menu; use Menu. Do not use it for persistent app navigation; use Navigation, Sidebar, Sidenav, or RailNav. Do not use it as a complete command palette by itself; it can provide the grouped visual result list, but search state, keyboard handling, filtering, and command execution belong to the surrounding feature. Do not use it for page-level empty-state recommendations or assistant cards; compose those with EmptyState, Card, Alert, or the page layout.",
      "exampleTopics": [
        "Basic suggestions"
      ],
      "minimalExample": "<ngs-suggestions class=\"rounded-b border border-muted w-[600px] p-4 flex flex-col gap-4\">\n  <ngs-suggestion-block heading=\"Recently Viewed\">\n    <ngs-suggestion>\n      <ngs-icon name=\"fluent:options-24-regular\" ngsSuggestionIcon/>\n      <span>Settings</span> &ndash; <span class=\"text-neutral-400\">My Profile</span>\n    </ngs-suggestion>\n    <ngs-suggestion>\n      <ngs-icon name=\"fluent:data-usage-24-regular\" ngsSuggestionIcon/>\n      <span>Application statistics</span> &ndash; <span class=\"text-neutral-400\">Admin Panel</span>\n    </ngs-suggestion>\n  </ngs-suggestion-block>\n  <ngs-suggestion-block heading=\"Users\">\n    <ngs-suggestion>\n      <ngs-avatar label=\"PS\" ngsSuggestionThumb class=\"size-8\"/>\n      Pavel Salauyou\n    </ngs-suggestion>\n    <ngs-suggestion>\n      <ngs-avatar image=\"assets/avatars/8.svg\" label=\"JJ\" ngsSuggestionThumb class=\"size-8\"/>\n      Jessica Jones\n    </ngs-suggestion>\n  </ngs-suggestion-block>\n  <ngs-suggestion-block heading=\"Files\">\n    <ngs-suggestion>\n      <div class=\"size-8 rounded-full bg-surface-container text-on-surface shadow-sm\n                    flex items-center justify-center\" ngsSuggestionThumb>\n        <ngs-icon name=\"fluent:image-24-regular\"/>\n      </div>\n      <span>Application flow.png</span> &ndash; <span class=\"text-neutral-400\">30KB</span>\n    </ngs-suggestion>\n    <ngs-suggestion>\n      <div class=\"size-8 rounded-full bg-surface-container text-on-surface shadow-sm\n                    flex items-center justify-center\" ngsSuggestionThumb>\n        <ngs-icon name=\"fluent:document-text-24-regular\"/>\n      </div>\n      <span>Monthl\n...",
      "exampleFiles": [
        {
          "name": "basic-suggestions-example",
          "title": "Basic suggestions",
          "file": "projects/docs/src/app/components/suggestions/_examples/basic-suggestions-example/basic-suggestions-example.html",
          "source": "<ngs-suggestions class=\"rounded-b border border-muted w-[600px] p-4 flex flex-col gap-4\">\n  <ngs-suggestion-block heading=\"Recently Viewed\">\n    <ngs-suggestion>\n      <ngs-icon name=\"fluent:options-24-regular\" ngsSuggestionIcon/>\n      <span>Settings</span> &ndash; <span class=\"text-neutral-400\">My Profile</span>\n    </ngs-suggestion>\n    <ngs-suggestion>\n      <ngs-icon name=\"fluent:data-usage-24-regular\" ngsSuggestionIcon/>\n      <span>Application statistics</span> &ndash; <span class=\"text-neutral-400\">Admin Panel</span>\n    </ngs-suggestion>\n  </ngs-suggestion-block>\n  <ngs-suggestion-block heading=\"Users\">\n    <ngs-suggestion>\n      <ngs-avatar label=\"PS\" ngsSuggestionThumb class=\"size-8\"/>\n      Pavel Salauyou\n    </ngs-suggestion>\n    <ngs-suggestion>\n      <ngs-avatar image=\"assets/avatars/8.svg\" label=\"JJ\" ngsSuggestionThumb class=\"size-8\"/>\n      Jessica Jones\n    </ngs-suggestion>\n  </ngs-suggestion-block>\n  <ngs-suggestion-block heading=\"Files\">\n    <ngs-suggestion>\n      <div class=\"size-8 rounded-full bg-surface-container text-on-surface shadow-sm\n                    flex items-center justify-center\" ngsSuggestionThumb>\n        <ngs-icon name=\"fluent:image-24-regular\"/>\n      </div>\n      <span>Application flow.png</span> &ndash; <span class=\"text-neutral-400\">30KB</span>\n    </ngs-suggestion>\n    <ngs-suggestion>\n      <div class=\"size-8 rounded-full bg-surface-container text-on-surface shadow-sm\n                    flex items-center justify-center\" ngsSuggestionThumb>\n        <ngs-icon name=\"fluent:document-text-24-regular\"/>\n      </div>\n      <span>Monthl\n..."
        }
      ],
      "previewAsset": "projects/components/suggestions/preview.svg",
      "selectors": [
        "[ngs-suggestion]",
        "[ngsSuggestionIcon]",
        "[ngsSuggestionThumb]",
        "ngs-suggestion",
        "ngs-suggestion-block",
        "ngs-suggestions"
      ],
      "exportedSymbols": [
        "Suggestion",
        "SuggestionBlock",
        "SuggestionIconDirective",
        "Suggestions",
        "SuggestionThumbDirective"
      ],
      "inputs": [
        "heading",
        "inline",
        "showDivider"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-avatar-size",
        "--ngs-color-on-surface",
        "--ngs-color-surface-bright",
        "--ngs-color-surface-container-high",
        "--ngs-color-surface-container-low",
        "--ngs-color-surface-container-lowest",
        "--ngs-font-size-sm",
        "--ngs-font-size-xs",
        "--ngs-suggestion-block-content-padding",
        "--ngs-suggestion-block-font-size",
        "--ngs-suggestion-block-font-weight",
        "--ngs-suggestion-block-heading-color",
        "--ngs-suggestion-border-radius",
        "--ngs-suggestion-height",
        "--ngs-suggestion-hover-bg",
        "--ngs-suggestion-padding",
        "--ngs-suggestions-bg"
      ],
      "example": null
    },
    {
      "name": "tab-panel",
      "title": "Tab Panel",
      "overviewName": "Tab Panel",
      "category": "navigation",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/tab-panel",
      "publicApi": "projects/components/tab-panel/public-api.ts",
      "sourceRoot": "projects/components/tab-panel/src",
      "docsPath": "/navigation/tab-panel",
      "docsOverviewSource": "projects/docs/src/app/navigation/tab-panel/overview/overview.html",
      "purpose": "Create a compact vertical tool or navigation panel with a linked aside content area.",
      "useWhen": "Use ngs-tab-panel when a workspace or editor needs a vertical set of icon/text items that controls adjacent aside content. Use ngs-tab-panel-content with ngs-tab-panel-nav and ngs-tab-panel-item for the rail, bind items to content with matching for values and ngsTabPanelAsideContent ids inside ngs-tab-panel-aside, and use activeItemId to choose the active item. Good for image editors, design tools, asset panels, layers, inspectors, workspace switchers, tool palettes, and settings/tools inside dense work surfaces. Use compact for icon-only rails with tooltips, header/content/footer regions to group items, and ngs-tab-panel-custom-item for custom items such as avatars, workspaces, or add actions. Do not use TabPanel for ordinary horizontal page tabs; use Tabs. Do not use it for primary app navigation; use Sidebar, Navigation, Sidenav, or RailNav. Do not use it for temporary overlay side content; use Drawer. Do not use it for a structured page section; use Panel. Do not use it for workflow steps; use Stepper. Do not use it for contextual command lists; use Menu.",
      "exampleTopics": [
        "Basic tab panel",
        "Tab panel with panel inside",
        "Tab panel compact state",
        "Tab panel with panels inside",
        "Tab panel compact"
      ],
      "minimalExample": "<div class=\"flex gap-10\">\n  <ngs-tab-panel activeItemId=\"home\" class=\"h-[500px]\">\n    <ngs-tab-panel-content>\n      <ngs-tab-panel-nav>\n        <ngs-tab-panel-item for=\"home\">\n          <ngs-icon name=\"fluent:home-24-regular\" ngsTabPanelItemIcon/>\n          <ngs-tab-panel-item-text>Home</ngs-tab-panel-item-text>\n        </ngs-tab-panel-item>\n        <ngs-tab-panel-item for=\"code\">\n          <ngs-icon name=\"fluent:code-24-regular\" ngsTabPanelItemIcon/>\n          <ngs-tab-panel-item-text>Code</ngs-tab-panel-item-text>\n        </ngs-tab-panel-item>\n      </ngs-tab-panel-nav>\n    </ngs-tab-panel-content>\n    <ngs-tab-panel-aside class=\"bg-surface-container-low rounded-xl\">\n      <ng-template ngsTabPanelAsideContent=\"home\">\n        <div class=\"p-5\">Home content</div>\n      </ng-template>\n      <ng-template ngsTabPanelAsideContent=\"code\">\n        <div class=\"p-5\">Code content</div>\n      </ng-template>\n    </ngs-tab-panel-aside>\n  </ngs-tab-panel>\n  <ngs-tab-panel activeItemId=\"home\" class=\"h-[500px] bg-surface-container-low rounded-xl\">\n    <ngs-tab-panel-content class=\"py-2.5\">\n      <ngs-tab-panel-nav>\n        <ngs-tab-panel-item for=\"home\">\n          <ngs-icon name=\"fluent:home-24-regular\" ngsTabPanelItemIcon/>\n          <ngs-tab-panel-item-text>Home</ngs-tab-panel-item-text>\n        </ngs-tab-panel-item>\n        <ngs-tab-panel-item for=\"code\">\n          <ngs-icon name=\"fluent:code-24-regular\" ngsTabPanelItemIcon/>\n          <ngs-tab-panel-item-text>Code</ngs-tab-panel-item-text>\n        </ngs-tab-panel-item>\n      </ngs-tab-panel-nav>\n    </ngs-tab-panel-content>\n    <ngs-ta\n...",
      "exampleFiles": [
        {
          "name": "basic-tab-panel-example",
          "title": "Basic tab panel",
          "file": "projects/docs/src/app/navigation/tab-panel/_examples/basic-tab-panel-example/basic-tab-panel-example.html",
          "source": "<div class=\"flex gap-10\">\n  <ngs-tab-panel activeItemId=\"home\" class=\"h-[500px]\">\n    <ngs-tab-panel-content>\n      <ngs-tab-panel-nav>\n        <ngs-tab-panel-item for=\"home\">\n          <ngs-icon name=\"fluent:home-24-regular\" ngsTabPanelItemIcon/>\n          <ngs-tab-panel-item-text>Home</ngs-tab-panel-item-text>\n        </ngs-tab-panel-item>\n        <ngs-tab-panel-item for=\"code\">\n          <ngs-icon name=\"fluent:code-24-regular\" ngsTabPanelItemIcon/>\n          <ngs-tab-panel-item-text>Code</ngs-tab-panel-item-text>\n        </ngs-tab-panel-item>\n      </ngs-tab-panel-nav>\n    </ngs-tab-panel-content>\n    <ngs-tab-panel-aside class=\"bg-surface-container-low rounded-xl\">\n      <ng-template ngsTabPanelAsideContent=\"home\">\n        <div class=\"p-5\">Home content</div>\n      </ng-template>\n      <ng-template ngsTabPanelAsideContent=\"code\">\n        <div class=\"p-5\">Code content</div>\n      </ng-template>\n    </ngs-tab-panel-aside>\n  </ngs-tab-panel>\n  <ngs-tab-panel activeItemId=\"home\" class=\"h-[500px] bg-surface-container-low rounded-xl\">\n    <ngs-tab-panel-content class=\"py-2.5\">\n      <ngs-tab-panel-nav>\n        <ngs-tab-panel-item for=\"home\">\n          <ngs-icon name=\"fluent:home-24-regular\" ngsTabPanelItemIcon/>\n          <ngs-tab-panel-item-text>Home</ngs-tab-panel-item-text>\n        </ngs-tab-panel-item>\n        <ngs-tab-panel-item for=\"code\">\n          <ngs-icon name=\"fluent:code-24-regular\" ngsTabPanelItemIcon/>\n          <ngs-tab-panel-item-text>Code</ngs-tab-panel-item-text>\n        </ngs-tab-panel-item>\n      </ngs-tab-panel-nav>\n    </ngs-tab-panel-content>\n    <ngs-ta\n..."
        },
        {
          "name": "tab-panel-compact-example",
          "title": "Tab panel compact",
          "file": "projects/docs/src/app/navigation/tab-panel/_examples/tab-panel-compact-example/tab-panel-compact-example.html",
          "source": "<div class=\"flex gap-10\">\n  <ngs-tab-panel activeItemId=\"dashboard\" compact class=\"h-[600px]\">\n    <ngs-tab-panel-header>\n      <ngs-tab-panel-nav>\n        <ngs-tab-panel-item for=\"dashboard\" ngsTooltip=\"Dashboard\" ngsTooltipPosition=\"after\">\n          <ngs-icon name=\"fluent:home-24-regular\" ngsTabPanelItemIcon />\n        </ngs-tab-panel-item>\n        <ngs-tab-panel-item for=\"projects\" ngsTooltip=\"Projects\" ngsTooltipPosition=\"after\">\n          <ngs-icon name=\"fluent:board-24-regular\" ngsTabPanelItemIcon />\n        </ngs-tab-panel-item>\n        <ngs-tab-panel-item for=\"my-assets\" ngsTooltip=\"My Assets\" ngsTooltipPosition=\"after\">\n          <ngs-icon name=\"fluent:folder-24-regular\" ngsTabPanelItemIcon />\n        </ngs-tab-panel-item>\n      </ngs-tab-panel-nav>\n    </ngs-tab-panel-header>\n    <ngs-tab-panel-content>\n      <ngs-divider class=\"mx-2.5 my-3\"/>\n      <div class=\"h-full flex flex-col justify-center items-center\">\n        <ngs-tab-panel-nav>\n          <ngs-tab-panel-custom-item for=\"workspace1\" ngsTooltip=\"Workspace 1\" ngsTooltipPosition=\"after\">\n            <ngs-avatar label=\"am\" class=\"size-full rounded-xl\" automaticColor=\"#bfdbfe\" />\n          </ngs-tab-panel-custom-item>\n          <ngs-tab-panel-custom-item for=\"workspace2\" ngsTooltip=\"Workspace 2\" ngsTooltipPosition=\"after\">\n            <ngs-avatar label=\"rv\" class=\"size-full rounded-xl\" automaticColor=\"#a7f3d0\" />\n          </ngs-tab-panel-custom-item>\n          <ngs-tab-panel-custom-item ngsTooltip=\"Add Workspace\" ngsTooltipPosition=\"after\"\n                                     class=\"size-full rounded-xl bord\n..."
        },
        {
          "name": "tab-panel-with-panels-inside-example",
          "title": "Tab panel with panels inside",
          "file": "projects/docs/src/app/navigation/tab-panel/_examples/tab-panel-with-panels-inside-example/tab-panel-with-panels-inside-example.html",
          "source": "<div class=\"flex gap-10\">\n  <ngs-tab-panel activeItemId=\"home\" class=\"h-[500px]\">\n    <ngs-tab-panel-content>\n      <ngs-tab-panel-nav>\n        <ngs-tab-panel-item for=\"home\">\n          <ngs-icon name=\"fluent:home-24-regular\" ngsTabPanelItemIcon/>\n          <ngs-tab-panel-item-text>Home</ngs-tab-panel-item-text>\n        </ngs-tab-panel-item>\n        <ngs-tab-panel-item for=\"code\">\n          <ngs-icon name=\"fluent:code-24-regular\" ngsTabPanelItemIcon/>\n          <ngs-tab-panel-item-text>Code</ngs-tab-panel-item-text>\n        </ngs-tab-panel-item>\n      </ngs-tab-panel-nav>\n    </ngs-tab-panel-content>\n    <ngs-tab-panel-aside class=\"bg-surface-container-low rounded-xl\">\n      <ng-template ngsTabPanelAsideContent=\"home\">\n        <ngs-panel>\n          <ngs-panel-header class=\"border-b border-b-border flex items-center px-4\">Home Header</ngs-panel-header>\n          <ngs-panel-content class=\"p-4\">\n            <div class=\"h-[1000px]\">Home Content</div>\n          </ngs-panel-content>\n          <ngs-panel-footer class=\"border-t border-t-border flex items-center px-4\">Footer</ngs-panel-footer>\n        </ngs-panel>\n      </ng-template>\n      <ng-template ngsTabPanelAsideContent=\"code\">\n        <ngs-panel>\n          <ngs-panel-header class=\"border-b border-b-border flex items-center px-4\">Code Header</ngs-panel-header>\n          <ngs-panel-content class=\"p-4\">\n            <div class=\"h-[1000px]\">Code Content</div>\n          </ngs-panel-content>\n          <ngs-panel-footer class=\"border-t border-t-border flex items-center px-4\">Footer</ngs-panel-footer>\n        </ngs-panel>\n      </ng-\n..."
        }
      ],
      "previewAsset": "projects/components/tab-panel/preview.svg",
      "selectors": [
        "[ngsTabPanelAsideContent]",
        "[ngsTabPanelItemIcon]",
        "ngs-tab-panel",
        "ngs-tab-panel-aside",
        "ngs-tab-panel-content",
        "ngs-tab-panel-custom-item",
        "ngs-tab-panel-footer",
        "ngs-tab-panel-header",
        "ngs-tab-panel-item",
        "ngs-tab-panel-item-text",
        "ngs-tab-panel-nav"
      ],
      "exportedSymbols": [
        "TAB_PANEL_ASIDE",
        "TAB_PANEL_NAV",
        "TabPanel",
        "TabPanelApiService",
        "TabPanelAside",
        "TabPanelAsideContentDirective",
        "TabPanelContent",
        "TabPanelCustomItem",
        "TabPanelFooter",
        "TabPanelHeader",
        "TabPanelItem",
        "TabPanelItemIconDirective",
        "TabPanelItemText",
        "TabPanelNav"
      ],
      "inputs": [
        "activeItemId",
        "compact",
        "for",
        "hideContentIfTabNotSelected",
        "ngsTabPanelAsideContent"
      ],
      "outputs": [
        "itemIdChanged"
      ],
      "cssTokens": [
        "--ngs-font-size-xs",
        "--ngs-nav-item-active-bg",
        "--ngs-nav-item-active-color",
        "--ngs-nav-item-color",
        "--ngs-nav-item-hover-bg",
        "--ngs-nav-item-hover-color",
        "--ngs-nav-item-radius",
        "--ngs-tab-panel-aside-width",
        "--ngs-tab-panel-compact-item-height",
        "--ngs-tab-panel-compact-item-width",
        "--ngs-tab-panel-compact-width",
        "--ngs-tab-panel-item-active-bg",
        "--ngs-tab-panel-item-active-color",
        "--ngs-tab-panel-item-border-radius",
        "--ngs-tab-panel-item-color",
        "--ngs-tab-panel-item-gap",
        "--ngs-tab-panel-item-height",
        "--ngs-tab-panel-item-hover-bg",
        "--ngs-tab-panel-item-hover-color",
        "--ngs-tab-panel-item-icon-font-size",
        "--ngs-tab-panel-item-padding",
        "--ngs-tab-panel-item-text-font-size",
        "--ngs-tab-panel-item-width",
        "--ngs-tab-panel-nav-gap",
        "--ngs-tab-panel-nav-padding",
        "--ngs-tab-panel-width"
      ],
      "example": null
    },
    {
      "name": "table",
      "title": "Table",
      "overviewName": "Table",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/table",
      "publicApi": "projects/components/table/public-api.ts",
      "sourceRoot": "projects/components/table/src",
      "docsPath": "/components/table",
      "docsOverviewSource": "projects/docs/src/app/components/table/overview/overview.html",
      "purpose": "Render static or simple template-defined tabular data with known columns.",
      "useWhen": "Use table[ngs-table] or ngs-table for static or simple tabular data where columns are known in Angular templates: read-only tables, documentation tables, settings summaries, static comparison rows, lightweight report tables, and small non-interactive admin tables. Define columns with ngsColumnDef, header/body/footer cells with ngsHeaderCellDef, ngsCellDef, and ngsFooterCellDef, and rows with ngsHeaderRowDef, ngsRowDef, and ngsFooterRowDef. Use TableDataSource only for lightweight local table behavior, not as a replacement for a real datatable. Use sticky/stickyEnd for fixed columns and sticky row defs for sticky header or footer. Use table[ngs-native-table] only for static HTML tables without a data source. Do not build tables with div role=\"table\" or custom grid markup when ngs-table fits. Use DataView instead when the UI is a datatable or working data surface with row actions, selection, sorting, search/filter state, pagination, column sizing/settings, saved views, server-driven data, or complex record management. Use List for simple vertical rows without real columns. Use Tree for hierarchical rows. Use Grid or Tiles for dashboard layouts. Use Sort only for sort state behavior; it does not replace Table.",
      "exampleTopics": [
        "Native Table",
        "Basic Table",
        "Table With Pagination",
        "Table With Sorting",
        "Table With Filtering",
        "Table With Selection",
        "Table With Fixed Columns",
        "Table With Fixed Header",
        "Table With Fixed Footer",
        "Drag and drop rows table",
        "Static table",
        "Table with sort",
        "Table with sticky header",
        "Table with sticky footer",
        "Sortable table"
      ],
      "minimalExample": "<div class=\"border border-muted  rounded-xl overflow-hidden\">\n  <table ngs-table [dataSource]=\"dataSource\">\n    <!-- Position Column -->\n    <ng-container ngsColumnDef=\"position\">\n      <th ngs-header-cell *ngsHeaderCellDef class=\"text-neutral-500 dark:text-neutral-400\"> No. </th>\n      <td ngs-cell *ngsCellDef=\"let element\"> {{element.position}} </td>\n    </ng-container>\n    <!-- Name Column -->\n    <ng-container ngsColumnDef=\"name\">\n      <th ngs-header-cell *ngsHeaderCellDef class=\"text-neutral-500 dark:text-neutral-400\"> Name </th>\n      <td ngs-cell *ngsCellDef=\"let element\"> {{element.name}} </td>\n    </ng-container>\n    <!-- Weight Column -->\n    <ng-container ngsColumnDef=\"weight\">\n      <th ngs-header-cell *ngsHeaderCellDef class=\"text-neutral-500 dark:text-neutral-400\"> Weight </th>\n      <td ngs-cell *ngsCellDef=\"let element\"> {{element.weight}} </td>\n    </ng-container>\n    <!-- Symbol Column -->\n    <ng-container ngsColumnDef=\"symbol\">\n      <th ngs-header-cell *ngsHeaderCellDef class=\"text-neutral-500 dark:text-neutral-400\"> Symbol </th>\n      <td ngs-cell *ngsCellDef=\"let element\"> {{element.symbol}} </td>\n    </ng-container>\n    <tr ngs-header-row *ngsHeaderRowDef=\"displayedColumns\"></tr>\n    <tr ngs-row *ngsRowDef=\"let row; columns: displayedColumns;\"></tr>\n  </table>\n</div>",
      "exampleFiles": [
        {
          "name": "basic-table-example",
          "title": "Basic table",
          "file": "projects/docs/src/app/components/table/_examples/basic-table-example/basic-table-example.html",
          "source": "<div class=\"border border-muted  rounded-xl overflow-hidden\">\n  <table ngs-table [dataSource]=\"dataSource\">\n    <!-- Position Column -->\n    <ng-container ngsColumnDef=\"position\">\n      <th ngs-header-cell *ngsHeaderCellDef class=\"text-neutral-500 dark:text-neutral-400\"> No. </th>\n      <td ngs-cell *ngsCellDef=\"let element\"> {{element.position}} </td>\n    </ng-container>\n    <!-- Name Column -->\n    <ng-container ngsColumnDef=\"name\">\n      <th ngs-header-cell *ngsHeaderCellDef class=\"text-neutral-500 dark:text-neutral-400\"> Name </th>\n      <td ngs-cell *ngsCellDef=\"let element\"> {{element.name}} </td>\n    </ng-container>\n    <!-- Weight Column -->\n    <ng-container ngsColumnDef=\"weight\">\n      <th ngs-header-cell *ngsHeaderCellDef class=\"text-neutral-500 dark:text-neutral-400\"> Weight </th>\n      <td ngs-cell *ngsCellDef=\"let element\"> {{element.weight}} </td>\n    </ng-container>\n    <!-- Symbol Column -->\n    <ng-container ngsColumnDef=\"symbol\">\n      <th ngs-header-cell *ngsHeaderCellDef class=\"text-neutral-500 dark:text-neutral-400\"> Symbol </th>\n      <td ngs-cell *ngsCellDef=\"let element\"> {{element.symbol}} </td>\n    </ng-container>\n    <tr ngs-header-row *ngsHeaderRowDef=\"displayedColumns\"></tr>\n    <tr ngs-row *ngsRowDef=\"let row; columns: displayedColumns;\"></tr>\n  </table>\n</div>"
        },
        {
          "name": "sortable-table-example",
          "title": "Sortable table",
          "file": "projects/docs/src/app/components/table/_examples/sortable-table-example/sortable-table-example.html",
          "source": "<div class=\"border border-muted rounded-xl overflow-hidden\">\n  <ngs-table #table [dataSource]=\"dataSource\"\n             cdkDropList (cdkDropListDropped)=\"drop($event)\" cdkDropListData=\"dataSource\"\n             ngSkipHydration>\n    <!-- Position Column -->\n    <ng-container ngsColumnDef=\"position\">\n      <ngs-header-cell *ngsHeaderCellDef>No.</ngs-header-cell>\n      <ngs-cell *ngsCellDef=\"let element\">\n        <div class=\"flex items-center gap-2\">\n          <ngs-icon name=\"fluent:re-order-dots-vertical-24-regular\" class=\"cursor-move -ms-1.5\"/>\n          <span>{{element.position}}</span>\n        </div>\n      </ngs-cell>\n    </ng-container>\n    <!-- Name Column -->\n    <ng-container ngsColumnDef=\"name\">\n      <ngs-header-cell *ngsHeaderCellDef> Name </ngs-header-cell>\n      <ngs-cell *ngsCellDef=\"let element\"> {{element.name}} </ngs-cell>\n    </ng-container>\n    <!-- Weight Column -->\n    <ng-container ngsColumnDef=\"weight\">\n      <ngs-header-cell *ngsHeaderCellDef> Weight </ngs-header-cell>\n      <ngs-cell *ngsCellDef=\"let element\"> {{element.weight}} </ngs-cell>\n    </ng-container>\n    <!-- Symbol Column -->\n    <ng-container ngsColumnDef=\"symbol\">\n      <ngs-header-cell *ngsHeaderCellDef> Symbol </ngs-header-cell>\n      <ngs-cell *ngsCellDef=\"let element\"> {{element.symbol}} </ngs-cell>\n    </ng-container>\n    <!-- Quantity Column -->\n    <ng-container ngsColumnDef=\"quantity\">\n      <ngs-header-cell *ngsHeaderCellDef> Quantity of Element </ngs-header-cell>\n      <ngs-cell *ngsCellDef=\"let element\">{{element.quantity}}</ngs-cell>\n    </ng-container>\n    <tr ngs-header-row *n\n..."
        },
        {
          "name": "static-table-example",
          "title": "Static table",
          "file": "projects/docs/src/app/components/table/_examples/static-table-example/static-table-example.html",
          "source": "<table ngs-native-table>\n  <thead>\n    <tr>\n      <th>Position</th>\n      <th>Name</th>\n      <th>Weight</th>\n      <th>Symbol</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>1</td>\n      <td>Hydrogen</td>\n      <td>1.0079</td>\n      <td>H</td>\n    </tr>\n    <tr>\n      <td>2</td>\n      <td>Helium</td>\n      <td>4.0026</td>\n      <td>He</td>\n    </tr>\n    <tr>\n      <td>3</td>\n      <td>Lithium</td>\n      <td>6.941</td>\n      <td>Li</td>\n    </tr>\n    <tr>\n      <td>4</td>\n      <td>Beryllium</td>\n      <td>9.0122</td>\n      <td>Be</td>\n    </tr>\n    <tr>\n      <td>5</td>\n      <td>Boron</td>\n      <td>10.811</td>\n      <td>B</td>\n    </tr>\n  </tbody>\n</table>"
        }
      ],
      "previewAsset": "projects/components/table/preview.svg",
      "selectors": [
        "[ngs-cell]",
        "[ngs-footer-cell]",
        "[ngs-footer-row]",
        "[ngs-header-cell]",
        "[ngs-header-row]",
        "[ngs-row]",
        "[ngsCellDef]",
        "[ngsColumnDef]",
        "[ngsFooterCellDef]",
        "[ngsFooterRowDef]",
        "[ngsHeaderCellDef]",
        "[ngsHeaderRowDef]",
        "[ngsRowDef]",
        "ng-template[ngsNoDataRow]",
        "ngs-cell",
        "ngs-footer-cell",
        "ngs-footer-row",
        "ngs-header-cell",
        "ngs-header-row",
        "ngs-row",
        "ngs-table",
        "ngs-text-column",
        "table[ngs-native-table]",
        "table[ngs-table]",
        "td[ngs-cell]",
        "td[ngs-footer-cell]",
        "th[ngs-header-cell]",
        "tr[ngs-footer-row]",
        "tr[ngs-header-row]",
        "tr[ngs-row]"
      ],
      "exportedSymbols": [
        "Cell",
        "CellDef",
        "ColumnDef",
        "FooterCell",
        "FooterCellDef",
        "FooterRow",
        "FooterRowDef",
        "HeaderCell",
        "HeaderCellDef",
        "HeaderRow",
        "HeaderRowDef",
        "NativeTable",
        "NoDataRow",
        "Row",
        "RowDef",
        "Table",
        "TableDataSource",
        "TextColumn"
      ],
      "inputs": [
        "columns",
        "hideBody",
        "hideFooter",
        "hideHeader",
        "name",
        "sticky",
        "when"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-surface-container",
        "--ngs-data-view-header-bg",
        "--ngs-data-view-hl-header-margin",
        "--ngs-data-view-hl-header-row-bg",
        "--ngs-data-view-row-bg",
        "--ngs-radius-lg",
        "--ngs-table-background",
        "--ngs-table-border-color",
        "--ngs-table-cell-font-size",
        "--ngs-table-cell-padding",
        "--ngs-table-header-bg",
        "--ngs-table-header-cell-background",
        "--ngs-table-header-cell-color",
        "--ngs-table-header-cell-font-size",
        "--ngs-table-header-cell-font-weight",
        "--ngs-table-header-row-height",
        "--ngs-table-row-bg",
        "--ngs-table-row-height"
      ],
      "example": "<table ngs-table [dataSource]=\"dataSource\">...</table>"
    },
    {
      "name": "tabs",
      "title": "Tabs",
      "overviewName": "Tabs",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/tabs",
      "publicApi": "projects/components/tabs/public-api.ts",
      "sourceRoot": "projects/components/tabs/src",
      "docsPath": "/components/tabs",
      "docsOverviewSource": "projects/docs/src/app/components/tabs/overview/overview.html",
      "purpose": "Switch between peer views inside one page or section context, with only one panel visible at a time.",
      "useWhen": "Use ngs-tab-group with ngs-tab for local content tabs that do not require routing. Use ngs-tab-nav-bar with a[ngs-tab-link] and ngs-tab-nav-panel for route-linked tabs inside one section, such as documentation overview/API pages or detail subsections. Good for entity details, settings subsections, overview/activity/files/settings pages, alternate views of one object, or peer panels that share the same context. Supports selectedIndex, selectedIndexChange, selectedTabChange, disabled tabs, custom ngsTabLabel templates, explicit ngsTabContent templates, preserveContent, stretchTabs, alignTabs, headerPosition above/below, overflow pagination controls, and animationDuration/custom animations. Do not use Tabs for compact mode or value switches; use Segmented. Do not use for wizard or process steps; use Stepper. Do not use for vertical tool panels with linked aside content; use TabPanel. Do not use for primary app navigation; use Navigation, Sidebar, Sidenav, or RailNav. Do not use for collapsible sections; use ExpansionPanel. Do not use for route paths; use Breadcrumbs. Do not use for choosing a form value; use Select, Radio, RadioCard, Checkbox, or ButtonToggle depending on the interaction.",
      "exampleTopics": [
        "Basic Tabs",
        "Tabs with aligned labels",
        "Tabs with custom label template",
        "Tabs with the headers on the bottom",
        "Paginated Tabs",
        "Sortable Tabs",
        "Tabs with custom animations",
        "Tabs with headers on the bottom",
        "Tabs animations"
      ],
      "minimalExample": "<ngs-tab-group>\n  <ngs-tab label=\"First\">\n    <div class=\"py-5\">Content 1</div>\n  </ngs-tab>\n  <ngs-tab label=\"Second\">\n    <div class=\"py-5\">Content 2</div>\n  </ngs-tab>\n  <ngs-tab label=\"Third\">\n    <div class=\"py-5\">Content 3</div>\n  </ngs-tab>\n</ngs-tab-group>",
      "exampleFiles": [
        {
          "name": "basic-tabs-example",
          "title": "Basic tabs",
          "file": "projects/docs/src/app/components/tabs/_examples/basic-tabs-example/basic-tabs-example.html",
          "source": "<ngs-tab-group>\n  <ngs-tab label=\"First\">\n    <div class=\"py-5\">Content 1</div>\n  </ngs-tab>\n  <ngs-tab label=\"Second\">\n    <div class=\"py-5\">Content 2</div>\n  </ngs-tab>\n  <ngs-tab label=\"Third\">\n    <div class=\"py-5\">Content 3</div>\n  </ngs-tab>\n</ngs-tab-group>"
        },
        {
          "name": "paginated-tabs-example",
          "title": "Paginated tabs",
          "file": "projects/docs/src/app/components/tabs/_examples/paginated-tabs-example/paginated-tabs-example.html",
          "source": "<ngs-tab-group>\n  @for (tab of lotsOfTabs; track tab) {\n    <ngs-tab [label]=\"tab\">Content</ngs-tab>\n  }\n</ngs-tab-group>"
        },
        {
          "name": "sortable-tabs-example",
          "title": "Sortable tabs",
          "file": "projects/docs/src/app/components/tabs/_examples/sortable-tabs-example/sortable-tabs-example.html",
          "source": "<ngs-tab-group\n  cdkDropList\n  cdkDropListOrientation=\"horizontal\"\n  (cdkDropListDropped)=\"drop($event)\"\n  cdkDropListElementContainer=\".ngs-tab-group-header-list\"\n  class=\"example-drag-tabs\"\n  [(selectedIndex)]=\"selectedTabIndex\"\n  animationDuration=\"0\">\n  @for (tab of tabs; track $index) {\n    <ngs-tab>\n      <ng-template ngs-tab-label>\n        <span\n          cdkDrag\n          cdkDragPreviewClass=\"example-drag-tabs-preview\"\n          cdkDragRootElement=\".ngs-tab-label\">{{tab}}</span>\n      </ng-template>\n      <h3 class=\"ngs-title-large\">Content for {{tab}}</h3>\n      Lorem ipsum dolor, sit amet consectetur adipisicing elit. Quidem perspiciatis in delectus\n      reprehenderit, molestias ullam nostrum odit, modi consequatur harum beatae? Sapiente\n      voluptatibus illo natus assumenda hic quasi dolor et laborum veniam! Molestiae architecto\n      nesciunt est quo nisi? Nostrum repellendus quibusdam laudantium? Optio architecto explicabo\n      labore sapiente cum alias nobis!\n    </ngs-tab>\n  }\n</ngs-tab-group>"
        }
      ],
      "previewAsset": "projects/components/tabs/preview.svg",
      "selectors": [
        "[ngs-tab-content]",
        "[ngs-tab-label]",
        "[ngs-tab-nav-bar]",
        "[ngsTabContent]",
        "[ngsTabLabel]",
        "a[ngs-tab-link]",
        "ngs-tab",
        "ngs-tab-group",
        "ngs-tab-nav-bar",
        "ngs-tab-nav-panel"
      ],
      "exportedSymbols": [
        "Tab",
        "TAB_CONTENT",
        "TAB_LABEL",
        "TabChangeEvent",
        "TabContent",
        "TabGroup",
        "TabLabel",
        "TabLink",
        "TabNavBar",
        "TabNavPanel"
      ],
      "inputs": [
        "animate.enter",
        "animate.leave",
        "animationDuration",
        "aria-label",
        "aria-labelledby",
        "disabled",
        "disableRipple",
        "headerPosition",
        "label",
        "ngs-align-tabs",
        "ngs-stretch-tabs",
        "ngsRippleDisabled",
        "preserveContent",
        "selectedIndex",
        "tabPanel"
      ],
      "outputs": [
        "focusChange",
        "selectedIndexChange",
        "selectedTabChange"
      ],
      "cssTokens": [
        "--ngs-color-border",
        "--ngs-color-on-surface-variant",
        "--ngs-color-primary",
        "--ngs-color-surface-container-high",
        "--ngs-tab-content-padding",
        "--ngs-tab-group-animation-duration",
        "--ngs-tab-group-header-border-bottom",
        "--ngs-tab-group-header-border-top",
        "--ngs-tab-group-header-height",
        "--ngs-tab-group-pagination-control-after-border-left",
        "--ngs-tab-group-pagination-control-before-border-right",
        "--ngs-tab-label-active-border-bottom",
        "--ngs-tab-label-active-border-top",
        "--ngs-tab-label-active-color",
        "--ngs-tab-label-color",
        "--ngs-tab-label-cursor",
        "--ngs-tab-label-disabled-color",
        "--ngs-tab-label-disabled-cursor",
        "--ngs-tab-label-padding",
        "--ngs-tab-label-transition",
        "--ngs-tab-panel-transition"
      ],
      "example": null
    },
    {
      "name": "text-editor",
      "title": "Text Editor",
      "overviewName": "Text Editor",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/text-editor",
      "publicApi": "projects/components/text-editor/public-api.ts",
      "sourceRoot": "projects/components/text-editor/src",
      "docsPath": "/components/text-editor",
      "docsOverviewSource": "projects/docs/src/app/components/text-editor/overview/overview.html",
      "purpose": "Provide a full Tiptap-based WYSIWYG rich text editor for formatted HTML content.",
      "useWhen": "Use ngs-text-editor when users need to create or edit rich HTML content with headings, bold, italic, strike, lists, blockquotes, inline code, code blocks, horizontal rules, links, images, YouTube embeds, toolbar commands, bubble menus, or floating menus. Good for product descriptions, project/task descriptions, CMS-like fields, articles, notes, changelog entries, release notes, knowledge base content, help content, and rich admin content bodies. Provide initial HTML through content, listen to contentChange for updated HTML, add custom Tiptap extensions through extensions, and use imageUploadFn to upload images and resolve a URL. Compose controls with ngs-text-editor-toolbar, ngs-text-editor-bubble-menu, ngs-text-editor-floating-menu, ngs-text-editor-divider, and ngsTextEditorCommand* directives. Do not use TextEditor for short comments, threads, or quick replies; use CommentEditor. Do not use it for block-based CMS/page building; use ContentEditor. Do not use it for plain text fields; use ngsInput inside FormField. Do not use it for inline renaming; use InlineTextEdit. Do not use it for read-only code or snippets; use CodeHighlighter.",
      "exampleTopics": [
        "Basic Text Editor",
        "Text Editor with floating menu",
        "Text editor floating menu"
      ],
      "minimalExample": "<ngs-text-editor #editor [imageUploadFn]=\"uploadFn\"\n                 class=\"rounded-2xl border border-muted bg-surface-container-lowest min-h-[300px]\">\n  <ngs-text-editor-toolbar class=\"sticky top-0 bg-surface-container-lowest\">\n    <button ngsIconButton ngsTooltip=\"Heading 2\"\n            ngsTextEditorCommand ngsTextEditorCommandHeading level=\"2\">\n      <ngs-icon name=\"fluent:text-header-2-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Heading 3\"\n            ngsTextEditorCommand ngsTextEditorCommandHeading level=\"3\">\n      <ngs-icon name=\"fluent:text-header-3-24-regular\"/>\n    </button>\n    <ngs-text-editor-divider/>\n    <button ngsIconButton ngsTooltip=\"Bold\"\n            ngsTextEditorCommand ngsTextEditorCommandBold>\n      <ngs-icon name=\"fluent:text-bold-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Italic\"\n            ngsTextEditorCommand ngsTextEditorCommandItalic>\n      <ngs-icon name=\"fluent:text-italic-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Strike\"\n            ngsTextEditorCommand ngsTextEditorCommandStrike>\n      <ngs-icon name=\"fluent:text-strikethrough-24-regular\"/>\n    </button>\n    <ngs-text-editor-divider/>\n    <button ngsIconButton ngsTooltip=\"Bullet List\"\n            ngsTextEditorCommand ngsTextEditorCommandBulletList>\n      <ngs-icon name=\"fluent:text-bullet-list-ltr-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Ordered List\"\n            ngsTextEditorCommand ngsTextEditorCommandOrderedList>\n      <ngs-icon name=\"fluent:text-number-list-ltr-24-regular\"/>\n    </button>\n    <b\n...",
      "exampleFiles": [
        {
          "name": "basic-text-editor-example",
          "title": "Basic text editor",
          "file": "projects/docs/src/app/components/text-editor/_examples/basic-text-editor-example/basic-text-editor-example.html",
          "source": "<ngs-text-editor #editor [imageUploadFn]=\"uploadFn\"\n                 class=\"rounded-2xl border border-muted bg-surface-container-lowest min-h-[300px]\">\n  <ngs-text-editor-toolbar class=\"sticky top-0 bg-surface-container-lowest\">\n    <button ngsIconButton ngsTooltip=\"Heading 2\"\n            ngsTextEditorCommand ngsTextEditorCommandHeading level=\"2\">\n      <ngs-icon name=\"fluent:text-header-2-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Heading 3\"\n            ngsTextEditorCommand ngsTextEditorCommandHeading level=\"3\">\n      <ngs-icon name=\"fluent:text-header-3-24-regular\"/>\n    </button>\n    <ngs-text-editor-divider/>\n    <button ngsIconButton ngsTooltip=\"Bold\"\n            ngsTextEditorCommand ngsTextEditorCommandBold>\n      <ngs-icon name=\"fluent:text-bold-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Italic\"\n            ngsTextEditorCommand ngsTextEditorCommandItalic>\n      <ngs-icon name=\"fluent:text-italic-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Strike\"\n            ngsTextEditorCommand ngsTextEditorCommandStrike>\n      <ngs-icon name=\"fluent:text-strikethrough-24-regular\"/>\n    </button>\n    <ngs-text-editor-divider/>\n    <button ngsIconButton ngsTooltip=\"Bullet List\"\n            ngsTextEditorCommand ngsTextEditorCommandBulletList>\n      <ngs-icon name=\"fluent:text-bullet-list-ltr-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Ordered List\"\n            ngsTextEditorCommand ngsTextEditorCommandOrderedList>\n      <ngs-icon name=\"fluent:text-number-list-ltr-24-regular\"/>\n    </button>\n    <b\n..."
        },
        {
          "name": "text-editor-floating-menu-example",
          "title": "Text editor floating menu",
          "file": "projects/docs/src/app/components/text-editor/_examples/text-editor-floating-menu-example/text-editor-floating-menu-example.html",
          "source": "<ngs-text-editor #editor [imageUploadFn]=\"uploadFn\"\n                 class=\"rounded-2xl border border-muted bg-surface-container-lowest min-h-[200px]\">\n  <ngs-text-editor-floating-menu>\n    <button ngsIconButton ngsTooltip=\"Heading 2\"\n            ngsTextEditorCommand ngsTextEditorCommandHeading level=\"2\">\n      <ngs-icon name=\"fluent:text-header-2-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Heading 3\"\n            ngsTextEditorCommand ngsTextEditorCommandHeading level=\"3\">\n      <ngs-icon name=\"fluent:text-header-3-24-regular\"/>\n    </button>\n    <ngs-text-editor-divider/>\n    <button ngsIconButton ngsTooltip=\"Bold\"\n            ngsTextEditorCommand ngsTextEditorCommandBold>\n      <ngs-icon name=\"fluent:text-bold-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Italic\"\n            ngsTextEditorCommand ngsTextEditorCommandItalic>\n      <ngs-icon name=\"fluent:text-italic-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Strike\"\n            ngsTextEditorCommand ngsTextEditorCommandStrike>\n      <ngs-icon name=\"fluent:text-strikethrough-24-regular\"/>\n    </button>\n    <ngs-text-editor-divider/>\n    <button ngsIconButton ngsTooltip=\"Bullet List\"\n            ngsTextEditorCommand ngsTextEditorCommandBulletList>\n      <ngs-icon name=\"fluent:text-bullet-list-ltr-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Ordered List\"\n            ngsTextEditorCommand ngsTextEditorCommandOrderedList>\n      <ngs-icon name=\"fluent:text-number-list-ltr-24-regular\"/>\n    </button>\n    <button ngsIconButton ngsTooltip=\"Blockquote\"\n..."
        }
      ],
      "previewAsset": "projects/components/text-editor/preview.svg",
      "selectors": [
        "[ngsTextEditorCommand]",
        "[ngsTextEditorCommandBlockquote]",
        "[ngsTextEditorCommandBold]",
        "[ngsTextEditorCommandBulletList]",
        "[ngsTextEditorCommandCode]",
        "[ngsTextEditorCommandCodeBlock]",
        "[ngsTextEditorCommandEditLink]",
        "[ngsTextEditorCommandHeading]",
        "[ngsTextEditorCommandHorizontalRule]",
        "[ngsTextEditorCommandImage]",
        "[ngsTextEditorCommandItalic]",
        "[ngsTextEditorCommandLink]",
        "[ngsTextEditorCommandOrderedList]",
        "[ngsTextEditorCommandStrike]",
        "[ngsTextEditorCommandUnsetLink]",
        "[ngsTextEditorCommandYoutube]",
        "ngs-image-uploading-placeholder",
        "ngs-link",
        "ngs-text-editor",
        "ngs-text-editor-bubble-menu",
        "ngs-text-editor-divider",
        "ngs-text-editor-floating-menu",
        "ngs-text-editor-toolbar",
        "ngs-youtube"
      ],
      "exportedSymbols": [
        "AngularNodeView",
        "AngularNodeViewRenderer",
        "AngularRenderer",
        "ImageUploadingPlaceholder",
        "LinkDialog",
        "TEXT_EDITOR",
        "TEXT_EDITOR_BUBBLE_MENU",
        "TextEditor",
        "TextEditorAPI",
        "TextEditorBubbleMenu",
        "TextEditorCommandBlockquoteDirective",
        "TextEditorCommandBoldDirective",
        "TextEditorCommandBulletListDirective",
        "TextEditorCommandCodeBlockDirective",
        "TextEditorCommandCodeDirective",
        "TextEditorCommandDirective",
        "TextEditorCommandEditLinkDirective",
        "TextEditorCommandHeadingDirective",
        "TextEditorCommandHorizontalRuleDirective",
        "TextEditorCommandImageDirective",
        "TextEditorCommandItalicDirective",
        "TextEditorCommandLinkDirective",
        "TextEditorCommandOrderedListDirective",
        "TextEditorCommandStrikeDirective",
        "TextEditorCommandUnsetLinkDirective",
        "TextEditorCommandYoutubeDirective",
        "TextEditorDivider",
        "TextEditorFloatingMenu",
        "TextEditorInterface",
        "TextEditorToolbar",
        "YoutubeDialog"
      ],
      "inputs": [
        "content",
        "contentMaxHeight",
        "decorations",
        "deleteNode",
        "editor",
        "extension",
        "extensions",
        "getPos",
        "innerDecorations",
        "level",
        "node",
        "placeholder",
        "selected",
        "updateAttributes",
        "view"
      ],
      "outputs": [
        "contentChange",
        "fileSelected"
      ],
      "cssTokens": [
        "--ngs-color-border",
        "--ngs-color-neutral-100",
        "--ngs-color-neutral-200",
        "--ngs-color-neutral-300",
        "--ngs-color-neutral-500",
        "--ngs-color-neutral-650",
        "--ngs-color-neutral-700",
        "--ngs-color-neutral-900",
        "--ngs-color-neutral-950",
        "--ngs-color-tertiary-100",
        "--ngs-color-tertiary-200",
        "--ngs-color-tertiary-300",
        "--ngs-color-tertiary-700",
        "--ngs-color-tertiary-800",
        "--ngs-font-size-sm",
        "--ngs-font-size-xl",
        "--ngs-icon-size",
        "--ngs-radius-xl",
        "--ngs-shadow-sm",
        "--ngs-text-editor-bg",
        "--ngs-text-editor-content-max-height",
        "--ngs-text-editor-content-padding"
      ],
      "example": null
    },
    {
      "name": "thumbnail-maker",
      "title": "Thumbnail Maker",
      "overviewName": "Thumbnail Maker",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/thumbnail-maker",
      "publicApi": "projects/components/thumbnail-maker/public-api.ts",
      "sourceRoot": "projects/components/thumbnail-maker/src",
      "docsPath": "/components/thumbnail-maker",
      "docsOverviewSource": "projects/docs/src/app/components/thumbnail-maker/overview/overview.html",
      "purpose": "Create a square 300x300 thumbnail bitmap from an image with drag positioning and zoom controls.",
      "useWhen": "Use ngs-thumbnail-maker when users need to position and zoom an image inside a fixed square frame, then save the finished thumbnail as a data URL, Blob, or canvas. Good for avatars, profile images, CMS thumbnails, media library previews, product/user/project card images, and simple square preview generation. Provide the image URL or data URL through src, add helperText when users need drag instructions, and call api.getDataUrl(), api.toBlob(callback), or api.getCanvas() when saving. Combine with Upload or ngsUploadTrigger when users must select a local image first. Do not use ThumbnailMaker when the app needs arbitrary crop shapes, crop rectangles, circles, or crop coordinates; use Crop. Do not use it only to change displayed image width; use ImageResizer. Do not use it to view images; use ImageViewer or ImageZoomViewer. Do not use it as an image placeholder; use ImagePlaceholder. Do not use it for full canvas editing, layers, text, effects, or templates; use ImageDesigner. Do not use it as a plain upload picker without editing; use Upload.",
      "exampleTopics": [
        "Basic thumbnail maker",
        "Thumbnail maker with helper text",
        "Thumbnail maker with file select"
      ],
      "minimalExample": "<ngs-thumbnail-maker #thumbnailMaker=\"ngsThumbnailMaker\" src=\"/assets/thumbnail-maker/photo1.jpeg\"\n                     class=\"border border-muted  rounded-xl\" />\n<div class=\"mt-10\">\n  <button ngsButton=\"filled\" (click)=\"makeThumbnail(thumbnailMaker)\">Make thumbnail</button>\n</div>\n@if (thumbnail) {\n  <div class=\"mt-2 flex items-start gap-10 flex-wrap\">\n    <img [src]=\"thumbnail\" alt=\"\" class=\"border border-muted \">\n    <img [src]=\"thumbnail\" alt=\"\" class=\"border border-muted  rounded-xl size-40\">\n    <img [src]=\"thumbnail\" alt=\"\" class=\"border border-muted  rounded-full size-40\">\n  </div>\n}",
      "exampleFiles": [
        {
          "name": "basic-thumbnail-maker",
          "title": "Basic thumbnail maker",
          "file": "projects/docs/src/app/components/thumbnail-maker/_examples/basic-thumbnail-maker/basic-thumbnail-maker.html",
          "source": "<ngs-thumbnail-maker #thumbnailMaker=\"ngsThumbnailMaker\" src=\"/assets/thumbnail-maker/photo1.jpeg\"\n                     class=\"border border-muted  rounded-xl\" />\n<div class=\"mt-10\">\n  <button ngsButton=\"filled\" (click)=\"makeThumbnail(thumbnailMaker)\">Make thumbnail</button>\n</div>\n@if (thumbnail) {\n  <div class=\"mt-2 flex items-start gap-10 flex-wrap\">\n    <img [src]=\"thumbnail\" alt=\"\" class=\"border border-muted \">\n    <img [src]=\"thumbnail\" alt=\"\" class=\"border border-muted  rounded-xl size-40\">\n    <img [src]=\"thumbnail\" alt=\"\" class=\"border border-muted  rounded-full size-40\">\n  </div>\n}"
        },
        {
          "name": "thumbnail-maker-with-file-select-example",
          "title": "Thumbnail maker with file select",
          "file": "projects/docs/src/app/components/thumbnail-maker/_examples/thumbnail-maker-with-file-select-example/thumbnail-maker-with-file-select-example.html",
          "source": "@if (!src) {\n  <button ngsButton=\"outlined\" ngsUploadTrigger\n          accept=\"image/png,image/jpeg\" (fileSelected)=\"onImageSelected($event)\">Select a local image</button>\n} @else {\n  <ngs-thumbnail-maker #thumbnailMaker=\"ngsThumbnailMaker\" [src]=\"src\"\n                       class=\"border border-muted  rounded-xl\" />\n  <div class=\"mt-10\">\n    <button ngsButton=\"filled\" (click)=\"makeThumbnail(thumbnailMaker)\">Make thumbnail</button>\n  </div>\n  @if (thumbnail) {\n    <div class=\"mt-2 flex items-start gap-10 flex-wrap\">\n      <img [src]=\"thumbnail\" alt=\"\" class=\"border border-muted \">\n      <img [src]=\"thumbnail\" alt=\"\" class=\"border border-muted  rounded-xl size-40\">\n      <img [src]=\"thumbnail\" alt=\"\" class=\"border border-muted  rounded-full size-40\">\n    </div>\n  }\n}"
        },
        {
          "name": "thumbnail-maker-with-helper-text-example",
          "title": "Thumbnail maker with helper text",
          "file": "projects/docs/src/app/components/thumbnail-maker/_examples/thumbnail-maker-with-helper-text-example/thumbnail-maker-with-helper-text-example.html",
          "source": "<ngs-thumbnail-maker helperText=\"Drag to change position\"\n                     src=\"/assets/thumbnail-maker/photo1.jpeg\"\n                     class=\"border border-muted  rounded-xl\" />"
        }
      ],
      "previewAsset": "projects/components/thumbnail-maker/preview.svg",
      "selectors": [
        "[ngsDragImage]",
        "ngs-thumbnail-maker"
      ],
      "exportedSymbols": [
        "DragImageDirective",
        "ThumbnailMaker",
        "ThumbnailMakerApi"
      ],
      "inputs": [
        "content",
        "helperText",
        "scale",
        "src"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-neutral-950",
        "--ngs-font-size-xs",
        "--ngs-radius-lg",
        "--ngs-thumbnail-height",
        "--ngs-thumbnail-width"
      ],
      "example": null
    },
    {
      "name": "tiles",
      "title": "Tiles",
      "overviewName": "Tiles",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/tiles",
      "publicApi": "projects/components/tiles/public-api.ts",
      "sourceRoot": "projects/components/tiles/src",
      "docsPath": "/components/tiles",
      "docsOverviewSource": "projects/docs/src/app/components/tiles/overview/overview.html",
      "purpose": "Lay out responsive dashboard tiles and support user-driven tile reordering/customization.",
      "useWhen": "Use ngs-tiles with ngs-tile when users can rearrange dashboard cards or widgets, customize a dashboard, or save a changed widget order. Good for editable dashboards, portal home pages, workspace widgets, configurable analytics cards, media/card boards, and dashboard builders. Tiles can be the layout host for config-driven dashboard renderers: the app can render lazy widget components inside each ngs-tile, show Skeleton while widgets load, and persist the final item order from orderChanged or layoutChanged. Use width, height, width.sm/md/lg/xl, and height.sm/md/lg/xl to define responsive tile spans, and ngsTileHandle for drag handles. Provide items so reorder events can map visual order back to app data. Use Grid only for static predefined dashboard/widget layouts that users do not rearrange. Do not use Tiles for ordinary static responsive page layout; use TailwindCSS grid/flex. Do not use for split panes with gutters; use Split. Do not use for one manually resized box; use ResizableContainer. Do not use for simple cards, lists, tables, or datasets without tile reordering; use Card, List, Table, or DataView. Do not use for status-column workflows; use KanbanBoard.",
      "exampleTopics": [
        "Basic tiles"
      ],
      "minimalExample": "<ngs-tiles\n  class=\"bg-neutral-100 p-4 rounded-lg\"\n  [items]=\"items()\"\n  (orderChange)=\"onOrderChange($event)\"\n  (orderChanged)=\"onOrderChanged($event)\"\n  (layoutChanged)=\"onLayoutChanged($event)\">\n  @for (item of items(); track item.id) {\n    <ngs-tile [width.md]=\"item.wMd\" [width.lg]=\"item.wLg\" [width]=\"item.w\" [height]=\"item.h\">\n      <div class=\"border border-border rounded-lg bg-surface-container-lowest shadow-md overflow-hidden h-full\">\n        <div class=\"flex flex-col h-full p-4 relative\">\n          <button (click)=\"removeItem(item.id)\" class=\"absolute top-2 left-2 p-1 bg-neutral-100 rounded-full hover:bg-red-100 text-red-500 leading-none\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\n          </button>\n          <div class=\"absolute top-2 right-2 p-1 bg-neutral-100 rounded cursor-grab active:cursor-grabbing font-mono leading-none\"\n               ngsTileHandle>:::</div>\n          <div class=\"font-bold text-xl mb-2\">{{ item.content }}</div>\n          <div class=\"text-neutral-500 text-sm mt-auto\">{{ item.w }}x{{ item.h }}</div>\n        </div>\n      </div>\n    </ngs-tile>\n  }\n</ngs-tiles>",
      "exampleFiles": [
        {
          "name": "basic-tiles-example",
          "title": "Basic tiles",
          "file": "projects/docs/src/app/components/tiles/_examples/basic-tiles-example/basic-tiles-example.html",
          "source": "<ngs-tiles\n  class=\"bg-neutral-100 p-4 rounded-lg\"\n  [items]=\"items()\"\n  (orderChange)=\"onOrderChange($event)\"\n  (orderChanged)=\"onOrderChanged($event)\"\n  (layoutChanged)=\"onLayoutChanged($event)\">\n  @for (item of items(); track item.id) {\n    <ngs-tile [width.md]=\"item.wMd\" [width.lg]=\"item.wLg\" [width]=\"item.w\" [height]=\"item.h\">\n      <div class=\"border border-border rounded-lg bg-surface-container-lowest shadow-md overflow-hidden h-full\">\n        <div class=\"flex flex-col h-full p-4 relative\">\n          <button (click)=\"removeItem(item.id)\" class=\"absolute top-2 left-2 p-1 bg-neutral-100 rounded-full hover:bg-red-100 text-red-500 leading-none\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\n          </button>\n          <div class=\"absolute top-2 right-2 p-1 bg-neutral-100 rounded cursor-grab active:cursor-grabbing font-mono leading-none\"\n               ngsTileHandle>:::</div>\n          <div class=\"font-bold text-xl mb-2\">{{ item.content }}</div>\n          <div class=\"text-neutral-500 text-sm mt-auto\">{{ item.w }}x{{ item.h }}</div>\n        </div>\n      </div>\n    </ngs-tile>\n  }\n</ngs-tiles>"
        }
      ],
      "previewAsset": "projects/components/tiles/preview.svg",
      "selectors": [
        "[ngsTileHandle]",
        "ngs-tile",
        "ngs-tiles"
      ],
      "exportedSymbols": [
        "ReorderFunction",
        "Tile",
        "TileHandleDirective",
        "Tiles",
        "TILES_REORDER",
        "TileService",
        "tilesShift",
        "tilesSwap"
      ],
      "inputs": [
        "columns",
        "gap",
        "height",
        "height.lg",
        "height.md",
        "height.sm",
        "height.xl",
        "items",
        "width",
        "width.lg",
        "width.md",
        "width.sm",
        "width.xl"
      ],
      "outputs": [
        "layoutChanged",
        "orderChanged"
      ],
      "cssTokens": [
        "--ngs-color-border",
        "--ngs-color-surface-container",
        "--ngs-radius-xl",
        "--ngs-tile-h",
        "--ngs-tile-h-lg",
        "--ngs-tile-h-md",
        "--ngs-tile-h-sm",
        "--ngs-tile-h-xl",
        "--ngs-tile-w",
        "--ngs-tile-w-lg",
        "--ngs-tile-w-md",
        "--ngs-tile-w-sm",
        "--ngs-tile-w-xl",
        "--ngs-tiles-columns",
        "--ngs-tiles-gap",
        "--ngs-tiles-row-height"
      ],
      "example": null
    },
    {
      "name": "timeline",
      "title": "Timeline",
      "overviewName": "Timeline",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/timeline",
      "publicApi": "projects/components/timeline/public-api.ts",
      "sourceRoot": "projects/components/timeline/src",
      "docsPath": "/components/timeline",
      "docsOverviewSource": "projects/docs/src/app/components/timeline/overview/overview.html",
      "purpose": "Show a vertical chronological history of events.",
      "useWhen": "Use ngs-timeline when users need to understand a sequence of events over time: audit logs, activity history, entity change history, project milestones, order or shipment history, workflow history, tracking events, and user actions. Use ngs-timeline-header to group events by date, month, phase, or period. Use ngs-timeline-item with ngs-timeline-timestamp, ngs-timeline-title, ngs-timeline-subtitle, ngs-timeline-description, ngs-timeline-attributes, and ngs-timeline-content to structure each event. Use ngsTimelineItemIndicator when the marker should show an actor, icon, status, or event type. Do not use Timeline for a realtime notification inbox or actionable notification feed; use Notifications. Do not use for a simple vertical collection without time/order meaning; use List. Do not use for tabular audit logs that need sorting, filtering, or many columns; use Table or DataView. Do not use for workflow steps the user must complete; use Stepper. Do not use for status columns; use KanbanBoard. Do not use for calendar/scheduler views or for a single operation status; use ProgressBar, Badge, or Status as appropriate.",
      "exampleTopics": [
        "Basic Timeline",
        "Timeline With Timestamp",
        "Timeline With Custom Indicator",
        "Timeline timestamp",
        "Timeline with cutsom indicator"
      ],
      "minimalExample": "<ngs-timeline>\n  <ngs-timeline-header>1 AUG, 2023</ngs-timeline-header>\n  <ngs-timeline-item>\n    <ngs-timeline-title>Created \"ngsimaKit in Angular\" task</ngs-timeline-title>\n    <ngs-timeline-description>Find more detailed insctructions here.</ngs-timeline-description>\n    <ngs-timeline-attributes>\n      <div class=\"flex items-center gap-2\">\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/1.jpg\" class=\"size-6\" label=\"JS\" />\n        <div class=\"text-sm hover:text-primary-600 cursor-pointer\">James Collins</div>\n      </div>\n    </ngs-timeline-attributes>\n  </ngs-timeline-item>\n  <ngs-timeline-item>\n    <ngs-timeline-title>Created \"ngsimaKit in Angular\" task</ngs-timeline-title>\n    <ngs-timeline-description>Find more detailed insctructions here.</ngs-timeline-description>\n    <ngs-timeline-attributes>\n      <div class=\"flex items-center gap-2\">\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/1.jpg\" class=\"size-6\" label=\"JS\" />\n        <div class=\"text-sm hover:text-primary-600 cursor-pointer\">James Collins</div>\n      </div>\n    </ngs-timeline-attributes>\n  </ngs-timeline-item>\n  <ngs-timeline-item>\n    <ngs-timeline-title>Created \"ngsimaKit in Angular\" task</ngs-timeline-title>\n    <ngs-timeline-description>Find more detailed insctructions here.</ngs-timeline-description>\n    <ngs-timeline-attributes>\n      <div class=\"flex items-center gap-2\">\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/1.jpg\" class=\"size-6\" label=\"JS\" />\n        <div class=\"text-sm hover:text-primary-600 cursor-pointer\">James Collins</div>\n...",
      "exampleFiles": [
        {
          "name": "basic-timeline-example",
          "title": "Basic timeline",
          "file": "projects/docs/src/app/components/timeline/_examples/basic-timeline-example/basic-timeline-example.html",
          "source": "<ngs-timeline>\n  <ngs-timeline-header>1 AUG, 2023</ngs-timeline-header>\n  <ngs-timeline-item>\n    <ngs-timeline-title>Created \"ngsimaKit in Angular\" task</ngs-timeline-title>\n    <ngs-timeline-description>Find more detailed insctructions here.</ngs-timeline-description>\n    <ngs-timeline-attributes>\n      <div class=\"flex items-center gap-2\">\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/1.jpg\" class=\"size-6\" label=\"JS\" />\n        <div class=\"text-sm hover:text-primary-600 cursor-pointer\">James Collins</div>\n      </div>\n    </ngs-timeline-attributes>\n  </ngs-timeline-item>\n  <ngs-timeline-item>\n    <ngs-timeline-title>Created \"ngsimaKit in Angular\" task</ngs-timeline-title>\n    <ngs-timeline-description>Find more detailed insctructions here.</ngs-timeline-description>\n    <ngs-timeline-attributes>\n      <div class=\"flex items-center gap-2\">\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/1.jpg\" class=\"size-6\" label=\"JS\" />\n        <div class=\"text-sm hover:text-primary-600 cursor-pointer\">James Collins</div>\n      </div>\n    </ngs-timeline-attributes>\n  </ngs-timeline-item>\n  <ngs-timeline-item>\n    <ngs-timeline-title>Created \"ngsimaKit in Angular\" task</ngs-timeline-title>\n    <ngs-timeline-description>Find more detailed insctructions here.</ngs-timeline-description>\n    <ngs-timeline-attributes>\n      <div class=\"flex items-center gap-2\">\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/1.jpg\" class=\"size-6\" label=\"JS\" />\n        <div class=\"text-sm hover:text-primary-600 cursor-pointer\">James Collins</div>\n..."
        },
        {
          "name": "timeline-timestamp-example",
          "title": "Timeline timestamp",
          "file": "projects/docs/src/app/components/timeline/_examples/timeline-timestamp-example/timeline-timestamp-example.html",
          "source": "<ngs-timeline>\n  <ngs-timeline-header>1 AUG, 2023</ngs-timeline-header>\n  <ngs-timeline-item>\n    <ngs-timeline-timestamp>11, July</ngs-timeline-timestamp>\n    <ngs-timeline-title>Created \"ngsimaKit in Angular\" task</ngs-timeline-title>\n    <ngs-timeline-description>Find more detailed insctructions here.</ngs-timeline-description>\n    <ngs-timeline-attributes>\n      <div class=\"flex items-center gap-2\">\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/1.jpg\" class=\"size-6\" label=\"J\" />\n        <div class=\"text-sm hover:text-primary-600 cursor-pointer\">James Collins</div>\n      </div>\n    </ngs-timeline-attributes>\n  </ngs-timeline-item>\n  <ngs-timeline-item>\n    <ngs-timeline-timestamp>03, July</ngs-timeline-timestamp>\n    <ngs-timeline-title>Created \"ngsimaKit in Angular\" task</ngs-timeline-title>\n    <ngs-timeline-description>Find more detailed insctructions here.</ngs-timeline-description>\n    <ngs-timeline-attributes>\n      <div class=\"flex items-center gap-2\">\n        <ngs-avatar image=\"https://randomuser.me/api/portraits/men/1.jpg\" class=\"size-6\" label=\"J\" />\n        <div class=\"text-sm hover:text-primary-600 cursor-pointer\">James Collins</div>\n      </div>\n    </ngs-timeline-attributes>\n  </ngs-timeline-item>\n  <ngs-timeline-item>\n    <ngs-timeline-timestamp>25, June</ngs-timeline-timestamp>\n    <ngs-timeline-title>Created \"ngsimaKit in Angular\" task</ngs-timeline-title>\n    <ngs-timeline-description>Find more detailed insctructions here.</ngs-timeline-description>\n    <ngs-timeline-attributes>\n      <div class=\"flex items-center gap-2\">\n        <ng\n..."
        },
        {
          "name": "timeline-with-cutsom-indicator-example",
          "title": "Timeline with cutsom indicator",
          "file": "projects/docs/src/app/components/timeline/_examples/timeline-with-cutsom-indicator-example/timeline-with-cutsom-indicator-example.html",
          "source": "<ngs-timeline>\n  <ngs-timeline-header>1 AUG, 2023</ngs-timeline-header>\n  <ngs-timeline-item>\n    <ng-template ngsTimelineItemIndicator>\n      <ngs-avatar image=\"https://randomuser.me/api/portraits/men/1.jpg\" class=\"size-6\" label=\"J\" />\n    </ng-template>\n    <ngs-timeline-timestamp>11, July</ngs-timeline-timestamp>\n    <ngs-timeline-title>Created \"ngsimaKit in Angular\" task</ngs-timeline-title>\n    <ngs-timeline-description>Find more detailed insctructions here.</ngs-timeline-description>\n  </ngs-timeline-item>\n  <ngs-timeline-item>\n    <ng-template ngsTimelineItemIndicator>\n      <ngs-avatar class=\"w-7 h-7\">\n        <ngs-icon name=\"fluent:folder-24-regular\" class=\"filled !w-5 !h-5 !text-lg\"/>\n      </ngs-avatar>\n    </ng-template>\n    <ngs-timeline-timestamp>03, July</ngs-timeline-timestamp>\n    <ngs-timeline-title>Created \"ngsimaKit in Angular\" task</ngs-timeline-title>\n    <ngs-timeline-description>Find more detailed insctructions here.</ngs-timeline-description>\n  </ngs-timeline-item>\n  <ngs-timeline-item>\n    <ng-template ngsTimelineItemIndicator>\n      <ngs-avatar image=\"https://randomuser.me/api/portraits/men/1.jpg\" class=\"size-6\" label=\"J\" />\n    </ng-template>\n    <ngs-timeline-timestamp>25, June</ngs-timeline-timestamp>\n    <ngs-timeline-title>Created \"ngsimaKit in Angular\" task</ngs-timeline-title>\n    <ngs-timeline-description>Find more detailed insctructions here.</ngs-timeline-description>\n  </ngs-timeline-item>\n  <ngs-timeline-item>\n    <ng-template ngsTimelineItemIndicator>\n      <ngs-avatar image=\"https://randomuser.me/api/portraits/men/1.jpg\" class=\"size-\n..."
        }
      ],
      "previewAsset": "projects/components/timeline/preview.svg",
      "selectors": [
        "[ngsTimelineItemIndicator]",
        "ngs-timeline",
        "ngs-timeline-attributes",
        "ngs-timeline-content",
        "ngs-timeline-description",
        "ngs-timeline-header",
        "ngs-timeline-item",
        "ngs-timeline-subtitle",
        "ngs-timeline-timestamp",
        "ngs-timeline-title"
      ],
      "exportedSymbols": [
        "Timeline",
        "TimelineAttributes",
        "TimelineContent",
        "TimelineDescription",
        "TimelineHeader",
        "TimelineItem",
        "TimelineItemIndicatorDirective",
        "TimelineSubtitle",
        "TimelineTimestamp",
        "TimelineTitle"
      ],
      "inputs": [],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-muted",
        "--ngs-color-neutral-500",
        "--ngs-color-neutral-800",
        "--ngs-font-size-sm",
        "--ngs-font-size-xs",
        "--ngs-timeline-header-bg",
        "--ngs-timeline-header-color",
        "--ngs-timeline-header-font-size",
        "--ngs-timeline-header-font-weight",
        "--ngs-timeline-header-height",
        "--ngs-timeline-header-padding",
        "--ngs-timeline-header-text-transform",
        "--ngs-timeline-indicator-bg",
        "--ngs-timeline-indicator-border",
        "--ngs-timeline-indicator-line-offset",
        "--ngs-timeline-indicator-offset",
        "--ngs-timeline-indicator-shape-size",
        "--ngs-timeline-item-attributes-padding",
        "--ngs-timeline-item-content-gap",
        "--ngs-timeline-item-content-padding",
        "--ngs-timeline-item-description-color",
        "--ngs-timeline-item-description-font-size",
        "--ngs-timeline-item-gap",
        "--ngs-timeline-item-line-bg",
        "--ngs-timeline-item-no-timestamp-offset-start",
        "--ngs-timeline-item-subtitle-color",
        "--ngs-timeline-item-subtitle-font-size",
        "--ngs-timeline-timestamp-color",
        "--ngs-timeline-timestamp-font-size",
        "--ngs-timeline-timestamp-padding",
        "--ngs-timeline-timestamp-width",
        "--ngs-timeline-title-color",
        "--ngs-timeline-title-font-size",
        "--ngs-timeline-title-font-weight"
      ],
      "example": null
    },
    {
      "name": "timepicker",
      "title": "Timepicker",
      "overviewName": "Timepicker",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/timepicker",
      "publicApi": "projects/components/timepicker/public-api.ts",
      "sourceRoot": "projects/components/timepicker/src",
      "docsPath": "/components/timepicker",
      "docsOverviewSource": "projects/docs/src/app/components/timepicker/overview/overview.html",
      "purpose": "Let users choose or type a time of day in a form field.",
      "useWhen": "Use input[ngsTimepicker] inside one ngs-form-field, connected to an ngs-timepicker instance, when a form needs a time of day: meeting time, event time, booking time, reminder time, deadline time, availability slot, report time filter, or schedule setting. Add ngs-timepicker-toggle as an icon suffix when users should open the dropdown explicitly. Use interval to control option steps such as 15, 30, or 60 minutes. Use min and max to limit selectable times. The input supports manual typing and localized display, while the model value can be a HH:mm-like string or a Date with the selected time merged into it. Combine Datepicker and Timepicker as separate controls when users need both date and time. Do not use Timepicker to choose a date; use Datepicker. Do not use it to choose a timezone; use TimezoneSelect. Do not use it for duration or numeric amounts of hours/minutes; use NumberInput or Slider. Do not use it for plain text without time validation; use ngsInput. Do not use it as a calendar, scheduler, or day-slot planner.",
      "exampleTopics": [
        "Basic time picker",
        "Integration with Datepicker",
        "Customizing the toggle icon",
        "Timepicker with interval",
        "Basic timepicker",
        "Timepicker with datepicker",
        "Timepicker custom toggle icon",
        "Timepicker interval"
      ],
      "minimalExample": "<ngs-form-field>\n  <ngs-label>Pick a time</ngs-label>\n  <input ngsInput [ngsTimepicker]=\"picker\">\n  <ngs-timepicker-toggle ngsIconButtonSuffix [for]=\"picker\"/>\n  <ngs-timepicker #picker/>\n</ngs-form-field>",
      "exampleFiles": [
        {
          "name": "basic-timepicker-example",
          "title": "Basic timepicker",
          "file": "projects/docs/src/app/components/timepicker/_examples/basic-timepicker-example/basic-timepicker-example.html",
          "source": "<ngs-form-field>\n  <ngs-label>Pick a time</ngs-label>\n  <input ngsInput [ngsTimepicker]=\"picker\">\n  <ngs-timepicker-toggle ngsIconButtonSuffix [for]=\"picker\"/>\n  <ngs-timepicker #picker/>\n</ngs-form-field>"
        },
        {
          "name": "timepicker-custom-toggle-icon-example",
          "title": "Timepicker custom toggle icon",
          "file": "projects/docs/src/app/components/timepicker/_examples/timepicker-custom-toggle-icon-example/timepicker-custom-toggle-icon-example.html",
          "source": "<ngs-form-field>\n  <ngs-label>Pick a time</ngs-label>\n  <input ngsInput [ngsTimepicker]=\"picker\">\n  <ngs-timepicker-toggle ngsIconButtonSuffix [for]=\"picker\">\n    <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"size-5\"\n              ngsTimepickerToggleIcon/>\n  </ngs-timepicker-toggle>\n  <ngs-timepicker #picker/>\n</ngs-form-field>"
        },
        {
          "name": "timepicker-interval-example",
          "title": "Timepicker interval",
          "file": "projects/docs/src/app/components/timepicker/_examples/timepicker-interval-example/timepicker-interval-example.html",
          "source": "<ngs-form-field>\n  <ngs-label>Interval 60 min</ngs-label>\n  <input ngsInput [ngsTimepicker]=\"picker60\">\n  <ngs-timepicker-toggle ngsIconButtonSuffix [for]=\"picker60\"/>\n  <ngs-timepicker #picker60 [interval]=\"60\"/>\n</ngs-form-field>\n<ngs-form-field class=\"mt-6\">\n  <ngs-label>Interval 15 min</ngs-label>\n  <input ngsInput [ngsTimepicker]=\"picker15\">\n  <ngs-timepicker-toggle ngsIconButtonSuffix [for]=\"picker15\"/>\n  <ngs-timepicker #picker15 [interval]=\"15\"/>\n</ngs-form-field>"
        }
      ],
      "previewAsset": "projects/components/timepicker/preview.svg",
      "selectors": [
        "[ngsTimepickerToggleIcon]",
        "input[ngsTimepicker]",
        "ngs-timepicker",
        "ngs-timepicker-toggle"
      ],
      "exportedSymbols": [
        "Timepicker",
        "TIMEPICKER_CONFIG",
        "TimepickerConfig",
        "TimepickerInput",
        "TimepickerIntl",
        "TimepickerToggle",
        "TimepickerToggleIcon"
      ],
      "inputs": [
        "disabled",
        "for",
        "interval",
        "max",
        "min",
        "ngsTimepicker",
        "openOnClick"
      ],
      "outputs": [
        "closed",
        "opened"
      ],
      "cssTokens": [
        "--ngs-dropdown-bg",
        "--ngs-dropdown-border",
        "--ngs-dropdown-padding",
        "--ngs-dropdown-radius",
        "--ngs-dropdown-shadow",
        "--ngs-timepicker-content-padding"
      ],
      "example": null
    },
    {
      "name": "timezone-select",
      "title": "Timezone Select",
      "overviewName": "Timezone",
      "category": "forms",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/timezone-select",
      "publicApi": "projects/components/timezone-select/public-api.ts",
      "sourceRoot": "projects/components/timezone-select/src",
      "docsPath": "/forms/timezone",
      "docsOverviewSource": "projects/docs/src/app/forms/timezone/overview/overview.html",
      "purpose": "Let users choose an IANA time zone id in a form field.",
      "useWhen": "Use ngs-timezone-select inside one ngs-form-field when a form must store a real time zone id such as Europe/Warsaw or America/New_York. Good for profile timezone, account preferences, organization or tenant default timezone, scheduling settings, calendar settings, report default timezone, localization preferences, and admin settings where backend data needs an IANA timezone string. The control is searchable, groups time zones by region, supports Angular forms, required, disabled, placeholder, locale-aware labels, opened, and closed. Do not use TimezoneSelect to choose a time of day; use Timepicker. Do not use it to choose a date; use Datepicker. Do not use it to choose a country or region; use CountrySelect. Do not use it for language or locale selection; use a dedicated locale/language control or Select. Do not use it for generic custom options; use Select. Do not use it for durations, numeric offsets, or timezone math; use NumberInput, Slider, or app logic. Do not use timezone as a date format setting; use DateFormatSelect for display formats.",
      "exampleTopics": [
        "Basic timezone select"
      ],
      "minimalExample": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Timezones</ngs-label>\n  <ngs-timezone-select [(ngModel)]=\"selectedTimezone\" placeholder=\"Select a timezone\"/>\n</ngs-form-field>\n<p>\n  Selected timezone: {{ selectedTimezone() }}\n</p>",
      "exampleFiles": [
        {
          "name": "basic-timezone-select-example",
          "title": "Basic timezone select",
          "file": "projects/docs/src/app/forms/timezone/_examples/basic-timezone-select-example/basic-timezone-select-example.html",
          "source": "<ngs-form-field class=\"w-1/2\">\n  <ngs-label>Timezones</ngs-label>\n  <ngs-timezone-select [(ngModel)]=\"selectedTimezone\" placeholder=\"Select a timezone\"/>\n</ngs-form-field>\n<p>\n  Selected timezone: {{ selectedTimezone() }}\n</p>"
        }
      ],
      "previewAsset": "projects/components/timezone-select/preview.svg",
      "selectors": [
        "ngs-timezone-select"
      ],
      "exportedSymbols": [
        "FilterTimezonesPipe",
        "LocalizedTimezone",
        "TimezoneGroup",
        "TimezoneSelect",
        "TimezoneUtils"
      ],
      "inputs": [
        "aria-describedby",
        "disabled",
        "locale",
        "placeholder",
        "required",
        "searchTerm",
        "value"
      ],
      "outputs": [
        "closed",
        "opened"
      ],
      "cssTokens": [],
      "example": null
    },
    {
      "name": "toolbar",
      "title": "Toolbar",
      "overviewName": "Toolbar",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/toolbar",
      "publicApi": "projects/components/toolbar/public-api.ts",
      "sourceRoot": "projects/components/toolbar/src",
      "docsPath": "/components/toolbar",
      "docsOverviewSource": "projects/docs/src/app/components/toolbar/overview/overview.html",
      "purpose": "Provide a persistent command area for a page, panel, table, editor, canvas, or workspace surface.",
      "useWhen": "Use ngs-toolbar when a local surface needs a title, short local navigation, and frequently used actions in a stable horizontal or multi-row command area. Use ngs-toolbar-title for the local title, ngs-toolbar-spacer to separate groups, ngs-toolbar-row for multi-row command areas, ngs-toolbar-item for actions that should participate in responsive overflow, and ngs-toolbar-nav with ngs-toolbar-nav-link for short local links inside the toolbar. Good places include table headers, panel headers, admin page headers, editor surfaces, dashboards, canvas tools, and workspace tool surfaces. Do not use Toolbar as a generic flex layout for arbitrary content. Do not use it for floating contextual actions on selected rows or objects; use CommandBar. Do not use it for dropdown command lists; use Menu. Do not use it for primary application navigation; use Sidebar, Sidenav, or Navigation. Do not replace specialized TextEditor or CommentEditor toolbars with the generic Toolbar.",
      "exampleTopics": [
        "Basic Toolbar",
        "Multi-row Toolbar",
        "Toolbar with items",
        "Responsive Toolbar with Overflow Menu",
        "Responsive Toolbar Navigation",
        "Toolbar overflow",
        "Toolbar nav"
      ],
      "minimalExample": "<ngs-toolbar>\n  <ngs-toolbar-title appearance=\"large\">My App</ngs-toolbar-title>\n  <ngs-toolbar-spacer/>\n  <button>Login</button>\n</ngs-toolbar>",
      "exampleFiles": [
        {
          "name": "basic-toolbar-example",
          "title": "Basic toolbar",
          "file": "projects/docs/src/app/components/toolbar/_examples/basic-toolbar-example/basic-toolbar-example.html",
          "source": "<ngs-toolbar>\n  <ngs-toolbar-title appearance=\"large\">My App</ngs-toolbar-title>\n  <ngs-toolbar-spacer/>\n  <button>Login</button>\n</ngs-toolbar>"
        },
        {
          "name": "multi-row-toolbar-example",
          "title": "Multi row toolbar",
          "file": "projects/docs/src/app/components/toolbar/_examples/multi-row-toolbar-example/multi-row-toolbar-example.html",
          "source": "<ngs-toolbar>\n  <ngs-toolbar-row>\n    <ngs-toolbar-title appearance=\"large\">Multi-row Toolbar</ngs-toolbar-title>\n    <ngs-toolbar-spacer></ngs-toolbar-spacer>\n    <ngs-toolbar-item>Menu</ngs-toolbar-item>\n  </ngs-toolbar-row>\n  <ngs-toolbar-row>\n    <ngs-toolbar-item>Second row content</ngs-toolbar-item>\n  </ngs-toolbar-row>\n</ngs-toolbar>"
        },
        {
          "name": "toolbar-nav-example",
          "title": "Toolbar nav",
          "file": "projects/docs/src/app/components/toolbar/_examples/toolbar-nav-example/toolbar-nav-example.html",
          "source": "<ngs-toolbar>\n  <ngs-toolbar-title appearance=\"large\">Nav Example</ngs-toolbar-title>\n  <ngs-toolbar-nav>\n    <ngs-toolbar-nav-link [active]=\"true\">Home</ngs-toolbar-nav-link>\n    <ngs-toolbar-nav-link>About</ngs-toolbar-nav-link>\n    <ngs-toolbar-nav-link>Contact</ngs-toolbar-nav-link>\n  </ngs-toolbar-nav>\n  <ngs-toolbar-spacer />\n  <ngs-toolbar-nav>\n    <a ngs-toolbar-nav-link [routerLink]=\"['/dashboard']\">Dashboard</a>\n  </ngs-toolbar-nav>\n</ngs-toolbar>"
        }
      ],
      "previewAsset": "projects/components/toolbar/preview.svg",
      "selectors": [
        "a[ngs-toolbar-nav-link]",
        "ngs-toolbar",
        "ngs-toolbar-item",
        "ngs-toolbar-nav",
        "ngs-toolbar-nav-link",
        "ngs-toolbar-row",
        "ngs-toolbar-spacer",
        "ngs-toolbar-subtitle",
        "ngs-toolbar-title"
      ],
      "exportedSymbols": [
        "Toolbar",
        "ToolbarBaseItem",
        "ToolbarItem",
        "ToolbarNav",
        "ToolbarNavLink",
        "ToolbarRow",
        "ToolbarSpacer",
        "ToolbarSubtitle",
        "ToolbarTitle",
        "ToolbarTitleAppearance"
      ],
      "inputs": [
        "active",
        "appearance",
        "hidden"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-secondary",
        "--ngs-font-size-lg",
        "--ngs-font-size-sm",
        "--ngs-nav-item-active-color",
        "--ngs-nav-item-color",
        "--ngs-nav-item-font-size",
        "--ngs-nav-item-height",
        "--ngs-nav-item-hover-color",
        "--ngs-nav-item-padding",
        "--ngs-nav-item-radius",
        "--ngs-toolbar-gap",
        "--ngs-toolbar-nav-link-active-color",
        "--ngs-toolbar-nav-link-color",
        "--ngs-toolbar-nav-link-font-size",
        "--ngs-toolbar-nav-link-hover-color",
        "--ngs-toolbar-nav-link-overflow-height",
        "--ngs-toolbar-nav-link-padding",
        "--ngs-toolbar-nav-link-radius",
        "--ngs-toolbar-subtitle-color",
        "--ngs-toolbar-subtitle-font-size",
        "--ngs-toolbar-subtitle-weight",
        "--ngs-toolbar-title-font-size",
        "--ngs-toolbar-title-font-weight"
      ],
      "example": null
    },
    {
      "name": "tooltip",
      "title": "Tooltip",
      "overviewName": "Tooltip",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/tooltip",
      "publicApi": "projects/components/tooltip/public-api.ts",
      "sourceRoot": "projects/components/tooltip/src",
      "docsPath": "/components/tooltip",
      "docsOverviewSource": "projects/docs/src/app/components/tooltip/overview/overview.html",
      "purpose": "Show a short helper message for one interface element on hover, focus, or touch.",
      "useWhen": "Use ngsTooltip as a directive on a trigger element when a short non-interactive helper message should explain an icon button, abbreviation, disabled state, dense control, compact label, or unclear affordance. Configure ngsTooltipPosition, ngsTooltipShowDelay, ngsTooltipHideDelay, ngsTooltipOffset, ngsTooltipDisabled, ngsTooltipClass, or ngsTooltipPositionAtOrigin when placement and timing need tuning. Export the directive as ngsTooltip when app logic must call show(), hide(), or toggle(). Keep tooltip text short and plain. Do not use Tooltip for interactive content, forms, action lists, rich previews, or long explanations; use Popover. Do not use it for command menus; use Menu. Do not use it for visible page messages; use Alert, Announcement, ActionRequired, or Incidents based on scope. Do not use it for form helper or validation text; use FormField hint and error. Do not use it for onboarding flows; use GuidedTour.",
      "exampleTopics": [
        "Basic Tooltip",
        "Tooltip With a Custom Position",
        "Tooltip show and hide delay",
        "Tooltip manually showing and hiding",
        "Tooltip disabled",
        "Tooltip position at origin",
        "Tooltip show hide delay",
        "Tooltip manually show hide"
      ],
      "minimalExample": "<button ngsButton=\"filled\"\n        ngsTooltip=\"Info about the action\"\n        aria-label=\"Button that displays a tooltip when focused or hovered over\">\n  Action\n</button>",
      "exampleFiles": [
        {
          "name": "basic-tooltip-example",
          "title": "Basic tooltip",
          "file": "projects/docs/src/app/components/tooltip/_examples/basic-tooltip-example/basic-tooltip-example.html",
          "source": "<button ngsButton=\"filled\"\n        ngsTooltip=\"Info about the action\"\n        aria-label=\"Button that displays a tooltip when focused or hovered over\">\n  Action\n</button>"
        },
        {
          "name": "tooltip-disabled-example",
          "title": "Tooltip disabled",
          "file": "projects/docs/src/app/components/tooltip/_examples/tooltip-disabled-example/tooltip-disabled-example.html",
          "source": "<button ngsButton=\"filled\"\n        ngsTooltip=\"Info about the action\"\n        [ngsTooltipDisabled]=\"disabled.value\">\n  Action\n</button>\n<ngs-checkbox [formControl]=\"disabled\" class=\"ms-5\">\n  Tooltip disabled\n</ngs-checkbox>"
        },
        {
          "name": "tooltip-manually-show-hide-example",
          "title": "Tooltip manually show hide",
          "file": "projects/docs/src/app/components/tooltip/_examples/tooltip-manually-show-hide-example/tooltip-manually-show-hide-example.html",
          "source": "<div>\n  <span> Click the following buttons to... </span>\n  <button ngsButton\n          (click)=\"tooltip.show()\"\n          aria-label=\"Show tooltip on the button at the end of this section\"\n          class=\"example-action-button\">\n    show\n  </button>\n  <button ngsButton\n          (click)=\"tooltip.hide()\"\n          aria-label=\"Hide tooltip on the button at the end of this section\"\n          class=\"example-action-button\">\n    hide\n  </button>\n  <button ngsButton\n          (click)=\"tooltip.toggle()\"\n          aria-label=\"Show/Hide tooltip on the button at the end of this section\"\n          class=\"example-action-button\">\n    toggle show/hide\n  </button>\n</div>\n<button ngsButton=\"filled\" #tooltip=\"ngsTooltip\"\n        ngsTooltip=\"Info about the action\"\n        ngsTooltipPosition=\"right\">\n  Action\n</button>"
        }
      ],
      "previewAsset": "projects/components/tooltip/preview.svg",
      "selectors": [
        "[ngsTooltip]",
        "ngs-tooltip-content"
      ],
      "exportedSymbols": [
        "Tooltip",
        "TOOLTIP_DEFAULT_OPTIONS",
        "TooltipContent",
        "TooltipDefaultOptions",
        "TooltipPosition",
        "TooltipVisibility"
      ],
      "inputs": [
        "ngsTooltip",
        "ngsTooltipClass",
        "ngsTooltipDisabled",
        "ngsTooltipHideDelay",
        "ngsTooltipOffset",
        "ngsTooltipPosition",
        "ngsTooltipPositionAtOrigin",
        "ngsTooltipShowDelay"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-neutral-100",
        "--ngs-color-neutral-950",
        "--ngs-font-size-xs",
        "--ngs-radius-md",
        "--ngs-tooltip-border-radius",
        "--ngs-tooltip-container-color",
        "--ngs-tooltip-font-size",
        "--ngs-tooltip-handset-font-size",
        "--ngs-tooltip-handset-padding",
        "--ngs-tooltip-line-height",
        "--ngs-tooltip-max-width",
        "--ngs-tooltip-padding",
        "--ngs-tooltip-supporting-text-color"
      ],
      "example": null
    },
    {
      "name": "tree",
      "title": "Tree",
      "overviewName": "Tree",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/tree",
      "publicApi": "projects/components/tree/public-api.ts",
      "sourceRoot": "projects/components/tree/src",
      "docsPath": "/components/tree",
      "docsOverviewSource": "projects/docs/src/app/components/tree/overview/overview.html",
      "purpose": "Display hierarchical data with expandable parent and child nodes.",
      "useWhen": "Use ngs-tree when users need to inspect or navigate hierarchical data where parent and child levels matter: folders and files, categories, permissions, taxonomies, organization structures, nested settings, product/entity hierarchies, and other expandable trees. Use dataSource with childrenAccessor for nested/static data, or treeControl with a custom DataSource for flat trees and dynamic loading. Define node templates with *ngsTreeNodeDef and use when for different node types. Use ngsTreeNodePadding for indentation and ngsTreeNodeToggle for expand/collapse controls. Use ProgressBar or Skeleton inside node templates when children load on demand. Do not use Tree for a simple vertical collection; use List. Do not use it for primary application navigation; use Sidebar, Sidenav, Navigation, or RailNav. Do not use it for FAQ or settings sections; use ExpansionPanel. Do not use it for dense row data with columns, sorting, filters, or bulk actions; use Table or DataView. Do not use it for step-by-step workflows; use Stepper.",
      "exampleTopics": [
        "Basic tree",
        "Selectable tree",
        "Checkable tree",
        "Draggable tree",
        "Searchable tree",
        "Tree with dynamic data"
      ],
      "minimalExample": "<ngs-tree #tree [dataSource]=\"dataSource\" [childrenAccessor]=\"childrenAccessor\">\n  <!-- This is the tree node template for leaf nodes -->\n  <ngs-tree-node *ngsTreeNodeDef=\"let node\" ngsTreeNodePadding>\n    <!-- use a disabled button to provide padding for tree leaf -->\n    <button ngsIconButton disabled></button>\n    {{node.name}}\n  </ngs-tree-node>\n  <!-- This is the tree node template for expandable nodes -->\n  <ngs-tree-node *ngsTreeNodeDef=\"let node;when: hasChild\"\n                 ngsTreeNodePadding\n                 [cdkTreeNodeTypeaheadLabel]=\"node.name\">\n    <button ngsIconButton ngsTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.name\">\n      @if (tree.isExpanded(node)) {\n        <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"size-4\"/>\n      } @else {\n        <ngs-icon name=\"fluent:chevron-right-24-regular\" class=\"size-4\"/>\n      }\n    </button>\n    {{node.name}}\n  </ngs-tree-node>\n</ngs-tree>",
      "exampleFiles": [
        {
          "name": "basic-tree-example",
          "title": "Basic tree",
          "file": "projects/docs/src/app/components/tree/_examples/basic-tree-example/basic-tree-example.html",
          "source": "<ngs-tree #tree [dataSource]=\"dataSource\" [childrenAccessor]=\"childrenAccessor\">\n  <!-- This is the tree node template for leaf nodes -->\n  <ngs-tree-node *ngsTreeNodeDef=\"let node\" ngsTreeNodePadding>\n    <!-- use a disabled button to provide padding for tree leaf -->\n    <button ngsIconButton disabled></button>\n    {{node.name}}\n  </ngs-tree-node>\n  <!-- This is the tree node template for expandable nodes -->\n  <ngs-tree-node *ngsTreeNodeDef=\"let node;when: hasChild\"\n                 ngsTreeNodePadding\n                 [cdkTreeNodeTypeaheadLabel]=\"node.name\">\n    <button ngsIconButton ngsTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.name\">\n      @if (tree.isExpanded(node)) {\n        <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"size-4\"/>\n      } @else {\n        <ngs-icon name=\"fluent:chevron-right-24-regular\" class=\"size-4\"/>\n      }\n    </button>\n    {{node.name}}\n  </ngs-tree-node>\n</ngs-tree>"
        },
        {
          "name": "checkable-tree-example",
          "title": "Checkable tree",
          "file": "projects/docs/src/app/components/tree/_examples/checkable-tree-example/checkable-tree-example.html",
          "source": "<ngs-tree #tree\n          [dataSource]=\"dataSource\"\n          [childrenAccessor]=\"childrenAccessor\"\n          [trackBy]=\"trackByName\"\n          (checkedChange)=\"checkedValues = $event\"\n          checkable>\n  <ngs-tree-node *ngsTreeNodeDef=\"let node\"\n                 ngsTreeNodePadding\n                 [value]=\"node.name\"\n                 [disabled]=\"!!node.disabled\">\n    <button ngsIconButton disabled></button>\n    {{node.name}}\n  </ngs-tree-node>\n  <ngs-tree-node *ngsTreeNodeDef=\"let node; when: hasChild\"\n                 ngsTreeNodePadding\n                 [value]=\"node.name\"\n                 [disabled]=\"!!node.disabled\"\n                 [cdkTreeNodeTypeaheadLabel]=\"node.name\">\n    <button ngsIconButton ngsTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.name\">\n      @if (tree.isExpanded(node)) {\n        <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"size-4\"/>\n      } @else {\n        <ngs-icon name=\"fluent:chevron-right-24-regular\" class=\"size-4\"/>\n      }\n    </button>\n    {{node.name}}\n  </ngs-tree-node>\n</ngs-tree>\n<p class=\"tree-example-state\">\n  Checked: {{checkedValues.length ? checkedValues.join(', ') : 'None'}}\n</p>"
        },
        {
          "name": "draggable-tree-example",
          "title": "Draggable tree",
          "file": "projects/docs/src/app/components/tree/_examples/draggable-tree-example/draggable-tree-example.html",
          "source": "<ngs-tree #tree\n          [dataSource]=\"dataSource\"\n          [childrenAccessor]=\"childrenAccessor\"\n          [trackBy]=\"trackByName\"\n          (nodeDrop)=\"onNodeDrop($event)\"\n          draggable>\n  <ngs-tree-node *ngsTreeNodeDef=\"let node\" ngsTreeNodePadding [value]=\"node.name\">\n    <button ngsIconButton disabled></button>\n    {{node.name}}\n  </ngs-tree-node>\n  <ngs-tree-node *ngsTreeNodeDef=\"let node; when: hasChild\"\n                 ngsTreeNodePadding\n                 [value]=\"node.name\"\n                 [cdkTreeNodeTypeaheadLabel]=\"node.name\">\n    <button ngsIconButton ngsTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.name\">\n      @if (tree.isExpanded(node)) {\n        <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"size-4\"/>\n      } @else {\n        <ngs-icon name=\"fluent:chevron-right-24-regular\" class=\"size-4\"/>\n      }\n    </button>\n    {{node.name}}\n  </ngs-tree-node>\n</ngs-tree>\n<p class=\"tree-example-state\">\n  {{dropMessage}}\n</p>"
        }
      ],
      "previewAsset": "projects/components/tree/preview.svg",
      "selectors": [
        "[ngsTreeNodeDef]",
        "[ngsTreeNodeOutlet]",
        "[ngsTreeNodePadding]",
        "[ngsTreeNodeToggle]",
        "ng-template[ngsTreeDragPlaceholder]",
        "ngs-nested-tree-node",
        "ngs-tree",
        "ngs-tree-node"
      ],
      "exportedSymbols": [
        "NestedTreeNode",
        "Tree",
        "TreeDragPlaceholder",
        "TreeDragPreview",
        "TreeFilterMode",
        "TreeFilterPredicate",
        "TreeNode",
        "TreeNodeDef",
        "TreeNodeDragPlaceholderContext",
        "TreeNodeDragPredicate",
        "TreeNodeDrop",
        "TreeNodeDropContext",
        "TreeNodeDropPosition",
        "TreeNodeDropPredicate",
        "TreeNodeOutlet",
        "TreeNodePadding",
        "TreeNodeToggle"
      ],
      "inputs": [
        "checkable",
        "childrenKey",
        "disabled",
        "draggable",
        "dragPreview",
        "filterMode",
        "filterValue",
        "ngsNestedTreeNode",
        "ngsTreeNode",
        "ngsTreeNodeDefWhen",
        "ngsTreeNodePadding",
        "ngsTreeNodePaddingIndent",
        "ngsTreeNodeToggleRecursive",
        "nodePaddingIndent",
        "recursive",
        "reorderOnDrop",
        "selectable",
        "tabIndex",
        "value",
        "when"
      ],
      "outputs": [
        "activation",
        "checkedChange",
        "expandedChange",
        "selectedChange"
      ],
      "cssTokens": [
        "--ngs-checkbox-gap",
        "--ngs-color-neutral",
        "--ngs-color-primary",
        "--ngs-color-surface",
        "--ngs-nav-item-active-bg",
        "--ngs-nav-item-active-color",
        "--ngs-nav-item-color",
        "--ngs-nav-item-font-size",
        "--ngs-nav-item-gap",
        "--ngs-nav-item-height",
        "--ngs-nav-item-hover-bg",
        "--ngs-nav-item-hover-color",
        "--ngs-nav-item-radius",
        "--ngs-shadow-md",
        "--ngs-tree-container-background-color",
        "--ngs-tree-gap",
        "--ngs-tree-node-active-bg",
        "--ngs-tree-node-active-color",
        "--ngs-tree-node-checkbox-gap",
        "--ngs-tree-node-color",
        "--ngs-tree-node-disabled-opacity",
        "--ngs-tree-node-drag-image-bg",
        "--ngs-tree-node-drag-image-opacity",
        "--ngs-tree-node-drag-image-shadow",
        "--ngs-tree-node-dragging-source-opacity",
        "--ngs-tree-node-drop-line-color",
        "--ngs-tree-node-drop-line-radius",
        "--ngs-tree-node-drop-line-size",
        "--ngs-tree-node-drop-target-bg",
        "--ngs-tree-node-drop-target-color",
        "--ngs-tree-node-drop-target-outline",
        "--ngs-tree-node-drop-target-outline-offset",
        "--ngs-tree-node-font-size",
        "--ngs-tree-node-gap",
        "--ngs-tree-node-hover-bg",
        "--ngs-tree-node-hover-color",
        "--ngs-tree-node-line-color",
        "--ngs-tree-node-min-height",
        "--ngs-tree-node-padding",
        "--ngs-tree-node-radius",
        "--ngs-tree-node-title-font-size",
        "--ngs-tree-padding"
      ],
      "example": null
    },
    {
      "name": "upload",
      "title": "Upload",
      "overviewName": "Upload",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/upload",
      "publicApi": "projects/components/upload/public-api.ts",
      "sourceRoot": "projects/components/upload/src",
      "docsPath": "/components/upload",
      "docsOverviewSource": "projects/docs/src/app/components/upload/overview/overview.html",
      "purpose": "Provide UI for selecting files, drag-and-drop upload areas, and file progress displays.",
      "useWhen": "Use Upload components when users need to choose local files, drop files into an upload area, or see selected/uploading files with progress, errors, retry, remove, or cancel actions. Use ngsUploadTrigger on a button or clickable element to open the native file picker. Use ngs-upload-area for drag-and-drop with ngsUploadAreaMainState, ngsUploadAreaDropState, ngsUploadAreaInvalidState, and ngsUploadAreaIcon. Use accept and multiple to control allowed file types and multi-select. Use ngs-upload-container with ngs-upload-allowed-types and ngs-upload-max-file-size for upload hints. Use ngs-file-list with ngs-file for vertical file rows, or ngs-files-grid with ngs-grid-file for compact file cards. Use ngs-file-control and ngsGridFileControl for file-level actions. The component emits fileSelected with the selected File objects; the application must perform validation, backend upload, retry, deletion, persistence, and security checks. Do not treat Upload as a backend uploader, storage manager, or import wizard by itself. Do not use it for editing selected images; use Crop, ImageResizer, ThumbnailMaker, or ImageDesigner after selection. Do not use it for rich editor image upload flows; use the TextEditor or CommentEditor upload APIs. Do not use it to manage an existing document table with sorting and filtering; use Table or DataView.",
      "exampleTopics": [
        "Basic Upload",
        "Upload area",
        "File list",
        "File grid"
      ],
      "minimalExample": "<div class=\"mb-5\">\n  <button ngsButton=\"outlined\" ngsUploadTrigger\n          (fileSelected)=\"onFileSelected($event)\">Select a local file</button>\n</div>\n<p>\n  Selected files: {{ files | json }}\n</p>",
      "exampleFiles": [
        {
          "name": "basic-upload-example",
          "title": "Basic upload",
          "file": "projects/docs/src/app/components/upload/_examples/basic-upload-example/basic-upload-example.html",
          "source": "<div class=\"mb-5\">\n  <button ngsButton=\"outlined\" ngsUploadTrigger\n          (fileSelected)=\"onFileSelected($event)\">Select a local file</button>\n</div>\n<p>\n  Selected files: {{ files | json }}\n</p>"
        },
        {
          "name": "file-grid-example",
          "title": "File grid",
          "file": "projects/docs/src/app/components/upload/_examples/file-grid-example/file-grid-example.html",
          "source": "<ngs-files-grid>\n  @for (file of fileList; track file) {\n    <ngs-grid-file [size]=\"file.size\"\n                   [state]=\"file.state\"\n                   [errorMessage]=\"file.errorMessage\"\n                   [remainingTime]=\"file.remainingTime\"\n                   [name]=\"file.name\"\n                   [progress]=\"file.progress\">\n      <ng-container ngsFileIcon>\n        @switch (file.type) {\n          @case ('pdf') {\n            <img src=\"assets/file-types/pdf.svg\" alt=\"file\">\n          }\n          @case ('doc') {\n            <img src=\"assets/file-types/doc.svg\" alt=\"file\">\n          }\n          @case ('xls') {\n            <img src=\"assets/file-types/xls.svg\" alt=\"file\">\n          }\n        }\n      </ng-container>\n      @if (file.state === 'error') {\n        <button ngsIconButton ngsGridFileControl>\n          <ngs-icon name=\"fluent:arrow-clockwise-24-regular\" ngsGridFileControl/>\n        </button>\n      }\n      <button ngsIconButton ngsGridFileControl>\n        <ngs-icon name=\"fluent:dismiss-24-regular\" (click)=\"delete($index)\"/>\n      </button>\n    </ngs-grid-file>\n  }\n</ngs-files-grid>"
        },
        {
          "name": "file-list-example",
          "title": "File list",
          "file": "projects/docs/src/app/components/upload/_examples/file-list-example/file-list-example.html",
          "source": "<ngs-file-list>\n  @for (uploadFile of fileList; track uploadFile) {\n    <ngs-file [size]=\"uploadFile.size\"\n              [state]=\"uploadFile.state\"\n              [errorMessage]=\"uploadFile.errorMessage\"\n              [remainingTime]=\"uploadFile.remainingTime\"\n              [name]=\"uploadFile.name\"\n              [progress]=\"uploadFile.progress\">\n      @if (uploadFile.state === 'error') {\n        <button type=\"button\" ngs-file-control>\n          <ngs-icon name=\"fluent:arrow-clockwise-24-regular\"/>\n        </button>\n      }\n      <button type=\"button\" ngs-file-control>\n        <ngs-icon name=\"fluent:dismiss-24-regular\"/>\n      </button>\n    </ngs-file>\n  }\n</ngs-file-list>"
        }
      ],
      "previewAsset": "projects/components/upload/preview.svg",
      "selectors": [
        "[ngs-file-control]",
        "[ngsFileIcon]",
        "[ngsGridFileControl]",
        "[ngsUploadAreaDropState]",
        "[ngsUploadAreaIcon]",
        "[ngsUploadAreaInvalidState]",
        "[ngsUploadAreaMainState]",
        "[ngsUploadTrigger]",
        "ngs-file",
        "ngs-file-control",
        "ngs-file-list",
        "ngs-files-grid",
        "ngs-grid-file",
        "ngs-list-file",
        "ngs-upload-allowed-types",
        "ngs-upload-area",
        "ngs-upload-container",
        "ngs-upload-max-file-size"
      ],
      "exportedSymbols": [
        "File",
        "FileControl",
        "FileIconDirective",
        "FileList",
        "FilesGrid",
        "GridFile",
        "GridFileControlDirective",
        "ListFile",
        "UploadAllowedTypes",
        "UploadArea",
        "UploadAreaDropStateDirective",
        "UploadAreaIconDirective",
        "UploadAreaInvalidStateDirective",
        "UploadAreaMainStateDirective",
        "UploadContainer",
        "UploadFileSelectedEvent",
        "UploadFileState",
        "UploadMaxFileSize",
        "UploadTriggerDirective"
      ],
      "inputs": [
        "accept",
        "allowHover",
        "errorMessage",
        "multiple",
        "name",
        "progress",
        "progressingMessage",
        "remainingTime",
        "size",
        "state"
      ],
      "outputs": [
        "fileSelected"
      ],
      "cssTokens": [
        "--ngs-color-danger",
        "--ngs-color-danger-container-high",
        "--ngs-color-danger-container-low",
        "--ngs-color-neutral-300",
        "--ngs-color-neutral-500",
        "--ngs-color-neutral-600",
        "--ngs-color-primary",
        "--ngs-color-subtle",
        "--ngs-color-surface-container",
        "--ngs-color-surface-container-highest",
        "--ngs-file-bg",
        "--ngs-file-border-radius",
        "--ngs-file-control-color",
        "--ngs-file-control-font-size",
        "--ngs-file-control-hover-color",
        "--ngs-file-controls-gap",
        "--ngs-file-error-bg",
        "--ngs-file-error-color",
        "--ngs-file-error-font-size",
        "--ngs-file-gap",
        "--ngs-file-info-color",
        "--ngs-file-info-font-size",
        "--ngs-file-list-gap",
        "--ngs-file-name-font-size",
        "--ngs-file-padding",
        "--ngs-file-progress-bar-bg",
        "--ngs-file-progress-bg",
        "--ngs-file-progress-border-radius",
        "--ngs-file-progress-height",
        "--ngs-file-progress-margin",
        "--ngs-font-size-sm",
        "--ngs-font-size-xl",
        "--ngs-font-size-xs",
        "--ngs-icon-size",
        "--ngs-radius-lg",
        "--ngs-radius-xl",
        "--ngs-upload-area-bg",
        "--ngs-upload-area-border",
        "--ngs-upload-area-border-radius",
        "--ngs-upload-area-color",
        "--ngs-upload-area-drop-active-bg",
        "--ngs-upload-area-drop-active-border",
        "--ngs-upload-area-drop-active-color",
        "--ngs-upload-area-drop-invalid-bg",
        "--ngs-upload-area-drop-invalid-border",
        "--ngs-upload-area-drop-invalid-color",
        "--ngs-upload-area-font-size",
        "--ngs-upload-area-padding"
      ],
      "example": null
    },
    {
      "name": "video-player",
      "title": "Video Player",
      "overviewName": "Video Player",
      "category": "libraries",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/video-player",
      "publicApi": "projects/components/video-player/public-api.ts",
      "sourceRoot": "projects/components/video-player/src",
      "docsPath": "/libraries/video-player",
      "docsOverviewSource": "projects/docs/src/app/libraries/video-player/overview/overview.html",
      "purpose": "Play video inline inside the current page, card, carousel, media preview, lesson, or workspace layout.",
      "useWhen": "Use ngs-video-player when video should stay embedded in the current layout with NgStarter-controlled playback UI. Pass src for the video source, optional thumbnailUrl for the poster preview, and orientation or payload.orientation for landscape, portrait, or square aspect ratio. Configure autoPlay, muted, disableClickToPlay, withCredentials, showPlayButton, showSpeaker, showFullscreen, and showDurationSlider to match the surface. Listen to play, pause, ended, loaded, and error for application state. Good for media previews, lessons, product videos, content previews, cards, carousel slides, and dashboard/workspace media blocks. The player wraps video.js and supports HLS m3u8 sources through video.js. Do not use VideoPlayer when the video should open as a focused overlay or lightbox; use VideoViewer. Do not use it as a gallery or list by itself; compose it with Carousel, Card, Grid, VideoViewer, or a layout component. Do not use it for YouTube, Vimeo, or other iframe-provider embeds when the provider player is required. Do not use it as a content editing API directly; use the ContentEditor video block for editable content.",
      "exampleTopics": [
        "Video Player"
      ],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/video-player/preview.svg",
      "selectors": [
        "ngs-video-player"
      ],
      "exportedSymbols": [
        "VideoPlayer",
        "VideoPlayerInterface",
        "VideoPlayerOrientation",
        "VideoPlayerService"
      ],
      "inputs": [
        "autoPlay",
        "disableClickToPlay",
        "muted",
        "orientation",
        "payload",
        "showDurationSlider",
        "showFullscreen",
        "showPlayButton",
        "showSpeaker",
        "src",
        "thumbnailUrl",
        "withCredentials"
      ],
      "outputs": [
        "ended",
        "error",
        "loaded",
        "pause",
        "play"
      ],
      "cssTokens": [],
      "example": null
    },
    {
      "name": "video-viewer",
      "title": "Video Viewer",
      "overviewName": "Video Viewer",
      "category": "components",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/video-viewer",
      "publicApi": "projects/components/video-viewer/public-api.ts",
      "sourceRoot": "projects/components/video-viewer/src",
      "docsPath": "/components/video-viewer",
      "docsOverviewSource": "projects/docs/src/app/components/video-viewer/overview/overview.html",
      "purpose": "Open videos in a focused overlay or lightbox above the current page.",
      "useWhen": "Use VideoViewer when a thumbnail, preview card, compact inline player, attachment, gallery item, or media library item should open a larger focused video viewing experience. Put ngsVideoViewer on the preview container and ngsVideoViewerVideo on each clickable preview item. Pass sourceUrl for the video source, plus optional title, caption, description, or template directives ngsVideoViewerVideoTitle, ngsVideoViewerVideoCaption, and ngsVideoViewerVideoDescription. Configure orientation, payload, autoPlay, muted, showPlayButton, showSpeaker, showFullscreen, and showDurationSlider to control the underlying VideoPlayer in the overlay. Good for video attachments, media previews, galleries, lessons, product videos, and media detail flows. Do not use VideoViewer when video should stay inline in the current layout; use VideoPlayer. Do not use it as a carousel, grid, or gallery layout by itself; compose previews with Card, Grid, Carousel, or another layout. Do not use it as a generic modal or form dialog; use Dialog or Drawer. Do not use it for YouTube, Vimeo, or iframe-provider embeds when the provider player is required.",
      "exampleTopics": [
        "Basic Video Viewer"
      ],
      "minimalExample": "<div ngsVideoViewer class=\"flex items-start gap-7 flex-wrap\">\n  @for (video of videos; track $index) {\n    <div ngsVideoViewerVideo\n         [sourceUrl]=\"video.src\"\n         [title]=\"video.title\"\n         [muted]=\"true\"\n         [autoPlay]=\"true\"\n         [showPlayButton]=\"false\"\n         [showFullscreen]=\"false\"\n         [orientation]=\"video.orientation\"\n         class=\"flex items-center justify-center border border-muted rounded p-2 cursor-pointer\">\n      <ngs-video-player [src]=\"video.src\"\n                        [muted]=\"true\"\n                        [showFullscreen]=\"false\"\n                        [showPlayButton]=\"false\"\n                        [showDurationSlider]=\"false\"\n                        [orientation]=\"video.orientation\"\n                        [disableClickToPlay]=\"true\"\n                        class=\"h-[200px]\"/>\n    </div>\n  }\n</div>",
      "exampleFiles": [
        {
          "name": "basic-video-viewer-example",
          "title": "Basic video viewer",
          "file": "projects/docs/src/app/components/video-viewer/_examples/basic-video-viewer-example/basic-video-viewer-example.html",
          "source": "<div ngsVideoViewer class=\"flex items-start gap-7 flex-wrap\">\n  @for (video of videos; track $index) {\n    <div ngsVideoViewerVideo\n         [sourceUrl]=\"video.src\"\n         [title]=\"video.title\"\n         [muted]=\"true\"\n         [autoPlay]=\"true\"\n         [showPlayButton]=\"false\"\n         [showFullscreen]=\"false\"\n         [orientation]=\"video.orientation\"\n         class=\"flex items-center justify-center border border-muted rounded p-2 cursor-pointer\">\n      <ngs-video-player [src]=\"video.src\"\n                        [muted]=\"true\"\n                        [showFullscreen]=\"false\"\n                        [showPlayButton]=\"false\"\n                        [showDurationSlider]=\"false\"\n                        [orientation]=\"video.orientation\"\n                        [disableClickToPlay]=\"true\"\n                        class=\"h-[200px]\"/>\n    </div>\n  }\n</div>"
        }
      ],
      "previewAsset": "projects/components/video-viewer/preview.svg",
      "selectors": [
        "[ngsVideoViewer]",
        "[ngsVideoViewerVideo]",
        "[ngsVideoViewerVideoCaption]",
        "[ngsVideoViewerVideoDescription]",
        "[ngsVideoViewerVideoTitle]",
        "ngs-video-viewer"
      ],
      "exportedSymbols": [
        "VIDEO_VIEWER",
        "VIDEO_VIEWER_DATA",
        "VIDEO_VIEWER_REF",
        "VideoViewer",
        "VideoViewerDirective",
        "VideoViewerOptions",
        "VideoViewerOrientation",
        "VideoViewerRef",
        "VideoViewerVideoCaptionDirective",
        "VideoViewerVideoDescriptionDirective",
        "VideoViewerVideoDirective",
        "VideoViewerVideoTitleDirective"
      ],
      "inputs": [
        "autoPlay",
        "caption",
        "description",
        "muted",
        "orientation",
        "payload",
        "showDurationSlider",
        "showFullscreen",
        "showPlayButton",
        "showSpeaker",
        "sourceUrl",
        "title"
      ],
      "outputs": [],
      "cssTokens": [
        "--ngs-color-neutral-100",
        "--ngs-color-neutral-200",
        "--ngs-color-neutral-300",
        "--ngs-color-neutral-400",
        "--ngs-color-neutral-50",
        "--ngs-color-neutral-600",
        "--ngs-color-neutral-700",
        "--ngs-color-neutral-800",
        "--ngs-color-neutral-900",
        "--ngs-color-neutral-950",
        "--ngs-font-size-sm",
        "--ngs-shadow-sm"
      ],
      "example": null
    },
    {
      "name": "visual-builder",
      "title": "Visual Builder",
      "overviewName": "Visual Builder",
      "category": "libraries",
      "package": "@ngstarter-ui/components",
      "importPath": "@ngstarter-ui/components/visual-builder",
      "publicApi": "projects/components/visual-builder/public-api.ts",
      "sourceRoot": "projects/components/visual-builder/src",
      "docsPath": "/libraries/visual-builder",
      "docsOverviewSource": "projects/docs/src/app/libraries/visual-builder/overview/overview.html",
      "purpose": "Experimental scaffold for a future no-code or low-code visual workspace.",
      "useWhen": "Do not use ngs-visual-builder for production admin screens, dashboards, visual editors, page builders, or real no-code/low-code workflows yet. The current component is only a placeholder: it has no inputs, outputs, layout regions, canvas, drag and drop, inspector, persistence, or editable block model. Mention it only as an experimental scaffold for future visual builder work. Use ContentEditor for block-based CMS/page content, ImageDesigner for creative image composition, Tiles for editable dashboard widgets or config-driven dashboard renderers, Grid for static dashboard layouts, Form Builder for schema-driven forms, KanbanBoard for workflow columns, and normal NgStarter layout/components for admin screens.",
      "exampleTopics": [
        "Visual Builder"
      ],
      "minimalExample": null,
      "exampleFiles": [],
      "previewAsset": "projects/components/visual-builder/preview.svg",
      "selectors": [
        "ngs-visual-builder"
      ],
      "exportedSymbols": [
        "VisualBuilder"
      ],
      "inputs": [],
      "outputs": [],
      "cssTokens": [],
      "example": null
    }
  ]
}
