@conduction/nextcloud-vue 2.56.0-beta.26 → 2.56.0-beta.27

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 (119) 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/CnCellRenderer/CnCellRenderer.vue2.js +42 -1
  6. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  7. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +228 -203
  8. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  9. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue.js +9 -0
  10. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue.js.map +1 -0
  11. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue2.js +50 -0
  12. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue2.js.map +1 -0
  13. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue3.js +13 -0
  14. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue3.js.map +1 -0
  15. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +41 -4
  16. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  17. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +90 -51
  18. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  19. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +16 -28
  20. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  21. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +12 -24
  22. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  23. package/dist/esm/components/CnFavouriteToggle/CnFavouriteToggle.vue2.js +7 -2
  24. package/dist/esm/components/CnFavouriteToggle/CnFavouriteToggle.vue2.js.map +1 -1
  25. package/dist/esm/components/CnFavouriteToggle/CnFavouriteToggle.vue3.js.map +1 -1
  26. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +114 -1
  27. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  28. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +115 -62
  29. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  30. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue2.js +89 -7
  31. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue2.js.map +1 -1
  32. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue3.js +62 -30
  33. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue3.js.map +1 -1
  34. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +98 -13
  35. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  36. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +13 -9
  37. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  38. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +199 -7
  39. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  40. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js +155 -119
  41. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  42. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +6 -0
  43. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  44. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +4 -1
  45. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  46. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +13 -0
  47. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  48. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  49. package/dist/esm/composables/useListView.js +4 -0
  50. package/dist/esm/composables/useListView.js.map +1 -1
  51. package/dist/esm/index.js +2 -1
  52. package/dist/esm/index.js.map +1 -1
  53. package/dist/esm/l10n/en.json.js +25 -1
  54. package/dist/esm/l10n/en.json.js.map +1 -1
  55. package/dist/esm/l10n/nl.json.js +25 -1
  56. package/dist/esm/l10n/nl.json.js.map +1 -1
  57. package/dist/esm/nextcloud-vue.css +288 -74
  58. package/dist/esm/store/plugins/interactions.js +20 -10
  59. package/dist/esm/store/plugins/interactions.js.map +1 -1
  60. package/dist/esm/store/useObjectStore.js +17 -0
  61. package/dist/esm/store/useObjectStore.js.map +1 -1
  62. package/dist/esm/utils/builtInFormatters.js +15 -7
  63. package/dist/esm/utils/builtInFormatters.js.map +1 -1
  64. package/dist/esm/utils/groupAutocomplete.js +63 -1
  65. package/dist/esm/utils/groupAutocomplete.js.map +1 -1
  66. package/dist/esm/utils/lensAvailability.js +90 -0
  67. package/dist/esm/utils/lensAvailability.js.map +1 -0
  68. package/dist/esm/utils/personalLenses.js +13 -6
  69. package/dist/esm/utils/personalLenses.js.map +1 -1
  70. package/dist/esm/utils/recordInteractions.js +31 -13
  71. package/dist/esm/utils/recordInteractions.js.map +1 -1
  72. package/dist/esm/utils/resolveFilterTokens.js +46 -3
  73. package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
  74. package/dist/esm/utils/schema.js +1 -1
  75. package/dist/esm/utils/schema.js.map +1 -1
  76. package/dist/esm/utils/sentinelTokens.js +4 -4
  77. package/dist/esm/utils/sentinelTokens.js.map +1 -1
  78. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  79. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  80. package/dist/esm/utils/widgetVisibility.js +46 -1
  81. package/dist/esm/utils/widgetVisibility.js.map +1 -1
  82. package/dist/nextcloud-vue.cjs.js +3873 -2674
  83. package/dist/nextcloud-vue.cjs.js.map +2 -2
  84. package/dist/nextcloud-vue.css +288 -74
  85. package/l10n/en.json +25 -1
  86. package/l10n/nl.json +25 -1
  87. package/package.json +1 -1
  88. package/src/components/CnAppNav/CnAppNav.vue +44 -5
  89. package/src/components/CnCellRenderer/CnCellRenderer.vue +56 -1
  90. package/src/components/CnCellRenderer/CnGroupNameCell.vue +61 -0
  91. package/src/components/CnDataTable/CnDataTable.md +9 -0
  92. package/src/components/CnDataTable/CnDataTable.vue +80 -20
  93. package/src/components/CnDetailPage/CnDetailPage.vue +10 -27
  94. package/src/components/CnFavouriteToggle/CnFavouriteToggle.vue +7 -2
  95. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +204 -5
  96. package/src/components/CnFollowToggle/CnFollowToggle.vue +118 -13
  97. package/src/components/CnIndexPage/CnIndexPage.md +36 -0
  98. package/src/components/CnIndexPage/CnIndexPage.vue +106 -19
  99. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +226 -2
  100. package/src/components/CnObjectSidebar/CnFilesTab.vue +9 -0
  101. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +13 -0
  102. package/src/composables/useListView.js +4 -0
  103. package/src/css/look-board-detail.css +40 -2
  104. package/src/css/table.css +82 -17
  105. package/src/index.js +2 -1
  106. package/src/schemas/app-manifest-v2.schema.json +11 -7
  107. package/src/store/plugins/interactions.js +20 -10
  108. package/src/store/useObjectStore.js +17 -0
  109. package/src/utils/builtInFormatters.js +15 -7
  110. package/src/utils/groupAutocomplete.js +75 -0
  111. package/src/utils/index.js +1 -1
  112. package/src/utils/lensAvailability.js +86 -0
  113. package/src/utils/personalLenses.js +13 -6
  114. package/src/utils/recordInteractions.js +31 -13
  115. package/src/utils/resolveFilterTokens.js +45 -2
  116. package/src/utils/schema.js +1 -1
  117. package/src/utils/sentinelTokens.js +4 -4
  118. package/src/utils/validateManifestV2.compiled.js +2 -2
  119. 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: 38337896 bytes
4
- sha256: a7d0d4bb2ccffd14adbe47978a666f89a6e3b1376dfecb854356280ac6440360
3
+ size: 38439854 bytes
4
+ sha256: 786f8e09d174b307bccce4e6dd2b99e2fb7b74a581decb90037b07c807a5c510
@@ -2198,9 +2198,64 @@
2198
2198
  background-color: var(--color-background-hover);
2199
2199
  }
2200
2200
 
2201
- .cn-table-sort-indicator {
2202
- margin-inline-start: var(--default-grid-baseline);
2203
- 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;
2204
2259
  }
2205
2260
 
2206
2261
  /* A column carrying a `description` gets a dotted underline — the long-standing
@@ -2216,15 +2271,12 @@
2216
2271
  cursor: help;
2217
2272
  }
2218
2273
 
2219
- .cn-data-table th.cn-table-header--sortable:focus-visible {
2220
- outline: 2px solid var(--color-main-text);
2221
- outline-offset: -2px;
2222
- }
2223
-
2224
- /* Header filter button (CnDataTable `filterable`). 24px hit area with the
2225
- 16px icon; the filled icon plus the primary colour marks an active filter,
2226
- so the state never rests on colour alone. */
2227
- .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;
2228
2280
  display: inline-flex;
2229
2281
  align-items: center;
2230
2282
  justify-content: center;
@@ -2232,7 +2284,7 @@
2232
2284
  min-width: 24px;
2233
2285
  height: 24px;
2234
2286
  min-height: 24px;
2235
- margin: 0 0 0 4px;
2287
+ margin: 0 0 0 2px;
2236
2288
  padding: 0;
2237
2289
  border: none;
2238
2290
  border-radius: var(--border-radius, 4px);
@@ -2242,18 +2294,31 @@
2242
2294
  cursor: pointer;
2243
2295
  }
2244
2296
 
2245
- .cn-table-header__filter:hover {
2297
+ .cn-data-table th .cn-table-header__filter:hover {
2246
2298
  background-color: var(--color-background-hover);
2247
2299
  color: var(--color-main-text);
2248
2300
  }
2249
2301
 
2250
- .cn-table-header__filter:focus-visible {
2302
+ .cn-data-table th .cn-table-header__filter:focus-visible {
2251
2303
  outline: 2px solid var(--color-main-text);
2252
2304
  outline-offset: 0;
2253
2305
  }
2254
2306
 
2255
- .cn-table-header__filter--active {
2256
- 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;
2257
2322
  }
2258
2323
 
2259
2324
  /* Active header filters above the table, one removable chip each. */
@@ -5503,12 +5568,26 @@ a.cn-kpi-card--stacked:focus-visible {
5503
5568
 
5504
5569
  /* ---- Folder tabs ------------------------------------------------------- */
5505
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. */
5506
5576
  .cn-look-board .cn-tabs--board .cn-tabs__bar {
5507
- border-bottom: 1px solid var(--color-border-dark);
5577
+ border-bottom: none;
5508
5578
  gap: 4px;
5579
+ position: relative;
5509
5580
  }
5510
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. */
5511
5589
  .cn-look-board .cn-tabs--board .cn-tabs__nav {
5590
+ align-items: flex-start;
5512
5591
  gap: 4px;
5513
5592
  }
5514
5593
 
@@ -5529,7 +5608,11 @@ a.cn-kpi-card--stacked:focus-visible {
5529
5608
  border-bottom: 1px solid var(--color-main-background);
5530
5609
  border-top: 1px solid var(--color-border-dark);
5531
5610
  font-weight: 700;
5611
+ min-height: 35px;
5612
+ padding-bottom: 9px;
5532
5613
  padding-top: 8px;
5614
+ position: relative;
5615
+ z-index: 1;
5533
5616
  }
5534
5617
 
5535
5618
  /* The count: a grey, borderless 20px badge 8px after the label. */
@@ -5566,10 +5649,30 @@ a.cn-kpi-card--stacked:focus-visible {
5566
5649
  .cn-look-board .cn-tabs--board .cn-tabs__content > .cn-tab > :first-child .cn-widget-wrapper,
5567
5650
  .cn-look-board .cn-tabs--board .cn-tabs__content > .cn-tab > .cn-widget-wrapper,
5568
5651
  .cn-look-board .cn-tabs--board .cn-tabs__content > .cn-tab > .cn-detail-card {
5569
- border-top: none;
5652
+ border-top: 1px solid var(--color-border);
5653
+ border-radius: 0 12px 12px 12px;
5654
+ }
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);
5570
5660
  border-radius: 0 12px 12px 12px;
5571
5661
  }
5572
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
+
5573
5676
  /* ---- Body cards and side cards ----------------------------------------- */
5574
5677
 
5575
5678
  .cn-look-board .cn-detail-page .cn-widget-wrapper,
@@ -9356,9 +9459,64 @@ svg.leaflet-image-layer.leaflet-interactive path {
9356
9459
  background-color: var(--color-background-hover);
9357
9460
  }
9358
9461
 
9359
- .cn-table-sort-indicator {
9360
- margin-inline-start: var(--default-grid-baseline);
9361
- 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;
9362
9520
  }
9363
9521
 
9364
9522
  /* A column carrying a `description` gets a dotted underline — the long-standing
@@ -9374,15 +9532,12 @@ svg.leaflet-image-layer.leaflet-interactive path {
9374
9532
  cursor: help;
9375
9533
  }
9376
9534
 
9377
- .cn-data-table th.cn-table-header--sortable:focus-visible {
9378
- outline: 2px solid var(--color-main-text);
9379
- outline-offset: -2px;
9380
- }
9381
-
9382
- /* Header filter button (CnDataTable `filterable`). 24px hit area with the
9383
- 16px icon; the filled icon plus the primary colour marks an active filter,
9384
- so the state never rests on colour alone. */
9385
- .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;
9386
9541
  display: inline-flex;
9387
9542
  align-items: center;
9388
9543
  justify-content: center;
@@ -9390,7 +9545,7 @@ svg.leaflet-image-layer.leaflet-interactive path {
9390
9545
  min-width: 24px;
9391
9546
  height: 24px;
9392
9547
  min-height: 24px;
9393
- margin: 0 0 0 4px;
9548
+ margin: 0 0 0 2px;
9394
9549
  padding: 0;
9395
9550
  border: none;
9396
9551
  border-radius: var(--border-radius, 4px);
@@ -9400,18 +9555,31 @@ svg.leaflet-image-layer.leaflet-interactive path {
9400
9555
  cursor: pointer;
9401
9556
  }
9402
9557
 
9403
- .cn-table-header__filter:hover {
9558
+ .cn-data-table th .cn-table-header__filter:hover {
9404
9559
  background-color: var(--color-background-hover);
9405
9560
  color: var(--color-main-text);
9406
9561
  }
9407
9562
 
9408
- .cn-table-header__filter:focus-visible {
9563
+ .cn-data-table th .cn-table-header__filter:focus-visible {
9409
9564
  outline: 2px solid var(--color-main-text);
9410
9565
  outline-offset: 0;
9411
9566
  }
9412
9567
 
9413
- .cn-table-header__filter--active {
9414
- 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;
9415
9583
  }
9416
9584
 
9417
9585
  /* Active header filters above the table, one removable chip each. */
@@ -14188,12 +14356,55 @@ button.cn-files-card__open[data-v-46f7e3c9]:hover {
14188
14356
  flex-direction: column;
14189
14357
  gap: 8px;
14190
14358
  min-width: 0;
14359
+ position: relative;
14191
14360
  border-radius: var(--border-radius-large, 8px);
14192
14361
  }
14193
14362
  .cn-files-browser--dragging[data-v-f5bdd9e2] {
14194
14363
  outline: 2px dashed var(--color-primary-element);
14195
14364
  outline-offset: 4px;
14196
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
+ }
14197
14408
  .cn-files-browser__bar[data-v-f5bdd9e2] {
14198
14409
  display: flex;
14199
14410
  align-items: center;
@@ -32093,8 +32304,42 @@ button.cn-object-calendar__overflow[data-v-bea31862] {
32093
32304
  }
32094
32305
 
32095
32306
 
32096
- .cn-favourite-toggle__star[data-v-836dad16] {
32097
- 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);
32098
32343
  }
32099
32344
 
32100
32345
 
@@ -34239,42 +34484,6 @@ button.cn-object-calendar__overflow[data-v-bea31862] {
34239
34484
  }
34240
34485
 
34241
34486
 
34242
- .cn-follow-toggle[data-v-eec896e2] {
34243
- display: inline-flex;
34244
- align-items: center;
34245
- gap: 4px;
34246
- }
34247
- .cn-follow-toggle__popover[data-v-eec896e2] {
34248
- min-width: 260px;
34249
- padding: 12px;
34250
- }
34251
- .cn-follow-toggle__list[data-v-eec896e2] {
34252
- list-style: none;
34253
- margin: 0 0 8px;
34254
- padding: 0;
34255
- }
34256
- .cn-follow-toggle__row[data-v-eec896e2] {
34257
- display: flex;
34258
- align-items: center;
34259
- gap: 8px;
34260
- padding: 4px 0;
34261
- }
34262
- .cn-follow-toggle__who[data-v-eec896e2] {
34263
- display: flex;
34264
- flex-direction: column;
34265
- flex: 1 1 auto;
34266
- min-width: 0;
34267
- }
34268
- .cn-follow-toggle__since[data-v-eec896e2] {
34269
- color: var(--color-text-maxcontrast);
34270
- font-size: var(--font-size-small, 13px);
34271
- }
34272
- .cn-follow-toggle__error[data-v-eec896e2] {
34273
- margin: 8px 0 0;
34274
- color: var(--color-error-text);
34275
- }
34276
-
34277
-
34278
34487
  .cn-lifecycle-actions[data-v-a62ad362] {
34279
34488
  display: flex;
34280
34489
  flex-wrap: wrap;
@@ -35948,6 +36157,11 @@ button.cn-object-calendar__overflow[data-v-bea31862] {
35948
36157
  }
35949
36158
 
35950
36159
 
36160
+ .cn-favourite-toggle__star[data-v-836dad16] {
36161
+ color: var(--color-warning);
36162
+ }
36163
+
36164
+
35951
36165
  .cn-journey-review-list__items[data-v-d3c04832] {
35952
36166
  list-style: none;
35953
36167
  margin: 8px 0 0;
package/l10n/en.json CHANGED
@@ -1290,7 +1290,19 @@
1290
1290
  "Test environment": "Test environment",
1291
1291
  "Acceptance environment": "Acceptance environment",
1292
1292
  "About {label}": "About {label}",
1293
- "Could not load the form for this item.": "Could not load the form for this item."
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."
1294
1306
  },
1295
1307
  "plurals": {
1296
1308
  "%n year": [
@@ -1344,6 +1356,18 @@
1344
1356
  "You see {count} capability of {total}.": [
1345
1357
  "You see {count} capability of {total}.",
1346
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"
1347
1371
  ]
1348
1372
  }
1349
1373
  }
package/l10n/nl.json CHANGED
@@ -1341,7 +1341,19 @@
1341
1341
  "Test environment": "Testomgeving",
1342
1342
  "Acceptance environment": "Acceptatieomgeving",
1343
1343
  "About {label}": "Over {label}",
1344
- "Could not load the form for this item.": "Kon het formulier voor dit item niet laden."
1344
+ "Could not load the form for this item.": "Kon het formulier voor dit item niet laden.",
1345
+ "Drop to add": "Laat los om toe te voegen",
1346
+ "Or drag files onto this list.": "Of sleep bestanden op deze lijst.",
1347
+ "This server does not keep track of what you open.": "Deze server houdt niet bij welke items je opent.",
1348
+ "Log in to see what you opened recently.": "Log in om te zien wat je onlangs opende.",
1349
+ "Your recent items are not available right now.": "Je recente items zijn nu niet beschikbaar.",
1350
+ "yesterday": "gisteren",
1351
+ "tomorrow": "morgen",
1352
+ "Filter by {column}": "Filteren op {column}",
1353
+ "Filter by {column}, active": "Filteren op {column}, actief",
1354
+ "Turn notifications off": "Meldingen uitzetten",
1355
+ "Turn notifications on": "Meldingen aanzetten",
1356
+ "Could not change notifications.": "Meldingen konden niet worden gewijzigd."
1345
1357
  },
1346
1358
  "plurals": {
1347
1359
  "%n year": [
@@ -1395,6 +1407,18 @@
1395
1407
  "You see {count} capability of {total}.": [
1396
1408
  "Je ziet {count} functionaliteit van {total}.",
1397
1409
  "Je ziet {count} functionaliteiten van {total}."
1410
+ ],
1411
+ "%n file added": [
1412
+ "%n bestand toegevoegd",
1413
+ "%n bestanden toegevoegd"
1414
+ ],
1415
+ "{count} day ago": [
1416
+ "{count} dag geleden",
1417
+ "{count} dagen geleden"
1418
+ ],
1419
+ "in {count} day": [
1420
+ "over {count} dag",
1421
+ "over {count} dagen"
1398
1422
  ]
1399
1423
  }
1400
1424
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@conduction/nextcloud-vue",
3
- "version": "2.56.0-beta.26",
3
+ "version": "2.56.0-beta.27",
4
4
  "description": "Shared Vue component library for Conduction Nextcloud apps — complements @nextcloud/vue with higher-level components, OpenRegister integration, and NL Design System support",
5
5
  "homepage": "https://github.com/ConductionNL/nextcloud-vue#readme",
6
6
  "bugs": {
@@ -183,7 +183,19 @@
183
183
  v-if="isCaption(item)"
184
184
  :key="item.id"
185
185
  :name="resolveLabel(item)"
186
- :data-testid="`cn-nav-caption-${item.id}`" />
186
+ :data-testid="`cn-nav-caption-${item.id}`">
187
+ <template v-if="item.href" #actions>
188
+ <NcActionLink
189
+ :href="item.href"
190
+ :aria-label="captionEditLabel(item)"
191
+ :data-testid="`cn-nav-caption-edit-${item.id}`">
192
+ <template #icon>
193
+ <Pencil :size="20" />
194
+ </template>
195
+ {{ captionEditLabel(item) }}
196
+ </NcActionLink>
197
+ </template>
198
+ </NcAppNavigationCaption>
187
199
  <NcAppNavigationItem
188
200
  v-else
189
201
  :key="item.id"
@@ -424,7 +436,19 @@
424
436
  v-if="isCaption(item)"
425
437
  :key="item.id"
426
438
  :name="resolveLabel(item)"
427
- :data-testid="`cn-nav-caption-${item.id}`" />
439
+ :data-testid="`cn-nav-caption-${item.id}`">
440
+ <template v-if="item.href" #actions>
441
+ <NcActionLink
442
+ :href="item.href"
443
+ :aria-label="captionEditLabel(item)"
444
+ :data-testid="`cn-nav-caption-edit-${item.id}`">
445
+ <template #icon>
446
+ <Pencil :size="20" />
447
+ </template>
448
+ {{ captionEditLabel(item) }}
449
+ </NcActionLink>
450
+ </template>
451
+ </NcAppNavigationCaption>
428
452
  <NcAppNavigationItem
429
453
  v-else
430
454
  :key="item.id"
@@ -466,7 +490,7 @@
466
490
  <script>
467
491
  import { translate as t } from '@nextcloud/l10n'
468
492
  import { generateUrl } from '@nextcloud/router'
469
- import { NcAppNavigation, NcAppNavigationCaption, NcAppNavigationItem, NcAppNavigationList, NcAppNavigationNew, NcAppNavigationSettings, NcButton, NcCounterBubble } from '@nextcloud/vue'
493
+ import { NcActionLink, NcAppNavigation, NcAppNavigationCaption, NcAppNavigationItem, NcAppNavigationList, NcAppNavigationNew, NcAppNavigationSettings, NcButton, NcCounterBubble } from '@nextcloud/vue'
470
494
  import { toRaw } from 'vue'
471
495
  import BookOpenVariant from 'vue-material-design-icons/BookOpenVariant.vue'
472
496
  import Cog from 'vue-material-design-icons/Cog.vue'
@@ -474,6 +498,7 @@ import Cog from 'vue-material-design-icons/Cog.vue'
474
498
  import HelpCircleOutline from 'vue-material-design-icons/HelpCircleOutline.vue'
475
499
  import MapMarkerPath from 'vue-material-design-icons/MapMarkerPath.vue'
476
500
  import OpenInNew from 'vue-material-design-icons/OpenInNew.vue'
501
+ import Pencil from 'vue-material-design-icons/Pencil.vue'
477
502
  import Plus from 'vue-material-design-icons/Plus.vue'
478
503
  import ShieldAccountOutline from 'vue-material-design-icons/ShieldAccountOutline.vue'
479
504
  import { ICON_MAP } from '../CnIcon/CnIcon.vue'
@@ -560,6 +585,8 @@ export default {
560
585
  name: 'CnAppNav',
561
586
 
562
587
  components: {
588
+ NcActionLink,
589
+ Pencil,
563
590
  NcAppNavigation,
564
591
  NcAppNavigationCaption,
565
592
  NcAppNavigationItem,
@@ -1921,8 +1948,10 @@ export default {
1921
1948
  /**
1922
1949
  * Whether a menu entry renders as a `NcAppNavigationCaption`
1923
1950
  * (`type: "caption"`) rather than a clickable
1924
- * `NcAppNavigationItem`. Caption entries ignore `route`, `href`,
1925
- * `action`, `icon`, `count`, `children`, and `pinned`.
1951
+ * `NcAppNavigationItem`. Caption entries ignore `route`, `action`,
1952
+ * `icon`, `count`, `children`, and `pinned`. A caption's `href` is
1953
+ * drawn as a pencil link beside the heading: the place where what
1954
+ * stands under it is changed (a user's own choice of entries, say).
1926
1955
  *
1927
1956
  * @param {{ type?: string }} item Menu entry descriptor.
1928
1957
  * @return {boolean}
@@ -1931,6 +1960,16 @@ export default {
1931
1960
  return item?.type === 'caption'
1932
1961
  },
1933
1962
 
1963
+ /**
1964
+ * The accessible name of a caption's pencil link.
1965
+ *
1966
+ * @param {object} item The caption entry.
1967
+ * @return {string} "Change {caption}", translated.
1968
+ */
1969
+ captionEditLabel(item) {
1970
+ return t('nextcloud-vue', 'Change {name}', { name: this.resolveLabel(item) })
1971
+ },
1972
+
1934
1973
  /**
1935
1974
  * Whether the host has registered a scoped slot named
1936
1975
  * `item-${id}-actions` for this menu item. Used to gate template