@cyberskill/design 1.1.1 → 1.2.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/DESIGN.md +25 -3
- package/README.md +3 -3
- package/SKILL.md +3 -3
- package/VERSION +1 -1
- package/_ds_bundle.js +819 -416
- package/_ds_manifest.json +1 -1
- package/_esm/cs.mjs +18 -4
- package/_esm/react.d.ts +2 -0
- package/_esm/react.mjs +1 -0
- package/base/a11y.css +18 -0
- package/base/ai.css +2 -2
- package/base/collections.css +8 -3
- package/base/components.css +11 -2
- package/base/controls.css +61 -48
- package/base/data.css +3 -3
- package/base/feedback.css +5 -0
- package/base/forms.css +9 -3
- package/base/glass.css +6 -0
- package/base/navigation.css +8 -2
- package/base/reset.css +1 -1
- package/base/responsive.css +25 -0
- package/base/shell.css +7 -1
- package/components/_i18n/i18n.js +13 -1
- package/components/_i18n/strings.js +52 -3
- package/components/ai/ConfidenceMeter.jsx +8 -6
- package/components/data/Watermark.jsx +11 -3
- package/components/datatable/DataGrid.jsx +10 -1
- package/components/dialog/Dialog.jsx +13 -45
- package/components/feedback/ProgressBar.jsx +4 -2
- package/components/forms/Cascader.jsx +69 -6
- package/components/forms/Editor.jsx +37 -2
- package/components/forms/FileUpload.jsx +22 -8
- package/components/forms/Switch.jsx +16 -2
- package/components/forms/TimePicker.jsx +3 -1
- package/components/icon/Icon.jsx +1 -0
- package/components/navigation/CommandPalette.jsx +22 -7
- package/components/navigation/Toolbar.jsx +2 -1
- package/components/overlays/AlertDialog.jsx +19 -49
- package/components/overlays/Drawer.jsx +24 -20
- package/components/overlays/OverlayManager.d.ts +40 -0
- package/components/overlays/OverlayManager.jsx +214 -0
- package/components/overlays/OverlayManager.prompt.md +12 -0
- package/components/overlays/Tour.jsx +14 -7
- package/dist/styles.min.css +2004 -0
- package/docs/benchmark-rubric.md +1 -1
- package/docs/ci-cd.md +3 -1
- package/docs/consuming.md +6 -6
- package/docs/conventions.md +4 -4
- package/docs/decisions/container-query-migration.md +18 -0
- package/docs/decisions/overlay-manager-design.md +101 -0
- package/docs/decisions.md +5 -5
- package/docs/design-styles.md +1 -1
- package/docs/plans/cyberskill-design-system-audit-and-12-month-evolution-plan.md +1490 -0
- package/docs/quality-gates.md +20 -8
- package/docs/release-notes.md +2 -2
- package/docs/status/data/status-feed.json +1 -1
- package/docs/status/index.html +9 -5
- package/docs/status/status-legacy.html +12 -7
- package/docs/sync.md +1 -1
- package/docs/tasks/_state/commit-links.yaml +14 -0
- package/docs/vi/benchmark-rubric.md +1 -1
- package/docs/vi/ci-cd.md +3 -1
- package/docs/vi/consuming.md +6 -6
- package/docs/vi/conventions.md +2 -2
- package/docs/vi/decisions.md +4 -4
- package/docs/vi/quality-gates.md +21 -9
- package/docs/vi/release-notes.md +2 -2
- package/docs/vi/sync.md +1 -1
- package/guidelines/atomic-view.html +11 -7
- package/llms.txt +2 -2
- package/package.json +14 -6
- package/templates/_ds-base.canonical.js +55 -0
- package/templates/ai-cluster-demo.html +2 -2
- package/templates/app-shell/AppShell.dc.html +5 -3
- package/templates/app-shell/ds-base.js +33 -1
- package/templates/app-shell/support.js +13 -20
- package/templates/article/Article.dc.html +5 -1
- package/templates/article/ds-base.js +33 -1
- package/templates/article/support.js +13 -20
- package/templates/auth/Auth.dc.html +10 -5
- package/templates/auth/content-schema.json +12 -0
- package/templates/auth/ds-base.js +33 -1
- package/templates/auth/support.js +13 -20
- package/templates/bod-deck/BodDeck.dc.html +11 -10
- package/templates/bod-deck/ds-base.js +33 -1
- package/templates/bod-deck/support.js +13 -20
- package/templates/bod-investor-update/BodInvestorUpdate.dc.html +4 -3
- package/templates/bod-investor-update/ds-base.js +33 -1
- package/templates/bod-investor-update/support.js +13 -20
- package/templates/bod-memo/BodMemo.dc.html +6 -5
- package/templates/bod-memo/ds-base.js +33 -1
- package/templates/bod-memo/support.js +13 -20
- package/templates/bod-minutes/BodMinutes.dc.html +2 -1
- package/templates/bod-minutes/ds-base.js +33 -1
- package/templates/bod-minutes/support.js +13 -20
- package/templates/bod-report/BodReport.dc.html +3 -2
- package/templates/bod-report/ds-base.js +33 -1
- package/templates/bod-report/support.js +13 -20
- package/templates/bod-resolution/BodResolution.dc.html +5 -4
- package/templates/bod-resolution/ds-base.js +33 -1
- package/templates/bod-resolution/support.js +13 -20
- package/templates/culture-event-invite/CultureEventInvite.dc.html +3 -2
- package/templates/culture-event-invite/ds-base.js +33 -1
- package/templates/culture-event-invite/support.js +13 -20
- package/templates/dashboard/Dashboard.dc.html +7 -3
- package/templates/dashboard/ds-base.js +33 -1
- package/templates/dashboard/support.js +13 -20
- package/templates/delivery-change-note/DeliveryChangeNote.dc.html +2 -1
- package/templates/delivery-change-note/ds-base.js +33 -1
- package/templates/delivery-change-note/support.js +13 -20
- package/templates/delivery-kickoff/DeliveryKickoff.dc.html +3 -2
- package/templates/delivery-kickoff/ds-base.js +33 -1
- package/templates/delivery-kickoff/support.js +13 -20
- package/templates/delivery-qbr-deck/DeliveryQbrDeck.dc.html +6 -5
- package/templates/delivery-qbr-deck/ds-base.js +33 -1
- package/templates/delivery-qbr-deck/support.js +13 -20
- package/templates/delivery-runbook/DeliveryRunbook.dc.html +3 -2
- package/templates/delivery-runbook/ds-base.js +33 -1
- package/templates/delivery-runbook/support.js +13 -20
- package/templates/delivery-status-email/DeliveryStatusEmail.dc.html +3 -2
- package/templates/delivery-status-email/ds-base.js +33 -1
- package/templates/delivery-status-email/support.js +13 -20
- package/templates/doc-style-guide/DocStyleGuide.dc.html +67 -64
- package/templates/doc-style-guide/ds-base.js +33 -1
- package/templates/doc-style-guide/support.js +13 -20
- package/templates/doc-suite-index/DocSuiteIndex.dc.html +46 -45
- package/templates/doc-suite-index/ds-base.js +33 -1
- package/templates/doc-suite-index/support.js +13 -20
- package/templates/doc-templates/DocTemplates.dc.html +42 -41
- package/templates/doc-templates/ds-base.js +33 -1
- package/templates/doc-templates/support.js +13 -20
- package/templates/email/Email.dc.html +3 -2
- package/templates/email/ds-base.js +33 -1
- package/templates/email/support.js +13 -20
- package/templates/finance-dunning-email/FinanceDunningEmail.dc.html +4 -3
- package/templates/finance-dunning-email/ds-base.js +33 -1
- package/templates/finance-dunning-email/support.js +13 -20
- package/templates/finance-expense-report/FinanceExpenseReport.dc.html +4 -3
- package/templates/finance-expense-report/ds-base.js +33 -1
- package/templates/finance-expense-report/support.js +13 -20
- package/templates/finance-invoice/FinanceInvoice.dc.html +4 -3
- package/templates/finance-invoice/ds-base.js +33 -1
- package/templates/finance-invoice/support.js +13 -20
- package/templates/finance-quote/FinanceQuote.dc.html +4 -3
- package/templates/finance-quote/ds-base.js +33 -1
- package/templates/finance-quote/support.js +13 -20
- package/templates/hr-announcement/HrAnnouncement.dc.html +5 -4
- package/templates/hr-announcement/ds-base.js +33 -1
- package/templates/hr-announcement/support.js +13 -20
- package/templates/hr-interview-kit/HrInterviewKit.dc.html +4 -3
- package/templates/hr-interview-kit/ds-base.js +33 -1
- package/templates/hr-interview-kit/support.js +13 -20
- package/templates/hr-offboarding/HrOffboarding.dc.html +2 -1
- package/templates/hr-offboarding/ds-base.js +33 -1
- package/templates/hr-offboarding/support.js +13 -20
- package/templates/hr-performance-review/HrPerformanceReview.dc.html +2 -1
- package/templates/hr-performance-review/ds-base.js +33 -1
- package/templates/hr-performance-review/support.js +13 -20
- package/templates/hr-pip/HrPip.dc.html +2 -1
- package/templates/hr-pip/ds-base.js +33 -1
- package/templates/hr-pip/support.js +13 -20
- package/templates/kitchen-sink.html +9 -4
- package/templates/legal-msa/LegalMsa.dc.html +2 -1
- package/templates/legal-msa/ds-base.js +33 -1
- package/templates/legal-msa/support.js +13 -20
- package/templates/legal-sow/LegalSow.dc.html +2 -1
- package/templates/legal-sow/ds-base.js +33 -1
- package/templates/legal-sow/support.js +13 -20
- package/templates/marketing-campaign-brief/MarketingCampaignBrief.dc.html +3 -2
- package/templates/marketing-campaign-brief/ds-base.js +33 -1
- package/templates/marketing-campaign-brief/support.js +13 -20
- package/templates/marketing-case-study/MarketingCaseStudy.dc.html +5 -4
- package/templates/marketing-case-study/ds-base.js +33 -1
- package/templates/marketing-case-study/support.js +13 -20
- package/templates/marketing-launch/MarketingLaunch.dc.html +6 -5
- package/templates/marketing-launch/ds-base.js +33 -1
- package/templates/marketing-launch/support.js +13 -20
- package/templates/marketing-newsletter/MarketingNewsletter.dc.html +13 -12
- package/templates/marketing-newsletter/ds-base.js +33 -1
- package/templates/marketing-newsletter/support.js +13 -20
- package/templates/marketing-page/MarketingPage.dc.html +17 -12
- package/templates/marketing-page/ds-base.js +33 -1
- package/templates/marketing-page/support.js +13 -20
- package/templates/marketing-press-release/MarketingPressRelease.dc.html +2 -1
- package/templates/marketing-press-release/ds-base.js +33 -1
- package/templates/marketing-press-release/support.js +13 -20
- package/templates/marketing-social-kit/MarketingSocialKit.dc.html +5 -4
- package/templates/marketing-social-kit/ds-base.js +33 -1
- package/templates/marketing-social-kit/support.js +13 -20
- package/templates/sales-one-pager/SalesOnePager.dc.html +5 -4
- package/templates/sales-one-pager/ds-base.js +33 -1
- package/templates/sales-one-pager/support.js +13 -20
- package/templates/sales-proposal-deck/SalesProposalDeck.dc.html +7 -6
- package/templates/sales-proposal-deck/ds-base.js +33 -1
- package/templates/sales-proposal-deck/support.js +13 -20
- package/templates/settings/Settings.dc.html +5 -1
- package/templates/settings/ds-base.js +33 -1
- package/templates/settings/support.js +13 -20
- package/templates/slide-deck/SlideDeck.dc.html +5 -4
- package/templates/slide-deck/ds-base.js +33 -1
- package/templates/slide-deck/support.js +13 -20
- package/templates/team-meeting-agenda/TeamMeetingAgenda.dc.html +2 -1
- package/templates/team-meeting-agenda/ds-base.js +33 -1
- package/templates/team-meeting-agenda/support.js +13 -20
- package/templates/tech-incident-report/TechIncidentReport.dc.html +3 -2
- package/templates/tech-incident-report/ds-base.js +33 -1
- package/templates/tech-incident-report/support.js +13 -20
- package/templates/tech-release-notes/TechReleaseNotes.dc.html +6 -5
- package/templates/tech-release-notes/ds-base.js +33 -1
- package/templates/tech-release-notes/support.js +13 -20
- package/templates/tech-retro/TechRetro.dc.html +4 -3
- package/templates/tech-retro/ds-base.js +33 -1
- package/templates/tech-retro/support.js +13 -20
- package/templates/tech-rfc/TechRfc.dc.html +3 -2
- package/templates/tech-rfc/ds-base.js +33 -1
- package/templates/tech-rfc/support.js +13 -20
- package/templates/vn-appointment-transfer/VnAppointmentTransfer.dc.html +36 -35
- package/templates/vn-appointment-transfer/ds-base.js +33 -1
- package/templates/vn-appointment-transfer/support.js +13 -20
- package/templates/vn-certificate-of-employment/VnCertificateOfEmployment.dc.html +27 -26
- package/templates/vn-certificate-of-employment/ds-base.js +33 -1
- package/templates/vn-certificate-of-employment/support.js +13 -20
- package/templates/vn-code-of-conduct/VnCodeOfConduct.dc.html +44 -43
- package/templates/vn-code-of-conduct/ds-base.js +33 -1
- package/templates/vn-code-of-conduct/support.js +13 -20
- package/templates/vn-compensation-regulation/VnCompensationRegulation.dc.html +53 -52
- package/templates/vn-compensation-regulation/ds-base.js +33 -1
- package/templates/vn-compensation-regulation/support.js +13 -20
- package/templates/vn-contract-amendment/VnContractAmendment.dc.html +41 -40
- package/templates/vn-contract-amendment/ds-base.js +33 -1
- package/templates/vn-contract-amendment/support.js +13 -20
- package/templates/vn-contractor-agreement/VnContractorAgreement.dc.html +50 -49
- package/templates/vn-contractor-agreement/ds-base.js +33 -1
- package/templates/vn-contractor-agreement/support.js +13 -20
- package/templates/vn-data-protection-policy/VnDataProtectionPolicy.dc.html +54 -53
- package/templates/vn-data-protection-policy/ds-base.js +33 -1
- package/templates/vn-data-protection-policy/support.js +13 -20
- package/templates/vn-disciplinary-case-file/VnDisciplinaryCaseFile.dc.html +72 -71
- package/templates/vn-disciplinary-case-file/ds-base.js +33 -1
- package/templates/vn-disciplinary-case-file/support.js +13 -20
- package/templates/vn-disciplinary-schedule/VnDisciplinarySchedule.dc.html +21 -20
- package/templates/vn-disciplinary-schedule/ds-base.js +33 -1
- package/templates/vn-disciplinary-schedule/support.js +13 -20
- package/templates/vn-employee-request/VnEmployeeRequest.dc.html +54 -53
- package/templates/vn-employee-request/ds-base.js +33 -1
- package/templates/vn-employee-request/support.js +13 -20
- package/templates/vn-exit-handover/VnExitHandover.dc.html +122 -121
- package/templates/vn-exit-handover/ds-base.js +33 -1
- package/templates/vn-exit-handover/support.js +13 -20
- package/templates/vn-foreign-employee-pack/VnForeignEmployeePack.dc.html +31 -30
- package/templates/vn-foreign-employee-pack/ds-base.js +33 -1
- package/templates/vn-foreign-employee-pack/support.js +13 -20
- package/templates/vn-grassroots-democracy/VnGrassrootsDemocracy.dc.html +54 -53
- package/templates/vn-grassroots-democracy/ds-base.js +33 -1
- package/templates/vn-grassroots-democracy/support.js +13 -20
- package/templates/vn-infosec-policy/VnInfosecPolicy.dc.html +50 -49
- package/templates/vn-infosec-policy/ds-base.js +33 -1
- package/templates/vn-infosec-policy/support.js +13 -20
- package/templates/vn-internal-labor-regulations/VnInternalLaborRegulations.dc.html +84 -83
- package/templates/vn-internal-labor-regulations/ds-base.js +33 -1
- package/templates/vn-internal-labor-regulations/support.js +13 -20
- package/templates/vn-internship-agreement/VnInternshipAgreement.dc.html +44 -43
- package/templates/vn-internship-agreement/ds-base.js +33 -1
- package/templates/vn-internship-agreement/support.js +13 -20
- package/templates/vn-job-description/VnJobDescription.dc.html +28 -27
- package/templates/vn-job-description/ds-base.js +33 -1
- package/templates/vn-job-description/support.js +13 -20
- package/templates/vn-labor-contract/VnLaborContract.dc.html +109 -108
- package/templates/vn-labor-contract/ds-base.js +33 -1
- package/templates/vn-labor-contract/support.js +13 -20
- package/templates/vn-labour-management-book/VnLabourManagementBook.dc.html +32 -31
- package/templates/vn-labour-management-book/ds-base.js +33 -1
- package/templates/vn-labour-management-book/support.js +13 -20
- package/templates/vn-mutual-nda/VnMutualNda.dc.html +45 -44
- package/templates/vn-mutual-nda/ds-base.js +33 -1
- package/templates/vn-mutual-nda/support.js +13 -20
- package/templates/vn-ndnca-ip/VnNdncaIp.dc.html +73 -72
- package/templates/vn-ndnca-ip/ds-base.js +33 -1
- package/templates/vn-ndnca-ip/support.js +13 -20
- package/templates/vn-offer-letter/VnOfferLetter.dc.html +32 -31
- package/templates/vn-offer-letter/ds-base.js +33 -1
- package/templates/vn-offer-letter/support.js +13 -20
- package/templates/vn-onboarding-checklist/VnOnboardingChecklist.dc.html +16 -15
- package/templates/vn-onboarding-checklist/ds-base.js +33 -1
- package/templates/vn-onboarding-checklist/support.js +13 -20
- package/templates/vn-pdpl-consent/VnPdplConsent.dc.html +43 -42
- package/templates/vn-pdpl-consent/ds-base.js +33 -1
- package/templates/vn-pdpl-consent/support.js +13 -20
- package/templates/vn-performance-evaluation-regulation/VnPerformanceEvaluationRegulation.dc.html +65 -64
- package/templates/vn-performance-evaluation-regulation/ds-base.js +33 -1
- package/templates/vn-performance-evaluation-regulation/support.js +13 -20
- package/templates/vn-performance-review-form/VnPerformanceReviewForm.dc.html +49 -48
- package/templates/vn-performance-review-form/ds-base.js +33 -1
- package/templates/vn-performance-review-form/support.js +13 -20
- package/templates/vn-phantom-stock/VnPhantomStock.dc.html +41 -40
- package/templates/vn-phantom-stock/ds-base.js +33 -1
- package/templates/vn-phantom-stock/support.js +13 -20
- package/templates/vn-probation-contract/VnProbationContract.dc.html +56 -55
- package/templates/vn-probation-contract/ds-base.js +33 -1
- package/templates/vn-probation-contract/support.js +13 -20
- package/templates/vn-receipt-acknowledgement/VnReceiptAcknowledgement.dc.html +28 -27
- package/templates/vn-receipt-acknowledgement/ds-base.js +33 -1
- package/templates/vn-receipt-acknowledgement/support.js +13 -20
- package/templates/vn-remote-work-policy/VnRemoteWorkPolicy.dc.html +44 -43
- package/templates/vn-remote-work-policy/ds-base.js +33 -1
- package/templates/vn-remote-work-policy/support.js +13 -20
- package/templates/vn-resignation-letter/VnResignationLetter.dc.html +20 -19
- package/templates/vn-resignation-letter/ds-base.js +33 -1
- package/templates/vn-resignation-letter/support.js +13 -20
- package/templates/vn-salary-scale/VnSalaryScale.dc.html +39 -38
- package/templates/vn-salary-scale/ds-base.js +33 -1
- package/templates/vn-salary-scale/support.js +13 -20
- package/templates/vn-sow-appendix/VnSowAppendix.dc.html +21 -20
- package/templates/vn-sow-appendix/ds-base.js +33 -1
- package/templates/vn-sow-appendix/support.js +13 -20
- package/templates/vn-termination-decision/VnTerminationDecision.dc.html +25 -24
- package/templates/vn-termination-decision/ds-base.js +33 -1
- package/templates/vn-termination-decision/support.js +13 -20
- package/templates/vn-total-rewards-appendix/VnTotalRewardsAppendix.dc.html +63 -62
- package/templates/vn-total-rewards-appendix/ds-base.js +33 -1
- package/templates/vn-total-rewards-appendix/support.js +13 -20
- package/templates/vn-training-commitment/VnTrainingCommitment.dc.html +39 -38
- package/templates/vn-training-commitment/ds-base.js +33 -1
- package/templates/vn-training-commitment/support.js +13 -20
- package/templates/vn-travel-expense-policy/VnTravelExpensePolicy.dc.html +50 -49
- package/templates/vn-travel-expense-policy/ds-base.js +33 -1
- package/templates/vn-travel-expense-policy/support.js +13 -20
- package/tokens/colors.css +19 -1
- package/tokens/component-tokens.css +1 -0
- package/tokens/elements.css +35 -2
- package/tokens/elevation.css +8 -2
- package/tokens/native/CSTokens.kt +35 -1
- package/tokens/native/CSTokens.swift +35 -1
- package/tokens/native/cs_tokens.dart +35 -1
- package/tokens/provenance.json +12 -12
- package/tokens/spacing.css +2 -0
- package/tokens/tokens.dtcg.json +111 -3
- package/tokens/tokens.js +46 -6
- package/tokens/tokens.json +45 -5
- package/tokens/typography.css +2 -0
- package/ui_kits/deck/index.html +4 -0
- package/ui_kits/status-hub/StatusHub.jsx +30 -4
- package/ui_kits/status-hub/index.html +3 -3
- package/ui_kits/status-hub/login.html +4 -0
- package/ui_kits/status-hub/project.html +4 -0
- package/ui_kits/status-hub/settings.html +35 -13
- package/ui_kits/status-hub/status.css +5 -1
- package/ui_kits/website/Website.jsx +25 -3
- package/ui_kits/website/careers.html +4 -0
- package/ui_kits/website/chat.html +5 -3
- package/ui_kits/website/index.html +3 -3
- package/ui_kits/website/site.css +2 -2
- package/ui_kits/website/work.html +4 -0
package/tokens/tokens.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$meta": {
|
|
3
3
|
"system": "CyberSkill Design System",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.2.0",
|
|
5
5
|
"generated": "2026-07-23",
|
|
6
6
|
"note": "Generated from tokens/*.css. Root grouped by category; theme/element scopes carry overrides only. Regenerate after any token change (see docs/conventions.md)."
|
|
7
7
|
},
|
|
@@ -20,6 +20,10 @@
|
|
|
20
20
|
"--cs-color-semantic-danger": "#B42318",
|
|
21
21
|
"--cs-color-semantic-warning": "#92400E",
|
|
22
22
|
"--cs-color-semantic-info": "#1D4ED8",
|
|
23
|
+
"--cs-color-semantic-success-fg": "#FFFFFF",
|
|
24
|
+
"--cs-color-semantic-danger-fg": "#FFFFFF",
|
|
25
|
+
"--cs-color-semantic-warning-fg": "#FFFFFF",
|
|
26
|
+
"--cs-color-semantic-info-fg": "#FFFFFF",
|
|
23
27
|
"--cs-color-accent-ochre": "#F4BA17",
|
|
24
28
|
"--cs-color-border-default": "#E7D9C6",
|
|
25
29
|
"--cs-color-link": "#6E3B0E",
|
|
@@ -49,7 +53,8 @@
|
|
|
49
53
|
"--cs-component-textfield-border-default": "#BFA58F",
|
|
50
54
|
"--cs-component-textfield-paddingY": "10px",
|
|
51
55
|
"--cs-component-textfield-paddingX": "12px",
|
|
52
|
-
"--cs-component-textfield-minHeight": "44px"
|
|
56
|
+
"--cs-component-textfield-minHeight": "44px",
|
|
57
|
+
"--cs-focus-ring": "3px"
|
|
53
58
|
},
|
|
54
59
|
"accent": {
|
|
55
60
|
"--cs-accent": "#F4BA17",
|
|
@@ -60,7 +65,8 @@
|
|
|
60
65
|
"--cs-accent-ink": "#45210E",
|
|
61
66
|
"--cs-accent-glow": "rgba(244, 186, 23, 0.48)",
|
|
62
67
|
"--cs-accent-grad-a": "#F4BA17",
|
|
63
|
-
"--cs-accent-grad-b": "#FCAF91"
|
|
68
|
+
"--cs-accent-grad-b": "#FCAF91",
|
|
69
|
+
"--cs-accent-on-strong": "#1A1108"
|
|
64
70
|
},
|
|
65
71
|
"depth": {
|
|
66
72
|
"--cs-depth-bg": "0",
|
|
@@ -68,7 +74,9 @@
|
|
|
68
74
|
"--cs-depth-card": "10",
|
|
69
75
|
"--cs-depth-nav": "50",
|
|
70
76
|
"--cs-depth-modal": "100",
|
|
71
|
-
"--cs-depth-toast": "200"
|
|
77
|
+
"--cs-depth-toast": "200",
|
|
78
|
+
"--cs-depth-dropdown": "60",
|
|
79
|
+
"--cs-depth-overlay": "80"
|
|
72
80
|
},
|
|
73
81
|
"glass": {
|
|
74
82
|
"--cs-glass-whisper-blur": "8px",
|
|
@@ -133,7 +141,8 @@
|
|
|
133
141
|
"--cs-breakpoint-2xl": "1536px"
|
|
134
142
|
},
|
|
135
143
|
"container": {
|
|
136
|
-
"--cs-container-max": "1320px"
|
|
144
|
+
"--cs-container-max": "1320px",
|
|
145
|
+
"--cs-prose-measure": "45rem"
|
|
137
146
|
},
|
|
138
147
|
"font": {
|
|
139
148
|
"--cs-font-family-ui": "'Be Vietnam Pro', ui-sans-serif, system-ui, sans-serif",
|
|
@@ -147,6 +156,7 @@
|
|
|
147
156
|
"--cs-font-lineHeight-body": "1.5",
|
|
148
157
|
"--cs-font-lineHeight-heading": "1.35",
|
|
149
158
|
"--cs-font-lineHeight-tight": "1.15",
|
|
159
|
+
"--cs-font-size-2xs": "0.6875rem",
|
|
150
160
|
"--cs-font-size-xs": "0.75rem",
|
|
151
161
|
"--cs-font-size-sm": "0.875rem",
|
|
152
162
|
"--cs-font-size-base": "1rem",
|
|
@@ -167,6 +177,7 @@
|
|
|
167
177
|
"--cs-text-body-lg": "var(--cs-font-size-md)",
|
|
168
178
|
"--cs-text-body": "var(--cs-font-size-base)",
|
|
169
179
|
"--cs-text-secondary": "var(--cs-font-size-sm)",
|
|
180
|
+
"--cs-text-micro": "var(--cs-font-size-2xs)",
|
|
170
181
|
"--cs-text-caption": "var(--cs-font-size-xs)",
|
|
171
182
|
"--cs-text-eyebrow": "var(--cs-font-size-xs)"
|
|
172
183
|
},
|
|
@@ -185,6 +196,12 @@
|
|
|
185
196
|
"--cs-icon-sm": "16px",
|
|
186
197
|
"--cs-icon-md": "20px",
|
|
187
198
|
"--cs-icon-lg": "24px"
|
|
199
|
+
},
|
|
200
|
+
"doc": {
|
|
201
|
+
"--cs-doc-ink": "#1A1614",
|
|
202
|
+
"--cs-doc-slate": "#3F4C55",
|
|
203
|
+
"--cs-doc-fill": "#FDE68A",
|
|
204
|
+
"--cs-doc-fill-ink": "#1A1614"
|
|
188
205
|
}
|
|
189
206
|
},
|
|
190
207
|
"themes": {
|
|
@@ -200,6 +217,10 @@
|
|
|
200
217
|
"--cs-color-semantic-danger": "#F87171",
|
|
201
218
|
"--cs-color-semantic-warning": "#FBBF24",
|
|
202
219
|
"--cs-color-semantic-info": "#7CB2FB",
|
|
220
|
+
"--cs-color-semantic-success-fg": "#1a1108",
|
|
221
|
+
"--cs-color-semantic-danger-fg": "#1a1108",
|
|
222
|
+
"--cs-color-semantic-warning-fg": "#1a1108",
|
|
223
|
+
"--cs-color-semantic-info-fg": "#1a1108",
|
|
203
224
|
"--cs-color-border-default": "#4a3a2c",
|
|
204
225
|
"--cs-color-link": "#f4ba17",
|
|
205
226
|
"--cs-color-link-hover": "#f5ead9",
|
|
@@ -224,6 +245,10 @@
|
|
|
224
245
|
"--cs-color-semantic-danger": "#F87171",
|
|
225
246
|
"--cs-color-semantic-warning": "#FBBF24",
|
|
226
247
|
"--cs-color-semantic-info": "#7CB2FB",
|
|
248
|
+
"--cs-color-semantic-success-fg": "#1a1108",
|
|
249
|
+
"--cs-color-semantic-danger-fg": "#1a1108",
|
|
250
|
+
"--cs-color-semantic-warning-fg": "#1a1108",
|
|
251
|
+
"--cs-color-semantic-info-fg": "#1a1108",
|
|
227
252
|
"--cs-color-border-default": "#4a3a2c",
|
|
228
253
|
"--cs-color-link": "#f4ba17",
|
|
229
254
|
"--cs-color-link-hover": "#f5ead9",
|
|
@@ -243,6 +268,7 @@
|
|
|
243
268
|
"--cs-accent-strong": "#90825E",
|
|
244
269
|
"--cs-accent-bright": "#F6EBCC",
|
|
245
270
|
"--cs-accent-on": "#292414",
|
|
271
|
+
"--cs-accent-on-strong": "#1A1108",
|
|
246
272
|
"--cs-accent-tint": "#FBF7EA",
|
|
247
273
|
"--cs-accent-ink": "#292414",
|
|
248
274
|
"--cs-accent-glow": "rgba(248, 233, 192, 0.48)",
|
|
@@ -256,6 +282,7 @@
|
|
|
256
282
|
"--cs-accent-strong": "#A47D17",
|
|
257
283
|
"--cs-accent-bright": "#F4BA17",
|
|
258
284
|
"--cs-accent-on": "#45210E",
|
|
285
|
+
"--cs-accent-on-strong": "#1A1108",
|
|
259
286
|
"--cs-accent-tint": "#FBF4E9",
|
|
260
287
|
"--cs-accent-ink": "#45210E",
|
|
261
288
|
"--cs-accent-glow": "rgba(244, 186, 23, 0.48)",
|
|
@@ -267,6 +294,7 @@
|
|
|
267
294
|
"--cs-accent-strong": "#201300",
|
|
268
295
|
"--cs-accent-bright": "#DEC7A2",
|
|
269
296
|
"--cs-accent-on": "#2D220E",
|
|
297
|
+
"--cs-accent-on-strong": "#FFFFFF",
|
|
270
298
|
"--cs-accent-tint": "#FFF6E7",
|
|
271
299
|
"--cs-accent-ink": "#2D220E",
|
|
272
300
|
"--cs-accent-glow": "rgba(81, 56, 1, 0.48)",
|
|
@@ -280,6 +308,7 @@
|
|
|
280
308
|
"--cs-accent-strong": "#967C75",
|
|
281
309
|
"--cs-accent-bright": "#FCE6DF",
|
|
282
310
|
"--cs-accent-on": "#2C211E",
|
|
311
|
+
"--cs-accent-on-strong": "#1A1108",
|
|
283
312
|
"--cs-accent-tint": "#FEF4F2",
|
|
284
313
|
"--cs-accent-ink": "#2C211E",
|
|
285
314
|
"--cs-accent-glow": "rgba(255, 225, 216, 0.48)",
|
|
@@ -293,6 +322,7 @@
|
|
|
293
322
|
"--cs-accent-strong": "#B47054",
|
|
294
323
|
"--cs-accent-bright": "#FED3C3",
|
|
295
324
|
"--cs-accent-on": "#381B10",
|
|
325
|
+
"--cs-accent-on-strong": "#1A1108",
|
|
296
326
|
"--cs-accent-tint": "#FFF4F0",
|
|
297
327
|
"--cs-accent-ink": "#381B10",
|
|
298
328
|
"--cs-accent-glow": "rgba(252, 175, 145, 0.48)",
|
|
@@ -306,6 +336,7 @@
|
|
|
306
336
|
"--cs-accent-strong": "#280D00",
|
|
307
337
|
"--cs-accent-bright": "#F1BEA4",
|
|
308
338
|
"--cs-accent-on": "#361D0F",
|
|
339
|
+
"--cs-accent-on-strong": "#FFFFFF",
|
|
309
340
|
"--cs-accent-tint": "#FFF4EF",
|
|
310
341
|
"--cs-accent-ink": "#361D0F",
|
|
311
342
|
"--cs-accent-glow": "rgba(98, 43, 6, 0.48)",
|
|
@@ -319,6 +350,7 @@
|
|
|
319
350
|
"--cs-accent-strong": "#5A8A90",
|
|
320
351
|
"--cs-accent-bright": "#CDF4F9",
|
|
321
352
|
"--cs-accent-on": "#13282B",
|
|
353
|
+
"--cs-accent-on-strong": "#1A1108",
|
|
322
354
|
"--cs-accent-tint": "#EBFAFC",
|
|
323
355
|
"--cs-accent-ink": "#13282B",
|
|
324
356
|
"--cs-accent-glow": "rgba(192, 245, 252, 0.48)",
|
|
@@ -332,6 +364,7 @@
|
|
|
332
364
|
"--cs-accent-strong": "#108EA0",
|
|
333
365
|
"--cs-accent-bright": "#99EEFF",
|
|
334
366
|
"--cs-accent-on": "#012A30",
|
|
367
|
+
"--cs-accent-on-strong": "#1A1108",
|
|
335
368
|
"--cs-accent-tint": "#E7FBFF",
|
|
336
369
|
"--cs-accent-ink": "#012A30",
|
|
337
370
|
"--cs-accent-glow": "rgba(46, 219, 247, 0.48)",
|
|
@@ -345,6 +378,7 @@
|
|
|
345
378
|
"--cs-accent-strong": "#011A21",
|
|
346
379
|
"--cs-accent-bright": "#A8D3E0",
|
|
347
380
|
"--cs-accent-on": "#10282F",
|
|
381
|
+
"--cs-accent-on-strong": "#FFFFFF",
|
|
348
382
|
"--cs-accent-tint": "#EAFAFF",
|
|
349
383
|
"--cs-accent-ink": "#10282F",
|
|
350
384
|
"--cs-accent-glow": "rgba(0, 69, 84, 0.48)",
|
|
@@ -358,6 +392,7 @@
|
|
|
358
392
|
"--cs-accent-strong": "#7C8965",
|
|
359
393
|
"--cs-accent-bright": "#E5F1D2",
|
|
360
394
|
"--cs-accent-on": "#212617",
|
|
395
|
+
"--cs-accent-on-strong": "#1A1108",
|
|
361
396
|
"--cs-accent-tint": "#F4F9ED",
|
|
362
397
|
"--cs-accent-ink": "#212617",
|
|
363
398
|
"--cs-accent-glow": "rgba(225, 241, 200, 0.48)",
|
|
@@ -371,6 +406,7 @@
|
|
|
371
406
|
"--cs-accent-strong": "#629122",
|
|
372
407
|
"--cs-accent-bright": "#C5ED9C",
|
|
373
408
|
"--cs-accent-on": "#182A00",
|
|
409
|
+
"--cs-accent-on-strong": "#1A1108",
|
|
374
410
|
"--cs-accent-tint": "#EFFCE3",
|
|
375
411
|
"--cs-accent-ink": "#182A00",
|
|
376
412
|
"--cs-accent-glow": "rgba(163, 215, 104, 0.48)",
|
|
@@ -384,6 +420,7 @@
|
|
|
384
420
|
"--cs-accent-strong": "#051D00",
|
|
385
421
|
"--cs-accent-bright": "#B0D8A3",
|
|
386
422
|
"--cs-accent-on": "#162A0E",
|
|
423
|
+
"--cs-accent-on-strong": "#FFFFFF",
|
|
387
424
|
"--cs-accent-tint": "#ECFDE7",
|
|
388
425
|
"--cs-accent-ink": "#162A0E",
|
|
389
426
|
"--cs-accent-glow": "rgba(26, 74, 1, 0.48)",
|
|
@@ -397,6 +434,7 @@
|
|
|
397
434
|
"--cs-accent-strong": "#947F65",
|
|
398
435
|
"--cs-accent-bright": "#FBE8D2",
|
|
399
436
|
"--cs-accent-on": "#2B2217",
|
|
437
|
+
"--cs-accent-on-strong": "#1A1108",
|
|
400
438
|
"--cs-accent-tint": "#FDF5ED",
|
|
401
439
|
"--cs-accent-ink": "#2B2217",
|
|
402
440
|
"--cs-accent-glow": "rgba(254, 229, 199, 0.48)",
|
|
@@ -410,6 +448,7 @@
|
|
|
410
448
|
"--cs-accent-strong": "#AC780B",
|
|
411
449
|
"--cs-accent-bright": "#FDD89F",
|
|
412
450
|
"--cs-accent-on": "#312002",
|
|
451
|
+
"--cs-accent-on-strong": "#1A1108",
|
|
413
452
|
"--cs-accent-tint": "#FFF5E7",
|
|
414
453
|
"--cs-accent-ink": "#312002",
|
|
415
454
|
"--cs-accent-glow": "rgba(243, 185, 88, 0.48)",
|
|
@@ -423,6 +462,7 @@
|
|
|
423
462
|
"--cs-accent-strong": "#1F1400",
|
|
424
463
|
"--cs-accent-bright": "#DCC8A2",
|
|
425
464
|
"--cs-accent-on": "#2D220E",
|
|
465
|
+
"--cs-accent-on-strong": "#FFFFFF",
|
|
426
466
|
"--cs-accent-tint": "#FEF6E7",
|
|
427
467
|
"--cs-accent-ink": "#2D220E",
|
|
428
468
|
"--cs-accent-glow": "rgba(80, 57, 1, 0.48)",
|
package/tokens/typography.css
CHANGED
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
--cs-font-lineHeight-tight: 1.15;
|
|
31
31
|
|
|
32
32
|
/* Size ramp (rem-based, 16px root) */
|
|
33
|
+
--cs-font-size-2xs: 0.6875rem; /* 11 — micro numerals only (documented exception) */
|
|
33
34
|
--cs-font-size-xs: 0.75rem; /* 12 — captions, chips */
|
|
34
35
|
--cs-font-size-sm: 0.875rem; /* 14 — secondary UI */
|
|
35
36
|
--cs-font-size-base: 1rem; /* 16 — body */
|
|
@@ -52,6 +53,7 @@
|
|
|
52
53
|
--cs-text-body-lg: var(--cs-font-size-md); /* lead paragraphs */
|
|
53
54
|
--cs-text-body: var(--cs-font-size-base);
|
|
54
55
|
--cs-text-secondary: var(--cs-font-size-sm);
|
|
56
|
+
--cs-text-micro: var(--cs-font-size-2xs);
|
|
55
57
|
--cs-text-caption: var(--cs-font-size-xs);
|
|
56
58
|
--cs-text-eyebrow: var(--cs-font-size-xs); /* uppercase, tracked */
|
|
57
59
|
|
package/ui_kits/deck/index.html
CHANGED
|
@@ -40,6 +40,9 @@
|
|
|
40
40
|
</style>
|
|
41
41
|
</head>
|
|
42
42
|
<body>
|
|
43
|
+
<a class="cs-skip" href="#main" style="position:absolute;left:-999px;width:1px;height:1px;overflow:hidden">Skip to content</a>
|
|
44
|
+
<main id="main">
|
|
45
|
+
|
|
43
46
|
<deck-stage width="1920" height="1080">
|
|
44
47
|
<section class="sl sl-umber sl-pad" data-label="Title">
|
|
45
48
|
<div class="lockup" style="margin-bottom:56px"><img src="../../assets/logo-mark.svg" alt="CyberSkill" /><b>CyberSkill</b></div>
|
|
@@ -116,5 +119,6 @@
|
|
|
116
119
|
if(link) link.addEventListener("click", function(){ apply(document.documentElement.getAttribute("lang")!=="vi"); });
|
|
117
120
|
})();
|
|
118
121
|
</script>
|
|
122
|
+
</main>
|
|
119
123
|
</body>
|
|
120
124
|
</html>
|
|
@@ -139,6 +139,7 @@ function StatusHub() {
|
|
|
139
139
|
|
|
140
140
|
return (
|
|
141
141
|
<div className="sh" lang={lang} data-theme={dark ? "dark" : undefined}>
|
|
142
|
+
<a className="cs-skip" href="#main" style={{ position: "absolute", left: -999, width: 1, height: 1, overflow: "hidden" }}>Skip to content</a>
|
|
142
143
|
<header className="hd">
|
|
143
144
|
<div className="hd-in">
|
|
144
145
|
<div className="hd-id">
|
|
@@ -156,7 +157,7 @@ function StatusHub() {
|
|
|
156
157
|
</div>
|
|
157
158
|
</header>
|
|
158
159
|
|
|
159
|
-
<
|
|
160
|
+
<main id="main" className="wrap">
|
|
160
161
|
<div className="deck">
|
|
161
162
|
<section className="panel">
|
|
162
163
|
<h2>{t.portfolio}</h2>
|
|
@@ -195,9 +196,34 @@ function StatusHub() {
|
|
|
195
196
|
<div className="bar">
|
|
196
197
|
<div className="bar-top">
|
|
197
198
|
<label className="srch"><SearchGlyph /><input placeholder={t.search} value={q} onChange={(e) => setQ(e.target.value)} /></label>
|
|
198
|
-
<div
|
|
199
|
+
<div
|
|
200
|
+
className="lenses"
|
|
201
|
+
role="tablist"
|
|
202
|
+
aria-label={t.view}
|
|
203
|
+
onKeyDown={(e) => {
|
|
204
|
+
const order = ["board", "table", "releases"];
|
|
205
|
+
const i = order.indexOf(lens);
|
|
206
|
+
let next = i;
|
|
207
|
+
if (e.key === "ArrowRight") next = (i + 1) % order.length;
|
|
208
|
+
else if (e.key === "ArrowLeft") next = (i - 1 + order.length) % order.length;
|
|
209
|
+
else if (e.key === "Home") next = 0;
|
|
210
|
+
else if (e.key === "End") next = order.length - 1;
|
|
211
|
+
else return;
|
|
212
|
+
e.preventDefault();
|
|
213
|
+
setLens(order[next]);
|
|
214
|
+
const tabs = e.currentTarget.querySelectorAll('[role="tab"]');
|
|
215
|
+
tabs[next] && tabs[next].focus && tabs[next].focus();
|
|
216
|
+
}}
|
|
217
|
+
>
|
|
199
218
|
{["board", "table", "releases"].map((l) => (
|
|
200
|
-
<button
|
|
219
|
+
<button
|
|
220
|
+
key={l}
|
|
221
|
+
className="ln"
|
|
222
|
+
role="tab"
|
|
223
|
+
aria-selected={lens === l}
|
|
224
|
+
tabIndex={lens === l ? 0 : -1}
|
|
225
|
+
onClick={() => setLens(l)}
|
|
226
|
+
>{t.lenses[l]}</button>
|
|
201
227
|
))}
|
|
202
228
|
</div>
|
|
203
229
|
<label className="facet">{t.status}
|
|
@@ -260,7 +286,7 @@ function StatusHub() {
|
|
|
260
286
|
<p className="ft">{lang === "vi"
|
|
261
287
|
? <>CyberSkill Status Hub — bản tái hiện UI kit của design system. Dựng trên token <span className="mono">styles.css</span>. Turn Your Will Into Real.</>
|
|
262
288
|
: <>CyberSkill Status Hub — a design-system UI kit recreation. Built on <span className="mono">styles.css</span> tokens. Turn Your Will Into Real.</>}</p>
|
|
263
|
-
</
|
|
289
|
+
</main>
|
|
264
290
|
|
|
265
291
|
<Drawer p={sel && loc(sel)} onClose={() => setSel(null)} t={t} />
|
|
266
292
|
</div>
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
<link rel="stylesheet" href="../../styles.css" />
|
|
10
10
|
<link rel="stylesheet" href="status.css" />
|
|
11
11
|
<style>html,body{margin:0;background:var(--cs-color-surface-page);min-height:100vh}</style>
|
|
12
|
-
<script src="
|
|
13
|
-
<script src="
|
|
14
|
-
<script src="
|
|
12
|
+
<script src="../../_vendor/react/react.production.min.js"></script>
|
|
13
|
+
<script src="../../_vendor/react/react-dom.production.min.js"></script>
|
|
14
|
+
<script src="../../_vendor/babel/babel.min.js"></script>
|
|
15
15
|
<script src="data.js"></script>
|
|
16
16
|
</head>
|
|
17
17
|
<body>
|
|
@@ -29,6 +29,9 @@
|
|
|
29
29
|
</style>
|
|
30
30
|
</head>
|
|
31
31
|
<body>
|
|
32
|
+
<a class="cs-skip" href="#main" style="position:absolute;left:-999px;width:1px;height:1px;overflow:hidden">Skip to content</a>
|
|
33
|
+
<main id="main">
|
|
34
|
+
|
|
32
35
|
<div class="login">
|
|
33
36
|
<div class="pane-brand">
|
|
34
37
|
<div class="brand-lock"><img src="../../assets/logo-mark.svg" alt="" />CyberSkill</div>
|
|
@@ -61,5 +64,6 @@
|
|
|
61
64
|
this.textContent = dark ? "☾" : "☀";
|
|
62
65
|
});
|
|
63
66
|
</script>
|
|
67
|
+
</main>
|
|
64
68
|
</body>
|
|
65
69
|
</html>
|
|
@@ -36,6 +36,9 @@
|
|
|
36
36
|
</style>
|
|
37
37
|
</head>
|
|
38
38
|
<body>
|
|
39
|
+
<a class="cs-skip" href="#main" style="position:absolute;left:-999px;width:1px;height:1px;overflow:hidden">Skip to content</a>
|
|
40
|
+
<main id="main">
|
|
41
|
+
|
|
39
42
|
<div class="sh">
|
|
40
43
|
<header class="hd">
|
|
41
44
|
<div class="hd-in">
|
|
@@ -133,5 +136,6 @@
|
|
|
133
136
|
this.textContent = dark ? "☾" : "☀";
|
|
134
137
|
});
|
|
135
138
|
</script>
|
|
139
|
+
</main>
|
|
136
140
|
</body>
|
|
137
141
|
</html>
|
|
@@ -22,9 +22,12 @@
|
|
|
22
22
|
.danger .t { font-weight: 700; }
|
|
23
23
|
.actions { display: flex; gap: 10px; justify-content: flex-end; }
|
|
24
24
|
@media (max-width: 700px) { .field-row { grid-template-columns: 1fr; } }
|
|
25
|
+
.cs-skip{position:absolute;left:-999px;top:auto;width:1px;height:1px;overflow:hidden}
|
|
26
|
+
.cs-skip:focus{position:fixed;left:12px;top:12px;z-index:9999;width:auto;height:auto;padding:10px 14px;background:var(--cs-color-surface-panel);color:var(--cs-color-text-primary);border:2px solid var(--cs-color-brand-ochre);border-radius:8px;overflow:visible}
|
|
25
27
|
</style>
|
|
26
28
|
</head>
|
|
27
29
|
<body>
|
|
30
|
+
<a class="cs-skip" href="#main">Skip to content</a>
|
|
28
31
|
<div class="sh">
|
|
29
32
|
<header class="hd">
|
|
30
33
|
<div class="hd-in">
|
|
@@ -36,15 +39,15 @@
|
|
|
36
39
|
</div>
|
|
37
40
|
</header>
|
|
38
41
|
|
|
39
|
-
<
|
|
40
|
-
<
|
|
41
|
-
<button class="cs-tab" aria-selected="true">Profile</button>
|
|
42
|
-
<button class="cs-tab">Notifications</button>
|
|
43
|
-
<button class="cs-tab">Appearance</button>
|
|
44
|
-
<button class="cs-tab">Team <span class="cs-tab__count">6</span></button>
|
|
45
|
-
</
|
|
42
|
+
<main id="main" class="wrap">
|
|
43
|
+
<div class="cs-tabs" style="margin-top:24px;overflow-x:auto" role="tablist" aria-label="Settings sections">
|
|
44
|
+
<button type="button" class="cs-tab" role="tab" aria-selected="true" tabindex="0" id="tab-profile" aria-controls="panel-settings">Profile</button>
|
|
45
|
+
<button type="button" class="cs-tab" role="tab" aria-selected="false" tabindex="-1" id="tab-notifications" aria-controls="panel-settings">Notifications</button>
|
|
46
|
+
<button type="button" class="cs-tab" role="tab" aria-selected="false" tabindex="-1" id="tab-appearance" aria-controls="panel-settings">Appearance</button>
|
|
47
|
+
<button type="button" class="cs-tab" role="tab" aria-selected="false" tabindex="-1" id="tab-team" aria-controls="panel-settings">Team <span class="cs-tab__count">6</span></button>
|
|
48
|
+
</div>
|
|
46
49
|
|
|
47
|
-
<div class="set-grid">
|
|
50
|
+
<div class="set-grid" id="panel-settings" role="tabpanel" aria-labelledby="tab-profile">
|
|
48
51
|
<section class="panel">
|
|
49
52
|
<h3 class="sec">Profile</h3>
|
|
50
53
|
<p class="hint">This is how you appear across the Status Hub.</p>
|
|
@@ -60,10 +63,10 @@
|
|
|
60
63
|
<h3 class="sec">Notifications</h3>
|
|
61
64
|
<p class="hint">We keep it quiet — only what you ask for.</p>
|
|
62
65
|
<div class="cs-scroll-area" style="max-block-size:220px;padding-inline-end:6px" tabindex="0" aria-label="Notification preferences">
|
|
63
|
-
<div class="toggle-row"><div><div class="t">Release notes</div><div class="d">A summary each time a project ships. Bilingual (EN + VN).</div></div><label class="cs-switch"><input type="checkbox" role="switch" checked /><span class="cs-switch__track"></span></label></div>
|
|
64
|
-
<div class="toggle-row"><div><div class="t">Blocked-project alerts</div><div class="d">Get pinged when a project moves to Blocked.</div></div><label class="cs-switch"><input type="checkbox" role="switch" checked /><span class="cs-switch__track"></span></label></div>
|
|
65
|
-
<div class="toggle-row"><div><div class="t">Weekly velocity digest</div><div class="d">Tasks shipped per week, every Monday morning.</div></div><label class="cs-switch"><input type="checkbox" role="switch" /><span class="cs-switch__track"></span></label></div>
|
|
66
|
-
<div class="toggle-row"><div><div class="t">Quiet hours</div><div class="d">No pings between 22:00 and 07:00 local time.</div></div><label class="cs-switch"><input type="checkbox" role="switch" checked /><span class="cs-switch__track"></span></label></div>
|
|
66
|
+
<div class="toggle-row"><div><div class="t" id="lbl-release">Release notes</div><div class="d">A summary each time a project ships. Bilingual (EN + VN).</div></div><label class="cs-switch"><input type="checkbox" role="switch" checked aria-labelledby="lbl-release" /><span class="cs-switch__track"></span></label></div>
|
|
67
|
+
<div class="toggle-row"><div><div class="t" id="lbl-blocked">Blocked-project alerts</div><div class="d">Get pinged when a project moves to Blocked.</div></div><label class="cs-switch"><input type="checkbox" role="switch" checked aria-labelledby="lbl-blocked" /><span class="cs-switch__track"></span></label></div>
|
|
68
|
+
<div class="toggle-row"><div><div class="t" id="lbl-digest">Weekly velocity digest</div><div class="d">Tasks shipped per week, every Monday morning.</div></div><label class="cs-switch"><input type="checkbox" role="switch" aria-labelledby="lbl-digest" /><span class="cs-switch__track"></span></label></div>
|
|
69
|
+
<div class="toggle-row"><div><div class="t" id="lbl-quiet">Quiet hours</div><div class="d">No pings between 22:00 and 07:00 local time.</div></div><label class="cs-switch"><input type="checkbox" role="switch" checked aria-labelledby="lbl-quiet" /><span class="cs-switch__track"></span></label></div>
|
|
67
70
|
</div>
|
|
68
71
|
</section>
|
|
69
72
|
|
|
@@ -77,7 +80,7 @@
|
|
|
77
80
|
<button class="cs-button cs-button--primary">Save changes</button>
|
|
78
81
|
</div>
|
|
79
82
|
</div>
|
|
80
|
-
</
|
|
83
|
+
</main>
|
|
81
84
|
</div>
|
|
82
85
|
<button id="themeToggle" aria-label="Toggle theme" style="position:fixed;right:20px;bottom:20px;z-index:60;border:1px solid var(--cs-color-border-default);background:var(--cs-color-surface-panel);color:var(--cs-color-text-primary);width:44px;height:44px;border-radius:999px;cursor:pointer;box-shadow:var(--cs-shadow-md)">☾</button>
|
|
83
86
|
<script>
|
|
@@ -86,6 +89,25 @@
|
|
|
86
89
|
el.setAttribute("data-theme", dark ? "light" : "dark");
|
|
87
90
|
this.textContent = dark ? "☾" : "☀";
|
|
88
91
|
});
|
|
92
|
+
|
|
93
|
+
(function(){
|
|
94
|
+
var tabs=[].slice.call(document.querySelectorAll('[role="tablist"] [role="tab"]'));
|
|
95
|
+
tabs.forEach(function(tab,i){
|
|
96
|
+
tab.addEventListener('click',function(){
|
|
97
|
+
tabs.forEach(function(x,j){ x.setAttribute('aria-selected', j===i?'true':'false'); x.tabIndex=j===i?0:-1; });
|
|
98
|
+
});
|
|
99
|
+
tab.addEventListener('keydown',function(e){
|
|
100
|
+
var cur=tabs.indexOf(document.activeElement); if(cur<0) return;
|
|
101
|
+
var next=cur;
|
|
102
|
+
if(e.key==='ArrowRight') next=(cur+1)%tabs.length;
|
|
103
|
+
else if(e.key==='ArrowLeft') next=(cur-1+tabs.length)%tabs.length;
|
|
104
|
+
else if(e.key==='Home') next=0;
|
|
105
|
+
else if(e.key==='End') next=tabs.length-1;
|
|
106
|
+
else return;
|
|
107
|
+
e.preventDefault(); tabs[next].focus(); tabs[next].click();
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
})();
|
|
89
111
|
</script>
|
|
90
112
|
</body>
|
|
91
113
|
</html>
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
.chip.hold { background: var(--cs-color-semantic-danger); color: var(--cs-status-on-fill); border-color: transparent; }
|
|
130
130
|
|
|
131
131
|
/* board */
|
|
132
|
-
.grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(
|
|
132
|
+
.grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 260px), 1fr)); gap: var(--cs-space-4); }
|
|
133
133
|
.card { background: var(--cs-color-surface-panel); border: 1px solid var(--cs-color-border-default);
|
|
134
134
|
border-radius: 14px; padding: var(--cs-space-4); cursor: pointer; text-align: left; font: inherit; color: inherit; }
|
|
135
135
|
.card:hover { border-color: var(--cs-color-brand-ochre); }
|
|
@@ -197,3 +197,7 @@ table.tbl { border-collapse: collapse; width: 100%; font-size: 13px; }
|
|
|
197
197
|
.ft { margin: var(--cs-space-12) 0 var(--cs-space-16); text-align: center; font-size: 12px; color: var(--cs-color-text-muted); }
|
|
198
198
|
|
|
199
199
|
@media (max-width: 900px) { .deck { grid-template-columns: 1fr; } .hd-meta { text-align: left; } }
|
|
200
|
+
|
|
201
|
+
/* UX-024 readable measure */
|
|
202
|
+
.panel p, .notes, .release-body, article p { max-inline-size: var(--cs-prose-measure, 45rem); }
|
|
203
|
+
.card, button.card { min-width: 0; }
|
|
@@ -53,12 +53,21 @@ function Website() {
|
|
|
53
53
|
const [seed, setSeed] = useState("");
|
|
54
54
|
const [wish, setWish] = useState("");
|
|
55
55
|
const [sent, setSent] = useState(false);
|
|
56
|
+
const [fabVisible, setFabVisible] = useState(false);
|
|
56
57
|
const t = window.SITE_COPY[loc];
|
|
57
58
|
|
|
58
59
|
function openChat(s) { setSeed(s || ""); setChat(true); }
|
|
59
60
|
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
const sync = () => setFabVisible(window.scrollY > 140);
|
|
63
|
+
sync();
|
|
64
|
+
window.addEventListener("scroll", sync, { passive: true });
|
|
65
|
+
return () => window.removeEventListener("scroll", sync);
|
|
66
|
+
}, []);
|
|
67
|
+
|
|
60
68
|
return (
|
|
61
69
|
<div className="site" data-theme={dark ? "dark" : undefined}>
|
|
70
|
+
<a className="cs-skip" href="#main" style={{ position: "absolute", left: -999, width: 1, height: 1, overflow: "hidden" }}>Skip to content</a>
|
|
62
71
|
<header className="hdr cs-surface-light">
|
|
63
72
|
<div className="container hdr-in">
|
|
64
73
|
<a className="brand" href="#top"><img src="../../assets/logo-mark.svg" alt="" />CyberSkill</a>
|
|
@@ -66,10 +75,11 @@ function Website() {
|
|
|
66
75
|
<div className="hdr-side">
|
|
67
76
|
<button className="mini" onClick={() => setLoc(loc === "en" ? "vi" : "en")}>{t.langLabel}</button>
|
|
68
77
|
<button className="mini icon" onClick={() => setDark(!dark)} aria-label="Toggle theme"><I name={dark ? "sun" : "moon"} size={18} /></button>
|
|
69
|
-
<button className="mini" style={{ background: "var(--cs-color-brand-umber)", color: "
|
|
78
|
+
<button className="mini" style={{ background: "var(--cs-color-brand-umber)", color: "var(--cs-color-text-inverse,#fff)", borderColor: "transparent" }} onClick={() => openChat("")}>{t.talk}</button>
|
|
70
79
|
</div>
|
|
71
80
|
</div>
|
|
72
81
|
</header>
|
|
82
|
+
<main id="main">
|
|
73
83
|
|
|
74
84
|
<section className="hero" id="top">
|
|
75
85
|
<div className="container hero-in">
|
|
@@ -81,7 +91,6 @@ function Website() {
|
|
|
81
91
|
<div className="wish">
|
|
82
92
|
<input value={wish} onChange={(e) => setWish(e.target.value)} onKeyDown={(e) => e.key === "Enter" && openChat(wish)} placeholder={t.wishPlaceholder} aria-label={t.wishPlaceholder} />
|
|
83
93
|
<button className="btn-gold" onClick={() => openChat(wish)}><I name="sparkle" size={18} />{t.wishCta}</button>
|
|
84
|
-
<button className="btn-ghost-light" onClick={() => openChat("")}>{t.talk}</button>
|
|
85
94
|
</div>
|
|
86
95
|
</div>
|
|
87
96
|
<div className="hero-art"><img src="../../assets/lumi-poster.webp" alt="Lumi, the golden genie" /></div>
|
|
@@ -149,6 +158,7 @@ function Website() {
|
|
|
149
158
|
)}
|
|
150
159
|
</div>
|
|
151
160
|
</section>
|
|
161
|
+
</main>
|
|
152
162
|
|
|
153
163
|
<footer className="ft">
|
|
154
164
|
<div className="container ft-in">
|
|
@@ -158,7 +168,19 @@ function Website() {
|
|
|
158
168
|
</div>
|
|
159
169
|
</footer>
|
|
160
170
|
|
|
161
|
-
{!chat &&
|
|
171
|
+
{!chat && (
|
|
172
|
+
<button
|
|
173
|
+
className="fab"
|
|
174
|
+
type="button"
|
|
175
|
+
data-fab-deferred="1"
|
|
176
|
+
onClick={() => openChat("")}
|
|
177
|
+
style={{ opacity: fabVisible ? 1 : 0, pointerEvents: fabVisible ? "auto" : "none", transition: "opacity 160ms ease" }}
|
|
178
|
+
aria-hidden={!fabVisible}
|
|
179
|
+
tabIndex={fabVisible ? 0 : -1}
|
|
180
|
+
>
|
|
181
|
+
<img src="../../assets/lumi-poster.webp" alt="" />{t.talk}
|
|
182
|
+
</button>
|
|
183
|
+
)}
|
|
162
184
|
{chat && <Chat t={t} seed={seed} onClose={() => setChat(false)} />}
|
|
163
185
|
</div>
|
|
164
186
|
);
|
|
@@ -29,6 +29,9 @@
|
|
|
29
29
|
</style>
|
|
30
30
|
</head>
|
|
31
31
|
<body>
|
|
32
|
+
<a class="cs-skip" href="#main" style="position:absolute;left:-999px;width:1px;height:1px;overflow:hidden">Skip to content</a>
|
|
33
|
+
<main id="main">
|
|
34
|
+
|
|
32
35
|
<div class="site">
|
|
33
36
|
<header class="hdr cs-surface-light">
|
|
34
37
|
<div class="container hdr-in">
|
|
@@ -105,5 +108,6 @@
|
|
|
105
108
|
if(link) link.addEventListener("click", function(e){e.preventDefault(); apply(document.documentElement.getAttribute("lang")!=="vi");});
|
|
106
109
|
})();
|
|
107
110
|
</script>
|
|
111
|
+
</main>
|
|
108
112
|
</body>
|
|
109
113
|
</html>
|
|
@@ -30,12 +30,14 @@
|
|
|
30
30
|
.lumi-answer-meta { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
|
|
31
31
|
@media (max-width: 820px) { .lumi-page { grid-template-columns: 1fr; } .lumi-side { display: none; } }
|
|
32
32
|
</style>
|
|
33
|
-
<script src="
|
|
34
|
-
<script src="
|
|
35
|
-
<script src="
|
|
33
|
+
<script src="../../_vendor/react/react.production.min.js"></script>
|
|
34
|
+
<script src="../../_vendor/react/react-dom.production.min.js"></script>
|
|
35
|
+
<script src="../../_vendor/babel/babel.min.js"></script>
|
|
36
36
|
<script src="../../_ds_bundle.js"></script>
|
|
37
37
|
</head>
|
|
38
38
|
<body>
|
|
39
|
+
<a class="cs-skip" href="#main" style="position:absolute;left:-999px;width:1px;height:1px;overflow:hidden">Skip to content</a>
|
|
40
|
+
|
|
39
41
|
<div id="root"></div>
|
|
40
42
|
<script type="text/babel">
|
|
41
43
|
const CS = window[Object.keys(window).find(k=>/^CyberSkillDesignSystem_[0-9a-f]{6}$/.test(k))] || {};
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
<link rel="stylesheet" href="../../styles.css" />
|
|
10
10
|
<link rel="stylesheet" href="site.css" />
|
|
11
11
|
<style>html,body{margin:0}</style>
|
|
12
|
-
<script src="
|
|
13
|
-
<script src="
|
|
14
|
-
<script src="
|
|
12
|
+
<script src="../../_vendor/react/react.production.min.js"></script>
|
|
13
|
+
<script src="../../_vendor/react/react-dom.production.min.js"></script>
|
|
14
|
+
<script src="../../_vendor/babel/babel.min.js"></script>
|
|
15
15
|
<script src="copy.js"></script>
|
|
16
16
|
</head>
|
|
17
17
|
<body>
|
package/ui_kits/website/site.css
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
.hero .eyebrow { color: var(--cs-color-brand-ochre); }
|
|
30
30
|
.hero h1 { font-size: clamp(40px, 6vw, 68px); font-weight: 800; letter-spacing: -.02em; line-height: 1.05; margin: 14px 0 6px; color: var(--cs-color-brand-ochre); }
|
|
31
31
|
.hero .vn { font-size: 20px; font-weight: 600; opacity: .9; margin-bottom: 18px; }
|
|
32
|
-
.hero .lead { font-size: 18px; line-height: 1.55; max-width: 620px; opacity: .95; }
|
|
32
|
+
.hero .lead { font-size: 18px; line-height: 1.55; max-width: min(620px, var(--cs-prose-measure, 45rem)); opacity: .95; }
|
|
33
33
|
.wish { display: flex; gap: 10px; margin-top: 26px; max-width: 620px; flex-wrap: wrap; }
|
|
34
34
|
.wish input { flex: 1 1 300px; min-height: 52px; border-radius: var(--cs-radius-full); border: 1px solid rgba(255,255,255,.28); background: rgba(255,255,255,.1); backdrop-filter: blur(8px); color: #fff; padding: 0 22px; font: 400 15px/1 var(--cs-font-family-ui); }
|
|
35
35
|
.wish input::placeholder { color: rgba(255,255,255,.72); }
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
.sec { padding: 88px 0; }
|
|
54
54
|
.sec-alt { background: var(--cs-color-surface-raised); }
|
|
55
55
|
.sec h2 { font-size: clamp(28px, 4vw, 40px); font-weight: 800; letter-spacing: -.02em; margin: 8px 0 10px; }
|
|
56
|
-
.sec-lead { font-size: 17px; color: var(--cs-color-text-muted); max-width: 620px; margin: 0 0 40px; }
|
|
56
|
+
.sec-lead { font-size: 17px; color: var(--cs-color-text-muted); max-width: min(620px, var(--cs-prose-measure, 45rem)); margin: 0 0 40px; }
|
|
57
57
|
|
|
58
58
|
/* services */
|
|
59
59
|
.svc-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--cs-space-5); }
|
|
@@ -35,6 +35,9 @@
|
|
|
35
35
|
</style>
|
|
36
36
|
</head>
|
|
37
37
|
<body>
|
|
38
|
+
<a class="cs-skip" href="#main" style="position:absolute;left:-999px;width:1px;height:1px;overflow:hidden">Skip to content</a>
|
|
39
|
+
<main id="main">
|
|
40
|
+
|
|
38
41
|
<div class="site">
|
|
39
42
|
<header class="hdr cs-surface-light">
|
|
40
43
|
<div class="container hdr-in">
|
|
@@ -115,5 +118,6 @@
|
|
|
115
118
|
if(link) link.addEventListener("click", function(e){e.preventDefault(); apply(document.documentElement.getAttribute("lang")!=="vi");});
|
|
116
119
|
})();
|
|
117
120
|
</script>
|
|
121
|
+
</main>
|
|
118
122
|
</body>
|
|
119
123
|
</html>
|