@conduction/nextcloud-vue 2.75.0 → 2.77.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 (158) hide show
  1. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +18 -3
  2. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
  3. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +49 -3
  4. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
  5. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js +6 -0
  6. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js.map +1 -1
  7. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js +3 -2
  8. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js.map +1 -1
  9. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +42 -1
  10. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  11. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +228 -203
  12. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  13. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue.js +9 -0
  14. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue.js.map +1 -0
  15. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue2.js +50 -0
  16. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue2.js.map +1 -0
  17. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue3.js +13 -0
  18. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue3.js.map +1 -0
  19. package/dist/esm/components/CnCredentials/CnCredentials.vue2.js +11 -10
  20. package/dist/esm/components/CnCredentials/CnCredentials.vue2.js.map +1 -1
  21. package/dist/esm/components/CnCredentials/CnCredentials.vue3.js.map +1 -1
  22. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +41 -4
  23. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  24. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +90 -51
  25. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  26. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +24 -33
  27. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  28. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +12 -24
  29. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  30. package/dist/esm/components/CnFavouriteToggle/CnFavouriteToggle.vue2.js +7 -2
  31. package/dist/esm/components/CnFavouriteToggle/CnFavouriteToggle.vue2.js.map +1 -1
  32. package/dist/esm/components/CnFavouriteToggle/CnFavouriteToggle.vue3.js.map +1 -1
  33. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +114 -1
  34. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  35. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +115 -62
  36. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  37. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue2.js +89 -7
  38. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue2.js.map +1 -1
  39. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue3.js +62 -30
  40. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue3.js.map +1 -1
  41. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +242 -19
  42. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  43. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +25 -20
  44. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  45. package/dist/esm/components/CnIndexPage/selfModeActions.js +90 -14
  46. package/dist/esm/components/CnIndexPage/selfModeActions.js.map +1 -1
  47. package/dist/esm/components/CnIndexPage/useSelfFetchList.js +15 -3
  48. package/dist/esm/components/CnIndexPage/useSelfFetchList.js.map +1 -1
  49. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +26 -0
  50. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
  51. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +26 -9
  52. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
  53. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +199 -7
  54. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  55. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js +155 -119
  56. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  57. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +19 -3
  58. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  59. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  60. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +6 -0
  61. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  62. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +4 -1
  63. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  64. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js +153 -38
  65. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js.map +1 -1
  66. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue3.js +74 -56
  67. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue3.js.map +1 -1
  68. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +13 -0
  69. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  70. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  71. package/dist/esm/composables/useListView.js +4 -0
  72. package/dist/esm/composables/useListView.js.map +1 -1
  73. package/dist/esm/composables/useObjectLock.js +41 -10
  74. package/dist/esm/composables/useObjectLock.js.map +1 -1
  75. package/dist/esm/index.js +3 -1
  76. package/dist/esm/index.js.map +1 -1
  77. package/dist/esm/l10n/en.json.js +31 -1
  78. package/dist/esm/l10n/en.json.js.map +1 -1
  79. package/dist/esm/l10n/nl.json.js +32 -2
  80. package/dist/esm/l10n/nl.json.js.map +1 -1
  81. package/dist/esm/nextcloud-vue.css +376 -75
  82. package/dist/esm/store/plugins/interactions.js +20 -10
  83. package/dist/esm/store/plugins/interactions.js.map +1 -1
  84. package/dist/esm/store/useObjectStore.js +54 -9
  85. package/dist/esm/store/useObjectStore.js.map +1 -1
  86. package/dist/esm/utils/builtInFormatters.js +15 -7
  87. package/dist/esm/utils/builtInFormatters.js.map +1 -1
  88. package/dist/esm/utils/groupAutocomplete.js +63 -1
  89. package/dist/esm/utils/groupAutocomplete.js.map +1 -1
  90. package/dist/esm/utils/lensAvailability.js +90 -0
  91. package/dist/esm/utils/lensAvailability.js.map +1 -0
  92. package/dist/esm/utils/objectSignals.js +44 -0
  93. package/dist/esm/utils/objectSignals.js.map +1 -0
  94. package/dist/esm/utils/personalLenses.js +13 -6
  95. package/dist/esm/utils/personalLenses.js.map +1 -1
  96. package/dist/esm/utils/recordInteractions.js +31 -13
  97. package/dist/esm/utils/recordInteractions.js.map +1 -1
  98. package/dist/esm/utils/resolveFilterTokens.js +46 -3
  99. package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
  100. package/dist/esm/utils/schema.js +1 -1
  101. package/dist/esm/utils/schema.js.map +1 -1
  102. package/dist/esm/utils/sentinelTokens.js +4 -4
  103. package/dist/esm/utils/sentinelTokens.js.map +1 -1
  104. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  105. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  106. package/dist/esm/utils/widgetVisibility.js +46 -1
  107. package/dist/esm/utils/widgetVisibility.js.map +1 -1
  108. package/dist/nextcloud-vue.cjs.js +4732 -2990
  109. package/dist/nextcloud-vue.cjs.js.map +2 -2
  110. package/dist/nextcloud-vue.css +376 -75
  111. package/l10n/en.json +31 -1
  112. package/l10n/nl.json +32 -2
  113. package/package.json +1 -1
  114. package/src/components/CnAppNav/CnAppNav.vue +44 -5
  115. package/src/components/CnCardGrid/CnCardGrid.md +1 -0
  116. package/src/components/CnCardGrid/CnCardGrid.vue +7 -0
  117. package/src/components/CnCellRenderer/CnCellRenderer.vue +56 -1
  118. package/src/components/CnCellRenderer/CnGroupNameCell.vue +61 -0
  119. package/src/components/CnCredentials/CnCredentials.vue +17 -16
  120. package/src/components/CnDataTable/CnDataTable.md +9 -0
  121. package/src/components/CnDataTable/CnDataTable.vue +80 -20
  122. package/src/components/CnDetailPage/CnDetailPage.vue +18 -32
  123. package/src/components/CnFavouriteToggle/CnFavouriteToggle.vue +7 -2
  124. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +204 -5
  125. package/src/components/CnFollowToggle/CnFollowToggle.vue +118 -13
  126. package/src/components/CnIndexPage/CnIndexPage.md +51 -0
  127. package/src/components/CnIndexPage/CnIndexPage.vue +261 -35
  128. package/src/components/CnIndexPage/selfModeActions.js +89 -13
  129. package/src/components/CnIndexPage/useSelfFetchList.js +15 -3
  130. package/src/components/CnObjectCard/CnObjectCard.md +1 -0
  131. package/src/components/CnObjectCard/CnObjectCard.vue +89 -1
  132. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +226 -2
  133. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +19 -3
  134. package/src/components/CnObjectSidebar/CnFilesTab.vue +9 -0
  135. package/src/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue +181 -38
  136. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +13 -0
  137. package/src/composables/__tests__/useObjectLock.endpoints.spec.js +83 -0
  138. package/src/composables/useListView.js +4 -0
  139. package/src/composables/useObjectLock.js +41 -10
  140. package/src/css/look-board-detail.css +40 -2
  141. package/src/css/look-board-index.css +35 -1
  142. package/src/css/table.css +82 -17
  143. package/src/index.js +3 -1
  144. package/src/schemas/app-manifest-v2.schema.json +11 -7
  145. package/src/store/plugins/interactions.js +20 -10
  146. package/src/store/useObjectStore.js +54 -9
  147. package/src/utils/builtInFormatters.js +15 -7
  148. package/src/utils/groupAutocomplete.js +75 -0
  149. package/src/utils/index.js +2 -1
  150. package/src/utils/lensAvailability.js +86 -0
  151. package/src/utils/objectSignals.js +41 -0
  152. package/src/utils/personalLenses.js +13 -6
  153. package/src/utils/recordInteractions.js +31 -13
  154. package/src/utils/resolveFilterTokens.js +45 -2
  155. package/src/utils/schema.js +1 -1
  156. package/src/utils/sentinelTokens.js +4 -4
  157. package/src/utils/validateManifestV2.compiled.js +2 -2
  158. package/src/utils/widgetVisibility.js +45 -0
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/dist/nextcloud-vue.cjs.js.map
3
- size: 38285312 bytes
4
- sha256: 91421df55f0b2ab43c1c2b9428d1808f048aa4d3a8a0909a9681e4f49b38b627
3
+ size: 38439854 bytes
4
+ sha256: 786f8e09d174b307bccce4e6dd2b99e2fb7b74a581decb90037b07c807a5c510
@@ -1490,7 +1490,10 @@
1490
1490
  }
1491
1491
 
1492
1492
  .cn-look-board .cn-index-page__main.cn-index-page__main--table {
1493
- flex: 0 1 auto;
1493
+ /* The body is a row: the card takes the width left beside a sidebar (the
1494
+ board's table card spans the content), and keeps the height of its rows. */
1495
+ flex: 1 1 auto;
1496
+ align-self: flex-start;
1494
1497
  border: 1px solid var(--color-border);
1495
1498
  border-radius: var(--cn-board-card-radius, 12px);
1496
1499
  background: var(--color-main-background);
@@ -1680,6 +1683,37 @@
1680
1683
  background: var(--color-primary-element-light);
1681
1684
  }
1682
1685
 
1686
+ /* The status accent outranks the board's border, also on hover and selection. */
1687
+ .cn-look-board .cn-object-card.cn-object-card--board.cn-object-card--accent {
1688
+ border-inline-start-width: 4px;
1689
+ padding-inline-start: 13px;
1690
+ }
1691
+
1692
+ .cn-look-board .cn-object-card.cn-object-card--board.cn-object-card--accent-success,
1693
+ .cn-look-board .cn-object-card.cn-object-card--board.cn-object-card--accent-success:hover {
1694
+ border-inline-start-color: var(--color-element-success);
1695
+ }
1696
+
1697
+ .cn-look-board .cn-object-card.cn-object-card--board.cn-object-card--accent-warning,
1698
+ .cn-look-board .cn-object-card.cn-object-card--board.cn-object-card--accent-warning:hover {
1699
+ border-inline-start-color: var(--color-element-warning);
1700
+ }
1701
+
1702
+ .cn-look-board .cn-object-card.cn-object-card--board.cn-object-card--accent-error,
1703
+ .cn-look-board .cn-object-card.cn-object-card--board.cn-object-card--accent-error:hover {
1704
+ border-inline-start-color: var(--color-element-error);
1705
+ }
1706
+
1707
+ .cn-look-board .cn-object-card.cn-object-card--board.cn-object-card--accent-info,
1708
+ .cn-look-board .cn-object-card.cn-object-card--board.cn-object-card--accent-info:hover {
1709
+ border-inline-start-color: var(--color-element-info);
1710
+ }
1711
+
1712
+ .cn-look-board .cn-object-card.cn-object-card--board.cn-object-card--accent-primary,
1713
+ .cn-look-board .cn-object-card.cn-object-card--board.cn-object-card--accent-primary:hover {
1714
+ border-inline-start-color: var(--color-primary-element);
1715
+ }
1716
+
1683
1717
  .cn-look-board .cn-object-card--board .cn-object-card__content {
1684
1718
  display: flex;
1685
1719
  flex: 1 1 auto;
@@ -2164,9 +2198,64 @@
2164
2198
  background-color: var(--color-background-hover);
2165
2199
  }
2166
2200
 
2167
- .cn-table-sort-indicator {
2168
- margin-inline-start: var(--default-grid-baseline);
2169
- opacity: 0.6;
2201
+ /* The sort control: a real button that looks like the header text, the label
2202
+ followed by a 14px chevron 4px after it (the "Wettelijke termijn" header on
2203
+ the DqWooVerzoeken board). Selector scoped under the table so it outranks
2204
+ Nextcloud's own `button` rule, which would otherwise give it a border, a
2205
+ fill, a 34px min-height and a margin. */
2206
+ .cn-data-table th .cn-table-header__sort {
2207
+ display: inline-flex;
2208
+ align-items: center;
2209
+ gap: 4px;
2210
+ max-width: 100%;
2211
+ min-width: 0;
2212
+ min-height: 0;
2213
+ margin: 0;
2214
+ padding: 0;
2215
+ border: 0;
2216
+ border-radius: var(--border-radius, 4px);
2217
+ background: transparent;
2218
+ color: inherit;
2219
+ font: inherit;
2220
+ font-weight: inherit;
2221
+ text-align: start;
2222
+ vertical-align: middle;
2223
+ cursor: pointer;
2224
+ }
2225
+
2226
+ .cn-data-table th .cn-table-header__sort:hover,
2227
+ .cn-data-table th .cn-table-header__sort:focus {
2228
+ background: transparent;
2229
+ }
2230
+
2231
+ .cn-data-table th .cn-table-header__sort:focus-visible {
2232
+ outline: 2px solid var(--color-main-text);
2233
+ outline-offset: 2px;
2234
+ }
2235
+
2236
+ .cn-data-table th .cn-table-header__sort > :first-child {
2237
+ min-width: 0;
2238
+ overflow: hidden;
2239
+ text-overflow: ellipsis;
2240
+ }
2241
+
2242
+ /* The chevron. Unsorted columns show a pale down chevron, so every sortable
2243
+ column says it sorts; the sorted column shows the direction at full text
2244
+ colour. The direction is also in the header's `aria-sort`. */
2245
+ .cn-table-header__chevron {
2246
+ display: inline-flex;
2247
+ flex: none;
2248
+ color: var(--color-main-text);
2249
+ }
2250
+
2251
+ .cn-table-header__chevron--idle {
2252
+ color: var(--color-text-maxcontrast);
2253
+ opacity: 0.5;
2254
+ }
2255
+
2256
+ .cn-data-table th.cn-table-header--sortable:hover .cn-table-header__chevron--idle,
2257
+ .cn-data-table th .cn-table-header__sort:focus-visible .cn-table-header__chevron--idle {
2258
+ opacity: 1;
2170
2259
  }
2171
2260
 
2172
2261
  /* A column carrying a `description` gets a dotted underline — the long-standing
@@ -2182,15 +2271,12 @@
2182
2271
  cursor: help;
2183
2272
  }
2184
2273
 
2185
- .cn-data-table th.cn-table-header--sortable:focus-visible {
2186
- outline: 2px solid var(--color-main-text);
2187
- outline-offset: -2px;
2188
- }
2189
-
2190
- /* Header filter button (CnDataTable `filterable`). 24px hit area with the
2191
- 16px icon; the filled icon plus the primary colour marks an active filter,
2192
- so the state never rests on colour alone. */
2193
- .cn-table-header__filter {
2274
+ /* Header filter button (CnDataTable `filterable`): a 14px funnel directly
2275
+ after the sort chevron, in a 24px hit area. Muted with no filter set; with
2276
+ a filter set it takes the dark primary and a dot, so the state never rests
2277
+ on colour alone. */
2278
+ .cn-data-table th .cn-table-header__filter {
2279
+ position: relative;
2194
2280
  display: inline-flex;
2195
2281
  align-items: center;
2196
2282
  justify-content: center;
@@ -2198,7 +2284,7 @@
2198
2284
  min-width: 24px;
2199
2285
  height: 24px;
2200
2286
  min-height: 24px;
2201
- margin: 0 0 0 4px;
2287
+ margin: 0 0 0 2px;
2202
2288
  padding: 0;
2203
2289
  border: none;
2204
2290
  border-radius: var(--border-radius, 4px);
@@ -2208,18 +2294,31 @@
2208
2294
  cursor: pointer;
2209
2295
  }
2210
2296
 
2211
- .cn-table-header__filter:hover {
2297
+ .cn-data-table th .cn-table-header__filter:hover {
2212
2298
  background-color: var(--color-background-hover);
2213
2299
  color: var(--color-main-text);
2214
2300
  }
2215
2301
 
2216
- .cn-table-header__filter:focus-visible {
2302
+ .cn-data-table th .cn-table-header__filter:focus-visible {
2217
2303
  outline: 2px solid var(--color-main-text);
2218
2304
  outline-offset: 0;
2219
2305
  }
2220
2306
 
2221
- .cn-table-header__filter--active {
2222
- color: var(--color-primary-element);
2307
+ .cn-data-table th .cn-table-header__filter--active,
2308
+ .cn-data-table th .cn-table-header__filter--active:hover {
2309
+ color: var(--color-primary-element-light-text, var(--color-primary-element));
2310
+ }
2311
+
2312
+ /* The active-filter dot, on the funnel's top right. */
2313
+ .cn-table-header__filter-dot {
2314
+ position: absolute;
2315
+ inset-block-start: 3px;
2316
+ inset-inline-end: 3px;
2317
+ width: 6px;
2318
+ height: 6px;
2319
+ border-radius: 50%;
2320
+ background-color: var(--color-primary-element);
2321
+ pointer-events: none;
2223
2322
  }
2224
2323
 
2225
2324
  /* Active header filters above the table, one removable chip each. */
@@ -5469,12 +5568,26 @@ a.cn-kpi-card--stacked:focus-visible {
5469
5568
 
5470
5569
  /* ---- Folder tabs ------------------------------------------------------- */
5471
5570
 
5571
+ /* The strip draws no line of its own (design-system pull request 147). The card under it
5572
+ carries its full border, top included, so the top-right corner is the
5573
+ card's own rounded corner instead of a strip rule running straight past it.
5574
+ The open tab overlaps that top border by 1px (the nav's -1px margin) and
5575
+ paints over it, so it flows into the card as a folder tab. */
5472
5576
  .cn-look-board .cn-tabs--board .cn-tabs__bar {
5473
- border-bottom: 1px solid var(--color-border-dark);
5577
+ border-bottom: none;
5474
5578
  gap: 4px;
5579
+ position: relative;
5475
5580
  }
5476
5581
 
5582
+ .cn-look-board .cn-tabs.cn-tabs--board .cn-tabs__bar::after {
5583
+ content: none;
5584
+ }
5585
+
5586
+ /* Tabs sit on the card's top edge; only the open tab reaches 1px further
5587
+ down (min-height 35px below), over the card's top border. Top-aligned so
5588
+ the inactive tabs do not stretch to the open tab's height. */
5477
5589
  .cn-look-board .cn-tabs--board .cn-tabs__nav {
5590
+ align-items: flex-start;
5478
5591
  gap: 4px;
5479
5592
  }
5480
5593
 
@@ -5495,7 +5608,11 @@ a.cn-kpi-card--stacked:focus-visible {
5495
5608
  border-bottom: 1px solid var(--color-main-background);
5496
5609
  border-top: 1px solid var(--color-border-dark);
5497
5610
  font-weight: 700;
5611
+ min-height: 35px;
5612
+ padding-bottom: 9px;
5498
5613
  padding-top: 8px;
5614
+ position: relative;
5615
+ z-index: 1;
5499
5616
  }
5500
5617
 
5501
5618
  /* The count: a grey, borderless 20px badge 8px after the label. */
@@ -5532,10 +5649,30 @@ a.cn-kpi-card--stacked:focus-visible {
5532
5649
  .cn-look-board .cn-tabs--board .cn-tabs__content > .cn-tab > :first-child .cn-widget-wrapper,
5533
5650
  .cn-look-board .cn-tabs--board .cn-tabs__content > .cn-tab > .cn-widget-wrapper,
5534
5651
  .cn-look-board .cn-tabs--board .cn-tabs__content > .cn-tab > .cn-detail-card {
5535
- border-top: none;
5652
+ border-top: 1px solid var(--color-border);
5536
5653
  border-radius: 0 12px 12px 12px;
5537
5654
  }
5538
5655
 
5656
+ /* A CnTabsWidget panel is the card itself: the same full border, so it joins
5657
+ the open tab the same way. The top-left stays square under the first tab. */
5658
+ .cn-look-board .cn-tabs--board.cn-tabs-widget__tabs .cn-tabs__content {
5659
+ border: 1px solid var(--color-border);
5660
+ border-radius: 0 12px 12px 12px;
5661
+ }
5662
+
5663
+ /* A panel of CnTabsWidget is the content block itself: the open tab flows
5664
+ straight into it. The widget in the panel renders chromeless, but the board
5665
+ card rule below (and the first-card rule above) used to give its wrapper a
5666
+ border and a 12px radius again, so a second card sat inside the panel. Its
5667
+ left edge ran down from the open tab and its rounded top-right drew a line
5668
+ across the top right of the content block, where DqZaak shows one sheet.
5669
+ Same specificity as the first-card rule and later, so it wins on order. */
5670
+ .cn-look-board .cn-tabs--board.cn-tabs-widget__tabs .cn-tabs__content .cn-widget-wrapper.cn-widget-wrapper--chromeless {
5671
+ background: transparent;
5672
+ border: 0;
5673
+ border-radius: 0;
5674
+ }
5675
+
5539
5676
  /* ---- Body cards and side cards ----------------------------------------- */
5540
5677
 
5541
5678
  .cn-look-board .cn-detail-page .cn-widget-wrapper,
@@ -9322,9 +9459,64 @@ svg.leaflet-image-layer.leaflet-interactive path {
9322
9459
  background-color: var(--color-background-hover);
9323
9460
  }
9324
9461
 
9325
- .cn-table-sort-indicator {
9326
- margin-inline-start: var(--default-grid-baseline);
9327
- opacity: 0.6;
9462
+ /* The sort control: a real button that looks like the header text, the label
9463
+ followed by a 14px chevron 4px after it (the "Wettelijke termijn" header on
9464
+ the DqWooVerzoeken board). Selector scoped under the table so it outranks
9465
+ Nextcloud's own `button` rule, which would otherwise give it a border, a
9466
+ fill, a 34px min-height and a margin. */
9467
+ .cn-data-table th .cn-table-header__sort {
9468
+ display: inline-flex;
9469
+ align-items: center;
9470
+ gap: 4px;
9471
+ max-width: 100%;
9472
+ min-width: 0;
9473
+ min-height: 0;
9474
+ margin: 0;
9475
+ padding: 0;
9476
+ border: 0;
9477
+ border-radius: var(--border-radius, 4px);
9478
+ background: transparent;
9479
+ color: inherit;
9480
+ font: inherit;
9481
+ font-weight: inherit;
9482
+ text-align: start;
9483
+ vertical-align: middle;
9484
+ cursor: pointer;
9485
+ }
9486
+
9487
+ .cn-data-table th .cn-table-header__sort:hover,
9488
+ .cn-data-table th .cn-table-header__sort:focus {
9489
+ background: transparent;
9490
+ }
9491
+
9492
+ .cn-data-table th .cn-table-header__sort:focus-visible {
9493
+ outline: 2px solid var(--color-main-text);
9494
+ outline-offset: 2px;
9495
+ }
9496
+
9497
+ .cn-data-table th .cn-table-header__sort > :first-child {
9498
+ min-width: 0;
9499
+ overflow: hidden;
9500
+ text-overflow: ellipsis;
9501
+ }
9502
+
9503
+ /* The chevron. Unsorted columns show a pale down chevron, so every sortable
9504
+ column says it sorts; the sorted column shows the direction at full text
9505
+ colour. The direction is also in the header's `aria-sort`. */
9506
+ .cn-table-header__chevron {
9507
+ display: inline-flex;
9508
+ flex: none;
9509
+ color: var(--color-main-text);
9510
+ }
9511
+
9512
+ .cn-table-header__chevron--idle {
9513
+ color: var(--color-text-maxcontrast);
9514
+ opacity: 0.5;
9515
+ }
9516
+
9517
+ .cn-data-table th.cn-table-header--sortable:hover .cn-table-header__chevron--idle,
9518
+ .cn-data-table th .cn-table-header__sort:focus-visible .cn-table-header__chevron--idle {
9519
+ opacity: 1;
9328
9520
  }
9329
9521
 
9330
9522
  /* A column carrying a `description` gets a dotted underline — the long-standing
@@ -9340,15 +9532,12 @@ svg.leaflet-image-layer.leaflet-interactive path {
9340
9532
  cursor: help;
9341
9533
  }
9342
9534
 
9343
- .cn-data-table th.cn-table-header--sortable:focus-visible {
9344
- outline: 2px solid var(--color-main-text);
9345
- outline-offset: -2px;
9346
- }
9347
-
9348
- /* Header filter button (CnDataTable `filterable`). 24px hit area with the
9349
- 16px icon; the filled icon plus the primary colour marks an active filter,
9350
- so the state never rests on colour alone. */
9351
- .cn-table-header__filter {
9535
+ /* Header filter button (CnDataTable `filterable`): a 14px funnel directly
9536
+ after the sort chevron, in a 24px hit area. Muted with no filter set; with
9537
+ a filter set it takes the dark primary and a dot, so the state never rests
9538
+ on colour alone. */
9539
+ .cn-data-table th .cn-table-header__filter {
9540
+ position: relative;
9352
9541
  display: inline-flex;
9353
9542
  align-items: center;
9354
9543
  justify-content: center;
@@ -9356,7 +9545,7 @@ svg.leaflet-image-layer.leaflet-interactive path {
9356
9545
  min-width: 24px;
9357
9546
  height: 24px;
9358
9547
  min-height: 24px;
9359
- margin: 0 0 0 4px;
9548
+ margin: 0 0 0 2px;
9360
9549
  padding: 0;
9361
9550
  border: none;
9362
9551
  border-radius: var(--border-radius, 4px);
@@ -9366,18 +9555,31 @@ svg.leaflet-image-layer.leaflet-interactive path {
9366
9555
  cursor: pointer;
9367
9556
  }
9368
9557
 
9369
- .cn-table-header__filter:hover {
9558
+ .cn-data-table th .cn-table-header__filter:hover {
9370
9559
  background-color: var(--color-background-hover);
9371
9560
  color: var(--color-main-text);
9372
9561
  }
9373
9562
 
9374
- .cn-table-header__filter:focus-visible {
9563
+ .cn-data-table th .cn-table-header__filter:focus-visible {
9375
9564
  outline: 2px solid var(--color-main-text);
9376
9565
  outline-offset: 0;
9377
9566
  }
9378
9567
 
9379
- .cn-table-header__filter--active {
9380
- color: var(--color-primary-element);
9568
+ .cn-data-table th .cn-table-header__filter--active,
9569
+ .cn-data-table th .cn-table-header__filter--active:hover {
9570
+ color: var(--color-primary-element-light-text, var(--color-primary-element));
9571
+ }
9572
+
9573
+ /* The active-filter dot, on the funnel's top right. */
9574
+ .cn-table-header__filter-dot {
9575
+ position: absolute;
9576
+ inset-block-start: 3px;
9577
+ inset-inline-end: 3px;
9578
+ width: 6px;
9579
+ height: 6px;
9580
+ border-radius: 50%;
9581
+ background-color: var(--color-primary-element);
9582
+ pointer-events: none;
9381
9583
  }
9382
9584
 
9383
9585
  /* Active header filters above the table, one removable chip each. */
@@ -14154,12 +14356,55 @@ button.cn-files-card__open[data-v-46f7e3c9]:hover {
14154
14356
  flex-direction: column;
14155
14357
  gap: 8px;
14156
14358
  min-width: 0;
14359
+ position: relative;
14157
14360
  border-radius: var(--border-radius-large, 8px);
14158
14361
  }
14159
14362
  .cn-files-browser--dragging[data-v-f5bdd9e2] {
14160
14363
  outline: 2px dashed var(--color-primary-element);
14161
14364
  outline-offset: 4px;
14162
14365
  }
14366
+ .cn-files-browser__drop-overlay[data-v-f5bdd9e2] {
14367
+ position: absolute;
14368
+ inset: 0;
14369
+ z-index: 2;
14370
+ display: flex;
14371
+ flex-direction: column;
14372
+ align-items: center;
14373
+ justify-content: center;
14374
+ gap: 10px;
14375
+ padding: 24px;
14376
+ box-sizing: border-box;
14377
+ border: 2px dashed var(--color-primary-element);
14378
+ border-radius: var(--border-radius-large, 8px);
14379
+ background: var(--color-primary-element-light);
14380
+ color: var(--color-primary-element-light-text, var(--color-main-text));
14381
+ text-align: center;
14382
+ pointer-events: none;
14383
+ }
14384
+ .cn-files-browser__drop-icon[data-v-f5bdd9e2] {
14385
+ display: flex;
14386
+ align-items: center;
14387
+ justify-content: center;
14388
+ width: 56px;
14389
+ height: 56px;
14390
+ border-radius: 50%;
14391
+ background: var(--color-main-background);
14392
+ color: var(--color-primary-element);
14393
+ }
14394
+ .cn-files-browser__drop-label[data-v-f5bdd9e2] {
14395
+ font-size: 20px;
14396
+ font-weight: 700;
14397
+ }
14398
+ .cn-files-browser__drop-hint[data-v-f5bdd9e2] {
14399
+ display: flex;
14400
+ align-items: center;
14401
+ gap: 8px;
14402
+ margin: 0;
14403
+ padding-top: 12px;
14404
+ border-top: 1px solid var(--color-border);
14405
+ font-size: 13px;
14406
+ color: var(--color-text-maxcontrast);
14407
+ }
14163
14408
  .cn-files-browser__bar[data-v-f5bdd9e2] {
14164
14409
  display: flex;
14165
14410
  align-items: center;
@@ -19425,6 +19670,18 @@ a.cn-xwiki-card__title[data-v-54e85fe3]:hover {
19425
19670
  color: var(--color-text-maxcontrast);
19426
19671
  font-style: italic;
19427
19672
  }
19673
+ .cn-related-objects-widget__section-status[data-v-44c2988f] {
19674
+ margin: 0;
19675
+ padding: var(--default-grid-baseline, 4px) calc(2 * var(--default-grid-baseline, 4px));
19676
+ color: var(--color-text-maxcontrast);
19677
+ font-size: 0.85em;
19678
+ }
19679
+ .cn-related-objects-widget__section-error[data-v-44c2988f] {
19680
+ margin: 0;
19681
+ padding: var(--default-grid-baseline, 4px) calc(2 * var(--default-grid-baseline, 4px));
19682
+ color: var(--color-error-text, var(--color-error));
19683
+ font-size: 0.85em;
19684
+ }
19428
19685
  .cn-related-objects-widget__empty-state[data-v-44c2988f] {
19429
19686
  /* NcEmptyContent defaults to filling tall parents; inside a widget cell a
19430
19687
  compact block reads better. */
@@ -22090,6 +22347,47 @@ to { background-position: -200% 0;
22090
22347
  border-color: var(--color-primary-element);
22091
22348
  background: var(--color-primary-element-light);
22092
22349
  }
22350
+
22351
+ /* The 4px start border takes 3px of padding, so the content stays put. */
22352
+ .cn-object-card.cn-object-card--accent[data-v-6f672c8f] {
22353
+ border-inline-start-width: 4px;
22354
+ padding-inline-start: 13px;
22355
+ }
22356
+ .cn-object-card.cn-object-card--accent-success[data-v-6f672c8f] {
22357
+ border-inline-start-color: var(--color-element-success);
22358
+ }
22359
+ .cn-object-card.cn-object-card--accent-warning[data-v-6f672c8f] {
22360
+ border-inline-start-color: var(--color-element-warning);
22361
+ }
22362
+ .cn-object-card.cn-object-card--accent-error[data-v-6f672c8f] {
22363
+ border-inline-start-color: var(--color-element-error);
22364
+ }
22365
+ .cn-object-card.cn-object-card--accent-info[data-v-6f672c8f] {
22366
+ border-inline-start-color: var(--color-element-info);
22367
+ }
22368
+ .cn-object-card.cn-object-card--accent-primary[data-v-6f672c8f] {
22369
+ border-inline-start-color: var(--color-primary-element);
22370
+ }
22371
+ .cn-object-card__accent-icon[data-v-6f672c8f] {
22372
+ display: inline-flex;
22373
+ vertical-align: -2px;
22374
+ margin-inline-end: 4px;
22375
+ }
22376
+ .cn-object-card--accent-success .cn-object-card__accent-icon[data-v-6f672c8f] {
22377
+ color: var(--color-text-success);
22378
+ }
22379
+ .cn-object-card--accent-warning .cn-object-card__accent-icon[data-v-6f672c8f] {
22380
+ color: var(--color-text-warning);
22381
+ }
22382
+ .cn-object-card--accent-error .cn-object-card__accent-icon[data-v-6f672c8f] {
22383
+ color: var(--color-text-error);
22384
+ }
22385
+ .cn-object-card--accent-info .cn-object-card__accent-icon[data-v-6f672c8f] {
22386
+ color: var(--color-element-info);
22387
+ }
22388
+ .cn-object-card--accent-primary .cn-object-card__accent-icon[data-v-6f672c8f] {
22389
+ color: var(--color-primary-element);
22390
+ }
22093
22391
  .cn-object-card__checkbox[data-v-6f672c8f] {
22094
22392
  flex-shrink: 0;
22095
22393
  padding-top: 2px;
@@ -32006,8 +32304,42 @@ button.cn-object-calendar__overflow[data-v-bea31862] {
32006
32304
  }
32007
32305
 
32008
32306
 
32009
- .cn-favourite-toggle__star[data-v-836dad16] {
32010
- color: var(--color-warning);
32307
+ .cn-follow-toggle[data-v-eec896e2] {
32308
+ display: inline-flex;
32309
+ align-items: center;
32310
+ gap: 4px;
32311
+ }
32312
+ .cn-follow-toggle__on[data-v-eec896e2] {
32313
+ color: var(--color-primary-element);
32314
+ }
32315
+ .cn-follow-toggle__popover[data-v-eec896e2] {
32316
+ min-width: 260px;
32317
+ padding: 12px;
32318
+ }
32319
+ .cn-follow-toggle__list[data-v-eec896e2] {
32320
+ list-style: none;
32321
+ margin: 0 0 8px;
32322
+ padding: 0;
32323
+ }
32324
+ .cn-follow-toggle__row[data-v-eec896e2] {
32325
+ display: flex;
32326
+ align-items: center;
32327
+ gap: 8px;
32328
+ padding: 4px 0;
32329
+ }
32330
+ .cn-follow-toggle__who[data-v-eec896e2] {
32331
+ display: flex;
32332
+ flex-direction: column;
32333
+ flex: 1 1 auto;
32334
+ min-width: 0;
32335
+ }
32336
+ .cn-follow-toggle__since[data-v-eec896e2] {
32337
+ color: var(--color-text-maxcontrast);
32338
+ font-size: var(--font-size-small, 13px);
32339
+ }
32340
+ .cn-follow-toggle__error[data-v-eec896e2] {
32341
+ margin: 8px 0 0;
32342
+ color: var(--color-error-text);
32011
32343
  }
32012
32344
 
32013
32345
 
@@ -34152,42 +34484,6 @@ button.cn-object-calendar__overflow[data-v-bea31862] {
34152
34484
  }
34153
34485
 
34154
34486
 
34155
- .cn-follow-toggle[data-v-eec896e2] {
34156
- display: inline-flex;
34157
- align-items: center;
34158
- gap: 4px;
34159
- }
34160
- .cn-follow-toggle__popover[data-v-eec896e2] {
34161
- min-width: 260px;
34162
- padding: 12px;
34163
- }
34164
- .cn-follow-toggle__list[data-v-eec896e2] {
34165
- list-style: none;
34166
- margin: 0 0 8px;
34167
- padding: 0;
34168
- }
34169
- .cn-follow-toggle__row[data-v-eec896e2] {
34170
- display: flex;
34171
- align-items: center;
34172
- gap: 8px;
34173
- padding: 4px 0;
34174
- }
34175
- .cn-follow-toggle__who[data-v-eec896e2] {
34176
- display: flex;
34177
- flex-direction: column;
34178
- flex: 1 1 auto;
34179
- min-width: 0;
34180
- }
34181
- .cn-follow-toggle__since[data-v-eec896e2] {
34182
- color: var(--color-text-maxcontrast);
34183
- font-size: var(--font-size-small, 13px);
34184
- }
34185
- .cn-follow-toggle__error[data-v-eec896e2] {
34186
- margin: 8px 0 0;
34187
- color: var(--color-error-text);
34188
- }
34189
-
34190
-
34191
34487
  .cn-lifecycle-actions[data-v-a62ad362] {
34192
34488
  display: flex;
34193
34489
  flex-wrap: wrap;
@@ -35861,6 +36157,11 @@ button.cn-object-calendar__overflow[data-v-bea31862] {
35861
36157
  }
35862
36158
 
35863
36159
 
36160
+ .cn-favourite-toggle__star[data-v-836dad16] {
36161
+ color: var(--color-warning);
36162
+ }
36163
+
36164
+
35864
36165
  .cn-journey-review-list__items[data-v-d3c04832] {
35865
36166
  list-style: none;
35866
36167
  margin: 8px 0 0;
package/l10n/en.json CHANGED
@@ -1,5 +1,10 @@
1
1
  {
2
2
  "translations": {
3
+ "Linked items": "Linked items",
4
+ "Still loading: {sections}": "Still loading: {sections}",
5
+ "Could not load {section}.": "Could not load {section}.",
6
+ "Organisation credentials let apps act for your organisation. Keepiq, the credential vault of Nextcloud, keeps the secret. The app never holds it. You choose which apps may use each credential.": "Organisation credentials let apps act for your organisation. Keepiq, the credential vault of Nextcloud, keeps the secret. The app never holds it. You choose which apps may use each credential.",
7
+ "Apps sometimes act for you on an external service. You give the secret to Nextcloud once, and Keepiq keeps it in an encrypted vault. Apps make the call through Keepiq and never see the secret. You choose which apps may use each credential. Share one across apps, or keep one per app.": "Apps sometimes act for you on an external service. You give the secret to Nextcloud once, and Keepiq keeps it in an encrypted vault. Apps make the call through Keepiq and never see the secret. You choose which apps may use each credential. Share one across apps, or keep one per app.",
3
8
  "Show as": "Show as",
4
9
  "Board": "Board",
5
10
  "Calendar": "Calendar",
@@ -1284,7 +1289,20 @@
1284
1289
  "Development environment": "Development environment",
1285
1290
  "Test environment": "Test environment",
1286
1291
  "Acceptance environment": "Acceptance environment",
1287
- "About {label}": "About {label}"
1292
+ "About {label}": "About {label}",
1293
+ "Could not load the form for this item.": "Could not load the form for this item.",
1294
+ "Drop to add": "Drop to add",
1295
+ "Or drag files onto this list.": "Or drag files onto this list.",
1296
+ "This server does not keep track of what you open.": "This server does not keep track of what you open.",
1297
+ "Log in to see what you opened recently.": "Log in to see what you opened recently.",
1298
+ "Your recent items are not available right now.": "Your recent items are not available right now.",
1299
+ "yesterday": "yesterday",
1300
+ "tomorrow": "tomorrow",
1301
+ "Filter by {column}": "Filter by {column}",
1302
+ "Filter by {column}, active": "Filter by {column}, active",
1303
+ "Turn notifications off": "Turn notifications off",
1304
+ "Turn notifications on": "Turn notifications on",
1305
+ "Could not change notifications.": "Could not change notifications."
1288
1306
  },
1289
1307
  "plurals": {
1290
1308
  "%n year": [
@@ -1338,6 +1356,18 @@
1338
1356
  "You see {count} capability of {total}.": [
1339
1357
  "You see {count} capability of {total}.",
1340
1358
  "You see {count} capabilities of {total}."
1359
+ ],
1360
+ "%n file added": [
1361
+ "%n file added",
1362
+ "%n files added"
1363
+ ],
1364
+ "{count} day ago": [
1365
+ "{count} day ago",
1366
+ "{count} days ago"
1367
+ ],
1368
+ "in {count} day": [
1369
+ "in {count} day",
1370
+ "in {count} days"
1341
1371
  ]
1342
1372
  }
1343
1373
  }