@conduction/nextcloud-vue 2.91.0 → 2.93.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.
Files changed (149) hide show
  1. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +57 -4
  2. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  3. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +44 -17
  4. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  5. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue.js +1 -1
  6. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue2.js +44 -2
  7. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue2.js.map +1 -1
  8. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue3.js +140 -59
  9. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue3.js.map +1 -1
  10. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
  11. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +20 -6
  12. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  13. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +3 -2
  14. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  15. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +10 -39
  16. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  17. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  18. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +5 -3
  19. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  20. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  21. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  22. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +6 -4
  23. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  24. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  25. package/dist/esm/components/CnFeaturesAndRoadmapPage/CnFeaturesAndRoadmapPage.vue2.js +46 -0
  26. package/dist/esm/components/CnFeaturesAndRoadmapPage/CnFeaturesAndRoadmapPage.vue2.js.map +1 -1
  27. package/dist/esm/components/CnFeaturesAndRoadmapPage/CnFeaturesAndRoadmapPage.vue3.js +6 -2
  28. package/dist/esm/components/CnFeaturesAndRoadmapPage/CnFeaturesAndRoadmapPage.vue3.js.map +1 -1
  29. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue.js +1 -1
  30. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js +82 -9
  31. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js.map +1 -1
  32. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js +104 -90
  33. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js.map +1 -1
  34. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue.js +9 -0
  35. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue.js.map +1 -0
  36. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue2.js +355 -0
  37. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue2.js.map +1 -0
  38. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue3.js +462 -0
  39. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue3.js.map +1 -0
  40. package/dist/esm/components/CnFormDialog/CnFormDialog.vue.js +1 -1
  41. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +39 -10
  42. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
  43. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js +418 -399
  44. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
  45. package/dist/esm/components/CnIcon/semanticIcons.js +2 -2
  46. package/dist/esm/components/CnIcon/semanticIcons.js.map +1 -1
  47. package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue.js +1 -1
  48. package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue2.js +156 -3
  49. package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue2.js.map +1 -1
  50. package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue3.js +168 -52
  51. package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue3.js.map +1 -1
  52. package/dist/esm/components/CnModuleCard/CnModuleCard.vue.js +9 -0
  53. package/dist/esm/components/CnModuleCard/CnModuleCard.vue.js.map +1 -0
  54. package/dist/esm/components/CnModuleCard/CnModuleCard.vue2.js +83 -0
  55. package/dist/esm/components/CnModuleCard/CnModuleCard.vue2.js.map +1 -0
  56. package/dist/esm/components/CnModuleCard/CnModuleCard.vue3.js +119 -0
  57. package/dist/esm/components/CnModuleCard/CnModuleCard.vue3.js.map +1 -0
  58. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue.js +1 -1
  59. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue2.js +22 -1
  60. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue2.js.map +1 -1
  61. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue3.js +20 -14
  62. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue3.js.map +1 -1
  63. package/dist/esm/components/CnNotificationPreferences/CnNotificationPreferences.vue.js +1 -1
  64. package/dist/esm/components/CnNotificationPreferences/CnNotificationPreferences.vue2.js +2 -0
  65. package/dist/esm/components/CnNotificationPreferences/CnNotificationPreferences.vue2.js.map +1 -1
  66. package/dist/esm/components/CnNotificationPreferences/CnNotificationPreferences.vue3.js +15 -5
  67. package/dist/esm/components/CnNotificationPreferences/CnNotificationPreferences.vue3.js.map +1 -1
  68. package/dist/esm/components/CnRoadmapTab/CnRoadmapTab.vue.js +1 -1
  69. package/dist/esm/components/CnRoadmapTab/CnRoadmapTab.vue2.js +8 -30
  70. package/dist/esm/components/CnRoadmapTab/CnRoadmapTab.vue2.js.map +1 -1
  71. package/dist/esm/components/CnRoadmapTab/CnRoadmapTab.vue3.js.map +1 -1
  72. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
  73. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +33 -2
  74. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  75. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  76. package/dist/esm/components/CnTextWidget/CnTextWidget.vue.js +1 -1
  77. package/dist/esm/components/CnTextWidget/CnTextWidget.vue2.js +63 -4
  78. package/dist/esm/components/CnTextWidget/CnTextWidget.vue2.js.map +1 -1
  79. package/dist/esm/components/CnTextWidget/CnTextWidget.vue3.js +19 -2
  80. package/dist/esm/components/CnTextWidget/CnTextWidget.vue3.js.map +1 -1
  81. package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue.js +9 -0
  82. package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue.js.map +1 -0
  83. package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue2.js +164 -0
  84. package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue2.js.map +1 -0
  85. package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue3.js +93 -0
  86. package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue3.js.map +1 -0
  87. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue.js +1 -1
  88. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +12 -0
  89. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
  90. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js.map +1 -1
  91. package/dist/esm/l10n/en.json.js +45 -1
  92. package/dist/esm/l10n/en.json.js.map +1 -1
  93. package/dist/esm/l10n/nl.json.js +44 -1
  94. package/dist/esm/l10n/nl.json.js.map +1 -1
  95. package/dist/esm/library-style.js +1 -1
  96. package/dist/esm/nextcloud-vue.css +1182 -328
  97. package/dist/esm/utils/boardDate.js +35 -1
  98. package/dist/esm/utils/boardDate.js.map +1 -1
  99. package/dist/esm/utils/featureCatalog.js +135 -0
  100. package/dist/esm/utils/featureCatalog.js.map +1 -0
  101. package/dist/esm/utils/fillTemplate.js +84 -4
  102. package/dist/esm/utils/fillTemplate.js.map +1 -1
  103. package/dist/esm/utils/headerMeta.js +62 -12
  104. package/dist/esm/utils/headerMeta.js.map +1 -1
  105. package/dist/esm/utils/roadmapIssues.js +86 -0
  106. package/dist/esm/utils/roadmapIssues.js.map +1 -0
  107. package/dist/esm/utils/userDisplayName.js +47 -0
  108. package/dist/esm/utils/userDisplayName.js.map +1 -0
  109. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  110. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  111. package/dist/nextcloud-vue.cjs.js +15618 -13097
  112. package/dist/nextcloud-vue.cjs.js.map +2 -2
  113. package/dist/nextcloud-vue.css +1182 -328
  114. package/l10n/en.json +45 -1
  115. package/l10n/nl.json +44 -1
  116. package/package.json +1 -1
  117. package/src/components/CnAppRoot/CnAppRoot.md +2 -0
  118. package/src/components/CnAppRoot/CnAppRoot.vue +66 -5
  119. package/src/components/CnChoiceCards/CnChoiceCards.md +27 -0
  120. package/src/components/CnChoiceCards/CnChoiceCards.vue +168 -3
  121. package/src/components/CnDashboardPage/CnDashboardPage.vue +45 -6
  122. package/src/components/CnDataTable/CnDataTable.vue +10 -39
  123. package/src/components/CnDetailPage/CnDetailPage.vue +5 -3
  124. package/src/components/CnFactsWidget/CnFactsWidget.vue +6 -4
  125. package/src/components/CnFeaturesAndRoadmapPage/CnFeaturesAndRoadmapPage.vue +51 -1
  126. package/src/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue +98 -13
  127. package/src/components/CnFeaturesBoard/CnFeaturesBoard.vue +1053 -0
  128. package/src/components/CnFormDialog/CnFormDialog.md +1 -0
  129. package/src/components/CnFormDialog/CnFormDialog.vue +619 -562
  130. package/src/components/CnLinkCardsPage/CnLinkCardsPage.vue +338 -5
  131. package/src/components/CnModuleCard/CnModuleCard.vue +258 -0
  132. package/src/components/CnNcWidgetWidget/CnNcWidgetWidget.vue +23 -2
  133. package/src/components/CnNotificationPreferences/CnNotificationPreferences.vue +5 -0
  134. package/src/components/CnRoadmapTab/CnRoadmapTab.vue +6 -28
  135. package/src/components/CnTabsWidget/CnTabsWidget.vue +33 -2
  136. package/src/components/CnTextWidget/CnTextWidget.vue +89 -4
  137. package/src/components/CnUserSettingsDialog/CnUserSettingsDialog.vue +305 -0
  138. package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +12 -0
  139. package/src/css/dialog.css +47 -0
  140. package/src/css/look-board-detail.css +8 -0
  141. package/src/css/look-board.css +33 -0
  142. package/src/schemas/app-manifest-v2.schema.json +67 -4
  143. package/src/utils/boardDate.js +34 -0
  144. package/src/utils/featureCatalog.js +132 -0
  145. package/src/utils/fillTemplate.js +83 -3
  146. package/src/utils/headerMeta.js +62 -12
  147. package/src/utils/roadmapIssues.js +82 -0
  148. package/src/utils/userDisplayName.js +54 -0
  149. package/src/utils/validateManifestV2.compiled.js +3 -3
@@ -94,7 +94,7 @@ import HandshakeOutlineIcon from 'vue-material-design-icons/HandshakeOutline.vue
94
94
  import History from 'vue-material-design-icons/History.vue';
95
95
  import ImageOutlineIcon from 'vue-material-design-icons/ImageOutline.vue';
96
96
  import InformationOutline from 'vue-material-design-icons/InformationOutline.vue';
97
- import KeyOutlineIcon from 'vue-material-design-icons/KeyOutline.vue';
97
+ import KeyOutline from 'vue-material-design-icons/KeyOutline.vue';
98
98
  import LayersOutlineIcon from 'vue-material-design-icons/LayersOutline.vue';
99
99
  import LinkVariant from 'vue-material-design-icons/LinkVariant.vue';
100
100
  import LockOutline from 'vue-material-design-icons/LockOutline.vue';
@@ -494,7 +494,7 @@ const SEMANTIC_ICON_COMPONENTS = Object.freeze({
494
494
  History: History,
495
495
  ImageOutline: ImageOutlineIcon,
496
496
  InformationOutline: InformationOutline,
497
- KeyOutline: KeyOutlineIcon,
497
+ KeyOutline: KeyOutline,
498
498
  LayersOutline: LayersOutlineIcon,
499
499
  LinkVariant: LinkVariant,
500
500
  LockOutline: LockOutline,
@@ -1 +1 @@
1
- {"version":3,"file":"semanticIcons.js","sources":["../../../../src/components/CnIcon/semanticIcons.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n *\n * semanticIcons — the fleet-wide semantic icon vocabulary (ADR-077).\n *\n * One concept, one icon. A manifest `icon` field holds an MDI PascalCase name;\n * this table is what makes the same concept read the same way in every\n * Conduction app (Store is always StoreOutline, Dashboard is always\n * ViewDashboardOutline). The mapping is a BIJECTION — no concept has two\n * icons and no icon serves two concepts — which is what stops the historical\n * overloading (one glyph standing for 18 unrelated things).\n *\n * Tier A is universal chrome every app has and MUST match. Tier B is the\n * shared domain vocabulary an app SHOULD use when it has the concept.\n *\n * WHY THIS IS A PURE EXPORT AND NOT AN import-time `registerIcons()` CALL:\n * the published dist's `sideEffects` allowlist has previously tree-shaken\n * import-time side effects out of consumer bundles, which fails SILENTLY\n * (nothing renders, no error). So the rendering components import\n * {@link SEMANTIC_ICON_COMPONENTS} and consult it directly — resolution is\n * guaranteed by the component that needs it, with no side-effect ordering to\n * get wrong and nothing for a bundler to drop.\n *\n * Every name below is verified to exist in `vue-material-design-icons` by\n * tests/components/semanticIcons.spec.js — the check that caught invented\n * names like `LedgerOutline` and `FileSignOutline` already live in manifests.\n *\n * Each icon is imported individually (no wildcard / barrel) so the bundle\n * stays tree-shake-friendly.\n *\n * @spec openspec/architecture/adr-077-semantic-icon-vocabulary.md\n */\n\nimport AccountArrowRightOutlineIcon from 'vue-material-design-icons/AccountArrowRightOutline.vue'\nimport AccountBoxOutlineIcon from 'vue-material-design-icons/AccountBoxOutline.vue'\nimport AccountGroupOutlineIcon from 'vue-material-design-icons/AccountGroupOutline.vue'\nimport AccountKeyOutlineIcon from 'vue-material-design-icons/AccountKeyOutline.vue'\nimport AccountMinusOutlineIcon from 'vue-material-design-icons/AccountMinusOutline.vue'\nimport AccountMultipleOutlineIcon from 'vue-material-design-icons/AccountMultipleOutline.vue'\nimport AccountOutlineIcon from 'vue-material-design-icons/AccountOutline.vue'\nimport AccountPlusOutlineIcon from 'vue-material-design-icons/AccountPlusOutline.vue'\nimport AccountSchoolOutlineIcon from 'vue-material-design-icons/AccountSchoolOutline.vue'\nimport AccountSearchOutlineIcon from 'vue-material-design-icons/AccountSearchOutline.vue'\nimport AccountStarOutlineIcon from 'vue-material-design-icons/AccountStarOutline.vue'\nimport AccountSwitchOutlineIcon from 'vue-material-design-icons/AccountSwitchOutline.vue'\nimport AccountTieOutlineIcon from 'vue-material-design-icons/AccountTieOutline.vue'\nimport AlertCircleOutlineIcon from 'vue-material-design-icons/AlertCircleOutline.vue'\nimport ApiIcon from 'vue-material-design-icons/Api.vue'\nimport ApplicationOutlineIcon from 'vue-material-design-icons/ApplicationOutline.vue'\nimport BankOutlineIcon from 'vue-material-design-icons/BankOutline.vue'\nimport BankTransferIcon from 'vue-material-design-icons/BankTransfer.vue'\nimport BellOutlineIcon from 'vue-material-design-icons/BellOutline.vue'\nimport BookOpenPageVariantOutlineIcon from 'vue-material-design-icons/BookOpenPageVariantOutline.vue'\nimport BookOpenVariantOutlineIcon from 'vue-material-design-icons/BookOpenVariantOutline.vue'\nimport BookshelfIcon from 'vue-material-design-icons/Bookshelf.vue'\nimport BrainIcon from 'vue-material-design-icons/Brain.vue'\nimport BriefcaseOutlineIcon from 'vue-material-design-icons/BriefcaseOutline.vue'\nimport CalculatorVariantOutlineIcon from 'vue-material-design-icons/CalculatorVariantOutline.vue'\nimport CalendarAccountOutlineIcon from 'vue-material-design-icons/CalendarAccountOutline.vue'\nimport CalendarClockOutlineIcon from 'vue-material-design-icons/CalendarClockOutline.vue'\nimport CalendarOutlineIcon from 'vue-material-design-icons/CalendarOutline.vue'\nimport CalendarRemoveOutlineIcon from 'vue-material-design-icons/CalendarRemoveOutline.vue'\nimport CalendarTextOutlineIcon from 'vue-material-design-icons/CalendarTextOutline.vue'\nimport CalendarWeekendOutlineIcon from 'vue-material-design-icons/CalendarWeekendOutline.vue'\nimport CarOutlineIcon from 'vue-material-design-icons/CarOutline.vue'\nimport CartArrowDownIcon from 'vue-material-design-icons/CartArrowDown.vue'\nimport CartOutlineIcon from 'vue-material-design-icons/CartOutline.vue'\nimport CashSyncIcon from 'vue-material-design-icons/CashSync.vue'\nimport CertificateOutlineIcon from 'vue-material-design-icons/CertificateOutline.vue'\nimport ChartBarIcon from 'vue-material-design-icons/ChartBar.vue'\nimport ChartBoxOutlineIcon from 'vue-material-design-icons/ChartBoxOutline.vue'\nimport ChartLineVariantIcon from 'vue-material-design-icons/ChartLineVariant.vue'\nimport ChartSankeyIcon from 'vue-material-design-icons/ChartSankey.vue'\nimport ChartTimelineVariantIcon from 'vue-material-design-icons/ChartTimelineVariant.vue'\nimport CheckboxMarkedCircleOutlineIcon from 'vue-material-design-icons/CheckboxMarkedCircleOutline.vue'\nimport CheckCircleOutlineIcon from 'vue-material-design-icons/CheckCircleOutline.vue'\nimport CheckDecagramOutlineIcon from 'vue-material-design-icons/CheckDecagramOutline.vue'\nimport ClipboardAccountOutlineIcon from 'vue-material-design-icons/ClipboardAccountOutline.vue'\nimport ClipboardCheckOutlineIcon from 'vue-material-design-icons/ClipboardCheckOutline.vue'\nimport ClipboardListOutlineIcon from 'vue-material-design-icons/ClipboardListOutline.vue'\nimport ClipboardPulseOutlineIcon from 'vue-material-design-icons/ClipboardPulseOutline.vue'\nimport ClipboardTextOutlineIcon from 'vue-material-design-icons/ClipboardTextOutline.vue'\nimport ClockAlertOutlineIcon from 'vue-material-design-icons/ClockAlertOutline.vue'\nimport ClockCheckOutlineIcon from 'vue-material-design-icons/ClockCheckOutline.vue'\nimport ClockOutlineIcon from 'vue-material-design-icons/ClockOutline.vue'\nimport CloseCircleOutlineIcon from 'vue-material-design-icons/CloseCircleOutline.vue'\nimport CloudUploadOutlineIcon from 'vue-material-design-icons/CloudUploadOutline.vue'\nimport CogOutlineIcon from 'vue-material-design-icons/CogOutline.vue'\nimport CommentOutlineIcon from 'vue-material-design-icons/CommentOutline.vue'\nimport CommentQuestionOutlineIcon from 'vue-material-design-icons/CommentQuestionOutline.vue'\nimport ContentCopyIcon from 'vue-material-design-icons/ContentCopy.vue'\nimport ContentSaveIcon from 'vue-material-design-icons/ContentSave.vue'\nimport CreditCardOutlineIcon from 'vue-material-design-icons/CreditCardOutline.vue'\nimport CubeOutlineIcon from 'vue-material-design-icons/CubeOutline.vue'\nimport CurrencyEurIcon from 'vue-material-design-icons/CurrencyEur.vue'\nimport DatabaseArrowRightOutlineIcon from 'vue-material-design-icons/DatabaseArrowRightOutline.vue'\nimport DatabaseExportOutlineIcon from 'vue-material-design-icons/DatabaseExportOutline.vue'\nimport DatabaseImportOutlineIcon from 'vue-material-design-icons/DatabaseImportOutline.vue'\nimport DatabaseOutlineIcon from 'vue-material-design-icons/DatabaseOutline.vue'\nimport DeleteOutlineIcon from 'vue-material-design-icons/DeleteOutline.vue'\nimport DesktopTowerMonitorIcon from 'vue-material-design-icons/DesktopTowerMonitor.vue'\nimport DomainIcon from 'vue-material-design-icons/Domain.vue'\nimport DotsHorizontalIcon from 'vue-material-design-icons/DotsHorizontal.vue'\nimport DownloadIcon from 'vue-material-design-icons/Download.vue'\nimport EmailOutlineIcon from 'vue-material-design-icons/EmailOutline.vue'\nimport EyeOffOutlineIcon from 'vue-material-design-icons/EyeOffOutline.vue'\nimport EyeOutlineIcon from 'vue-material-design-icons/EyeOutline.vue'\nimport FileAlertOutlineIcon from 'vue-material-design-icons/FileAlertOutline.vue'\nimport FileChartOutlineIcon from 'vue-material-design-icons/FileChartOutline.vue'\nimport FileCheckOutlineIcon from 'vue-material-design-icons/FileCheckOutline.vue'\nimport FileDocumentMultipleOutlineIcon from 'vue-material-design-icons/FileDocumentMultipleOutline.vue'\nimport FileDocumentOutlineIcon from 'vue-material-design-icons/FileDocumentOutline.vue'\nimport FileLockOutlineIcon from 'vue-material-design-icons/FileLockOutline.vue'\nimport FileReplaceOutlineIcon from 'vue-material-design-icons/FileReplaceOutline.vue'\nimport FileSignIcon from 'vue-material-design-icons/FileSign.vue'\nimport FileTreeOutlineIcon from 'vue-material-design-icons/FileTreeOutline.vue'\nimport FilterVariantIcon from 'vue-material-design-icons/FilterVariant.vue'\nimport FolderAccountOutlineIcon from 'vue-material-design-icons/FolderAccountOutline.vue'\nimport FolderCogOutlineIcon from 'vue-material-design-icons/FolderCogOutline.vue'\nimport FolderOutlineIcon from 'vue-material-design-icons/FolderOutline.vue'\nimport FormatListChecksIcon from 'vue-material-design-icons/FormatListChecks.vue'\nimport ForumOutlineIcon from 'vue-material-design-icons/ForumOutline.vue'\nimport GaugeIcon from 'vue-material-design-icons/Gauge.vue'\nimport GavelIcon from 'vue-material-design-icons/Gavel.vue'\nimport HandHeartOutlineIcon from 'vue-material-design-icons/HandHeartOutline.vue'\nimport HandshakeOutlineIcon from 'vue-material-design-icons/HandshakeOutline.vue'\nimport HistoryIcon from 'vue-material-design-icons/History.vue'\nimport ImageOutlineIcon from 'vue-material-design-icons/ImageOutline.vue'\nimport InformationOutlineIcon from 'vue-material-design-icons/InformationOutline.vue'\nimport KeyOutlineIcon from 'vue-material-design-icons/KeyOutline.vue'\nimport LayersOutlineIcon from 'vue-material-design-icons/LayersOutline.vue'\nimport LinkVariantIcon from 'vue-material-design-icons/LinkVariant.vue'\nimport LockOutlineIcon from 'vue-material-design-icons/LockOutline.vue'\nimport MagnifyIcon from 'vue-material-design-icons/Magnify.vue'\nimport MapMarkerOutlineIcon from 'vue-material-design-icons/MapMarkerOutline.vue'\nimport MapMarkerPathIcon from 'vue-material-design-icons/MapMarkerPath.vue'\nimport MapOutlineIcon from 'vue-material-design-icons/MapOutline.vue'\nimport MedalOutlineIcon from 'vue-material-design-icons/MedalOutline.vue'\nimport MessageTextOutlineIcon from 'vue-material-design-icons/MessageTextOutline.vue'\nimport NotebookOutlineIcon from 'vue-material-design-icons/NotebookOutline.vue'\nimport OfficeBuildingOutlineIcon from 'vue-material-design-icons/OfficeBuildingOutline.vue'\nimport OpenInNewIcon from 'vue-material-design-icons/OpenInNew.vue'\nimport PackageVariantClosedIcon from 'vue-material-design-icons/PackageVariantClosed.vue'\nimport PaperclipIcon from 'vue-material-design-icons/Paperclip.vue'\nimport PencilOutlineIcon from 'vue-material-design-icons/PencilOutline.vue'\nimport PercentOutlineIcon from 'vue-material-design-icons/PercentOutline.vue'\nimport PlayCircleOutlineIcon from 'vue-material-design-icons/PlayCircleOutline.vue'\nimport PlayOutlineIcon from 'vue-material-design-icons/PlayOutline.vue'\nimport PlusIcon from 'vue-material-design-icons/Plus.vue'\nimport PrinterOutlineIcon from 'vue-material-design-icons/PrinterOutline.vue'\nimport PulseIcon from 'vue-material-design-icons/Pulse.vue'\nimport PuzzleOutlineIcon from 'vue-material-design-icons/PuzzleOutline.vue'\nimport ReceiptOutlineIcon from 'vue-material-design-icons/ReceiptOutline.vue'\nimport ReceiptTextOutlineIcon from 'vue-material-design-icons/ReceiptTextOutline.vue'\nimport RefreshIcon from 'vue-material-design-icons/Refresh.vue'\nimport RobotOutlineIcon from 'vue-material-design-icons/RobotOutline.vue'\nimport ScaleBalanceIcon from 'vue-material-design-icons/ScaleBalance.vue'\nimport SchoolOutlineIcon from 'vue-material-design-icons/SchoolOutline.vue'\nimport ShareVariantOutlineIcon from 'vue-material-design-icons/ShareVariantOutline.vue'\nimport ShieldAccountOutlineIcon from 'vue-material-design-icons/ShieldAccountOutline.vue'\nimport ShieldAlertOutlineIcon from 'vue-material-design-icons/ShieldAlertOutline.vue'\nimport ShieldCheckOutlineIcon from 'vue-material-design-icons/ShieldCheckOutline.vue'\nimport ShieldCrownOutlineIcon from 'vue-material-design-icons/ShieldCrownOutline.vue'\nimport ShieldKeyOutlineIcon from 'vue-material-design-icons/ShieldKeyOutline.vue'\nimport ShieldLockOutlineIcon from 'vue-material-design-icons/ShieldLockOutline.vue'\nimport ShieldOutlineIcon from 'vue-material-design-icons/ShieldOutline.vue'\nimport SignatureFreehandIcon from 'vue-material-design-icons/SignatureFreehand.vue'\nimport SitemapOutlineIcon from 'vue-material-design-icons/SitemapOutline.vue'\nimport SourceBranchIcon from 'vue-material-design-icons/SourceBranch.vue'\nimport SpeedometerIcon from 'vue-material-design-icons/Speedometer.vue'\nimport StoreOutlineIcon from 'vue-material-design-icons/StoreOutline.vue'\nimport SwapHorizontalIcon from 'vue-material-design-icons/SwapHorizontal.vue'\nimport TableClockIcon from 'vue-material-design-icons/TableClock.vue'\nimport TagOutlineIcon from 'vue-material-design-icons/TagOutline.vue'\nimport TextBoxOutlineIcon from 'vue-material-design-icons/TextBoxOutline.vue'\nimport ToolboxOutlineIcon from 'vue-material-design-icons/ToolboxOutline.vue'\nimport TransitConnectionVariantIcon from 'vue-material-design-icons/TransitConnectionVariant.vue'\nimport TrayFullIcon from 'vue-material-design-icons/TrayFull.vue'\nimport TrendingUpIcon from 'vue-material-design-icons/TrendingUp.vue'\nimport UploadIcon from 'vue-material-design-icons/Upload.vue'\nimport VectorPolylinePlusIcon from 'vue-material-design-icons/VectorPolylinePlus.vue'\nimport ViewColumnOutlineIcon from 'vue-material-design-icons/ViewColumnOutline.vue'\nimport ViewDashboardOutlineIcon from 'vue-material-design-icons/ViewDashboardOutline.vue'\nimport ViewGridOutlineIcon from 'vue-material-design-icons/ViewGridOutline.vue'\nimport WarehouseIcon from 'vue-material-design-icons/Warehouse.vue'\nimport WebhookIcon from 'vue-material-design-icons/Webhook.vue'\n\n/**\n * Tier A — universal chrome. An app that has the concept MUST use this icon.\n *\n * @type {Readonly<Record<string, string>>}\n */\nexport const SEMANTIC_ICONS_TIER_A = Object.freeze({\n\tdashboard: 'ViewDashboardOutline',\n\tdocumentation: 'BookOpenVariantOutline',\n\t'features-roadmap': 'MapMarkerPath',\n\tsettings: 'CogOutline',\n\tadmin: 'ShieldAccountOutline',\n\tsearch: 'Magnify',\n\tstore: 'StoreOutline',\n\ttutorial: 'PlayCircleOutline',\n\tabout: 'InformationOutline',\n\tnotifications: 'BellOutline',\n\tactivity: 'Pulse',\n\t'audit-trail': 'History',\n\t'my-work': 'ClipboardAccountOutline',\n})\n\n/**\n * Tier B — shared domain vocabulary. An app SHOULD use this icon when it has\n * the concept; a genuinely new concept is added here, never invented locally.\n *\n * @type {Readonly<Record<string, string>>}\n */\nexport const SEMANTIC_ICONS_TIER_B = Object.freeze({\n\t// data & records\n\tdata: 'DatabaseOutline',\n\tschema: 'FileTreeOutline',\n\trecord: 'CubeOutline',\n\t'data-quality': 'ClipboardPulseOutline',\n\timport: 'DatabaseImportOutline',\n\texport: 'DatabaseExportOutline',\n\tmigration: 'DatabaseArrowRightOutline',\n\tmapping: 'SwapHorizontal',\n\tlog: 'TextBoxOutline',\n\tjob: 'ClockOutline',\n\t// documents & files\n\tdocument: 'FileDocumentOutline',\n\tdocuments: 'FileDocumentMultipleOutline',\n\tfolder: 'FolderOutline',\n\ttemplate: 'FileReplaceOutline',\n\tcatalogue: 'Bookshelf',\n\tsigning: 'SignatureFreehand',\n\tcontract: 'FileSign',\n\tcorrespondence: 'EmailOutline',\n\tattachment: 'Paperclip',\n\t// cases & process\n\tcase: 'FolderAccountOutline',\n\t'case-type': 'FolderCogOutline',\n\ttask: 'CheckboxMarkedCircleOutline',\n\ttasks: 'FormatListChecks',\n\tworkflow: 'SitemapOutline',\n\tboard: 'ViewColumnOutline',\n\tapproval: 'CheckDecagramOutline',\n\tdecision: 'Gavel',\n\tqueue: 'TrayFull',\n\tdeadline: 'ClockAlertOutline',\n\tobjection: 'FileAlertOutline',\n\tappeal: 'ScaleBalance',\n\t// communication\n\tchat: 'MessageTextOutline',\n\tcomment: 'CommentOutline',\n\tmeeting: 'CalendarAccountOutline',\n\tagenda: 'CalendarTextOutline',\n\tappointment: 'CalendarClockOutline',\n\tcalendar: 'CalendarOutline',\n\tconsultation: 'CommentQuestionOutline',\n\tforum: 'ForumOutline',\n\t// people & organisations\n\tperson: 'AccountOutline',\n\tpeople: 'AccountMultipleOutline',\n\tgroup: 'AccountGroupOutline',\n\trole: 'AccountKeyOutline',\n\torganisation: 'OfficeBuildingOutline',\n\t'organisation-unit': 'Domain',\n\tpartner: 'HandshakeOutline',\n\tclient: 'AccountStarOutline',\n\temployee: 'AccountTieOutline',\n\tlead: 'AccountArrowRightOutline',\n\tprospect: 'AccountSearchOutline',\n\tsubstitution: 'AccountSwitchOutline',\n\t// commerce & finance\n\tsales: 'CartOutline',\n\tpurchasing: 'CartArrowDown',\n\tproduct: 'PackageVariantClosed',\n\tinventory: 'Warehouse',\n\torder: 'ClipboardListOutline',\n\tinvoice: 'ReceiptTextOutline',\n\tpayment: 'CreditCardOutline',\n\tpayroll: 'CashSync',\n\texpense: 'ReceiptOutline',\n\tbank: 'BankOutline',\n\t'bank-transaction': 'BankTransfer',\n\tbookkeeping: 'NotebookOutline',\n\ttax: 'PercentOutline',\n\tbudget: 'CalculatorVariantOutline',\n\tforecast: 'ChartTimelineVariant',\n\trevenue: 'CurrencyEur',\n\tpricing: 'TagOutline',\n\tsubsidy: 'HandHeartOutline',\n\t// reporting & monitoring\n\treport: 'FileChartOutline',\n\treporting: 'ChartBoxOutline',\n\tanalytics: 'ChartLineVariant',\n\tkpi: 'Speedometer',\n\tmonitoring: 'Gauge',\n\tstatistics: 'ChartBar',\n\t'process-mining': 'ChartSankey',\n\t// security & compliance\n\tsecurity: 'ShieldOutline',\n\tcompliance: 'ClipboardCheckOutline',\n\tpolicy: 'ShieldCheckOutline',\n\tvulnerability: 'ShieldAlertOutline',\n\tcertificate: 'CertificateOutline',\n\tvault: 'LockOutline',\n\tkey: 'KeyOutline',\n\tauthorization: 'ShieldKeyOutline',\n\tprivacy: 'ShieldLockOutline',\n\tanonymization: 'EyeOffOutline',\n\tconsent: 'FileCheckOutline',\n\tconfidentiality: 'FileLockOutline',\n\tretention: 'CalendarRemoveOutline',\n\tgovernance: 'ShieldCrownOutline',\n\t// integration & technology\n\tintegration: 'Api',\n\tconnection: 'TransitConnectionVariant',\n\twebhook: 'Webhook',\n\tautomation: 'VectorPolylinePlus',\n\tagent: 'RobotOutline',\n\tai: 'Brain',\n\ttool: 'ToolboxOutline',\n\tapps: 'ViewGridOutline',\n\tmodule: 'PuzzleOutline',\n\tsource: 'SourceBranch',\n\t// location & geo\n\tlocation: 'MapMarkerOutline',\n\tmap: 'MapOutline',\n\t'map-layer': 'LayersOutline',\n\t// learning\n\tcourse: 'BookOpenPageVariantOutline',\n\tlearning: 'SchoolOutline',\n\tcompetency: 'MedalOutline',\n\ttimetable: 'TableClock',\n\tprogress: 'TrendingUp',\n\tportfolio: 'BriefcaseOutline',\n\texam: 'ClipboardTextOutline',\n\tstudent: 'AccountSchoolOutline',\n\t// Publish, Test connection).\n\tview: 'EyeOutline',\n\tcreate: 'Plus',\n\tedit: 'PencilOutline',\n\tdelete: 'DeleteOutline',\n\trun: 'PlayOutline',\n\ttest: 'CheckCircleOutline',\n\tupload: 'Upload',\n\tpublish: 'CloudUploadOutline',\n\tdownload: 'Download',\n\trefresh: 'Refresh',\n\t'open-external': 'OpenInNew',\n\tcopy: 'ContentCopy',\n\tshare: 'ShareVariantOutline',\n\tfilter: 'FilterVariant',\n\tprint: 'PrinterOutline',\n\timage: 'ImageOutline',\n\tlink: 'LinkVariant',\n\tmore: 'DotsHorizontal',\n\tsave: 'ContentSave',\n\tcancel: 'CloseCircleOutline',\n\talert: 'AlertCircleOutline',\n\t// hr\n\tleave: 'CalendarWeekendOutline',\n\thours: 'ClockCheckOutline',\n\tonboarding: 'AccountPlusOutline',\n\toffboarding: 'AccountMinusOutline',\n\tvacancy: 'AccountBoxOutline',\n\tasset: 'DesktopTowerMonitor',\n\tfleet: 'CarOutline',\n})\n\n/**\n * The whole vocabulary — concept slug to canonical MDI name.\n *\n * @type {Readonly<Record<string, string>>}\n */\nexport const SEMANTIC_ICONS = Object.freeze({\n\t...SEMANTIC_ICONS_TIER_A,\n\t...SEMANTIC_ICONS_TIER_B,\n})\n\n/**\n * Which tier a concept belongs to — `'A'` (MUST) or `'B'` (SHOULD). Consumed by\n * hydra's icon-vocabulary gate to decide hard-fail vs warn.\n *\n * @type {Readonly<Record<string, 'A'|'B'>>}\n */\nexport const SEMANTIC_ICON_TIERS = Object.freeze(Object.fromEntries([\n\t...Object.keys(SEMANTIC_ICONS_TIER_A).map((c) => [c, 'A']),\n\t...Object.keys(SEMANTIC_ICONS_TIER_B).map((c) => [c, 'B']),\n]))\n\n/**\n * Canonical MDI name to its Vue component, for every icon in the vocabulary.\n * The rendering components consult this so an app never has to register a\n * vocabulary icon itself.\n *\n * @type {Readonly<Record<string, object>>}\n */\nexport const SEMANTIC_ICON_COMPONENTS = Object.freeze({\n\tAccountArrowRightOutline: AccountArrowRightOutlineIcon,\n\tAccountBoxOutline: AccountBoxOutlineIcon,\n\tAccountGroupOutline: AccountGroupOutlineIcon,\n\tAccountKeyOutline: AccountKeyOutlineIcon,\n\tAccountMinusOutline: AccountMinusOutlineIcon,\n\tAccountMultipleOutline: AccountMultipleOutlineIcon,\n\tAccountOutline: AccountOutlineIcon,\n\tAccountPlusOutline: AccountPlusOutlineIcon,\n\tAccountSchoolOutline: AccountSchoolOutlineIcon,\n\tAccountSearchOutline: AccountSearchOutlineIcon,\n\tAccountStarOutline: AccountStarOutlineIcon,\n\tAccountSwitchOutline: AccountSwitchOutlineIcon,\n\tAccountTieOutline: AccountTieOutlineIcon,\n\tAlertCircleOutline: AlertCircleOutlineIcon,\n\tApi: ApiIcon,\n\tApplicationOutline: ApplicationOutlineIcon,\n\tBankOutline: BankOutlineIcon,\n\tBankTransfer: BankTransferIcon,\n\tBellOutline: BellOutlineIcon,\n\tBookOpenPageVariantOutline: BookOpenPageVariantOutlineIcon,\n\tBookOpenVariantOutline: BookOpenVariantOutlineIcon,\n\tBookshelf: BookshelfIcon,\n\tBrain: BrainIcon,\n\tBriefcaseOutline: BriefcaseOutlineIcon,\n\tCalculatorVariantOutline: CalculatorVariantOutlineIcon,\n\tCalendarAccountOutline: CalendarAccountOutlineIcon,\n\tCalendarClockOutline: CalendarClockOutlineIcon,\n\tCalendarOutline: CalendarOutlineIcon,\n\tCalendarRemoveOutline: CalendarRemoveOutlineIcon,\n\tCalendarTextOutline: CalendarTextOutlineIcon,\n\tCalendarWeekendOutline: CalendarWeekendOutlineIcon,\n\tCarOutline: CarOutlineIcon,\n\tCartArrowDown: CartArrowDownIcon,\n\tCartOutline: CartOutlineIcon,\n\tCashSync: CashSyncIcon,\n\tCertificateOutline: CertificateOutlineIcon,\n\tChartBar: ChartBarIcon,\n\tChartBoxOutline: ChartBoxOutlineIcon,\n\tChartLineVariant: ChartLineVariantIcon,\n\tChartSankey: ChartSankeyIcon,\n\tChartTimelineVariant: ChartTimelineVariantIcon,\n\tCheckCircleOutline: CheckCircleOutlineIcon,\n\tCheckDecagramOutline: CheckDecagramOutlineIcon,\n\tCheckboxMarkedCircleOutline: CheckboxMarkedCircleOutlineIcon,\n\tClipboardAccountOutline: ClipboardAccountOutlineIcon,\n\tClipboardCheckOutline: ClipboardCheckOutlineIcon,\n\tClipboardListOutline: ClipboardListOutlineIcon,\n\tClipboardPulseOutline: ClipboardPulseOutlineIcon,\n\tClipboardTextOutline: ClipboardTextOutlineIcon,\n\tClockAlertOutline: ClockAlertOutlineIcon,\n\tClockCheckOutline: ClockCheckOutlineIcon,\n\tClockOutline: ClockOutlineIcon,\n\tCloseCircleOutline: CloseCircleOutlineIcon,\n\tCloudUploadOutline: CloudUploadOutlineIcon,\n\tCogOutline: CogOutlineIcon,\n\tCommentOutline: CommentOutlineIcon,\n\tCommentQuestionOutline: CommentQuestionOutlineIcon,\n\tContentCopy: ContentCopyIcon,\n\tContentSave: ContentSaveIcon,\n\tCreditCardOutline: CreditCardOutlineIcon,\n\tCubeOutline: CubeOutlineIcon,\n\tCurrencyEur: CurrencyEurIcon,\n\tDatabaseArrowRightOutline: DatabaseArrowRightOutlineIcon,\n\tDatabaseExportOutline: DatabaseExportOutlineIcon,\n\tDatabaseImportOutline: DatabaseImportOutlineIcon,\n\tDatabaseOutline: DatabaseOutlineIcon,\n\tDeleteOutline: DeleteOutlineIcon,\n\tDesktopTowerMonitor: DesktopTowerMonitorIcon,\n\tDomain: DomainIcon,\n\tDotsHorizontal: DotsHorizontalIcon,\n\tDownload: DownloadIcon,\n\tEmailOutline: EmailOutlineIcon,\n\tEyeOffOutline: EyeOffOutlineIcon,\n\tEyeOutline: EyeOutlineIcon,\n\tFileAlertOutline: FileAlertOutlineIcon,\n\tFileChartOutline: FileChartOutlineIcon,\n\tFileCheckOutline: FileCheckOutlineIcon,\n\tFileDocumentMultipleOutline: FileDocumentMultipleOutlineIcon,\n\tFileDocumentOutline: FileDocumentOutlineIcon,\n\tFileLockOutline: FileLockOutlineIcon,\n\tFileReplaceOutline: FileReplaceOutlineIcon,\n\tFileSign: FileSignIcon,\n\tFileTreeOutline: FileTreeOutlineIcon,\n\tFilterVariant: FilterVariantIcon,\n\tFolderAccountOutline: FolderAccountOutlineIcon,\n\tFolderCogOutline: FolderCogOutlineIcon,\n\tFolderOutline: FolderOutlineIcon,\n\tFormatListChecks: FormatListChecksIcon,\n\tForumOutline: ForumOutlineIcon,\n\tGauge: GaugeIcon,\n\tGavel: GavelIcon,\n\tHandHeartOutline: HandHeartOutlineIcon,\n\tHandshakeOutline: HandshakeOutlineIcon,\n\tHistory: HistoryIcon,\n\tImageOutline: ImageOutlineIcon,\n\tInformationOutline: InformationOutlineIcon,\n\tKeyOutline: KeyOutlineIcon,\n\tLayersOutline: LayersOutlineIcon,\n\tLinkVariant: LinkVariantIcon,\n\tLockOutline: LockOutlineIcon,\n\tMagnify: MagnifyIcon,\n\tMapMarkerOutline: MapMarkerOutlineIcon,\n\tMapMarkerPath: MapMarkerPathIcon,\n\tMapOutline: MapOutlineIcon,\n\tMedalOutline: MedalOutlineIcon,\n\tMessageTextOutline: MessageTextOutlineIcon,\n\tNotebookOutline: NotebookOutlineIcon,\n\tOfficeBuildingOutline: OfficeBuildingOutlineIcon,\n\tOpenInNew: OpenInNewIcon,\n\tPackageVariantClosed: PackageVariantClosedIcon,\n\tPaperclip: PaperclipIcon,\n\tPencilOutline: PencilOutlineIcon,\n\tPercentOutline: PercentOutlineIcon,\n\tPlayCircleOutline: PlayCircleOutlineIcon,\n\tPlayOutline: PlayOutlineIcon,\n\tPlus: PlusIcon,\n\tPrinterOutline: PrinterOutlineIcon,\n\tPulse: PulseIcon,\n\tPuzzleOutline: PuzzleOutlineIcon,\n\tReceiptOutline: ReceiptOutlineIcon,\n\tReceiptTextOutline: ReceiptTextOutlineIcon,\n\tRefresh: RefreshIcon,\n\tRobotOutline: RobotOutlineIcon,\n\tScaleBalance: ScaleBalanceIcon,\n\tSchoolOutline: SchoolOutlineIcon,\n\tShareVariantOutline: ShareVariantOutlineIcon,\n\tShieldAccountOutline: ShieldAccountOutlineIcon,\n\tShieldAlertOutline: ShieldAlertOutlineIcon,\n\tShieldCheckOutline: ShieldCheckOutlineIcon,\n\tShieldCrownOutline: ShieldCrownOutlineIcon,\n\tShieldKeyOutline: ShieldKeyOutlineIcon,\n\tShieldLockOutline: ShieldLockOutlineIcon,\n\tShieldOutline: ShieldOutlineIcon,\n\tSignatureFreehand: SignatureFreehandIcon,\n\tSitemapOutline: SitemapOutlineIcon,\n\tSourceBranch: SourceBranchIcon,\n\tSpeedometer: SpeedometerIcon,\n\tStoreOutline: StoreOutlineIcon,\n\tSwapHorizontal: SwapHorizontalIcon,\n\tTableClock: TableClockIcon,\n\tTagOutline: TagOutlineIcon,\n\tTextBoxOutline: TextBoxOutlineIcon,\n\tToolboxOutline: ToolboxOutlineIcon,\n\tTransitConnectionVariant: TransitConnectionVariantIcon,\n\tTrayFull: TrayFullIcon,\n\tTrendingUp: TrendingUpIcon,\n\tUpload: UploadIcon,\n\tVectorPolylinePlus: VectorPolylinePlusIcon,\n\tViewColumnOutline: ViewColumnOutlineIcon,\n\tViewDashboardOutline: ViewDashboardOutlineIcon,\n\tViewGridOutline: ViewGridOutlineIcon,\n\tWarehouse: WarehouseIcon,\n\tWebhook: WebhookIcon,\n})\n\n/**\n * Reverse lookup — the concept a canonical icon name stands for.\n *\n * @param {string} name Canonical MDI icon name.\n * @return {string|null} The concept slug, or null when the name is not in the\n * vocabulary.\n */\nexport function conceptForIcon(name) {\n\tfor (const [concept, icon] of Object.entries(SEMANTIC_ICONS)) {\n\t\tif (icon === name) {\n\t\t\treturn concept\n\t\t}\n\t}\n\treturn null\n}\n\n/**\n * Resolve a vocabulary icon name to its component.\n *\n * @param {string|null|undefined} name Canonical MDI icon name.\n * @return {object|null} The Vue component, or null when not in the vocabulary.\n */\nexport function getSemanticIconComponent(name) {\n\tif (typeof name !== 'string' || name.length === 0) {\n\t\treturn null\n\t}\n\treturn SEMANTIC_ICON_COMPONENTS[name] ?? null\n}\n"],"names":["AccountGroupOutlineIcon","AccountOutlineIcon","AlertCircleOutlineIcon","BellOutlineIcon","BriefcaseOutlineIcon","CalendarClockOutlineIcon","CalendarOutlineIcon","ChartBarIcon","CheckCircleOutlineIcon","ClipboardCheckOutlineIcon","ClipboardListOutlineIcon","ClockOutlineIcon","CloseCircleOutlineIcon","CogOutlineIcon","CommentOutlineIcon","ContentCopyIcon","ContentSaveIcon","CurrencyEurIcon","DatabaseOutlineIcon","DomainIcon","DotsHorizontalIcon","DownloadIcon","EmailOutlineIcon","EyeOutlineIcon","FileDocumentOutlineIcon","FolderAccountOutlineIcon","FolderOutlineIcon","FormatListChecksIcon","HistoryIcon","InformationOutlineIcon","LinkVariantIcon","LockOutlineIcon","MagnifyIcon","MapMarkerOutlineIcon","MapOutlineIcon","OpenInNewIcon","PackageVariantClosedIcon","PaperclipIcon","PlayCircleOutlineIcon","PlusIcon","PulseIcon","RefreshIcon","ShareVariantOutlineIcon","ShieldAccountOutlineIcon","ShieldKeyOutlineIcon","ShieldOutlineIcon","SitemapOutlineIcon","TagOutlineIcon","UploadIcon","ViewColumnOutlineIcon","ViewDashboardOutlineIcon","ViewGridOutlineIcon"],"mappings":"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"}
1
+ {"version":3,"file":"semanticIcons.js","sources":["../../../../src/components/CnIcon/semanticIcons.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n *\n * semanticIcons — the fleet-wide semantic icon vocabulary (ADR-077).\n *\n * One concept, one icon. A manifest `icon` field holds an MDI PascalCase name;\n * this table is what makes the same concept read the same way in every\n * Conduction app (Store is always StoreOutline, Dashboard is always\n * ViewDashboardOutline). The mapping is a BIJECTION — no concept has two\n * icons and no icon serves two concepts — which is what stops the historical\n * overloading (one glyph standing for 18 unrelated things).\n *\n * Tier A is universal chrome every app has and MUST match. Tier B is the\n * shared domain vocabulary an app SHOULD use when it has the concept.\n *\n * WHY THIS IS A PURE EXPORT AND NOT AN import-time `registerIcons()` CALL:\n * the published dist's `sideEffects` allowlist has previously tree-shaken\n * import-time side effects out of consumer bundles, which fails SILENTLY\n * (nothing renders, no error). So the rendering components import\n * {@link SEMANTIC_ICON_COMPONENTS} and consult it directly — resolution is\n * guaranteed by the component that needs it, with no side-effect ordering to\n * get wrong and nothing for a bundler to drop.\n *\n * Every name below is verified to exist in `vue-material-design-icons` by\n * tests/components/semanticIcons.spec.js — the check that caught invented\n * names like `LedgerOutline` and `FileSignOutline` already live in manifests.\n *\n * Each icon is imported individually (no wildcard / barrel) so the bundle\n * stays tree-shake-friendly.\n *\n * @spec openspec/architecture/adr-077-semantic-icon-vocabulary.md\n */\n\nimport AccountArrowRightOutlineIcon from 'vue-material-design-icons/AccountArrowRightOutline.vue'\nimport AccountBoxOutlineIcon from 'vue-material-design-icons/AccountBoxOutline.vue'\nimport AccountGroupOutlineIcon from 'vue-material-design-icons/AccountGroupOutline.vue'\nimport AccountKeyOutlineIcon from 'vue-material-design-icons/AccountKeyOutline.vue'\nimport AccountMinusOutlineIcon from 'vue-material-design-icons/AccountMinusOutline.vue'\nimport AccountMultipleOutlineIcon from 'vue-material-design-icons/AccountMultipleOutline.vue'\nimport AccountOutlineIcon from 'vue-material-design-icons/AccountOutline.vue'\nimport AccountPlusOutlineIcon from 'vue-material-design-icons/AccountPlusOutline.vue'\nimport AccountSchoolOutlineIcon from 'vue-material-design-icons/AccountSchoolOutline.vue'\nimport AccountSearchOutlineIcon from 'vue-material-design-icons/AccountSearchOutline.vue'\nimport AccountStarOutlineIcon from 'vue-material-design-icons/AccountStarOutline.vue'\nimport AccountSwitchOutlineIcon from 'vue-material-design-icons/AccountSwitchOutline.vue'\nimport AccountTieOutlineIcon from 'vue-material-design-icons/AccountTieOutline.vue'\nimport AlertCircleOutlineIcon from 'vue-material-design-icons/AlertCircleOutline.vue'\nimport ApiIcon from 'vue-material-design-icons/Api.vue'\nimport ApplicationOutlineIcon from 'vue-material-design-icons/ApplicationOutline.vue'\nimport BankOutlineIcon from 'vue-material-design-icons/BankOutline.vue'\nimport BankTransferIcon from 'vue-material-design-icons/BankTransfer.vue'\nimport BellOutlineIcon from 'vue-material-design-icons/BellOutline.vue'\nimport BookOpenPageVariantOutlineIcon from 'vue-material-design-icons/BookOpenPageVariantOutline.vue'\nimport BookOpenVariantOutlineIcon from 'vue-material-design-icons/BookOpenVariantOutline.vue'\nimport BookshelfIcon from 'vue-material-design-icons/Bookshelf.vue'\nimport BrainIcon from 'vue-material-design-icons/Brain.vue'\nimport BriefcaseOutlineIcon from 'vue-material-design-icons/BriefcaseOutline.vue'\nimport CalculatorVariantOutlineIcon from 'vue-material-design-icons/CalculatorVariantOutline.vue'\nimport CalendarAccountOutlineIcon from 'vue-material-design-icons/CalendarAccountOutline.vue'\nimport CalendarClockOutlineIcon from 'vue-material-design-icons/CalendarClockOutline.vue'\nimport CalendarOutlineIcon from 'vue-material-design-icons/CalendarOutline.vue'\nimport CalendarRemoveOutlineIcon from 'vue-material-design-icons/CalendarRemoveOutline.vue'\nimport CalendarTextOutlineIcon from 'vue-material-design-icons/CalendarTextOutline.vue'\nimport CalendarWeekendOutlineIcon from 'vue-material-design-icons/CalendarWeekendOutline.vue'\nimport CarOutlineIcon from 'vue-material-design-icons/CarOutline.vue'\nimport CartArrowDownIcon from 'vue-material-design-icons/CartArrowDown.vue'\nimport CartOutlineIcon from 'vue-material-design-icons/CartOutline.vue'\nimport CashSyncIcon from 'vue-material-design-icons/CashSync.vue'\nimport CertificateOutlineIcon from 'vue-material-design-icons/CertificateOutline.vue'\nimport ChartBarIcon from 'vue-material-design-icons/ChartBar.vue'\nimport ChartBoxOutlineIcon from 'vue-material-design-icons/ChartBoxOutline.vue'\nimport ChartLineVariantIcon from 'vue-material-design-icons/ChartLineVariant.vue'\nimport ChartSankeyIcon from 'vue-material-design-icons/ChartSankey.vue'\nimport ChartTimelineVariantIcon from 'vue-material-design-icons/ChartTimelineVariant.vue'\nimport CheckboxMarkedCircleOutlineIcon from 'vue-material-design-icons/CheckboxMarkedCircleOutline.vue'\nimport CheckCircleOutlineIcon from 'vue-material-design-icons/CheckCircleOutline.vue'\nimport CheckDecagramOutlineIcon from 'vue-material-design-icons/CheckDecagramOutline.vue'\nimport ClipboardAccountOutlineIcon from 'vue-material-design-icons/ClipboardAccountOutline.vue'\nimport ClipboardCheckOutlineIcon from 'vue-material-design-icons/ClipboardCheckOutline.vue'\nimport ClipboardListOutlineIcon from 'vue-material-design-icons/ClipboardListOutline.vue'\nimport ClipboardPulseOutlineIcon from 'vue-material-design-icons/ClipboardPulseOutline.vue'\nimport ClipboardTextOutlineIcon from 'vue-material-design-icons/ClipboardTextOutline.vue'\nimport ClockAlertOutlineIcon from 'vue-material-design-icons/ClockAlertOutline.vue'\nimport ClockCheckOutlineIcon from 'vue-material-design-icons/ClockCheckOutline.vue'\nimport ClockOutlineIcon from 'vue-material-design-icons/ClockOutline.vue'\nimport CloseCircleOutlineIcon from 'vue-material-design-icons/CloseCircleOutline.vue'\nimport CloudUploadOutlineIcon from 'vue-material-design-icons/CloudUploadOutline.vue'\nimport CogOutlineIcon from 'vue-material-design-icons/CogOutline.vue'\nimport CommentOutlineIcon from 'vue-material-design-icons/CommentOutline.vue'\nimport CommentQuestionOutlineIcon from 'vue-material-design-icons/CommentQuestionOutline.vue'\nimport ContentCopyIcon from 'vue-material-design-icons/ContentCopy.vue'\nimport ContentSaveIcon from 'vue-material-design-icons/ContentSave.vue'\nimport CreditCardOutlineIcon from 'vue-material-design-icons/CreditCardOutline.vue'\nimport CubeOutlineIcon from 'vue-material-design-icons/CubeOutline.vue'\nimport CurrencyEurIcon from 'vue-material-design-icons/CurrencyEur.vue'\nimport DatabaseArrowRightOutlineIcon from 'vue-material-design-icons/DatabaseArrowRightOutline.vue'\nimport DatabaseExportOutlineIcon from 'vue-material-design-icons/DatabaseExportOutline.vue'\nimport DatabaseImportOutlineIcon from 'vue-material-design-icons/DatabaseImportOutline.vue'\nimport DatabaseOutlineIcon from 'vue-material-design-icons/DatabaseOutline.vue'\nimport DeleteOutlineIcon from 'vue-material-design-icons/DeleteOutline.vue'\nimport DesktopTowerMonitorIcon from 'vue-material-design-icons/DesktopTowerMonitor.vue'\nimport DomainIcon from 'vue-material-design-icons/Domain.vue'\nimport DotsHorizontalIcon from 'vue-material-design-icons/DotsHorizontal.vue'\nimport DownloadIcon from 'vue-material-design-icons/Download.vue'\nimport EmailOutlineIcon from 'vue-material-design-icons/EmailOutline.vue'\nimport EyeOffOutlineIcon from 'vue-material-design-icons/EyeOffOutline.vue'\nimport EyeOutlineIcon from 'vue-material-design-icons/EyeOutline.vue'\nimport FileAlertOutlineIcon from 'vue-material-design-icons/FileAlertOutline.vue'\nimport FileChartOutlineIcon from 'vue-material-design-icons/FileChartOutline.vue'\nimport FileCheckOutlineIcon from 'vue-material-design-icons/FileCheckOutline.vue'\nimport FileDocumentMultipleOutlineIcon from 'vue-material-design-icons/FileDocumentMultipleOutline.vue'\nimport FileDocumentOutlineIcon from 'vue-material-design-icons/FileDocumentOutline.vue'\nimport FileLockOutlineIcon from 'vue-material-design-icons/FileLockOutline.vue'\nimport FileReplaceOutlineIcon from 'vue-material-design-icons/FileReplaceOutline.vue'\nimport FileSignIcon from 'vue-material-design-icons/FileSign.vue'\nimport FileTreeOutlineIcon from 'vue-material-design-icons/FileTreeOutline.vue'\nimport FilterVariantIcon from 'vue-material-design-icons/FilterVariant.vue'\nimport FolderAccountOutlineIcon from 'vue-material-design-icons/FolderAccountOutline.vue'\nimport FolderCogOutlineIcon from 'vue-material-design-icons/FolderCogOutline.vue'\nimport FolderOutlineIcon from 'vue-material-design-icons/FolderOutline.vue'\nimport FormatListChecksIcon from 'vue-material-design-icons/FormatListChecks.vue'\nimport ForumOutlineIcon from 'vue-material-design-icons/ForumOutline.vue'\nimport GaugeIcon from 'vue-material-design-icons/Gauge.vue'\nimport GavelIcon from 'vue-material-design-icons/Gavel.vue'\nimport HandHeartOutlineIcon from 'vue-material-design-icons/HandHeartOutline.vue'\nimport HandshakeOutlineIcon from 'vue-material-design-icons/HandshakeOutline.vue'\nimport HistoryIcon from 'vue-material-design-icons/History.vue'\nimport ImageOutlineIcon from 'vue-material-design-icons/ImageOutline.vue'\nimport InformationOutlineIcon from 'vue-material-design-icons/InformationOutline.vue'\nimport KeyOutlineIcon from 'vue-material-design-icons/KeyOutline.vue'\nimport LayersOutlineIcon from 'vue-material-design-icons/LayersOutline.vue'\nimport LinkVariantIcon from 'vue-material-design-icons/LinkVariant.vue'\nimport LockOutlineIcon from 'vue-material-design-icons/LockOutline.vue'\nimport MagnifyIcon from 'vue-material-design-icons/Magnify.vue'\nimport MapMarkerOutlineIcon from 'vue-material-design-icons/MapMarkerOutline.vue'\nimport MapMarkerPathIcon from 'vue-material-design-icons/MapMarkerPath.vue'\nimport MapOutlineIcon from 'vue-material-design-icons/MapOutline.vue'\nimport MedalOutlineIcon from 'vue-material-design-icons/MedalOutline.vue'\nimport MessageTextOutlineIcon from 'vue-material-design-icons/MessageTextOutline.vue'\nimport NotebookOutlineIcon from 'vue-material-design-icons/NotebookOutline.vue'\nimport OfficeBuildingOutlineIcon from 'vue-material-design-icons/OfficeBuildingOutline.vue'\nimport OpenInNewIcon from 'vue-material-design-icons/OpenInNew.vue'\nimport PackageVariantClosedIcon from 'vue-material-design-icons/PackageVariantClosed.vue'\nimport PaperclipIcon from 'vue-material-design-icons/Paperclip.vue'\nimport PencilOutlineIcon from 'vue-material-design-icons/PencilOutline.vue'\nimport PercentOutlineIcon from 'vue-material-design-icons/PercentOutline.vue'\nimport PlayCircleOutlineIcon from 'vue-material-design-icons/PlayCircleOutline.vue'\nimport PlayOutlineIcon from 'vue-material-design-icons/PlayOutline.vue'\nimport PlusIcon from 'vue-material-design-icons/Plus.vue'\nimport PrinterOutlineIcon from 'vue-material-design-icons/PrinterOutline.vue'\nimport PulseIcon from 'vue-material-design-icons/Pulse.vue'\nimport PuzzleOutlineIcon from 'vue-material-design-icons/PuzzleOutline.vue'\nimport ReceiptOutlineIcon from 'vue-material-design-icons/ReceiptOutline.vue'\nimport ReceiptTextOutlineIcon from 'vue-material-design-icons/ReceiptTextOutline.vue'\nimport RefreshIcon from 'vue-material-design-icons/Refresh.vue'\nimport RobotOutlineIcon from 'vue-material-design-icons/RobotOutline.vue'\nimport ScaleBalanceIcon from 'vue-material-design-icons/ScaleBalance.vue'\nimport SchoolOutlineIcon from 'vue-material-design-icons/SchoolOutline.vue'\nimport ShareVariantOutlineIcon from 'vue-material-design-icons/ShareVariantOutline.vue'\nimport ShieldAccountOutlineIcon from 'vue-material-design-icons/ShieldAccountOutline.vue'\nimport ShieldAlertOutlineIcon from 'vue-material-design-icons/ShieldAlertOutline.vue'\nimport ShieldCheckOutlineIcon from 'vue-material-design-icons/ShieldCheckOutline.vue'\nimport ShieldCrownOutlineIcon from 'vue-material-design-icons/ShieldCrownOutline.vue'\nimport ShieldKeyOutlineIcon from 'vue-material-design-icons/ShieldKeyOutline.vue'\nimport ShieldLockOutlineIcon from 'vue-material-design-icons/ShieldLockOutline.vue'\nimport ShieldOutlineIcon from 'vue-material-design-icons/ShieldOutline.vue'\nimport SignatureFreehandIcon from 'vue-material-design-icons/SignatureFreehand.vue'\nimport SitemapOutlineIcon from 'vue-material-design-icons/SitemapOutline.vue'\nimport SourceBranchIcon from 'vue-material-design-icons/SourceBranch.vue'\nimport SpeedometerIcon from 'vue-material-design-icons/Speedometer.vue'\nimport StoreOutlineIcon from 'vue-material-design-icons/StoreOutline.vue'\nimport SwapHorizontalIcon from 'vue-material-design-icons/SwapHorizontal.vue'\nimport TableClockIcon from 'vue-material-design-icons/TableClock.vue'\nimport TagOutlineIcon from 'vue-material-design-icons/TagOutline.vue'\nimport TextBoxOutlineIcon from 'vue-material-design-icons/TextBoxOutline.vue'\nimport ToolboxOutlineIcon from 'vue-material-design-icons/ToolboxOutline.vue'\nimport TransitConnectionVariantIcon from 'vue-material-design-icons/TransitConnectionVariant.vue'\nimport TrayFullIcon from 'vue-material-design-icons/TrayFull.vue'\nimport TrendingUpIcon from 'vue-material-design-icons/TrendingUp.vue'\nimport UploadIcon from 'vue-material-design-icons/Upload.vue'\nimport VectorPolylinePlusIcon from 'vue-material-design-icons/VectorPolylinePlus.vue'\nimport ViewColumnOutlineIcon from 'vue-material-design-icons/ViewColumnOutline.vue'\nimport ViewDashboardOutlineIcon from 'vue-material-design-icons/ViewDashboardOutline.vue'\nimport ViewGridOutlineIcon from 'vue-material-design-icons/ViewGridOutline.vue'\nimport WarehouseIcon from 'vue-material-design-icons/Warehouse.vue'\nimport WebhookIcon from 'vue-material-design-icons/Webhook.vue'\n\n/**\n * Tier A — universal chrome. An app that has the concept MUST use this icon.\n *\n * @type {Readonly<Record<string, string>>}\n */\nexport const SEMANTIC_ICONS_TIER_A = Object.freeze({\n\tdashboard: 'ViewDashboardOutline',\n\tdocumentation: 'BookOpenVariantOutline',\n\t'features-roadmap': 'MapMarkerPath',\n\tsettings: 'CogOutline',\n\tadmin: 'ShieldAccountOutline',\n\tsearch: 'Magnify',\n\tstore: 'StoreOutline',\n\ttutorial: 'PlayCircleOutline',\n\tabout: 'InformationOutline',\n\tnotifications: 'BellOutline',\n\tactivity: 'Pulse',\n\t'audit-trail': 'History',\n\t'my-work': 'ClipboardAccountOutline',\n})\n\n/**\n * Tier B — shared domain vocabulary. An app SHOULD use this icon when it has\n * the concept; a genuinely new concept is added here, never invented locally.\n *\n * @type {Readonly<Record<string, string>>}\n */\nexport const SEMANTIC_ICONS_TIER_B = Object.freeze({\n\t// data & records\n\tdata: 'DatabaseOutline',\n\tschema: 'FileTreeOutline',\n\trecord: 'CubeOutline',\n\t'data-quality': 'ClipboardPulseOutline',\n\timport: 'DatabaseImportOutline',\n\texport: 'DatabaseExportOutline',\n\tmigration: 'DatabaseArrowRightOutline',\n\tmapping: 'SwapHorizontal',\n\tlog: 'TextBoxOutline',\n\tjob: 'ClockOutline',\n\t// documents & files\n\tdocument: 'FileDocumentOutline',\n\tdocuments: 'FileDocumentMultipleOutline',\n\tfolder: 'FolderOutline',\n\ttemplate: 'FileReplaceOutline',\n\tcatalogue: 'Bookshelf',\n\tsigning: 'SignatureFreehand',\n\tcontract: 'FileSign',\n\tcorrespondence: 'EmailOutline',\n\tattachment: 'Paperclip',\n\t// cases & process\n\tcase: 'FolderAccountOutline',\n\t'case-type': 'FolderCogOutline',\n\ttask: 'CheckboxMarkedCircleOutline',\n\ttasks: 'FormatListChecks',\n\tworkflow: 'SitemapOutline',\n\tboard: 'ViewColumnOutline',\n\tapproval: 'CheckDecagramOutline',\n\tdecision: 'Gavel',\n\tqueue: 'TrayFull',\n\tdeadline: 'ClockAlertOutline',\n\tobjection: 'FileAlertOutline',\n\tappeal: 'ScaleBalance',\n\t// communication\n\tchat: 'MessageTextOutline',\n\tcomment: 'CommentOutline',\n\tmeeting: 'CalendarAccountOutline',\n\tagenda: 'CalendarTextOutline',\n\tappointment: 'CalendarClockOutline',\n\tcalendar: 'CalendarOutline',\n\tconsultation: 'CommentQuestionOutline',\n\tforum: 'ForumOutline',\n\t// people & organisations\n\tperson: 'AccountOutline',\n\tpeople: 'AccountMultipleOutline',\n\tgroup: 'AccountGroupOutline',\n\trole: 'AccountKeyOutline',\n\torganisation: 'OfficeBuildingOutline',\n\t'organisation-unit': 'Domain',\n\tpartner: 'HandshakeOutline',\n\tclient: 'AccountStarOutline',\n\temployee: 'AccountTieOutline',\n\tlead: 'AccountArrowRightOutline',\n\tprospect: 'AccountSearchOutline',\n\tsubstitution: 'AccountSwitchOutline',\n\t// commerce & finance\n\tsales: 'CartOutline',\n\tpurchasing: 'CartArrowDown',\n\tproduct: 'PackageVariantClosed',\n\tinventory: 'Warehouse',\n\torder: 'ClipboardListOutline',\n\tinvoice: 'ReceiptTextOutline',\n\tpayment: 'CreditCardOutline',\n\tpayroll: 'CashSync',\n\texpense: 'ReceiptOutline',\n\tbank: 'BankOutline',\n\t'bank-transaction': 'BankTransfer',\n\tbookkeeping: 'NotebookOutline',\n\ttax: 'PercentOutline',\n\tbudget: 'CalculatorVariantOutline',\n\tforecast: 'ChartTimelineVariant',\n\trevenue: 'CurrencyEur',\n\tpricing: 'TagOutline',\n\tsubsidy: 'HandHeartOutline',\n\t// reporting & monitoring\n\treport: 'FileChartOutline',\n\treporting: 'ChartBoxOutline',\n\tanalytics: 'ChartLineVariant',\n\tkpi: 'Speedometer',\n\tmonitoring: 'Gauge',\n\tstatistics: 'ChartBar',\n\t'process-mining': 'ChartSankey',\n\t// security & compliance\n\tsecurity: 'ShieldOutline',\n\tcompliance: 'ClipboardCheckOutline',\n\tpolicy: 'ShieldCheckOutline',\n\tvulnerability: 'ShieldAlertOutline',\n\tcertificate: 'CertificateOutline',\n\tvault: 'LockOutline',\n\tkey: 'KeyOutline',\n\tauthorization: 'ShieldKeyOutline',\n\tprivacy: 'ShieldLockOutline',\n\tanonymization: 'EyeOffOutline',\n\tconsent: 'FileCheckOutline',\n\tconfidentiality: 'FileLockOutline',\n\tretention: 'CalendarRemoveOutline',\n\tgovernance: 'ShieldCrownOutline',\n\t// integration & technology\n\tintegration: 'Api',\n\tconnection: 'TransitConnectionVariant',\n\twebhook: 'Webhook',\n\tautomation: 'VectorPolylinePlus',\n\tagent: 'RobotOutline',\n\tai: 'Brain',\n\ttool: 'ToolboxOutline',\n\tapps: 'ViewGridOutline',\n\tmodule: 'PuzzleOutline',\n\tsource: 'SourceBranch',\n\t// location & geo\n\tlocation: 'MapMarkerOutline',\n\tmap: 'MapOutline',\n\t'map-layer': 'LayersOutline',\n\t// learning\n\tcourse: 'BookOpenPageVariantOutline',\n\tlearning: 'SchoolOutline',\n\tcompetency: 'MedalOutline',\n\ttimetable: 'TableClock',\n\tprogress: 'TrendingUp',\n\tportfolio: 'BriefcaseOutline',\n\texam: 'ClipboardTextOutline',\n\tstudent: 'AccountSchoolOutline',\n\t// Publish, Test connection).\n\tview: 'EyeOutline',\n\tcreate: 'Plus',\n\tedit: 'PencilOutline',\n\tdelete: 'DeleteOutline',\n\trun: 'PlayOutline',\n\ttest: 'CheckCircleOutline',\n\tupload: 'Upload',\n\tpublish: 'CloudUploadOutline',\n\tdownload: 'Download',\n\trefresh: 'Refresh',\n\t'open-external': 'OpenInNew',\n\tcopy: 'ContentCopy',\n\tshare: 'ShareVariantOutline',\n\tfilter: 'FilterVariant',\n\tprint: 'PrinterOutline',\n\timage: 'ImageOutline',\n\tlink: 'LinkVariant',\n\tmore: 'DotsHorizontal',\n\tsave: 'ContentSave',\n\tcancel: 'CloseCircleOutline',\n\talert: 'AlertCircleOutline',\n\t// hr\n\tleave: 'CalendarWeekendOutline',\n\thours: 'ClockCheckOutline',\n\tonboarding: 'AccountPlusOutline',\n\toffboarding: 'AccountMinusOutline',\n\tvacancy: 'AccountBoxOutline',\n\tasset: 'DesktopTowerMonitor',\n\tfleet: 'CarOutline',\n})\n\n/**\n * The whole vocabulary — concept slug to canonical MDI name.\n *\n * @type {Readonly<Record<string, string>>}\n */\nexport const SEMANTIC_ICONS = Object.freeze({\n\t...SEMANTIC_ICONS_TIER_A,\n\t...SEMANTIC_ICONS_TIER_B,\n})\n\n/**\n * Which tier a concept belongs to — `'A'` (MUST) or `'B'` (SHOULD). Consumed by\n * hydra's icon-vocabulary gate to decide hard-fail vs warn.\n *\n * @type {Readonly<Record<string, 'A'|'B'>>}\n */\nexport const SEMANTIC_ICON_TIERS = Object.freeze(Object.fromEntries([\n\t...Object.keys(SEMANTIC_ICONS_TIER_A).map((c) => [c, 'A']),\n\t...Object.keys(SEMANTIC_ICONS_TIER_B).map((c) => [c, 'B']),\n]))\n\n/**\n * Canonical MDI name to its Vue component, for every icon in the vocabulary.\n * The rendering components consult this so an app never has to register a\n * vocabulary icon itself.\n *\n * @type {Readonly<Record<string, object>>}\n */\nexport const SEMANTIC_ICON_COMPONENTS = Object.freeze({\n\tAccountArrowRightOutline: AccountArrowRightOutlineIcon,\n\tAccountBoxOutline: AccountBoxOutlineIcon,\n\tAccountGroupOutline: AccountGroupOutlineIcon,\n\tAccountKeyOutline: AccountKeyOutlineIcon,\n\tAccountMinusOutline: AccountMinusOutlineIcon,\n\tAccountMultipleOutline: AccountMultipleOutlineIcon,\n\tAccountOutline: AccountOutlineIcon,\n\tAccountPlusOutline: AccountPlusOutlineIcon,\n\tAccountSchoolOutline: AccountSchoolOutlineIcon,\n\tAccountSearchOutline: AccountSearchOutlineIcon,\n\tAccountStarOutline: AccountStarOutlineIcon,\n\tAccountSwitchOutline: AccountSwitchOutlineIcon,\n\tAccountTieOutline: AccountTieOutlineIcon,\n\tAlertCircleOutline: AlertCircleOutlineIcon,\n\tApi: ApiIcon,\n\tApplicationOutline: ApplicationOutlineIcon,\n\tBankOutline: BankOutlineIcon,\n\tBankTransfer: BankTransferIcon,\n\tBellOutline: BellOutlineIcon,\n\tBookOpenPageVariantOutline: BookOpenPageVariantOutlineIcon,\n\tBookOpenVariantOutline: BookOpenVariantOutlineIcon,\n\tBookshelf: BookshelfIcon,\n\tBrain: BrainIcon,\n\tBriefcaseOutline: BriefcaseOutlineIcon,\n\tCalculatorVariantOutline: CalculatorVariantOutlineIcon,\n\tCalendarAccountOutline: CalendarAccountOutlineIcon,\n\tCalendarClockOutline: CalendarClockOutlineIcon,\n\tCalendarOutline: CalendarOutlineIcon,\n\tCalendarRemoveOutline: CalendarRemoveOutlineIcon,\n\tCalendarTextOutline: CalendarTextOutlineIcon,\n\tCalendarWeekendOutline: CalendarWeekendOutlineIcon,\n\tCarOutline: CarOutlineIcon,\n\tCartArrowDown: CartArrowDownIcon,\n\tCartOutline: CartOutlineIcon,\n\tCashSync: CashSyncIcon,\n\tCertificateOutline: CertificateOutlineIcon,\n\tChartBar: ChartBarIcon,\n\tChartBoxOutline: ChartBoxOutlineIcon,\n\tChartLineVariant: ChartLineVariantIcon,\n\tChartSankey: ChartSankeyIcon,\n\tChartTimelineVariant: ChartTimelineVariantIcon,\n\tCheckCircleOutline: CheckCircleOutlineIcon,\n\tCheckDecagramOutline: CheckDecagramOutlineIcon,\n\tCheckboxMarkedCircleOutline: CheckboxMarkedCircleOutlineIcon,\n\tClipboardAccountOutline: ClipboardAccountOutlineIcon,\n\tClipboardCheckOutline: ClipboardCheckOutlineIcon,\n\tClipboardListOutline: ClipboardListOutlineIcon,\n\tClipboardPulseOutline: ClipboardPulseOutlineIcon,\n\tClipboardTextOutline: ClipboardTextOutlineIcon,\n\tClockAlertOutline: ClockAlertOutlineIcon,\n\tClockCheckOutline: ClockCheckOutlineIcon,\n\tClockOutline: ClockOutlineIcon,\n\tCloseCircleOutline: CloseCircleOutlineIcon,\n\tCloudUploadOutline: CloudUploadOutlineIcon,\n\tCogOutline: CogOutlineIcon,\n\tCommentOutline: CommentOutlineIcon,\n\tCommentQuestionOutline: CommentQuestionOutlineIcon,\n\tContentCopy: ContentCopyIcon,\n\tContentSave: ContentSaveIcon,\n\tCreditCardOutline: CreditCardOutlineIcon,\n\tCubeOutline: CubeOutlineIcon,\n\tCurrencyEur: CurrencyEurIcon,\n\tDatabaseArrowRightOutline: DatabaseArrowRightOutlineIcon,\n\tDatabaseExportOutline: DatabaseExportOutlineIcon,\n\tDatabaseImportOutline: DatabaseImportOutlineIcon,\n\tDatabaseOutline: DatabaseOutlineIcon,\n\tDeleteOutline: DeleteOutlineIcon,\n\tDesktopTowerMonitor: DesktopTowerMonitorIcon,\n\tDomain: DomainIcon,\n\tDotsHorizontal: DotsHorizontalIcon,\n\tDownload: DownloadIcon,\n\tEmailOutline: EmailOutlineIcon,\n\tEyeOffOutline: EyeOffOutlineIcon,\n\tEyeOutline: EyeOutlineIcon,\n\tFileAlertOutline: FileAlertOutlineIcon,\n\tFileChartOutline: FileChartOutlineIcon,\n\tFileCheckOutline: FileCheckOutlineIcon,\n\tFileDocumentMultipleOutline: FileDocumentMultipleOutlineIcon,\n\tFileDocumentOutline: FileDocumentOutlineIcon,\n\tFileLockOutline: FileLockOutlineIcon,\n\tFileReplaceOutline: FileReplaceOutlineIcon,\n\tFileSign: FileSignIcon,\n\tFileTreeOutline: FileTreeOutlineIcon,\n\tFilterVariant: FilterVariantIcon,\n\tFolderAccountOutline: FolderAccountOutlineIcon,\n\tFolderCogOutline: FolderCogOutlineIcon,\n\tFolderOutline: FolderOutlineIcon,\n\tFormatListChecks: FormatListChecksIcon,\n\tForumOutline: ForumOutlineIcon,\n\tGauge: GaugeIcon,\n\tGavel: GavelIcon,\n\tHandHeartOutline: HandHeartOutlineIcon,\n\tHandshakeOutline: HandshakeOutlineIcon,\n\tHistory: HistoryIcon,\n\tImageOutline: ImageOutlineIcon,\n\tInformationOutline: InformationOutlineIcon,\n\tKeyOutline: KeyOutlineIcon,\n\tLayersOutline: LayersOutlineIcon,\n\tLinkVariant: LinkVariantIcon,\n\tLockOutline: LockOutlineIcon,\n\tMagnify: MagnifyIcon,\n\tMapMarkerOutline: MapMarkerOutlineIcon,\n\tMapMarkerPath: MapMarkerPathIcon,\n\tMapOutline: MapOutlineIcon,\n\tMedalOutline: MedalOutlineIcon,\n\tMessageTextOutline: MessageTextOutlineIcon,\n\tNotebookOutline: NotebookOutlineIcon,\n\tOfficeBuildingOutline: OfficeBuildingOutlineIcon,\n\tOpenInNew: OpenInNewIcon,\n\tPackageVariantClosed: PackageVariantClosedIcon,\n\tPaperclip: PaperclipIcon,\n\tPencilOutline: PencilOutlineIcon,\n\tPercentOutline: PercentOutlineIcon,\n\tPlayCircleOutline: PlayCircleOutlineIcon,\n\tPlayOutline: PlayOutlineIcon,\n\tPlus: PlusIcon,\n\tPrinterOutline: PrinterOutlineIcon,\n\tPulse: PulseIcon,\n\tPuzzleOutline: PuzzleOutlineIcon,\n\tReceiptOutline: ReceiptOutlineIcon,\n\tReceiptTextOutline: ReceiptTextOutlineIcon,\n\tRefresh: RefreshIcon,\n\tRobotOutline: RobotOutlineIcon,\n\tScaleBalance: ScaleBalanceIcon,\n\tSchoolOutline: SchoolOutlineIcon,\n\tShareVariantOutline: ShareVariantOutlineIcon,\n\tShieldAccountOutline: ShieldAccountOutlineIcon,\n\tShieldAlertOutline: ShieldAlertOutlineIcon,\n\tShieldCheckOutline: ShieldCheckOutlineIcon,\n\tShieldCrownOutline: ShieldCrownOutlineIcon,\n\tShieldKeyOutline: ShieldKeyOutlineIcon,\n\tShieldLockOutline: ShieldLockOutlineIcon,\n\tShieldOutline: ShieldOutlineIcon,\n\tSignatureFreehand: SignatureFreehandIcon,\n\tSitemapOutline: SitemapOutlineIcon,\n\tSourceBranch: SourceBranchIcon,\n\tSpeedometer: SpeedometerIcon,\n\tStoreOutline: StoreOutlineIcon,\n\tSwapHorizontal: SwapHorizontalIcon,\n\tTableClock: TableClockIcon,\n\tTagOutline: TagOutlineIcon,\n\tTextBoxOutline: TextBoxOutlineIcon,\n\tToolboxOutline: ToolboxOutlineIcon,\n\tTransitConnectionVariant: TransitConnectionVariantIcon,\n\tTrayFull: TrayFullIcon,\n\tTrendingUp: TrendingUpIcon,\n\tUpload: UploadIcon,\n\tVectorPolylinePlus: VectorPolylinePlusIcon,\n\tViewColumnOutline: ViewColumnOutlineIcon,\n\tViewDashboardOutline: ViewDashboardOutlineIcon,\n\tViewGridOutline: ViewGridOutlineIcon,\n\tWarehouse: WarehouseIcon,\n\tWebhook: WebhookIcon,\n})\n\n/**\n * Reverse lookup — the concept a canonical icon name stands for.\n *\n * @param {string} name Canonical MDI icon name.\n * @return {string|null} The concept slug, or null when the name is not in the\n * vocabulary.\n */\nexport function conceptForIcon(name) {\n\tfor (const [concept, icon] of Object.entries(SEMANTIC_ICONS)) {\n\t\tif (icon === name) {\n\t\t\treturn concept\n\t\t}\n\t}\n\treturn null\n}\n\n/**\n * Resolve a vocabulary icon name to its component.\n *\n * @param {string|null|undefined} name Canonical MDI icon name.\n * @return {object|null} The Vue component, or null when not in the vocabulary.\n */\nexport function getSemanticIconComponent(name) {\n\tif (typeof name !== 'string' || name.length === 0) {\n\t\treturn null\n\t}\n\treturn SEMANTIC_ICON_COMPONENTS[name] ?? null\n}\n"],"names":["AccountGroupOutlineIcon","AccountOutlineIcon","AlertCircleOutlineIcon","BellOutlineIcon","BriefcaseOutlineIcon","CalendarClockOutlineIcon","CalendarOutlineIcon","ChartBarIcon","CheckCircleOutlineIcon","ClipboardCheckOutlineIcon","ClipboardListOutlineIcon","ClockOutlineIcon","CloseCircleOutlineIcon","CogOutlineIcon","CommentOutlineIcon","ContentCopyIcon","ContentSaveIcon","CurrencyEurIcon","DatabaseOutlineIcon","DomainIcon","DotsHorizontalIcon","DownloadIcon","EmailOutlineIcon","EyeOutlineIcon","FileDocumentOutlineIcon","FolderAccountOutlineIcon","FolderOutlineIcon","FormatListChecksIcon","HistoryIcon","InformationOutlineIcon","KeyOutlineIcon","LinkVariantIcon","LockOutlineIcon","MagnifyIcon","MapMarkerOutlineIcon","MapOutlineIcon","OpenInNewIcon","PackageVariantClosedIcon","PaperclipIcon","PlayCircleOutlineIcon","PlusIcon","PulseIcon","RefreshIcon","ShareVariantOutlineIcon","ShieldAccountOutlineIcon","ShieldKeyOutlineIcon","ShieldOutlineIcon","SitemapOutlineIcon","TagOutlineIcon","UploadIcon","ViewColumnOutlineIcon","ViewDashboardOutlineIcon","ViewGridOutlineIcon"],"mappings":"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"}
@@ -2,7 +2,7 @@ import script from './CnLinkCardsPage.vue2.js';
2
2
  import { render } from './CnLinkCardsPage.vue3.js';
3
3
 
4
4
  script.render = render;
5
- script.__scopeId = "data-v-4d8cf2f8";
5
+ script.__scopeId = "data-v-1a155b6c";
6
6
  const __sfc_main = script;
7
7
 
8
8
  export { __sfc_main as default };
@@ -1,4 +1,8 @@
1
- import { translate } from '@nextcloud/l10n';
1
+ import { translate, translatePlural } from '@nextcloud/l10n';
2
+ import ChevronRight from 'vue-material-design-icons/ChevronRight.vue';
3
+ import InformationOutline from 'vue-material-design-icons/InformationOutline.vue';
4
+ import OpenInNew from 'vue-material-design-icons/OpenInNew.vue';
5
+ import __sfc_main$1 from '../CnModuleCard/CnModuleCard.vue.js';
2
6
  import { isAppInstalled } from '../../utils/appInstalled.js';
3
7
  import { resolveHref, followLinkClick } from '../../utils/linkNavigation.js';
4
8
  import { passesContextPredicates } from '../../utils/visibleIfContext.js';
@@ -33,7 +37,7 @@ let linkCardsPageUid = 0;
33
37
  var script = {
34
38
  name: 'CnLinkCardsPage',
35
39
 
36
- components: { CnIcon: __sfc_main },
40
+ components: { ChevronRight, CnIcon: __sfc_main, CnModuleCard: __sfc_main$1, InformationOutline, OpenInNew },
37
41
 
38
42
  inject: {
39
43
  /** The app's translate function, provided by CnAppRoot. Identity outside one. */
@@ -84,6 +88,37 @@ var script = {
84
88
  default: null,
85
89
  },
86
90
 
91
+ /**
92
+ * The modules: `{ id, label, description?, icon?, enabled?, enabledIf?,
93
+ * route?, pages: [{ label, route, highlight? }], settings?: { label?, prefix?,
94
+ * route?, href?, permission?, visibleIf? }, permission?, visibleIf? }`.
95
+ * Drawn as module cards above the link cards.
96
+ *
97
+ * @type {Array<object>|null}
98
+ */
99
+ modules: {
100
+ type: Array,
101
+ default: null,
102
+ },
103
+
104
+ /** `cards` (default): a grid of link cards per group. `list`: one card per group with a row per link. */
105
+ groupStyle: {
106
+ type: String,
107
+ default: null,
108
+ },
109
+
110
+ /** Heading of the modules section. Defaults to "Modules". */
111
+ modulesTitle: {
112
+ type: String,
113
+ default: null,
114
+ },
115
+
116
+ /** A note under the module cards. */
117
+ footnote: {
118
+ type: String,
119
+ default: null,
120
+ },
121
+
87
122
  /** Text shown when no card is visible. */
88
123
  emptyLabel: {
89
124
  type: String,
@@ -118,7 +153,7 @@ var script = {
118
153
  config() {
119
154
  const fromPage = (this.page && this.page.config) || {};
120
155
  const fromProps = {};
121
- for (const key of ['cards', 'categories', 'description', 'title', 'emptyLabel']) {
156
+ for (const key of ['cards', 'categories', 'description', 'title', 'emptyLabel', 'modules', 'modulesTitle', 'footnote', 'groupStyle']) {
122
157
  if (this[key] !== null && this[key] !== undefined) {
123
158
  fromProps[key] = this[key];
124
159
  }
@@ -187,6 +222,90 @@ var script = {
187
222
  .filter((card) => card.url !== '')
188
223
  },
189
224
 
225
+ /**
226
+ * The modules a reader may see, with text translated and links
227
+ * resolved. `enabled` is the declared boolean, or the result of
228
+ * `enabledIf` (a visibleIf condition against `runtime`). A page that
229
+ * resolves to nothing is dropped; the admin-settings link only shows when
230
+ * its own `permission` and `visibleIf` pass.
231
+ *
232
+ * @return {Array<object>} The modules.
233
+ * @spec openspec/changes/screens-links-module-cards/specs/link-cards-page/spec.md#requirement-a-links-page-can-show-modules
234
+ */
235
+ visibleModules() {
236
+ const declared = Array.isArray(this.config.modules) ? this.config.modules : [];
237
+ const runtime = this.cnManifest?.runtime ?? null;
238
+ return declared
239
+ .filter((module) => module && module.id && module.label)
240
+ .filter((module) => this.passesPermission(module) && this.passesVisibleIf(module, runtime))
241
+ .map((module) => {
242
+ const pages = (Array.isArray(module.pages) ? module.pages : [])
243
+ .filter((page) => page && page.label)
244
+ .map((page, index) => ({ key: String(index), label: this.tr(page.label), highlight: page.highlight === true, ...this.targetOf(page) }))
245
+ .filter((page) => page.url !== '');
246
+ const own = this.targetOf(module);
247
+ const open = own.url !== '' ? own : (pages[0] || null);
248
+ const settingsDeclared = module.settings && typeof module.settings === 'object' ? module.settings : null;
249
+ const settingsTarget = settingsDeclared && this.passesPermission(settingsDeclared) && this.passesVisibleIf(settingsDeclared, runtime)
250
+ ? this.targetOf(settingsDeclared)
251
+ : null;
252
+ return {
253
+ id: String(module.id),
254
+ key: String(module.id).replace(/[^A-Za-z0-9_-]/g, '-'),
255
+ label: this.tr(module.label),
256
+ description: this.tr(module.description || ''),
257
+ icon: module.icon || '',
258
+ enabled: this.moduleEnabled(module, runtime),
259
+ pages,
260
+ open,
261
+ settings: settingsTarget && settingsTarget.url !== ''
262
+ ? { ...settingsTarget, label: this.tr(settingsDeclared.label || ''), prefix: this.tr(settingsDeclared.prefix || '') }
263
+ : null,
264
+ }
265
+ })
266
+ },
267
+
268
+ /**
269
+ * Whether the groups are drawn as list cards (`config.groupStyle: "list"`).
270
+ *
271
+ * @return {boolean} True for list cards.
272
+ * @spec openspec/changes/screens-links-module-cards/specs/link-cards-page/spec.md#requirement-a-group-can-be-a-list-card
273
+ */
274
+ isListStyle() {
275
+ return this.config.groupStyle === 'list'
276
+ },
277
+
278
+ /**
279
+ * The modules heading, translated.
280
+ *
281
+ * @return {string} The heading.
282
+ * @spec openspec/changes/screens-links-module-cards/specs/link-cards-page/spec.md#requirement-a-links-page-can-show-modules
283
+ */
284
+ resolvedModulesTitle() {
285
+ return this.config.modulesTitle ? this.tr(this.config.modulesTitle) : translate('nextcloud-vue', 'Modules')
286
+ },
287
+
288
+ /**
289
+ * "3 of 6 are in the menu".
290
+ *
291
+ * @return {string} The count.
292
+ * @spec openspec/changes/screens-links-module-cards/specs/link-cards-page/spec.md#requirement-a-links-page-can-show-modules
293
+ */
294
+ modulesCount() {
295
+ const on = this.visibleModules.filter((module) => module.enabled).length;
296
+ return translatePlural('nextcloud-vue', '{on} of %n is in the menu', '{on} of %n are in the menu', this.visibleModules.length, { on })
297
+ },
298
+
299
+ /**
300
+ * The note under the module cards, translated.
301
+ *
302
+ * @return {string} The note, or ''.
303
+ * @spec openspec/changes/screens-links-module-cards/specs/link-cards-page/spec.md#requirement-a-links-page-can-show-modules
304
+ */
305
+ resolvedFootnote() {
306
+ return this.tr(this.config.footnote || '')
307
+ },
308
+
190
309
  /**
191
310
  * The groups to draw: ungrouped cards first under no caption, then
192
311
  * one group per category in declaration order. A group without a
@@ -216,6 +335,40 @@ var script = {
216
335
  },
217
336
 
218
337
  methods: {
338
+ /**
339
+ * Whether a module is in the menu: its `enabled` boolean, else its
340
+ * `enabledIf` condition evaluated as a `visibleIf`, else false.
341
+ *
342
+ * @param {object} module The declared module.
343
+ * @param {object|null} runtime `manifest.runtime`, or null.
344
+ * @return {boolean} True when the module is in the menu.
345
+ * @spec openspec/changes/screens-links-module-cards/specs/link-cards-page/spec.md#requirement-a-links-page-can-show-modules
346
+ */
347
+ /**
348
+ * The icon at the end of a list row: an external-link icon for a URL,
349
+ * a chevron for a page in the app. A resolved `trailing` wins.
350
+ *
351
+ * @param {object} card The resolved card.
352
+ * @return {string} `external` or `chevron`.
353
+ * @spec openspec/changes/screens-links-module-cards/specs/link-cards-page/spec.md#requirement-a-group-can-be-a-list-card
354
+ */
355
+ trailingOf(card) {
356
+ if (card.trailing === 'external' || card.trailing === 'chevron') {
357
+ return card.trailing
358
+ }
359
+ return card.external ? 'external' : 'chevron'
360
+ },
361
+
362
+ moduleEnabled(module, runtime) {
363
+ if (typeof module.enabled === 'boolean') {
364
+ return module.enabled
365
+ }
366
+ if (module.enabledIf && typeof module.enabledIf === 'object') {
367
+ return this.passesVisibleIf({ visibleIf: module.enabledIf }, runtime)
368
+ }
369
+ return false
370
+ },
371
+
219
372
  /**
220
373
  * Translate a manifest string through the app's translate function.
221
374
  *
@@ -1 +1 @@
1
- {"version":3,"file":"CnLinkCardsPage.vue2.js","sources":["../../../../src/components/CnLinkCardsPage/CnLinkCardsPage.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<div class=\"cn-link-cards-page\" data-testid=\"cn-link-cards-page\">\n\t\t<div class=\"cn-link-cards-page__header\">\n\t\t\t<h2 v-if=\"resolvedTitle\" class=\"cn-link-cards-page__title\">\n\t\t\t\t{{ resolvedTitle }}\n\t\t\t</h2>\n\t\t\t<p v-if=\"resolvedDescription\" class=\"cn-link-cards-page__description\">\n\t\t\t\t{{ resolvedDescription }}\n\t\t\t</p>\n\t\t</div>\n\n\t\t<p\n\t\t\tv-if=\"groups.length === 0\"\n\t\t\tclass=\"cn-link-cards-page__empty\"\n\t\t\tdata-testid=\"cn-link-cards-empty\">\n\t\t\t{{ resolvedEmptyLabel }}\n\t\t</p>\n\n\t\t<section\n\t\t\tv-for=\"group in groups\"\n\t\t\t:key=\"group.key\"\n\t\t\tclass=\"cn-link-cards-page__group\"\n\t\t\t:aria-labelledby=\"group.label ? group.headingId : null\"\n\t\t\t:aria-label=\"group.label ? null : resolvedTitle || null\"\n\t\t\tdata-testid=\"cn-link-cards-group\"\n\t\t\t:data-group=\"group.key\">\n\t\t\t<h3\n\t\t\t\tv-if=\"group.label\"\n\t\t\t\t:id=\"group.headingId\"\n\t\t\t\tclass=\"cn-link-cards-page__caption\">\n\t\t\t\t{{ group.label }}\n\t\t\t</h3>\n\t\t\t<ul class=\"cn-link-cards-page__grid\">\n\t\t\t\t<li v-for=\"card in group.cards\" :key=\"card.id\" class=\"cn-link-cards-page__cell\">\n\t\t\t\t\t<!-- A real <a href>, so the card can be middle-clicked, copied\n\t\t\t\t\t and announced as a link. A plain click on an in-app card\n\t\t\t\t\t is routed, which keeps the page from reloading. -->\n\t\t\t\t\t<a\n\t\t\t\t\t\tclass=\"cn-link-cards-page__card\"\n\t\t\t\t\t\tdata-testid=\"cn-link-card\"\n\t\t\t\t\t\t:data-card-id=\"card.id\"\n\t\t\t\t\t\t:href=\"card.url\"\n\t\t\t\t\t\t:target=\"card.external ? '_blank' : null\"\n\t\t\t\t\t\t:rel=\"card.external ? 'noopener noreferrer' : null\"\n\t\t\t\t\t\t:aria-describedby=\"card.description ? card.descriptionId : null\"\n\t\t\t\t\t\t@click=\"open(card, $event)\">\n\t\t\t\t\t\t<CnIcon\n\t\t\t\t\t\t\tv-if=\"card.icon\"\n\t\t\t\t\t\t\t:name=\"card.icon\"\n\t\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\t\tclass=\"cn-link-cards-page__icon\"\n\t\t\t\t\t\t\taria-hidden=\"true\" />\n\t\t\t\t\t\t<span class=\"cn-link-cards-page__body\">\n\t\t\t\t\t\t\t<span class=\"cn-link-cards-page__label\">{{ card.label }}</span>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-if=\"card.description\"\n\t\t\t\t\t\t\t\t:id=\"card.descriptionId\"\n\t\t\t\t\t\t\t\tclass=\"cn-link-cards-page__card-description\">\n\t\t\t\t\t\t\t\t{{ card.description }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</a>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</section>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { isAppInstalled } from '../../utils/appInstalled.js'\nimport { followLinkClick, resolveHref } from '../../utils/linkNavigation.js'\nimport { passesContextPredicates } from '../../utils/visibleIfContext.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\nlet linkCardsPageUid = 0\n\n/**\n * CnLinkCardsPage: the `type: \"links\"` page. Link cards, grouped under captions.\n *\n * One page that opens every page a short menu leaves out. A card has a\n * label, a one-line description, an optional icon and a target. Groups come\n * from `categories`, in the order they are declared; a card names its group\n * with `category`.\n *\n * ```json\n * { \"id\": \"Modules\", \"route\": \"/modules\", \"type\": \"links\", \"title\": \"Modules and more\",\n * \"config\": {\n * \"description\": \"Every page that is not in the daily menu.\",\n * \"categories\": { \"sales\": \"Sales\", \"marketing\": \"Marketing\" },\n * \"cards\": [\n * { \"id\": \"Leads\", \"label\": \"Leads\", \"description\": \"Every deal you are working on.\",\n * \"icon\": \"CashMultiple\", \"category\": \"sales\", \"route\": \"Leads\" }\n * ]\n * } }\n * ```\n *\n * Every string goes through the app's translate function. A card is hidden\n * by the same `visibleIf` and `permission` a menu entry takes, and a group\n * with no visible card is not drawn.\n */\nexport default {\n\tname: 'CnLinkCardsPage',\n\n\tcomponents: { CnIcon },\n\n\tinject: {\n\t\t/** The app's translate function, provided by CnAppRoot. Identity outside one. */\n\t\tcnTranslate: { default: () => (key) => key },\n\t\t/** The effective manifest, for `visibleIf` predicates against `runtime`. */\n\t\tcnManifest: { default: null },\n\t\t/** The permissions the user holds. Empty means the app did not say, and allows. */\n\t\tcnPermissions: { default: () => [] },\n\t},\n\n\tprops: {\n\t\t/** The whole manifest page, for a host that mounts this component itself. CnPageRenderer passes the flattened props below instead. */\n\t\tpage: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * The cards: `{ id, label, description?, icon?, category?, route?, params?, query?, href?, visibleIf?, permission? }`.\n\t\t * `route` is a route name, or a path when it starts with `/`.\n\t\t *\n\t\t * @type {Array<object>|null}\n\t\t */\n\t\tcards: {\n\t\t\ttype: Array,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Group key to caption. Sets the order of the groups.\n\t\t *\n\t\t * @type {Record<string, string>|null}\n\t\t */\n\t\tcategories: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** The heading. */\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** The lead paragraph under the heading. */\n\t\tdescription: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Text shown when no card is visible. */\n\t\temptyLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Translate function. Falls back to the injected `cnTranslate`.\n\t\t *\n\t\t * @type {((key: string) => string)|null}\n\t\t */\n\t\ttranslate: {\n\t\t\ttype: Function,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\tdata() {\n\t\tlinkCardsPageUid += 1\n\t\treturn {\n\t\t\tuid: linkCardsPageUid,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The config, from the flattened props or from `page.config`. Props win.\n\t\t *\n\t\t * @return {object} The config.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-links-page-renders-grouped-link-cards\n\t\t */\n\t\tconfig() {\n\t\t\tconst fromPage = (this.page && this.page.config) || {}\n\t\t\tconst fromProps = {}\n\t\t\tfor (const key of ['cards', 'categories', 'description', 'title', 'emptyLabel']) {\n\t\t\t\tif (this[key] !== null && this[key] !== undefined) {\n\t\t\t\t\tfromProps[key] = this[key]\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { ...fromPage, ...fromProps }\n\t\t},\n\n\t\t/**\n\t\t * The heading, translated.\n\t\t *\n\t\t * @return {string} The title, or '' when the page declares none.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-links-page-renders-grouped-link-cards\n\t\t */\n\t\tresolvedTitle() {\n\t\t\treturn this.tr(this.config.title || (this.page && this.page.title) || '')\n\t\t},\n\n\t\t/**\n\t\t * The lead paragraph, translated.\n\t\t *\n\t\t * @return {string} The description.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-links-page-renders-grouped-link-cards\n\t\t */\n\t\tresolvedDescription() {\n\t\t\treturn this.tr(this.config.description || '')\n\t\t},\n\n\t\t/**\n\t\t * The empty-state text.\n\t\t *\n\t\t * @return {string} The text.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-links-page-renders-grouped-link-cards\n\t\t */\n\t\tresolvedEmptyLabel() {\n\t\t\treturn this.config.emptyLabel ? this.tr(this.config.emptyLabel) : t('nextcloud-vue', 'Nothing to open here.')\n\t\t},\n\n\t\t/**\n\t\t * The cards a reader may see and can open, with text translated and\n\t\t * the link resolved. A card that is gated away, or has no target that\n\t\t * resolves, is left out: a card that does nothing is worse than none.\n\t\t *\n\t\t * @return {Array<object>} The cards.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-card-is-a-real-link\n\t\t */\n\t\tvisibleCards() {\n\t\t\tconst declared = Array.isArray(this.config.cards) ? this.config.cards : []\n\t\t\tconst runtime = this.cnManifest?.runtime ?? null\n\t\t\treturn declared\n\t\t\t\t.filter((card) => card && card.id && card.label)\n\t\t\t\t.filter((card) => this.passesPermission(card) && this.passesVisibleIf(card, runtime))\n\t\t\t\t.map((card) => {\n\t\t\t\t\tconst target = this.targetOf(card)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: String(card.id),\n\t\t\t\t\t\tlabel: this.tr(card.label),\n\t\t\t\t\t\tdescription: this.tr(card.description || ''),\n\t\t\t\t\t\tdescriptionId: `cn-link-card-desc-${this.uid}-${String(card.id).replace(/[^A-Za-z0-9_-]/g, '-')}`,\n\t\t\t\t\t\ticon: card.icon || '',\n\t\t\t\t\t\tcategory: card.category || '',\n\t\t\t\t\t\texternal: target.external,\n\t\t\t\t\t\tlocation: target.location,\n\t\t\t\t\t\turl: target.url,\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.filter((card) => card.url !== '')\n\t\t},\n\n\t\t/**\n\t\t * The groups to draw: ungrouped cards first under no caption, then\n\t\t * one group per category in declaration order. A group without a\n\t\t * visible card is left out.\n\t\t *\n\t\t * @return {Array<{key: string, label: string, headingId: string, cards: Array<object>}>} The groups.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-links-page-renders-grouped-link-cards\n\t\t */\n\t\tgroups() {\n\t\t\tconst declared = (this.config.categories && typeof this.config.categories === 'object') ? this.config.categories : {}\n\t\t\tconst keys = Object.keys(declared)\n\t\t\tconst loose = this.visibleCards.filter((card) => !keys.includes(card.category))\n\t\t\tconst groups = loose.length > 0 ? [{ key: '', label: '', headingId: '', cards: loose }] : []\n\t\t\tkeys.forEach((key, index) => {\n\t\t\t\tconst cards = this.visibleCards.filter((card) => card.category === key)\n\t\t\t\tif (cards.length > 0) {\n\t\t\t\t\tgroups.push({\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tlabel: this.tr(declared[key]),\n\t\t\t\t\t\theadingId: `cn-link-cards-group-${this.uid}-${index}`,\n\t\t\t\t\t\tcards,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn groups\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Translate a manifest string through the app's translate function.\n\t\t *\n\t\t * @param {string} value The declared string.\n\t\t * @return {string} The translation, or the input unchanged.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-links-page-renders-grouped-link-cards\n\t\t */\n\t\ttr(value) {\n\t\t\tif (typeof value !== 'string' || value === '') {\n\t\t\t\treturn value\n\t\t\t}\n\t\t\treturn (this.translate ?? this.cnTranslate)(value)\n\t\t},\n\n\t\t/**\n\t\t * Whether the user holds the card's `permission`. Same rule as the\n\t\t * menu: no permission declared, or no permissions known, allows.\n\t\t *\n\t\t * @param {object} card The card.\n\t\t * @return {boolean} True when the card may render.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-cards-honour-menu-visibility-conditions\n\t\t */\n\t\tpassesPermission(card) {\n\t\t\tconst held = Array.isArray(this.cnPermissions) ? this.cnPermissions : []\n\t\t\tif (!card.permission || held.length === 0) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn held.includes(card.permission)\n\t\t},\n\n\t\t/**\n\t\t * Evaluate a card's `visibleIf` the way CnAppNav evaluates a menu\n\t\t * entry's: `appInstalled` first, then dot-path predicates against\n\t\t * the manifest's `runtime`.\n\t\t *\n\t\t * @param {object} card The card.\n\t\t * @param {object|null} runtime `manifest.runtime`, or null.\n\t\t * @return {boolean} True when the card may render.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-cards-honour-menu-visibility-conditions\n\t\t */\n\t\tpassesVisibleIf(card, runtime) {\n\t\t\tconst condition = card.visibleIf\n\t\t\tif (!condition || typeof condition !== 'object') {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tif (condition.appInstalled && !isAppInstalled(condition.appInstalled)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn passesContextPredicates(condition, runtime)\n\t\t},\n\n\t\t/**\n\t\t * Where a card goes. An `href` is an external URL. A `route` is a\n\t\t * route name, or a path when it starts with `/`, resolved by the\n\t\t * router so the link carries the app's base with or without\n\t\t * `/index.php`.\n\t\t *\n\t\t * @param {object} card The card.\n\t\t * @return {{external: boolean, location: object|null, url: string}} The target; `url` is '' when it cannot be resolved.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-card-is-a-real-link\n\t\t */\n\t\ttargetOf(card) {\n\t\t\tif (typeof card.route === 'string' && card.route !== '') {\n\t\t\t\tconst location = card.route.startsWith('/') ? { path: card.route } : { name: card.route }\n\t\t\t\tif (card.params && typeof card.params === 'object') {\n\t\t\t\t\tlocation.params = card.params\n\t\t\t\t}\n\t\t\t\tif (card.query && typeof card.query === 'object') {\n\t\t\t\t\tlocation.query = card.query\n\t\t\t\t}\n\t\t\t\treturn { external: false, location, url: resolveHref(location, this.$router) }\n\t\t\t}\n\t\t\tif (typeof card.href === 'string' && card.href !== '') {\n\t\t\t\treturn { external: true, location: null, url: card.href }\n\t\t\t}\n\t\t\treturn { external: false, location: null, url: '' }\n\t\t},\n\n\t\t/**\n\t\t * Route a plain click on an in-app card. A modified or middle click,\n\t\t * and every click on an external card, is left to the browser.\n\t\t *\n\t\t * @param {object} card The resolved card.\n\t\t * @param {MouseEvent} event The click.\n\t\t * @return {void}\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-card-is-a-real-link\n\t\t */\n\t\topen(card, event) {\n\t\t\tif (card.external || !card.location) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfollowLinkClick(event, card.location, this.$router)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-link-cards-page {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: calc(6 * var(--default-grid-baseline));\n\tpadding: calc(5 * var(--default-grid-baseline));\n}\n\n/* Clear the Nextcloud navigation toggle button (44px wide, absolutely\n positioned at the left edge of .app-content) plus 12px breathing room, as\n CnPageHeader does. Only the header shifts; the cards keep the full width. */\n.cn-link-cards-page__header {\n\tpadding-inline-start: 56px;\n}\n\n.cn-link-cards-page__title {\n\tmargin: 0 0 var(--default-grid-baseline);\n}\n\n.cn-link-cards-page__description,\n.cn-link-cards-page__empty {\n\tcolor: var(--color-text-maxcontrast);\n\tmargin: 0;\n\tmax-width: 70ch;\n}\n\n.cn-link-cards-page__group {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: calc(3 * var(--default-grid-baseline));\n}\n\n.cn-link-cards-page__caption {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n\tfont-weight: 600;\n\tletter-spacing: 0.06em;\n\tmargin: 0;\n\ttext-transform: uppercase;\n}\n\n.cn-link-cards-page__grid {\n\tdisplay: grid;\n\tgap: calc(3 * var(--default-grid-baseline));\n\tgrid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.cn-link-cards-page__cell {\n\tdisplay: flex;\n}\n\n.cn-link-cards-page__card {\n\talign-items: flex-start;\n\tbackground: var(--color-main-background);\n\tborder: 1px solid var(--color-border-dark);\n\tborder-radius: var(--border-radius-large);\n\tcolor: var(--color-main-text);\n\tdisplay: flex;\n\tflex: 1;\n\tgap: calc(3 * var(--default-grid-baseline));\n\tmin-width: 0;\n\tpadding: calc(4 * var(--default-grid-baseline));\n\ttransition: background-color var(--animation-quick, 100ms) ease, border-color var(--animation-quick, 100ms) ease, box-shadow var(--animation-quick, 100ms) ease;\n}\n\n/* A card is a link, and it must not look like a line of prose. A theme may\n underline every link with `!important` (thematiq: `a { text-decoration:\n underline !important }`, specificity 0,0,1). Among `!important` rules the\n higher specificity wins, so this class rule has to carry it too; without it\n the label and the description both rendered underlined on a live Nextcloud. */\n.cn-link-cards-page__card,\n.cn-link-cards-page__card:hover,\n.cn-link-cards-page__card:focus,\n.cn-link-cards-page__card:active {\n\ttext-decoration: none !important;\n}\n\n/* Hover moves the whole card: border, background and a soft lift. */\n.cn-link-cards-page__card:hover {\n\tbackground: var(--color-background-hover);\n\tborder-color: var(--color-primary-element);\n\tbox-shadow: 0 2px 6px var(--color-box-shadow);\n}\n\n@media (prefers-reduced-motion: reduce) {\n\t.cn-link-cards-page__card {\n\t\ttransition: none;\n\t}\n}\n\n.cn-link-cards-page__card:focus-visible {\n\tborder-color: var(--color-primary-element);\n\toutline: 2px solid var(--color-primary-element);\n\toutline-offset: 2px;\n}\n\n.cn-link-cards-page__icon {\n\tcolor: var(--color-primary-element);\n\tflex: none;\n}\n\n.cn-link-cards-page__body {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--default-grid-baseline);\n\tmin-width: 0;\n}\n\n/* The label is the card's title. Its colour is set here, on the span, because\n a theme may force its link colour on the `a` itself; an inherited link\n colour made the title read as a hyperlink. */\n.cn-link-cards-page__label {\n\tcolor: var(--color-main-text);\n\tfont-size: 1.05em;\n\tfont-weight: 700;\n\tline-height: 1.3;\n\toverflow-wrap: anywhere;\n}\n\n.cn-link-cards-page__card-description {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n\tline-height: 1.4;\n}\n</style>\n"],"names":["CnIcon","t"],"mappings":"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"}
1
+ {"version":3,"file":"CnLinkCardsPage.vue2.js","sources":["../../../../src/components/CnLinkCardsPage/CnLinkCardsPage.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<div class=\"cn-link-cards-page\" data-testid=\"cn-link-cards-page\">\n\t\t<div class=\"cn-link-cards-page__header\">\n\t\t\t<h2 v-if=\"resolvedTitle\" class=\"cn-link-cards-page__title\">\n\t\t\t\t{{ resolvedTitle }}\n\t\t\t</h2>\n\t\t\t<p v-if=\"resolvedDescription\" class=\"cn-link-cards-page__description\">\n\t\t\t\t{{ resolvedDescription }}\n\t\t\t</p>\n\t\t</div>\n\n\t\t<section\n\t\t\tv-if=\"visibleModules.length > 0\"\n\t\t\tclass=\"cn-link-cards-page__modules\"\n\t\t\t:aria-labelledby=\"`cn-link-cards-modules-${uid}`\"\n\t\t\tdata-testid=\"cn-link-cards-modules\">\n\t\t\t<div class=\"cn-link-cards-page__modules-head\">\n\t\t\t\t<h3 :id=\"`cn-link-cards-modules-${uid}`\" class=\"cn-link-cards-page__modules-title\">\n\t\t\t\t\t{{ resolvedModulesTitle }}\n\t\t\t\t</h3>\n\t\t\t\t<span class=\"cn-link-cards-page__modules-count\" data-testid=\"cn-link-cards-modules-count\">\n\t\t\t\t\t{{ modulesCount }}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<div class=\"cn-link-cards-page__modules-grid\">\n\t\t\t\t<CnModuleCard\n\t\t\t\t\tv-for=\"module in visibleModules\"\n\t\t\t\t\t:key=\"module.id\"\n\t\t\t\t\t:module=\"module\"\n\t\t\t\t\t:headingId=\"`cn-link-cards-module-${uid}-${module.key}`\" />\n\t\t\t</div>\n\t\t\t<p v-if=\"resolvedFootnote\" class=\"cn-link-cards-page__modules-note\" data-testid=\"cn-link-cards-modules-note\">\n\t\t\t\t<InformationOutline :size=\"18\" class=\"cn-link-cards-page__modules-note-icon\" />\n\t\t\t\t<span>{{ resolvedFootnote }}</span>\n\t\t\t</p>\n\t\t</section>\n\n\t\t<p\n\t\t\tv-if=\"groups.length === 0 && visibleModules.length === 0\"\n\t\t\tclass=\"cn-link-cards-page__empty\"\n\t\t\tdata-testid=\"cn-link-cards-empty\">\n\t\t\t{{ resolvedEmptyLabel }}\n\t\t</p>\n\n\t\t<section\n\t\t\tv-for=\"group in groups\"\n\t\t\t:key=\"group.key\"\n\t\t\tclass=\"cn-link-cards-page__group\"\n\t\t\t:class=\"{ 'cn-link-cards-page__group--list': isListStyle }\"\n\t\t\t:aria-labelledby=\"group.label ? group.headingId : null\"\n\t\t\t:aria-label=\"group.label ? null : resolvedTitle || null\"\n\t\t\tdata-testid=\"cn-link-cards-group\"\n\t\t\t:data-group=\"group.key\">\n\t\t\t<h3\n\t\t\t\tv-if=\"group.label\"\n\t\t\t\t:id=\"group.headingId\"\n\t\t\t\tclass=\"cn-link-cards-page__caption\">\n\t\t\t\t{{ group.label }}\n\t\t\t</h3>\n\t\t\t<!-- groupStyle \"list\": the group is one card of rows, each an icon\n\t\t\t chip, the label over its description, and a trailing chevron\n\t\t\t (an external-link icon for a URL). -->\n\t\t\t<ul v-if=\"isListStyle\" class=\"cn-link-cards-page__list\">\n\t\t\t\t<li v-for=\"card in group.cards\" :key=\"card.id\">\n\t\t\t\t\t<a\n\t\t\t\t\t\tclass=\"cn-link-cards-page__row\"\n\t\t\t\t\t\tdata-testid=\"cn-link-card\"\n\t\t\t\t\t\t:data-card-id=\"card.id\"\n\t\t\t\t\t\t:href=\"card.url\"\n\t\t\t\t\t\t:target=\"card.external ? '_blank' : null\"\n\t\t\t\t\t\t:rel=\"card.external ? 'noopener noreferrer' : null\"\n\t\t\t\t\t\t:aria-describedby=\"card.description ? card.descriptionId : null\"\n\t\t\t\t\t\t@click=\"open(card, $event)\">\n\t\t\t\t\t\t<span v-if=\"card.icon\" class=\"cn-link-cards-page__row-icon\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<CnIcon :name=\"card.icon\" :size=\"20\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class=\"cn-link-cards-page__row-body\">\n\t\t\t\t\t\t\t<span class=\"cn-link-cards-page__row-label\">{{ card.label }}</span>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-if=\"card.description\"\n\t\t\t\t\t\t\t\t:id=\"card.descriptionId\"\n\t\t\t\t\t\t\t\tclass=\"cn-link-cards-page__row-description\">\n\t\t\t\t\t\t\t\t{{ card.description }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<OpenInNew v-if=\"trailingOf(card) === 'external'\" :size=\"18\" class=\"cn-link-cards-page__row-trailing\" />\n\t\t\t\t\t\t<ChevronRight v-else :size=\"20\" class=\"cn-link-cards-page__row-trailing\" />\n\t\t\t\t\t</a>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<ul v-else class=\"cn-link-cards-page__grid\">\n\t\t\t\t<li v-for=\"card in group.cards\" :key=\"card.id\" class=\"cn-link-cards-page__cell\">\n\t\t\t\t\t<!-- A real <a href>, so the card can be middle-clicked, copied\n\t\t\t\t\t and announced as a link. A plain click on an in-app card\n\t\t\t\t\t is routed, which keeps the page from reloading. -->\n\t\t\t\t\t<a\n\t\t\t\t\t\tclass=\"cn-link-cards-page__card\"\n\t\t\t\t\t\tdata-testid=\"cn-link-card\"\n\t\t\t\t\t\t:data-card-id=\"card.id\"\n\t\t\t\t\t\t:href=\"card.url\"\n\t\t\t\t\t\t:target=\"card.external ? '_blank' : null\"\n\t\t\t\t\t\t:rel=\"card.external ? 'noopener noreferrer' : null\"\n\t\t\t\t\t\t:aria-describedby=\"card.description ? card.descriptionId : null\"\n\t\t\t\t\t\t@click=\"open(card, $event)\">\n\t\t\t\t\t\t<CnIcon\n\t\t\t\t\t\t\tv-if=\"card.icon\"\n\t\t\t\t\t\t\t:name=\"card.icon\"\n\t\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\t\tclass=\"cn-link-cards-page__icon\"\n\t\t\t\t\t\t\taria-hidden=\"true\" />\n\t\t\t\t\t\t<span class=\"cn-link-cards-page__body\">\n\t\t\t\t\t\t\t<span class=\"cn-link-cards-page__label\">{{ card.label }}</span>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-if=\"card.description\"\n\t\t\t\t\t\t\t\t:id=\"card.descriptionId\"\n\t\t\t\t\t\t\t\tclass=\"cn-link-cards-page__card-description\">\n\t\t\t\t\t\t\t\t{{ card.description }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</a>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</section>\n\t</div>\n</template>\n\n<script>\nimport { translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport ChevronRight from 'vue-material-design-icons/ChevronRight.vue'\nimport InformationOutline from 'vue-material-design-icons/InformationOutline.vue'\nimport OpenInNew from 'vue-material-design-icons/OpenInNew.vue'\nimport CnModuleCard from '../CnModuleCard/CnModuleCard.vue'\nimport { isAppInstalled } from '../../utils/appInstalled.js'\nimport { followLinkClick, resolveHref } from '../../utils/linkNavigation.js'\nimport { passesContextPredicates } from '../../utils/visibleIfContext.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\nlet linkCardsPageUid = 0\n\n/**\n * CnLinkCardsPage: the `type: \"links\"` page. Link cards, grouped under captions.\n *\n * One page that opens every page a short menu leaves out. A card has a\n * label, a one-line description, an optional icon and a target. Groups come\n * from `categories`, in the order they are declared; a card names its group\n * with `category`.\n *\n * ```json\n * { \"id\": \"Modules\", \"route\": \"/modules\", \"type\": \"links\", \"title\": \"Modules and more\",\n * \"config\": {\n * \"description\": \"Every page that is not in the daily menu.\",\n * \"categories\": { \"sales\": \"Sales\", \"marketing\": \"Marketing\" },\n * \"cards\": [\n * { \"id\": \"Leads\", \"label\": \"Leads\", \"description\": \"Every deal you are working on.\",\n * \"icon\": \"CashMultiple\", \"category\": \"sales\", \"route\": \"Leads\" }\n * ]\n * } }\n * ```\n *\n * Every string goes through the app's translate function. A card is hidden\n * by the same `visibleIf` and `permission` a menu entry takes, and a group\n * with no visible card is not drawn.\n */\nexport default {\n\tname: 'CnLinkCardsPage',\n\n\tcomponents: { ChevronRight, CnIcon, CnModuleCard, InformationOutline, OpenInNew },\n\n\tinject: {\n\t\t/** The app's translate function, provided by CnAppRoot. Identity outside one. */\n\t\tcnTranslate: { default: () => (key) => key },\n\t\t/** The effective manifest, for `visibleIf` predicates against `runtime`. */\n\t\tcnManifest: { default: null },\n\t\t/** The permissions the user holds. Empty means the app did not say, and allows. */\n\t\tcnPermissions: { default: () => [] },\n\t},\n\n\tprops: {\n\t\t/** The whole manifest page, for a host that mounts this component itself. CnPageRenderer passes the flattened props below instead. */\n\t\tpage: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * The cards: `{ id, label, description?, icon?, category?, route?, params?, query?, href?, visibleIf?, permission? }`.\n\t\t * `route` is a route name, or a path when it starts with `/`.\n\t\t *\n\t\t * @type {Array<object>|null}\n\t\t */\n\t\tcards: {\n\t\t\ttype: Array,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Group key to caption. Sets the order of the groups.\n\t\t *\n\t\t * @type {Record<string, string>|null}\n\t\t */\n\t\tcategories: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** The heading. */\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** The lead paragraph under the heading. */\n\t\tdescription: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The modules: `{ id, label, description?, icon?, enabled?, enabledIf?,\n\t\t * route?, pages: [{ label, route, highlight? }], settings?: { label?, prefix?,\n\t\t * route?, href?, permission?, visibleIf? }, permission?, visibleIf? }`.\n\t\t * Drawn as module cards above the link cards.\n\t\t *\n\t\t * @type {Array<object>|null}\n\t\t */\n\t\tmodules: {\n\t\t\ttype: Array,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** `cards` (default): a grid of link cards per group. `list`: one card per group with a row per link. */\n\t\tgroupStyle: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Heading of the modules section. Defaults to \"Modules\". */\n\t\tmodulesTitle: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** A note under the module cards. */\n\t\tfootnote: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Text shown when no card is visible. */\n\t\temptyLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Translate function. Falls back to the injected `cnTranslate`.\n\t\t *\n\t\t * @type {((key: string) => string)|null}\n\t\t */\n\t\ttranslate: {\n\t\t\ttype: Function,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\tdata() {\n\t\tlinkCardsPageUid += 1\n\t\treturn {\n\t\t\tuid: linkCardsPageUid,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The config, from the flattened props or from `page.config`. Props win.\n\t\t *\n\t\t * @return {object} The config.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-links-page-renders-grouped-link-cards\n\t\t */\n\t\tconfig() {\n\t\t\tconst fromPage = (this.page && this.page.config) || {}\n\t\t\tconst fromProps = {}\n\t\t\tfor (const key of ['cards', 'categories', 'description', 'title', 'emptyLabel', 'modules', 'modulesTitle', 'footnote', 'groupStyle']) {\n\t\t\t\tif (this[key] !== null && this[key] !== undefined) {\n\t\t\t\t\tfromProps[key] = this[key]\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { ...fromPage, ...fromProps }\n\t\t},\n\n\t\t/**\n\t\t * The heading, translated.\n\t\t *\n\t\t * @return {string} The title, or '' when the page declares none.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-links-page-renders-grouped-link-cards\n\t\t */\n\t\tresolvedTitle() {\n\t\t\treturn this.tr(this.config.title || (this.page && this.page.title) || '')\n\t\t},\n\n\t\t/**\n\t\t * The lead paragraph, translated.\n\t\t *\n\t\t * @return {string} The description.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-links-page-renders-grouped-link-cards\n\t\t */\n\t\tresolvedDescription() {\n\t\t\treturn this.tr(this.config.description || '')\n\t\t},\n\n\t\t/**\n\t\t * The empty-state text.\n\t\t *\n\t\t * @return {string} The text.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-links-page-renders-grouped-link-cards\n\t\t */\n\t\tresolvedEmptyLabel() {\n\t\t\treturn this.config.emptyLabel ? this.tr(this.config.emptyLabel) : t('nextcloud-vue', 'Nothing to open here.')\n\t\t},\n\n\t\t/**\n\t\t * The cards a reader may see and can open, with text translated and\n\t\t * the link resolved. A card that is gated away, or has no target that\n\t\t * resolves, is left out: a card that does nothing is worse than none.\n\t\t *\n\t\t * @return {Array<object>} The cards.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-card-is-a-real-link\n\t\t */\n\t\tvisibleCards() {\n\t\t\tconst declared = Array.isArray(this.config.cards) ? this.config.cards : []\n\t\t\tconst runtime = this.cnManifest?.runtime ?? null\n\t\t\treturn declared\n\t\t\t\t.filter((card) => card && card.id && card.label)\n\t\t\t\t.filter((card) => this.passesPermission(card) && this.passesVisibleIf(card, runtime))\n\t\t\t\t.map((card) => {\n\t\t\t\t\tconst target = this.targetOf(card)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: String(card.id),\n\t\t\t\t\t\tlabel: this.tr(card.label),\n\t\t\t\t\t\tdescription: this.tr(card.description || ''),\n\t\t\t\t\t\tdescriptionId: `cn-link-card-desc-${this.uid}-${String(card.id).replace(/[^A-Za-z0-9_-]/g, '-')}`,\n\t\t\t\t\t\ticon: card.icon || '',\n\t\t\t\t\t\tcategory: card.category || '',\n\t\t\t\t\t\texternal: target.external,\n\t\t\t\t\t\tlocation: target.location,\n\t\t\t\t\t\turl: target.url,\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.filter((card) => card.url !== '')\n\t\t},\n\n\t\t/**\n\t\t * The modules a reader may see, with text translated and links\n\t\t * resolved. `enabled` is the declared boolean, or the result of\n\t\t * `enabledIf` (a visibleIf condition against `runtime`). A page that\n\t\t * resolves to nothing is dropped; the admin-settings link only shows when\n\t\t * its own `permission` and `visibleIf` pass.\n\t\t *\n\t\t * @return {Array<object>} The modules.\n\t\t * @spec openspec/changes/screens-links-module-cards/specs/link-cards-page/spec.md#requirement-a-links-page-can-show-modules\n\t\t */\n\t\tvisibleModules() {\n\t\t\tconst declared = Array.isArray(this.config.modules) ? this.config.modules : []\n\t\t\tconst runtime = this.cnManifest?.runtime ?? null\n\t\t\treturn declared\n\t\t\t\t.filter((module) => module && module.id && module.label)\n\t\t\t\t.filter((module) => this.passesPermission(module) && this.passesVisibleIf(module, runtime))\n\t\t\t\t.map((module) => {\n\t\t\t\t\tconst pages = (Array.isArray(module.pages) ? module.pages : [])\n\t\t\t\t\t\t.filter((page) => page && page.label)\n\t\t\t\t\t\t.map((page, index) => ({ key: String(index), label: this.tr(page.label), highlight: page.highlight === true, ...this.targetOf(page) }))\n\t\t\t\t\t\t.filter((page) => page.url !== '')\n\t\t\t\t\tconst own = this.targetOf(module)\n\t\t\t\t\tconst open = own.url !== '' ? own : (pages[0] || null)\n\t\t\t\t\tconst settingsDeclared = module.settings && typeof module.settings === 'object' ? module.settings : null\n\t\t\t\t\tconst settingsTarget = settingsDeclared && this.passesPermission(settingsDeclared) && this.passesVisibleIf(settingsDeclared, runtime)\n\t\t\t\t\t\t? this.targetOf(settingsDeclared)\n\t\t\t\t\t\t: null\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: String(module.id),\n\t\t\t\t\t\tkey: String(module.id).replace(/[^A-Za-z0-9_-]/g, '-'),\n\t\t\t\t\t\tlabel: this.tr(module.label),\n\t\t\t\t\t\tdescription: this.tr(module.description || ''),\n\t\t\t\t\t\ticon: module.icon || '',\n\t\t\t\t\t\tenabled: this.moduleEnabled(module, runtime),\n\t\t\t\t\t\tpages,\n\t\t\t\t\t\topen,\n\t\t\t\t\t\tsettings: settingsTarget && settingsTarget.url !== ''\n\t\t\t\t\t\t\t? { ...settingsTarget, label: this.tr(settingsDeclared.label || ''), prefix: this.tr(settingsDeclared.prefix || '') }\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Whether the groups are drawn as list cards (`config.groupStyle: \"list\"`).\n\t\t *\n\t\t * @return {boolean} True for list cards.\n\t\t * @spec openspec/changes/screens-links-module-cards/specs/link-cards-page/spec.md#requirement-a-group-can-be-a-list-card\n\t\t */\n\t\tisListStyle() {\n\t\t\treturn this.config.groupStyle === 'list'\n\t\t},\n\n\t\t/**\n\t\t * The modules heading, translated.\n\t\t *\n\t\t * @return {string} The heading.\n\t\t * @spec openspec/changes/screens-links-module-cards/specs/link-cards-page/spec.md#requirement-a-links-page-can-show-modules\n\t\t */\n\t\tresolvedModulesTitle() {\n\t\t\treturn this.config.modulesTitle ? this.tr(this.config.modulesTitle) : t('nextcloud-vue', 'Modules')\n\t\t},\n\n\t\t/**\n\t\t * \"3 of 6 are in the menu\".\n\t\t *\n\t\t * @return {string} The count.\n\t\t * @spec openspec/changes/screens-links-module-cards/specs/link-cards-page/spec.md#requirement-a-links-page-can-show-modules\n\t\t */\n\t\tmodulesCount() {\n\t\t\tconst on = this.visibleModules.filter((module) => module.enabled).length\n\t\t\treturn n('nextcloud-vue', '{on} of %n is in the menu', '{on} of %n are in the menu', this.visibleModules.length, { on })\n\t\t},\n\n\t\t/**\n\t\t * The note under the module cards, translated.\n\t\t *\n\t\t * @return {string} The note, or ''.\n\t\t * @spec openspec/changes/screens-links-module-cards/specs/link-cards-page/spec.md#requirement-a-links-page-can-show-modules\n\t\t */\n\t\tresolvedFootnote() {\n\t\t\treturn this.tr(this.config.footnote || '')\n\t\t},\n\n\t\t/**\n\t\t * The groups to draw: ungrouped cards first under no caption, then\n\t\t * one group per category in declaration order. A group without a\n\t\t * visible card is left out.\n\t\t *\n\t\t * @return {Array<{key: string, label: string, headingId: string, cards: Array<object>}>} The groups.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-links-page-renders-grouped-link-cards\n\t\t */\n\t\tgroups() {\n\t\t\tconst declared = (this.config.categories && typeof this.config.categories === 'object') ? this.config.categories : {}\n\t\t\tconst keys = Object.keys(declared)\n\t\t\tconst loose = this.visibleCards.filter((card) => !keys.includes(card.category))\n\t\t\tconst groups = loose.length > 0 ? [{ key: '', label: '', headingId: '', cards: loose }] : []\n\t\t\tkeys.forEach((key, index) => {\n\t\t\t\tconst cards = this.visibleCards.filter((card) => card.category === key)\n\t\t\t\tif (cards.length > 0) {\n\t\t\t\t\tgroups.push({\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tlabel: this.tr(declared[key]),\n\t\t\t\t\t\theadingId: `cn-link-cards-group-${this.uid}-${index}`,\n\t\t\t\t\t\tcards,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn groups\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Whether a module is in the menu: its `enabled` boolean, else its\n\t\t * `enabledIf` condition evaluated as a `visibleIf`, else false.\n\t\t *\n\t\t * @param {object} module The declared module.\n\t\t * @param {object|null} runtime `manifest.runtime`, or null.\n\t\t * @return {boolean} True when the module is in the menu.\n\t\t * @spec openspec/changes/screens-links-module-cards/specs/link-cards-page/spec.md#requirement-a-links-page-can-show-modules\n\t\t */\n\t\t/**\n\t\t * The icon at the end of a list row: an external-link icon for a URL,\n\t\t * a chevron for a page in the app. A resolved `trailing` wins.\n\t\t *\n\t\t * @param {object} card The resolved card.\n\t\t * @return {string} `external` or `chevron`.\n\t\t * @spec openspec/changes/screens-links-module-cards/specs/link-cards-page/spec.md#requirement-a-group-can-be-a-list-card\n\t\t */\n\t\ttrailingOf(card) {\n\t\t\tif (card.trailing === 'external' || card.trailing === 'chevron') {\n\t\t\t\treturn card.trailing\n\t\t\t}\n\t\t\treturn card.external ? 'external' : 'chevron'\n\t\t},\n\n\t\tmoduleEnabled(module, runtime) {\n\t\t\tif (typeof module.enabled === 'boolean') {\n\t\t\t\treturn module.enabled\n\t\t\t}\n\t\t\tif (module.enabledIf && typeof module.enabledIf === 'object') {\n\t\t\t\treturn this.passesVisibleIf({ visibleIf: module.enabledIf }, runtime)\n\t\t\t}\n\t\t\treturn false\n\t\t},\n\n\t\t/**\n\t\t * Translate a manifest string through the app's translate function.\n\t\t *\n\t\t * @param {string} value The declared string.\n\t\t * @return {string} The translation, or the input unchanged.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-links-page-renders-grouped-link-cards\n\t\t */\n\t\ttr(value) {\n\t\t\tif (typeof value !== 'string' || value === '') {\n\t\t\t\treturn value\n\t\t\t}\n\t\t\treturn (this.translate ?? this.cnTranslate)(value)\n\t\t},\n\n\t\t/**\n\t\t * Whether the user holds the card's `permission`. Same rule as the\n\t\t * menu: no permission declared, or no permissions known, allows.\n\t\t *\n\t\t * @param {object} card The card.\n\t\t * @return {boolean} True when the card may render.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-cards-honour-menu-visibility-conditions\n\t\t */\n\t\tpassesPermission(card) {\n\t\t\tconst held = Array.isArray(this.cnPermissions) ? this.cnPermissions : []\n\t\t\tif (!card.permission || held.length === 0) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn held.includes(card.permission)\n\t\t},\n\n\t\t/**\n\t\t * Evaluate a card's `visibleIf` the way CnAppNav evaluates a menu\n\t\t * entry's: `appInstalled` first, then dot-path predicates against\n\t\t * the manifest's `runtime`.\n\t\t *\n\t\t * @param {object} card The card.\n\t\t * @param {object|null} runtime `manifest.runtime`, or null.\n\t\t * @return {boolean} True when the card may render.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-cards-honour-menu-visibility-conditions\n\t\t */\n\t\tpassesVisibleIf(card, runtime) {\n\t\t\tconst condition = card.visibleIf\n\t\t\tif (!condition || typeof condition !== 'object') {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tif (condition.appInstalled && !isAppInstalled(condition.appInstalled)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn passesContextPredicates(condition, runtime)\n\t\t},\n\n\t\t/**\n\t\t * Where a card goes. An `href` is an external URL. A `route` is a\n\t\t * route name, or a path when it starts with `/`, resolved by the\n\t\t * router so the link carries the app's base with or without\n\t\t * `/index.php`.\n\t\t *\n\t\t * @param {object} card The card.\n\t\t * @return {{external: boolean, location: object|null, url: string}} The target; `url` is '' when it cannot be resolved.\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-card-is-a-real-link\n\t\t */\n\t\ttargetOf(card) {\n\t\t\tif (typeof card.route === 'string' && card.route !== '') {\n\t\t\t\tconst location = card.route.startsWith('/') ? { path: card.route } : { name: card.route }\n\t\t\t\tif (card.params && typeof card.params === 'object') {\n\t\t\t\t\tlocation.params = card.params\n\t\t\t\t}\n\t\t\t\tif (card.query && typeof card.query === 'object') {\n\t\t\t\t\tlocation.query = card.query\n\t\t\t\t}\n\t\t\t\treturn { external: false, location, url: resolveHref(location, this.$router) }\n\t\t\t}\n\t\t\tif (typeof card.href === 'string' && card.href !== '') {\n\t\t\t\treturn { external: true, location: null, url: card.href }\n\t\t\t}\n\t\t\treturn { external: false, location: null, url: '' }\n\t\t},\n\n\t\t/**\n\t\t * Route a plain click on an in-app card. A modified or middle click,\n\t\t * and every click on an external card, is left to the browser.\n\t\t *\n\t\t * @param {object} card The resolved card.\n\t\t * @param {MouseEvent} event The click.\n\t\t * @return {void}\n\t\t * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-card-is-a-real-link\n\t\t */\n\t\topen(card, event) {\n\t\t\tif (card.external || !card.location) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfollowLinkClick(event, card.location, this.$router)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-link-cards-page {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: calc(6 * var(--default-grid-baseline));\n\tpadding: calc(5 * var(--default-grid-baseline));\n}\n\n/* Clear the Nextcloud navigation toggle button (44px wide, absolutely\n positioned at the left edge of .app-content) plus 12px breathing room, as\n CnPageHeader does. Only the header shifts; the cards keep the full width. */\n.cn-link-cards-page__header {\n\tpadding-inline-start: 56px;\n}\n\n.cn-link-cards-page__title {\n\tmargin: 0 0 var(--default-grid-baseline);\n}\n\n.cn-link-cards-page__description,\n.cn-link-cards-page__empty {\n\tcolor: var(--color-text-maxcontrast);\n\tmargin: 0;\n\tmax-width: 70ch;\n}\n\n.cn-link-cards-page__group {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: calc(3 * var(--default-grid-baseline));\n}\n\n.cn-link-cards-page__caption {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n\tfont-weight: 600;\n\tletter-spacing: 0.06em;\n\tmargin: 0;\n\ttext-transform: uppercase;\n}\n\n.cn-link-cards-page__grid {\n\tdisplay: grid;\n\tgap: calc(3 * var(--default-grid-baseline));\n\tgrid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.cn-link-cards-page__cell {\n\tdisplay: flex;\n}\n\n.cn-link-cards-page__card {\n\talign-items: flex-start;\n\tbackground: var(--color-main-background);\n\tborder: 1px solid var(--color-border-dark);\n\tborder-radius: var(--border-radius-large);\n\tcolor: var(--color-main-text);\n\tdisplay: flex;\n\tflex: 1;\n\tgap: calc(3 * var(--default-grid-baseline));\n\tmin-width: 0;\n\tpadding: calc(4 * var(--default-grid-baseline));\n\ttransition: background-color var(--animation-quick, 100ms) ease, border-color var(--animation-quick, 100ms) ease, box-shadow var(--animation-quick, 100ms) ease;\n}\n\n/* A card is a link, and it must not look like a line of prose. A theme may\n underline every link with `!important` (thematiq: `a { text-decoration:\n underline !important }`, specificity 0,0,1). Among `!important` rules the\n higher specificity wins, so this class rule has to carry it too; without it\n the label and the description both rendered underlined on a live Nextcloud. */\n.cn-link-cards-page__card,\n.cn-link-cards-page__card:hover,\n.cn-link-cards-page__card:focus,\n.cn-link-cards-page__card:active {\n\ttext-decoration: none !important;\n}\n\n/* Hover moves the whole card: border, background and a soft lift. */\n.cn-link-cards-page__card:hover {\n\tbackground: var(--color-background-hover);\n\tborder-color: var(--color-primary-element);\n\tbox-shadow: 0 2px 6px var(--color-box-shadow);\n}\n\n@media (prefers-reduced-motion: reduce) {\n\t.cn-link-cards-page__card {\n\t\ttransition: none;\n\t}\n}\n\n.cn-link-cards-page__card:focus-visible {\n\tborder-color: var(--color-primary-element);\n\toutline: 2px solid var(--color-primary-element);\n\toutline-offset: 2px;\n}\n\n.cn-link-cards-page__icon {\n\tcolor: var(--color-primary-element);\n\tflex: none;\n}\n\n.cn-link-cards-page__body {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--default-grid-baseline);\n\tmin-width: 0;\n}\n\n/* The label is the card's title. Its colour is set here, on the span, because\n a theme may force its link colour on the `a` itself; an inherited link\n colour made the title read as a hyperlink. */\n.cn-link-cards-page__label {\n\tcolor: var(--color-main-text);\n\tfont-size: 1.05em;\n\tfont-weight: 700;\n\tline-height: 1.3;\n\toverflow-wrap: anywhere;\n}\n\n.cn-link-cards-page__card-description {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n\tline-height: 1.4;\n}\n\n.cn-link-cards-page__group--list {\n\tpadding: 20px 22px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-container-large, 12px);\n\tbackground: var(--color-main-background);\n\tgap: 6px;\n}\n\n.cn-link-cards-page__group--list .cn-link-cards-page__caption {\n\tmargin: 0 0 8px;\n\tcolor: var(--color-main-text);\n\tfont-size: 17px;\n\tfont-weight: 700;\n\tletter-spacing: normal;\n\ttext-transform: none;\n}\n\n.cn-link-cards-page__list {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-link-cards-page__row {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 12px;\n\tpadding: 10px 0;\n\tborder-top: 1px solid var(--color-background-dark);\n\tcolor: var(--color-main-text);\n}\n\n.cn-link-cards-page__row,\n.cn-link-cards-page__row:hover,\n.cn-link-cards-page__row:focus,\n.cn-link-cards-page__row:active {\n\ttext-decoration: none !important;\n}\n\n.cn-link-cards-page__row:focus-visible {\n\toutline: 2px solid var(--color-primary-element);\n\toutline-offset: 2px;\n}\n\n.cn-link-cards-page__row-icon {\n\tdisplay: flex;\n\tflex: none;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 34px;\n\theight: 34px;\n\tborder-radius: var(--border-radius-element, 8px);\n\tbackground: var(--color-background-dark);\n}\n\n.cn-link-cards-page__row-body {\n\tdisplay: flex;\n\tflex: 1 1 auto;\n\tflex-direction: column;\n\tgap: 2px;\n\tmin-width: 0;\n}\n\n.cn-link-cards-page__row-label {\n\tfont-size: 15px;\n\tfont-weight: 600;\n}\n\n.cn-link-cards-page__row-description {\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-link-cards-page__row-trailing {\n\tflex: none;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-link-cards-page__modules {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 14px;\n}\n\n.cn-link-cards-page__modules-head {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: space-between;\n\talign-items: baseline;\n\tgap: 8px;\n}\n\n.cn-link-cards-page__modules-title {\n\tmargin: 0;\n\tfont-size: 20px;\n\tfont-weight: 700;\n}\n\n.cn-link-cards-page__modules-count {\n\tfont-size: 14px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-link-cards-page__modules-grid {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fill, minmax(260px, 1fr));\n\tgap: 16px;\n}\n\n.cn-link-cards-page__modules-note {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 8px;\n\tmargin: 0;\n\tfont-size: 14px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-link-cards-page__modules-note-icon {\n\tflex: none;\n}\n</style>\n"],"names":["CnIcon","CnModuleCard","t","n"],"mappings":"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"}