@conduction/nextcloud-vue 2.120.0 → 2.122.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 (79) hide show
  1. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +53 -1
  2. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  3. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +546 -523
  4. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  5. package/dist/esm/components/CnIndexPage/useNamedSource.js +9 -0
  6. package/dist/esm/components/CnIndexPage/useNamedSource.js.map +1 -1
  7. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
  8. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js +1 -0
  9. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
  10. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue.js +9 -0
  11. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue.js.map +1 -0
  12. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue2.js +214 -0
  13. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue2.js.map +1 -0
  14. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue3.js +125 -0
  15. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue3.js.map +1 -0
  16. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue.js +9 -0
  17. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue.js.map +1 -0
  18. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue2.js +163 -0
  19. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue2.js.map +1 -0
  20. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue3.js +131 -0
  21. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue3.js.map +1 -0
  22. package/dist/esm/components/CnSchemaRulesWidget/schemaRules.js +127 -0
  23. package/dist/esm/components/CnSchemaRulesWidget/schemaRules.js.map +1 -0
  24. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue.js +9 -0
  25. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue.js.map +1 -0
  26. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue2.js +82 -0
  27. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue2.js.map +1 -0
  28. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue3.js +61 -0
  29. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue3.js.map +1 -0
  30. package/dist/esm/components/CnSearchIndexStatus/searchIndexStatus.js +60 -0
  31. package/dist/esm/components/CnSearchIndexStatus/searchIndexStatus.js.map +1 -0
  32. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue.js +10 -0
  33. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue.js.map +1 -0
  34. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue2.js +226 -0
  35. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue2.js.map +1 -0
  36. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue3.js +126 -0
  37. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue3.js.map +1 -0
  38. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +42 -32
  39. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  40. package/dist/esm/composables/indexSources.js +116 -16
  41. package/dist/esm/composables/indexSources.js.map +1 -1
  42. package/dist/esm/index.js +4 -0
  43. package/dist/esm/index.js.map +1 -1
  44. package/dist/esm/l10n/en.json.js +42 -1
  45. package/dist/esm/l10n/en.json.js.map +1 -1
  46. package/dist/esm/l10n/nl.json.js +42 -1
  47. package/dist/esm/l10n/nl.json.js.map +1 -1
  48. package/dist/esm/library-style.js +1 -1
  49. package/dist/esm/nextcloud-vue.css +309 -13
  50. package/dist/esm/utils/libraryWidgetKeys.js +1 -0
  51. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  52. package/dist/nextcloud-vue.cjs.js +14136 -12578
  53. package/dist/nextcloud-vue.cjs.js.map +2 -2
  54. package/dist/nextcloud-vue.css +309 -13
  55. package/l10n/en.json +42 -1
  56. package/l10n/nl.json +42 -1
  57. package/package.json +1 -1
  58. package/src/components/CnIndexPage/CnIndexPage.vue +74 -3
  59. package/src/components/CnIndexPage/useNamedSource.js +9 -0
  60. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +1 -0
  61. package/src/components/CnReadinessChecklist/CnReadinessChecklist.vue +335 -0
  62. package/src/components/CnReadinessChecklist/index.js +9 -0
  63. package/src/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue +300 -0
  64. package/src/components/CnSchemaRulesWidget/index.js +10 -0
  65. package/src/components/CnSchemaRulesWidget/schemaRules.js +123 -0
  66. package/src/components/CnSearchIndexStatus/CnSearchIndexStatus.vue +160 -0
  67. package/src/components/CnSearchIndexStatus/index.js +10 -0
  68. package/src/components/CnSearchIndexStatus/searchIndexStatus.js +56 -0
  69. package/src/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue +328 -0
  70. package/src/components/CnShippedConfigurationSection/index.js +9 -0
  71. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +10 -0
  72. package/src/components/index.js +4 -0
  73. package/src/composables/indexSources.js +116 -16
  74. package/src/css/index-page.css +7 -0
  75. package/src/css/look-board-detail.css +27 -0
  76. package/src/css/look-board-index.css +108 -12
  77. package/src/css/look-board.css +27 -1
  78. package/src/index.js +4 -0
  79. package/src/utils/libraryWidgetKeys.js +1 -0
@@ -295,9 +295,15 @@
295
295
  look sets 600 on each button, so every NcButton on a board page draws the
296
296
  board's weight without a rule per surface. Breadcrumb buttons keep the
297
297
  crumb weight.
298
- @spec openspec/changes/board-button-weight/specs/board-button-weight/spec.md#requirement-a-board-button-draws-at-600 */
298
+ The boards also draw a button's text at 14px, against Nextcloud's 15px.
299
+ NcButton reads its size from --default-font-size, so the look sets that
300
+ variable on the button: a surface that sets its own `font-size` (the next
301
+ step card's 15px) keeps it.
302
+ @spec openspec/changes/board-button-weight/specs/board-button-weight/spec.md#requirement-a-board-button-draws-at-600
303
+ @spec openspec/changes/board-control-text/specs/board-control-text/spec.md#requirement-a-board-button-draws-its-text-at-14px */
299
304
  .cn-look-board .button-vue:not(.cn-look-nextcloud *):not(.vue-crumb *) {
300
305
  --font-weight-element: 600;
306
+ --default-font-size: 14px;
301
307
  }
302
308
 
303
309
  /* ---- A button with an icon and a label --------------------------------- */
@@ -460,6 +466,26 @@
460
466
  background: var(--color-background-hover);
461
467
  }
462
468
 
469
+ /* ---- A secondary button --------------------------------------------------- */
470
+ /* The boards draw every secondary button neutral: the main background, a 1px
471
+ control border, the main text, the hover ground on hover (DqFlow "Testen
472
+ met een zaak", DqFunctionaliteiten "Documentatie", DqTaak "Afronden").
473
+ NcButton draws its secondary from the primary-light variables, on a 2px
474
+ bottom edge; the look points those variables at the neutral colours on the
475
+ button itself. The selector weighs (0,3,0): it outranks NcButton's border
476
+ (0,2,0), and a surface rule of the same weight later in the cascade (a
477
+ dialog's cancel) still decides for its surface.
478
+ @spec openspec/changes/board-secondary-neutral/specs/board-secondary-neutral/spec.md#requirement-a-board-secondary-button-is-neutral */
479
+ .cn-look-board .button-vue.button-vue--secondary:where(:not(.cn-look-nextcloud *):not(.vue-crumb *)),
480
+ .cn-look-board .button-vue.button-vue--vue-secondary:where(:not(.cn-look-nextcloud *):not(.vue-crumb *)) {
481
+ --color-primary-element-light: var(--color-main-background);
482
+ --color-primary-element-light-hover: var(--color-background-hover);
483
+ --color-primary-element-light-text: var(--color-main-text);
484
+ --nldesign-color-on-surface: var(--color-main-text);
485
+ border: 1px solid var(--cn-board-control-border);
486
+ color: var(--color-main-text);
487
+ }
488
+
463
489
  /* ---- Header action buttons (CnActionButtons) ----------------------------- */
464
490
  /* The board draws a page's secondary actions as neutral 40px buttons: the
465
491
  main background, a grey border, the main text at 600 (DqZaak "Bericht",
@@ -3456,16 +3482,36 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
3456
3482
  width: 18%;
3457
3483
  }
3458
3484
 
3459
- /* The board's data cells sit 12px apart (PqTickets), the first one 18px from
3460
- the selection column; the selection and menu columns keep 16px. */
3461
- .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table th:not(.cn-table-col--checkbox):not(.cn-table-col--actions):not(.cn-table-col--icon),
3462
- .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table td:not(.cn-table-col--checkbox):not(.cn-table-col--actions):not(.cn-table-col--icon) {
3485
+ /* An index table pads every cell 16px at the sides (DqZaken). The plain-title
3486
+ table (`rowTitle: "plain"`: PqTickets, OcPublicaties) sets its data cells
3487
+ 12px apart and its title column 18px from the selection column; the
3488
+ selection and menu columns keep 16px. The title column is left out of the
3489
+ 12px rule, which would otherwise outrank the 18px one.
3490
+ @spec openspec/changes/board-table-density/specs/board-table-density/spec.md#requirement-a-board-table-pads-its-cells-as-the-boards-draw-them */
3491
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board.cn-table-container--title-plain .cn-data-table th:not(.cn-table-col--checkbox):not(.cn-table-col--actions):not(.cn-table-col--icon):not(.cn-table-head--title),
3492
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board.cn-table-container--title-plain .cn-data-table td:not(.cn-table-col--checkbox):not(.cn-table-col--actions):not(.cn-table-col--icon):not(.cn-table-col--title) {
3463
3493
  padding-inline: 12px;
3464
3494
  }
3465
3495
 
3466
- .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table th.cn-table-head--title,
3467
- .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table td.cn-table-col--title {
3468
- padding-inline-start: 18px;
3496
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board.cn-table-container--title-plain .cn-data-table th.cn-table-head--title,
3497
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board.cn-table-container--title-plain .cn-data-table td.cn-table-col--title {
3498
+ padding-inline: 18px 12px;
3499
+ }
3500
+
3501
+ /* A table that is not an index page's main list sits in a card and is the
3502
+ compact one: 10px 12px in the header, 11px 12px in the cells
3503
+ (DqInstellingen, DqVthInstellingen, DqZaaktype, DqTermijnen). The selection
3504
+ column keeps its 16px, so it stays 60px wide. */
3505
+ .cn-look-board .cn-table-container--board:not(.cn-index-page__main--table > *) .cn-data-table th {
3506
+ padding: 10px 12px;
3507
+ }
3508
+
3509
+ .cn-look-board .cn-table-container--board:not(.cn-index-page__main--table > *) .cn-data-table td {
3510
+ padding: 11px 12px;
3511
+ }
3512
+
3513
+ .cn-look-board .cn-table-container--board:not(.cn-index-page__main--table > *) .cn-data-table .cn-table-col--checkbox {
3514
+ padding-inline: 16px;
3469
3515
  }
3470
3516
 
3471
3517
  .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table td > .cn-cell-renderer {
@@ -3695,12 +3741,15 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
3695
3741
  }
3696
3742
 
3697
3743
  /* A page link is a <button>: Nextcloud's `button` rule sets it bold, the
3698
- boards set the links at the regular weight and only the current page at 600. */
3744
+ boards set the links at the regular weight and only the current page at 600.
3745
+ The boards size a link's content box at 34px, so a bordered link is 36px
3746
+ and the borderless current page 34px (DqZaken "2", "Volgende", "1").
3747
+ @spec openspec/changes/board-pagination-links/specs/board-pagination-links/spec.md#requirement-a-board-page-link-is-sized-as-the-boards-draw-it */
3699
3748
  .cn-look-board .cn-pagination--board .cn-pagination__board-link {
3700
3749
  box-sizing: border-box;
3701
- min-width: 34px;
3702
- height: 34px;
3703
- min-height: 34px;
3750
+ min-width: 36px;
3751
+ height: 36px;
3752
+ min-height: 36px;
3704
3753
  margin: 0;
3705
3754
  padding: 0 8px;
3706
3755
  border: 1px solid var(--color-border);
@@ -3725,7 +3774,10 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
3725
3774
  }
3726
3775
 
3727
3776
  .cn-look-board .cn-pagination--board .cn-pagination__board-link--current {
3728
- border-color: var(--color-primary-element);
3777
+ min-width: 34px;
3778
+ height: 34px;
3779
+ min-height: 34px;
3780
+ border: 0;
3729
3781
  background: var(--color-primary-element);
3730
3782
  color: var(--color-primary-element-text);
3731
3783
  font-weight: 600;
@@ -4228,6 +4280,76 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
4228
4280
  border-bottom: none;
4229
4281
  padding-block: 2px;
4230
4282
  }
4283
+
4284
+ /* ---- The index side panel (CnIndexSidebar, board IndexZijpaneel) -------- */
4285
+ /* The panel's title is 20px bold without the schema icon, and its tabs are
4286
+ one row of 40px labels, 14px weight 600 in the soft ink, the open one in
4287
+ the deep primary ink and underlined 2px in the primary colour on the
4288
+ strip's rule (DqFilterBeheren). NcAppSidebar stacks the icon over the
4289
+ label in a 54px tile with a highlight bar; the board does neither. The
4290
+ header rule repeats NcAppSidebar's own chain to outrank it.
4291
+ @spec openspec/changes/board-index-sidebar-tabs/specs/board-index-sidebar-tabs/spec.md#requirement-the-board-index-side-panel-draws-the-boards-header-and-tab-row */
4292
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-header__desc .app-sidebar-header__name-container .app-sidebar-header__mainname-container h2.app-sidebar-header__mainname {
4293
+ font-size: 20px;
4294
+ font-weight: 700;
4295
+ line-height: 1.2;
4296
+ min-height: 0;
4297
+ }
4298
+
4299
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-header__figure:has(> .cn-index-sidebar__header-icon) {
4300
+ display: none;
4301
+ }
4302
+
4303
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__nav[role="tablist"] {
4304
+ justify-content: flex-start;
4305
+ gap: 4px;
4306
+ margin: 0;
4307
+ padding: 14px 12px 0;
4308
+ border-bottom: 1px solid var(--color-border);
4309
+ }
4310
+
4311
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__highlight {
4312
+ display: none;
4313
+ }
4314
+
4315
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__tab[role="tab"] {
4316
+ flex: 0 0 auto;
4317
+ flex-direction: row;
4318
+ align-items: center;
4319
+ gap: 6px;
4320
+ box-sizing: border-box;
4321
+ height: 40px;
4322
+ min-height: 40px;
4323
+ margin: 0 0 -1px;
4324
+ padding: 0 10px;
4325
+ border: 0;
4326
+ border-bottom: 2px solid transparent;
4327
+ border-radius: 0;
4328
+ background: transparent;
4329
+ color: var(--cn-board-text-soft);
4330
+ font-size: 14px;
4331
+ font-weight: 600;
4332
+ }
4333
+
4334
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__tab[role="tab"] * {
4335
+ font-weight: inherit;
4336
+ }
4337
+
4338
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__tab[role="tab"]::after {
4339
+ content: none;
4340
+ }
4341
+
4342
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__tab[role="tab"]:hover {
4343
+ background: transparent;
4344
+ border-bottom-color: var(--color-border-dark);
4345
+ color: var(--color-main-text);
4346
+ }
4347
+
4348
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__tab[role="tab"][aria-selected="true"] {
4349
+ background: transparent;
4350
+ border-bottom-color: var(--color-primary-element);
4351
+ color: var(--color-primary-element-light-text);
4352
+ }
4231
4353
  /* ========================================
4232
4354
  @conduction/nextcloud-vue — Table Styles
4233
4355
  ======================================== */
@@ -7092,6 +7214,13 @@ a.cn-kpi-card--board * {
7092
7214
  color: var(--color-text-maxcontrast);
7093
7215
  }
7094
7216
 
7217
+ /* A note the named source read off its answer, above the rows. */
7218
+ .cn-index-page__source-note {
7219
+ margin: 0 0 8px;
7220
+ color: var(--color-text-maxcontrast);
7221
+ font-size: 0.9em;
7222
+ }
7223
+
7095
7224
  .cn-index-page__scope-heading {
7096
7225
  display: flex;
7097
7226
  flex-direction: column;
@@ -9476,6 +9605,33 @@ li[data-cn-admin-tag] > .action-link::after {
9476
9605
  .cn-look-board .cn-tasks-widget .cn-tasks-widget__cell-actions .button-vue .button-vue__text.button-vue__text {
9477
9606
  padding-inline: 0;
9478
9607
  }
9608
+
9609
+ /* ---- Grouped cards (CnGroupedCardsWidget, DqZaaktype "Fasen en taken") --- */
9610
+ /* Groups 14px apart, each padded 14px with a 10px radius and a bold title; a
9611
+ card in a group is padded 9px 12px with the 8px control radius, its title
9612
+ 15px. The doubled class outranks the widget's scoped rules.
9613
+ @spec openspec/changes/board-grouped-cards/specs/board-grouped-cards/spec.md#requirement-board-grouped-cards-take-the-boards-group-and-card-shape */
9614
+ .cn-look-board .cn-grouped-cards__grid.cn-grouped-cards__grid {
9615
+ gap: 14px;
9616
+ }
9617
+
9618
+ .cn-look-board .cn-grouped-cards__group.cn-grouped-cards__group {
9619
+ padding: 14px;
9620
+ border-radius: 10px;
9621
+ }
9622
+
9623
+ .cn-look-board .cn-grouped-cards__group-title.cn-grouped-cards__group-title {
9624
+ font-weight: 700;
9625
+ }
9626
+
9627
+ .cn-look-board .cn-grouped-cards__item.cn-grouped-cards__item {
9628
+ padding: 9px 12px;
9629
+ border-radius: var(--cn-board-control-radius, 8px);
9630
+ }
9631
+
9632
+ .cn-look-board .cn-grouped-cards__item-title.cn-grouped-cards__item-title {
9633
+ font-size: 15px;
9634
+ }
9479
9635
  /*
9480
9636
  * The reports page under the board look (screens-reports-page-board-look,
9481
9637
  * board DcRapportages): a 28px title over a muted lead, one section per
@@ -25769,6 +25925,46 @@ a.cn-xwiki-card__title[data-v-1a6b61fd]:hover {
25769
25925
  }
25770
25926
 
25771
25927
 
25928
+ .cn-schema-rules__hint[data-v-1d1c1c13] {
25929
+ font-size: 12px;
25930
+ color: var(--color-text-maxcontrast);
25931
+ margin: 4px 0 12px;
25932
+ }
25933
+ .cn-schema-rules__table[data-v-1d1c1c13] {
25934
+ width: 100%;
25935
+ border-collapse: collapse;
25936
+ }
25937
+ .cn-schema-rules__table th[data-v-1d1c1c13],
25938
+ .cn-schema-rules__table td[data-v-1d1c1c13] {
25939
+ text-align: start;
25940
+ padding: 6px 8px;
25941
+ border-bottom: 1px solid var(--color-border);
25942
+ }
25943
+ .cn-schema-rules__trial[data-v-1d1c1c13] {
25944
+ margin-top: 16px;
25945
+ border-top: 1px solid var(--color-border);
25946
+ padding-top: 12px;
25947
+ }
25948
+ .cn-schema-rules__trace[data-v-1d1c1c13] {
25949
+ margin-top: 8px;
25950
+ padding: 8px 12px;
25951
+ border-radius: var(--border-radius-large, 8px);
25952
+ background-color: var(--color-background-hover);
25953
+ }
25954
+ .cn-schema-rules__trace p[data-v-1d1c1c13] {
25955
+ margin: 0;
25956
+ }
25957
+ .cn-schema-rules__verdict[data-v-1d1c1c13] {
25958
+ font-weight: bold;
25959
+ }
25960
+ .cn-schema-rules__error[data-v-1d1c1c13] {
25961
+ color: var(--color-error-text);
25962
+ }
25963
+ .cn-schema-rules__empty[data-v-1d1c1c13] {
25964
+ color: var(--color-text-maxcontrast);
25965
+ }
25966
+
25967
+
25772
25968
  .cn-stacked-bar[data-v-29628f56] {
25773
25969
  display: flex;
25774
25970
  flex-direction: column;
@@ -51565,6 +51761,106 @@ a.cn-integration-card__title[data-v-093a874d]:hover {
51565
51761
  }
51566
51762
 
51567
51763
 
51764
+ .cn-shipped-configuration__intro[data-v-fd515054],
51765
+ .cn-shipped-configuration__muted[data-v-fd515054] {
51766
+ color: var(--color-text-maxcontrast);
51767
+ }
51768
+ .cn-shipped-configuration__picker[data-v-fd515054] {
51769
+ max-width: 320px;
51770
+ }
51771
+ .cn-shipped-configuration__table[data-v-fd515054] {
51772
+ width: 100%;
51773
+ border-collapse: collapse;
51774
+ margin-top: 12px;
51775
+ /* Nextcloud sets `table { white-space: nowrap }`; a cell here can be a sentence. */
51776
+ white-space: normal;
51777
+ }
51778
+ .cn-shipped-configuration__table th[data-v-fd515054],
51779
+ .cn-shipped-configuration__table td[data-v-fd515054] {
51780
+ padding: 6px 8px;
51781
+ border-bottom: 1px solid var(--color-border);
51782
+ text-align: start;
51783
+ }
51784
+
51785
+
51786
+ /* Label above value, and the label wraps: Nextcloud's settings stylesheet gives a `dt` a fixed width. */
51787
+ .cn-search-index-status__figures[data-v-52b442a4] {
51788
+ display: grid;
51789
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
51790
+ gap: 16px 24px;
51791
+ margin-block: 0 12px;
51792
+ }
51793
+ .cn-search-index-status__figures > div[data-v-52b442a4] {
51794
+ display: flex;
51795
+ flex-direction: column;
51796
+ gap: 2px;
51797
+ min-width: 0;
51798
+ }
51799
+ .cn-search-index-status__figures dt[data-v-52b442a4] {
51800
+ display: block;
51801
+ float: none;
51802
+ width: auto;
51803
+ margin: 0;
51804
+ padding: 0;
51805
+ text-align: start;
51806
+ white-space: normal;
51807
+ overflow-wrap: anywhere;
51808
+ color: var(--color-text-maxcontrast);
51809
+ }
51810
+ .cn-search-index-status__figures dd[data-v-52b442a4] {
51811
+ font-weight: bold;
51812
+ margin: 0;
51813
+ overflow-wrap: anywhere;
51814
+ }
51815
+
51816
+
51817
+ .cn-readiness-checklist__description[data-v-4e10a556],
51818
+ .cn-readiness-checklist__empty[data-v-4e10a556] {
51819
+ color: var(--color-text-maxcontrast);
51820
+ margin: 0 0 12px;
51821
+ }
51822
+ .cn-readiness-checklist__group-title[data-v-4e10a556] {
51823
+ margin: 12px 0 4px;
51824
+ }
51825
+ .cn-readiness-checklist__list[data-v-4e10a556] {
51826
+ list-style: none;
51827
+ margin: 0;
51828
+ padding: 0;
51829
+ }
51830
+ .cn-readiness-checklist__item[data-v-4e10a556] {
51831
+ display: flex;
51832
+ gap: calc(var(--default-grid-baseline, 4px) * 3);
51833
+ padding-block: calc(var(--default-grid-baseline, 4px) * 2);
51834
+ border-block-end: 1px solid var(--color-border);
51835
+ }
51836
+ .cn-readiness-checklist__state[data-v-4e10a556] {
51837
+ flex: 0 0 auto;
51838
+ min-width: 6em;
51839
+ font-weight: bold;
51840
+ }
51841
+ .cn-readiness-checklist__state--met[data-v-4e10a556] {
51842
+ color: var(--color-success-text, var(--color-success));
51843
+ }
51844
+ .cn-readiness-checklist__state--unmet[data-v-4e10a556] {
51845
+ color: var(--color-error-text, var(--color-error));
51846
+ }
51847
+ .cn-readiness-checklist__state--unknown[data-v-4e10a556] {
51848
+ color: var(--color-text-maxcontrast);
51849
+ }
51850
+ .cn-readiness-checklist__body[data-v-4e10a556] {
51851
+ display: flex;
51852
+ flex-direction: column;
51853
+ gap: 2px;
51854
+ min-width: 0;
51855
+ }
51856
+ .cn-readiness-checklist__explanation[data-v-4e10a556] {
51857
+ color: var(--color-text-maxcontrast);
51858
+ }
51859
+ .cn-readiness-checklist__failure[data-v-4e10a556] {
51860
+ color: var(--color-error-text, var(--color-error));
51861
+ }
51862
+
51863
+
51568
51864
  .cn-ai-agent-picker {
51569
51865
  width: 100%;
51570
51866
  }
@@ -152,6 +152,7 @@ const DASHBOARD_CATALOG_WIDGET_KEYS = Object.freeze([
152
152
  'retention',
153
153
  'saved-view',
154
154
  'saved-views',
155
+ 'schema-rules',
155
156
  'sections',
156
157
  'settings-form',
157
158
  'spend-analytics',
@@ -1 +1 @@
1
- {"version":3,"file":"libraryWidgetKeys.js","sources":["../../../src/utils/libraryWidgetKeys.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n *\n * libraryWidgetKeys — the one vocabulary of widget keys the LIBRARY itself\n * renders, and the only list `validateManifestV2` is allowed to consult.\n *\n * WHY THIS MODULE EXISTS\n * ----------------------\n * The validator used to carry its own hand-written array of \"library built-in\n * widget keys\", with a comment instructing whoever added a built-in to append\n * it \"in the same PR\". That instruction was followed for five keys and missed\n * for six, so the validator knew 11 keys while the library actually rendered\n * 45. Nothing failed when the two disagreed, because the only consumer is an\n * exemption: a key the validator does not recognise is treated as a CUSTOM\n * registry component, which makes a legitimate single-widget library dashboard\n * fail the ADR-036 Decision 1 anti-pattern rule with advice (\"declare it as\n * type:'custom'\") that is wrong for a library widget.\n *\n * A comment cannot enforce anything, so the array moved here and\n * `tests/utils/libraryWidgetKeys.spec.js` now binds it to the two registries\n * that actually resolve a key at runtime:\n *\n * 1. `BUILT_IN_WIDGETS` (components/CnWidgetGrid/builtInWidgets.js) — the v2\n * manifest widget set `CnWidgetGrid` resolves a `widgetKey` against.\n * 2. The dashboard widget catalog (`dashboardWidgetRegistry`), populated by\n * `registerDashboardWidgets.js`. `CnWidgetGrid` falls back to it (third in\n * the chain, after the consumer registry and `BUILT_IN_WIDGETS`), so a\n * catalog key renders on a v2 page exactly like a `BUILT_IN_WIDGETS` one.\n *\n * The test asserts SET EQUALITY in both directions against the live registries,\n * so adding a widget to either registry without touching this file fails CI,\n * and deleting one without removing it here fails too. The lists below are the\n * validator's view; the registries are the truth the test holds them to.\n *\n * THE CATALOG IS NOT LEGACY. It is a live half of the same vocabulary, and the\n * old array already conceded the point by exempting `chart` and `stats-block`,\n * which are catalog-only keys that `BUILT_IN_WIDGETS` has never held. What it\n * got wrong was doing that for two keys and not the other thirty-seven.\n * `widgetDispatch.js` unified the two resolution paths for the same reason: a\n * widget authored against one vocabulary was invisible to the other and said\n * nothing about why (101 of 236 detail widgets on hrmq).\n *\n * @module utils/libraryWidgetKeys\n */\n\nimport { WIDGET_TYPE_ALIASES } from './widgetTypeAliases.js'\n\n/**\n * Keys of `BUILT_IN_WIDGETS` — the v2 manifest widget set.\n *\n * Kept in the registry's own declaration order so a diff against\n * `builtInWidgets.js` reads straight down.\n *\n * @type {string[]} Frozen.\n */\nexport const BUILT_IN_WIDGET_KEYS = Object.freeze([\n\t'object-table',\n\t'form-renderer',\n\t'map-viewer',\n\t'notice',\n\t'decision-list',\n\t'object-geo',\n\t'card-grid',\n\t'nav-card-grid',\n\t'data',\n\t'metadata',\n\t'related',\n\t'integration',\n\t'banner',\n\t'audit-trail',\n\t'timeline',\n\t'header',\n\t'text',\n\t'divider',\n\t'saved-view-alert',\n\t'exports',\n\t'object-translations',\n])\n\n/**\n * Widget types the LIBRARY registers into the dashboard catalog at import time\n * (`registerDashboardWidgets.js` and the widget `index.js` modules it pulls in).\n *\n * Deliberately a static list rather than a read of `dashboardWidgetRegistry`:\n * that object is mutable and consumer-extensible, so deriving the exemption\n * from it at call time would let an app register its own full-page component in\n * the catalog and walk straight through the ADR-036 Decision 1 rule the\n * exemption exists to enforce. Only keys the library itself ships are exempt.\n *\n * Sorted, because unlike `BUILT_IN_WIDGETS` these registrations are spread over\n * ~30 files and have no meaningful declaration order.\n *\n * @type {string[]} Frozen.\n */\nexport const DASHBOARD_CATALOG_WIDGET_KEYS = Object.freeze([\n\t'ai-chat',\n\t'attention-flag',\n\t'audit-trail',\n\t'banner',\n\t'calendar',\n\t'chart',\n\t'checklist',\n\t'checklist-run',\n\t'chips-field',\n\t'choice-picker',\n\t'container',\n\t'conversation',\n\t'countdown',\n\t'data',\n\t'delta',\n\t'device-frames',\n\t'divider',\n\t'document-review',\n\t'events',\n\t'facts',\n\t'field-list',\n\t'files',\n\t'flow-runs',\n\t'gauge',\n\t'grouped-cards',\n\t'header',\n\t'image',\n\t'interaction-form',\n\t'kb-search',\n\t'label',\n\t'link',\n\t'linked',\n\t'links',\n\t'macros',\n\t'mail',\n\t'map',\n\t'markdown',\n\t'menu',\n\t'nc-widget',\n\t'next-step',\n\t'notepad',\n\t// `news` was here until the widget moved to LaunchPad, which owns the feed\n\t// fetching. An app that renders one now gets it from LaunchPad's registry.\n\t'object-geo',\n\t'object-list',\n\t'object-table',\n\t'parties',\n\t'party-actions',\n\t'people',\n\t'plan',\n\t'quicklinks',\n\t'radio-cards',\n\t'record-list',\n\t'related',\n\t'retention',\n\t'saved-view',\n\t'saved-views',\n\t'sections',\n\t'settings-form',\n\t'spend-analytics',\n\t'stacked-bar',\n\t'stages',\n\t'stat',\n\t'stats-block',\n\t'status-explainer',\n\t'switch-rows',\n\t'table',\n\t'tabs',\n\t'tasks',\n\t'team-workload',\n\t'text',\n\t'tile',\n\t'timeline',\n\t'toggle-table',\n\t'video',\n\t'week-strip',\n\t'working-calendar',\n\t'work-queue',\n\t'workspace-filter',\n])\n\n/**\n * Expand a key set over `WIDGET_TYPE_ALIASES` so both spellings of an aliased\n * widget are present whenever either one is.\n *\n * `CnWidgetGrid` resolves a key and its canonical form (`object-table` ⇄\n * `table`, `map-viewer` ⇄ `map`), so both spellings render and both must be\n * exempt. Today each registry happens to hold one side of each pair, which is\n * exactly the accident that would silently stop being true when the next alias\n * lands.\n *\n * @param {Set<string>} keys The key set to expand, mutated in place.\n * @return {Set<string>} The same set.\n */\nfunction expandAliases(keys) {\n\tfor (const [alias, canonical] of Object.entries(WIDGET_TYPE_ALIASES)) {\n\t\tif (keys.has(alias) || keys.has(canonical)) {\n\t\t\tkeys.add(alias)\n\t\t\tkeys.add(canonical)\n\t\t}\n\t}\n\treturn keys\n}\n\n/**\n * Every widget key the library renders itself: both registries, plus both\n * spellings of every alias.\n *\n * A `widgetKey` in this list is served by a library `Cn*` SFC and does NOT\n * count as a custom registry component for the single-12×12-widget dashboard\n * rule (ADR-036 Decision 1).\n *\n * @type {string[]} Frozen.\n */\nexport const LIBRARY_WIDGET_KEYS = Object.freeze([\n\t...expandAliases(new Set([\n\t\t...BUILT_IN_WIDGET_KEYS,\n\t\t...DASHBOARD_CATALOG_WIDGET_KEYS,\n\t])),\n])\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"libraryWidgetKeys.js","sources":["../../../src/utils/libraryWidgetKeys.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n *\n * libraryWidgetKeys — the one vocabulary of widget keys the LIBRARY itself\n * renders, and the only list `validateManifestV2` is allowed to consult.\n *\n * WHY THIS MODULE EXISTS\n * ----------------------\n * The validator used to carry its own hand-written array of \"library built-in\n * widget keys\", with a comment instructing whoever added a built-in to append\n * it \"in the same PR\". That instruction was followed for five keys and missed\n * for six, so the validator knew 11 keys while the library actually rendered\n * 45. Nothing failed when the two disagreed, because the only consumer is an\n * exemption: a key the validator does not recognise is treated as a CUSTOM\n * registry component, which makes a legitimate single-widget library dashboard\n * fail the ADR-036 Decision 1 anti-pattern rule with advice (\"declare it as\n * type:'custom'\") that is wrong for a library widget.\n *\n * A comment cannot enforce anything, so the array moved here and\n * `tests/utils/libraryWidgetKeys.spec.js` now binds it to the two registries\n * that actually resolve a key at runtime:\n *\n * 1. `BUILT_IN_WIDGETS` (components/CnWidgetGrid/builtInWidgets.js) — the v2\n * manifest widget set `CnWidgetGrid` resolves a `widgetKey` against.\n * 2. The dashboard widget catalog (`dashboardWidgetRegistry`), populated by\n * `registerDashboardWidgets.js`. `CnWidgetGrid` falls back to it (third in\n * the chain, after the consumer registry and `BUILT_IN_WIDGETS`), so a\n * catalog key renders on a v2 page exactly like a `BUILT_IN_WIDGETS` one.\n *\n * The test asserts SET EQUALITY in both directions against the live registries,\n * so adding a widget to either registry without touching this file fails CI,\n * and deleting one without removing it here fails too. The lists below are the\n * validator's view; the registries are the truth the test holds them to.\n *\n * THE CATALOG IS NOT LEGACY. It is a live half of the same vocabulary, and the\n * old array already conceded the point by exempting `chart` and `stats-block`,\n * which are catalog-only keys that `BUILT_IN_WIDGETS` has never held. What it\n * got wrong was doing that for two keys and not the other thirty-seven.\n * `widgetDispatch.js` unified the two resolution paths for the same reason: a\n * widget authored against one vocabulary was invisible to the other and said\n * nothing about why (101 of 236 detail widgets on hrmq).\n *\n * @module utils/libraryWidgetKeys\n */\n\nimport { WIDGET_TYPE_ALIASES } from './widgetTypeAliases.js'\n\n/**\n * Keys of `BUILT_IN_WIDGETS` — the v2 manifest widget set.\n *\n * Kept in the registry's own declaration order so a diff against\n * `builtInWidgets.js` reads straight down.\n *\n * @type {string[]} Frozen.\n */\nexport const BUILT_IN_WIDGET_KEYS = Object.freeze([\n\t'object-table',\n\t'form-renderer',\n\t'map-viewer',\n\t'notice',\n\t'decision-list',\n\t'object-geo',\n\t'card-grid',\n\t'nav-card-grid',\n\t'data',\n\t'metadata',\n\t'related',\n\t'integration',\n\t'banner',\n\t'audit-trail',\n\t'timeline',\n\t'header',\n\t'text',\n\t'divider',\n\t'saved-view-alert',\n\t'exports',\n\t'object-translations',\n])\n\n/**\n * Widget types the LIBRARY registers into the dashboard catalog at import time\n * (`registerDashboardWidgets.js` and the widget `index.js` modules it pulls in).\n *\n * Deliberately a static list rather than a read of `dashboardWidgetRegistry`:\n * that object is mutable and consumer-extensible, so deriving the exemption\n * from it at call time would let an app register its own full-page component in\n * the catalog and walk straight through the ADR-036 Decision 1 rule the\n * exemption exists to enforce. Only keys the library itself ships are exempt.\n *\n * Sorted, because unlike `BUILT_IN_WIDGETS` these registrations are spread over\n * ~30 files and have no meaningful declaration order.\n *\n * @type {string[]} Frozen.\n */\nexport const DASHBOARD_CATALOG_WIDGET_KEYS = Object.freeze([\n\t'ai-chat',\n\t'attention-flag',\n\t'audit-trail',\n\t'banner',\n\t'calendar',\n\t'chart',\n\t'checklist',\n\t'checklist-run',\n\t'chips-field',\n\t'choice-picker',\n\t'container',\n\t'conversation',\n\t'countdown',\n\t'data',\n\t'delta',\n\t'device-frames',\n\t'divider',\n\t'document-review',\n\t'events',\n\t'facts',\n\t'field-list',\n\t'files',\n\t'flow-runs',\n\t'gauge',\n\t'grouped-cards',\n\t'header',\n\t'image',\n\t'interaction-form',\n\t'kb-search',\n\t'label',\n\t'link',\n\t'linked',\n\t'links',\n\t'macros',\n\t'mail',\n\t'map',\n\t'markdown',\n\t'menu',\n\t'nc-widget',\n\t'next-step',\n\t'notepad',\n\t// `news` was here until the widget moved to LaunchPad, which owns the feed\n\t// fetching. An app that renders one now gets it from LaunchPad's registry.\n\t'object-geo',\n\t'object-list',\n\t'object-table',\n\t'parties',\n\t'party-actions',\n\t'people',\n\t'plan',\n\t'quicklinks',\n\t'radio-cards',\n\t'record-list',\n\t'related',\n\t'retention',\n\t'saved-view',\n\t'saved-views',\n\t'schema-rules',\n\t'sections',\n\t'settings-form',\n\t'spend-analytics',\n\t'stacked-bar',\n\t'stages',\n\t'stat',\n\t'stats-block',\n\t'status-explainer',\n\t'switch-rows',\n\t'table',\n\t'tabs',\n\t'tasks',\n\t'team-workload',\n\t'text',\n\t'tile',\n\t'timeline',\n\t'toggle-table',\n\t'video',\n\t'week-strip',\n\t'working-calendar',\n\t'work-queue',\n\t'workspace-filter',\n])\n\n/**\n * Expand a key set over `WIDGET_TYPE_ALIASES` so both spellings of an aliased\n * widget are present whenever either one is.\n *\n * `CnWidgetGrid` resolves a key and its canonical form (`object-table` ⇄\n * `table`, `map-viewer` ⇄ `map`), so both spellings render and both must be\n * exempt. Today each registry happens to hold one side of each pair, which is\n * exactly the accident that would silently stop being true when the next alias\n * lands.\n *\n * @param {Set<string>} keys The key set to expand, mutated in place.\n * @return {Set<string>} The same set.\n */\nfunction expandAliases(keys) {\n\tfor (const [alias, canonical] of Object.entries(WIDGET_TYPE_ALIASES)) {\n\t\tif (keys.has(alias) || keys.has(canonical)) {\n\t\t\tkeys.add(alias)\n\t\t\tkeys.add(canonical)\n\t\t}\n\t}\n\treturn keys\n}\n\n/**\n * Every widget key the library renders itself: both registries, plus both\n * spellings of every alias.\n *\n * A `widgetKey` in this list is served by a library `Cn*` SFC and does NOT\n * count as a custom registry component for the single-12×12-widget dashboard\n * rule (ADR-036 Decision 1).\n *\n * @type {string[]} Frozen.\n */\nexport const LIBRARY_WIDGET_KEYS = Object.freeze([\n\t...expandAliases(new Set([\n\t\t...BUILT_IN_WIDGET_KEYS,\n\t\t...DASHBOARD_CATALOG_WIDGET_KEYS,\n\t])),\n])\n"],"names":[],"mappings":"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"}