[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F2YXVEPPDCYJD2NV9YSXDV":3,"skill-same:01M6F2YXVEPPDCYJD2NV9YSXDV":67},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":49,"ownerHtmlUrl":50,"ownerBlogUrl":6,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M6F2YXVEPPDCYJD2NV9YSXDV","angular-component",null,"Create modern Angular standalone components following v20+ best practices. Use for building UI components with signal-based inputs\u002Foutputs, OnPush change detection, host bindings, content projection, and lifecycle hooks. Triggers on component creation, refactoring class-based inputs to signals, adding host bindings, or implementing accessible interactive components.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fanalogjs\u002Fangular-skills\u002Fangular-component\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"component","angular component","angular","use","with","change detection","ui components","host","triggers","creation","signals","hooks","components","interactive","refactoring","lifecycle","detection","best practices","create","change","2026-11-10 10:12:30",false,"---\nname: angular-component\ndescription: Create modern Angular standalone components following v20+ best practices. Use for building UI components with signal-based inputs\u002Foutputs, OnPush change detection, host bindings, content projection, and lifecycle hooks. Triggers on component creation, refactoring class-based inputs to signals, adding host bindings, or implementing accessible interactive components.\n---\n\n# Angular Component\n\nCreate standalone components for Angular v20+. Components are standalone by default—do NOT set `standalone: true`.\n\n## Component Structure\n\n```typescript\nimport { Component, ChangeDetectionStrategy, input, output, computed } from '@angular\u002Fcore';\n\n@Component({\n  selector: 'app-user-card',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    'class': 'user-card',\n    '[class.active]': 'isActive()',\n    '(click)': 'handleClick()',\n  },\n  template: `\n    \u003Cimg [src]=\"avatarUrl()\" [alt]=\"name() + ' avatar'\" \u002F>\n    \u003Ch2>{{ name() }}\u003C\u002Fh2>\n    @if (showEmail()) {\n      \u003Cp>{{ email() }}\u003C\u002Fp>\n    }\n  `,\n  styles: `\n    :host { display: block; }\n    :host.active { border: 2px solid blue; }\n  `,\n})\nexport class UserCard {\n  \u002F\u002F Required input\n  name = input.required\u003Cstring>();\n  \n  \u002F\u002F Optional input with default\n  email = input\u003Cstring>('');\n  showEmail = input(false);\n  \n  \u002F\u002F Input with transform\n  isActive = input(false, { transform: booleanAttribute });\n  \n  \u002F\u002F Computed from inputs\n  avatarUrl = computed(() => `https:\u002F\u002Fapi.example.com\u002Favatar\u002F${this.name()}`);\n  \n  \u002F\u002F Output\n  selected = output\u003Cstring>();\n  \n  handleClick() {\n    this.selected.emit(this.name());\n  }\n}\n```\n\n## Signal Inputs\n\n```typescript\n\u002F\u002F Required - must be provided by parent\nname = input.required\u003Cstring>();\n\n\u002F\u002F Optional with default value\ncount = input(0);\n\n\u002F\u002F Optional without default (undefined allowed)\nlabel = input\u003Cstring>();\n\n\u002F\u002F With alias for template binding\nsize = input('medium', { alias: 'buttonSize' });\n\n\u002F\u002F With transform function\ndisabled = input(false, { transform: booleanAttribute });\nvalue = input(0, { transform: numberAttribute });\n```\n\n## Signal Outputs\n\n```typescript\nimport { output, outputFromObservable } from '@angular\u002Fcore';\n\n\u002F\u002F Basic output\nclicked = output\u003Cvoid>();\nselected = output\u003CItem>();\n\n\u002F\u002F With alias\nvalueChange = output\u003Cnumber>({ alias: 'change' });\n\n\u002F\u002F From Observable (for RxJS interop)\nscroll$ = new Subject\u003Cnumber>();\nscrolled = outputFromObservable(this.scroll$);\n\n\u002F\u002F Emit values\nthis.clicked.emit();\nthis.selected.emit(item);\n```\n\n## Host Bindings\n\nUse the `host` object in `@Component`—do NOT use `@HostBinding` or `@HostListener` decorators.\n\n```typescript\n@Component({\n  selector: 'app-button',\n  host: {\n    \u002F\u002F Static attributes\n    'role': 'button',\n    \n    \u002F\u002F Dynamic class bindings\n    '[class.primary]': 'variant() === \"primary\"',\n    '[class.disabled]': 'disabled()',\n    \n    \u002F\u002F Dynamic style bindings\n    '[style.--btn-color]': 'color()',\n    \n    \u002F\u002F Attribute bindings\n    '[attr.aria-disabled]': 'disabled()',\n    '[attr.tabindex]': 'disabled() ? -1 : 0',\n    \n    \u002F\u002F Event listeners\n    '(click)': 'onClick($event)',\n    '(keydown.enter)': 'onClick($event)',\n    '(keydown.space)': 'onClick($event)',\n  },\n  template: `\u003Cng-content \u002F>`,\n})\nexport class Button {\n  variant = input\u003C'primary' | 'secondary'>('primary');\n  disabled = input(false, { transform: booleanAttribute });\n  color = input('#007bff');\n  \n  clicked = output\u003Cvoid>();\n  \n  onClick(event: Event) {\n    if (!this.disabled()) {\n      this.clicked.emit();\n    }\n  }\n}\n```\n\n## Content Projection\n\n```typescript\n@Component({\n  selector: 'app-card',\n  template: `\n    \u003Cheader>\n      \u003Cng-content select=\"[card-header]\" \u002F>\n    \u003C\u002Fheader>\n    \u003Cmain>\n      \u003Cng-content \u002F>\n    \u003C\u002Fmain>\n    \u003Cfooter>\n      \u003Cng-content select=\"[card-footer]\" \u002F>\n    \u003C\u002Ffooter>\n  `,\n})\nexport class Card {}\n\n\u002F\u002F Usage:\n\u002F\u002F \u003Capp-card>\n\u002F\u002F   \u003Ch2 card-header>Title\u003C\u002Fh2>\n\u002F\u002F   \u003Cp>Main content\u003C\u002Fp>\n\u002F\u002F   \u003Cbutton card-footer>Action\u003C\u002Fbutton>\n\u002F\u002F \u003C\u002Fapp-card>\n```\n\n## Lifecycle Hooks\n\n```typescript\nimport { OnDestroy, OnInit, afterNextRender, afterRender } from '@angular\u002Fcore';\n\nexport class My implements OnInit, OnDestroy {\n  constructor() {\n    \u002F\u002F For DOM manipulation after render (SSR-safe)\n    afterNextRender(() => {\n      \u002F\u002F Runs once after first render\n    });\n\n    afterRender(() => {\n      \u002F\u002F Runs after every render\n    });\n  }\n\n  ngOnInit() { \u002F* Component initialized *\u002F }\n  ngOnDestroy() { \u002F* Cleanup *\u002F }\n}\n```\n\n## Accessibility Requirements\n\nComponents MUST:\n- Pass AXE accessibility checks\n- Meet WCAG AA standards\n- Include proper ARIA attributes for interactive elements\n- Support keyboard navigation\n- Maintain visible focus indicators\n\n```typescript\n@Component({\n  selector: 'app-toggle',\n  host: {\n    'role': 'switch',\n    '[attr.aria-checked]': 'checked()',\n    '[attr.aria-label]': 'label()',\n    'tabindex': '0',\n    '(click)': 'toggle()',\n    '(keydown.enter)': 'toggle()',\n    '(keydown.space)': 'toggle(); $event.preventDefault()',\n  },\n  template: `\u003Cspan class=\"toggle-track\">\u003Cspan class=\"toggle-thumb\">\u003C\u002Fspan>\u003C\u002Fspan>`,\n})\nexport class Toggle {\n  label = input.required\u003Cstring>();\n  checked = input(false, { transform: booleanAttribute });\n  checkedChange = output\u003Cboolean>();\n  \n  toggle() {\n    this.checkedChange.emit(!this.checked());\n  }\n}\n```\n\n## Template Syntax\n\nUse native control flow—do NOT use `*ngIf`, `*ngFor`, `*ngSwitch`.\n\n```html\n\u003C!-- Conditionals -->\n@if (isLoading()) {\n  \u003Capp-spinner \u002F>\n} @else if (error()) {\n  \u003Capp-error [message]=\"error()\" \u002F>\n} @else {\n  \u003Capp-content [data]=\"data()\" \u002F>\n}\n\n\u003C!-- Loops -->\n@for (item of items(); track item.id) {\n  \u003Capp-item [item]=\"item\" \u002F>\n} @empty {\n  \u003Cp>No items found\u003C\u002Fp>\n}\n\n\u003C!-- Switch -->\n@switch (status()) {\n  @case ('pending') { \u003Cspan>Pending\u003C\u002Fspan> }\n  @case ('active') { \u003Cspan>Active\u003C\u002Fspan> }\n  @default { \u003Cspan>Unknown\u003C\u002Fspan> }\n}\n```\n\n## Class and Style Bindings\n\nDo NOT use `ngClass` or `ngStyle`. Use direct bindings:\n\n```html\n\u003C!-- Class bindings -->\n\u003Cdiv [class.active]=\"isActive()\">Single class\u003C\u002Fdiv>\n\u003Cdiv [class]=\"classString()\">Class string\u003C\u002Fdiv>\n\n\u003C!-- Style bindings -->\n\u003Cdiv [style.color]=\"textColor()\">Styled text\u003C\u002Fdiv>\n\u003Cdiv [style.width.px]=\"width()\">With unit\u003C\u002Fdiv>\n```\n\n## Images\n\nUse `NgOptimizedImage` for static images:\n\n```typescript\nimport { NgOptimizedImage } from '@angular\u002Fcommon';\n\n@Component({\n  imports: [NgOptimizedImage],\n  template: `\n    \u003Cimg ngSrc=\"\u002Fassets\u002Fhero.jpg\" width=\"800\" height=\"600\" priority \u002F>\n    \u003Cimg [ngSrc]=\"imageUrl()\" width=\"200\" height=\"200\" \u002F>\n  `,\n})\nexport class Hero {\n  imageUrl = input.required\u003Cstring>();\n}\n```\n\nFor detailed patterns, see [references\u002Fcomponent-patterns.md](references\u002Fcomponent-patterns.md).\n\n","# Angular Component\n\nCreate standalone components for Angular v20+. Components are standalone by default—do NOT set `standalone: true`.\n\n## Component Structure\n\n```typescript\nimport { Component, ChangeDetectionStrategy, input, output, computed } from '@angular\u002Fcore';\n\n@Component({\n  selector: 'app-user-card',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    'class': 'user-card',\n    '[class.active]': 'isActive()',\n    '(click)': 'handleClick()',\n  },\n  template: `\n    \u003Cimg [src]=\"avatarUrl()\" [alt]=\"name() + ' avatar'\" \u002F>\n    \u003Ch2>{{ name() }}\u003C\u002Fh2>\n    @if (showEmail()) {\n      \u003Cp>{{ email() }}\u003C\u002Fp>\n    }\n  `,\n  styles: `\n    :host { display: block; }\n    :host.active { border: 2px solid blue; }\n  `,\n})\nexport class UserCard {\n  \u002F\u002F Required input\n  name = input.required\u003Cstring>();\n  \n  \u002F\u002F Optional input with default\n  email = input\u003Cstring>('');\n  showEmail = input(false);\n  \n  \u002F\u002F Input with transform\n  isActive = input(false, { transform: booleanAttribute });\n  \n  \u002F\u002F Computed from inputs\n  avatarUrl = computed(() => `https:\u002F\u002Fapi.example.com\u002Favatar\u002F${this.name()}`);\n  \n  \u002F\u002F Output\n  selected = output\u003Cstring>();\n  \n  handleClick() {\n    this.selected.emit(this.name());\n  }\n}\n```\n\n## Signal Inputs\n\n```typescript\n\u002F\u002F Required - must be provided by parent\nname = input.required\u003Cstring>();\n\n\u002F\u002F Optional with default value\ncount = input(0);\n\n\u002F\u002F Optional without default (undefined allowed)\nlabel = input\u003Cstring>();\n\n\u002F\u002F With alias for template binding\nsize = input('medium', { alias: 'buttonSize' });\n\n\u002F\u002F With transform function\ndisabled = input(false, { transform: booleanAttribute });\nvalue = input(0, { transform: numberAttribute });\n```\n\n## Signal Outputs\n\n```typescript\nimport { output, outputFromObservable } from '@angular\u002Fcore';\n\n\u002F\u002F Basic output\nclicked = output\u003Cvoid>();\nselected = output\u003CItem>();\n\n\u002F\u002F With alias\nvalueChange = output\u003Cnumber>({ alias: 'change' });\n\n\u002F\u002F From Observable (for RxJS interop)\nscroll$ = new Subject\u003Cnumber>();\nscrolled = outputFromObservable(this.scroll$);\n\n\u002F\u002F Emit values\nthis.clicked.emit();\nthis.selected.emit(item);\n```\n\n## Host Bindings\n\nUse the `host` object in `@Component`—do NOT use `@HostBinding` or `@HostListener` decorators.\n\n```typescript\n@Component({\n  selector: 'app-button',\n  host: {\n    \u002F\u002F Static attributes\n    'role': 'button',\n    \n    \u002F\u002F Dynamic class bindings\n    '[class.primary]': 'variant() === \"primary\"',\n    '[class.disabled]': 'disabled()',\n    \n    \u002F\u002F Dynamic style bindings\n    '[style.--btn-color]': 'color()',\n    \n    \u002F\u002F Attribute bindings\n    '[attr.aria-disabled]': 'disabled()',\n    '[attr.tabindex]': 'disabled() ? -1 : 0',\n    \n    \u002F\u002F Event listeners\n    '(click)': 'onClick($event)',\n    '(keydown.enter)': 'onClick($event)',\n    '(keydown.space)': 'onClick($event)',\n  },\n  template: `\u003Cng-content \u002F>`,\n})\nexport class Button {\n  variant = input\u003C'primary' | 'secondary'>('primary');\n  disabled = input(false, { transform: booleanAttribute });\n  color = input('#007bff');\n  \n  clicked = output\u003Cvoid>();\n  \n  onClick(event: Event) {\n    if (!this.disabled()) {\n      this.clicked.emit();\n    }\n  }\n}\n```\n\n## Content Projection\n\n```typescript\n@Component({\n  selector: 'app-card',\n  template: `\n    \u003Cheader>\n      \u003Cng-content select=\"[card-header]\" \u002F>\n    \u003C\u002Fheader>\n    \u003Cmain>\n      \u003Cng-content \u002F>\n    \u003C\u002Fmain>\n    \u003Cfooter>\n      \u003Cng-content select=\"[card-footer]\" \u002F>\n    \u003C\u002Ffooter>\n  `,\n})\nexport class Card {}\n\n\u002F\u002F Usage:\n\u002F\u002F \u003Capp-card>\n\u002F\u002F   \u003Ch2 card-header>Title\u003C\u002Fh2>\n\u002F\u002F   \u003Cp>Main content\u003C\u002Fp>\n\u002F\u002F   \u003Cbutton card-footer>Action\u003C\u002Fbutton>\n\u002F\u002F \u003C\u002Fapp-card>\n```\n\n## Lifecycle Hooks\n\n```typescript\nimport { OnDestroy, OnInit, afterNextRender, afterRender } from '@angular\u002Fcore';\n\nexport class My implements OnInit, OnDestroy {\n  constructor() {\n    \u002F\u002F For DOM manipulation after render (SSR-safe)\n    afterNextRender(() => {\n      \u002F\u002F Runs once after first render\n    });\n\n    afterRender(() => {\n      \u002F\u002F Runs after every render\n    });\n  }\n\n  ngOnInit() { \u002F* Component initialized *\u002F }\n  ngOnDestroy() { \u002F* Cleanup *\u002F }\n}\n```\n\n## Accessibility Requirements\n\nComponents MUST:\n- Pass AXE accessibility checks\n- Meet WCAG AA standards\n- Include proper ARIA attributes for interactive elements\n- Support keyboard navigation\n- Maintain visible focus indicators\n\n```typescript\n@Component({\n  selector: 'app-toggle',\n  host: {\n    'role': 'switch',\n    '[attr.aria-checked]': 'checked()',\n    '[attr.aria-label]': 'label()',\n    'tabindex': '0',\n    '(click)': 'toggle()',\n    '(keydown.enter)': 'toggle()',\n    '(keydown.space)': 'toggle(); $event.preventDefault()',\n  },\n  template: `\u003Cspan class=\"toggle-track\">\u003Cspan class=\"toggle-thumb\">\u003C\u002Fspan>\u003C\u002Fspan>`,\n})\nexport class Toggle {\n  label = input.required\u003Cstring>();\n  checked = input(false, { transform: booleanAttribute });\n  checkedChange = output\u003Cboolean>();\n  \n  toggle() {\n    this.checkedChange.emit(!this.checked());\n  }\n}\n```\n\n## Template Syntax\n\nUse native control flow—do NOT use `*ngIf`, `*ngFor`, `*ngSwitch`.\n\n```html\n\u003C!-- Conditionals -->\n@if (isLoading()) {\n  \u003Capp-spinner \u002F>\n} @else if (error()) {\n  \u003Capp-error [message]=\"error()\" \u002F>\n} @else {\n  \u003Capp-content [data]=\"data()\" \u002F>\n}\n\n\u003C!-- Loops -->\n@for (item of items(); track item.id) {\n  \u003Capp-item [item]=\"item\" \u002F>\n} @empty {\n  \u003Cp>No items found\u003C\u002Fp>\n}\n\n\u003C!-- Switch -->\n@switch (status()) {\n  @case ('pending') { \u003Cspan>Pending\u003C\u002Fspan> }\n  @case ('active') { \u003Cspan>Active\u003C\u002Fspan> }\n  @default { \u003Cspan>Unknown\u003C\u002Fspan> }\n}\n```\n\n## Class and Style Bindings\n\nDo NOT use `ngClass` or `ngStyle`. Use direct bindings:\n\n```html\n\u003C!-- Class bindings -->\n\u003Cdiv [class.active]=\"isActive()\">Single class\u003C\u002Fdiv>\n\u003Cdiv [class]=\"classString()\">Class string\u003C\u002Fdiv>\n\n\u003C!-- Style bindings -->\n\u003Cdiv [style.color]=\"textColor()\">Styled text\u003C\u002Fdiv>\n\u003Cdiv [style.width.px]=\"width()\">With unit\u003C\u002Fdiv>\n```\n\n## Images\n\nUse `NgOptimizedImage` for static images:\n\n```typescript\nimport { NgOptimizedImage } from '@angular\u002Fcommon';\n\n@Component({\n  imports: [NgOptimizedImage],\n  template: `\n    \u003Cimg ngSrc=\"\u002Fassets\u002Fhero.jpg\" width=\"800\" height=\"600\" priority \u002F>\n    \u003Cimg [ngSrc]=\"imageUrl()\" width=\"200\" height=\"200\" \u002F>\n  `,\n})\nexport class Hero {\n  imageUrl = input.required\u003Cstring>();\n}\n```\n\nFor detailed patterns, see [references\u002Fcomponent-patterns.md](references\u002Fcomponent-patterns.md).\n\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fanalogjs\u002Fangular-skills\u002Fangular-component",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill angular-component",{"tool":59,"command":60},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill angular-component",{"tool":62,"command":63},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill angular-component","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fanalogjs\u002Fangular-skills\u002Fangular-component\u002FSKILL.md",true,[],[68,82,92,101,107,114],{"skillNo":69,"name":70,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":78,"publishedAt":39},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[73],{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[79,80,81],"model","model hierarchy","model hierarchy skill",{"skillNo":83,"name":84,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":88,"publishedAt":39},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[87],{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},[89,90,91],"MCP","zoom","zoom mcp",{"skillNo":93,"name":94,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":39},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[98,99,100,90],"sdk","zoom apps sdk","apps",{"skillNo":102,"name":103,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":106,"publishedAt":39},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[103],{"skillNo":108,"name":109,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":113,"publishedAt":39},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[112],{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},[109],{"skillNo":115,"name":116,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":119,"publishedAt":39},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[116]]