@antscorp/antsomi-ui 2.0.109 → 2.0.110
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/README.md +78 -78
- package/es/__mocks__/1000_city.json +802 -802
- package/es/__mocks__/sql-query.json +56 -56
- package/es/assets/css/main.scss +6 -6
- package/es/assets/images/feedback.svg +3 -3
- package/es/assets/svg/mobile-frame.svg +3 -3
- package/es/assets/svg/warning-icon.svg +5 -5
- package/es/components/atoms/Alert/Alert.js +28 -28
- package/es/components/atoms/ContentEditable/styled.js +16 -16
- package/es/components/atoms/DividerPure/styled.js +35 -35
- package/es/components/atoms/Icon/index.js +19 -19
- package/es/components/atoms/Iframe/Iframe.js +18 -18
- package/es/components/atoms/Input/styled.js +104 -104
- package/es/components/atoms/InputDynamic/styled.js +284 -284
- package/es/components/atoms/MobileBrandingBar/styled.js +21 -21
- package/es/components/atoms/MobileFrame/styled.js +30 -30
- package/es/components/atoms/MobileFrameV2/styled.js +42 -42
- package/es/components/atoms/MobileFrameV3/styled.js +31 -31
- package/es/components/atoms/NotificationStatus/styled.js +10 -10
- package/es/components/atoms/PreviewTabs/styled.js +69 -69
- package/es/components/atoms/Radio/index.js +16 -16
- package/es/components/atoms/ReactIframe/ReactIframe.js +5 -5
- package/es/components/atoms/ReactIframe/styled.js +9 -9
- package/es/components/atoms/RequiredLabel/styled.js +3 -3
- package/es/components/atoms/ScrollBox/index.js +5 -5
- package/es/components/atoms/Scrollbars/styled.js +21 -21
- package/es/components/atoms/SlideBar/styled.js +194 -194
- package/es/components/atoms/Slider/styled.js +31 -31
- package/es/components/atoms/Space/Space.js +4 -4
- package/es/components/atoms/Spin/styled.js +11 -11
- package/es/components/atoms/Steps/styled.js +244 -244
- package/es/components/atoms/Switch/styled.js +56 -56
- package/es/components/atoms/Tag/Tag.js +10 -10
- package/es/components/atoms/Text/styled.js +34 -34
- package/es/components/icons/DomainManagementIcon.js +1 -1
- package/es/components/icons/LoadingIcon.js +33 -33
- package/es/components/icons/document/styled.js +43 -43
- package/es/components/index.scss +1 -1
- package/es/components/molecules/AccessDenied/styled.js +28 -28
- package/es/components/molecules/AccountSelection/styled.js +110 -110
- package/es/components/molecules/AddDynamicContent/styled.js +23 -23
- package/es/components/molecules/AlignSetting/styled.js +4 -4
- package/es/components/molecules/ApplyPopupContent/styled.js +32 -32
- package/es/components/molecules/CalendarSelection/components/AutoUpdateTo/styled.js +8 -8
- package/es/components/molecules/CalendarSelection/components/CustomPicker/styled.js +79 -79
- package/es/components/molecules/CalendarSelection/components/Footer/styled.js +4 -4
- package/es/components/molecules/CalendarSelection/components/RangePicker/styled.js +21 -21
- package/es/components/molecules/CalendarSelection/components/RangeSelectOptions/components/Option/Option.js +26 -26
- package/es/components/molecules/CalendarSelection/components/RangeSelectOptions/styled.js +30 -30
- package/es/components/molecules/CalendarSelection/components/TimeRangeDisplay/styled.js +26 -26
- package/es/components/molecules/CalendarSelection/styled.js +8 -8
- package/es/components/molecules/CaptureScreen/components/CommentBox/styled.js +119 -119
- package/es/components/molecules/CaptureScreen/components/Cursor/styled.js +67 -67
- package/es/components/molecules/CaptureScreen/styled.js +240 -240
- package/es/components/molecules/ChartTab/components/styled.js +24 -24
- package/es/components/molecules/ChartTab/styled.js +20 -20
- package/es/components/molecules/ChatBox/AntsomiAI.js +8 -8
- package/es/components/molecules/ChatBox/ChatBoxInsight/QuestionItem.js +9 -9
- package/es/components/molecules/ChatBox/ChatBoxInsight/styled.js +365 -365
- package/es/components/molecules/ChatBox/styled.js +324 -324
- package/es/components/molecules/CodeStructure/styled.js +5 -5
- package/es/components/molecules/ColorPicker/ChromePicker/styled.js +10 -10
- package/es/components/molecules/ColorPicker/CustomPicker/styled.js +89 -89
- package/es/components/molecules/ColorPicker/SketchPicker/styled.js +5 -5
- package/es/components/molecules/ColorPicker/styled.js +7 -7
- package/es/components/molecules/ColorSetting/styled.js +39 -39
- package/es/components/molecules/DatePicker/components/AdvancedPicker/styled.js +110 -110
- package/es/components/molecules/DatePickerV2/styled.js +6 -6
- package/es/components/molecules/DisplayFormat/styled.js +12 -12
- package/es/components/molecules/DrawerDetail/components/ToggleDrawerSizeButton.js +24 -24
- package/es/components/molecules/DrawerDetail/styled.js +109 -109
- package/es/components/molecules/Dropdown/style.scss +11 -11
- package/es/components/molecules/Dropdown/styled.js +28 -28
- package/es/components/molecules/EdgeSetting/styled.js +10 -10
- package/es/components/molecules/EditableName/styled.js +70 -70
- package/es/components/molecules/EditingList/styled.js +29 -29
- package/es/components/molecules/EditingListV2/components/List/List.js +9 -9
- package/es/components/molecules/EditorTab/styled.js +156 -156
- package/es/components/molecules/EmojiCollections/styled.js +22 -22
- package/es/components/molecules/EmojiPopover/styled.js +4 -4
- package/es/components/molecules/EmptyData/styled.js +53 -53
- package/es/components/molecules/FontSizeInput/index.scss +15 -15
- package/es/components/molecules/GradientSetting/styled.js +57 -57
- package/es/components/molecules/HeaderV2/styled.js +70 -70
- package/es/components/molecules/IconSelection/styled.js +69 -69
- package/es/components/molecules/ImageEditor/components/ModalShortcut.js +21 -21
- package/es/components/molecules/ImageEditor/styled.js +5 -5
- package/es/components/molecules/ImagePreview/styled.js +3 -3
- package/es/components/molecules/InputNumberWithUnit/styled.js +14 -14
- package/es/components/molecules/InputSearch/styled.js +41 -41
- package/es/components/molecules/ItemNotFound/styled.js +26 -26
- package/es/components/molecules/MatchAnySelect/components/ExtendValuePopup.js +8 -8
- package/es/components/molecules/MatchAnySelect/styled.js +247 -247
- package/es/components/molecules/Modal/styled.js +63 -63
- package/es/components/molecules/ModalSelect/styled.js +152 -152
- package/es/components/molecules/ModalV2/styled.js +27 -27
- package/es/components/molecules/PopupDraggable/styled.js +57 -57
- package/es/components/molecules/PreviewModal/styled.js +26 -26
- package/es/components/molecules/ProcessLoading/styled.js +2 -2
- package/es/components/molecules/QuillEditor/CustomToolbar.js +3165 -3165
- package/es/components/molecules/QuillEditor/EditorToolbar.js +7 -7
- package/es/components/molecules/QuillEditor/styled.js +25 -25
- package/es/components/molecules/RadioGroup/styled.js +9 -9
- package/es/components/molecules/RequestAccess/styled.js +38 -38
- package/es/components/molecules/ResizeGrid/components/Cell/styled.js +77 -77
- package/es/components/molecules/ResizeGrid/styled.js +50 -50
- package/es/components/molecules/RichMenu/RichMenuBlock/RichMenuCell/styled.js +118 -118
- package/es/components/molecules/RichMenu/RichMenuBlock/styled.js +13 -13
- package/es/components/molecules/RichMenu/RichMenuChatBar/TypingChat/styled.js +40 -40
- package/es/components/molecules/RichMenu/RichMenuChatBar/styled.js +27 -27
- package/es/components/molecules/RichMenu/RichMenuMobileView/RichMenuMobileView.js +2 -2
- package/es/components/molecules/RichMenu/RichMenuMobileView/styled.js +38 -38
- package/es/components/molecules/SearchPopover/components/PopoverSelect/styled.js +36 -36
- package/es/components/molecules/SearchPopover/components/PopoverSelect/styles.scss +7 -7
- package/es/components/molecules/SearchPopover/styled.js +32 -32
- package/es/components/molecules/Select/styled.js +32 -32
- package/es/components/molecules/SelectAccount/styled.js +147 -147
- package/es/components/molecules/SelectEventAttribute/styled.js +8 -8
- package/es/components/molecules/SelectMulti/styled.js +62 -62
- package/es/components/molecules/SelectV2/styled.js +124 -124
- package/es/components/molecules/SettingWrapper/styled.js +12 -12
- package/es/components/molecules/ShareAccess/components/GeneralAccess/styled.js +56 -56
- package/es/components/molecules/ShareAccess/components/LayoutContent/styled.js +5 -5
- package/es/components/molecules/ShareAccess/components/ModalTransferOwnerShip/styled.js +15 -15
- package/es/components/molecules/ShareAccess/components/PeopleAccess/styled.js +63 -63
- package/es/components/molecules/ShareAccess/components/SearchUser/styled.js +31 -31
- package/es/components/molecules/SliderWithInputNumber/styled.js +2 -2
- package/es/components/molecules/Tabs/Tabs.js +11 -11
- package/es/components/molecules/TagifyInput/TagifyInput.js +50 -50
- package/es/components/molecules/TagifyInput/styled.js +37 -37
- package/es/components/molecules/TagifyInput/utils.js +13 -13
- package/es/components/molecules/TagifyInput/utils.style.js +218 -218
- package/es/components/molecules/TemplateSaveAs/components/Category/Category.js +5 -5
- package/es/components/molecules/TemplateSaveAs/components/ImageSlider/styled.js +276 -276
- package/es/components/molecules/TemplateSaveAs/styled.js +134 -134
- package/es/components/molecules/ThumbnailCard/styled.js +92 -92
- package/es/components/molecules/Tree/styled.js +38 -38
- package/es/components/molecules/UnsubscribePreferences/styled.js +7 -7
- package/es/components/molecules/UnsubscribePreview/components/styled.js +53 -53
- package/es/components/molecules/UnsubscribePreview/styled.js +48 -48
- package/es/components/molecules/UploadImage/styled.js +114 -114
- package/es/components/molecules/VirtualizedMenu/styled.js +82 -82
- package/es/components/organism/AccountProfile/components/AccountSetting/components/EditableInput/styles.js +98 -98
- package/es/components/organism/AccountProfile/components/AccountSetting/components/LanguageSelector/styles.js +18 -18
- package/es/components/organism/AccountProfile/components/AccountSetting/styled.js +543 -543
- package/es/components/organism/AccountProfile/components/AccountSetting/styles.scss +39 -39
- package/es/components/organism/AccountSharing/styled.js +336 -336
- package/es/components/organism/ActivityTimeline/ActivityTimeline.js +3 -3
- package/es/components/organism/ActivityTimeline/__mocks__/event_tracking.json +1290 -1290
- package/es/components/organism/ActivityTimeline/__mocks__/timeline.json +1896 -3059
- package/es/components/organism/ActivityTimeline/components/ActionHistory/styled.js +28 -28
- package/es/components/organism/ActivityTimeline/components/CardMember/styled.js +60 -60
- package/es/components/organism/ActivityTimeline/components/ItemEvent/ItemEvent.js +7 -1
- package/es/components/organism/ActivityTimeline/components/ItemGroupEvent/ItemGroupEvent.js +14 -2
- package/es/components/organism/ActivityTimeline/components/ItemGroupEvent/styled.js +4 -4
- package/es/components/organism/ActivityTimeline/components/List/styled.js +77 -77
- package/es/components/organism/ActivityTimeline/components/ListItem/styled.js +37 -37
- package/es/components/organism/ActivityTimeline/components/ProductCard/styled.js +92 -92
- package/es/components/organism/ActivityTimeline/components/Redeem/styled.js +7 -7
- package/es/components/organism/ActivityTimeline/components/Slide/styled.js +20 -20
- package/es/components/organism/ActivityTimeline/components/TimeLineTitle/styled.js +7 -7
- package/es/components/organism/ActivityTimeline/components/TimelineSection/styled.js +69 -69
- package/es/components/organism/ActivityTimeline/constants.d.ts +18 -18
- package/es/components/organism/ActivityTimeline/constants.js +7 -8
- package/es/components/organism/ActivityTimeline/index.d.ts +530 -1
- package/es/components/organism/ActivityTimeline/index.js +9 -1
- package/es/components/organism/ActivityTimeline/styled.js +43 -39
- package/es/components/organism/ActivityTimeline/utils.d.ts +7 -1
- package/es/components/organism/ActivityTimeline/utils.js +224 -162
- package/es/components/organism/AlgorithmsSetting/styled.js +35 -35
- package/es/components/organism/BasicLogin/components/ChooseMethod/styled.js +19 -19
- package/es/components/organism/BasicLogin/components/LoginWithEmail/styled.js +3 -3
- package/es/components/organism/BasicLogin/components/LoginWithGG/styled.js +3 -3
- package/es/components/organism/BasicLogin/components/SignIn/styled.js +8 -8
- package/es/components/organism/BasicLogin/components/WidgetLayout/styled.js +18 -18
- package/es/components/organism/BasicLogin/styled.js +107 -107
- package/es/components/organism/ContentSources/styled.js +50 -50
- package/es/components/organism/DataTable/components/AddButton/index.js +8 -8
- package/es/components/organism/DataTable/components/ModifyColumn/styled.js +18 -18
- package/es/components/organism/DataTable/components/Pagination/styled.js +26 -26
- package/es/components/organism/DataTable/components/Table/styled.js +135 -135
- package/es/components/organism/DataTable/components/Toolbar/SearchPopover.js +17 -17
- package/es/components/organism/DataTable/components/Toolbar/styled.js +70 -70
- package/es/components/organism/DataTable/styled/index.js +84 -84
- package/es/components/organism/Filter/components/FilterCondition/styled.js +34 -34
- package/es/components/organism/Filter/styled.js +109 -109
- package/es/components/organism/FilterSetting/components/common/InputArray/styled.js +5 -5
- package/es/components/organism/FilterSetting/components/common/InputOrSelect/index.js +63 -63
- package/es/components/organism/FilterSetting/components/common/InputSelectMulti/ColumnSuggestion/index.js +31 -31
- package/es/components/organism/FilterSetting/components/common/InputSelectMulti/Tree/index.js +22 -22
- package/es/components/organism/FilterSetting/components/common/InputSelectMulti/index.js +55 -55
- package/es/components/organism/FilterSetting/styled.js +19 -19
- package/es/components/organism/Help/styled.js +267 -267
- package/es/components/organism/LeftMenu/components/HomeMenu/styled.js +39 -39
- package/es/components/organism/LeftMenu/components/common/ChildMenu/components/MenuItemImage/styled.js +16 -16
- package/es/components/organism/LeftMenu/components/common/ChildMenu/styled.js +156 -156
- package/es/components/organism/LeftMenu/styled.js +214 -214
- package/es/components/organism/Login/components/ChooseMethod/styled.js +19 -19
- package/es/components/organism/Login/components/ForgotPassword/styled.js +8 -8
- package/es/components/organism/Login/components/LoginSelectPortal/Item/styled.js +31 -31
- package/es/components/organism/Login/components/LoginSelectPortal/styled.js +3 -3
- package/es/components/organism/Login/components/LoginWithEmail/styled.js +3 -3
- package/es/components/organism/Login/components/LoginWithGG/styled.js +3 -3
- package/es/components/organism/Login/components/SetupGGAuthenticator/styled.js +7 -7
- package/es/components/organism/Login/components/SignIn/styled.js +8 -8
- package/es/components/organism/Login/components/VerifyAccount/styled.js +13 -13
- package/es/components/organism/Login/components/WidgetLayout/styled.js +18 -18
- package/es/components/organism/Login/styled.js +115 -115
- package/es/components/organism/Menu/styled.js +6 -6
- package/es/components/organism/ModifyColumnModal/styled.js +132 -132
- package/es/components/organism/Notification/styled.js +155 -155
- package/es/components/organism/PreviewCollections/Messages/SkeletonMessage/styled.js +14 -14
- package/es/components/organism/PreviewCollections/WhatsappMessage/CarouselMessage/styled.js +63 -63
- package/es/components/organism/PreviewCollections/constants.js +50 -50
- package/es/components/organism/PreviewCollections/styled.js +16 -16
- package/es/components/organism/PreviewTemplateModal/components/Banner/styled.js +78 -78
- package/es/components/organism/PreviewTemplateModal/components/Information/styled.js +52 -52
- package/es/components/organism/PreviewTemplateModal/components/SimilarTemplate/styled.js +18 -18
- package/es/components/organism/PreviewTemplateModal/components/ThumbnailSlider/styled.js +77 -77
- package/es/components/organism/PreviewTemplateModal/styled.js +21 -21
- package/es/components/organism/SQLGeneration/components/styled.js +354 -354
- package/es/components/organism/SQLGeneration/index.scss +1 -1
- package/es/components/organism/SQLGeneration/integrations/AceEditor/index.scss +4 -4
- package/es/components/organism/Table/CrossTabTable/components/CustomCell/styled.js +11 -11
- package/es/components/organism/Table/CrossTabTable/styled.js +11 -11
- package/es/components/organism/Table/ExplorePivotTable/components/CustomCell/styled.js +17 -17
- package/es/components/organism/Table/ExplorePivotTable/styled.js +11 -11
- package/es/components/organism/TicketEditor/styled.js +850 -850
- package/es/components/organism/TicketEditorV2/styled.js +839 -839
- package/es/components/organism/index.scss +1 -1
- package/es/components/template/Layout/Layout.js +10 -10
- package/es/components/template/Layout/components/RecommendationWorkspace/components/MenuMapping/components/OldLeftMenu/styled.js +73 -73
- package/es/components/template/Layout/components/RecommendationWorkspace/components/MenuMapping/styled.js +39 -39
- package/es/components/template/Layout/components/RecommendationWorkspace/components/RecommendationImage/styled.js +61 -61
- package/es/components/template/Layout/components/RecommendationWorkspace/styled.js +16 -16
- package/es/components/template/Layout/styled.js +84 -84
- package/es/components/template/TemplateListing/components/BlankTemplate/styled.js +21 -21
- package/es/components/template/TemplateListing/components/CategoryListing/styled.js +123 -123
- package/es/components/template/TemplateListing/components/Empty/styled.js +20 -20
- package/es/components/template/TemplateListing/stories/demo/styled.js +4 -4
- package/es/components/template/TemplateListing/styled/index.js +40 -40
- package/es/locales/en/google-sheet.json +109 -8
- package/es/locales/i18n.d.ts +306 -3
- package/es/locales/ja/google-sheet.json +301 -200
- package/es/locales/vi/google-sheet.json +118 -17
- package/es/providers/ConfigProvider/GlobalStyle.js +1249 -1249
- package/es/styled/common.js +51 -51
- package/es/tests/styled.js +4 -4
- package/es/utils/variables.js +7 -7
- package/package.json +267 -266
- package/CHANGELOG.md +0 -63
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
{
|
|
2
|
-
"queries": [
|
|
3
|
-
{
|
|
4
|
-
"name": "Tìm nhân viên có mức lương cao thứ hai của mỗi phòng ban",
|
|
5
|
-
"description": "Sử dụng Window Function DENSE_RANK() để xếp hạng nhân viên theo lương trong mỗi phòng ban và lấy ra những người có thứ hạng là 2.",
|
|
6
|
-
"query": "-- Sử dụng Window Function DENSE_RANK() để xếp hạng nhân viên theo lương trong mỗi phòng ban.\n-- DENSE_RANK() sẽ gán cùng một thứ hạng cho các nhân viên có cùng mức lương.\n-- Sau đó, chúng ta chỉ cần chọn những nhân viên có thứ hạng là 2.\nSELECT \n e.name,\n d.name AS department_name,\n e.salary\nFROM (\n SELECT\n e.name,\n e.salary,\n e.department_id,\n d.name AS department_name,\n -- Xếp hạng nhân viên theo mức lương giảm dần trong từng phòng ban.\n -- PARTITION BY chia dữ liệu thành các nhóm theo department_id.\n -- ORDER BY sắp xếp các dòng trong mỗi nhóm theo salary.\n DENSE_RANK() OVER (PARTITION BY e.department_id ORDER BY e.salary DESC) as salary_rank\n FROM \n employees e\n JOIN \n departments d ON e.department_id = d.id\n) as ranked_employees\nWHERE \n ranked_employees.salary_rank = 2;"
|
|
7
|
-
},
|
|
8
|
-
{
|
|
9
|
-
"name": "Tính tổng doanh số tích lũy của mỗi nhân viên theo thời gian",
|
|
10
|
-
"description": "Sử dụng Window Function SUM() với ORDER BY để tính tổng doanh số tích lũy (Running Total) cho từng nhân viên theo ngày bán hàng.",
|
|
11
|
-
"query": "-- Sử dụng Window Function SUM() với ORDER BY để tính tổng doanh số tích lũy (Running Total).\n-- Điều này cho phép chúng ta tính tổng của một cột trong một cửa sổ dữ liệu được sắp xếp.\nSELECT\n s.employee_id,\n s.sale_date,\n s.amount,\n -- Tính tổng doanh số tích lũy cho mỗi nhân viên.\n -- PARTITION BY employee_id đảm bảo tổng chỉ tính trong phạm vi của từng nhân viên.\n -- ORDER BY sale_date sắp xếp các giao dịch theo thời gian.\n -- Cửa sổ mặc định sẽ là từ đầu partition đến dòng hiện tại.\n SUM(s.amount) OVER (PARTITION BY s.employee_id ORDER BY s.sale_date) as cumulative_sales\nFROM\n sales s\nORDER BY \n s.employee_id, \n s.sale_date;"
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"name": "Tìm phòng ban có doanh số cao hơn mức trung bình của tất cả các phòng ban",
|
|
15
|
-
"description": "Kết hợp Common Table Expression (CTE) để tính tổng doanh số của mỗi phòng ban, sau đó dùng subquery để so sánh với mức trung bình chung.",
|
|
16
|
-
"query": "-- Sử dụng Common Table Expression (CTE) để tính tổng doanh số của mỗi phòng ban trước.\n-- Điều này giúp cho truy vấn chính trở nên gọn gàng và dễ hiểu hơn.\nWITH DepartmentSales AS (\n -- Bước 1: Tính tổng doanh số của mỗi phòng ban.\n SELECT \n d.id AS department_id,\n d.name AS department_name,\n SUM(s.amount) as total_department_sales\n FROM \n departments d\n JOIN \n employees e ON d.id = e.department_id\n JOIN \n sales s ON e.id = s.employee_id\n GROUP BY \n d.id, d.name\n)\n-- Bước 2: Truy vấn chính. Lấy những phòng ban có tổng doanh số lớn hơn mức trung bình của tất cả các phòng ban.\nSELECT\n department_name,\n total_department_sales\nFROM \n DepartmentSales\nWHERE\n total_department_sales > (\n -- Subquery: Tính mức trung bình của tổng doanh số của tất cả các phòng ban.\n -- Chúng ta không thể sử dụng trực tiếp AVG() trên total_department_sales ở đây.\n SELECT \n AVG(total_department_sales)\n FROM \n DepartmentSales\n );"
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
"name": "Tìm nhân viên không có giao dịch bán hàng trong 30 ngày gần nhất",
|
|
20
|
-
"description": "Sử dụng LEFT JOIN từ bảng nhân viên đến bảng doanh số và dùng HAVING cùng hàm DATEDIFF() để lọc ra những nhân viên không có giao dịch gần đây.",
|
|
21
|
-
"query": "-- Tìm nhân viên không có giao dịch nào trong 30 ngày gần nhất.\n-- Bước 1: LEFT JOIN từ bảng employees đến bảng sales.\n-- Điều này đảm bảo tất cả nhân viên đều được hiển thị, ngay cả khi họ không có giao dịch nào.\nSELECT \n e.name,\n e.department_id,\n e.salary\nFROM \n employees e\nLEFT JOIN \n sales s ON e.id = s.employee_id\nGROUP BY \n e.id, e.name, e.department_id, e.salary\n-- Bước 2: Sử dụng HAVING để lọc các nhóm (nhân viên)\n-- có giao dịch gần nhất (MAX(s.sale_date)) đã lâu hơn 30 ngày so với ngày hiện tại (CURDATE()).\n-- COALESCE() được sử dụng để xử lý trường hợp nhân viên chưa bao giờ có giao dịch nào,\n-- khi đó MAX(s.sale_date) sẽ là NULL. COALESCE sẽ thay thế NULL bằng một ngày rất xa trong quá khứ\n-- để đảm bảo điều kiện DATEDIFF() luôn đúng.\nHAVING \n COALESCE(MAX(s.sale_date), '1900-01-01') < CURDATE() - INTERVAL 30 DAY;"
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
"name": "Phân loại nhân viên dựa trên mức lương so với trung bình của phòng ban",
|
|
25
|
-
"description": "Sử dụng Window Function AVG() OVER() để tính mức lương trung bình của từng phòng ban, sau đó dùng CASE statement để phân loại từng nhân viên.",
|
|
26
|
-
"query": "-- Phân loại nhân viên dựa trên mức lương của họ so với mức lương trung bình của phòng ban.\nSELECT \n e.name,\n d.name AS department_name,\n e.salary,\n -- Sử dụng CASE statement để tạo một phân loại mới.\n -- Mức lương của từng nhân viên được so sánh với mức lương trung bình của phòng ban.\n CASE\n -- AVG(e.salary) OVER (PARTITION BY e.department_id) tính mức lương trung bình của mỗi phòng ban.\n -- Đây là một Window Function, giúp chúng ta tính toán giá trị tổng hợp (AVG) mà không làm mất các dòng dữ liệu chi tiết.\n WHEN e.salary > AVG(e.salary) OVER (PARTITION BY e.department_id) THEN 'Above Average'\n WHEN e.salary < AVG(e.salary) OVER (PARTITION BY e.department_id) THEN 'Below Average'\n ELSE 'Average'\n END AS salary_category\nFROM \n employees e\nJOIN \n departments d ON e.department_id = d.id;"
|
|
27
|
-
}
|
|
28
|
-
],
|
|
29
|
-
"queries_optimization": [
|
|
30
|
-
{
|
|
31
|
-
"name": "Query 1: Top 3 lương cao nhất mỗi phòng ban (Correlated Subquery)",
|
|
32
|
-
"description": "Đây là cách tiếp cận cổ điển nhưng kém hiệu quả nhất, sử dụng một subquery phụ thuộc vào truy vấn chính. Subquery này sẽ chạy lại cho mỗi dòng của bảng chính, gây tốn tài nguyên trên dữ liệu lớn.",
|
|
33
|
-
"query": "-- Sử dụng Correlated Subquery để tìm 3 nhân viên có lương cao nhất.\n-- Subquery bên trong sẽ đếm số lượng nhân viên trong cùng phòng ban\n-- có mức lương cao hơn hoặc bằng nhân viên hiện tại.\n-- Nếu số lượng đó nhỏ hơn 3, nhân viên hiện tại sẽ được chọn.\nSELECT\n\te1.name,\n\te1.salary,\n\td.name AS department_name\nFROM\n\temployees e1\nJOIN\n\tdepartments d ON e1.department_id = d.id\nWHERE\n\t3 > (SELECT\n\t\tCOUNT(DISTINCT e2.salary)\n\tFROM\n\t\temployees e2\n\tWHERE\n\t\te2.department_id = e1.department_id\n\t\tAND e2.salary > e1.salary\n\t);"
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
"name": "Query 2: Top 3 lương cao nhất mỗi phòng ban (Self-JOIN)",
|
|
37
|
-
"description": "Một cách tiếp cận cũ khác sử dụng Self-JOIN. Đây là một cải tiến nhỏ so với subquery nhưng vẫn phức tạp và khó đọc. Hiệu suất cũng không cao trên dữ liệu lớn.",
|
|
38
|
-
"query": "-- Sử dụng kỹ thuật Self-JOIN để so sánh mỗi nhân viên với những người khác\n-- trong cùng phòng ban có mức lương cao hơn.\n-- Sau đó, GROUP BY và COUNT() để lọc ra những nhân viên nằm trong top 3.\nSELECT\n\te1.name,\n\te1.salary,\n\td.name AS department_name\nFROM\n\temployees e1\nJOIN\n\tdepartments d ON e1.department_id = d.id\nLEFT JOIN\n\temployees e2 ON e1.department_id = e2.department_id AND e1.salary < e2.salary\nGROUP BY\n\te1.id, e1.name, e1.salary, d.name\nHAVING\n\tCOUNT(DISTINCT e2.salary) < 3\nORDER BY\n\td.name, e1.salary DESC;"
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"name": "Query 3: Top 3 lương cao nhất mỗi phòng ban (Window Function: RANK())",
|
|
42
|
-
"description": "Đây là cách hiện đại và được khuyến nghị nhất. Sử dụng Window Function giúp truy vấn hiệu quả và dễ đọc hơn rất nhiều. RANK() sẽ xếp hạng các nhân viên và bỏ qua các số thứ tự nếu có các giá trị bằng nhau.",
|
|
43
|
-
"query": "-- Cách hiện đại và hiệu quả nhất dùng Window Function RANK() trong một CTE (Common Table Expression).\n-- CTE giúp truy vấn dễ đọc hơn bằng cách tạo một tập kết quả tạm thời có tên.\nWITH RankedEmployees AS (\n\tSELECT\n\t\te.name,\n\t\te.salary,\n\t\td.name AS department_name,\n\t\t-- RANK() xếp hạng nhân viên theo lương trong từng phòng ban.\n\t\t-- PARTITION BY chia dữ liệu thành các nhóm theo department_id.\n\t\t-- ORDER BY sắp xếp các dòng trong mỗi nhóm theo salary DESC.\n\t\tRANK() OVER (PARTITION BY e.department_id ORDER BY e.salary DESC) as rnk\n\tFROM\n\t\temployees e\n\tJOIN\n\t\tdepartments d ON e.department_id = d.id\n)\n-- Truy vấn chính sẽ chọn ra các nhân viên có thứ hạng <= 3 từ CTE.\nSELECT\n\tname,\n\tsalary,\n\tdepartment_name\nFROM\n\tRankedEmployees\nWHERE\n\trnk <= 3\nORDER BY\n\tdepartment_name, salary DESC;"
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"name": "Query 4: Top 3 lương cao nhất mỗi phòng ban (Window Function: DENSE_RANK())",
|
|
47
|
-
"description": "Một biến thể của Query 3, sử dụng DENSE_RANK(). Chức năng này tương tự RANK() nhưng sẽ không bỏ qua các số thứ tự khi có các giá trị bằng nhau, phù hợp cho nhiều trường hợp phân tích hơn.",
|
|
48
|
-
"query": "-- Biến thể của cách trên, dùng DENSE_RANK() thay vì RANK().\n-- DENSE_RANK() sẽ không bỏ qua các số thứ tự khi có các giá trị bằng nhau.\nWITH RankedEmployees AS (\n\tSELECT\n\t\te.name,\n\t\te.salary,\n\t\td.name AS department_name,\n\t\t-- DENSE_RANK() xếp hạng nhân viên, không bỏ qua các số thứ tự.\n\t\tDENSE_RANK() OVER (PARTITION BY e.department_id ORDER BY e.salary DESC) as rnk\n\tFROM\n\t\temployees e\n\tJOIN\n\t\tdepartments d ON e.department_id = d.id\n)\n-- Truy vấn chính sẽ chọn ra các nhân viên có thứ hạng <= 3.\nSELECT\n\tname,\n\tsalary,\n\tdepartment_name\nFROM\n\tRankedEmployees\nWHERE\n\trnk <= 3\nORDER BY\n\tdepartment_name, salary DESC;"
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
"name": "Query 5: Top 3 lương cao nhất mỗi phòng ban (Với JSON output)",
|
|
52
|
-
"description": "Đây là một cách tiếp cận nâng cao hơn, kết hợp Window Function và các hàm JSON để nhóm dữ liệu thành một định dạng JSON duy nhất. Rất hữu ích cho việc tạo API hoặc xử lý dữ liệu phức tạp trên tầng ứng dụng.",
|
|
53
|
-
"query": "-- Kết hợp Window Function với hàm JSON để nhóm dữ liệu thành một định dạng JSON duy nhất.\n-- Rất hữu ích khi bạn muốn trả về dữ liệu có cấu trúc từ database mà không cần xử lý thêm ở tầng ứng dụng.\nWITH RankedEmployees AS (\n\tSELECT\n\t\te.name,\n\t\te.salary,\n\t\td.name AS department_name,\n\t\tROW_NUMBER() OVER (PARTITION BY e.department_id ORDER BY e.salary DESC) as rnk\n\tFROM\n\t\temployees e\n\tJOIN\n\t\tdepartments d ON e.department_id = d.id\n)\nSELECT\n\tdepartment_name,\n\t-- Sử dụng JSON_ARRAYAGG để tổng hợp các nhân viên vào một mảng JSON.\n\tJSON_ARRAYAGG(\n\t\tJSON_OBJECT('name', name, 'salary', salary)\n\t) AS top_employees\nFROM\n\tRankedEmployees\nWHERE\n\trnk <= 3\nGROUP BY\n\tdepartment_name\nORDER BY\n\tdepartment_name;"
|
|
54
|
-
}
|
|
55
|
-
]
|
|
56
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"queries": [
|
|
3
|
+
{
|
|
4
|
+
"name": "Tìm nhân viên có mức lương cao thứ hai của mỗi phòng ban",
|
|
5
|
+
"description": "Sử dụng Window Function DENSE_RANK() để xếp hạng nhân viên theo lương trong mỗi phòng ban và lấy ra những người có thứ hạng là 2.",
|
|
6
|
+
"query": "-- Sử dụng Window Function DENSE_RANK() để xếp hạng nhân viên theo lương trong mỗi phòng ban.\n-- DENSE_RANK() sẽ gán cùng một thứ hạng cho các nhân viên có cùng mức lương.\n-- Sau đó, chúng ta chỉ cần chọn những nhân viên có thứ hạng là 2.\nSELECT \n e.name,\n d.name AS department_name,\n e.salary\nFROM (\n SELECT\n e.name,\n e.salary,\n e.department_id,\n d.name AS department_name,\n -- Xếp hạng nhân viên theo mức lương giảm dần trong từng phòng ban.\n -- PARTITION BY chia dữ liệu thành các nhóm theo department_id.\n -- ORDER BY sắp xếp các dòng trong mỗi nhóm theo salary.\n DENSE_RANK() OVER (PARTITION BY e.department_id ORDER BY e.salary DESC) as salary_rank\n FROM \n employees e\n JOIN \n departments d ON e.department_id = d.id\n) as ranked_employees\nWHERE \n ranked_employees.salary_rank = 2;"
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"name": "Tính tổng doanh số tích lũy của mỗi nhân viên theo thời gian",
|
|
10
|
+
"description": "Sử dụng Window Function SUM() với ORDER BY để tính tổng doanh số tích lũy (Running Total) cho từng nhân viên theo ngày bán hàng.",
|
|
11
|
+
"query": "-- Sử dụng Window Function SUM() với ORDER BY để tính tổng doanh số tích lũy (Running Total).\n-- Điều này cho phép chúng ta tính tổng của một cột trong một cửa sổ dữ liệu được sắp xếp.\nSELECT\n s.employee_id,\n s.sale_date,\n s.amount,\n -- Tính tổng doanh số tích lũy cho mỗi nhân viên.\n -- PARTITION BY employee_id đảm bảo tổng chỉ tính trong phạm vi của từng nhân viên.\n -- ORDER BY sale_date sắp xếp các giao dịch theo thời gian.\n -- Cửa sổ mặc định sẽ là từ đầu partition đến dòng hiện tại.\n SUM(s.amount) OVER (PARTITION BY s.employee_id ORDER BY s.sale_date) as cumulative_sales\nFROM\n sales s\nORDER BY \n s.employee_id, \n s.sale_date;"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"name": "Tìm phòng ban có doanh số cao hơn mức trung bình của tất cả các phòng ban",
|
|
15
|
+
"description": "Kết hợp Common Table Expression (CTE) để tính tổng doanh số của mỗi phòng ban, sau đó dùng subquery để so sánh với mức trung bình chung.",
|
|
16
|
+
"query": "-- Sử dụng Common Table Expression (CTE) để tính tổng doanh số của mỗi phòng ban trước.\n-- Điều này giúp cho truy vấn chính trở nên gọn gàng và dễ hiểu hơn.\nWITH DepartmentSales AS (\n -- Bước 1: Tính tổng doanh số của mỗi phòng ban.\n SELECT \n d.id AS department_id,\n d.name AS department_name,\n SUM(s.amount) as total_department_sales\n FROM \n departments d\n JOIN \n employees e ON d.id = e.department_id\n JOIN \n sales s ON e.id = s.employee_id\n GROUP BY \n d.id, d.name\n)\n-- Bước 2: Truy vấn chính. Lấy những phòng ban có tổng doanh số lớn hơn mức trung bình của tất cả các phòng ban.\nSELECT\n department_name,\n total_department_sales\nFROM \n DepartmentSales\nWHERE\n total_department_sales > (\n -- Subquery: Tính mức trung bình của tổng doanh số của tất cả các phòng ban.\n -- Chúng ta không thể sử dụng trực tiếp AVG() trên total_department_sales ở đây.\n SELECT \n AVG(total_department_sales)\n FROM \n DepartmentSales\n );"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "Tìm nhân viên không có giao dịch bán hàng trong 30 ngày gần nhất",
|
|
20
|
+
"description": "Sử dụng LEFT JOIN từ bảng nhân viên đến bảng doanh số và dùng HAVING cùng hàm DATEDIFF() để lọc ra những nhân viên không có giao dịch gần đây.",
|
|
21
|
+
"query": "-- Tìm nhân viên không có giao dịch nào trong 30 ngày gần nhất.\n-- Bước 1: LEFT JOIN từ bảng employees đến bảng sales.\n-- Điều này đảm bảo tất cả nhân viên đều được hiển thị, ngay cả khi họ không có giao dịch nào.\nSELECT \n e.name,\n e.department_id,\n e.salary\nFROM \n employees e\nLEFT JOIN \n sales s ON e.id = s.employee_id\nGROUP BY \n e.id, e.name, e.department_id, e.salary\n-- Bước 2: Sử dụng HAVING để lọc các nhóm (nhân viên)\n-- có giao dịch gần nhất (MAX(s.sale_date)) đã lâu hơn 30 ngày so với ngày hiện tại (CURDATE()).\n-- COALESCE() được sử dụng để xử lý trường hợp nhân viên chưa bao giờ có giao dịch nào,\n-- khi đó MAX(s.sale_date) sẽ là NULL. COALESCE sẽ thay thế NULL bằng một ngày rất xa trong quá khứ\n-- để đảm bảo điều kiện DATEDIFF() luôn đúng.\nHAVING \n COALESCE(MAX(s.sale_date), '1900-01-01') < CURDATE() - INTERVAL 30 DAY;"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "Phân loại nhân viên dựa trên mức lương so với trung bình của phòng ban",
|
|
25
|
+
"description": "Sử dụng Window Function AVG() OVER() để tính mức lương trung bình của từng phòng ban, sau đó dùng CASE statement để phân loại từng nhân viên.",
|
|
26
|
+
"query": "-- Phân loại nhân viên dựa trên mức lương của họ so với mức lương trung bình của phòng ban.\nSELECT \n e.name,\n d.name AS department_name,\n e.salary,\n -- Sử dụng CASE statement để tạo một phân loại mới.\n -- Mức lương của từng nhân viên được so sánh với mức lương trung bình của phòng ban.\n CASE\n -- AVG(e.salary) OVER (PARTITION BY e.department_id) tính mức lương trung bình của mỗi phòng ban.\n -- Đây là một Window Function, giúp chúng ta tính toán giá trị tổng hợp (AVG) mà không làm mất các dòng dữ liệu chi tiết.\n WHEN e.salary > AVG(e.salary) OVER (PARTITION BY e.department_id) THEN 'Above Average'\n WHEN e.salary < AVG(e.salary) OVER (PARTITION BY e.department_id) THEN 'Below Average'\n ELSE 'Average'\n END AS salary_category\nFROM \n employees e\nJOIN \n departments d ON e.department_id = d.id;"
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"queries_optimization": [
|
|
30
|
+
{
|
|
31
|
+
"name": "Query 1: Top 3 lương cao nhất mỗi phòng ban (Correlated Subquery)",
|
|
32
|
+
"description": "Đây là cách tiếp cận cổ điển nhưng kém hiệu quả nhất, sử dụng một subquery phụ thuộc vào truy vấn chính. Subquery này sẽ chạy lại cho mỗi dòng của bảng chính, gây tốn tài nguyên trên dữ liệu lớn.",
|
|
33
|
+
"query": "-- Sử dụng Correlated Subquery để tìm 3 nhân viên có lương cao nhất.\n-- Subquery bên trong sẽ đếm số lượng nhân viên trong cùng phòng ban\n-- có mức lương cao hơn hoặc bằng nhân viên hiện tại.\n-- Nếu số lượng đó nhỏ hơn 3, nhân viên hiện tại sẽ được chọn.\nSELECT\n\te1.name,\n\te1.salary,\n\td.name AS department_name\nFROM\n\temployees e1\nJOIN\n\tdepartments d ON e1.department_id = d.id\nWHERE\n\t3 > (SELECT\n\t\tCOUNT(DISTINCT e2.salary)\n\tFROM\n\t\temployees e2\n\tWHERE\n\t\te2.department_id = e1.department_id\n\t\tAND e2.salary > e1.salary\n\t);"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"name": "Query 2: Top 3 lương cao nhất mỗi phòng ban (Self-JOIN)",
|
|
37
|
+
"description": "Một cách tiếp cận cũ khác sử dụng Self-JOIN. Đây là một cải tiến nhỏ so với subquery nhưng vẫn phức tạp và khó đọc. Hiệu suất cũng không cao trên dữ liệu lớn.",
|
|
38
|
+
"query": "-- Sử dụng kỹ thuật Self-JOIN để so sánh mỗi nhân viên với những người khác\n-- trong cùng phòng ban có mức lương cao hơn.\n-- Sau đó, GROUP BY và COUNT() để lọc ra những nhân viên nằm trong top 3.\nSELECT\n\te1.name,\n\te1.salary,\n\td.name AS department_name\nFROM\n\temployees e1\nJOIN\n\tdepartments d ON e1.department_id = d.id\nLEFT JOIN\n\temployees e2 ON e1.department_id = e2.department_id AND e1.salary < e2.salary\nGROUP BY\n\te1.id, e1.name, e1.salary, d.name\nHAVING\n\tCOUNT(DISTINCT e2.salary) < 3\nORDER BY\n\td.name, e1.salary DESC;"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"name": "Query 3: Top 3 lương cao nhất mỗi phòng ban (Window Function: RANK())",
|
|
42
|
+
"description": "Đây là cách hiện đại và được khuyến nghị nhất. Sử dụng Window Function giúp truy vấn hiệu quả và dễ đọc hơn rất nhiều. RANK() sẽ xếp hạng các nhân viên và bỏ qua các số thứ tự nếu có các giá trị bằng nhau.",
|
|
43
|
+
"query": "-- Cách hiện đại và hiệu quả nhất dùng Window Function RANK() trong một CTE (Common Table Expression).\n-- CTE giúp truy vấn dễ đọc hơn bằng cách tạo một tập kết quả tạm thời có tên.\nWITH RankedEmployees AS (\n\tSELECT\n\t\te.name,\n\t\te.salary,\n\t\td.name AS department_name,\n\t\t-- RANK() xếp hạng nhân viên theo lương trong từng phòng ban.\n\t\t-- PARTITION BY chia dữ liệu thành các nhóm theo department_id.\n\t\t-- ORDER BY sắp xếp các dòng trong mỗi nhóm theo salary DESC.\n\t\tRANK() OVER (PARTITION BY e.department_id ORDER BY e.salary DESC) as rnk\n\tFROM\n\t\temployees e\n\tJOIN\n\t\tdepartments d ON e.department_id = d.id\n)\n-- Truy vấn chính sẽ chọn ra các nhân viên có thứ hạng <= 3 từ CTE.\nSELECT\n\tname,\n\tsalary,\n\tdepartment_name\nFROM\n\tRankedEmployees\nWHERE\n\trnk <= 3\nORDER BY\n\tdepartment_name, salary DESC;"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"name": "Query 4: Top 3 lương cao nhất mỗi phòng ban (Window Function: DENSE_RANK())",
|
|
47
|
+
"description": "Một biến thể của Query 3, sử dụng DENSE_RANK(). Chức năng này tương tự RANK() nhưng sẽ không bỏ qua các số thứ tự khi có các giá trị bằng nhau, phù hợp cho nhiều trường hợp phân tích hơn.",
|
|
48
|
+
"query": "-- Biến thể của cách trên, dùng DENSE_RANK() thay vì RANK().\n-- DENSE_RANK() sẽ không bỏ qua các số thứ tự khi có các giá trị bằng nhau.\nWITH RankedEmployees AS (\n\tSELECT\n\t\te.name,\n\t\te.salary,\n\t\td.name AS department_name,\n\t\t-- DENSE_RANK() xếp hạng nhân viên, không bỏ qua các số thứ tự.\n\t\tDENSE_RANK() OVER (PARTITION BY e.department_id ORDER BY e.salary DESC) as rnk\n\tFROM\n\t\temployees e\n\tJOIN\n\t\tdepartments d ON e.department_id = d.id\n)\n-- Truy vấn chính sẽ chọn ra các nhân viên có thứ hạng <= 3.\nSELECT\n\tname,\n\tsalary,\n\tdepartment_name\nFROM\n\tRankedEmployees\nWHERE\n\trnk <= 3\nORDER BY\n\tdepartment_name, salary DESC;"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"name": "Query 5: Top 3 lương cao nhất mỗi phòng ban (Với JSON output)",
|
|
52
|
+
"description": "Đây là một cách tiếp cận nâng cao hơn, kết hợp Window Function và các hàm JSON để nhóm dữ liệu thành một định dạng JSON duy nhất. Rất hữu ích cho việc tạo API hoặc xử lý dữ liệu phức tạp trên tầng ứng dụng.",
|
|
53
|
+
"query": "-- Kết hợp Window Function với hàm JSON để nhóm dữ liệu thành một định dạng JSON duy nhất.\n-- Rất hữu ích khi bạn muốn trả về dữ liệu có cấu trúc từ database mà không cần xử lý thêm ở tầng ứng dụng.\nWITH RankedEmployees AS (\n\tSELECT\n\t\te.name,\n\t\te.salary,\n\t\td.name AS department_name,\n\t\tROW_NUMBER() OVER (PARTITION BY e.department_id ORDER BY e.salary DESC) as rnk\n\tFROM\n\t\temployees e\n\tJOIN\n\t\tdepartments d ON e.department_id = d.id\n)\nSELECT\n\tdepartment_name,\n\t-- Sử dụng JSON_ARRAYAGG để tổng hợp các nhân viên vào một mảng JSON.\n\tJSON_ARRAYAGG(\n\t\tJSON_OBJECT('name', name, 'salary', salary)\n\t) AS top_employees\nFROM\n\tRankedEmployees\nWHERE\n\trnk <= 3\nGROUP BY\n\tdepartment_name\nORDER BY\n\tdepartment_name;"
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
}
|
package/es/assets/css/main.scss
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
@use '../../components';
|
|
2
|
-
|
|
3
|
-
:root {
|
|
4
|
-
--primary-color: #005fb8;
|
|
5
|
-
--text-base-color: #222222;
|
|
6
|
-
}
|
|
1
|
+
@use '../../components';
|
|
2
|
+
|
|
3
|
+
:root {
|
|
4
|
+
--primary-color: #005fb8;
|
|
5
|
+
--text-base-color: #222222;
|
|
6
|
+
}
|