@conduction/nextcloud-vue 2.62.0 → 2.63.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 (154) hide show
  1. package/dist/esm/components/CnAdminActionCard/CnAdminActionCard.vue.js +10 -0
  2. package/dist/esm/components/CnAdminActionCard/CnAdminActionCard.vue.js.map +1 -0
  3. package/dist/esm/components/CnAdminActionCard/CnAdminActionCard.vue2.js +189 -0
  4. package/dist/esm/components/CnAdminActionCard/CnAdminActionCard.vue2.js.map +1 -0
  5. package/dist/esm/components/CnAdminActionCard/CnAdminActionCard.vue3.js +72 -0
  6. package/dist/esm/components/CnAdminActionCard/CnAdminActionCard.vue3.js.map +1 -0
  7. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +271 -32
  8. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
  9. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
  10. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +99 -9
  11. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  12. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +39 -18
  13. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  14. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue2.js.map +1 -1
  15. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue3.js +53 -37
  16. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue3.js.map +1 -1
  17. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  18. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +2 -2
  19. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  20. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue.js +10 -0
  21. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue.js.map +1 -0
  22. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue2.js +293 -0
  23. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue2.js.map +1 -0
  24. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue3.js +189 -0
  25. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue3.js.map +1 -0
  26. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +216 -8
  27. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  28. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +118 -50
  29. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  30. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  31. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +2 -1
  32. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  33. package/dist/esm/components/CnFieldHelper/CnFieldHelper.vue2.js +3 -1
  34. package/dist/esm/components/CnFieldHelper/CnFieldHelper.vue2.js.map +1 -1
  35. package/dist/esm/components/CnFieldHelper/CnFieldHelper.vue3.js +1 -1
  36. package/dist/esm/components/CnFieldHelper/CnFieldHelper.vue3.js.map +1 -1
  37. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +234 -9
  38. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
  39. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js +96 -57
  40. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
  41. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +51 -2
  42. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  43. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +5 -1
  44. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  45. package/dist/esm/components/CnIndexPage/selfModeActions.js +3 -3
  46. package/dist/esm/components/CnIndexPage/selfModeActions.js.map +1 -1
  47. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +36 -1
  48. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  49. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +4 -1
  50. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  51. package/dist/esm/components/CnResourceSelect/CnResourceSelect.vue2.js +121 -12
  52. package/dist/esm/components/CnResourceSelect/CnResourceSelect.vue2.js.map +1 -1
  53. package/dist/esm/components/CnResourceSelect/CnResourceSelect.vue3.js +3 -1
  54. package/dist/esm/components/CnResourceSelect/CnResourceSelect.vue3.js.map +1 -1
  55. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js +326 -1
  56. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js.map +1 -1
  57. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js +112 -26
  58. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js.map +1 -1
  59. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue.js +10 -0
  60. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue.js.map +1 -0
  61. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js +337 -0
  62. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js.map +1 -0
  63. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue3.js +102 -0
  64. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue3.js.map +1 -0
  65. package/dist/esm/components/CnTimelineWidget/dashboardRegistration.js +34 -0
  66. package/dist/esm/components/CnTimelineWidget/dashboardRegistration.js.map +1 -0
  67. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue2.js +131 -8
  68. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue2.js.map +1 -1
  69. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue3.js +40 -38
  70. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue3.js.map +1 -1
  71. package/dist/esm/components/CnWidgetGrid/builtInWidgets.js +8 -6
  72. package/dist/esm/components/CnWidgetGrid/builtInWidgets.js.map +1 -1
  73. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +1 -0
  74. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  75. package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue2.js +19 -0
  76. package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue2.js.map +1 -1
  77. package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue3.js +1 -1
  78. package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue3.js.map +1 -1
  79. package/dist/esm/composables/useDependencyCheck.js +65 -0
  80. package/dist/esm/composables/useDependencyCheck.js.map +1 -0
  81. package/dist/esm/composables/useWalkthrough.js +218 -6
  82. package/dist/esm/composables/useWalkthrough.js.map +1 -1
  83. package/dist/esm/index.js +2 -0
  84. package/dist/esm/index.js.map +1 -1
  85. package/dist/esm/l10n/en.json.js +43 -0
  86. package/dist/esm/l10n/en.json.js.map +1 -1
  87. package/dist/esm/l10n/nl.json.js +43 -0
  88. package/dist/esm/l10n/nl.json.js.map +1 -1
  89. package/dist/esm/nextcloud-vue.css +449 -0
  90. package/dist/esm/store/useObjectStore.js +8 -0
  91. package/dist/esm/store/useObjectStore.js.map +1 -1
  92. package/dist/esm/utils/columnFilters.js +311 -0
  93. package/dist/esm/utils/columnFilters.js.map +1 -0
  94. package/dist/esm/utils/groupAutocomplete.js +123 -0
  95. package/dist/esm/utils/groupAutocomplete.js.map +1 -0
  96. package/dist/esm/utils/libraryWidgetKeys.js +2 -0
  97. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  98. package/dist/esm/utils/pickerOptions.js +198 -0
  99. package/dist/esm/utils/pickerOptions.js.map +1 -0
  100. package/dist/esm/utils/schema.js +83 -7
  101. package/dist/esm/utils/schema.js.map +1 -1
  102. package/dist/esm/utils/timelineEvents.js +174 -0
  103. package/dist/esm/utils/timelineEvents.js.map +1 -0
  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/walkthroughSignals.js +88 -0
  107. package/dist/esm/utils/walkthroughSignals.js.map +1 -0
  108. package/dist/nextcloud-vue.cjs.js +9369 -5193
  109. package/dist/nextcloud-vue.cjs.js.map +2 -2
  110. package/dist/nextcloud-vue.css +449 -0
  111. package/l10n/en.json +43 -0
  112. package/l10n/nl.json +43 -0
  113. package/package.json +1 -1
  114. package/src/components/CnAdminActionCard/CnAdminActionCard.vue +234 -0
  115. package/src/components/CnAdminActionCard/index.js +4 -0
  116. package/src/components/CnAppNav/CnAppNav.vue +271 -32
  117. package/src/components/CnAppRoot/CnAppRoot.vue +129 -15
  118. package/src/components/CnChoiceCards/CnChoiceCards.vue +56 -31
  119. package/src/components/CnDashboardPage/CnDashboardPage.vue +2 -2
  120. package/src/components/CnDataTable/CnColumnFilterPopover.vue +524 -0
  121. package/src/components/CnDataTable/CnDataTable.md +3 -0
  122. package/src/components/CnDataTable/CnDataTable.vue +260 -4
  123. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +2 -2
  124. package/src/components/CnFieldHelper/CnFieldHelper.vue +4 -2
  125. package/src/components/CnFormDialog/CnFormDialog.vue +290 -31
  126. package/src/components/CnIndexPage/CnIndexPage.vue +55 -2
  127. package/src/components/CnIndexPage/selfModeActions.js +3 -3
  128. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +39 -1
  129. package/src/components/CnResourceSelect/CnResourceSelect.vue +123 -12
  130. package/src/components/CnSetupWizard/CnSetupWizard.vue +392 -3
  131. package/src/components/CnTimelineWidget/CnTimelineWidget.vue +477 -0
  132. package/src/components/CnTimelineWidget/dashboardRegistration.js +32 -0
  133. package/src/components/CnTimelineWidget/index.js +4 -0
  134. package/src/components/CnWalkthrough/CnWalkthrough.vue +143 -10
  135. package/src/components/CnWidgetGrid/builtInWidgets.js +2 -0
  136. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +1 -0
  137. package/src/components/CnWizardDialog/CnWizardDialog.vue +20 -1
  138. package/src/components/index.js +2 -0
  139. package/src/composables/useDependencyCheck.js +61 -0
  140. package/src/composables/useWalkthrough.js +217 -5
  141. package/src/css/dashboard.css +49 -0
  142. package/src/css/detail-page.css +19 -0
  143. package/src/css/table.css +81 -0
  144. package/src/index.js +2 -0
  145. package/src/schemas/app-manifest-v2.schema.json +23 -1
  146. package/src/store/useObjectStore.js +8 -0
  147. package/src/utils/columnFilters.js +324 -0
  148. package/src/utils/groupAutocomplete.js +119 -0
  149. package/src/utils/libraryWidgetKeys.js +2 -0
  150. package/src/utils/pickerOptions.js +194 -0
  151. package/src/utils/schema.js +83 -7
  152. package/src/utils/timelineEvents.js +171 -0
  153. package/src/utils/validateManifestV2.compiled.js +2 -2
  154. package/src/utils/walkthroughSignals.js +94 -0
@@ -325,6 +325,87 @@
325
325
  outline-offset: -2px;
326
326
  }
327
327
 
328
+ /* Header filter button (CnDataTable `filterable`). 24px hit area with the
329
+ 16px icon; the filled icon plus the primary colour marks an active filter,
330
+ so the state never rests on colour alone. */
331
+ .cn-table-header__filter {
332
+ display: inline-flex;
333
+ align-items: center;
334
+ justify-content: center;
335
+ width: 24px;
336
+ min-width: 24px;
337
+ height: 24px;
338
+ min-height: 24px;
339
+ margin: 0 0 0 4px;
340
+ padding: 0;
341
+ border: none;
342
+ border-radius: var(--border-radius, 4px);
343
+ background: transparent;
344
+ color: var(--color-text-maxcontrast);
345
+ vertical-align: middle;
346
+ cursor: pointer;
347
+ }
348
+
349
+ .cn-table-header__filter:hover {
350
+ background-color: var(--color-background-hover);
351
+ color: var(--color-main-text);
352
+ }
353
+
354
+ .cn-table-header__filter:focus-visible {
355
+ outline: 2px solid var(--color-main-text);
356
+ outline-offset: 0;
357
+ }
358
+
359
+ .cn-table-header__filter--active {
360
+ color: var(--color-primary-element);
361
+ }
362
+
363
+ /* Active header filters above the table, one removable chip each. */
364
+ .cn-data-table__filter-chips {
365
+ display: flex;
366
+ flex-wrap: wrap;
367
+ gap: 6px;
368
+ margin: 0 0 8px;
369
+ padding: 0;
370
+ list-style: none;
371
+ }
372
+
373
+ .cn-data-table__filter-chip {
374
+ display: inline-flex;
375
+ align-items: center;
376
+ gap: 4px;
377
+ padding: 2px 4px 2px 10px;
378
+ border: 1px solid var(--color-border-dark);
379
+ border-radius: var(--border-radius-pill, 16px);
380
+ background-color: var(--color-background-dark);
381
+ color: var(--color-main-text);
382
+ }
383
+
384
+ .cn-data-table__filter-chip-remove {
385
+ display: inline-flex;
386
+ align-items: center;
387
+ justify-content: center;
388
+ width: 24px;
389
+ min-width: 24px;
390
+ height: 24px;
391
+ min-height: 24px;
392
+ margin: 0;
393
+ padding: 0;
394
+ border: none;
395
+ border-radius: 50%;
396
+ background: transparent;
397
+ color: var(--color-main-text);
398
+ cursor: pointer;
399
+ }
400
+
401
+ .cn-data-table__filter-chip-remove:hover {
402
+ background-color: var(--color-background-hover);
403
+ }
404
+
405
+ .cn-data-table__filter-chip-remove:focus-visible {
406
+ outline: 2px solid var(--color-main-text);
407
+ }
408
+
328
409
  /* Multi-column sort priority badge (1, 2, 3), rendered only when two or more rendered, sortable columns are sorted. */
329
410
  .cn-table-sort-badge {
330
411
  display: inline-flex;
@@ -2584,6 +2665,55 @@
2584
2665
  .cn-dashboard-list__item:hover {
2585
2666
  background: var(--color-background-hover);
2586
2667
  }
2668
+
2669
+ /* "Install <app>" placeholder in a widget whose app is missing.
2670
+ *
2671
+ * NcEmptyContent centres its content with `justify-content: center`. In a
2672
+ * two-row dashboard tile (about 150px inside an `overflow: hidden` wrapper)
2673
+ * the icon, name, description and button are taller than the tile, and plain
2674
+ * `center` overflows on BOTH sides, so the top ran out of the widget and the
2675
+ * name was cut off. `safe center` falls back to the start edge when the
2676
+ * content does not fit, the spacing is compact, and what still does not fit
2677
+ * scrolls instead of being clipped. Shared by CnDashboardPage and
2678
+ * CnDetailWidgetHost (`cn-requires-app`). The class is doubled to outrank
2679
+ * NcEmptyContent's own scoped rules (`.empty-content[data-v-…]`) whatever
2680
+ * order the stylesheets load in. */
2681
+ .cn-requires-app.cn-requires-app.empty-content,
2682
+ .cn-requires-app.cn-requires-app .empty-content {
2683
+ justify-content: safe center;
2684
+ min-height: 0;
2685
+ max-height: 100%;
2686
+ overflow: auto;
2687
+ margin: 0;
2688
+ padding: calc(2 * var(--default-grid-baseline, 4px));
2689
+ gap: var(--default-grid-baseline, 4px);
2690
+ box-sizing: border-box;
2691
+ }
2692
+
2693
+ .cn-requires-app.cn-requires-app .empty-content__icon {
2694
+ width: auto;
2695
+ height: auto;
2696
+ min-height: 0;
2697
+ margin: 0;
2698
+ opacity: 0.7;
2699
+ }
2700
+
2701
+ .cn-requires-app.cn-requires-app .empty-content__name {
2702
+ margin: 0;
2703
+ font-size: var(--default-font-size, 15px);
2704
+ font-weight: 600;
2705
+ text-align: center;
2706
+ }
2707
+
2708
+ .cn-requires-app.cn-requires-app .empty-content__description {
2709
+ margin: 0;
2710
+ text-align: center;
2711
+ font-size: 0.9em;
2712
+ }
2713
+
2714
+ .cn-requires-app.cn-requires-app .empty-content__action {
2715
+ margin-top: var(--default-grid-baseline, 4px);
2716
+ }
2587
2717
  /* ========================================
2588
2718
  @conduction/nextcloud-vue — CnDetailPage Styles
2589
2719
  ======================================== */
@@ -2692,6 +2822,25 @@
2692
2822
  flex-shrink: 0;
2693
2823
  }
2694
2824
 
2825
+ /* Every control in the header sits on one line at one height. The lifecycle
2826
+ bar carries `margin: 0 0 8px` for its place above a page body; in the
2827
+ header that margin pushed its buttons up and made the row 8px taller, so
2828
+ the Edit button beside it read as the bigger one. A consumer's actions
2829
+ component can bring its own margins too, so they are reset here as well. */
2830
+ .cn-detail-page .cn-detail-page__header-actions .cn-lifecycle-actions {
2831
+ margin: 0;
2832
+ flex-wrap: nowrap;
2833
+ }
2834
+
2835
+ .cn-detail-page .cn-detail-page__header-actions > * {
2836
+ margin-block: 0;
2837
+ }
2838
+
2839
+ .cn-detail-page .cn-detail-page__header-actions .button-vue {
2840
+ min-height: var(--default-clickable-area);
2841
+ block-size: var(--default-clickable-area);
2842
+ }
2843
+
2695
2844
  /* The sentence a refused lock acquire left behind, under the locked banner. */
2696
2845
  .cn-detail-page__lock-refusal {
2697
2846
  margin: 0 0 calc(3 * var(--default-grid-baseline));
@@ -5959,6 +6108,101 @@ svg.leaflet-image-layer.leaflet-interactive path {
5959
6108
  }
5960
6109
 
5961
6110
 
6111
+ .cn-column-filter[data-v-2cb54356] {
6112
+ z-index: 10000;
6113
+ display: flex;
6114
+ flex-direction: column;
6115
+ gap: 8px;
6116
+ box-sizing: border-box;
6117
+ max-height: 60vh;
6118
+ overflow-y: auto;
6119
+ padding: 12px;
6120
+ background: var(--color-main-background);
6121
+ color: var(--color-main-text);
6122
+ border: 1px solid var(--color-border-dark);
6123
+ border-radius: var(--border-radius-large, 8px);
6124
+ box-shadow: 0 2px 8px var(--color-box-shadow);
6125
+ font-weight: normal;
6126
+ text-align: start;
6127
+ }
6128
+ .cn-column-filter__heading[data-v-2cb54356] {
6129
+ margin: 0;
6130
+ font-weight: bold;
6131
+ }
6132
+ .cn-column-filter__options[data-v-2cb54356] {
6133
+ display: flex;
6134
+ flex-direction: column;
6135
+ gap: 4px;
6136
+ margin: 0;
6137
+ padding: 0;
6138
+ border: none;
6139
+ }
6140
+ .cn-column-filter__option[data-v-2cb54356] {
6141
+ display: flex;
6142
+ align-items: center;
6143
+ gap: 8px;
6144
+ min-height: 32px;
6145
+ cursor: pointer;
6146
+ }
6147
+ .cn-column-filter__range[data-v-2cb54356] {
6148
+ display: flex;
6149
+ gap: 8px;
6150
+ }
6151
+ .cn-column-filter__field[data-v-2cb54356] {
6152
+ display: flex;
6153
+ flex: 1 1 0;
6154
+ flex-direction: column;
6155
+ gap: 4px;
6156
+ min-width: 0;
6157
+ }
6158
+ .cn-column-filter__label[data-v-2cb54356] {
6159
+ font-size: var(--font-size-small, 13px);
6160
+ color: var(--color-text-maxcontrast);
6161
+ }
6162
+ .cn-column-filter__input[data-v-2cb54356] {
6163
+ width: 100%;
6164
+ box-sizing: border-box;
6165
+ margin: 0;
6166
+ }
6167
+ .cn-column-filter__hint[data-v-2cb54356] {
6168
+ margin: 0;
6169
+ color: var(--color-text-maxcontrast);
6170
+ }
6171
+ .cn-column-filter__actions[data-v-2cb54356] {
6172
+ display: flex;
6173
+ justify-content: flex-end;
6174
+ gap: 8px;
6175
+ }
6176
+ .cn-column-filter__button[data-v-2cb54356] {
6177
+ min-height: 34px;
6178
+ padding: 0 12px;
6179
+ border: 1px solid var(--color-border-dark);
6180
+ border-radius: var(--border-radius-element, 8px);
6181
+ background: var(--color-main-background);
6182
+ color: var(--color-main-text);
6183
+ cursor: pointer;
6184
+ }
6185
+ .cn-column-filter__button--primary[data-v-2cb54356] {
6186
+ border-color: var(--color-primary-element);
6187
+ background: var(--color-primary-element);
6188
+ color: var(--color-primary-element-text);
6189
+ }
6190
+ .cn-column-filter__button[data-v-2cb54356]:focus-visible,
6191
+ .cn-column-filter__input[data-v-2cb54356]:focus-visible,
6192
+ .cn-column-filter__option input[data-v-2cb54356]:focus-visible {
6193
+ outline: 2px solid var(--color-primary-element);
6194
+ outline-offset: 2px;
6195
+ }
6196
+ .cn-column-filter__sr-only[data-v-2cb54356] {
6197
+ position: absolute;
6198
+ width: 1px;
6199
+ height: 1px;
6200
+ overflow: hidden;
6201
+ clip-path: inset(50%);
6202
+ white-space: nowrap;
6203
+ }
6204
+
6205
+
5962
6206
  .cn-fk-resolve-cell[data-v-471db666] {
5963
6207
  white-space: nowrap;
5964
6208
  overflow: hidden;
@@ -6359,6 +6603,87 @@ svg.leaflet-image-layer.leaflet-interactive path {
6359
6603
  outline-offset: -2px;
6360
6604
  }
6361
6605
 
6606
+ /* Header filter button (CnDataTable `filterable`). 24px hit area with the
6607
+ 16px icon; the filled icon plus the primary colour marks an active filter,
6608
+ so the state never rests on colour alone. */
6609
+ .cn-table-header__filter {
6610
+ display: inline-flex;
6611
+ align-items: center;
6612
+ justify-content: center;
6613
+ width: 24px;
6614
+ min-width: 24px;
6615
+ height: 24px;
6616
+ min-height: 24px;
6617
+ margin: 0 0 0 4px;
6618
+ padding: 0;
6619
+ border: none;
6620
+ border-radius: var(--border-radius, 4px);
6621
+ background: transparent;
6622
+ color: var(--color-text-maxcontrast);
6623
+ vertical-align: middle;
6624
+ cursor: pointer;
6625
+ }
6626
+
6627
+ .cn-table-header__filter:hover {
6628
+ background-color: var(--color-background-hover);
6629
+ color: var(--color-main-text);
6630
+ }
6631
+
6632
+ .cn-table-header__filter:focus-visible {
6633
+ outline: 2px solid var(--color-main-text);
6634
+ outline-offset: 0;
6635
+ }
6636
+
6637
+ .cn-table-header__filter--active {
6638
+ color: var(--color-primary-element);
6639
+ }
6640
+
6641
+ /* Active header filters above the table, one removable chip each. */
6642
+ .cn-data-table__filter-chips {
6643
+ display: flex;
6644
+ flex-wrap: wrap;
6645
+ gap: 6px;
6646
+ margin: 0 0 8px;
6647
+ padding: 0;
6648
+ list-style: none;
6649
+ }
6650
+
6651
+ .cn-data-table__filter-chip {
6652
+ display: inline-flex;
6653
+ align-items: center;
6654
+ gap: 4px;
6655
+ padding: 2px 4px 2px 10px;
6656
+ border: 1px solid var(--color-border-dark);
6657
+ border-radius: var(--border-radius-pill, 16px);
6658
+ background-color: var(--color-background-dark);
6659
+ color: var(--color-main-text);
6660
+ }
6661
+
6662
+ .cn-data-table__filter-chip-remove {
6663
+ display: inline-flex;
6664
+ align-items: center;
6665
+ justify-content: center;
6666
+ width: 24px;
6667
+ min-width: 24px;
6668
+ height: 24px;
6669
+ min-height: 24px;
6670
+ margin: 0;
6671
+ padding: 0;
6672
+ border: none;
6673
+ border-radius: 50%;
6674
+ background: transparent;
6675
+ color: var(--color-main-text);
6676
+ cursor: pointer;
6677
+ }
6678
+
6679
+ .cn-data-table__filter-chip-remove:hover {
6680
+ background-color: var(--color-background-hover);
6681
+ }
6682
+
6683
+ .cn-data-table__filter-chip-remove:focus-visible {
6684
+ outline: 2px solid var(--color-main-text);
6685
+ }
6686
+
6362
6687
  /* Multi-column sort priority badge (1, 2, 3), rendered only when two or more rendered, sortable columns are sorted. */
6363
6688
  .cn-table-sort-badge {
6364
6689
  display: inline-flex;
@@ -15141,6 +15466,10 @@ a.cn-xwiki-card__title[data-v-54e85fe3]:hover {
15141
15466
  font-size: 0.9em;
15142
15467
  margin-inline-end: auto;
15143
15468
  }
15469
+ .cn-form-dialog__switch-wrapper[data-v-c3eeb0a2] {
15470
+ display: flex;
15471
+ flex-direction: column;
15472
+ }
15144
15473
  .cn-form-dialog__form[data-v-c3eeb0a2] {
15145
15474
  display: flex;
15146
15475
  flex-direction: column;
@@ -18032,6 +18361,83 @@ to { background-position: -200% 0;
18032
18361
  }
18033
18362
 
18034
18363
 
18364
+ .cn-timeline-widget[data-v-621fcccf] {
18365
+ display: flex;
18366
+ flex-direction: column;
18367
+ gap: 8px;
18368
+ }
18369
+ .cn-timeline-widget__title[data-v-621fcccf] {
18370
+ margin: 0;
18371
+ font-size: var(--font-size-large, 1.1em);
18372
+ }
18373
+ .cn-timeline-widget__loading[data-v-621fcccf] {
18374
+ display: flex;
18375
+ align-items: center;
18376
+ gap: 8px;
18377
+ color: var(--color-text-maxcontrast);
18378
+ }
18379
+ .cn-timeline-widget__empty[data-v-621fcccf] {
18380
+ margin: 0;
18381
+ color: var(--color-text-maxcontrast);
18382
+ }
18383
+ .cn-timeline-widget__list[data-v-621fcccf] {
18384
+ margin: 0;
18385
+ padding: 0;
18386
+ list-style: none;
18387
+ }
18388
+ .cn-timeline-widget__event[data-v-621fcccf] {
18389
+ position: relative;
18390
+ display: flex;
18391
+ gap: 12px;
18392
+ padding-block-end: 12px;
18393
+ }
18394
+
18395
+ /* The line between dots: drawn from each dot down to the next event. */
18396
+ .cn-timeline-widget__event[data-v-621fcccf]:not(:last-child)::before {
18397
+ content: '';
18398
+ position: absolute;
18399
+ inset-block: 14px 0;
18400
+ inset-inline-start: 5px;
18401
+ border-inline-start: 2px solid var(--color-border-dark);
18402
+ }
18403
+ .cn-timeline-widget__dot[data-v-621fcccf] {
18404
+ flex: 0 0 auto;
18405
+ width: 12px;
18406
+ height: 12px;
18407
+ margin-block-start: 4px;
18408
+ border-radius: 50%;
18409
+ background-color: var(--color-primary-element);
18410
+ }
18411
+
18412
+ /* Upcoming: a hollow dot, plus the word "Upcoming" beside the date. */
18413
+ .cn-timeline-widget__event--upcoming .cn-timeline-widget__dot[data-v-621fcccf] {
18414
+ box-sizing: border-box;
18415
+ border: 2px solid var(--color-primary-element);
18416
+ background-color: var(--color-main-background);
18417
+ }
18418
+ .cn-timeline-widget__body[data-v-621fcccf] {
18419
+ min-width: 0;
18420
+ }
18421
+ .cn-timeline-widget__when[data-v-621fcccf] {
18422
+ font-size: var(--font-size-small, 13px);
18423
+ color: var(--color-text-maxcontrast);
18424
+ }
18425
+ .cn-timeline-widget__badge[data-v-621fcccf] {
18426
+ margin-inline-start: 8px;
18427
+ font-size: var(--font-size-small, 13px);
18428
+ font-weight: bold;
18429
+ color: var(--color-main-text);
18430
+ }
18431
+ .cn-timeline-widget__label[data-v-621fcccf] {
18432
+ margin: 0;
18433
+ font-weight: bold;
18434
+ }
18435
+ .cn-timeline-widget__detail[data-v-621fcccf] {
18436
+ margin: 0;
18437
+ overflow-wrap: anywhere;
18438
+ }
18439
+
18440
+
18035
18441
  .cn-object-card[data-v-6f672c8f] {
18036
18442
  display: flex;
18037
18443
  gap: 12px;
@@ -23314,6 +23720,17 @@ a.cn-flow-runs-widget__row-content:hover .cn-flow-runs-widget__name[data-v-75628
23314
23720
  }
23315
23721
 
23316
23722
 
23723
+ .cn-admin-action-card__description[data-v-57907ee5] {
23724
+ margin: 0 0 12px;
23725
+ color: var(--color-text-maxcontrast);
23726
+ }
23727
+ .cn-admin-action-card__footer[data-v-57907ee5] {
23728
+ display: flex;
23729
+ gap: 8px;
23730
+ margin-block: 8px;
23731
+ }
23732
+
23733
+
23317
23734
  .cn-version-info__card[data-v-3dc855b2] {
23318
23735
  background: var(--color-background-hover);
23319
23736
  border: 1px solid var(--color-border);
@@ -23698,6 +24115,19 @@ a.cn-flow-runs-widget__row-content:hover .cn-flow-runs-widget__name[data-v-75628
23698
24115
  padding: 12px;
23699
24116
  }
23700
24117
 
24118
+ .cn-choice-cards__cell[data-v-93473002] {
24119
+ display: flex;
24120
+ flex-direction: column;
24121
+ gap: 8px;
24122
+ min-inline-size: 0;
24123
+ }
24124
+
24125
+ .cn-choice-cards__actions[data-v-93473002] {
24126
+ display: flex;
24127
+ flex-direction: column;
24128
+ gap: 4px;
24129
+ }
24130
+
23701
24131
  .cn-choice-cards__option[data-v-93473002] {
23702
24132
  position: relative;
23703
24133
  display: block;
@@ -23860,6 +24290,16 @@ a.cn-flow-runs-widget__row-content:hover .cn-flow-runs-widget__name[data-v-75628
23860
24290
  padding: 24px 0;
23861
24291
  color: var(--color-text-maxcontrast);
23862
24292
  }
24293
+ .cn-setup-load-result[data-v-75b2078b] {
24294
+ margin: 0;
24295
+ font-size: var(--font-size-small, 13px);
24296
+ }
24297
+ .cn-setup-load-result--success[data-v-75b2078b] {
24298
+ color: var(--color-success-text, var(--color-success));
24299
+ }
24300
+ .cn-setup-load-result--error[data-v-75b2078b] {
24301
+ color: var(--color-error-text, var(--color-error));
24302
+ }
23863
24303
  .cn-setup-field[data-v-75b2078b] {
23864
24304
  display: flex;
23865
24305
  flex-direction: column;
@@ -28690,6 +29130,10 @@ to {
28690
29130
  padding: 16px;
28691
29131
  pointer-events: auto;
28692
29132
  }
29133
+ .cn-walkthrough__card--docked[data-v-5691d49a] {
29134
+ inset-block-end: 16px;
29135
+ inset-inline-start: 16px;
29136
+ }
28693
29137
  .cn-walkthrough__close[data-v-5691d49a] {
28694
29138
  /* !important beats NcButton's own `position: relative`, which would otherwise
28695
29139
  leave the close button in-flow at the card's top-left. */
@@ -33713,6 +34157,11 @@ a.cn-integration-card__title[data-v-f7e9bbfa]:hover {
33713
34157
  margin-bottom: 12px;
33714
34158
  color: var(--color-text-maxcontrast);
33715
34159
  }
34160
+ .cn-app-root__walkthrough-actions {
34161
+ display: flex;
34162
+ flex-wrap: wrap;
34163
+ gap: 8px;
34164
+ }
33716
34165
  .cn-app-root__integrations-hint {
33717
34166
  margin-bottom: 12px;
33718
34167
  color: var(--color-text-maxcontrast);
@@ -5,6 +5,7 @@ import { parseResponseError, networkError, genericError } from '../utils/errors.
5
5
  import { normalizeFacets } from '../utils/facets.js';
6
6
  import { prefixUrl, capitalize, buildHeaders, buildQueryString } from '../utils/headers.js';
7
7
  import { extractId } from '../utils/id.js';
8
+ import { dispatchObjectCreated } from '../utils/walkthroughSignals.js';
8
9
  import { mergePluginState, mergePluginGetters, mergePluginActions } from './pluginMerge.js';
9
10
  import { liveUpdatesPlugin } from './plugins/liveUpdates.js';
10
11
 
@@ -830,6 +831,13 @@ const baseActions = {
830
831
  [type]: { ...(this.objects[type] || {}), [savedId]: data },
831
832
  };
832
833
 
834
+ // Every create through the store lets an `advanceOn:
835
+ // object-created` walkthrough step advance, whichever form made it.
836
+ if (!isUpdate) {
837
+ const config = this.objectTypeRegistry[type] || {};
838
+ dispatchObjectCreated({ register: config.registerSlug || config.register, schema: config.schemaSlug || config.schema, object: data });
839
+ }
840
+
833
841
  return data
834
842
  } catch (error) {
835
843
  this.errors = {