@conduction/nextcloud-vue 2.80.0 → 2.81.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/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +3 -3
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +80 -4
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +95 -91
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +140 -10
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +52 -16
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +17 -3
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +63 -52
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue.js +10 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue.js.map +1 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue2.js +252 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue3.js +140 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnChipsFieldWidget/index.js +26 -0
- package/dist/esm/components/CnChipsFieldWidget/index.js.map +1 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue.js +10 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue.js.map +1 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue2.js +354 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue3.js +172 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnChoicePickerWidget/index.js +27 -0
- package/dist/esm/components/CnChoicePickerWidget/index.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js +2 -2
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +65 -5
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +2 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +19 -11
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +3 -2
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +72 -0
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +21 -4
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js +1 -1
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue2.js +7 -7
- package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue2.js.map +1 -1
- package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue3.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +131 -0
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +80 -5
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +282 -69
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +302 -4
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +417 -244
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowser.js +101 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowser.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js +141 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js.map +1 -1
- package/dist/esm/components/CnFormPage/CnFormPage.vue2.js +60 -0
- package/dist/esm/components/CnFormPage/CnFormPage.vue2.js.map +1 -1
- package/dist/esm/components/CnFormPage/CnFormPage.vue3.js +74 -49
- package/dist/esm/components/CnFormPage/CnFormPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +29 -2
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +48 -4
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js +7 -7
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js +1 -1
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +65 -2
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +6 -2
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +63 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +8 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js +14 -0
- package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js +5 -1
- package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js.map +1 -1
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue.js +10 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue2.js +174 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue3.js +75 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnRadioCardsWidget/index.js +28 -0
- package/dist/esm/components/CnRadioCardsWidget/index.js.map +1 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +30 -6
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +34 -25
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue.js +10 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue2.js +222 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue3.js +64 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnSavedViewsWidget/index.js +30 -0
- package/dist/esm/components/CnSavedViewsWidget/index.js.map +1 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -1
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -1
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue.js +10 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue.js.map +1 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue2.js +347 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue3.js +184 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnSettingsFormWidget/index.js +27 -0
- package/dist/esm/components/CnSettingsFormWidget/index.js.map +1 -0
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +87 -6
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js +84 -1
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js +85 -41
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue.js +10 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue2.js +159 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue3.js +60 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnSwitchRowsWidget/index.js +26 -0
- package/dist/esm/components/CnSwitchRowsWidget/index.js.map +1 -0
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +47 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +16 -14
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js +80 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js +75 -32
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js +10 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js.map +1 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js +269 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js +106 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnToggleTableWidget/index.js +27 -0
- package/dist/esm/components/CnToggleTableWidget/index.js.map +1 -0
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +7 -0
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +7 -2
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/dashboardRegistration.js +5 -0
- package/dist/esm/components/CnWidgetObjectTable/dashboardRegistration.js.map +1 -1
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js +197 -6
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js +96 -50
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js.map +1 -1
- package/dist/esm/composables/useListView.js +4 -4
- package/dist/esm/composables/useListView.js.map +1 -1
- package/dist/esm/index.js +17 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/l10n/en.json.js +9 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +55 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +1041 -12
- package/dist/esm/utils/contentHeaderLink.js +51 -0
- package/dist/esm/utils/contentHeaderLink.js.map +1 -0
- package/dist/esm/utils/facets.js +75 -3
- package/dist/esm/utils/facets.js.map +1 -1
- package/dist/esm/utils/fetchFilterCounts.js +40 -5
- package/dist/esm/utils/fetchFilterCounts.js.map +1 -1
- package/dist/esm/utils/fillTemplate.js +7 -1
- package/dist/esm/utils/fillTemplate.js.map +1 -1
- package/dist/esm/utils/initials.js +32 -0
- package/dist/esm/utils/initials.js.map +1 -0
- package/dist/esm/utils/libraryWidgetKeys.js +7 -0
- package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
- package/dist/esm/utils/objectWrite.js +59 -0
- package/dist/esm/utils/objectWrite.js.map +1 -0
- package/dist/esm/utils/pageControls.js +81 -0
- package/dist/esm/utils/pageControls.js.map +1 -0
- package/dist/esm/utils/personalLenses.js +40 -3
- package/dist/esm/utils/personalLenses.js.map +1 -1
- package/dist/esm/utils/resolveFilterTokens.js +1 -1
- package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
- package/dist/esm/utils/resolveManifestTokens.js +2 -0
- package/dist/esm/utils/resolveManifestTokens.js.map +1 -1
- package/dist/esm/utils/sentinelTokens.js +19 -1
- package/dist/esm/utils/sentinelTokens.js.map +1 -1
- package/dist/esm/utils/userGroupsPeek.js +91 -0
- package/dist/esm/utils/userGroupsPeek.js.map +1 -0
- package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/esm/utils/visibleWhen.js +57 -5
- package/dist/esm/utils/visibleWhen.js.map +1 -1
- package/dist/esm/utils/widgetDispatch.js +1 -1
- package/dist/esm/utils/widgetDispatch.js.map +1 -1
- package/dist/esm/utils/widgetVisibility.js +4 -57
- package/dist/esm/utils/widgetVisibility.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +13589 -7833
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +1041 -12
- package/l10n/en.json +9 -1
- package/l10n/nl.json +55 -1
- package/package.json +2 -1
- package/scripts/check-docs-mdx.mjs +108 -0
- package/src/components/CnActionsBar/CnActionsBar.vue +6 -1
- package/src/components/CnAppRoot/CnAppRoot.md +4 -2
- package/src/components/CnAppRoot/CnAppRoot.vue +151 -59
- package/src/components/CnBannerWidget/CnBannerWidget.vue +205 -20
- package/src/components/CnCellRenderer/CnCellRenderer.md +2 -0
- package/src/components/CnCellRenderer/CnCellRenderer.vue +47 -4
- package/src/components/CnChipsFieldWidget/CnChipsFieldWidget.vue +433 -0
- package/src/components/CnChipsFieldWidget/index.js +25 -0
- package/src/components/CnChoicePickerWidget/CnChoicePickerWidget.vue +556 -0
- package/src/components/CnChoicePickerWidget/index.js +26 -0
- package/src/components/CnConversationThread/CnConversationWidget.vue +1 -1
- package/src/components/CnDashboardGrid/CnDashboardGrid.vue +2 -2
- package/src/components/CnDashboardPage/CnDashboardPage.vue +78 -5
- package/src/components/CnDataTable/CnDataTable.vue +21 -12
- package/src/components/CnDetailPage/CnDetailPage.vue +89 -3
- package/src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue +1 -1
- package/src/components/CnFacetSidebar/CnFacetSidebar.vue +7 -7
- package/src/components/CnFactsWidget/CnFactsWidget.vue +142 -2
- package/src/components/CnFieldListWidget/CnFieldListWidget.vue +268 -6
- package/src/components/CnFilesBrowser/CnFilesBrowser.vue +588 -117
- package/src/components/CnFilesBrowser/filesBrowser.js +100 -0
- package/src/components/CnFilesBrowser/filesBrowserColumns.js +140 -0
- package/src/components/CnFormPage/CnFormPage.vue +81 -0
- package/src/components/CnIndexPage/CnIndexPage.vue +56 -4
- package/src/components/CnIndexSidebar/CnIndexSidebar.vue +7 -7
- package/src/components/CnNextStepCard/CnNextStepWidget.vue +1 -1
- package/src/components/CnObjectListWidget/CnObjectListWidget.vue +69 -2
- package/src/components/CnObjectSidebar/CnFilesTab.vue +70 -1
- package/src/components/CnObjectSidebar/CnNotesTab.vue +16 -0
- package/src/components/CnRadioCardsWidget/CnRadioCardsWidget.vue +313 -0
- package/src/components/CnRadioCardsWidget/index.js +27 -0
- package/src/components/CnRecordListWidget/CnRecordListWidget.vue +55 -6
- package/src/components/CnSavedViewsWidget/CnSavedViewsWidget.vue +296 -0
- package/src/components/CnSavedViewsWidget/index.js +29 -0
- package/src/components/CnSegmentedControl/CnSegmentedControl.vue +13 -0
- package/src/components/CnSettingsFormWidget/CnSettingsFormWidget.vue +555 -0
- package/src/components/CnSettingsFormWidget/index.js +26 -0
- package/src/components/CnStatWidget/CnStatWidget.vue +87 -6
- package/src/components/CnStatsBlockWidget/CnStatsBlockWidget.vue +180 -3
- package/src/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue +226 -0
- package/src/components/CnSwitchRowsWidget/index.js +25 -0
- package/src/components/CnTabsWidget/CnTabsWidget.vue +82 -3
- package/src/components/CnTasksWidget/CnTasksWidget.vue +175 -15
- package/src/components/CnToggleTableWidget/CnToggleTableWidget.vue +386 -0
- package/src/components/CnToggleTableWidget/index.js +26 -0
- package/src/components/CnWidgetGrid/registerDashboardWidgets.js +7 -0
- package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +7 -2
- package/src/components/CnWidgetObjectTable/dashboardRegistration.js +5 -0
- package/src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue +309 -11
- package/src/components/index.js +15 -0
- package/src/composables/useListView.js +4 -4
- package/src/css/look-board-detail.css +36 -2
- package/src/css/look-board-index.css +39 -8
- package/src/css/look-board.css +72 -0
- package/src/index.js +15 -0
- package/src/schemas/app-manifest-v2.schema.json +93 -9
- package/src/utils/contentHeaderLink.js +48 -0
- package/src/utils/facets.js +74 -2
- package/src/utils/fetchFilterCounts.js +39 -4
- package/src/utils/fillTemplate.js +7 -1
- package/src/utils/initials.js +29 -0
- package/src/utils/libraryWidgetKeys.js +7 -0
- package/src/utils/objectWrite.js +55 -0
- package/src/utils/pageControls.js +78 -0
- package/src/utils/personalLenses.js +39 -2
- package/src/utils/resolveFilterTokens.js +3 -1
- package/src/utils/resolveManifestTokens.js +2 -0
- package/src/utils/sentinelTokens.js +19 -1
- package/src/utils/userGroupsPeek.js +87 -0
- package/src/utils/validateManifestV2.compiled.js +3 -3
- package/src/utils/visibleWhen.js +56 -4
- package/src/utils/widgetDispatch.js +1 -1
- package/src/utils/widgetVisibility.js +7 -56
|
@@ -85,8 +85,9 @@
|
|
|
85
85
|
<div
|
|
86
86
|
v-if="entry.widget && entry.stack.length"
|
|
87
87
|
class="cn-tabs-widget__stack"
|
|
88
|
+
:class="{ 'cn-tabs-widget__stack--grid': !!entry.grid }"
|
|
88
89
|
data-testid="cn-tabs-widget-stack">
|
|
89
|
-
<div class="cn-tabs-widget__stack-first">
|
|
90
|
+
<div class="cn-tabs-widget__stack-first" :style="spanStyle(entry.grid, 0)">
|
|
90
91
|
<CnDetailWidgetHost
|
|
91
92
|
:widget="entry.widget"
|
|
92
93
|
chrome="card"
|
|
@@ -108,9 +109,10 @@
|
|
|
108
109
|
@selectObject="onSelectObject" />
|
|
109
110
|
</div>
|
|
110
111
|
<div
|
|
111
|
-
v-for="child in entry.stack"
|
|
112
|
+
v-for="(child, childIndex) in entry.stack"
|
|
112
113
|
:key="`${entry.key}-${child.id}`"
|
|
113
114
|
class="cn-tabs-widget__stack-item"
|
|
115
|
+
:style="spanStyle(entry.grid, childIndex + 1)"
|
|
114
116
|
:data-testid="`cn-tabs-widget-stack-${child.id}`">
|
|
115
117
|
<CnDetailWidgetHost
|
|
116
118
|
:widget="child"
|
|
@@ -330,12 +332,17 @@ export default {
|
|
|
330
332
|
* names the list; `count` and `countField` win over it. `overflow: true`
|
|
331
333
|
* lists the tab under "More".
|
|
332
334
|
*
|
|
335
|
+
* A tab with `widgetIds` can lay them out in a grid instead of one under
|
|
336
|
+
* the other: `columns: 4` gives each a quarter of the row, and
|
|
337
|
+
* `layout: [{ widgetId, gridWidth }]` sets a width (of 12) per widget, as
|
|
338
|
+
* the page grid does. Widgets wrap onto the next row.
|
|
339
|
+
*
|
|
333
340
|
* `maxVisibleTabs` caps the strip: later tabs go under "More".
|
|
334
341
|
* `hideEmpty: true` moves a tab whose count is 0 there too.
|
|
335
342
|
* `moreLabel` names that menu. `variant: "segmented"` draws the strip
|
|
336
343
|
* as a pill switch (CnTabs' segmented variant); `line` is the default.
|
|
337
344
|
*
|
|
338
|
-
* @type {{ tabs?: Array<{widgetId?: string, widgetIds?: string[], label?: string, icon?: string, count?: number, countField?: string, countFrom?: ('widget'|{register: string, schema: string, filter?: object}), overflow?: boolean}>, ariaLabel?: string, maxVisibleTabs?: number, hideEmpty?: boolean, moreLabel?: string, variant?: ('line'|'segmented') }}
|
|
345
|
+
* @type {{ tabs?: Array<{widgetId?: string, widgetIds?: string[], label?: string, icon?: string, count?: number, countField?: string, countFrom?: ('widget'|{register: string, schema: string, filter?: object}), overflow?: boolean, columns?: number, layout?: Array<{widgetId: string, gridWidth: number}>}>, ariaLabel?: string, maxVisibleTabs?: number, hideEmpty?: boolean, moreLabel?: string, variant?: ('line'|'segmented') }}
|
|
339
346
|
*/
|
|
340
347
|
content: {
|
|
341
348
|
type: Object,
|
|
@@ -552,6 +559,7 @@ export default {
|
|
|
552
559
|
icon: (tab && tab.icon) || widget?.icon || '',
|
|
553
560
|
widget,
|
|
554
561
|
stack: widgets.slice(1),
|
|
562
|
+
grid: this.stackGrid(tab, widgets),
|
|
555
563
|
count,
|
|
556
564
|
overflow,
|
|
557
565
|
pending: visibility === 'pending',
|
|
@@ -751,6 +759,46 @@ export default {
|
|
|
751
759
|
},
|
|
752
760
|
|
|
753
761
|
methods: {
|
|
762
|
+
/**
|
|
763
|
+
* The grid a stack lays its widgets out in, as one column span (of 12)
|
|
764
|
+
* per widget in order, or null for the plain vertical stack. A tab says
|
|
765
|
+
* `columns: 4` (every widget spans a quarter of the row) and/or
|
|
766
|
+
* `layout: [{ widgetId, gridWidth }]`, the page grid's width key per
|
|
767
|
+
* widget (of 12; a widget it does not name takes the `columns` share, or
|
|
768
|
+
* the whole row). Widgets wrap onto the next row. Heights follow the
|
|
769
|
+
* content.
|
|
770
|
+
*
|
|
771
|
+
* @param {object|string} tab The `content.tabs[]` entry.
|
|
772
|
+
* @param {Array<object>} widgets The widgets of the stack, in order.
|
|
773
|
+
* @return {number[]|null} The column span of each widget, or null.
|
|
774
|
+
*/
|
|
775
|
+
stackGrid(tab, widgets) {
|
|
776
|
+
if (!tab || typeof tab !== 'object' || widgets.length < 2) {
|
|
777
|
+
return null
|
|
778
|
+
}
|
|
779
|
+
const clamp = (value) => Math.min(12, Math.max(1, Math.floor(Number(value))))
|
|
780
|
+
const columns = Number(tab.columns)
|
|
781
|
+
const share = Number.isFinite(columns) && columns >= 1 ? clamp(12 / Math.min(12, Math.floor(columns))) : 12
|
|
782
|
+
const placed = new Map((Array.isArray(tab.layout) ? tab.layout : [])
|
|
783
|
+
.filter((entry) => entry && typeof entry.widgetId === 'string' && Number.isFinite(Number(entry.gridWidth)))
|
|
784
|
+
.map((entry) => [entry.widgetId, clamp(entry.gridWidth)]))
|
|
785
|
+
if (placed.size === 0 && share === 12) {
|
|
786
|
+
return null
|
|
787
|
+
}
|
|
788
|
+
return widgets.map((widget) => placed.get(widget.id) ?? share)
|
|
789
|
+
},
|
|
790
|
+
|
|
791
|
+
/**
|
|
792
|
+
* The inline column span of one widget of a gridded stack.
|
|
793
|
+
*
|
|
794
|
+
* @param {number[]|null} grid The spans of the stack, or null.
|
|
795
|
+
* @param {number} index The widget's position in the stack.
|
|
796
|
+
* @return {object|undefined} The style, or undefined without a grid.
|
|
797
|
+
*/
|
|
798
|
+
spanStyle(grid, index) {
|
|
799
|
+
return grid ? { gridColumn: `span ${grid[index] || 12}` } : undefined
|
|
800
|
+
},
|
|
801
|
+
|
|
754
802
|
/**
|
|
755
803
|
* The widget ids a tab names: `widgetIds` (a stack) when it holds at
|
|
756
804
|
* least one id, else `widgetId`, or the bare string.
|
|
@@ -999,6 +1047,29 @@ export default {
|
|
|
999
1047
|
gap: 20px;
|
|
1000
1048
|
}
|
|
1001
1049
|
|
|
1050
|
+
/* A gridded stack (`columns` / `layout` on the tab): 12 columns, widgets wrap
|
|
1051
|
+
onto the next row, a row's cards as tall as the tallest. Narrow, it is the
|
|
1052
|
+
plain stack again. */
|
|
1053
|
+
.cn-tabs-widget__stack--grid {
|
|
1054
|
+
display: grid;
|
|
1055
|
+
grid-template-columns: repeat(12, minmax(0, 1fr));
|
|
1056
|
+
align-items: stretch;
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
.cn-tabs-widget__stack--grid > * {
|
|
1060
|
+
min-width: 0;
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
@media (max-width: 700px) {
|
|
1064
|
+
.cn-tabs-widget__stack--grid {
|
|
1065
|
+
grid-template-columns: minmax(0, 1fr);
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
.cn-tabs-widget__stack--grid > * {
|
|
1069
|
+
grid-column: auto !important;
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1002
1073
|
/* The panel is the card; the strip is not inside it. There is no title bar
|
|
1003
1074
|
above the tabs either: the open tab names the panel, so a title row would
|
|
1004
1075
|
say the same thing twice and cost a row of height on a card that is mostly
|
|
@@ -1119,6 +1190,14 @@ export default {
|
|
|
1119
1190
|
height: 100%;
|
|
1120
1191
|
}
|
|
1121
1192
|
|
|
1193
|
+
/* A list widget's footer Add bleeds through its card's 16px content padding
|
|
1194
|
+
(margin 0 -16px -16px). The panel of a tab pads 12px, so on a tab that
|
|
1195
|
+
holds the list directly the footer stuck out 4px on the right and at the
|
|
1196
|
+
bottom and made the panel scroll. It bleeds exactly the panel's padding. */
|
|
1197
|
+
.cn-tabs-widget__tabs :deep(.cn-tabs__content > .cn-tab > .cn-detail-widget-host--bare .cn-object-list-widget__add) {
|
|
1198
|
+
margin: auto -12px -12px;
|
|
1199
|
+
}
|
|
1200
|
+
|
|
1122
1201
|
.cn-tabs-widget__title {
|
|
1123
1202
|
align-items: center;
|
|
1124
1203
|
display: inline-flex;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
- SPDX-License-Identifier: EUPL-1.2
|
|
4
4
|
-->
|
|
5
5
|
<template>
|
|
6
|
-
<div class="cn-tasks-widget">
|
|
6
|
+
<div class="cn-tasks-widget" :class="{ 'cn-tasks-widget--list': isList }">
|
|
7
7
|
<!-- One quiet line on failure, never a leaked axios status string
|
|
8
8
|
(ADR-062). The real error goes to the console. -->
|
|
9
9
|
<p v-if="error" class="cn-tasks-widget__error">
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
<!-- The count states the server TOTAL, never the rendered length
|
|
22
22
|
(ADR-062): the number a person acts on is how much work
|
|
23
23
|
exists, not how much fits the cell. -->
|
|
24
|
-
<p class="cn-tasks-widget__count">
|
|
24
|
+
<p v-if="!isList" class="cn-tasks-widget__count">
|
|
25
25
|
{{ countLabel }}
|
|
26
26
|
</p>
|
|
27
27
|
<ul class="cn-tasks-widget__list">
|
|
@@ -33,23 +33,53 @@
|
|
|
33
33
|
@click="onRowClick(task, $event)"
|
|
34
34
|
@mousedown="preventMiddleClickAutoscroll"
|
|
35
35
|
@auxclick="onRowAuxClick(task, $event)">
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
36
|
+
<!-- List variant: a checkbox completes the viewer's own task
|
|
37
|
+
(the task with a declared outcome list keeps the menu, as
|
|
38
|
+
a checkbox cannot choose an outcome). Other rows get a
|
|
39
|
+
spacer so the titles stay aligned. -->
|
|
40
|
+
<template v-if="isList">
|
|
41
|
+
<input
|
|
42
|
+
v-if="canCheck(task)"
|
|
43
|
+
type="checkbox"
|
|
44
|
+
class="cn-tasks-widget__check"
|
|
45
|
+
:checked="completing.includes(String(task.uuid))"
|
|
46
|
+
:disabled="completing.includes(String(task.uuid))"
|
|
47
|
+
:aria-label="tr('Mark {title} as done').replace('{title}', titleOf(task))"
|
|
48
|
+
data-testid="cn-tasks-widget-check"
|
|
49
|
+
@click.stop
|
|
50
|
+
@change="check(task)">
|
|
51
|
+
<span v-else class="cn-tasks-widget__check-spacer" aria-hidden="true" />
|
|
52
|
+
<span class="cn-tasks-widget__body">
|
|
53
|
+
<span class="cn-tasks-widget__name">{{ titleOf(task) }}</span>
|
|
54
|
+
<span class="cn-tasks-widget__meta cn-tasks-widget__meta--split">
|
|
55
|
+
<span class="cn-tasks-widget__subject">{{ subjectOf(task) }}</span>
|
|
56
|
+
<span
|
|
57
|
+
class="cn-tasks-widget__due"
|
|
58
|
+
:class="{ 'cn-tasks-widget__due--overdue': task.overdue === true }">
|
|
59
|
+
{{ dueLabel(task) }}
|
|
60
|
+
</span>
|
|
61
|
+
</span>
|
|
62
|
+
</span>
|
|
63
|
+
</template>
|
|
64
|
+
<template v-else>
|
|
65
|
+
<span class="cn-tasks-widget__body">
|
|
66
|
+
<span class="cn-tasks-widget__name">{{ titleOf(task) }}</span>
|
|
67
|
+
<span class="cn-tasks-widget__meta">{{ metaLine(task) }}</span>
|
|
68
|
+
</span>
|
|
69
|
+
<!-- Overdue is carried by the WORDING (taskDueLabel) and by
|
|
70
|
+
weight; the colour only reinforces it. -->
|
|
71
|
+
<span
|
|
72
|
+
class="cn-tasks-widget__due"
|
|
73
|
+
:class="{ 'cn-tasks-widget__due--overdue': task.overdue === true }">
|
|
74
|
+
{{ dueLabel(task) }}
|
|
75
|
+
</span>
|
|
76
|
+
</template>
|
|
47
77
|
<!-- Only verbs the contract can accept are offered; the
|
|
48
78
|
server still authorizes, and a refusal is toasted in
|
|
49
79
|
its own words. Stopped clicks: the menu must not also
|
|
50
80
|
open the row. -->
|
|
51
81
|
<NcActions
|
|
52
|
-
v-if="canClaim(task) || canComplete(task)"
|
|
82
|
+
v-if="(canClaim(task) || canComplete(task)) && !(isList && canCheck(task))"
|
|
53
83
|
class="cn-tasks-widget__actions"
|
|
54
84
|
:forceMenu="true"
|
|
55
85
|
:aria-label="tr('Task actions')"
|
|
@@ -90,6 +120,7 @@ import { NcActionButton, NcActions, NcLoadingIcon } from '@nextcloud/vue'
|
|
|
90
120
|
import { inject, ref } from 'vue'
|
|
91
121
|
import { taskDeepLink, taskDueLabel } from '../../composables/indexSources.js'
|
|
92
122
|
import { useEndpointSource } from '../../composables/useEndpointSource.js'
|
|
123
|
+
import { contentHeaderLink } from '../../utils/contentHeaderLink.js'
|
|
93
124
|
import { openRowTarget } from '../../utils/linkNavigation.js'
|
|
94
125
|
import { isRowMiddleClick, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'
|
|
95
126
|
|
|
@@ -185,8 +216,14 @@ export default {
|
|
|
185
216
|
* receiving the task uuid as `:id`. Omitted = the click opens the
|
|
186
217
|
* task's openregister deep link instead.
|
|
187
218
|
* - `emptyText` — override for the empty-inbox line.
|
|
219
|
+
* - `variant` — `list` draws a checkbox list: a checkbox that completes
|
|
220
|
+
* the viewer's own task, the title, the subject on a second muted
|
|
221
|
+
* line and the due date at its right. Default: the compact rows.
|
|
222
|
+
* - `viewAllRoute` / `viewAllLabel` — a "View all" text link in the
|
|
223
|
+
* card header: a route name or location `{ name, params?, query? }`,
|
|
224
|
+
* and its label (default "View all"). `headerLink` works too.
|
|
188
225
|
*
|
|
189
|
-
* @type {{scope?: string, limit?: number, pollSeconds?: number, rowRoute?: string, emptyText?: string}}
|
|
226
|
+
* @type {{scope?: string, limit?: number, pollSeconds?: number, rowRoute?: string, emptyText?: string, variant?: string, viewAllRoute?: (string|object), viewAllLabel?: string}}
|
|
190
227
|
*/
|
|
191
228
|
content: {
|
|
192
229
|
type: Object,
|
|
@@ -214,6 +251,8 @@ export default {
|
|
|
214
251
|
},
|
|
215
252
|
},
|
|
216
253
|
|
|
254
|
+
emits: ['header'],
|
|
255
|
+
|
|
217
256
|
setup(props) {
|
|
218
257
|
// The shared endpoint engine owns request dedup, the short-TTL cache
|
|
219
258
|
// and the cn:page:refresh / cn:widget:refresh subscriptions — the
|
|
@@ -253,10 +292,30 @@ export default {
|
|
|
253
292
|
data() {
|
|
254
293
|
return {
|
|
255
294
|
pollTimer: null,
|
|
295
|
+
/** Uuids of the tasks a checkbox is completing, until the next read. */
|
|
296
|
+
completing: [],
|
|
256
297
|
}
|
|
257
298
|
},
|
|
258
299
|
|
|
259
300
|
computed: {
|
|
301
|
+
/**
|
|
302
|
+
* Whether the rows draw as the checkbox list (`content.variant: 'list'`).
|
|
303
|
+
*
|
|
304
|
+
* @return {boolean}
|
|
305
|
+
*/
|
|
306
|
+
isList() {
|
|
307
|
+
return this.content.variant === 'list'
|
|
308
|
+
},
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* The header "View all" link the content declares, or null.
|
|
312
|
+
*
|
|
313
|
+
* @return {object|null}
|
|
314
|
+
*/
|
|
315
|
+
headerLink() {
|
|
316
|
+
return contentHeaderLink(this.content)
|
|
317
|
+
},
|
|
318
|
+
|
|
260
319
|
/**
|
|
261
320
|
* Effective translate function: the explicit prop, then the injected
|
|
262
321
|
* host one, then `@nextcloud/l10n` under the library's own app id.
|
|
@@ -357,6 +416,19 @@ export default {
|
|
|
357
416
|
},
|
|
358
417
|
},
|
|
359
418
|
|
|
419
|
+
watch: {
|
|
420
|
+
headerLink: {
|
|
421
|
+
immediate: true,
|
|
422
|
+
handler(link) {
|
|
423
|
+
/**
|
|
424
|
+
* @event header Emitted with the card header's parts: the "View all" link, if any.
|
|
425
|
+
* @type {{link: (object|null), note: string}}
|
|
426
|
+
*/
|
|
427
|
+
this.$emit('header', { link, note: '' })
|
|
428
|
+
},
|
|
429
|
+
},
|
|
430
|
+
},
|
|
431
|
+
|
|
360
432
|
mounted() {
|
|
361
433
|
this.startPolling()
|
|
362
434
|
document.addEventListener('visibilitychange', this.onVisibilityChange)
|
|
@@ -423,6 +495,43 @@ export default {
|
|
|
423
495
|
return task.displayTitle || task.title || String(task.uuid || '')
|
|
424
496
|
},
|
|
425
497
|
|
|
498
|
+
/**
|
|
499
|
+
* The subject (the case a task sits on), for the list variant's second line.
|
|
500
|
+
*
|
|
501
|
+
* @param {object} task The task row.
|
|
502
|
+
* @return {string} The subject's title, or ''.
|
|
503
|
+
*/
|
|
504
|
+
subjectOf(task) {
|
|
505
|
+
return task.subject && task.subject.title ? String(task.subject.title) : ''
|
|
506
|
+
},
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* Whether the list variant draws a checkbox on the row: the viewer's own
|
|
510
|
+
* open task, with no outcome list to choose from.
|
|
511
|
+
*
|
|
512
|
+
* @param {object} task The task row.
|
|
513
|
+
* @return {boolean}
|
|
514
|
+
*/
|
|
515
|
+
canCheck(task) {
|
|
516
|
+
return this.canComplete(task) && !(Array.isArray(task.outcomes) && task.outcomes.length > 0)
|
|
517
|
+
},
|
|
518
|
+
|
|
519
|
+
/**
|
|
520
|
+
* Complete a task from its checkbox, with the server's default outcome.
|
|
521
|
+
*
|
|
522
|
+
* @param {object} task The task row.
|
|
523
|
+
* @return {Promise<void>}
|
|
524
|
+
*/
|
|
525
|
+
async check(task) {
|
|
526
|
+
const uuid = String(task.uuid || '')
|
|
527
|
+
if (uuid === '' || this.completing.includes(uuid)) {
|
|
528
|
+
return
|
|
529
|
+
}
|
|
530
|
+
this.completing = [...this.completing, uuid]
|
|
531
|
+
await this.postVerb(task, 'complete', { outcome: 'done' })
|
|
532
|
+
this.completing = this.completing.filter((id) => id !== uuid)
|
|
533
|
+
},
|
|
534
|
+
|
|
426
535
|
/**
|
|
427
536
|
* The secondary line: subject, state and priority — whichever of
|
|
428
537
|
* those the row actually carries, in words.
|
|
@@ -721,6 +830,57 @@ function normaliseScope(raw) {
|
|
|
721
830
|
font-variant-numeric: tabular-nums;
|
|
722
831
|
}
|
|
723
832
|
|
|
833
|
+
/* List variant, after the dashboard board's My tasks card: a checkbox, the
|
|
834
|
+
title, the subject on a muted second line and the due date at its right. */
|
|
835
|
+
.cn-tasks-widget--list .cn-tasks-widget__row {
|
|
836
|
+
align-items: flex-start;
|
|
837
|
+
gap: 12px;
|
|
838
|
+
padding: 12px 0;
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
.cn-tasks-widget--list .cn-tasks-widget__name {
|
|
842
|
+
font-weight: 400;
|
|
843
|
+
font-size: 15px;
|
|
844
|
+
line-height: 1.35;
|
|
845
|
+
color: var(--color-main-text);
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
.cn-tasks-widget__check,
|
|
849
|
+
.cn-tasks-widget__check-spacer {
|
|
850
|
+
flex: none;
|
|
851
|
+
width: 20px;
|
|
852
|
+
height: 20px;
|
|
853
|
+
margin: 1px 0 0;
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
.cn-tasks-widget__check {
|
|
857
|
+
accent-color: var(--color-primary-element);
|
|
858
|
+
cursor: pointer;
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
.cn-tasks-widget__meta--split {
|
|
862
|
+
display: flex;
|
|
863
|
+
justify-content: space-between;
|
|
864
|
+
gap: 8px;
|
|
865
|
+
font-size: 13px;
|
|
866
|
+
overflow: visible;
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
.cn-tasks-widget__subject {
|
|
870
|
+
min-width: 0;
|
|
871
|
+
overflow: hidden;
|
|
872
|
+
text-overflow: ellipsis;
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
.cn-tasks-widget--list .cn-tasks-widget__due {
|
|
876
|
+
font-size: 13px;
|
|
877
|
+
font-weight: 500;
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
.cn-tasks-widget--list .cn-tasks-widget__due--overdue {
|
|
881
|
+
font-weight: 600;
|
|
882
|
+
}
|
|
883
|
+
|
|
724
884
|
/* Overdue: weight AND colour on top of the wording, which already says
|
|
725
885
|
"Overdue by N days" — the signal survives monochrome. */
|
|
726
886
|
.cn-tasks-widget__due--overdue {
|