sbuilder-mcp 0.18.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/CHANGELOG.vi.md +19 -0
- package/dist/catalog/icons.generated.js +17 -0
- package/dist/catalog/shapes.generated.js +1 -1
- package/dist/catalog/storepages.generated.js +0 -1
- package/dist/domains/site/importmap.js +72 -0
- package/dist/domains/site/readiness-fetch.js +7 -0
- package/dist/domains/site/readiness.js +56 -3
- package/dist/vision/capture.js +102 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,25 @@ All notable changes to this project are documented in this file.
|
|
|
6
6
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
7
7
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
8
8
|
|
|
9
|
+
## [0.20.0] - 2026-09-10
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
- sb_review now reports a `siteChrome` gap when a site has two or more pages and no global section, so each page is carrying its own header and footer with no way to change the menu in one place.
|
|
13
|
+
- sb_review now reports a `cartCount` gap when something opens the cart but no `cart-count` element shows what is in it, since a shopper who adds an item otherwise sees a toast fade with no lasting sign their basket is not empty.
|
|
14
|
+
|
|
15
|
+
## [0.19.0] - 2026-09-10
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- sb_import and sb_import_site can now turn a source page's `<svg>` into an `icon` element, looking up the name the page itself uses (a sprite reference, an `aria-label`, a `<title>`, an icon-set class) against the platform's own 3,227-icon vocabulary and skipping it rather than guessing when no name matches.
|
|
19
|
+
- sb_import and sb_import_site can now turn one or more consecutive `<details>` elements into a single `accordion`, with each `<details>` becoming one `accordion-content` item labeled from its `<summary>`.
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
- sb_import and sb_import_site no longer miss every `<svg>` icon on a page: `tagName` reports `"svg"` in lowercase, which never matched the capture's ignore list, and reading an SVG element's `class` attribute through `.className` returned the literal string `"[object SVGAnimatedString]"` instead of the class list.
|
|
23
|
+
- sb_import and sb_import_site now expand a collapsed `<details>` before measuring it, so an FAQ section no longer imports as a list of questions with no answers.
|
|
24
|
+
|
|
25
|
+
### Internal
|
|
26
|
+
- The generated catalog gained an icon-name table (`icons.generated.ts`, 3,227 RemixIcon ids read from the platform's own manifest) that the importer's icon lookup is checked against.
|
|
27
|
+
|
|
9
28
|
## [0.18.0] - 2026-09-10
|
|
10
29
|
|
|
11
30
|
### Added
|
package/CHANGELOG.vi.md
CHANGED
|
@@ -6,6 +6,25 @@ Mọi thay đổi đáng chú ý của dự án được ghi lại trong file n
|
|
|
6
6
|
Định dạng dựa trên [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
7
7
|
và dự án tuân theo [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
8
8
|
|
|
9
|
+
## [0.20.0] - 2026-09-10
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
- sb_review giờ báo gap `siteChrome` khi một site có từ hai trang trở lên mà không có global section nào, nghĩa là mỗi trang đang tự mang header và footer riêng, không có cách nào đổi menu ở một chỗ duy nhất.
|
|
13
|
+
- sb_review giờ báo gap `cartCount` khi có thứ mở được giỏ hàng nhưng không có element `cart-count` nào cho thấy trong giỏ có gì, vì khách thêm hàng vào giỏ chỉ thấy một toast tắt đi mà không còn dấu hiệu lâu dài nào cho thấy giỏ không rỗng.
|
|
14
|
+
|
|
15
|
+
## [0.19.0] - 2026-09-10
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- sb_import và sb_import_site giờ có thể biến một `<svg>` trên trang nguồn thành element `icon`, bằng cách tra cứu tên mà trang tự sử dụng (một sprite reference, một `aria-label`, một `<title>`, một class của icon set) đối chiếu với vocabulary 3.227 icon của chính nền tảng, và bỏ qua thay vì đoán khi không có tên nào khớp.
|
|
19
|
+
- sb_import và sb_import_site giờ có thể biến một hoặc nhiều `<details>` liên tiếp thành một `accordion` duy nhất, mỗi `<details>` trở thành một item `accordion-content` được gắn nhãn từ `<summary>` của nó.
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
- sb_import và sb_import_site giờ không còn bỏ lỡ mọi icon `<svg>` trên trang: `tagName` báo `"svg"` bằng chữ thường, nên trước đây không bao giờ khớp với ignore list của bước capture, và việc đọc thuộc tính `class` của một element SVG qua `.className` trả về đúng chuỗi ký tự `"[object SVGAnimatedString]"` thay vì danh sách class.
|
|
23
|
+
- sb_import và sb_import_site giờ mở một `<details>` đang thu gọn trước khi đo, để một mục FAQ không còn bị import thành danh sách câu hỏi mà không có câu trả lời.
|
|
24
|
+
|
|
25
|
+
### Internal
|
|
26
|
+
- Catalog được sinh ra giờ có thêm bảng tên icon (`icons.generated.ts`, 3.227 id RemixIcon đọc từ manifest của chính nền tảng), dùng để đối chiếu với bước tra cứu icon của importer.
|
|
27
|
+
|
|
9
28
|
## [0.18.0] - 2026-09-10
|
|
10
29
|
|
|
11
30
|
### Added
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// GENERATED by scripts/gen-catalog.ts — do not edit by hand.
|
|
2
|
+
// Source: <WB_REPO>/schema/src/iconManifest.json (the RemixIcon catalog the
|
|
3
|
+
// editor's picker and the Go renderer share).
|
|
4
|
+
export const ICON_SOURCE = {
|
|
5
|
+
"names": 3227,
|
|
6
|
+
"default": "StarFill"
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Every icon name this platform can render.
|
|
10
|
+
*
|
|
11
|
+
* A LOOKUP, not a suggestion list. `sb_import` reads a name off a source page's
|
|
12
|
+
* `<svg>` — an aria-label, a `<use href="#icon-search">`, a `ri-search-line`
|
|
13
|
+
* class — and may only emit an `icon` when the name it derived is IN here. A
|
|
14
|
+
* name that is not renders nothing, which is worse than the `<svg>` being
|
|
15
|
+
* skipped, because the page then carries an empty box nobody put there.
|
|
16
|
+
*/
|
|
17
|
+
export const ICON_NAMES = new Set(["24HoursFill", "24HoursLine", "4kFill", "4kLine", "AB", "AccessibilityFill", "AccessibilityLine", "AccountBox2Fill", "AccountBox2Line", "AccountBoxFill", "AccountBoxLine", "AccountCircle2Fill", "AccountCircle2Line", "AccountCircleFill", "AccountCircleLine", "AccountPinBoxFill", "AccountPinBoxLine", "AccountPinCircleFill", "AccountPinCircleLine", "AddBoxFill", "AddBoxLine", "AddCircleFill", "AddCircleLine", "AddFill", "AddLargeFill", "AddLargeLine", "AddLine", "AdminFill", "AdminLine", "AdvertisementFill", "AdvertisementLine", "AedElectrodesFill", "AedElectrodesLine", "AedFill", "AedLine", "Ai", "AiAgentFill", "AiAgentLine", "AiGenerate", "AiGenerate2", "AiGenerate2Fill", "AiGenerate2Line", "AiGenerate3dFill", "AiGenerate3dLine", "AiGenerateText", "AirplayFill", "AirplayLine", "AlarmAddFill", "AlarmAddLine", "AlarmFill", "AlarmLine", "AlarmSnoozeFill", "AlarmSnoozeLine", "AlarmWarningFill", "AlarmWarningLine", "AlbumFill", "AlbumLine", "AlertFill", "AlertLine", "AlibabaCloudFill", "AlibabaCloudLine", "AliensFill", "AliensLine", "AlignBottom", "AlignCenter", "AlignItemBottomFill", "AlignItemBottomLine", "AlignItemHorizontalCenterFill", "AlignItemHorizontalCenterLine", "AlignItemLeftFill", "AlignItemLeftLine", "AlignItemRightFill", "AlignItemRightLine", "AlignItemTopFill", "AlignItemTopLine", "AlignItemVerticalCenterFill", "AlignItemVerticalCenterLine", "AlignJustify", "AlignLeft", "AlignRight", "AlignTop", "AlignVertically", "AlipayFill", "AlipayLine", "AmazonFill", "AmazonLine", "AnchorFill", "AnchorLine", "AncientGateFill", "AncientGateLine", "AncientPavilionFill", "AncientPavilionLine", "AndroidFill", "AndroidLine", "AngularjsFill", "AngularjsLine", "AnthropicFill", "AnthropicLine", "Anticlockwise2Fill", "Anticlockwise2Line", "AnticlockwiseFill", "AnticlockwiseLine", "AppStoreFill", "AppStoreLine", "AppleFill", "AppleLine", "Apps2AddFill", "Apps2AddLine", "Apps2AiFill", "Apps2AiLine", "Apps2Fill", "Apps2Line", "AppsAiFill", "AppsAiLine", "AppsFill", "AppsLine", "Archive2Fill", "Archive2Line", "ArchiveDrawerFill", "ArchiveDrawerLine", "ArchiveFill", "ArchiveLine", "ArchiveStackFill", "ArchiveStackLine", "AreaChartFill", "AreaChartLine", "ArmchairFill", "ArmchairLine", "ArrowDownBoxFill", "ArrowDownBoxLine", "ArrowDownCircleFill", "ArrowDownCircleLine", "ArrowDownDoubleFill", "ArrowDownDoubleLine", "ArrowDownFill", "ArrowDownLine", "ArrowDownLongFill", "ArrowDownLongLine", "ArrowDownSFill", "ArrowDownSLine", "ArrowDownWideFill", "ArrowDownWideLine", "ArrowDropDownFill", "ArrowDropDownLine", "ArrowDropLeftFill", "ArrowDropLeftLine", "ArrowDropRightFill", "ArrowDropRightLine", "ArrowDropUpFill", "ArrowDropUpLine", "ArrowGoBackFill", "ArrowGoBackLine", "ArrowGoForwardFill", "ArrowGoForwardLine", "ArrowLeftBoxFill", "ArrowLeftBoxLine", "ArrowLeftCircleFill", "ArrowLeftCircleLine", "ArrowLeftDoubleFill", "ArrowLeftDoubleLine", "ArrowLeftDownBoxFill", "ArrowLeftDownBoxLine", "ArrowLeftDownFill", "ArrowLeftDownLine", "ArrowLeftDownLongFill", "ArrowLeftDownLongLine", "ArrowLeftFill", "ArrowLeftLine", "ArrowLeftLongFill", "ArrowLeftLongLine", "ArrowLeftRightFill", "ArrowLeftRightLine", "ArrowLeftSFill", "ArrowLeftSLine", "ArrowLeftUpBoxFill", "ArrowLeftUpBoxLine", "ArrowLeftUpFill", "ArrowLeftUpLine", "ArrowLeftUpLongFill", "ArrowLeftUpLongLine", "ArrowLeftWideFill", "ArrowLeftWideLine", "ArrowRightBoxFill", "ArrowRightBoxLine", "ArrowRightCircleFill", "ArrowRightCircleLine", "ArrowRightDoubleFill", "ArrowRightDoubleLine", "ArrowRightDownBoxFill", "ArrowRightDownBoxLine", "ArrowRightDownFill", "ArrowRightDownLine", "ArrowRightDownLongFill", "ArrowRightDownLongLine", "ArrowRightFill", "ArrowRightLine", "ArrowRightLongFill", "ArrowRightLongLine", "ArrowRightSFill", "ArrowRightSLine", "ArrowRightUpBoxFill", "ArrowRightUpBoxLine", "ArrowRightUpFill", "ArrowRightUpLine", "ArrowRightUpLongFill", "ArrowRightUpLongLine", "ArrowRightWideFill", "ArrowRightWideLine", "ArrowTurnBackFill", "ArrowTurnBackLine", "ArrowTurnForwardFill", "ArrowTurnForwardLine", "ArrowUpBoxFill", "ArrowUpBoxLine", "ArrowUpCircleFill", "ArrowUpCircleLine", "ArrowUpDoubleFill", "ArrowUpDoubleLine", "ArrowUpDownFill", "ArrowUpDownLine", "ArrowUpFill", "ArrowUpLine", "ArrowUpLongFill", "ArrowUpLongLine", "ArrowUpSFill", "ArrowUpSLine", "ArrowUpWideFill", "ArrowUpWideLine", "Artboard2Fill", "Artboard2Line", "ArtboardFill", "ArtboardLine", "ArticleFill", "ArticleLine", "AspectRatioFill", "AspectRatioLine", "Asterisk", "AtFill", "AtLine", "AtomFill", "AtomLine", "Attachment2", "AttachmentFill", "AttachmentLine", "AuctionFill", "AuctionLine", "AwardFill", "AwardLine", "BaiduFill", "BaiduLine", "BallPenFill", "BallPenLine", "BankCard2Fill", "BankCard2Line", "BankCardFill", "BankCardLine", "BankFill", "BankLine", "BarChart2Fill", "BarChart2Line", "BarChartBoxAiFill", "BarChartBoxAiLine", "BarChartBoxFill", "BarChartBoxLine", "BarChartFill", "BarChartGroupedFill", "BarChartGroupedLine", "BarChartHorizontalFill", "BarChartHorizontalLine", "BarChartLine", "BarcodeBoxFill", "BarcodeBoxLine", "BarcodeFill", "BarcodeLine", "BardFill", "BardLine", "BarricadeFill", "BarricadeLine", "BaseStationFill", "BaseStationLine", "BaseballFill", "BaseballLine", "BasketballFill", "BasketballLine", "Battery2ChargeFill", "Battery2ChargeLine", "Battery2Fill", "Battery2Line", "BatteryChargeFill", "BatteryChargeLine", "BatteryFill", "BatteryLine", "BatteryLowFill", "BatteryLowLine", "BatterySaverFill", "BatterySaverLine", "BatteryShareFill", "BatteryShareLine", "BearSmileFill", "BearSmileLine", "BeerFill", "BeerLine", "BehanceFill", "BehanceLine", "BellFill", "BellLine", "BikeFill", "BikeLine", "BilibiliFill", "BilibiliLine", "BillFill", "BillLine", "BilliardsFill", "BilliardsLine", "BinocularsFill", "BinocularsLine", "BitCoinFill", "BitCoinLine", "BlazeFill", "BlazeLine", "BlenderFill", "BlenderLine", "BloggerFill", "BloggerLine", "BlueskyFill", "BlueskyLine", "BluetoothConnectFill", "BluetoothConnectLine", "BluetoothFill", "BluetoothLine", "BlurOffFill", "BlurOffLine", "BnbFill", "BnbLine", "BodyScanFill", "BodyScanLine", "Bold", "Book2Fill", "Book2Line", "Book3Fill", "Book3Line", "BookAiFill", "BookAiLine", "BookFill", "BookLine", "BookMarkedFill", "BookMarkedLine", "BookOpenFill", "BookOpenLine", "BookReadFill", "BookReadLine", "BookShelfFill", "BookShelfLine", "BookletFill", "BookletLine", "Bookmark2Fill", "Bookmark2Line", "Bookmark3Fill", "Bookmark3Line", "BookmarkFill", "BookmarkLine", "BootstrapFill", "BootstrapLine", "BowlFill", "BowlLine", "Box1Fill", "Box1Line", "Box2Fill", "Box2Line", "Box3Fill", "Box3Line", "BoxingFill", "BoxingLine", "BracesFill", "BracesLine", "BracketsFill", "BracketsLine", "Brain2Fill", "Brain2Line", "Brain3Fill", "Brain3Line", "Brain4Fill", "Brain4Line", "BrainAi3Fill", "BrainAi3Line", "BrainFill", "BrainLine", "BreadFill", "BreadLine", "Briefcase2Fill", "Briefcase2Line", "Briefcase3Fill", "Briefcase3Line", "Briefcase4Fill", "Briefcase4Line", "Briefcase5Fill", "Briefcase5Line", "BriefcaseFill", "BriefcaseLine", "BringForward", "BringToFront", "BroadcastFill", "BroadcastLine", "Brush2Fill", "Brush2Line", "Brush3Fill", "Brush3Line", "Brush4Fill", "Brush4Line", "BrushAi3Fill", "BrushAi3Line", "BrushAiFill", "BrushAiLine", "BrushFill", "BrushLine", "BtcFill", "BtcLine", "BubbleChartFill", "BubbleChartLine", "Bug2Fill", "Bug2Line", "BugFill", "BugLine", "Building2Fill", "Building2Line", "Building3Fill", "Building3Line", "Building4Fill", "Building4Line", "BuildingFill", "BuildingLine", "Bus2Fill", "Bus2Line", "BusFill", "BusLine", "BusWifiFill", "BusWifiLine", "CactusFill", "CactusLine", "Cake2Fill", "Cake2Line", "Cake3Fill", "Cake3Line", "CakeFill", "CakeLine", "CalculatorFill", "CalculatorLine", "Calendar2Fill", "Calendar2Line", "CalendarCheckFill", "CalendarCheckLine", "CalendarCloseFill", "CalendarCloseLine", "CalendarEventFill", "CalendarEventLine", "CalendarFill", "CalendarLine", "CalendarScheduleFill", "CalendarScheduleLine", "CalendarTodoFill", "CalendarTodoLine", "CalendarView", "Camera2Fill", "Camera2Line", "Camera3Fill", "Camera3Line", "Camera4Fill", "Camera4Line", "CameraAi2Fill", "CameraAi2Line", "CameraAiFill", "CameraAiLine", "CameraFill", "CameraLensAiFill", "CameraLensAiLine", "CameraLensFill", "CameraLensLine", "CameraLine", "CameraOffFill", "CameraOffLine", "CameraSwitchFill", "CameraSwitchLine", "CandleFill", "CandleLine", "CapsuleFill", "CapsuleLine", "CarFill", "CarLine", "CarWashingFill", "CarWashingLine", "CaravanFill", "CaravanLine", "CarouselView", "CashFill", "CashLine", "CastFill", "CastLine", "CellphoneFill", "CellphoneLine", "CelsiusFill", "CelsiusLine", "CentosFill", "CentosLine", "Certificate2Fill", "Certificate2Line", "CertificateFill", "CertificateLine", "CharacterRecognitionFill", "CharacterRecognitionLine", "ChargingPile2Fill", "ChargingPile2Line", "ChargingPileFill", "ChargingPileLine", "Chat1Fill", "Chat1Line", "Chat2Fill", "Chat2Line", "Chat3Fill", "Chat3Line", "Chat4Fill", "Chat4Line", "ChatAi2Fill", "ChatAi2Line", "ChatAi3Fill", "ChatAi3Line", "ChatAi4Fill", "ChatAi4Line", "ChatAiFill", "ChatAiLine", "ChatCheckFill", "ChatCheckLine", "ChatDeleteFill", "ChatDeleteLine", "ChatDownloadFill", "ChatDownloadLine", "ChatFollowUpFill", "ChatFollowUpLine", "ChatForwardFill", "ChatForwardLine", "ChatHeartFill", "ChatHeartLine", "ChatHistoryFill", "ChatHistoryLine", "ChatNewFill", "ChatNewLine", "ChatOffFill", "ChatOffLine", "ChatPollFill", "ChatPollLine", "ChatPrivateFill", "ChatPrivateLine", "ChatQuoteFill", "ChatQuoteLine", "ChatSearchFill", "ChatSearchLine", "ChatSettingsFill", "ChatSettingsLine", "ChatSmile2Fill", "ChatSmile2Line", "ChatSmile3Fill", "ChatSmile3Line", "ChatSmileAi3Fill", "ChatSmileAi3Line", "ChatSmileAiFill", "ChatSmileAiLine", "ChatSmileFill", "ChatSmileLine", "ChatThreadFill", "ChatThreadLine", "ChatUnreadFill", "ChatUnreadLine", "ChatUploadFill", "ChatUploadLine", "ChatVoiceAiFill", "ChatVoiceAiLine", "ChatVoiceFill", "ChatVoiceLine", "CheckDoubleFill", "CheckDoubleLine", "CheckFill", "CheckLine", "CheckboxBlankCircleFill", "CheckboxBlankCircleLine", "CheckboxBlankFill", "CheckboxBlankLine", "CheckboxCircleFill", "CheckboxCircleLine", "CheckboxFill", "CheckboxIndeterminateFill", "CheckboxIndeterminateLine", "CheckboxLine", "CheckboxMultipleBlankFill", "CheckboxMultipleBlankLine", "CheckboxMultipleFill", "CheckboxMultipleLine", "ChessFill", "ChessLine", "ChinaRailwayFill", "ChinaRailwayLine", "ChromeFill", "ChromeLine", "CircleFill", "CircleLine", "ClapperboardAiFill", "ClapperboardAiLine", "ClapperboardFill", "ClapperboardLine", "ClaudeFill", "ClaudeLine", "ClipboardFill", "ClipboardLine", "Clockwise2Fill", "Clockwise2Line", "ClockwiseFill", "ClockwiseLine", "CloseCircleFill", "CloseCircleLine", "CloseFill", "CloseLargeFill", "CloseLargeLine", "CloseLine", "ClosedCaptioningAiFill", "ClosedCaptioningAiLine", "ClosedCaptioningFill", "ClosedCaptioningLine", "CloudFill", "CloudLine", "CloudOffFill", "CloudOffLine", "CloudWindyFill", "CloudWindyLine", "Cloudy2Fill", "Cloudy2Line", "CloudyFill", "CloudyLine", "CodeAiFill", "CodeAiLine", "CodeBlock", "CodeBoxFill", "CodeBoxLine", "CodeFill", "CodeLine", "CodeSFill", "CodeSLine", "CodeSSlashFill", "CodeSSlashLine", "CodeView", "CodepenFill", "CodepenLine", "CoinFill", "CoinLine", "CoinsFill", "CoinsLine", "CollageFill", "CollageLine", "CollapseDiagonal2Fill", "CollapseDiagonal2Line", "CollapseDiagonalFill", "CollapseDiagonalLine", "CollapseHorizontalFill", "CollapseHorizontalLine", "CollapseVerticalFill", "CollapseVerticalLine", "ColorFilterAiFill", "ColorFilterAiLine", "ColorFilterFill", "ColorFilterLine", "CommandFill", "CommandLine", "CommunityFill", "CommunityLine", "Compass2Fill", "Compass2Line", "Compass3Fill", "Compass3Line", "Compass4Fill", "Compass4Line", "CompassDiscoverFill", "CompassDiscoverLine", "CompassFill", "CompassLine", "Compasses2Fill", "Compasses2Line", "CompassesFill", "CompassesLine", "ComputerFill", "ComputerLine", "ContactsBook2Fill", "ContactsBook2Line", "ContactsBook3Fill", "ContactsBook3Line", "ContactsBookFill", "ContactsBookLine", "ContactsBookUploadFill", "ContactsBookUploadLine", "ContactsFill", "ContactsLine", "ContractFill", "ContractLeftFill", "ContractLeftLine", "ContractLeftRightFill", "ContractLeftRightLine", "ContractLine", "ContractRightFill", "ContractRightLine", "ContractUpDownFill", "ContractUpDownLine", "Contrast2Fill", "Contrast2Line", "ContrastDrop2Fill", "ContrastDrop2Line", "ContrastDropFill", "ContrastDropLine", "ContrastFill", "ContrastLine", "CookieFill", "CookieLine", "CopilotFill", "CopilotLine", "CopperCoinFill", "CopperCoinLine", "CopperDiamondFill", "CopperDiamondLine", "CopyleftFill", "CopyleftLine", "CopyrightFill", "CopyrightLine", "CoreosFill", "CoreosLine", "CornerDownLeftFill", "CornerDownLeftLine", "CornerDownRightFill", "CornerDownRightLine", "CornerLeftDownFill", "CornerLeftDownLine", "CornerLeftUpFill", "CornerLeftUpLine", "CornerRightDownFill", "CornerRightDownLine", "CornerRightUpFill", "CornerRightUpLine", "CornerUpLeftDoubleFill", "CornerUpLeftDoubleLine", "CornerUpLeftFill", "CornerUpLeftLine", "CornerUpRightDoubleFill", "CornerUpRightDoubleLine", "CornerUpRightFill", "CornerUpRightLine", "Coupon2Fill", "Coupon2Line", "Coupon3Fill", "Coupon3Line", "Coupon4Fill", "Coupon4Line", "Coupon5Fill", "Coupon5Line", "CouponFill", "CouponLine", "CpuFill", "CpuLine", "CreativeCommonsByFill", "CreativeCommonsByLine", "CreativeCommonsFill", "CreativeCommonsLine", "CreativeCommonsNcFill", "CreativeCommonsNcLine", "CreativeCommonsNdFill", "CreativeCommonsNdLine", "CreativeCommonsSaFill", "CreativeCommonsSaLine", "CreativeCommonsZeroFill", "CreativeCommonsZeroLine", "CriminalFill", "CriminalLine", "Crop2Fill", "Crop2Line", "CropFill", "CropLine", "CrossFill", "CrossLine", "Crosshair2Fill", "Crosshair2Line", "CrosshairFill", "CrosshairLine", "Css3Fill", "Css3Line", "CupFill", "CupLine", "CurrencyFill", "CurrencyLine", "CursorAiFill", "CursorAiLine", "CursorFill", "CursorHand", "CursorLine", "CustomSize", "CustomerService2Fill", "CustomerService2Line", "CustomerServiceFill", "CustomerServiceLine", "Dashboard2Fill", "Dashboard2Line", "Dashboard3Fill", "Dashboard3Line", "DashboardFill", "DashboardHorizontalFill", "DashboardHorizontalLine", "DashboardLine", "Database2Fill", "Database2Line", "DatabaseFill", "DatabaseLine", "DeepseekFill", "DeepseekLine", "DeleteBack2Fill", "DeleteBack2Line", "DeleteBackFill", "DeleteBackLine", "DeleteBin2Fill", "DeleteBin2Line", "DeleteBin3Fill", "DeleteBin3Line", "DeleteBin4Fill", "DeleteBin4Line", "DeleteBin5Fill", "DeleteBin5Line", "DeleteBin6Fill", "DeleteBin6Line", "DeleteBin7Fill", "DeleteBin7Line", "DeleteBinFill", "DeleteBinLine", "DeleteColumn", "DeleteRow", "DeviceFill", "DeviceLine", "DeviceRecoverFill", "DeviceRecoverLine", "DiamondFill", "DiamondLine", "DiamondRingFill", "DiamondRingLine", "Dice1Fill", "Dice1Line", "Dice2Fill", "Dice2Line", "Dice3Fill", "Dice3Line", "Dice4Fill", "Dice4Line", "Dice5Fill", "Dice5Line", "Dice6Fill", "Dice6Line", "DiceFill", "DiceLine", "DingdingFill", "DingdingLine", "DirectionFill", "DirectionLine", "DiscFill", "DiscLine", "DiscordFill", "DiscordLine", "DiscountPercentFill", "DiscountPercentLine", "DiscussFill", "DiscussLine", "DislikeFill", "DislikeLine", "DisqusFill", "DisqusLine", "DivideFill", "DivideLine", "DnaFill", "DnaLine", "DonutChartFill", "DonutChartLine", "DoorClosedFill", "DoorClosedLine", "DoorFill", "DoorLine", "DoorLockBoxFill", "DoorLockBoxLine", "DoorLockFill", "DoorLockLine", "DoorOpenFill", "DoorOpenLine", "DossierFill", "DossierLine", "DoubanFill", "DoubanLine", "DoubleQuotesL", "DoubleQuotesR", "Download2Fill", "Download2Line", "DownloadCloud2Fill", "DownloadCloud2Line", "DownloadCloudFill", "DownloadCloudLine", "DownloadFill", "DownloadLine", "DraftFill", "DraftLine", "DragDropFill", "DragDropLine", "DragMove2Fill", "DragMove2Line", "DragMoveFill", "DragMoveLine", "Draggable", "DrawFill", "DrawLine", "DribbbleFill", "DribbbleLine", "Drinks2Fill", "Drinks2Line", "DrinksFill", "DrinksLine", "DriveFill", "DriveLine", "DrizzleFill", "DrizzleLine", "DropFill", "DropLine", "DropboxFill", "DropboxLine", "DropdownList", "DropperFill", "DropperLine", "DualSim1Fill", "DualSim1Line", "DualSim2Fill", "DualSim2Line", "DvFill", "DvLine", "DvdAiFill", "DvdAiLine", "DvdFill", "DvdLine", "EBike2Fill", "EBike2Line", "EBikeFill", "EBikeLine", "EarthFill", "EarthLine", "EarthquakeFill", "EarthquakeLine", "EdgeFill", "EdgeLine", "EdgeNewFill", "EdgeNewLine", "Edit2Fill", "Edit2Line", "EditBoxFill", "EditBoxLine", "EditCircleFill", "EditCircleLine", "EditFill", "EditLine", "EjectFill", "EjectLine", "EmojiStickerFill", "EmojiStickerLine", "Emotion2Fill", "Emotion2Line", "EmotionAddFill", "EmotionAddLine", "EmotionFill", "EmotionHappyFill", "EmotionHappyLine", "EmotionLaughFill", "EmotionLaughLine", "EmotionLine", "EmotionNormalFill", "EmotionNormalLine", "EmotionSadFill", "EmotionSadLine", "EmotionUnhappyFill", "EmotionUnhappyLine", "EmpathizeFill", "EmpathizeLine", "Emphasis", "EmphasisCn", "EnglishInput", "EqualFill", "EqualLine", "Equalizer2Fill", "Equalizer2Line", "Equalizer3Fill", "Equalizer3Line", "EqualizerFill", "EqualizerLine", "EraserFill", "EraserLine", "ErrorWarningFill", "ErrorWarningLine", "EthFill", "EthLine", "EvernoteFill", "EvernoteLine", "Exchange2Fill", "Exchange2Line", "ExchangeBoxFill", "ExchangeBoxLine", "ExchangeCnyFill", "ExchangeCnyLine", "ExchangeDollarFill", "ExchangeDollarLine", "ExchangeFill", "ExchangeFundsFill", "ExchangeFundsLine", "ExchangeLine", "ExpandDiagonal2Fill", "ExpandDiagonal2Line", "ExpandDiagonalFill", "ExpandDiagonalLine", "ExpandDiagonalS2Fill", "ExpandDiagonalS2Line", "ExpandDiagonalSFill", "ExpandDiagonalSLine", "ExpandHeightFill", "ExpandHeightLine", "ExpandHorizontalFill", "ExpandHorizontalLine", "ExpandHorizontalSFill", "ExpandHorizontalSLine", "ExpandLeftFill", "ExpandLeftLine", "ExpandLeftRightFill", "ExpandLeftRightLine", "ExpandRightFill", "ExpandRightLine", "ExpandUpDownFill", "ExpandUpDownLine", "ExpandVerticalFill", "ExpandVerticalLine", "ExpandVerticalSFill", "ExpandVerticalSLine", "ExpandWidthFill", "ExpandWidthLine", "ExportFill", "ExportLine", "ExternalLinkFill", "ExternalLinkLine", "Eye2Fill", "Eye2Line", "EyeCloseFill", "EyeCloseLine", "EyeFill", "EyeLine", "EyeOffFill", "EyeOffLine", "FacebookBoxFill", "FacebookBoxLine", "FacebookCircleFill", "FacebookCircleLine", "FacebookFill", "FacebookLine", "FahrenheitFill", "FahrenheitLine", "FediverseFill", "FediverseLine", "FeedbackFill", "FeedbackLine", "FigmaFill", "FigmaLine", "File2Fill", "File2Line", "File3Fill", "File3Line", "File4Fill", "File4Line", "FileAddFill", "FileAddLine", "FileAi2Fill", "FileAi2Line", "FileAiFill", "FileAiLine", "FileChart2Fill", "FileChart2Line", "FileChartFill", "FileChartLine", "FileCheckFill", "FileCheckLine", "FileCloseFill", "FileCloseLine", "FileCloudFill", "FileCloudLine", "FileCodeFill", "FileCodeLine", "FileCopy2Fill", "FileCopy2Line", "FileCopyFill", "FileCopyLine", "FileDamageFill", "FileDamageLine", "FileDownloadFill", "FileDownloadLine", "FileEditFill", "FileEditLine", "FileExcel2Fill", "FileExcel2Line", "FileExcelFill", "FileExcelLine", "FileFill", "FileForbidFill", "FileForbidLine", "FileGifFill", "FileGifLine", "FileHistoryFill", "FileHistoryLine", "FileHwpFill", "FileHwpLine", "FileImageFill", "FileImageLine", "FileInfoFill", "FileInfoLine", "FileLine", "FileList2Fill", "FileList2Line", "FileList3Fill", "FileList3Line", "FileListFill", "FileListLine", "FileLockFill", "FileLockLine", "FileMarkedFill", "FileMarkedLine", "FileMusicFill", "FileMusicLine", "FilePaper2Fill", "FilePaper2Line", "FilePaperFill", "FilePaperLine", "FilePdf2Fill", "FilePdf2Line", "FilePdfFill", "FilePdfLine", "FilePpt2Fill", "FilePpt2Line", "FilePptFill", "FilePptLine", "FileReduceFill", "FileReduceLine", "FileScanFill", "FileScanLine", "FileSearchFill", "FileSearchLine", "FileSettingsFill", "FileSettingsLine", "FileShield2Fill", "FileShield2Line", "FileShieldFill", "FileShieldLine", "FileShredFill", "FileShredLine", "FileTextFill", "FileTextLine", "FileTransferFill", "FileTransferLine", "FileUnknowFill", "FileUnknowLine", "FileUploadFill", "FileUploadLine", "FileUserFill", "FileUserLine", "FileVideoFill", "FileVideoLine", "FileWarningFill", "FileWarningLine", "FileWord2Fill", "FileWord2Line", "FileWordFill", "FileWordLine", "FileZipFill", "FileZipLine", "FilmAiFill", "FilmAiLine", "FilmFill", "FilmLine", "Filter2Fill", "Filter2Line", "Filter3Fill", "Filter3Line", "FilterFill", "FilterLine", "FilterOffFill", "FilterOffLine", "FindReplaceFill", "FindReplaceLine", "FinderFill", "FinderLine", "Fingerprint2Fill", "Fingerprint2Line", "FingerprintFill", "FingerprintLine", "FireFill", "FireLine", "FirebaseFill", "FirebaseLine", "FirefoxBrowserFill", "FirefoxBrowserLine", "FirefoxFill", "FirefoxLine", "FirstAidKitFill", "FirstAidKitLine", "FiverrFill", "FiverrLine", "Flag2Fill", "Flag2Line", "FlagFill", "FlagLine", "FlagOffFill", "FlagOffLine", "FlashlightFill", "FlashlightLine", "FlaskFill", "FlaskLine", "FlickrFill", "FlickrLine", "FlightLandFill", "FlightLandLine", "FlightTakeoffFill", "FlightTakeoffLine", "FlipHorizontal2Fill", "FlipHorizontal2Line", "FlipHorizontalFill", "FlipHorizontalLine", "FlipVertical2Fill", "FlipVertical2Line", "FlipVerticalFill", "FlipVerticalLine", "FloodFill", "FloodLine", "FlowChart", "FlowerFill", "FlowerLine", "FlutterFill", "FlutterLine", "Focus2Fill", "Focus2Line", "Focus3Fill", "Focus3Line", "FocusFill", "FocusLine", "FocusMode", "FoggyFill", "FoggyLine", "Folder2Fill", "Folder2Line", "Folder3Fill", "Folder3Line", "Folder4Fill", "Folder4Line", "Folder5Fill", "Folder5Line", "Folder6Fill", "Folder6Line", "FolderAddFill", "FolderAddLine", "FolderChart2Fill", "FolderChart2Line", "FolderChartFill", "FolderChartLine", "FolderCheckFill", "FolderCheckLine", "FolderCloseFill", "FolderCloseLine", "FolderCloudFill", "FolderCloudLine", "FolderDownloadFill", "FolderDownloadLine", "FolderFill", "FolderForbidFill", "FolderForbidLine", "FolderHistoryFill", "FolderHistoryLine", "FolderImageFill", "FolderImageLine", "FolderInfoFill", "FolderInfoLine", "FolderKeyholeFill", "FolderKeyholeLine", "FolderLine", "FolderLockFill", "FolderLockLine", "FolderMusicFill", "FolderMusicLine", "FolderOpenFill", "FolderOpenLine", "FolderReceivedFill", "FolderReceivedLine", "FolderReduceFill", "FolderReduceLine", "FolderSettingsFill", "FolderSettingsLine", "FolderSharedFill", "FolderSharedLine", "FolderShield2Fill", "FolderShield2Line", "FolderShieldFill", "FolderShieldLine", "FolderTransferFill", "FolderTransferLine", "FolderUnknowFill", "FolderUnknowLine", "FolderUploadFill", "FolderUploadLine", "FolderUserFill", "FolderUserLine", "FolderVideoFill", "FolderVideoLine", "FolderWarningFill", "FolderWarningLine", "FolderZipFill", "FolderZipLine", "FoldersFill", "FoldersLine", "FontColor", "FontFamily", "FontMono", "FontSansSerif", "FontSerif", "FontSize", "FontSize2", "FontSizeAi", "FootballFill", "FootballLine", "FootprintFill", "FootprintLine", "Forbid2Fill", "Forbid2Line", "ForbidFill", "ForbidLine", "FormatClear", "Formula", "Forward10Fill", "Forward10Line", "Forward15Fill", "Forward15Line", "Forward30Fill", "Forward30Line", "Forward5Fill", "Forward5Line", "ForwardEndFill", "ForwardEndLine", "ForwardEndMiniFill", "ForwardEndMiniLine", "FridgeFill", "FridgeLine", "FriendicaFill", "FriendicaLine", "FullscreenExitFill", "FullscreenExitLine", "FullscreenFill", "FullscreenLine", "FunctionAddFill", "FunctionAddLine", "FunctionAiFill", "FunctionAiLine", "FunctionFill", "FunctionLine", "Functions", "FundsBoxFill", "FundsBoxLine", "FundsFill", "FundsLine", "GalleryFill", "GalleryLine", "GalleryUploadFill", "GalleryUploadLine", "GalleryView", "GalleryView2", "Game2Fill", "Game2Line", "GameFill", "GameLine", "GamepadFill", "GamepadLine", "GasStationFill", "GasStationLine", "GatsbyFill", "GatsbyLine", "GeminiFill", "GeminiLine", "GenderlessFill", "GenderlessLine", "Ghost2Fill", "Ghost2Line", "Ghost3Fill", "Ghost3Line", "Ghost4Fill", "Ghost4Line", "GhostFill", "GhostLine", "GhostSmileFill", "GhostSmileLine", "Gift2Fill", "Gift2Line", "GiftFill", "GiftLine", "GitBranchFill", "GitBranchLine", "GitClosePullRequestFill", "GitClosePullRequestLine", "GitCommitFill", "GitCommitLine", "GitForkFill", "GitForkLine", "GitMergeFill", "GitMergeLine", "GitPrDraftFill", "GitPrDraftLine", "GitPullRequestFill", "GitPullRequestLine", "GitRepositoryCommitsFill", "GitRepositoryCommitsLine", "GitRepositoryFill", "GitRepositoryLine", "GitRepositoryPrivateFill", "GitRepositoryPrivateLine", "GitbookFill", "GitbookLine", "GiteeFill", "GiteeLine", "GithubFill", "GithubLine", "GitlabFill", "GitlabLine", "Glasses2Fill", "Glasses2Line", "GlassesFill", "GlassesLine", "GlobalFill", "GlobalLine", "GlobalOffFill", "GlobalOffLine", "GlobeFill", "GlobeLine", "Goblet2Fill", "Goblet2Line", "GobletBrokenFill", "GobletBrokenLine", "GobletFill", "GobletLine", "GogglesFill", "GogglesLine", "GolfBallFill", "GolfBallLine", "GoogleFill", "GoogleLine", "GooglePlayFill", "GooglePlayLine", "GovernmentFill", "GovernmentLine", "GpsFill", "GpsLine", "GradienterFill", "GradienterLine", "GraduationCapFill", "GraduationCapLine", "GridFill", "GridLine", "GrokAiFill", "GrokAiLine", "Group2Fill", "Group2Line", "Group3Fill", "Group3Line", "GroupFill", "GroupLine", "GuideFill", "GuideLine", "H1", "H2", "H3", "H4", "H5", "H6", "HailFill", "HailLine", "HammerFill", "HammerLine", "Hand", "Hand2", "HandCoinFill", "HandCoinLine", "HandHeartFill", "HandHeartLine", "HandSanitizerFill", "HandSanitizerLine", "HandbagFill", "HandbagLine", "HardDrive2Fill", "HardDrive2Line", "HardDrive3Fill", "HardDrive3Line", "HardDriveFill", "HardDriveLine", "Hashtag", "Haze2Fill", "Haze2Line", "HazeFill", "HazeLine", "HdFill", "HdLine", "Heading", "HeadphoneFill", "HeadphoneLine", "HealthBookFill", "HealthBookLine", "Heart2Fill", "Heart2Line", "Heart3Fill", "Heart3Line", "HeartAdd2Fill", "HeartAdd2Line", "HeartAddFill", "HeartAddLine", "HeartFill", "HeartLine", "HeartPulseFill", "HeartPulseLine", "HeartsFill", "HeartsLine", "HeavyShowersFill", "HeavyShowersLine", "HexagonFill", "HexagonLine", "HistoryFill", "HistoryLine", "Home2Fill", "Home2Line", "Home3Fill", "Home3Line", "Home4Fill", "Home4Line", "Home5Fill", "Home5Line", "Home6Fill", "Home6Line", "Home7Fill", "Home7Line", "Home8Fill", "Home8Line", "Home9Fill", "Home9Line", "HomeFill", "HomeGearFill", "HomeGearLine", "HomeHeartFill", "HomeHeartLine", "HomeLine", "HomeOfficeFill", "HomeOfficeLine", "HomeSmile2Fill", "HomeSmile2Line", "HomeSmileFill", "HomeSmileLine", "HomeWifiFill", "HomeWifiLine", "HonorOfKingsFill", "HonorOfKingsLine", "HonourFill", "HonourLine", "HospitalFill", "HospitalLine", "HotelBedFill", "HotelBedLine", "HotelFill", "HotelLine", "HotspotFill", "HotspotLine", "Hourglass2Fill", "Hourglass2Line", "HourglassFill", "HourglassLine", "HqFill", "HqLine", "Html5Fill", "Html5Line", "IdCardFill", "IdCardLine", "IeFill", "IeLine", "Image2Fill", "Image2Line", "ImageAddFill", "ImageAddLine", "ImageAiFill", "ImageAiLine", "ImageCircleAiFill", "ImageCircleAiLine", "ImageCircleFill", "ImageCircleLine", "ImageDownloadFill", "ImageDownloadLine", "ImageEditFill", "ImageEditLine", "ImageFill", "ImageLine", "ImageUploadFill", "ImageUploadLine", "ImportFill", "ImportLine", "Inbox2Fill", "Inbox2Line", "InboxArchiveFill", "InboxArchiveLine", "InboxFill", "InboxLine", "InboxUnarchiveFill", "InboxUnarchiveLine", "IncreaseDecreaseFill", "IncreaseDecreaseLine", "IndentDecrease", "IndentIncrease", "IndeterminateCircleFill", "IndeterminateCircleLine", "InfinityFill", "InfinityLine", "InfoCardFill", "InfoCardLine", "InfoI", "Information2Fill", "Information2Line", "InformationFill", "InformationLine", "InformationOffFill", "InformationOffLine", "InfraredThermometerFill", "InfraredThermometerLine", "InkBottleFill", "InkBottleLine", "InputCursorMove", "InputField", "InputMethodFill", "InputMethodLine", "InsertColumnLeft", "InsertColumnRight", "InsertRowBottom", "InsertRowTop", "InstagramFill", "InstagramLine", "InstallFill", "InstallLine", "InstanceFill", "InstanceLine", "InvisionFill", "InvisionLine", "IssuesFill", "IssuesLine", "IssuesReopenFill", "IssuesReopenLine", "Italic", "JavaFill", "JavaLine", "JavascriptFill", "JavascriptLine", "JewelryFill", "JewelryLine", "KakaoTalkFill", "KakaoTalkLine", "KanbanView", "KanbanView2", "Key2Fill", "Key2Line", "KeyFill", "KeyLine", "KeyboardBoxFill", "KeyboardBoxLine", "KeyboardFill", "KeyboardLine", "KeynoteFill", "KeynoteLine", "KickFill", "KickLine", "KnifeBloodFill", "KnifeBloodLine", "KnifeFill", "KnifeLine", "LandscapeAiFill", "LandscapeAiLine", "LandscapeFill", "LandscapeLine", "Layout2Fill", "Layout2Line", "Layout3Fill", "Layout3Line", "Layout4Fill", "Layout4Line", "Layout5Fill", "Layout5Line", "Layout6Fill", "Layout6Line", "LayoutBottom2Fill", "LayoutBottom2Line", "LayoutBottomFill", "LayoutBottomLine", "LayoutColumnFill", "LayoutColumnLine", "LayoutFill", "LayoutGrid2Fill", "LayoutGrid2Line", "LayoutGridFill", "LayoutGridLine", "LayoutHorizontalFill", "LayoutHorizontalLine", "LayoutLeft2Fill", "LayoutLeft2Line", "LayoutLeftFill", "LayoutLeftLine", "LayoutLine", "LayoutMasonryFill", "LayoutMasonryLine", "LayoutRight2Fill", "LayoutRight2Line", "LayoutRightFill", "LayoutRightLine", "LayoutRowFill", "LayoutRowLine", "LayoutTop2Fill", "LayoutTop2Line", "LayoutTopFill", "LayoutTopLine", "LayoutVerticalFill", "LayoutVerticalLine", "LeafFill", "LeafLine", "LetterSpacing2", "LifebuoyFill", "LifebuoyLine", "LightbulbAiFill", "LightbulbAiLine", "LightbulbFill", "LightbulbFlashFill", "LightbulbFlashLine", "LightbulbLine", "LineChartFill", "LineChartLine", "LineFill", "LineHeight", "LineHeight2", "LineLine", "Link", "LinkM", "LinkUnlink", "LinkUnlinkM", "LinkedinBoxFill", "LinkedinBoxLine", "LinkedinFill", "LinkedinLine", "LinksFill", "LinksLine", "ListCheck", "ListCheck2", "ListCheck3", "ListIndefinite", "ListOrdered", "ListOrdered2", "ListRadio", "ListSettingsFill", "ListSettingsLine", "ListUnordered", "ListView", "LiveFill", "LiveLine", "Loader2Fill", "Loader2Line", "Loader3Fill", "Loader3Line", "Loader4Fill", "Loader4Line", "Loader5Fill", "Loader5Line", "LoaderFill", "LoaderLine", "Lock2Fill", "Lock2Line", "LockFill", "LockLine", "LockPasswordFill", "LockPasswordLine", "LockStarFill", "LockStarLine", "LockUnlockFill", "LockUnlockLine", "LoginBoxFill", "LoginBoxLine", "LoginCircleFill", "LoginCircleLine", "LogoutBoxFill", "LogoutBoxLine", "LogoutBoxRFill", "LogoutBoxRLine", "LogoutCircleFill", "LogoutCircleLine", "LogoutCircleRFill", "LogoutCircleRLine", "LoopLeftAiFill", "LoopLeftAiLine", "LoopLeftFill", "LoopLeftLine", "LoopRightAiFill", "LoopRightAiLine", "LoopRightFill", "LoopRightLine", "LuggageCartFill", "LuggageCartLine", "LuggageDepositFill", "LuggageDepositLine", "LungsFill", "LungsLine", "MacFill", "MacLine", "MacbookFill", "MacbookLine", "MagicFill", "MagicLine", "MailAddFill", "MailAddLine", "MailAiFill", "MailAiLine", "MailCheckFill", "MailCheckLine", "MailCloseFill", "MailCloseLine", "MailDownloadFill", "MailDownloadLine", "MailFill", "MailForbidFill", "MailForbidLine", "MailLine", "MailLockFill", "MailLockLine", "MailOpenFill", "MailOpenLine", "MailSendFill", "MailSendLine", "MailSettingsFill", "MailSettingsLine", "MailStarFill", "MailStarLine", "MailUnreadFill", "MailUnreadLine", "MailVolumeFill", "MailVolumeLine", "Map2Fill", "Map2Line", "MapFill", "MapLine", "MapPin2Fill", "MapPin2Line", "MapPin3Fill", "MapPin3Line", "MapPin4Fill", "MapPin4Line", "MapPin5Fill", "MapPin5Line", "MapPinAddFill", "MapPinAddLine", "MapPinFill", "MapPinLine", "MapPinRangeFill", "MapPinRangeLine", "MapPinTimeFill", "MapPinTimeLine", "MapPinUserFill", "MapPinUserLine", "MarkPenFill", "MarkPenLine", "MarkdownFill", "MarkdownLine", "MarkupFill", "MarkupLine", "MastercardFill", "MastercardLine", "MastodonFill", "MastodonLine", "Medal2Fill", "Medal2Line", "MedalFill", "MedalLine", "MedicineBottleFill", "MedicineBottleLine", "MediumFill", "MediumLine", "Megaphone2Fill", "Megaphone2Line", "MegaphoneFill", "MegaphoneLine", "MemoriesFill", "MemoriesLine", "MenFill", "MenLine", "MentalHealthFill", "MentalHealthLine", "Menu2Fill", "Menu2Line", "Menu3Fill", "Menu3Line", "Menu4Fill", "Menu4Line", "Menu5Fill", "Menu5Line", "MenuAddFill", "MenuAddLine", "MenuFill", "MenuFold2Fill", "MenuFold2Line", "MenuFold3Fill", "MenuFold3Line", "MenuFold4Fill", "MenuFold4Line", "MenuFoldFill", "MenuFoldLine", "MenuLine", "MenuSearchFill", "MenuSearchLine", "MenuUnfold2Fill", "MenuUnfold2Line", "MenuUnfold3Fill", "MenuUnfold3Line", "MenuUnfold4Fill", "MenuUnfold4Line", "MenuUnfoldFill", "MenuUnfoldLine", "MergeCellsHorizontal", "MergeCellsVertical", "Message2Fill", "Message2Line", "Message3Fill", "Message3Line", "MessageAi3Fill", "MessageAi3Line", "MessageFill", "MessageLine", "MessengerFill", "MessengerLine", "MetaFill", "MetaLine", "MeteorFill", "MeteorLine", "Mic2AiFill", "Mic2AiLine", "Mic2Fill", "Mic2Line", "MicAiFill", "MicAiLine", "MicFill", "MicLine", "MicOffFill", "MicOffLine", "MickeyFill", "MickeyLine", "MicroscopeFill", "MicroscopeLine", "MicrosoftCopilotFill", "MicrosoftCopilotLine", "MicrosoftFill", "MicrosoftLine", "MicrosoftLoopFill", "MicrosoftLoopLine", "MindMap", "MiniProgramFill", "MiniProgramLine", "MistFill", "MistLine", "MixtralFill", "MixtralLine", "MobileDownloadFill", "MobileDownloadLine", "MoneyCnyBoxFill", "MoneyCnyBoxLine", "MoneyCnyCircleFill", "MoneyCnyCircleLine", "MoneyDollarBoxFill", "MoneyDollarBoxLine", "MoneyDollarCircleFill", "MoneyDollarCircleLine", "MoneyEuroBoxFill", "MoneyEuroBoxLine", "MoneyEuroCircleFill", "MoneyEuroCircleLine", "MoneyPoundBoxFill", "MoneyPoundBoxLine", "MoneyPoundCircleFill", "MoneyPoundCircleLine", "MoneyRupeeCircleFill", "MoneyRupeeCircleLine", "MoonClearFill", "MoonClearLine", "MoonCloudyFill", "MoonCloudyLine", "MoonFill", "MoonFoggyFill", "MoonFoggyLine", "MoonLine", "More2Fill", "More2Line", "MoreFill", "MoreLine", "MosaicFill", "MosaicLine", "MotorbikeFill", "MotorbikeLine", "MouseFill", "MouseLine", "Movie2AiFill", "Movie2AiLine", "Movie2Fill", "Movie2Line", "MovieAiFill", "MovieAiLine", "MovieFill", "MovieLine", "MultiImageFill", "MultiImageLine", "Music2Fill", "Music2Line", "MusicAiFill", "MusicAiLine", "MusicFill", "MusicLine", "MvAiFill", "MvAiLine", "MvFill", "MvLine", "NavigationFill", "NavigationLine", "NeteaseCloudMusicFill", "NeteaseCloudMusicLine", "NetflixFill", "NetflixLine", "NetworkErrorFill", "NetworkErrorLine", "NetworkFill", "NetworkLine", "NetworkOffFill", "NetworkOffLine", "NewsFill", "NewsLine", "NewspaperFill", "NewspaperLine", "NextjsFill", "NextjsLine", "NftFill", "NftLine", "NoCreditCardFill", "NoCreditCardLine", "NodeTree", "NodejsFill", "NodejsLine", "Notification2Fill", "Notification2Line", "Notification3Fill", "Notification3Line", "Notification4Fill", "Notification4Line", "NotificationBadgeFill", "NotificationBadgeLine", "NotificationFill", "NotificationLine", "NotificationOffFill", "NotificationOffLine", "NotificationSnoozeFill", "NotificationSnoozeLine", "NotionFill", "NotionLine", "NpmjsFill", "NpmjsLine", "Number0", "Number1", "Number2", "Number3", "Number4", "Number5", "Number6", "Number7", "Number8", "Number9", "NumbersFill", "NumbersLine", "NurseFill", "NurseLine", "OctagonFill", "OctagonLine", "OilFill", "OilLine", "Omega", "OpenArmFill", "OpenArmLine", "OpenSourceFill", "OpenSourceLine", "OpenaiFill", "OpenaiLine", "OpenbaseFill", "OpenbaseLine", "OperaFill", "OperaLine", "OrderPlayFill", "OrderPlayLine", "OrganizationChart", "Outlet2Fill", "Outlet2Line", "OutletFill", "OutletLine", "Overline", "P2pFill", "P2pLine", "PageSeparator", "PagesFill", "PagesLine", "PaintBrushFill", "PaintBrushLine", "PaintFill", "PaintLine", "PaintingAiFill", "PaintingAiLine", "PaintingFill", "PaintingLine", "PaletteFill", "PaletteLine", "PantoneFill", "PantoneLine", "Paragraph", "ParentFill", "ParentLine", "ParenthesesFill", "ParenthesesLine", "ParkingBoxFill", "ParkingBoxLine", "ParkingFill", "ParkingLine", "PassExpiredFill", "PassExpiredLine", "PassPendingFill", "PassPendingLine", "PassValidFill", "PassValidLine", "PassportFill", "PassportLine", "PatreonFill", "PatreonLine", "PauseCircleFill", "PauseCircleLine", "PauseFill", "PauseLargeFill", "PauseLargeLine", "PauseLine", "PauseMiniFill", "PauseMiniLine", "PaypalFill", "PaypalLine", "PenNibFill", "PenNibLine", "PencilAi2Fill", "PencilAi2Line", "PencilAiFill", "PencilAiLine", "PencilFill", "PencilLine", "PencilRuler2Fill", "PencilRuler2Line", "PencilRulerFill", "PencilRulerLine", "PentagonFill", "PentagonLine", "PercentFill", "PercentLine", "PerplexityFill", "PerplexityLine", "PhoneCameraFill", "PhoneCameraLine", "PhoneFill", "PhoneFindFill", "PhoneFindLine", "PhoneLine", "PhoneLockFill", "PhoneLockLine", "PhpFill", "PhpLine", "PianoFill", "PianoGrandFill", "PianoGrandLine", "PianoLine", "PictureInPicture2Fill", "PictureInPicture2Line", "PictureInPictureExitFill", "PictureInPictureExitLine", "PictureInPictureFill", "PictureInPictureLine", "PieChart2Fill", "PieChart2Line", "PieChartBoxFill", "PieChartBoxLine", "PieChartFill", "PieChartLine", "PinDistanceFill", "PinDistanceLine", "PingPongFill", "PingPongLine", "PinterestFill", "PinterestLine", "PinyinInput", "PixFill", "PixLine", "PixelfedFill", "PixelfedLine", "PlaneFill", "PlaneLine", "PlanetFill", "PlanetLine", "PlantFill", "PlantLine", "PlayCircleFill", "PlayCircleLine", "PlayFill", "PlayLargeFill", "PlayLargeLine", "PlayLine", "PlayList2Fill", "PlayList2Line", "PlayListAddFill", "PlayListAddLine", "PlayListFill", "PlayListLine", "PlayMiniFill", "PlayMiniLine", "PlayReverseFill", "PlayReverseLargeFill", "PlayReverseLargeLine", "PlayReverseLine", "PlayReverseMiniFill", "PlayReverseMiniLine", "PlaystationFill", "PlaystationLine", "Plug2Fill", "Plug2Line", "Plug3Fill", "Plug3Line", "PlugFill", "PlugLine", "PokerClubsFill", "PokerClubsLine", "PokerDiamondsFill", "PokerDiamondsLine", "PokerHeartsFill", "PokerHeartsLine", "PokerSpadesFill", "PokerSpadesLine", "Polaroid2Fill", "Polaroid2Line", "PolaroidFill", "PolaroidLine", "PoliceBadgeFill", "PoliceBadgeLine", "PoliceCarFill", "PoliceCarLine", "PresentationFill", "PresentationLine", "PriceTag2Fill", "PriceTag2Line", "PriceTag3Fill", "PriceTag3Line", "PriceTagFill", "PriceTagLine", "PrinterCloudFill", "PrinterCloudLine", "PrinterFill", "PrinterLine", "ProductHuntFill", "ProductHuntLine", "ProfileFill", "ProfileLine", "Progress1Fill", "Progress1Line", "Progress2Fill", "Progress2Line", "Progress3Fill", "Progress3Line", "Progress4Fill", "Progress4Line", "Progress5Fill", "Progress5Line", "Progress6Fill", "Progress6Line", "Progress7Fill", "Progress7Line", "Progress8Fill", "Progress8Line", "Prohibited2Fill", "Prohibited2Line", "ProhibitedFill", "ProhibitedLine", "Projector2Fill", "Projector2Line", "ProjectorFill", "ProjectorLine", "PsychotherapyFill", "PsychotherapyLine", "PulseAiFill", "PulseAiLine", "PulseFill", "PulseLine", "Pushpin2Fill", "Pushpin2Line", "PushpinFill", "PushpinLine", "Puzzle2Fill", "Puzzle2Line", "PuzzleFill", "PuzzleLine", "QqFill", "QqLine", "QrCodeFill", "QrCodeLine", "QrScan2Fill", "QrScan2Line", "QrScanAiFill", "QrScanAiLine", "QrScanFill", "QrScanLine", "QuestionAnswerFill", "QuestionAnswerLine", "QuestionFill", "QuestionLine", "QuestionMark", "QuestionnaireFill", "QuestionnaireLine", "QuillPenAiFill", "QuillPenAiLine", "QuillPenFill", "QuillPenLine", "QuoteText", "QwenAiFill", "QwenAiLine", "RadarFill", "RadarLine", "Radio2Fill", "Radio2Line", "RadioButtonFill", "RadioButtonLine", "RadioFill", "RadioLine", "RainbowFill", "RainbowLine", "RainyFill", "RainyLine", "Ram2Fill", "Ram2Line", "RamFill", "RamLine", "ReactjsFill", "ReactjsLine", "ReceiptFill", "ReceiptLine", "RecordCircleFill", "RecordCircleLine", "RecordMailFill", "RecordMailLine", "RectangleFill", "RectangleLine", "RecycleFill", "RecycleLine", "RedPacketFill", "RedPacketLine", "Reddit2Fill", "Reddit2Line", "RedditFill", "RedditLine", "RefreshFill", "RefreshLine", "Refund2Fill", "Refund2Line", "RefundFill", "RefundLine", "RegisteredFill", "RegisteredLine", "RemixFill", "RemixLine", "RemixRunFill", "RemixRunLine", "RemixiconFill", "RemixiconLine", "RemoteControl2Fill", "RemoteControl2Line", "RemoteControlFill", "RemoteControlLine", "Repeat2Fill", "Repeat2Line", "RepeatFill", "RepeatLine", "RepeatOneFill", "RepeatOneLine", "Replay10Fill", "Replay10Line", "Replay15Fill", "Replay15Line", "Replay30Fill", "Replay30Line", "Replay5Fill", "Replay5Line", "ReplyAllFill", "ReplyAllLine", "ReplyFill", "ReplyLine", "ReservedFill", "ReservedLine", "ResetLeftFill", "ResetLeftLine", "ResetRightFill", "ResetRightLine", "RestTimeFill", "RestTimeLine", "RestartFill", "RestartLine", "Restaurant2Fill", "Restaurant2Line", "RestaurantFill", "RestaurantLine", "RewindFill", "RewindLine", "RewindMiniFill", "RewindMiniLine", "RewindStartFill", "RewindStartLine", "RewindStartMiniFill", "RewindStartMiniLine", "RfidFill", "RfidLine", "RhythmFill", "RhythmLine", "RidingFill", "RidingLine", "RoadMapFill", "RoadMapLine", "RoadsterFill", "RoadsterLine", "Robot2Fill", "Robot2Line", "Robot3Fill", "Robot3Line", "RobotFill", "RobotLine", "Rocket2Fill", "Rocket2Line", "RocketFill", "RocketLine", "RotateLockFill", "RotateLockLine", "RoundedCorner", "RouteFill", "RouteLine", "RouterFill", "RouterLine", "RssFill", "RssLine", "Ruler2Fill", "Ruler2Line", "RulerFill", "RulerLine", "RunFill", "RunLine", "SafariFill", "SafariLine", "Safe2Fill", "Safe2Line", "Safe3Fill", "Safe3Line", "SafeFill", "SafeLine", "SailboatFill", "SailboatLine", "Save2Fill", "Save2Line", "Save3Fill", "Save3Line", "SaveFill", "SaveLine", "Scales2Fill", "Scales2Line", "Scales3Fill", "Scales3Line", "ScalesFill", "ScalesLine", "Scan2Fill", "Scan2Line", "ScanFill", "ScanLine", "SchoolFill", "SchoolLine", "Scissors2Fill", "Scissors2Line", "ScissorsCutFill", "ScissorsCutLine", "ScissorsFill", "ScissorsLine", "Screenshot2Fill", "Screenshot2Line", "ScreenshotFill", "ScreenshotLine", "ScrollToBottomFill", "ScrollToBottomLine", "SdCardFill", "SdCardLine", "SdCardMiniFill", "SdCardMiniLine", "Search2Fill", "Search2Line", "SearchAi2Fill", "SearchAi2Line", "SearchAi3Fill", "SearchAi3Line", "SearchAi4Fill", "SearchAi4Line", "SearchAiFill", "SearchAiLine", "SearchEyeFill", "SearchEyeLine", "SearchFill", "SearchLine", "SecurePaymentFill", "SecurePaymentLine", "SeedlingFill", "SeedlingLine", "SendBackward", "SendInsFill", "SendInsLine", "SendPlane2Fill", "SendPlane2Line", "SendPlaneFill", "SendPlaneLine", "SendToBack", "SensorFill", "SensorLine", "SeoFill", "SeoLine", "Separator", "ServerFill", "ServerLine", "ServiceBellFill", "ServiceBellLine", "ServiceFill", "ServiceLine", "Settings2Fill", "Settings2Line", "Settings3Fill", "Settings3Line", "Settings4Fill", "Settings4Line", "Settings5Fill", "Settings5Line", "Settings6Fill", "Settings6Line", "SettingsFill", "SettingsLine", "ShadowFill", "ShadowLine", "ShakeHandsFill", "ShakeHandsLine", "Shape2Fill", "Shape2Line", "ShapeFill", "ShapeLine", "ShapesFill", "ShapesLine", "Share2Fill", "Share2Line", "ShareBoxFill", "ShareBoxLine", "ShareCircleFill", "ShareCircleLine", "ShareFill", "ShareForward2Fill", "ShareForward2Line", "ShareForwardBoxFill", "ShareForwardBoxLine", "ShareForwardFill", "ShareForwardLine", "ShareLine", "ShieldCheckFill", "ShieldCheckLine", "ShieldCrossFill", "ShieldCrossLine", "ShieldFill", "ShieldFlashFill", "ShieldFlashLine", "ShieldKeyholeFill", "ShieldKeyholeLine", "ShieldLine", "ShieldStarFill", "ShieldStarLine", "ShieldUserFill", "ShieldUserLine", "Shining2Fill", "Shining2Line", "ShiningFill", "ShiningLine", "Ship2Fill", "Ship2Line", "ShipFill", "ShipLine", "ShirtFill", "ShirtLine", "ShoppingBag2Fill", "ShoppingBag2Line", "ShoppingBag3Fill", "ShoppingBag3Line", "ShoppingBag4Fill", "ShoppingBag4Line", "ShoppingBagFill", "ShoppingBagLine", "ShoppingBasket2Fill", "ShoppingBasket2Line", "ShoppingBasketFill", "ShoppingBasketLine", "ShoppingCart2Fill", "ShoppingCart2Line", "ShoppingCartFill", "ShoppingCartLine", "ShowersFill", "ShowersLine", "ShuffleFill", "ShuffleLine", "ShutDownFill", "ShutDownLine", "SideBarFill", "SideBarLine", "SidebarFoldFill", "SidebarFoldLine", "SidebarUnfoldFill", "SidebarUnfoldLine", "SignalCellular1Fill", "SignalCellular1Line", "SignalCellular2Fill", "SignalCellular2Line", "SignalCellular3Fill", "SignalCellular3Line", "SignalCellularOffFill", "SignalCellularOffLine", "SignalTowerFill", "SignalTowerLine", "SignalWifi1Fill", "SignalWifi1Line", "SignalWifi2Fill", "SignalWifi2Line", "SignalWifi3Fill", "SignalWifi3Line", "SignalWifiErrorFill", "SignalWifiErrorLine", "SignalWifiFill", "SignalWifiLine", "SignalWifiOffFill", "SignalWifiOffLine", "SignpostFill", "SignpostLine", "SimCard2Fill", "SimCard2Line", "SimCardFill", "SimCardLine", "SimCardWarningFill", "SimCardWarningLine", "SingleQuotesL", "SingleQuotesR", "SipFill", "SipLine", "Sketching", "SkipBackFill", "SkipBackLine", "SkipBackMiniFill", "SkipBackMiniLine", "SkipDownFill", "SkipDownLine", "SkipForwardFill", "SkipForwardLine", "SkipForwardMiniFill", "SkipForwardMiniLine", "SkipLeftFill", "SkipLeftLine", "SkipRightFill", "SkipRightLine", "SkipUpFill", "SkipUpLine", "Skull2Fill", "Skull2Line", "SkullFill", "SkullLine", "SkypeFill", "SkypeLine", "SlackFill", "SlackLine", "SlashCommands", "SlashCommands2", "SliceFill", "SliceLine", "Slideshow2Fill", "Slideshow2Line", "Slideshow3Fill", "Slideshow3Line", "Slideshow4Fill", "Slideshow4Line", "SlideshowFill", "SlideshowLine", "SlideshowView", "SlowDownFill", "SlowDownLine", "SmartphoneFill", "SmartphoneLine", "SnapchatFill", "SnapchatLine", "SnowflakeFill", "SnowflakeLine", "SnowyFill", "SnowyLine", "SofaFill", "SofaLine", "SortAlphabetAsc", "SortAlphabetDesc", "SortAsc", "SortDesc", "SortNumberAsc", "SortNumberDesc", "SoundModuleFill", "SoundModuleLine", "SoundcloudFill", "SoundcloudLine", "Space", "SpaceShip2Fill", "SpaceShip2Line", "SpaceShipFill", "SpaceShipLine", "Spam2Fill", "Spam2Line", "Spam3Fill", "Spam3Line", "SpamFill", "SpamLine", "Sparkling2Fill", "Sparkling2Line", "SparklingFill", "SparklingLine", "SpeakAiFill", "SpeakAiLine", "SpeakFill", "SpeakLine", "Speaker2Fill", "Speaker2Line", "Speaker3Fill", "Speaker3Line", "SpeakerFill", "SpeakerLine", "SpectrumFill", "SpectrumLine", "SpeechToTextFill", "SpeechToTextLine", "SpeedFill", "SpeedLine", "SpeedMiniFill", "SpeedMiniLine", "SpeedUpFill", "SpeedUpLine", "SplitCellsHorizontal", "SplitCellsVertical", "SpotifyFill", "SpotifyLine", "SpyFill", "SpyLine", "SquareFill", "SquareLine", "SquareRoot", "StackFill", "StackLine", "StackOverflowFill", "StackOverflowLine", "StackedChartFill", "StackedChartLine", "StackedView", "StackshareFill", "StackshareLine", "StairsFill", "StairsLine", "StarFill", "StarHalfFill", "StarHalfLine", "StarHalfSFill", "StarHalfSLine", "StarLine", "StarOffFill", "StarOffLine", "StarSFill", "StarSLine", "StarSmileFill", "StarSmileLine", "SteamFill", "SteamLine", "Steering2Fill", "Steering2Line", "SteeringFill", "SteeringLine", "StethoscopeFill", "StethoscopeLine", "StickyNote2Fill", "StickyNote2Line", "StickyNoteAddFill", "StickyNoteAddLine", "StickyNoteFill", "StickyNoteLine", "StockFill", "StockLine", "StopCircleFill", "StopCircleLine", "StopFill", "StopLargeFill", "StopLargeLine", "StopLine", "StopMiniFill", "StopMiniLine", "Store2Fill", "Store2Line", "Store3Fill", "Store3Line", "StoreFill", "StoreLine", "Strikethrough", "Strikethrough2", "SubredditFill", "SubredditLine", "Subscript", "Subscript2", "SubtractFill", "SubtractLine", "SubwayFill", "SubwayLine", "SubwayWifiFill", "SubwayWifiLine", "Suitcase2Fill", "Suitcase2Line", "Suitcase3Fill", "Suitcase3Line", "SuitcaseFill", "SuitcaseLine", "SunCloudyFill", "SunCloudyLine", "SunFill", "SunFoggyFill", "SunFoggyLine", "SunLine", "SupabaseFill", "SupabaseLine", "Superscript", "Superscript2", "SurgicalMaskFill", "SurgicalMaskLine", "SurroundSoundFill", "SurroundSoundLine", "SurveyFill", "SurveyLine", "SvelteFill", "SvelteLine", "Swap2Fill", "Swap2Line", "Swap3Fill", "Swap3Line", "SwapBoxFill", "SwapBoxLine", "SwapFill", "SwapLine", "SwitchFill", "SwitchLine", "SwordFill", "SwordLine", "SyringeFill", "SyringeLine", "TBoxFill", "TBoxLine", "TShirt2Fill", "TShirt2Line", "TShirtAirFill", "TShirtAirLine", "TShirtFill", "TShirtLine", "Table2", "Table3", "TableAltFill", "TableAltLine", "TableFill", "TableLine", "TableView", "TabletFill", "TabletLine", "TailwindCssFill", "TailwindCssLine", "TakeawayFill", "TakeawayLine", "TaobaoFill", "TaobaoLine", "TapeFill", "TapeLine", "TargetFill", "TargetLine", "TaskFill", "TaskLine", "TaxiFill", "TaxiLine", "TaxiWifiFill", "TaxiWifiLine", "TeamFill", "TeamLine", "Telegram2Fill", "Telegram2Line", "TelegramFill", "TelegramLine", "TempColdFill", "TempColdLine", "TempHotFill", "TempHotLine", "TentFill", "TentLine", "TerminalBoxFill", "TerminalBoxLine", "TerminalFill", "TerminalLine", "TerminalWindowFill", "TerminalWindowLine", "TestTubeFill", "TestTubeLine", "Text", "TextBlock", "TextDirectionL", "TextDirectionR", "TextSnippet", "TextSpacing", "TextToSpeechFill", "TextToSpeechLine", "TextWrap", "ThermometerFill", "ThermometerLine", "ThreadsFill", "ThreadsLine", "ThumbDownFill", "ThumbDownLine", "ThumbUpFill", "ThumbUpLine", "ThunderstormsFill", "ThunderstormsLine", "Ticket2Fill", "Ticket2Line", "TicketFill", "TicketLine", "TiktokFill", "TiktokLine", "TimeFill", "TimeLine", "TimeZoneFill", "TimeZoneLine", "TimelineView", "Timer2Fill", "Timer2Line", "TimerFill", "TimerFlashFill", "TimerFlashLine", "TimerLine", "TodoFill", "TodoLine", "ToggleFill", "ToggleLine", "TokenSwapFill", "TokenSwapLine", "ToolsFill", "ToolsLine", "ToothFill", "ToothLine", "TornadoFill", "TornadoLine", "TrademarkFill", "TrademarkLine", "TrafficLightFill", "TrafficLightLine", "TrainFill", "TrainLine", "TrainWifiFill", "TrainWifiLine", "Translate", "Translate2", "TranslateAi", "TranslateAi2", "TravestiFill", "TravestiLine", "TreasureMapFill", "TreasureMapLine", "TreeFill", "TreeLine", "TrelloFill", "TrelloLine", "TriangleFill", "TriangleLine", "TriangularFlagFill", "TriangularFlagLine", "TrophyFill", "TrophyLine", "TruckFill", "TruckLine", "TumblrFill", "TumblrLine", "Tv2Fill", "Tv2Line", "TvFill", "TvLine", "TwitchFill", "TwitchLine", "TwitterFill", "TwitterLine", "TwitterXFill", "TwitterXLine", "TyphoonFill", "TyphoonLine", "UDiskFill", "UDiskLine", "UbuntuFill", "UbuntuLine", "UmbrellaFill", "UmbrellaLine", "Underline", "UninstallFill", "UninstallLine", "UnpinFill", "UnpinLine", "UnsplashFill", "UnsplashLine", "Upload2Fill", "Upload2Line", "UploadCloud2Fill", "UploadCloud2Line", "UploadCloudFill", "UploadCloudLine", "UploadFill", "UploadLine", "UpworkFill", "UpworkLine", "UsbFill", "UsbLine", "User2Fill", "User2Line", "User3Fill", "User3Line", "User4Fill", "User4Line", "User5Fill", "User5Line", "User6Fill", "User6Line", "UserAddFill", "UserAddLine", "UserCommunityFill", "UserCommunityLine", "UserFill", "UserFollowFill", "UserFollowLine", "UserForbidFill", "UserForbidLine", "UserHeartFill", "UserHeartLine", "UserLine", "UserLocationFill", "UserLocationLine", "UserMinusFill", "UserMinusLine", "UserReceived2Fill", "UserReceived2Line", "UserReceivedFill", "UserReceivedLine", "UserSearchFill", "UserSearchLine", "UserSettingsFill", "UserSettingsLine", "UserShared2Fill", "UserShared2Line", "UserSharedFill", "UserSharedLine", "UserSmileFill", "UserSmileLine", "UserStarFill", "UserStarLine", "UserUnfollowFill", "UserUnfollowLine", "UserVoiceFill", "UserVoiceLine", "VercelFill", "VercelLine", "VerifiedBadgeFill", "VerifiedBadgeLine", "VideoAddFill", "VideoAddLine", "VideoAiFill", "VideoAiLine", "VideoChatFill", "VideoChatLine", "VideoDownloadFill", "VideoDownloadLine", "VideoFill", "VideoLine", "VideoOffFill", "VideoOffLine", "VideoOnAiFill", "VideoOnAiLine", "VideoOnFill", "VideoOnLine", "VideoUploadFill", "VideoUploadLine", "Vidicon2Fill", "Vidicon2Line", "VidiconFill", "VidiconLine", "VimeoFill", "VimeoLine", "VipCrown2Fill", "VipCrown2Line", "VipCrownFill", "VipCrownLine", "VipDiamondFill", "VipDiamondLine", "VipFill", "VipLine", "VirusFill", "VirusLine", "VisaFill", "VisaLine", "VkFill", "VkLine", "VoiceAiFill", "VoiceAiLine", "VoiceRecognitionFill", "VoiceRecognitionLine", "VoiceprintFill", "VoiceprintLine", "VolumeDownFill", "VolumeDownLine", "VolumeMuteFill", "VolumeMuteLine", "VolumeOffVibrateFill", "VolumeOffVibrateLine", "VolumeUpFill", "VolumeUpLine", "VolumeVibrateFill", "VolumeVibrateLine", "VuejsFill", "VuejsLine", "WalkFill", "WalkLine", "Wallet2Fill", "Wallet2Line", "Wallet3Fill", "Wallet3Line", "WalletFill", "WalletLine", "WaterFlashFill", "WaterFlashLine", "WaterPercentFill", "WaterPercentLine", "WebcamFill", "WebcamLine", "WebhookFill", "WebhookLine", "Wechat2Fill", "Wechat2Line", "WechatChannelsFill", "WechatChannelsLine", "WechatFill", "WechatLine", "WechatPayFill", "WechatPayLine", "WeiboFill", "WeiboLine", "WeightFill", "WeightLine", "WhatsappFill", "WhatsappLine", "WheelchairFill", "WheelchairLine", "WifiFill", "WifiLine", "WifiOffFill", "WifiOffLine", "Window2Fill", "Window2Line", "WindowFill", "WindowLine", "WindowsFill", "WindowsLine", "WindyFill", "WindyLine", "WirelessChargingFill", "WirelessChargingLine", "WomenFill", "WomenLine", "WordpressFill", "WordpressLine", "WrenchFill", "WrenchLine", "WubiInput", "XboxFill", "XboxLine", "XingFill", "XingLine", "XrpFill", "XrpLine", "XtzFill", "XtzLine", "YoutubeFill", "YoutubeLine", "YuqueFill", "YuqueLine", "ZcoolFill", "ZcoolLine", "ZhihuFill", "ZhihuLine", "ZhipuAiFill", "ZhipuAiLine", "ZoomInFill", "ZoomInLine", "ZoomOutFill", "ZoomOutLine", "ZzzFill", "ZzzLine"]);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { walk } from '../../core/tree.js';
|
|
2
2
|
import { stickySeeds } from './sticky.js';
|
|
3
|
+
import { ICON_NAMES } from '../../catalog/icons.generated.js';
|
|
3
4
|
/** Style keys read off a node, ignoring anything unset. */
|
|
4
5
|
function styleOf(n) {
|
|
5
6
|
return (n?.style ?? {});
|
|
@@ -56,6 +57,41 @@ function headingTag(level) {
|
|
|
56
57
|
const n = Math.min(6, Math.max(1, Math.round(level ?? 2)));
|
|
57
58
|
return `h${n}`;
|
|
58
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* This platform's own spelling of an icon the source page named, or null.
|
|
62
|
+
*
|
|
63
|
+
* A LOOKUP, NOT A GUESS. `specials.name` is a PascalCase RemixIcon id and the
|
|
64
|
+
* catalog holds 3,227 of them; a name outside that set renders nothing. So the
|
|
65
|
+
* words the page used are normalised and TRIED — exactly, then as the `Line`
|
|
66
|
+
* and `Fill` variants every icon in the set comes in — and anything that does
|
|
67
|
+
* not land is skipped.
|
|
68
|
+
*
|
|
69
|
+
* Deliberately no last-word fallback. "Open main menu" resolving to `MenuLine`
|
|
70
|
+
* would be right, and "Acme Store" resolving to `StoreLine` would put a shop
|
|
71
|
+
* glyph where a wordmark was — a WRONG icon, which is worse than none, and
|
|
72
|
+
* indistinguishable from a right one to everything downstream.
|
|
73
|
+
*/
|
|
74
|
+
function iconFor(raw) {
|
|
75
|
+
if (raw.length > 40)
|
|
76
|
+
return null;
|
|
77
|
+
const words = raw
|
|
78
|
+
.replace(/^(?:ri|fa[srlbd]?|lucide|bi|feather|icon|icons|material|mdi|ion|hero)[-_]/i, '')
|
|
79
|
+
.split(/[^A-Za-z0-9]+/)
|
|
80
|
+
.filter(Boolean);
|
|
81
|
+
if (!words.length)
|
|
82
|
+
return null;
|
|
83
|
+
const base = words
|
|
84
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
85
|
+
.join('');
|
|
86
|
+
for (const candidate of [base, `${base}Line`, `${base}Fill`]) {
|
|
87
|
+
if (ICON_NAMES.has(candidate))
|
|
88
|
+
return candidate;
|
|
89
|
+
}
|
|
90
|
+
// A source that already writes the id lowercase — `ri-shopping-cart-line`
|
|
91
|
+
// arrives as words, but `shoppingcartline` as one — cannot be split back, so
|
|
92
|
+
// the exact form is all there is to try.
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
59
95
|
/**
|
|
60
96
|
* One captured node as the element that can render it.
|
|
61
97
|
*
|
|
@@ -94,6 +130,42 @@ function one(c, t) {
|
|
|
94
130
|
},
|
|
95
131
|
};
|
|
96
132
|
}
|
|
133
|
+
case 'icon': {
|
|
134
|
+
const name = c.name ? iconFor(c.name) : null;
|
|
135
|
+
// NO NAME, NO NODE. An `icon` whose `specials.name` this platform does not
|
|
136
|
+
// hold renders nothing, so the page carries an empty box where the source
|
|
137
|
+
// had a glyph — worse than the `<svg>` being skipped, because nobody put
|
|
138
|
+
// it there on purpose. The COLOUR is deliberately not set either: it lives
|
|
139
|
+
// in the `icon-default` style preset, and a literal here would detach
|
|
140
|
+
// every imported icon from the theme permanently.
|
|
141
|
+
if (!name)
|
|
142
|
+
return null;
|
|
143
|
+
return { type: 'icon', specials: { name } };
|
|
144
|
+
}
|
|
145
|
+
case 'accordion': {
|
|
146
|
+
const items = (c.children ?? [])
|
|
147
|
+
.map((item) => one(item, t))
|
|
148
|
+
.filter((n) => n !== null);
|
|
149
|
+
if (!items.length)
|
|
150
|
+
return null;
|
|
151
|
+
return { type: 'accordion', children: items };
|
|
152
|
+
}
|
|
153
|
+
case 'accordion-item': {
|
|
154
|
+
const label = c.text?.trim();
|
|
155
|
+
const body = (c.children ?? [])
|
|
156
|
+
.map((k) => one(k, t))
|
|
157
|
+
.filter((n) => n !== null);
|
|
158
|
+
if (!label && !body.length)
|
|
159
|
+
return null;
|
|
160
|
+
// The label is omitted rather than defaulted when the source had no
|
|
161
|
+
// `<summary>`: `accordion-content` seeds its own, and inventing one here
|
|
162
|
+
// would ship English copy into a store that is not in English.
|
|
163
|
+
return {
|
|
164
|
+
type: 'accordion-content',
|
|
165
|
+
...(label ? { specials: { label } } : {}),
|
|
166
|
+
children: body,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
97
169
|
case 'divider': {
|
|
98
170
|
return { type: 'divider', style: { width: '100%' } };
|
|
99
171
|
}
|
|
@@ -61,6 +61,12 @@ export async function gatherReadiness(ctx, siteId, pageNodes) {
|
|
|
61
61
|
const globalNodes = globals?.globalSections
|
|
62
62
|
? globals.globalSections.flatMap((g) => Object.values(g.document?.nodes ?? {}))
|
|
63
63
|
: null;
|
|
64
|
+
// HOW MANY SHARED SECTIONS THE SITE HAS, not just what is in them. An empty
|
|
65
|
+
// list is the answer to a question nothing asked: a site whose pages each
|
|
66
|
+
// carry their own header is not one site.
|
|
67
|
+
const globalKinds = globals?.globalSections
|
|
68
|
+
? globals.globalSections.map((g) => g.kind ?? '')
|
|
69
|
+
: null;
|
|
64
70
|
// ACTIVE means a shopper can see it; PURCHASABLE adds a price above zero. A
|
|
65
71
|
// product priced at zero renders, adds to the cart, and totals nothing — which
|
|
66
72
|
// reads as a working store right up to the money.
|
|
@@ -78,6 +84,7 @@ export async function gatherReadiness(ctx, siteId, pageNodes) {
|
|
|
78
84
|
shippingMethods,
|
|
79
85
|
pageNodes,
|
|
80
86
|
globalNodes,
|
|
87
|
+
globalKinds,
|
|
81
88
|
categories,
|
|
82
89
|
categoryPageLinks,
|
|
83
90
|
};
|
|
@@ -61,12 +61,43 @@ function isStore(input) {
|
|
|
61
61
|
}
|
|
62
62
|
const published = (pages, type) => pages.some((p) => p.type === type && p.status === 'published');
|
|
63
63
|
const drafted = (pages, type) => pages.some((p) => p.type === type && p.status !== 'published');
|
|
64
|
-
/**
|
|
64
|
+
/**
|
|
65
|
+
* What stands between this site and a paid order, most-blocking first — and,
|
|
66
|
+
* asked FIRST because it is not about money at all, whether these pages are one
|
|
67
|
+
* SITE.
|
|
68
|
+
*
|
|
69
|
+
* The precedent is `accountPage` and `searchPage`, already here on the same
|
|
70
|
+
* reasoning: a shop with no account page still takes orders, so they are a
|
|
71
|
+
* different question asked second. Shared chrome is a different question asked
|
|
72
|
+
* FIRST, because it is true of every site and not only of a store.
|
|
73
|
+
*/
|
|
65
74
|
export function readinessGaps(input) {
|
|
66
|
-
if (!isStore(input))
|
|
67
|
-
return [];
|
|
68
75
|
const gaps = [];
|
|
69
76
|
const pages = input.pages;
|
|
77
|
+
// A SITE WITH NO SHARED SECTION IS NOT A SITE, IT IS A STACK OF PAGES.
|
|
78
|
+
//
|
|
79
|
+
// Nothing asked this. Every tool here authors ONE page, so a build that never
|
|
80
|
+
// reaches for a global section gives each page its own header and footer —
|
|
81
|
+
// and then a change to the nav is one edit per page, the copies drift, and a
|
|
82
|
+
// visitor meets a slightly different site on every click. It is the most
|
|
83
|
+
// basic thing a website has that a generated one does not, and it is
|
|
84
|
+
// invisible to `sb_review`, which reads one page and finds it perfect.
|
|
85
|
+
//
|
|
86
|
+
// Two pages is the threshold: a one-page site has nothing to share with.
|
|
87
|
+
if (pages && pages.length >= 2 && input.globalKinds !== null && input.globalKinds?.length === 0) {
|
|
88
|
+
gaps.push({
|
|
89
|
+
id: 'siteChrome',
|
|
90
|
+
draft: false,
|
|
91
|
+
problem: `This site has ${pages.length} pages and no global section, so each one carries its own ` +
|
|
92
|
+
'header and footer. Changing the menu is that many edits, the copies drift apart, and a ' +
|
|
93
|
+
'visitor meets a slightly different site on every page.',
|
|
94
|
+
fix: 'Make them shared: POST /api/sites/{siteId}/global-sections with { name, kind: "header" | ' +
|
|
95
|
+
'"footer", document }, then PUT .../{id}/document with { subtree }. A page then carries a ' +
|
|
96
|
+
'globalRef instead of a copy, and one edit reaches every page.',
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (!isStore(input))
|
|
100
|
+
return gaps;
|
|
70
101
|
if (pages && !published(pages, 'checkout')) {
|
|
71
102
|
const draft = drafted(pages, 'checkout');
|
|
72
103
|
gaps.push({
|
|
@@ -181,6 +212,28 @@ export function readinessGaps(input) {
|
|
|
181
212
|
fix: draft ? `Publish the ${type} page that already exists.` : fix,
|
|
182
213
|
});
|
|
183
214
|
}
|
|
215
|
+
const everywhere = input.globalNodes !== null ? [...input.pageNodes, ...input.globalNodes] : null;
|
|
216
|
+
// A BASKET WITH NO NUMBER ON IT. The platform shipped `cart-count` to fix
|
|
217
|
+
// exactly this, and made it OPT-IN: `open_cart` is an ACTION any element can
|
|
218
|
+
// carry, not an element type, so there is no "cart icon" to give a badge to by
|
|
219
|
+
// default — minting one unasked would put a number on every social glyph in
|
|
220
|
+
// every footer. The cost of that decision is that a site authored through
|
|
221
|
+
// these tools never has one: a shopper adds an item, gets a toast that fades,
|
|
222
|
+
// and nothing anywhere on the page says their basket holds anything.
|
|
223
|
+
//
|
|
224
|
+
// Only asked when something DOES open the cart — otherwise `cartTrigger`
|
|
225
|
+
// below is the finding, and this would be a second sentence about the same
|
|
226
|
+
// missing control.
|
|
227
|
+
if (everywhere && opensCart(everywhere) && !everywhere.some((n) => n.data.type === 'cart-count')) {
|
|
228
|
+
gaps.push({
|
|
229
|
+
id: 'cartCount',
|
|
230
|
+
draft: false,
|
|
231
|
+
problem: 'Something opens the cart, but nothing shows what is in it. A shopper who adds an item ' +
|
|
232
|
+
'sees a toast that fades and then no evidence anywhere that their basket is not empty.',
|
|
233
|
+
fix: 'Give the control that opens the cart a cart-count satellite — sb_set on it with config ' +
|
|
234
|
+
'{ cartCountId: … } mints one, or add a cart-count beside it.',
|
|
235
|
+
});
|
|
236
|
+
}
|
|
184
237
|
if (input.globalNodes !== null && !opensCart([...input.pageNodes, ...input.globalNodes])) {
|
|
185
238
|
gaps.push({
|
|
186
239
|
id: 'cartTrigger',
|
package/dist/vision/capture.js
CHANGED
|
@@ -124,6 +124,50 @@ function capturePage(limits) {
|
|
|
124
124
|
// `<article>` is that article's byline, and one inside a `<section>` is the
|
|
125
125
|
// hero the old comment was right to protect. `<main>` is not sectioning
|
|
126
126
|
// content, so it does not shield a footer.
|
|
127
|
+
// A COLLAPSED `<details>` MEASURES AS ZERO, so its body would read as hidden and
|
|
128
|
+
// an FAQ would import as a list of questions with no answers. The source's
|
|
129
|
+
// collapsed state is not content — this platform's accordion has its own
|
|
130
|
+
// `openItems` — so every one is opened before anything is measured. The page is
|
|
131
|
+
// a throwaway tab that is closed straight after.
|
|
132
|
+
for (const d of Array.from(document.querySelectorAll('details')))
|
|
133
|
+
d.setAttribute('open', '');
|
|
134
|
+
/**
|
|
135
|
+
* What the page CALLS this icon, in its own words. A candidate, never a verdict.
|
|
136
|
+
*
|
|
137
|
+
* Four places a real page says it, in falling order of how much it means:
|
|
138
|
+
* a sprite reference names the icon outright; an `aria-label` or `<title>` is
|
|
139
|
+
* what a screen reader is told; a class is the icon set's own id. The mapper
|
|
140
|
+
* decides whether this platform has one by that name — nothing in the page can
|
|
141
|
+
* answer that.
|
|
142
|
+
*/
|
|
143
|
+
const iconName = (el) => {
|
|
144
|
+
const use = Array.from(el.querySelectorAll('use'))[0];
|
|
145
|
+
const ref = use ? use.getAttribute('href') ?? use.getAttribute('xlink:href') : null;
|
|
146
|
+
if (ref && ref.charAt(0) === '#' && ref.length > 1)
|
|
147
|
+
return ref.slice(1);
|
|
148
|
+
const label = clean(el.getAttribute('aria-label'));
|
|
149
|
+
if (label)
|
|
150
|
+
return label;
|
|
151
|
+
const title = Array.from(el.querySelectorAll('title'))[0];
|
|
152
|
+
const titled = title ? clean(title.textContent) : '';
|
|
153
|
+
if (titled)
|
|
154
|
+
return titled;
|
|
155
|
+
const dataIcon = clean(el.getAttribute('data-icon'));
|
|
156
|
+
if (dataIcon)
|
|
157
|
+
return dataIcon;
|
|
158
|
+
// A class list holds the icon set's id and a pile of layout classes with it.
|
|
159
|
+
// The longest hyphenated token is the id in every set seen here — `ri-…`,
|
|
160
|
+
// `fa-…`, `lucide-…`, `bi-…` — and a bare `w-4` cannot outrank it.
|
|
161
|
+
// `getAttribute('class')`, NOT `className`: on an SVG element the property is
|
|
162
|
+
// an SVGAnimatedString, so `String(el.className)` is the literal
|
|
163
|
+
// "[object SVGAnimatedString]" and every class-named icon went unrecognised.
|
|
164
|
+
let best = '';
|
|
165
|
+
for (const w of (el.getAttribute('class') ?? '').split(/\s+/)) {
|
|
166
|
+
if (w.indexOf('-') > 0 && w.length > best.length)
|
|
167
|
+
best = w;
|
|
168
|
+
}
|
|
169
|
+
return best;
|
|
170
|
+
};
|
|
127
171
|
const sectioning = Array.from(document.querySelectorAll('article, section, aside, nav'));
|
|
128
172
|
// A CLASS NAME IS EVIDENCE FOR A FOOTER AND NOT FOR A HEADER, and the
|
|
129
173
|
// asymmetry is the whole point. blender.org marks its site map
|
|
@@ -138,7 +182,7 @@ function capturePage(limits) {
|
|
|
138
182
|
// The token must START with `footer` (footer, footer-note, footer__inner) so
|
|
139
183
|
// `card-footer` inside an ordinary div is not swept up with it.
|
|
140
184
|
const footerish = (el) => {
|
|
141
|
-
const words = `${el.getAttribute('id') ?? ''} ${
|
|
185
|
+
const words = `${el.getAttribute('id') ?? ''} ${el.getAttribute('class') ?? ''}`.toLowerCase();
|
|
142
186
|
for (const w of words.split(/[\s]+/)) {
|
|
143
187
|
if (!w)
|
|
144
188
|
continue;
|
|
@@ -182,7 +226,20 @@ function capturePage(limits) {
|
|
|
182
226
|
for (const c of walk(child))
|
|
183
227
|
kids.push(c);
|
|
184
228
|
}
|
|
185
|
-
|
|
229
|
+
// CONSECUTIVE `<details>` ARE ONE ACCORDION. An FAQ is written as eight
|
|
230
|
+
// siblings, and eight separate accordions is eight containers where the
|
|
231
|
+
// author had one list — the same content, with seven wrappers nobody asked
|
|
232
|
+
// for and no shared open/close behaviour.
|
|
233
|
+
const merged = [];
|
|
234
|
+
for (const c of kids) {
|
|
235
|
+
const last = merged[merged.length - 1];
|
|
236
|
+
if (c.kind === 'accordion' && last && last.kind === 'accordion') {
|
|
237
|
+
last.children = (last.children ?? []).concat(c.children ?? []);
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
merged.push(c);
|
|
241
|
+
}
|
|
242
|
+
return merged;
|
|
186
243
|
};
|
|
187
244
|
const walk = (el) => {
|
|
188
245
|
// ONE BOUND, on the whole import. There used to be a second, per section,
|
|
@@ -200,7 +257,31 @@ function capturePage(limits) {
|
|
|
200
257
|
skip('page-chrome');
|
|
201
258
|
return [];
|
|
202
259
|
}
|
|
203
|
-
|
|
260
|
+
// UPPERCASED, because an SVG element's `tagName` is not.
|
|
261
|
+
//
|
|
262
|
+
// `tagName` preserves case for XML-namespaced elements, so an inline
|
|
263
|
+
// `<svg>` reports "svg" while every HTML element reports "P", "DIV". The
|
|
264
|
+
// ignore list had held 'SVG' and 'PATH' since it was written and neither
|
|
265
|
+
// had ever matched — the icons were falling through to the text fallback,
|
|
266
|
+
// contributing nothing because an svg's textContent is empty, which is why
|
|
267
|
+
// it looked like the entry was working.
|
|
268
|
+
const tag = el.tagName.toUpperCase();
|
|
269
|
+
// AN ICON IS DECORATION, WHICH IS THE ONE THING `aria-hidden` MARKS AND
|
|
270
|
+
// THIS PLATFORM HAS AN ELEMENT FOR. Almost every real icon carries the
|
|
271
|
+
// attribute — that is correct authoring, the label beside it does the
|
|
272
|
+
// talking — so testing it before this branch would mean the `icon` element
|
|
273
|
+
// could never be reached from a real page. The attribute still governs
|
|
274
|
+
// everything else, and an aria-hidden CONTAINER is skipped before the walk
|
|
275
|
+
// ever descends to the svg inside it.
|
|
276
|
+
if (tag === 'SVG') {
|
|
277
|
+
const name = iconName(el);
|
|
278
|
+
if (!name) {
|
|
279
|
+
skip('svg');
|
|
280
|
+
return [];
|
|
281
|
+
}
|
|
282
|
+
taken.nodes++;
|
|
283
|
+
return [{ kind: 'icon', name }];
|
|
284
|
+
}
|
|
204
285
|
// WHAT THE PAGE ITSELF SAYS IS NOT CONTENT.
|
|
205
286
|
//
|
|
206
287
|
// `aria-hidden="true"` is the author's own mark for decoration and for
|
|
@@ -222,6 +303,24 @@ function capturePage(limits) {
|
|
|
222
303
|
skip('hidden');
|
|
223
304
|
return [];
|
|
224
305
|
}
|
|
306
|
+
if (tag === 'DETAILS') {
|
|
307
|
+
const kids2 = Array.from(el.children);
|
|
308
|
+
const summary = kids2.filter((c) => c.tagName === 'SUMMARY')[0];
|
|
309
|
+
const label = summary ? clean(summary.textContent) : '';
|
|
310
|
+
const body = [];
|
|
311
|
+
for (const child of kids2) {
|
|
312
|
+
if (child.tagName === 'SUMMARY')
|
|
313
|
+
continue;
|
|
314
|
+
for (const c of walk(child))
|
|
315
|
+
body.push(c);
|
|
316
|
+
}
|
|
317
|
+
if (!label && body.length === 0) {
|
|
318
|
+
skip('empty-details');
|
|
319
|
+
return [];
|
|
320
|
+
}
|
|
321
|
+
taken.nodes++;
|
|
322
|
+
return [{ kind: 'accordion', children: [{ kind: 'accordion-item', text: label, children: body }] }];
|
|
323
|
+
}
|
|
225
324
|
// A RULE BETWEEN SECTIONS IS A DESIGN DECISION, and it is one node.
|
|
226
325
|
if (tag === 'HR') {
|
|
227
326
|
taken.nodes++;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sbuilder-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"description": "MCP server that designs and operates a Store Builder site — pages, data, theme and publish — through the platform's own API and live-edit protocol.",
|
|
5
5
|
"mcpName": "io.github.vuluu2k/sbuilder-mcp",
|
|
6
6
|
"type": "module",
|