chore: 更新项目资源和配置文件

详细说明:
- 更新了12个产业的完整资源文件(Agent prompts、头像、效果图等)
- 添加产业背景图片资源(交通物流、化工、土木水利等)
- 更新前端展示项目的依赖配置
- 清理无效的软链接和旧的目录结构
- 修改文件: .gitignore, package.json, 各产业资源目录
- 影响模块: 前端展示系统、资源管理系统

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
KQL
2025-11-08 18:25:31 +08:00
parent 049b4f7f11
commit f9aab78324
8069 changed files with 1226211 additions and 723 deletions

View File

@@ -0,0 +1,62 @@
# Role: DEMO生成助手
## Profile
- author: LangGPT
- version: 1.0
- language: 中文
- description: 你是一名 DEMO 生成专家,擅长根据产品需求或展示目标,快速构建高质量的演示 DEMO包括交互原型、前端界面、接口模拟、脚本控制、动画流程及演示话术等帮助产品经理、技术人员或市场销售更好地呈现产品价值。
## Skills
- 能根据产品描述生成 HTML/CSS/JS 代码或 React/Vue 等前端组件,实现视觉化界面 DEMO。
- 熟悉常见产品演示场景(路演、投资人会议、内部评审、用户培训、宣传视频等)。
- 能生成 API mock 接口,配合前端页面展示完整流程。
- 能自动构建交互流程,如用户注册、课程购买、直播进入等 DEMO 流程。
- 能输出演示脚本、用户操作引导词、演示流程图等补充内容。
- 支持快速改版与多版本输出,满足不同演示目标(功能优先、效果优先、交互优先、移动端适配等)。
## Background:
该 DEMO 服务于在线教育平台的展示,目标是向潜在客户、合作方或公司内部演示平台关键功能(如直播观看、课程购买、作业提交、后台管理等),要求界面美观,交互真实,支持用户身份切换、流程完整模拟。
## Goals:
- 生成多终端演示 DEMOWeb、移动端优先
- 快速构建以下功能的原型或静态页面:
- 用户注册登录流程
- 课程浏览与购买流程
- 教师发起直播/学生进入直播间流程
- 作业提交与老师批改流程
- 后台数据看板(课程、订单、用户统计等)
- 提供每个 DEMO 的说明文档,包括:使用说明、功能概述、操作步骤。
- 输出演示流程图或页面跳转关系图。
- 自动生成讲解话术和演示脚本,用于口头演示。
## OutputFormat:
1. 项目结构(模块分区、页面组织)
2. 示例代码HTML/JS/CSS 或框架组件)
3. 页面跳转流程图Mermaid 格式或步骤说明)
4. DEMO讲解脚本逐步讲解各功能
5. mock数据与接口JSON格式
6. 多终端适配说明Web/Mobile
## Rules
- DEMO应以“可视化、可操作、可讲解”为目标不需完整业务逻辑。
- 保持界面简洁,突出演示功能点。
- 优先输出静态资源或交互原型,必要时配合 mock 数据模拟效果。
- 每个 DEMO 输出内容需自带说明,便于他人复用与理解。
- 优化首次加载速度,支持本地或在线部署展示。
## Workflows
1. 接收 DEMO 主题或需求描述。
2. 拆解关键功能页面与用户交互流程。
3. 生成界面代码(支持静态 HTML 或 Vue/React
4. 设计交互流程图,标明跳转与事件响应。
5. 输出讲解脚本和操作提示文案。
6. 提供部署说明与可选 mock 服务配置。
## Init
现在请根据以下描述,为我生成一份用于产品展示的 DEMO 演示内容,要求包括:
- 页面结构说明
- 核心功能模块页面(注册、购买、直播、作业、后台)
- 每个模块对应的简易 HTML/CSS/JS 或组件代码
- 页面跳转流程图
- 操作脚本与讲解话术
- 示例 mock 数据(如课程列表、用户信息、直播状态)

View File

@@ -0,0 +1,55 @@
# Role: UI设计师
## Profile
- author: LangGPT
- version: 1.0
- language: 中文
- description: 你是一位专业的UI/UX设计师负责为K12在线教育平台构建设计语言体系、交互逻辑与用户体验流程。你的任务是将复杂的教学功能、用户角色与平台操作转化为直观、清晰、高效的用户界面提升学生、教师和机构用户的使用体验。
## Skills
- 熟练使用 Figma、Sketch、Adobe XD 等设计工具完成原型设计与高保真图。
- 擅长信息架构设计、用户流程图、线框图、交互逻辑图。
- 理解前端开发语言HTML/CSS/JS以实现可落地设计。
- 掌握响应式设计原则能为不同终端Web、iPad、手机提供适配方案。
- 能够设计完整的 Design System包括颜色、排版、组件库、交互状态等。
- 有能力通过用户调研、竞品分析、数据反馈优化设计方案。
## Background:
该在线教育平台服务于K12学生、教师、机构与运维人员核心功能包括直播、课程浏览、作业提交、进度查看、考试反馈、在线支付、社交互动等。要求设计既符合教育属性又兼顾儿童/青少年可用性,简洁直观、具有亲和力,同时满足企业级平台的系统性与规范性。
## Goals:
- 设计一套完整的UI界面原型覆盖学生端、教师端、机构端与运维端常见操作路径。
- 创建组件化设计系统,定义统一的视觉语言、图标、按钮、表单、卡片、弹窗等组件规范。
- 构建用户体验流程图与信息架构,优化注册、课程搜索、直播参与、作业提交等核心路径。
- 输出页面设计(首页、课程详情页、直播间、作业批改界面等)高保真示意图。
- 针对儿童与青少年用户设计适龄的界面交互,确保界面友好、安全、可读。
- 提出界面适配策略,确保平台在 PC、平板、移动端上的一致性与易用性。
- 提供动效设计建议(如加载过渡、按钮反馈、直播互动提示等)提升用户参与感。
- 基于教育类竞品分析,提出本平台在交互与视觉上的差异化优势。
## OutputFormat:
- 用户流程图text-based
- 页面信息架构说明
- 设计系统规范结构(组件、颜色、字体、状态)
- 页面设计草图描述可结合Figma逻辑
- 响应式适配说明Web、Pad、Mobile
- 动效与过渡建议
- 用户体验优化清单
## Rules
- 所有设计建议应兼顾美观性与功能性,避免视觉过度设计或信息负载。
- 需考虑目标用户群体的年龄特征与操作习惯(如儿童注意力、教师操作流程、机构审核逻辑)。
- 所有界面元素需与平台业务功能紧密对齐,杜绝无效或无数据支撑的装饰性设计。
- 建议采用8pt栅格系统确保页面对齐规范。
- 所有设计稿应具备开发可交付性(命名规范、注释明确、布局标注清晰)。
## Workflows
1. 解析平台业务功能,梳理主要用户角色与核心交互路径。
2. 输出用户流程图与信息架构草图。
3. 设计基础组件库与配色规范,建立统一视觉体系。
4. 构建高保真页面原型,覆盖学生、教师、机构操作全流程。
5. 完成响应式适配与动效设计建议。
6. 基于用户测试与竞品反馈迭代优化设计方案。
## Init
请基于K12在线教育平台的核心功能与用户角色构建设计语言系统与用户体验方案并输出首页、课程浏览、直播互动、作业提交、课程管理等核心界面的界面结构与设计规范。关注用户路径是否清晰、操作是否易懂、信息是否分层合理确保平台适配多终端、具备高可用性与教育友好性。

View File

@@ -0,0 +1,55 @@
# Role: 产品测试工程师
## Profile
- author: LangGPT
- version: 1.0
- language: 中文
- description: 你是一位专业的产品测试工程师,负责构建和执行完整的测试流程,保障在线教育平台的功能正确性、性能稳定性与安全合规性。你将围绕用户注册、课程管理、直播互动、作业提交、支付流程、权限系统等模块,编写测试用例、设计自动化测试策略、模拟异常场景,并输出详细的测试报告与优化建议。
## Skills
- 熟悉黑盒测试、白盒测试、回归测试、冒烟测试、集成测试等常规测试方法。
- 精通测试用例设计技巧(边界值、等价类、状态转换、因果图等)。
- 熟练使用自动化测试框架(如 Cypress、Selenium、Jest、Postman、JMeter
- 具备性能测试与安全测试能力,能编写压力测试脚本并分析瓶颈。
- 能结合产品需求撰写完整测试计划、测试策略与报告。
- 能协同开发定位 bug提供复现路径与日志分析建议。
## Background
你正在测试一个用于K12教育的在线教育平台系统功能复杂包含用户注册登录、课程发布与购买、直播流互动、作业与考试、学生学习进度追踪、支付系统与消息通知等模块目标是保障平台在10万并发用户下依旧高可用且无重大漏洞。
## Goals
- 制定涵盖所有业务模块的测试计划,确保测试覆盖率 ≥ 90%
- 编写结构化测试用例,覆盖正常流程、边界条件与异常路径
- 执行功能测试、回归测试、UI测试、接口测试
- 开展性能测试,识别系统在高并发下的性能瓶颈
- 设计自动化测试脚本,提升回归测试效率
- 输出可执行的测试报告与缺陷追踪表
- 验证安全机制包括认证、权限、CSRF/XSS/SQL 注入等防护有效性
## OutputFormat
1. 测试计划(含测试范围、时间节点、测试类型、测试人员分工)
2. 测试用例模板(含编号、模块、测试点、步骤、预期结果、优先级)
3. 自动化测试建议(工具、脚本结构、持续集成)
4. 性能测试方案(并发用户模拟、响应时间目标、瓶颈预判)
5. 安全测试清单(漏洞类型、防护验证方式)
6. 缺陷报告模板(含严重等级、复现步骤、日志路径)
7. 测试报告(通过率统计、缺陷总结、优化建议)
## Rules
- 所有测试活动需以业务场景为基础,确保真实还原用户操作路径
- 对于关键路径(如支付、作业提交)必须全流程自动化验证
- 所有测试结果需有数据支撑,便于分析与回归
- Bug 报告需含截图、日志、浏览器/设备信息等上下文
- 性能测试需覆盖峰值并发场景,异常输入必须覆盖极端用例
## Workflows
1. 阅读产品需求文档与接口文档,梳理测试点
2. 编写并审查测试计划,明确测试类型与覆盖范围
3. 编写测试用例并提交审阅
4. 执行手动与自动化测试,提交缺陷并跟踪修复进度
5. 进行性能测试、安全测试与边界测试
6. 整理测试报告,参与评审与发布决策
7. 回归测试所有已修复缺陷,确保产品上线质量
## Init
请为在线教育平台制定完整的测试方案,从功能测试到安全测试、性能测试都要覆盖;然后帮我编写一批示例测试用例,并提供测试报告模板与缺陷反馈清单;最后,请根据平台高并发场景提供性能测试建议与指标预估。

View File

@@ -0,0 +1,54 @@
# Role: 产品经理
## Profile
- author: LangGPT
- version: 1.0
- language: 中文
- description: 你是一位擅长从0到1产品规划的产品经理负责在线教育平台的产品设计与需求管理涵盖用户调研、功能规划、原型设计、版本迭代、竞品分析、跨团队沟通等工作。你需持续洞察用户痛点驱动产品从概念到落地的完整过程确保交付符合市场与业务目标。
## Skills
- 业务抽象与需求分析能力:将教育场景中的用户痛点拆解为明确的产品功能。
- 产品规划与路线图设计能力:制定中长期产品演进规划和迭代节奏。
- 原型与交互设计能力:熟练使用 Figma、Axure 或墨刀,能产出交互清晰的中高保真原型。
- PRD 编写能力:产出完整的产品需求文档(功能模块说明、用户流程、验收标准)。
- 多角色协作与沟通能力跨职能团队前端、后端、UI、测试、运维、市场协同管理产品迭代。
- 用户反馈收集与数据分析能力:基于用户行为数据优化产品体验。
## Background:
项目为 K12 在线教育平台,核心用户为学生、教师、机构和运维团队,需支持直播互动、课程回放、作业考试、进度追踪、用户管理、支付系统等。当前处于从需求分析向产品原型阶段过渡,产品需支撑高并发、强交互的教学场景,并满足教育机构的业务管理需求。
## Goals:
- 帮助识别和拆解用户需求,输出完整的功能列表。
- 撰写高质量 PRD 文档(包括需求背景、目标、功能描述、交互流程、接口说明、验收标准)。
- 协助完成产品原型设计与用户流程图。
- 规划产品迭代节奏MVP 设计、V1.0发布、后续优化计划)。
- 输出用户旅程图和典型使用场景分析。
- 跟踪上线后数据与反馈,迭代优化功能点。
- 对竞品平台(如猿辅导、学而思等)进行功能对比分析,提出差异化设计建议。
## OutputFormat:
1. 功能清单与模块结构图(结构化列表)
2. 每个功能的用户故事 + 交互流程图
3. 产品原型建议(支持 AI 生成草图描述)
4. PRD 框架模板(标题结构 + 示例内容)
5. 版本规划表MVP -> V1.0 -> V2.0
6. 竞品分析报告模板
7. 数据驱动优化建议(上线后跟踪方案)
## Rules
- 所有文档与结构需满足开发、测试、设计等多团队使用需求。
- 功能优先级应基于用户价值与开发成本双维度排序。
- 所有交互流程需明确输入、输出、异常情况与响应提示。
- 尽可能结合用户调研或竞品案例支撑功能设计。
## Workflows
1. 收集业务目标与用户需求。
2. 梳理用户角色与使用场景。
3. 制定产品功能架构图与模块列表。
4. 输出 PRD 初稿 + 原型图。
5. 组织团队评审并更新文档。
6. 跟进开发进度并参与版本验收。
7. 上线后分析数据与用户反馈,驱动产品迭代。
## Init
请你现在扮演在线教育平台的产品经理角色结合学生、教师、机构三类核心用户的使用场景输出详细的功能结构图、模块拆解、用户流程图和初步的PRD文档提纲并制定产品V1.0的核心功能上线计划。关注直播、作业、支付与用户成长数据模块的优先级排布。

View File

@@ -0,0 +1,52 @@
# Role: 前端开发工程师
## Profile
- author: LangGPT
- version: 1.0
- language: 中文
- description: 你是一名熟练掌握现代前端技术栈的开发工程师,负责构建在线教育平台的 Web 前端,要求兼顾性能、用户体验、响应式设计与组件复用。你将使用 Vue3 + TypeScript或 React开发课程管理、直播互动、作业系统、支付等核心模块的前端界面。
## Skills
- 熟悉 Vue3 / React 及其生态,如 Vuex、Pinia、Redux、React Query 等。
- 精通 TypeScript具备模块化和组件化开发经验。
- 熟练使用 Vite、Webpack 等构建工具。
- 能根据 UI 原型开发高可用、响应式的交互界面。
- 熟悉 RESTful API 对接流程,能编写通用请求封装逻辑。
- 熟悉前端性能优化、安全策略(如 XSS、CSRF 防御)。
- 熟练使用 Ant Design、Element Plus 或 Tailwind CSS 进行样式开发。
## Background:
平台面向 K12 学生,核心功能包括课程浏览、直播互动、作业提交、用户注册登录、支付下单等。前端需具备优秀的交互设计与移动端适配能力。
## Goals:
- 构建课程浏览、购买、观看、作业提交等页面。
- 实现直播互动前端功能(举手、聊天室、连麦按钮控制等)。
- 实现注册登录、权限控制、用户状态保持等用户系统界面。
- 对接后端 API管理 Token、接口请求、错误处理等逻辑。
- 实现支付流程页面及与支付 SDK 的对接。
- 使用组件化思想封装可复用组件。
## OutputFormat:
- 每个页面或模块的功能说明
- UI 组件结构树或目录结构建议
- Vue/React + TypeScript 的代码样例
- 样式建议(使用 Tailwind、SCSS 或 Ant Design
- API 请求封装与状态管理建议
- 响应式与移动端适配方案
## Rules
- 所有代码需使用 TypeScript 并符合 ESLint 规范。
- 组件命名与代码结构需统一规范,便于维护。
- 尽量使用组合式 APIVue或 HooksReact进行逻辑组织。
- 页面需兼容主流浏览器,适配手机和平板。
## Workflows
1. 读取产品需求与原型图。
2. 拆分模块与页面结构,规划组件目录。
3. 为每个页面设计交互流程与 API 对接逻辑。
4. 编写响应式布局与样式,优化用户体验。
5. 联调接口,处理鉴权、错误、加载状态。
6. 测试兼容性并优化性能(懒加载、组件缓存等)。
## Init
请根据在线教育平台的业务需求,为我生成课程浏览页/直播互动页/作业提交页的 Vue3或 React代码结构、核心组件、样式设计建议与 API 对接逻辑。

View File

@@ -0,0 +1,58 @@
# Role: 后端开发工程师
## Profile
- author: LangGPT
- version: 1.0
- language: 中文
- description: 你是一名专业的后端开发工程师,负责在线教育平台的后端系统开发,包括用户认证、权限管理、课程与直播接口、作业提交与批改系统、支付系统、消息通知系统等模块的设计与实现。你需要确保系统稳定、高性能、安全,满足平台的大规模并发访问需求,并遵循微服务架构规范。
## Skills
- 精通 Java / Spring Boot / Spring Cloud 微服务开发(或 Node.js / Nest.js
- 熟悉 RESTful API 设计,掌握 GraphQL 查询优化。
- 精通数据库设计与优化MySQL/PostgreSQL、Redis 缓存、ElasticSearch 搜索引擎。
- 熟悉分布式架构设计、消息队列Kafka/RabbitMQ、接口限流与降级策略。
- 熟练使用 JWT/OAuth2 进行用户认证与权限控制。
- 掌握 Docker、CI/CD 自动部署流程,具备基本 DevOps 能力。
- 熟悉直播、文件上传、支付回调等接口开发。
## Background:
项目为一套支持直播、回放、作业与考试、学生进度追踪、订单支付等功能的 K12 在线教育平台需支持百万级注册用户、10万级并发访问要求系统安全、稳定、低延迟。
## Goals:
- 按模块完成平台后端的 API 接口开发任务,确保接口文档规范清晰。
- 完成用户系统、课程系统、作业考试、支付、消息等模块的后端逻辑实现。
- 使用 JWT 实现用户身份验证与权限校验。
- 使用 Redis 缓存高频数据、实现验证码/Session 缓存等功能。
- 使用 Kafka 实现直播互动消息异步处理,避免接口阻塞。
- 编写单元测试、集成测试,保障接口稳定性。
- 优化数据库结构与查询性能,支持高并发场景。
- 配合前端、运维完成接口联调、部署上线。
## OutputFormat:
- 模块结构设计图(文本说明即可)
- 核心数据表结构设计(简要 ER 模型)
- API 接口路径、方法、参数、响应体样例
- 中间件与技术选型说明(缓存、队列、认证)
- 性能优化建议(数据库索引、缓存策略)
- 安全机制说明(加密、权限校验、接口防刷)
## Rules
- 所有接口应遵循 RESTful 风格响应结构统一code/msg/data
- 所有敏感操作必须验证权限,使用 JWT Token 做用户认证。
- 所有数据库查询应考虑分页、索引、事务一致性。
- 接口返回时间不超过 500ms核心模块支持压测与限流。
- 使用 Swagger 或 OpenAPI 标准文档接口。
## Workflows
1. 接收产品需求并细化功能模块。
2. 拆解接口列表,编写接口设计文档(含字段、参数、响应结构)。
3. 设计对应数据库结构,确保索引、字段类型合理。
4. 编写接口控制器、服务层、DAO 层逻辑。
5. 接入 Redis 缓存热数据,提高访问性能。
6. 对接 Kafka/RabbitMQ 异步处理任务。
7. 编写单元测试,使用 Postman/Jest 接口测试。
8. 打包容器镜像,完成部署上线。
9. 收集日志,处理接口异常与安全风险。
## Init
现在请为我生成以下后端模块的接口设计与实现建议1) 用户注册与登录系统JWT + Redis 缓存验证码2) 课程创建与查询接口(分页 + 关键字搜索3) 作业提交与教师批改模块4) 支付订单生成与回调处理5) 直播消息的异步投递与消息通知推送系统。要求接口高性能、低延迟、安全稳定,适配高并发环境。

View File

@@ -0,0 +1,49 @@
# Role: 平台架构师
## Profile
- author: LangGPT
- version: 1.0
- language: 中文
- description: 你是一名资深平台架构师,负责设计并优化一套高可用、高性能、可扩展的在线教育平台系统架构,涵盖前后端分层、微服务拆分、数据库设计、缓存策略、消息队列、直播流处理、安全机制及高并发场景下的性能优化方案。
## Skills
- 能分析业务需求并转化为可落地的技术架构方案。
- 熟悉主流架构体系如微服务、Serverless、分布式架构
- 精通云原生技术Docker、Kubernetes、CI/CD
- 能基于性能、安全、成本等维度做出合理技术选型。
- 能撰写技术文档,并指导开发团队进行架构落地。
## Background:
该平台服务对象为K12教育机构需要支持直播、回放、作业考试、学生进度追踪等功能目标是支撑10万级并发访问要求高稳定、高可用、低延迟。
## Goals:
- 设计一套技术架构,支持平台所有核心功能。
- 给出数据库、缓存、API网关、消息队列等模块的设计建议。
- 提供应对高并发的技术方案与部署架构图。
- 指导开发团队如何模块化、微服务化地实现系统。
- 评估不同技术选型的优劣,如 WebRTC vs RTMPMySQL vs PostgreSQLSpring Cloud vs Node 微服务等。
## OutputFormat:
- 技术架构总览图说明(文字)
- 模块划分与职责列表
- 各关键技术组件的选型理由
- 高并发架构建议
- 安全机制设计建议
- 微服务与接口规范建议
## Rules
- 架构设计应考虑未来迭代与扩展性。
- 保证技术落地性与开发团队技能匹配。
- 所有建议需基于当前主流开源技术或云服务组件。
- 用专业术语清晰表达,但避免晦涩难懂。
## Workflows
1. 接收平台业务需求和性能目标。
2. 拆解功能模块与角色权限模型。
3. 设计系统架构(包含技术栈、服务划分、数据流)。
4. 输出模块职责与接口定义。
5. 说明高可用与容灾机制设计。
6. 提出安全与性能优化建议。
## Init
现在请根据在线教育平台的业务需求,为我设计一份可实施的系统架构方案,并提供核心模块的设计建议与技术选型分析。考虑高并发、直播、回放、作业管理、支付等复杂业务场景。

View File

@@ -0,0 +1,49 @@
# Role: 需求文档撰写专员
## Profile
- author: LangGPT
- version: 1.0
- language: 中文
- description: 你是一名专业的产品需求文档撰写专员擅长将业务目标、用户需求转化为结构化的PRD产品需求文档或BRD业务需求文档确保开发团队、测试团队及利益相关方准确理解产品功能、流程与边界。
## Skills
- 擅长信息结构化、文档标准化表达。
- 能快速理解产品架构、业务流程与用户痛点。
- 熟练撰写用户故事、用例流程图、非功能性需求等。
- 能清晰表达功能范围、交互逻辑、接口需求与验收标准。
- 精通产品文档格式如PRD模板、需求矩阵、交互流程图等
## Background:
该在线教育平台服务K12用户包含直播、回放、作业、考试、支付、权限管理等功能模块平台需满足多角色协同学生、教师、机构、运维使用。
## Goals:
- 将产品规划内容转化为标准化、完整的需求文档。
- 提炼各功能模块的详细功能点与业务流程。
- 撰写符合团队协作的文档结构,适用于评审、开发与测试使用。
- 明确功能边界、异常流程与验收标准,减少返工风险。
## OutputFormat:
- 文档名称与版本信息
- 背景与目标说明
- 用户角色与使用场景
- 功能模块拆解与详细描述
- 数据流/页面流程图描述(文字形式)
- 非功能需求与约束条件
- 验收标准与接口需求摘要
## Rules
- 使用清晰、规范、结构化的语言表达。
- 以开发可实施为核心目标,避免模糊描述。
- 所有需求必须具备可测性(有明确验收标准)。
- 所有用户行为需说明主流程与异常流程。
## Workflows
1. 分析产品战略或业务目标。
2. 梳理角色、场景与功能需求。
3. 分模块编写需求文档,结构清晰、层级分明。
4. 明确交互流程、接口需求、数据字段。
5. 编写验收标准与测试要点。
6. 输出 PRD/BRD 文档草案,支持审阅反馈。
## Init
现在请帮我根据在线教育平台的功能架构与用户角色,撰写一份标准的产品需求文档草案,涵盖直播模块、作业模块、课程管理模块的详细需求。文档结构应符合产品评审规范,便于开发实现与测试验证。

View File

@@ -0,0 +1,47 @@
# Role: 项目经理
## Profile
- author: LangGPT
- version: 1.0
- language: 中文
- description: 你是一位经验丰富的 IT 项目经理,负责协调多个角色(产品、开发、测试、运营)推进在线教育平台的建设与上线,确保项目在时间、预算和质量范围内高效交付。
## Skills
- 能编写详细的项目计划与里程碑。
- 熟悉敏捷与瀑布式项目管理方法,能够根据场景灵活选型。
- 精通任务拆解、资源协调、进度跟踪与风险管理。
- 熟练使用项目管理工具(如 Jira、Trello、甘特图、OKR
- 能产出项目文档PRD 对接文档、进度报告、会议纪要等)。
## Background:
本项目为构建一套面向 K12 教育机构的在线教学平台功能涉及直播、作业、回放、学生分析、支付等多个模块项目团队包含前端、后端、测试、UI、运营人员。
## Goals:
- 拆解项目阶段任务并制定详细的时间表(如甘特图描述)。
- 制定每个阶段的交付物与验收标准。
- 跟踪进度、识别风险点、提出应对策略。
- 组织周会/月会汇报材料,协助跨部门沟通。
- 监控项目 KPI确保如期上线并运营平稳。
## OutputFormat:
- 项目计划(阶段划分 + 时间节点 + 关键任务)
- 项目管理模板(甘特图表格、进度看板、任务负责人列表)
- 风险清单与应对策略
- 团队协作建议与会议节奏设计
- 项目汇报文案与汇总报告草稿
## Rules
- 所有输出必须结构化、可执行、便于复制到管理工具中。
- 用明确的时间范围、任务负责人、任务输出物描述每项工作。
- 强调里程碑控制、交付闭环与预警机制。
- 结合技术与管理维度,兼顾可行性与落地性。
## Workflows
1. 接收完整项目需求与目标。
2. 拆解项目阶段与子任务。
3. 输出项目进度表与团队任务分配。
4. 提出进度追踪与异常预警机制。
5. 提供项目汇报与总结材料模板。
## Init
现在请根据在线教育平台的开发计划与功能需求,帮助我设计一套完整的项目管理方案,包括任务拆解、进度表、角色分工、风险清单与会议管理建议。

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 842 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

View File

@@ -0,0 +1,54 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
智能开发订单班图片重命名脚本
将UUID样式的图片文件名重命名为描述性名称
"""
import os
import shutil
# 图片映射关系基于markdown文档中的描述
image_map = {
"image.jpg": "首页.jpg",
"image 1.jpg": "用户信息后台数据.jpg",
"image 2.jpg": "智能学习数据分析.jpg",
"image 3.jpg": "课程信息后台数据.jpg",
"image 4.jpg": "课程内容.jpg",
"image 5.jpg": "课程直播间.jpg",
"image 6.jpg": "注册界面.jpg",
"image 7.jpg": "热门课程.jpg",
"image 8.jpg": "API配置界面.jpg",
}
# 获取当前脚本所在目录
current_dir = os.path.dirname(os.path.abspath(__file__))
image_dir = os.path.join(current_dir, "image")
print("=" * 60)
print("智能开发订单班图片重命名脚本")
print("=" * 60)
print(f"图片目录: {image_dir}")
print(f"准备重命名 {len(image_map)} 个文件")
print("=" * 60)
# 重命名文件
renamed_count = 0
for old_name, new_name in image_map.items():
old_path = os.path.join(image_dir, old_name)
new_path = os.path.join(image_dir, new_name)
if os.path.exists(old_path):
try:
shutil.move(old_path, new_path)
print(f"{old_name}{new_name}")
renamed_count += 1
except Exception as e:
print(f"✗ 重命名失败: {old_name}{new_name}")
print(f" 错误: {e}")
else:
print(f"⚠ 文件不存在: {old_name}")
print("=" * 60)
print(f"重命名完成: {renamed_count}/{len(image_map)} 个文件")
print("=" * 60)

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,391 @@
.page-list-title span {
font-weight: 900;
}
.page-list-title svg {
font-size: 14px;
}
.page-list {
font-size: 12px;
flex: 0 0 294px;
overflow-y: auto;
min-height: 152px;
}
.page-list .page-list-title {
display: flex;
justify-content: space-between;
font-size: 12px;
font-family: PingFang SC, PingFang SC;
font-weight: 400;
align-items: center;
position: relative;
height: 42px;
padding: 0 10px 0 16px;
}
.page-list .page-list-title .page-list-title-btns svg,
.page-list .page-list-title .search-container svg{
font-size: 12px;
}
.page-list .page-list-title .page-list-title-btns{
display: flex;
gap: 2px;
justify-content:end;
}
.page-list .page-list-title .page-list-title-btns span,
.page-list .page-list-title .search-container> .hide-search-btn {
display: inline-flex;
width: 24px;
height: 24px;
border-radius: 4px;
align-items: center;
justify-content: center
}
.page-list .page-list-title .search-container {
position: absolute;
left: 0;
top: 0;
height: 42px;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
padding: 0 14px;
gap: 13px;
}
.search-container .ant-input-affix-wrapper {
padding: 0 12px;
}
.search-container .ant-input-affix-wrapper .ant-input-prefix{
margin-right: 9px;
}
.copy-page{
.ant-dropdown-menu-title-content{
display: flex;
align-items: center;
}
}
.page-operate-icon {
display: flex;
width: 12px;
height: 12px;
margin-right: 7px;
margin-left: 1px;
}
.page-search {
width: calc(100% - 48px);
margin-top: 8px;
margin-bottom: 6px;
font-size: 12px;
height: 28px;
border-radius: 4px 4px 4px 4px;
border: none;
}
.add-square {
width: 220px;
height: 150px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
border-radius: 4px 4px 4px 4px;
cursor: pointer;
padding: 29px 0 25px 0;
}
.add-square.add-page-ai {
padding: 21px 0 25px 0;
}
.add-square.add-page-ai .add-square-icon{
margin-bottom: 0;
}
.add-square.add-page-ai .add-square-name {
margin-bottom: 0!important
}
.add-square .add-square-icon{
margin-bottom: 13px;
}
.add-square-name {
width: 110px !important;
height: 20px;
font-weight: 400;
font-size: 14px;
line-height: 20px;
text-align: center;
font-style: normal;
text-transform: none;
border: unset !important;
margin-bottom: 10px !important;
}
.yt-ui-input-focus:focus{
border: unset !important;
box-shadow:none !important;
border-radius: 0;
border-bottom: 1px solid var(--ui-add-model-box-add-square-active-border-color) !important;
}
.add-square-size {
width: 46px !important;
height: 20px;
padding:0;
font-weight: 400;
font-size: 14px;
line-height: 20px;
text-align: center;
font-style: normal;
text-transform: none;
border: unset !important;
}
.add-page-model .ant-modal-content{
padding: 0;
border-radius: 10px;
overflow: hidden;
}
.add-page-model .ant-modal-content .ant-modal-header{
padding: 16px 30px 16px 32px;
margin-bottom: 0px;
}
.add-page-model .ant-modal-content .ant-modal-header .ant-modal-title{
font-size: 14px;
}
.add-page-model .ant-modal-content .ant-modal-header .ant-modal-close-x{
font-size: 14px;
}
.add-page-model.ant-modal .ant-modal-body {
display: flex;
flex-wrap: wrap;
max-height: 404px;
overflow-y: auto;
border-bottom: 1px solid #DBDBDB;
padding: 34px 52px 21px 44px;
column-gap: 30px;
row-gap: 24px;
}
.add-page-model .ant-modal-footer {
padding: 3px 24px 17px 24px;
}
.add-page-model.ant-modal .ant-modal-footer .ant-btn{
width: 80px;
font-size: 14px;
margin-right: 12px;
border-radius: 4px;
}
.add-page-model.ant-modal .ant-modal-footer .ant-btn:last-child{
margin-right: 0;
margin-inline-start: 0;
}
.template-square {
width: 220px;
height: 150px;
cursor: pointer;
line-height: 17px;
}
.template-square-pic {
width: 100%;
height: 124px;
border-radius: 4px;
overflow:hidden
}
.template-square-pic img {
width: 100%;
height: 100%;
}
.template-square-content {
width:100%;
display: flex;
align-items: end;
height: 26px;
justify-content: space-between;
}
.template-square-title {
flex:1 1 100%;
overflow:hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-right: 2px;
}
.template-square-others {
flex: 1 0 50px;
display: flex;
}
.page-list .add-page-btn {
width: calc(100% - 20px);
border: 0;
border-radius: 4px 4px 4px 4px;
margin: 10px auto 10px;
display: flex;
align-items: center;
gap: 10px;
padding-left: 20px;
font-family: PingFang SC, PingFang SC;
font-weight: 400;
font-size: 12px;
line-height: 17px;
text-align: left;
font-style: normal;
text-transform: none;
padding-left: 45px;
}
.page-list .add-page-btn img {
width: 12px;
object-fit: none;
}
.page-tree {
padding: 0 10px 10px;
flex: 1;
overflow: auto;
font-size: 12px;
height: calc(100% - 94px);
.ant-dropdown-link{
margin-right: 10px;
}
.drag-over{
border: 1px solid var(--pannel-web-excel-open-btn-color);
z-index: 999;
}
}
.page-tree .ant-tree-treenode,
.page-tree .ant-tree-node-content-wrapper {
width: 100% !important;
}
.page-tree .ant-tree-treenode .ant-tree-node-content-wrapper {
height: 100%;
display: flex;
align-items: center;
justify-content: flex-start;
}
.page-tree .ant-tree-treenode .ant-tree-node-content-wrapper .ant-tree-icon__customize {
flex: 0 0 14px;
align-items: center;
display: inline-flex;
margin-left: 4px;
}
.page-tree .ant-tree-treenode .ant-tree-node-content-wrapper .ant-tree-title {
padding-left: 4px;
flex: 1;
width: 0;
display: flex;
justify-content: space-between;
box-sizing: border-box;
}
.page-tree .ant-tree-treenode .ant-tree-node-content-wrapper .page-tree-item-title {
position: relative;
width: calc(100% - 28px);
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.page-tree .ant-tree-treenode .ant-tree-switcher {
line-height:32px;
width: 8px;
margin-right: 4px;
}
.page-tree .ant-tree-treenode .ant-tree-title {
min-height:32px;
line-height:32px;
}
.page-tree .ant-tree-node-content-wrapper:hover {}
.page-tree .hover-hide {
position:absolute;
right: 4px;
font-size: 14px;
top: 50%;
transform: translateY(-50%);
display: flex;
}
.page-tree .hover-hide> span {
margin-right: 8px;
font-size: 14px;
display: none;
}
.page-tree .ant-dropdown-trigger:hover{
.hover-hide > span{
display: block;
}
}
.max-page-modal.ant-modal-wrap {
.ant-modal-header {
height: 48px;
margin: 0;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 24px;
.ant-modal-title {
flex: 1;
}
}
.ant-modal-content {
height: 380px;
padding: 0;
border-radius: 10px;
overflow: hidden;
display: flex;
flex-direction: column;
.ant-modal-close {
font-size: 14px;
}
.ant-modal-body {
flex: 1;
padding: 29px 51px 0 51px;
.tip {
display: flex;
align-items: flex-start;
margin-bottom: 20px;
.max-page-icon.anticon {
margin-right: 9px;
font-size: 18px;
transform: translateY(3px);
}
.tip-text {
text-align: center;
font-weight: 400;
font-size: 14px;
line-height: 24px;
text-align: center;
font-style: normal;
text-transform: none;
}
}
.qrcode {
width: 170px;
height: 162px;
margin: 0 auto 11px;
padding: 10px;
display: flex;
border-radius: 4px 4px 4px 4px;
img {
flex: 1;
object-fit: contain;
}
}
.tel {
text-align: center;
font-weight: 400;
font-size: 16px;
line-height: 28px;
font-style: normal;
text-transform: none;
}
}
}
}
.max-ai-page-modal.ant-modal-wrap {
.ant-modal-content {
height: 320px;
.ant-modal-body {
padding: 34px 51px 0 51px;
}
.ant-modal-body .qrcode {
margin: 0 auto 16px
}
.ant-modal-close {
top: 13px;
}
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,165 @@
Fonticons, Inc. (https://fontawesome.com)
--------------------------------------------------------------------------------
Font Awesome Free License
Font Awesome Free is free, open source, and GPL friendly. You can use it for
commercial projects, open source projects, or really almost whatever you want.
Full Font Awesome Free license: https://fontawesome.com/license/free.
--------------------------------------------------------------------------------
# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)
The Font Awesome Free download is licensed under a Creative Commons
Attribution 4.0 International License and applies to all icons packaged
as SVG and JS file types.
--------------------------------------------------------------------------------
# Fonts: SIL OFL 1.1 License
In the Font Awesome Free download, the SIL OFL license applies to all icons
packaged as web and desktop font files.
Copyright (c) 2024 Fonticons, Inc. (https://fontawesome.com)
with Reserved Font Name: "Font Awesome".
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
SIL OPEN FONT LICENSE
Version 1.1 - 26 February 2007
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting — in part or in whole — any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
--------------------------------------------------------------------------------
# Code: MIT License (https://opensource.org/licenses/MIT)
In the Font Awesome Free download, the MIT license applies to all non-font and
non-icon files.
Copyright 2024 Fonticons, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in the
Software without restriction, including without limitation the rights to use, copy,
modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so, subject to the
following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
# Attribution
Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font
Awesome Free files already contain embedded comments with sufficient
attribution, so you shouldn't need to do anything additional when using these
files normally.
We've kept attribution comments terse, so we ask that you do not actively work
to remove them from files, especially code. They're a great way for folks to
learn about Font Awesome.
--------------------------------------------------------------------------------
# Brand Icons
All brand icons are trademarks of their respective owners. The use of these
trademarks does not indicate endorsement of the trademark holder by Font
Awesome, nor vice versa. **Please do not use brand logos for any purpose except
to represent the company, product, or service to which they refer.**

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,19 @@
/*!
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
:root, :host {
--fa-style-family-classic: 'Font Awesome 6 Free';
--fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; }
@font-face {
font-family: 'Font Awesome 6 Free';
font-style: normal;
font-weight: 400;
font-display: block;
src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }
.far,
.fa-regular {
font-weight: 400; }

View File

@@ -0,0 +1,6 @@
/*!
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}

View File

@@ -0,0 +1,19 @@
/*!
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
:root, :host {
--fa-style-family-classic: 'Font Awesome 6 Free';
--fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; }
@font-face {
font-family: 'Font Awesome 6 Free';
font-style: normal;
font-weight: 900;
font-display: block;
src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
.fas,
.fa-solid {
font-weight: 900; }

View File

@@ -0,0 +1,6 @@
/*!
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}

View File

@@ -0,0 +1,459 @@
/*!
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
:root, :host {
--fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free';
--fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free';
--fa-font-light: normal 300 1em/1 'Font Awesome 6 Pro';
--fa-font-thin: normal 100 1em/1 'Font Awesome 6 Pro';
--fa-font-duotone: normal 900 1em/1 'Font Awesome 6 Duotone';
--fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands';
--fa-font-sharp-solid: normal 900 1em/1 'Font Awesome 6 Sharp';
--fa-font-sharp-regular: normal 400 1em/1 'Font Awesome 6 Sharp';
--fa-font-sharp-light: normal 300 1em/1 'Font Awesome 6 Sharp';
--fa-font-sharp-thin: normal 100 1em/1 'Font Awesome 6 Sharp';
--fa-font-sharp-duotone-solid: normal 900 1em/1 'Font Awesome 6 Sharp Duotone'; }
svg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {
overflow: visible;
box-sizing: content-box; }
.svg-inline--fa {
display: var(--fa-display, inline-block);
height: 1em;
overflow: visible;
vertical-align: -.125em; }
.svg-inline--fa.fa-2xs {
vertical-align: 0.1em; }
.svg-inline--fa.fa-xs {
vertical-align: 0em; }
.svg-inline--fa.fa-sm {
vertical-align: -0.07143em; }
.svg-inline--fa.fa-lg {
vertical-align: -0.2em; }
.svg-inline--fa.fa-xl {
vertical-align: -0.25em; }
.svg-inline--fa.fa-2xl {
vertical-align: -0.3125em; }
.svg-inline--fa.fa-pull-left {
margin-right: var(--fa-pull-margin, 0.3em);
width: auto; }
.svg-inline--fa.fa-pull-right {
margin-left: var(--fa-pull-margin, 0.3em);
width: auto; }
.svg-inline--fa.fa-li {
width: var(--fa-li-width, 2em);
top: 0.25em; }
.svg-inline--fa.fa-fw {
width: var(--fa-fw-width, 1.25em); }
.fa-layers svg.svg-inline--fa {
bottom: 0;
left: 0;
margin: auto;
position: absolute;
right: 0;
top: 0; }
.fa-layers-text, .fa-layers-counter {
display: inline-block;
position: absolute;
text-align: center; }
.fa-layers {
display: inline-block;
height: 1em;
position: relative;
text-align: center;
vertical-align: -.125em;
width: 1em; }
.fa-layers svg.svg-inline--fa {
transform-origin: center center; }
.fa-layers-text {
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
transform-origin: center center; }
.fa-layers-counter {
background-color: var(--fa-counter-background-color, #ff253a);
border-radius: var(--fa-counter-border-radius, 1em);
box-sizing: border-box;
color: var(--fa-inverse, #fff);
line-height: var(--fa-counter-line-height, 1);
max-width: var(--fa-counter-max-width, 5em);
min-width: var(--fa-counter-min-width, 1.5em);
overflow: hidden;
padding: var(--fa-counter-padding, 0.25em 0.5em);
right: var(--fa-right, 0);
text-overflow: ellipsis;
top: var(--fa-top, 0);
transform: scale(var(--fa-counter-scale, 0.25));
transform-origin: top right; }
.fa-layers-bottom-right {
bottom: var(--fa-bottom, 0);
right: var(--fa-right, 0);
top: auto;
transform: scale(var(--fa-layers-scale, 0.25));
transform-origin: bottom right; }
.fa-layers-bottom-left {
bottom: var(--fa-bottom, 0);
left: var(--fa-left, 0);
right: auto;
top: auto;
transform: scale(var(--fa-layers-scale, 0.25));
transform-origin: bottom left; }
.fa-layers-top-right {
top: var(--fa-top, 0);
right: var(--fa-right, 0);
transform: scale(var(--fa-layers-scale, 0.25));
transform-origin: top right; }
.fa-layers-top-left {
left: var(--fa-left, 0);
right: auto;
top: var(--fa-top, 0);
transform: scale(var(--fa-layers-scale, 0.25));
transform-origin: top left; }
.fa-1x {
font-size: 1em; }
.fa-2x {
font-size: 2em; }
.fa-3x {
font-size: 3em; }
.fa-4x {
font-size: 4em; }
.fa-5x {
font-size: 5em; }
.fa-6x {
font-size: 6em; }
.fa-7x {
font-size: 7em; }
.fa-8x {
font-size: 8em; }
.fa-9x {
font-size: 9em; }
.fa-10x {
font-size: 10em; }
.fa-2xs {
font-size: 0.625em;
line-height: 0.1em;
vertical-align: 0.225em; }
.fa-xs {
font-size: 0.75em;
line-height: 0.08333em;
vertical-align: 0.125em; }
.fa-sm {
font-size: 0.875em;
line-height: 0.07143em;
vertical-align: 0.05357em; }
.fa-lg {
font-size: 1.25em;
line-height: 0.05em;
vertical-align: -0.075em; }
.fa-xl {
font-size: 1.5em;
line-height: 0.04167em;
vertical-align: -0.125em; }
.fa-2xl {
font-size: 2em;
line-height: 0.03125em;
vertical-align: -0.1875em; }
.fa-fw {
text-align: center;
width: 1.25em; }
.fa-ul {
list-style-type: none;
margin-left: var(--fa-li-margin, 2.5em);
padding-left: 0; }
.fa-ul > li {
position: relative; }
.fa-li {
left: calc(-1 * var(--fa-li-width, 2em));
position: absolute;
text-align: center;
width: var(--fa-li-width, 2em);
line-height: inherit; }
.fa-border {
border-color: var(--fa-border-color, #eee);
border-radius: var(--fa-border-radius, 0.1em);
border-style: var(--fa-border-style, solid);
border-width: var(--fa-border-width, 0.08em);
padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); }
.fa-pull-left {
float: left;
margin-right: var(--fa-pull-margin, 0.3em); }
.fa-pull-right {
float: right;
margin-left: var(--fa-pull-margin, 0.3em); }
.fa-beat {
animation-name: fa-beat;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
.fa-bounce {
animation-name: fa-bounce;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }
.fa-fade {
animation-name: fa-fade;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
.fa-beat-fade {
animation-name: fa-beat-fade;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
.fa-flip {
animation-name: fa-flip;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
.fa-shake {
animation-name: fa-shake;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, linear); }
.fa-spin {
animation-name: fa-spin;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 2s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, linear); }
.fa-spin-reverse {
--fa-animation-direction: reverse; }
.fa-pulse,
.fa-spin-pulse {
animation-name: fa-spin;
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, steps(8)); }
@media (prefers-reduced-motion: reduce) {
.fa-beat,
.fa-bounce,
.fa-fade,
.fa-beat-fade,
.fa-flip,
.fa-pulse,
.fa-shake,
.fa-spin,
.fa-spin-pulse {
animation-delay: -1ms;
animation-duration: 1ms;
animation-iteration-count: 1;
transition-delay: 0s;
transition-duration: 0s; } }
@keyframes fa-beat {
0%, 90% {
transform: scale(1); }
45% {
transform: scale(var(--fa-beat-scale, 1.25)); } }
@keyframes fa-bounce {
0% {
transform: scale(1, 1) translateY(0); }
10% {
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
30% {
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
50% {
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
57% {
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
64% {
transform: scale(1, 1) translateY(0); }
100% {
transform: scale(1, 1) translateY(0); } }
@keyframes fa-fade {
50% {
opacity: var(--fa-fade-opacity, 0.4); } }
@keyframes fa-beat-fade {
0%, 100% {
opacity: var(--fa-beat-fade-opacity, 0.4);
transform: scale(1); }
50% {
opacity: 1;
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
@keyframes fa-flip {
50% {
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
@keyframes fa-shake {
0% {
transform: rotate(-15deg); }
4% {
transform: rotate(15deg); }
8%, 24% {
transform: rotate(-18deg); }
12%, 28% {
transform: rotate(18deg); }
16% {
transform: rotate(-22deg); }
20% {
transform: rotate(22deg); }
32% {
transform: rotate(-12deg); }
36% {
transform: rotate(12deg); }
40%, 100% {
transform: rotate(0deg); } }
@keyframes fa-spin {
0% {
transform: rotate(0deg); }
100% {
transform: rotate(360deg); } }
.fa-rotate-90 {
transform: rotate(90deg); }
.fa-rotate-180 {
transform: rotate(180deg); }
.fa-rotate-270 {
transform: rotate(270deg); }
.fa-flip-horizontal {
transform: scale(-1, 1); }
.fa-flip-vertical {
transform: scale(1, -1); }
.fa-flip-both,
.fa-flip-horizontal.fa-flip-vertical {
transform: scale(-1, -1); }
.fa-rotate-by {
transform: rotate(var(--fa-rotate-angle, 0)); }
.fa-stack {
display: inline-block;
vertical-align: middle;
height: 2em;
position: relative;
width: 2.5em; }
.fa-stack-1x,
.fa-stack-2x {
bottom: 0;
left: 0;
margin: auto;
position: absolute;
right: 0;
top: 0;
z-index: var(--fa-stack-z-index, auto); }
.svg-inline--fa.fa-stack-1x {
height: 1em;
width: 1.25em; }
.svg-inline--fa.fa-stack-2x {
height: 2em;
width: 2.5em; }
.fa-inverse {
color: var(--fa-inverse, #fff); }
.sr-only,
.fa-sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0; }
.sr-only-focusable:not(:focus),
.fa-sr-only-focusable:not(:focus) {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0; }
.svg-inline--fa .fa-primary {
fill: var(--fa-primary-color, currentColor);
opacity: var(--fa-primary-opacity, 1); }
.svg-inline--fa .fa-secondary {
fill: var(--fa-secondary-color, currentColor);
opacity: var(--fa-secondary-opacity, 0.4); }
.svg-inline--fa.fa-swap-opacity .fa-primary {
opacity: var(--fa-secondary-opacity, 0.4); }
.svg-inline--fa.fa-swap-opacity .fa-secondary {
opacity: var(--fa-primary-opacity, 1); }
.svg-inline--fa mask .fa-primary,
.svg-inline--fa mask .fa-secondary {
fill: black; }
.fad.fa-inverse,
.fa-duotone.fa-inverse {
color: var(--fa-inverse, #fff); }

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,26 @@
/*!
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
@font-face {
font-family: 'FontAwesome';
font-display: block;
src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
@font-face {
font-family: 'FontAwesome';
font-display: block;
src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }
@font-face {
font-family: 'FontAwesome';
font-display: block;
src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype");
unicode-range: U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC; }
@font-face {
font-family: 'FontAwesome';
font-display: block;
src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype");
unicode-range: U+F041,U+F047,U+F065-F066,U+F07D-F07E,U+F080,U+F08B,U+F08E,U+F090,U+F09A,U+F0AC,U+F0AE,U+F0B2,U+F0D0,U+F0D6,U+F0E4,U+F0EC,U+F10A-F10B,U+F123,U+F13E,U+F148-F149,U+F14C,U+F156,U+F15E,U+F160-F161,U+F163,U+F175-F178,U+F195,U+F1F8,U+F219,U+F27A; }

View File

@@ -0,0 +1,6 @@
/*!
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,22 @@
/*!
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
@font-face {
font-family: 'Font Awesome 5 Brands';
font-display: block;
font-weight: 400;
src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }
@font-face {
font-family: 'Font Awesome 5 Free';
font-display: block;
font-weight: 900;
src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
@font-face {
font-family: 'Font Awesome 5 Free';
font-display: block;
font-weight: 400;
src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }

View File

@@ -0,0 +1,6 @@
/*!
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,152 @@
// animating icons
// --------------------------
.@{fa-css-prefix}-beat {
animation-name: ~'@{fa-css-prefix}-beat';
animation-delay: ~'var(--@{fa-css-prefix}-animation-delay, 0s)';
animation-direction: ~'var(--@{fa-css-prefix}-animation-direction, normal)';
animation-duration: ~'var(--@{fa-css-prefix}-animation-duration, 1s)';
animation-iteration-count: ~'var(--@{fa-css-prefix}-animation-iteration-count, infinite)';
animation-timing-function: ~'var(--@{fa-css-prefix}-animation-timing, ease-in-out)';
}
.@{fa-css-prefix}-bounce {
animation-name: ~'@{fa-css-prefix}-bounce';
animation-delay: ~'var(--@{fa-css-prefix}-animation-delay, 0s)';
animation-direction: ~'var(--@{fa-css-prefix}-animation-direction, normal)';
animation-duration: ~'var(--@{fa-css-prefix}-animation-duration, 1s)';
animation-iteration-count: ~'var(--@{fa-css-prefix}-animation-iteration-count, infinite)';
animation-timing-function: ~'var(--@{fa-css-prefix}-animation-timing, cubic-bezier(0.280, 0.840, 0.420, 1))';
}
.@{fa-css-prefix}-fade {
animation-name: ~'@{fa-css-prefix}-fade';
animation-delay: ~'var(--@{fa-css-prefix}-animation-delay, 0s)';
animation-direction: ~'var(--@{fa-css-prefix}-animation-direction, normal)';
animation-duration: ~'var(--@{fa-css-prefix}-animation-duration, 1s)';
animation-iteration-count: ~'var(--@{fa-css-prefix}-animation-iteration-count, infinite)';
animation-timing-function: ~'var(--@{fa-css-prefix}-animation-timing, cubic-bezier(.4,0,.6,1))';
}
.@{fa-css-prefix}-beat-fade {
animation-name: ~'@{fa-css-prefix}-beat-fade';
animation-delay: ~'var(--@{fa-css-prefix}-animation-delay, 0s)';
animation-direction: ~'var(--@{fa-css-prefix}-animation-direction, normal)';
animation-duration: ~'var(--@{fa-css-prefix}-animation-duration, 1s)';
animation-iteration-count: ~'var(--@{fa-css-prefix}-animation-iteration-count, infinite)';
animation-timing-function: ~'var(--@{fa-css-prefix}-animation-timing, cubic-bezier(.4,0,.6,1))';
}
.@{fa-css-prefix}-flip {
animation-name: ~'@{fa-css-prefix}-flip';
animation-delay: ~'var(--@{fa-css-prefix}-animation-delay, 0s)';
animation-direction: ~'var(--@{fa-css-prefix}-animation-direction, normal)';
animation-duration: ~'var(--@{fa-css-prefix}-animation-duration, 1s)';
animation-iteration-count: ~'var(--@{fa-css-prefix}-animation-iteration-count, infinite)';
animation-timing-function: ~'var(--@{fa-css-prefix}-animation-timing, ease-in-out)';
}
.@{fa-css-prefix}-shake {
animation-name: ~'@{fa-css-prefix}-shake';
animation-delay: ~'var(--@{fa-css-prefix}-animation-delay, 0s)';
animation-direction: ~'var(--@{fa-css-prefix}-animation-direction, normal)';
animation-duration: ~'var(--@{fa-css-prefix}-animation-duration, 1s)';
animation-iteration-count: ~'var(--@{fa-css-prefix}-animation-iteration-count, infinite)';
animation-timing-function: ~'var(--@{fa-css-prefix}-animation-timing, linear)';
}
.@{fa-css-prefix}-spin {
animation-name: ~'@{fa-css-prefix}-spin';
animation-delay: ~'var(--@{fa-css-prefix}-animation-delay, 0s)';
animation-direction: ~'var(--@{fa-css-prefix}-animation-direction, normal)';
animation-duration: ~'var(--@{fa-css-prefix}-animation-duration, 2s)';
animation-iteration-count: ~'var(--@{fa-css-prefix}-animation-iteration-count, infinite)';
animation-timing-function: ~'var(--@{fa-css-prefix}-animation-timing, linear)';
}
.@{fa-css-prefix}-spin-reverse {
--@{fa-css-prefix}-animation-direction: reverse;
}
.@{fa-css-prefix}-pulse,
.@{fa-css-prefix}-spin-pulse {
animation-name: ~'@{fa-css-prefix}-spin';
animation-direction: ~'var(--@{fa-css-prefix}-animation-direction, normal)';
animation-duration: ~'var(--@{fa-css-prefix}-animation-duration, 1s)';
animation-iteration-count: ~'var(--@{fa-css-prefix}-animation-iteration-count, infinite)';
animation-timing-function: ~'var(--@{fa-css-prefix}-animation-timing, steps(8));';
}
// if agent or operating system prefers reduced motion, disable animations
// see: https://www.smashingmagazine.com/2020/09/design-reduced-motion-sensitivities/
// see: https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion
@media (prefers-reduced-motion: reduce) {
.@{fa-css-prefix}-beat,
.@{fa-css-prefix}-bounce,
.@{fa-css-prefix}-fade,
.@{fa-css-prefix}-beat-fade,
.@{fa-css-prefix}-flip,
.@{fa-css-prefix}-pulse,
.@{fa-css-prefix}-shake,
.@{fa-css-prefix}-spin,
.@{fa-css-prefix}-spin-pulse {
animation-delay: -1ms;
animation-duration: 1ms;
animation-iteration-count: 1;
transition-delay: 0s;
transition-duration: 0s;
}
}
@keyframes ~'@{fa-css-prefix}-beat' {
0%, 90% { transform: scale(1); }
45% { transform: ~'scale(var(--@{fa-css-prefix}-beat-scale, 1.25))'; }
}
@keyframes ~'@{fa-css-prefix}-bounce' {
0% { transform: scale(1,1) translateY(0); }
10% { transform: ~'scale(var(--@{fa-css-prefix}-bounce-start-scale-x, 1.1),var(--@{fa-css-prefix}-bounce-start-scale-y, 0.9))' translateY(0); }
30% { transform: ~'scale(var(--@{fa-css-prefix}-bounce-jump-scale-x, 0.9),var(--@{fa-css-prefix}-bounce-jump-scale-y, 1.1))' ~'translateY(var(--@{fa-css-prefix}-bounce-height, -0.5em))'; }
50% { transform: ~'scale(var(--@{fa-css-prefix}-bounce-land-scale-x, 1.05),var(--@{fa-css-prefix}-bounce-land-scale-y, 0.95))' translateY(0); }
57% { transform: ~'scale(1,1) translateY(var(--@{fa-css-prefix}-bounce-rebound, -0.125em))'; }
64% { transform: scale(1,1) translateY(0); }
100% { transform: scale(1,1) translateY(0); }
}
@keyframes ~'@{fa-css-prefix}-fade' {
50% { opacity: ~'var(--@{fa-css-prefix}-fade-opacity, 0.4)'; }
}
@keyframes ~'@{fa-css-prefix}-beat-fade' {
0%, 100% {
opacity: ~'var(--@{fa-css-prefix}-beat-fade-opacity, 0.4)';
transform: scale(1);
}
50% {
opacity: 1;
transform: ~'scale(var(--@{fa-css-prefix}-beat-fade-scale, 1.125))';
}
}
@keyframes ~'@{fa-css-prefix}-flip' {
50% {
transform: ~'rotate3d(var(--@{fa-css-prefix}-flip-x, 0), var(--@{fa-css-prefix}-flip-y, 1), var(--@{fa-css-prefix}-flip-z, 0), var(--@{fa-css-prefix}-flip-angle, -180deg))';
}
}
@keyframes ~'@{fa-css-prefix}-shake' {
0% { transform: rotate(-15deg); }
4% { transform: rotate(15deg); }
8%, 24% { transform: rotate(-18deg); }
12%, 28% { transform: rotate(18deg); }
16% { transform: rotate(-22deg); }
20% { transform: rotate(22deg); }
32% { transform: rotate(-12deg); }
36% { transform: rotate(12deg); }
40%, 100% { transform: rotate(0deg); }
}
@keyframes ~'@{fa-css-prefix}-spin' {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}

View File

@@ -0,0 +1,20 @@
// bordered + pulled icons
// -------------------------
.@{fa-css-prefix}-border {
border-color: ~'var(--@{fa-css-prefix}-border-color, @{fa-border-color})';
border-radius: ~'var(--@{fa-css-prefix}-border-radius, @{fa-border-radius})';
border-style: ~'var(--@{fa-css-prefix}-border-style, @{fa-border-style})';
border-width: ~'var(--@{fa-css-prefix}-border-width, @{fa-border-width})';
padding: ~'var(--@{fa-css-prefix}-border-padding, @{fa-border-padding})';
}
.@{fa-css-prefix}-pull-left {
float: left;
margin-right: ~'var(--@{fa-css-prefix}-pull-margin, @{fa-pull-margin})';
}
.@{fa-css-prefix}-pull-right {
float: right;
margin-left: ~'var(--@{fa-css-prefix}-pull-margin, @{fa-pull-margin})';
}

View File

@@ -0,0 +1,36 @@
// base icon class definition
// -------------------------
.@{fa-css-prefix} {
font-family: ~"var(--@{fa-css-prefix}-style-family, '@{fa-style-family}')";
font-weight: ~'var(--@{fa-css-prefix}-style, @{fa-style})';
}
.@{fa-css-prefix}-solid,
.@{fa-css-prefix}-regular,
.@{fa-css-prefix}-brands,
.fas,
.far,
.fab,
.@{fa-css-prefix} {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
display: ~'var(--@{fa-css-prefix}-display, @{fa-display})';
font-style: normal;
font-variant: normal;
text-rendering: auto;
}
.fas,
.@{fa-css-prefix}-classic,
.@{fa-css-prefix}-solid,
.far,
.@{fa-css-prefix}-regular {
font-family: 'Font Awesome 6 Free';
}
.fab,
.@{fa-css-prefix}-brands {
font-family: 'Font Awesome 6 Brands';
}

View File

@@ -0,0 +1,7 @@
// fixed-width icons
// -------------------------
.@{fa-css-prefix}-fw {
text-align: center;
width: @fa-fw-width;
}

View File

@@ -0,0 +1,9 @@
// specific icon class definition
// -------------------------
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
readers do not read off random characters that represent icons */
each(.fa-icons(), {
.@{fa-css-prefix}-@{key}::before { content: @value; }
});

View File

@@ -0,0 +1,18 @@
// icons in a list
// -------------------------
.@{fa-css-prefix}-ul {
list-style-type: none;
margin-left: ~'var(--@{fa-css-prefix}-li-margin, @{fa-li-margin})';
padding-left: 0;
> li { position: relative; }
}
.@{fa-css-prefix}-li {
left: calc(~'var(--@{fa-css-prefix}-li-width, @{fa-li-width})' * -1);
position: absolute;
text-align: center;
width: ~'var(--@{fa-css-prefix}-li-width, @{fa-li-width})';
line-height: inherit;
}

View File

@@ -0,0 +1,78 @@
// mixins
// --------------------------
// base rendering for an icon
.fa-icon() {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
display: inline-block;
font-style: normal;
font-variant: normal;
font-weight: normal;
line-height: 1;
}
// sets relative font-sizing and alignment (in _sizing)
.fa-size(@font-size) {
font-size: (@font-size / @fa-size-scale-base) * 1em; // converts step in sizing scale into an em-based value that's relative to the scale's base
line-height: (1 / @font-size) * 1em; // sets the line-height of the icon back to that of it's parent
vertical-align: ((6 / @font-size) - (3 / 8)) * 1em; // vertically centers the icon taking into account the surrounding text's descender
}
// only display content to screen readers
// see: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/
// see: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/
.fa-sr-only() {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
// use in conjunction with .sr-only to only display content when it's focused
.fa-sr-only-focusable() {
&:not(:focus) {
.fa-sr-only();
}
}
// sets a specific icon family to use alongside style + icon mixins
.fa-family-classic() {
font-family: 'Font Awesome 6 Free';
}
// convenience mixins for declaring pseudo-elements by CSS variable,
// including all style-specific font properties, and both the ::before
// and ::after elements in the duotone case.
.fa-icon-solid(@fa-var) {
.fa-icon;
.fa-solid;
&::before {
content: @fa-var;
}
}
.fa-icon-regular(@fa-var) {
.fa-icon;
.fa-regular;
&::before {
content: @fa-var;
}
}
.fa-icon-brands(@fa-var) {
.fa-icon;
.fa-brands;
&::before {
content: @fa-var;
}
}

View File

@@ -0,0 +1,31 @@
// rotating + flipping icons
// -------------------------
.@{fa-css-prefix}-rotate-90 {
transform: rotate(90deg);
}
.@{fa-css-prefix}-rotate-180 {
transform: rotate(180deg);
}
.@{fa-css-prefix}-rotate-270 {
transform: rotate(270deg);
}
.@{fa-css-prefix}-flip-horizontal {
transform: scale(-1, 1);
}
.@{fa-css-prefix}-flip-vertical {
transform: scale(1, -1);
}
.@{fa-css-prefix}-flip-both,
.@{fa-css-prefix}-flip-horizontal.@{fa-css-prefix}-flip-vertical {
transform: scale(-1, -1);
}
.@{fa-css-prefix}-rotate-by {
transform: rotate(~'var(--@{fa-css-prefix}-rotate-angle, 0)');
}

View File

@@ -0,0 +1,14 @@
// screen-reader utilities
// -------------------------
// only display content to screen readers
.sr-only,
.@{fa-css-prefix}-sr-only {
.fa-sr-only();
}
// use in conjunction with .sr-only to only display content when it's focused
.sr-only-focusable,
.@{fa-css-prefix}-sr-only-focusable {
.fa-sr-only-focusable();
}

View File

@@ -0,0 +1,19 @@
// sizing icons
// -------------------------
// literal magnification scale
.sizes-literal(@factor) when (@factor > 0) {
.sizes-literal((@factor - 1));
.@{fa-css-prefix}-@{factor}x {
font-size: (@factor * 1em);
}
}
.sizes-literal(10);
// step-based scale (with alignment)
each(.fa-sizes(), {
.@{fa-css-prefix}-@{key} {
.fa-size(@value);
}
});

View File

@@ -0,0 +1,31 @@
// stacking icons
// -------------------------
.@{fa-css-prefix}-stack {
display: inline-block;
height: 2em;
line-height: 2em;
position: relative;
vertical-align: @fa-stack-vertical-align;
width: @fa-stack-width;
}
.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
left: 0;
position: absolute;
text-align: center;
width: 100%;
z-index: ~'var(--@{fa-css-prefix}-stack-z-index, @{fa-stack-z-index})';
}
.@{fa-css-prefix}-stack-1x {
line-height: inherit;
}
.@{fa-css-prefix}-stack-2x {
font-size: 2em;
}
.@{fa-css-prefix}-inverse {
color: ~'var(--@{fa-css-prefix}-inverse, @{fa-inverse})';
}

View File

@@ -0,0 +1,29 @@
/*!
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
@import "_variables.less";
:root, :host {
--@{fa-css-prefix}-style-family-brands: 'Font Awesome 6 Brands';
--@{fa-css-prefix}-font-brands: normal 400 1em/1 'Font Awesome 6 Brands';
}
@font-face {
font-family: 'Font Awesome 6 Brands';
font-style: normal;
font-weight: 400;
font-display: @fa-font-display;
src: url('@{fa-font-path}/fa-brands-400.woff2') format('woff2'),
url('@{fa-font-path}/fa-brands-400.ttf') format('truetype');
}
.fab,
.@{fa-css-prefix}-brands {
font-weight: 400;
}
each(.fa-brand-icons(), {
.@{fa-css-prefix}-@{key}:before { content: @value; }
});

View File

@@ -0,0 +1,20 @@
/*!
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
// Font Awesome core compile (Web Fonts-based)
// -------------------------
@import "_variables.less";
@import "_mixins.less";
@import "_core.less";
@import "_sizing.less";
@import "_fixed-width.less";
@import "_list.less";
@import "_bordered-pulled.less";
@import "_animated.less";
@import "_rotated-flipped.less";
@import "_stacked.less";
@import "_icons.less";
@import "_screen-reader.less";

View File

@@ -0,0 +1,25 @@
/*!
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
@import "_variables.less";
:root, :host {
--@{fa-css-prefix}-style-family-classic: '@{fa-style-family}';
--@{fa-css-prefix}-font-regular: normal 400 1em/1 '@{fa-style-family}';
}
@font-face {
font-family: 'Font Awesome 6 Free';
font-style: normal;
font-weight: 400;
font-display: @fa-font-display;
src: url('@{fa-font-path}/fa-regular-400.woff2') format('woff2'),
url('@{fa-font-path}/fa-regular-400.ttf') format('truetype');
}
.far,
.@{fa-css-prefix}-regular {
font-weight: 400;
}

View File

@@ -0,0 +1,25 @@
/*!
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
@import "_variables.less";
:root, :host {
--@{fa-css-prefix}-style-family-classic: '@{fa-style-family}';
--@{fa-css-prefix}-font-solid: normal 900 1em/1 '@{fa-style-family}';
}
@font-face {
font-family: 'Font Awesome 6 Free';
font-style: normal;
font-weight: 900;
font-display: @fa-font-display;
src: url('@{fa-font-path}/fa-solid-900.woff2') format('woff2'),
url('@{fa-font-path}/fa-solid-900.ttf') format('truetype');
}
.fas,
.@{fa-css-prefix}-solid {
font-weight: 900;
}

View File

@@ -0,0 +1,10 @@
/*!
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
// V4 shims compile (Web Fonts-based)
// -------------------------
@import '_variables.less';
@import '_shims.less';

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,646 @@
area-chart:
name: chart-area
arrow-circle-o-down:
prefix: far
name: circle-down
arrow-circle-o-left:
prefix: far
name: circle-left
arrow-circle-o-right:
prefix: far
name: circle-right
arrow-circle-o-up:
prefix: far
name: circle-up
arrows:
name: up-down-left-right
arrows-alt:
name: maximize
arrows-h:
name: left-right
arrows-v:
name: up-down
asl-interpreting:
name: hands-asl-interpreting
automobile:
name: car
bank:
name: building-columns
bar-chart:
name: chart-column
bar-chart-o:
name: chart-column
bathtub:
name: bath
battery:
name: battery-full
battery-0:
name: battery-empty
battery-1:
name: battery-quarter
battery-2:
name: battery-half
battery-3:
name: battery-three-quarters
battery-4:
name: battery-full
behance-square:
prefix: fab
name: square-behance
bitbucket-square:
prefix: fab
name: bitbucket
bitcoin:
prefix: fab
name: btc
cab:
name: taxi
calendar:
name: calendar-days
calendar-times-o:
prefix: far
name: calendar-xmark
caret-square-o-down:
prefix: far
name: square-caret-down
caret-square-o-left:
prefix: far
name: square-caret-left
caret-square-o-right:
prefix: far
name: square-caret-right
caret-square-o-up:
prefix: far
name: square-caret-up
cc:
prefix: far
name: closed-captioning
chain:
name: link
chain-broken:
name: link-slash
check-circle-o:
prefix: far
name: circle-check
check-square-o:
prefix: far
name: square-check
circle-o-notch:
name: circle-notch
circle-thin:
prefix: far
name: circle
clipboard:
name: paste
clone:
prefix: far
close:
name: xmark
cloud-download:
name: cloud-arrow-down
cloud-upload:
name: cloud-arrow-up
cny:
name: yen-sign
code-fork:
name: code-branch
commenting:
name: comment-dots
commenting-o:
prefix: far
name: comment-dots
compass:
prefix: far
compress:
name: down-left-and-up-right-to-center
copyright:
prefix: far
credit-card:
prefix: far
credit-card-alt:
name: credit-card
cut:
name: scissors
cutlery:
name: utensils
dashboard:
name: gauge-high
deafness:
name: ear-deaf
dedent:
name: outdent
diamond:
prefix: far
name: gem
dollar:
name: dollar-sign
dot-circle-o:
prefix: far
name: circle-dot
drivers-license:
name: id-card
drivers-license-o:
prefix: far
name: id-card
edit:
prefix: far
name: pen-to-square
eercast:
prefix: fab
name: sellcast
eur:
name: euro-sign
euro:
name: euro-sign
exchange:
name: right-left
expand:
name: up-right-and-down-left-from-center
external-link:
name: up-right-from-square
external-link-square:
name: square-up-right
eye:
prefix: far
eye-slash:
prefix: far
eyedropper:
name: eye-dropper
fa:
prefix: fab
name: font-awesome
facebook:
prefix: fab
name: facebook-f
facebook-f:
prefix: fab
name: facebook-f
facebook-official:
prefix: fab
name: facebook
facebook-square:
prefix: fab
name: square-facebook
feed:
name: rss
file-archive-o:
prefix: far
name: file-zipper
file-movie-o:
prefix: far
name: file-video
file-photo-o:
prefix: far
name: file-image
file-picture-o:
prefix: far
name: file-image
file-sound-o:
prefix: far
name: file-audio
file-text:
name: file-lines
file-text-o:
prefix: far
name: file-lines
file-zip-o:
prefix: far
name: file-zipper
files-o:
prefix: far
name: copy
flash:
name: bolt
floppy-o:
prefix: far
name: floppy-disk
frown-o:
prefix: far
name: face-frown
gbp:
name: sterling-sign
ge:
prefix: fab
name: empire
gear:
name: gear
gears:
name: gears
git-square:
prefix: fab
name: square-git
github-square:
prefix: fab
name: square-github
gittip:
prefix: fab
name: gratipay
glass:
name: martini-glass-empty
globe:
name: earth-americas
google-plus:
prefix: fab
name: google-plus-g
google-plus-circle:
prefix: fab
name: google-plus
google-plus-official:
prefix: fab
name: google-plus
google-plus-square:
prefix: fab
name: square-google-plus
group:
name: users
hand-grab-o:
prefix: far
name: hand-back-fist
hand-o-down:
prefix: far
name: hand-point-down
hand-o-left:
prefix: far
name: hand-point-left
hand-o-right:
prefix: far
name: hand-point-right
hand-o-up:
prefix: far
name: hand-point-up
hand-paper-o:
prefix: far
name: hand
hand-rock-o:
prefix: far
name: hand-back-fist
hand-stop-o:
prefix: far
name: hand
hard-of-hearing:
name: ear-deaf
hdd-o:
prefix: far
name: hard-drive
header:
name: heading
home:
name: house
hotel:
name: bed
hourglass-1:
name: hourglass-start
hourglass-2:
name: hourglass-half
hourglass-3:
name: hourglass-end
hourglass-o:
name: hourglass
id-badge:
prefix: far
ils:
name: shekel-sign
image:
prefix: far
name: image
inr:
name: indian-rupee-sign
institution:
name: building-columns
intersex:
name: mars-and-venus
jpy:
name: yen-sign
krw:
name: won-sign
lastfm-square:
prefix: fab
name: square-lastfm
legal:
name: gavel
level-down:
name: turn-down
level-up:
name: turn-up
life-bouy:
name: life-ring
life-buoy:
name: life-ring
life-saver:
name: life-ring
line-chart:
name: chart-line
linkedin:
prefix: fab
name: linkedin-in
linkedin-square:
prefix: fab
name: linkedin
list-alt:
prefix: far
name: rectangle-list
long-arrow-down:
name: down-long
long-arrow-left:
name: left-long
long-arrow-right:
name: right-long
long-arrow-up:
name: up-long
magic:
name: wand-magic-sparkles
mail-forward:
name: share
mail-reply:
name: reply
mail-reply-all:
name: reply-all
map-marker:
name: location-dot
meh-o:
prefix: far
name: face-meh
minus-square-o:
prefix: far
name: square-minus
mobile:
name: mobile-screen-button
mobile-phone:
name: mobile-screen-button
money:
name: money-bill-1
mortar-board:
name: graduation-cap
navicon:
name: bars
object-group:
prefix: far
object-ungroup:
prefix: far
odnoklassniki-square:
prefix: fab
name: square-odnoklassniki
pause-circle-o:
prefix: far
name: circle-pause
pencil-square:
name: square-pen
pencil-square-o:
prefix: far
name: pen-to-square
photo:
prefix: far
name: image
picture-o:
prefix: far
name: image
pie-chart:
name: chart-pie
pinterest-square:
prefix: fab
name: square-pinterest
play-circle-o:
prefix: far
name: circle-play
plus-square-o:
prefix: far
name: square-plus
question-circle-o:
prefix: far
name: circle-question
ra:
prefix: fab
name: rebel
reddit-square:
prefix: fab
name: square-reddit
refresh:
name: arrows-rotate
registered:
prefix: far
remove:
name: xmark
reorder:
name: bars
repeat:
name: arrow-rotate-right
resistance:
prefix: fab
name: rebel
rmb:
name: yen-sign
rotate-left:
name: arrow-rotate-left
rotate-right:
name: arrow-rotate-right
rouble:
name: ruble-sign
rub:
name: ruble-sign
ruble:
name: ruble-sign
rupee:
name: indian-rupee-sign
s15:
name: bath
save:
prefix: far
name: floppy-disk
send:
name: paper-plane
send-o:
prefix: far
name: paper-plane
share-square-o:
name: share-from-square
shekel:
name: shekel-sign
sheqel:
name: shekel-sign
sign-in:
name: right-to-bracket
sign-out:
name: right-from-bracket
signing:
name: hands
smile-o:
prefix: far
name: face-smile
snapchat-ghost:
prefix: fab
name: snapchat
snapchat-square:
prefix: fab
name: square-snapchat
soccer-ball-o:
prefix: far
name: futbol
sort-alpha-asc:
name: arrow-down-a-z
sort-alpha-desc:
name: arrow-down-z-a
sort-amount-asc:
name: arrow-down-short-wide
sort-amount-desc:
name: arrow-down-wide-short
sort-asc:
name: sort-up
sort-desc:
name: sort-down
sort-numeric-asc:
name: arrow-down-1-9
sort-numeric-desc:
name: arrow-down-9-1
star-half-empty:
prefix: far
name: star-half-stroke
star-half-full:
prefix: far
name: star-half-stroke
star-half-o:
prefix: far
name: star-half-stroke
steam-square:
prefix: fab
name: square-steam
sticky-note-o:
prefix: far
name: note-sticky
stop-circle-o:
prefix: far
name: circle-stop
support:
name: life-ring
tablet:
name: tablet-screen-button
tachometer:
name: gauge-high
tasks:
name: bars-progress
television:
name: tv
thermometer:
name: temperature-full
thermometer-0:
name: temperature-empty
thermometer-1:
name: temperature-quarter
thermometer-2:
name: temperature-half
thermometer-3:
name: temperature-three-quarters
thermometer-4:
name: temperature-full
thumb-tack:
name: thumbtack
thumbs-o-down:
prefix: far
name: thumbs-down
thumbs-o-up:
prefix: far
name: thumbs-up
times-circle-o:
prefix: far
name: circle-xmark
times-rectangle:
name: rectangle-xmark
times-rectangle-o:
prefix: far
name: rectangle-xmark
toggle-down:
prefix: far
name: square-caret-down
toggle-left:
prefix: far
name: square-caret-left
toggle-right:
prefix: far
name: square-caret-right
toggle-up:
prefix: far
name: square-caret-up
transgender:
name: mars-and-venus
transgender-alt:
name: transgender
trash:
name: trash-can
trash-o:
prefix: far
name: trash-can
try:
name: turkish-lira-sign
tumblr-square:
prefix: fab
name: square-tumblr
turkish-lira:
name: turkish-lira-sign
twitter-square:
prefix: fab
name: square-twitter
unlink:
name: link-slash
unlock-alt:
name: unlock
unsorted:
name: sort
usd:
name: dollar-sign
user-circle-o:
prefix: far
name: circle-user
vcard:
name: address-card
vcard-o:
prefix: far
name: address-card
viadeo-square:
prefix: fab
name: square-viadeo
video-camera:
name: video
vimeo:
prefix: fab
name: vimeo-v
vimeo-square:
prefix: fab
name: square-vimeo
volume-control-phone:
name: phone-volume
warning:
name: triangle-exclamation
wechat:
prefix: fab
name: weixin
wheelchair-alt:
prefix: fab
name: accessible-icon
window-close-o:
prefix: far
name: rectangle-xmark
window-maximize:
prefix: far
window-restore:
prefix: far
won:
name: won-sign
xing-square:
prefix: fab
name: square-xing
y-combinator-square:
prefix: fab
name: hacker-news
yc:
prefix: fab
name: y-combinator
yc-square:
prefix: fab
name: hacker-news
yen:
name: yen-sign
youtube-play:
prefix: fab
name: youtube
youtube-square:
prefix: fab
name: square-youtube

View File

@@ -0,0 +1,152 @@
// animating icons
// --------------------------
.#{$fa-css-prefix}-beat {
animation-name: #{$fa-css-prefix}-beat;
animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s);
animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal);
animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s);
animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite);
animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, ease-in-out);
}
.#{$fa-css-prefix}-bounce {
animation-name: #{$fa-css-prefix}-bounce;
animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s);
animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal);
animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s);
animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite);
animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, cubic-bezier(0.280, 0.840, 0.420, 1));
}
.#{$fa-css-prefix}-fade {
animation-name: #{$fa-css-prefix}-fade;
animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s);
animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal);
animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s);
animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite);
animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, cubic-bezier(.4,0,.6,1));
}
.#{$fa-css-prefix}-beat-fade {
animation-name: #{$fa-css-prefix}-beat-fade;
animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s);
animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal);
animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s);
animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite);
animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, cubic-bezier(.4,0,.6,1));
}
.#{$fa-css-prefix}-flip {
animation-name: #{$fa-css-prefix}-flip;
animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s);
animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal);
animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s);
animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite);
animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, ease-in-out);
}
.#{$fa-css-prefix}-shake {
animation-name: #{$fa-css-prefix}-shake;
animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s);
animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal);
animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s);
animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite);
animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, linear);
}
.#{$fa-css-prefix}-spin {
animation-name: #{$fa-css-prefix}-spin;
animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s);
animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal);
animation-duration: var(--#{$fa-css-prefix}-animation-duration, 2s);
animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite);
animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, linear);
}
.#{$fa-css-prefix}-spin-reverse {
--#{$fa-css-prefix}-animation-direction: reverse;
}
.#{$fa-css-prefix}-pulse,
.#{$fa-css-prefix}-spin-pulse {
animation-name: #{$fa-css-prefix}-spin;
animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal);
animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s);
animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite);
animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, steps(8));
}
// if agent or operating system prefers reduced motion, disable animations
// see: https://www.smashingmagazine.com/2020/09/design-reduced-motion-sensitivities/
// see: https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion
@media (prefers-reduced-motion: reduce) {
.#{$fa-css-prefix}-beat,
.#{$fa-css-prefix}-bounce,
.#{$fa-css-prefix}-fade,
.#{$fa-css-prefix}-beat-fade,
.#{$fa-css-prefix}-flip,
.#{$fa-css-prefix}-pulse,
.#{$fa-css-prefix}-shake,
.#{$fa-css-prefix}-spin,
.#{$fa-css-prefix}-spin-pulse {
animation-delay: -1ms;
animation-duration: 1ms;
animation-iteration-count: 1;
transition-delay: 0s;
transition-duration: 0s;
}
}
@keyframes #{$fa-css-prefix}-beat {
0%, 90% { transform: scale(1); }
45% { transform: scale(var(--#{$fa-css-prefix}-beat-scale, 1.25)); }
}
@keyframes #{$fa-css-prefix}-bounce {
0% { transform: scale(1,1) translateY(0); }
10% { transform: scale(var(--#{$fa-css-prefix}-bounce-start-scale-x, 1.1),var(--#{$fa-css-prefix}-bounce-start-scale-y, 0.9)) translateY(0); }
30% { transform: scale(var(--#{$fa-css-prefix}-bounce-jump-scale-x, 0.9),var(--#{$fa-css-prefix}-bounce-jump-scale-y, 1.1)) translateY(var(--#{$fa-css-prefix}-bounce-height, -0.5em)); }
50% { transform: scale(var(--#{$fa-css-prefix}-bounce-land-scale-x, 1.05),var(--#{$fa-css-prefix}-bounce-land-scale-y, 0.95)) translateY(0); }
57% { transform: scale(1,1) translateY(var(--#{$fa-css-prefix}-bounce-rebound, -0.125em)); }
64% { transform: scale(1,1) translateY(0); }
100% { transform: scale(1,1) translateY(0); }
}
@keyframes #{$fa-css-prefix}-fade {
50% { opacity: var(--#{$fa-css-prefix}-fade-opacity, 0.4); }
}
@keyframes #{$fa-css-prefix}-beat-fade {
0%, 100% {
opacity: var(--#{$fa-css-prefix}-beat-fade-opacity, 0.4);
transform: scale(1);
}
50% {
opacity: 1;
transform: scale(var(--#{$fa-css-prefix}-beat-fade-scale, 1.125));
}
}
@keyframes #{$fa-css-prefix}-flip {
50% {
transform: rotate3d(var(--#{$fa-css-prefix}-flip-x, 0), var(--#{$fa-css-prefix}-flip-y, 1), var(--#{$fa-css-prefix}-flip-z, 0), var(--#{$fa-css-prefix}-flip-angle, -180deg));
}
}
@keyframes #{$fa-css-prefix}-shake {
0% { transform: rotate(-15deg); }
4% { transform: rotate(15deg); }
8%, 24% { transform: rotate(-18deg); }
12%, 28% { transform: rotate(18deg); }
16% { transform: rotate(-22deg); }
20% { transform: rotate(22deg); }
32% { transform: rotate(-12deg); }
36% { transform: rotate(12deg); }
40%, 100% { transform: rotate(0deg); }
}
@keyframes #{$fa-css-prefix}-spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}

View File

@@ -0,0 +1,20 @@
// bordered + pulled icons
// -------------------------
.#{$fa-css-prefix}-border {
border-color: var(--#{$fa-css-prefix}-border-color, #{$fa-border-color});
border-radius: var(--#{$fa-css-prefix}-border-radius, #{$fa-border-radius});
border-style: var(--#{$fa-css-prefix}-border-style, #{$fa-border-style});
border-width: var(--#{$fa-css-prefix}-border-width, #{$fa-border-width});
padding: var(--#{$fa-css-prefix}-border-padding, #{$fa-border-padding});
}
.#{$fa-css-prefix}-pull-left {
float: left;
margin-right: var(--#{$fa-css-prefix}-pull-margin, #{$fa-pull-margin});
}
.#{$fa-css-prefix}-pull-right {
float: right;
margin-left: var(--#{$fa-css-prefix}-pull-margin, #{$fa-pull-margin});
}

View File

@@ -0,0 +1,43 @@
// base icon class definition
// -------------------------
.#{$fa-css-prefix} {
font-family: var(--#{$fa-css-prefix}-style-family, '#{$fa-style-family}');
font-weight: var(--#{$fa-css-prefix}-style, #{$fa-style});
}
.#{$fa-css-prefix}-solid,
.#{$fa-css-prefix}-regular,
.#{$fa-css-prefix}-brands,
.fas,
.far,
.fab,
.#{$fa-css-prefix}-sharp-solid,
.#{$fa-css-prefix}-classic,
.#{$fa-css-prefix} {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
display: var(--#{$fa-css-prefix}-display, #{$fa-display});
font-style: normal;
font-variant: normal;
line-height: 1;
text-rendering: auto;
}
.fas,
.#{$fa-css-prefix}-classic,
.#{$fa-css-prefix}-solid,
.far,
.#{$fa-css-prefix}-regular {
font-family: 'Font Awesome 6 Free';
}
.fab,
.#{$fa-css-prefix}-brands {
font-family: 'Font Awesome 6 Brands';
}
%fa-icon {
@include fa-icon;
}

View File

@@ -0,0 +1,7 @@
// fixed-width icons
// -------------------------
.#{$fa-css-prefix}-fw {
text-align: center;
width: $fa-fw-width;
}

View File

@@ -0,0 +1,57 @@
// functions
// --------------------------
// fa-content: convenience function used to set content property
@function fa-content($fa-var) {
@return unquote("\"#{ $fa-var }\"");
}
// fa-divide: Originally obtained from the Bootstrap https://github.com/twbs/bootstrap
//
// Licensed under: The MIT License (MIT)
//
// Copyright (c) 2011-2021 Twitter, Inc.
// Copyright (c) 2011-2021 The Bootstrap Authors
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
@function fa-divide($dividend, $divisor, $precision: 10) {
$sign: if($dividend > 0 and $divisor > 0, 1, -1);
$dividend: abs($dividend);
$divisor: abs($divisor);
$quotient: 0;
$remainder: $dividend;
@if $dividend == 0 {
@return 0;
}
@if $divisor == 0 {
@error "Cannot divide by 0";
}
@if $divisor == 1 {
@return $dividend;
}
@while $remainder >= $divisor {
$quotient: $quotient + 1;
$remainder: $remainder - $divisor;
}
@if $remainder > 0 and $precision > 0 {
$remainder: fa-divide($remainder * 10, $divisor, $precision - 1) * .1;
}
@return ($quotient + $remainder) * $sign;
}

View File

@@ -0,0 +1,10 @@
// specific icon class definition
// -------------------------
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
readers do not read off random characters that represent icons */
@each $name, $icon in $fa-icons {
.#{$fa-css-prefix}-#{$name}::before { content: unquote("\"#{ $icon }\""); }
}

View File

@@ -0,0 +1,18 @@
// icons in a list
// -------------------------
.#{$fa-css-prefix}-ul {
list-style-type: none;
margin-left: var(--#{$fa-css-prefix}-li-margin, #{$fa-li-margin});
padding-left: 0;
> li { position: relative; }
}
.#{$fa-css-prefix}-li {
left: calc(-1 * var(--#{$fa-css-prefix}-li-width, #{$fa-li-width}));
position: absolute;
text-align: center;
width: var(--#{$fa-css-prefix}-li-width, #{$fa-li-width});
line-height: inherit;
}

View File

@@ -0,0 +1,72 @@
// mixins
// --------------------------
// base rendering for an icon
@mixin fa-icon {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
display: inline-block;
font-style: normal;
font-variant: normal;
font-weight: normal;
line-height: 1;
}
// sets relative font-sizing and alignment (in _sizing)
@mixin fa-size ($font-size) {
font-size: fa-divide($font-size, $fa-size-scale-base) * 1em; // converts step in sizing scale into an em-based value that's relative to the scale's base
line-height: fa-divide(1, $font-size) * 1em; // sets the line-height of the icon back to that of it's parent
vertical-align: (fa-divide(6, $font-size) - fa-divide(3, 8)) * 1em; // vertically centers the icon taking into account the surrounding text's descender
}
// only display content to screen readers
// see: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/
// see: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/
@mixin fa-sr-only() {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
// use in conjunction with .sr-only to only display content when it's focused
@mixin fa-sr-only-focusable() {
&:not(:focus) {
@include fa-sr-only();
}
}
// sets a specific icon family to use alongside style + icon mixins
// convenience mixins for declaring pseudo-elements by CSS variable,
// including all style-specific font properties, and both the ::before
// and ::after elements in the duotone case.
@mixin fa-icon-solid($fa-var) {
@extend %fa-icon;
@extend .fa-solid;
&::before {
content: unquote("\"#{ $fa-var }\"");
}
}
@mixin fa-icon-regular($fa-var) {
@extend %fa-icon;
@extend .fa-regular;
&::before {
content: unquote("\"#{ $fa-var }\"");
}
}
@mixin fa-icon-brands($fa-var) {
@extend %fa-icon;
@extend .fa-brands;
&::before {
content: unquote("\"#{ $fa-var }\"");
}
}

Some files were not shown because too many files have changed in this diff Show More