@formicoidea/labre-core 1.0.0 → 2.0.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 (207) hide show
  1. package/architecture/code.c4 +48 -44
  2. package/architecture/likec4.config.json +3 -3
  3. package/dist/_pkgs/affine-block-root/configs/toolbar.d.ts +1 -1
  4. package/dist/_pkgs/affine-block-root/configs/toolbar.js +4 -2
  5. package/dist/_pkgs/affine-block-surface/extensions/reading-toolbar.js +12 -12
  6. package/dist/_pkgs/affine-components/context-menu/menu-all.d.ts +1 -0
  7. package/dist/_pkgs/affine-components/context-menu/menu-renderer.d.ts +3 -1
  8. package/dist/_pkgs/affine-components/context-menu/menu-renderer.js +9 -1
  9. package/dist/_pkgs/affine-components/context-menu/menu.d.ts +7 -0
  10. package/dist/_pkgs/affine-components/context-menu/menu.js +5 -0
  11. package/dist/_pkgs/affine-components/context-menu/sub-menu.d.ts +19 -1
  12. package/dist/_pkgs/affine-components/context-menu/sub-menu.js +46 -7
  13. package/dist/_pkgs/affine-components/highlight-dropdown-menu/highlight-duotone-icon.js +8 -8
  14. package/dist/_pkgs/affine-components/highlight-dropdown-menu/text-duotone-icon.js +11 -11
  15. package/dist/_pkgs/affine-database-block/configs/slash-menu.d.ts +24 -0
  16. package/dist/_pkgs/affine-database-block/configs/slash-menu.js +52 -37
  17. package/dist/_pkgs/affine-database-block/creation-menu.d.ts +6 -0
  18. package/dist/_pkgs/affine-database-block/data-source.d.ts +6 -0
  19. package/dist/_pkgs/affine-database-block/data-source.js +16 -0
  20. package/dist/_pkgs/affine-database-block/database-block-styles.js +4 -3
  21. package/dist/_pkgs/affine-database-block/database-block.d.ts +23 -0
  22. package/dist/_pkgs/affine-database-block/database-block.js +129 -19
  23. package/dist/_pkgs/affine-database-block/database-dnd-preview-block.js +5 -1
  24. package/dist/_pkgs/affine-database-block/detail-panel/block-renderer.js +5 -2
  25. package/dist/_pkgs/affine-database-block/detail-panel/note-renderer.js +3 -2
  26. package/dist/_pkgs/affine-database-block/external-data-source.d.ts +17 -0
  27. package/dist/_pkgs/affine-database-block/external-data-source.js +54 -4
  28. package/dist/_pkgs/affine-database-block/index.d.ts +3 -0
  29. package/dist/_pkgs/affine-database-block/index.js +5 -0
  30. package/dist/_pkgs/affine-database-block/linked-view.d.ts +59 -0
  31. package/dist/_pkgs/affine-database-block/linked-view.js +131 -1
  32. package/dist/_pkgs/affine-database-block/properties/created-time/define.js +3 -1
  33. package/dist/_pkgs/affine-database-block/properties/link/cell-renderer.js +3 -2
  34. package/dist/_pkgs/affine-database-block/properties/link/define.js +3 -1
  35. package/dist/_pkgs/affine-database-block/properties/rich-text/define.js +3 -1
  36. package/dist/_pkgs/affine-database-block/properties/text/hosted.js +1 -0
  37. package/dist/_pkgs/affine-database-block/properties/title/define.js +3 -1
  38. package/dist/_pkgs/affine-database-block/properties/title/hosted.js +1 -0
  39. package/dist/_pkgs/affine-database-block/service/new-row-menu.d.ts +1 -1
  40. package/dist/_pkgs/affine-database-block/service/new-row-menu.js +1 -1
  41. package/dist/_pkgs/affine-database-block/translations.d.ts +29 -0
  42. package/dist/_pkgs/affine-database-block/translations.js +104 -0
  43. package/dist/_pkgs/affine-database-block/turn-into-source.d.ts +38 -0
  44. package/dist/_pkgs/affine-database-block/turn-into-source.js +187 -0
  45. package/dist/_pkgs/affine-database-block/view-deletion.d.ts +15 -0
  46. package/dist/_pkgs/affine-database-block/view-deletion.js +113 -0
  47. package/dist/_pkgs/affine-database-block/views/index.d.ts +7 -9
  48. package/dist/_pkgs/affine-database-block/views/index.js +7 -10
  49. package/dist/_pkgs/affine-database-engine/core/common/properties.js +7 -7
  50. package/dist/_pkgs/affine-database-engine/core/common/property-menu.d.ts +18 -2
  51. package/dist/_pkgs/affine-database-engine/core/common/property-menu.js +78 -27
  52. package/dist/_pkgs/affine-database-engine/core/data-source/base.d.ts +11 -0
  53. package/dist/_pkgs/affine-database-engine/core/data-source/base.js +3 -0
  54. package/dist/_pkgs/affine-database-engine/core/detail/detail.js +8 -5
  55. package/dist/_pkgs/affine-database-engine/core/detail/field.js +14 -7
  56. package/dist/_pkgs/affine-database-engine/core/filter/add-filter.js +4 -2
  57. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/boolean.js +7 -4
  58. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/create.d.ts +9 -1
  59. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/create.js +2 -0
  60. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/date.js +7 -4
  61. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/multi-tag.js +17 -8
  62. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/number.js +6 -6
  63. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/string.js +19 -12
  64. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/tag.js +9 -4
  65. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/unknown.js +7 -4
  66. package/dist/_pkgs/affine-database-engine/core/filter/literal/define.js +6 -4
  67. package/dist/_pkgs/affine-database-engine/core/filter/literal/matcher.d.ts +2 -1
  68. package/dist/_pkgs/affine-database-engine/core/filter/literal/matcher.js +3 -2
  69. package/dist/_pkgs/affine-database-engine/core/filter/literal/types.d.ts +4 -1
  70. package/dist/_pkgs/affine-database-engine/core/filter/literal/types.js +1 -1
  71. package/dist/_pkgs/affine-database-engine/core/group-by/define.js +11 -9
  72. package/dist/_pkgs/affine-database-engine/core/group-by/group-title.js +16 -6
  73. package/dist/_pkgs/affine-database-engine/core/group-by/locate-row.d.ts +16 -0
  74. package/dist/_pkgs/affine-database-engine/core/group-by/locate-row.js +32 -0
  75. package/dist/_pkgs/affine-database-engine/core/group-by/renderer/date-group.js +10 -3
  76. package/dist/_pkgs/affine-database-engine/core/group-by/setting.d.ts +2 -0
  77. package/dist/_pkgs/affine-database-engine/core/group-by/setting.js +40 -28
  78. package/dist/_pkgs/affine-database-engine/core/group-by/trait.d.ts +3 -0
  79. package/dist/_pkgs/affine-database-engine/core/group-by/trait.js +8 -0
  80. package/dist/_pkgs/affine-database-engine/core/group-by/types.d.ts +3 -1
  81. package/dist/_pkgs/affine-database-engine/core/group-by/types.js +1 -1
  82. package/dist/_pkgs/affine-database-engine/core/property/types.d.ts +7 -0
  83. package/dist/_pkgs/affine-database-engine/core/property/types.js +1 -1
  84. package/dist/_pkgs/affine-database-engine/core/sort/add-sort.js +3 -1
  85. package/dist/_pkgs/affine-database-engine/core/statistics/any.js +43 -21
  86. package/dist/_pkgs/affine-database-engine/core/statistics/checkbox.js +29 -14
  87. package/dist/_pkgs/affine-database-engine/core/statistics/number.js +54 -31
  88. package/dist/_pkgs/affine-database-engine/core/statistics/types.d.ts +8 -0
  89. package/dist/_pkgs/affine-database-engine/core/statistics/types.js +2 -1
  90. package/dist/_pkgs/affine-database-engine/core/utils/wording.d.ts +20 -1
  91. package/dist/_pkgs/affine-database-engine/core/utils/wording.js +24 -0
  92. package/dist/_pkgs/affine-database-engine/core/view-manager/property.d.ts +7 -0
  93. package/dist/_pkgs/affine-database-engine/core/view-manager/property.js +29 -5
  94. package/dist/_pkgs/affine-database-engine/core/view-manager/single-view.d.ts +14 -0
  95. package/dist/_pkgs/affine-database-engine/core/view-manager/single-view.js +11 -0
  96. package/dist/_pkgs/affine-database-engine/property-presets/checkbox/define.js +3 -1
  97. package/dist/_pkgs/affine-database-engine/property-presets/date/define.js +3 -1
  98. package/dist/_pkgs/affine-database-engine/property-presets/multi-select/define.js +3 -1
  99. package/dist/_pkgs/affine-database-engine/property-presets/number/define.js +3 -1
  100. package/dist/_pkgs/affine-database-engine/property-presets/number/utils/formats.d.ts +3 -0
  101. package/dist/_pkgs/affine-database-engine/property-presets/number/utils/formats.js +56 -9
  102. package/dist/_pkgs/affine-database-engine/property-presets/progress/define.js +3 -1
  103. package/dist/_pkgs/affine-database-engine/property-presets/select/define.js +3 -1
  104. package/dist/_pkgs/affine-database-engine/property-presets/text/define.js +3 -1
  105. package/dist/_pkgs/affine-database-engine/translations.d.ts +133 -5
  106. package/dist/_pkgs/affine-database-engine/translations.js +625 -9
  107. package/dist/_pkgs/affine-database-engine/view-presets/convert.js +0 -28
  108. package/dist/_pkgs/affine-database-engine/view-presets/effect.js +0 -2
  109. package/dist/_pkgs/affine-database-engine/view-presets/flat/flat-converts.js +2 -4
  110. package/dist/_pkgs/affine-database-engine/view-presets/flat/flat-view-ui.d.ts +57 -0
  111. package/dist/_pkgs/affine-database-engine/view-presets/flat/flat-view-ui.js +113 -4
  112. package/dist/_pkgs/affine-database-engine/view-presets/gallery/gallery-view.js +2 -1
  113. package/dist/_pkgs/affine-database-engine/view-presets/index.d.ts +0 -2
  114. package/dist/_pkgs/affine-database-engine/view-presets/index.js +0 -3
  115. package/dist/_pkgs/affine-database-engine/view-presets/kanban/kanban-view-manager.js +2 -0
  116. package/dist/_pkgs/affine-database-engine/view-presets/kanban/mobile/group.js +7 -5
  117. package/dist/_pkgs/affine-database-engine/view-presets/kanban/mobile/kanban-view-ui-logic.d.ts +5 -0
  118. package/dist/_pkgs/affine-database-engine/view-presets/kanban/mobile/kanban-view-ui-logic.js +25 -3
  119. package/dist/_pkgs/affine-database-engine/view-presets/kanban/mobile/menu.js +12 -6
  120. package/dist/_pkgs/affine-database-engine/view-presets/kanban/pc/controller/selection.d.ts +8 -0
  121. package/dist/_pkgs/affine-database-engine/view-presets/kanban/pc/controller/selection.js +35 -12
  122. package/dist/_pkgs/affine-database-engine/view-presets/kanban/pc/group.js +7 -5
  123. package/dist/_pkgs/affine-database-engine/view-presets/kanban/pc/header.js +5 -1
  124. package/dist/_pkgs/affine-database-engine/view-presets/kanban/pc/kanban-view-ui-logic.d.ts +5 -0
  125. package/dist/_pkgs/affine-database-engine/view-presets/kanban/pc/kanban-view-ui-logic.js +8 -4
  126. package/dist/_pkgs/affine-database-engine/view-presets/kanban/pc/menu.js +12 -6
  127. package/dist/_pkgs/affine-database-engine/view-presets/list/list-view.js +2 -1
  128. package/dist/_pkgs/affine-database-engine/view-presets/table/mobile/column-header.js +6 -4
  129. package/dist/_pkgs/affine-database-engine/view-presets/table/mobile/group.js +6 -5
  130. package/dist/_pkgs/affine-database-engine/view-presets/table/mobile/header.js +2 -2
  131. package/dist/_pkgs/affine-database-engine/view-presets/table/mobile/table-view-ui-logic.d.ts +4 -3
  132. package/dist/_pkgs/affine-database-engine/view-presets/table/mobile/table-view-ui-logic.js +29 -5
  133. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/controller/clipboard.js +6 -2
  134. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/controller/selection.js +2 -0
  135. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/group.js +6 -5
  136. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/header/column-header.js +11 -7
  137. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/header/database-header-column.js +16 -12
  138. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/header/number-format-bar.js +4 -2
  139. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/menu.js +9 -6
  140. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/table-view-ui-logic.d.ts +8 -1
  141. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/table-view-ui-logic.js +29 -7
  142. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/controller/clipboard.js +6 -2
  143. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/controller/selection.js +2 -0
  144. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/group/bottom/group-footer.js +5 -2
  145. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/group/bottom/stats/column-stats-column.d.ts +1 -1
  146. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/group/bottom/stats/column-stats-column.js +14 -6
  147. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/group/top/group-header.js +5 -2
  148. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/group/top/group-title.js +5 -3
  149. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/group/top/header/column-header.js +17 -10
  150. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/group/top/header/number-format-bar.js +4 -2
  151. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/group/top/header/single-column-header.js +20 -14
  152. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/row/menu.js +9 -6
  153. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/table-view-ui-logic.d.ts +6 -1
  154. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/table-view-ui-logic.js +30 -3
  155. package/dist/_pkgs/affine-database-engine/view-presets/table/stats/column-stats-column.d.ts +1 -1
  156. package/dist/_pkgs/affine-database-engine/view-presets/table/stats/column-stats-column.js +14 -6
  157. package/dist/_pkgs/affine-database-engine/view-presets/table/table-view-manager.js +2 -0
  158. package/dist/_pkgs/affine-database-engine/widget-presets/quick-setting-bar/filter/condition-view.d.ts +2 -0
  159. package/dist/_pkgs/affine-database-engine/widget-presets/quick-setting-bar/filter/condition-view.js +13 -6
  160. package/dist/_pkgs/affine-database-engine/widget-presets/quick-setting-bar/filter/group-panel-view.js +20 -13
  161. package/dist/_pkgs/affine-database-engine/widget-presets/quick-setting-bar/filter/root-panel-view.js +10 -5
  162. package/dist/_pkgs/affine-database-engine/widget-presets/quick-setting-bar/sort/root-panel.js +8 -5
  163. package/dist/_pkgs/affine-database-engine/widget-presets/tools/presets/search/search.js +2 -2
  164. package/dist/_pkgs/affine-database-engine/widget-presets/tools/presets/table-add-row/add-row.d.ts +6 -0
  165. package/dist/_pkgs/affine-database-engine/widget-presets/tools/presets/table-add-row/add-row.js +49 -4
  166. package/dist/_pkgs/affine-database-engine/widget-presets/tools/presets/view-options/view-settings.d.ts +3 -3
  167. package/dist/_pkgs/affine-database-engine/widget-presets/tools/presets/view-options/view-settings.js +3 -3
  168. package/dist/_pkgs/affine-database-engine/widget-presets/views-bar/views-view.js +5 -0
  169. package/dist/_pkgs/affine-database-view-block/configs/slash-menu.js +6 -3
  170. package/dist/_pkgs/affine-database-view-block/data-view-block.js +5 -4
  171. package/dist/_pkgs/affine-fragment-doc-title/doc-title.d.ts +3 -2
  172. package/dist/_pkgs/affine-fragment-doc-title/doc-title.js +3 -2
  173. package/dist/_pkgs/affine-shared/services/data-source-picker-service.d.ts +130 -1
  174. package/dist/_pkgs/affine-widget-edgeless-zoom-toolbar/index.js +26 -26
  175. package/dist/_pkgs/affine-widget-keyboard-toolbar/config.js +10 -21
  176. package/dist/_pkgs/affine-widget-keyboard-toolbar/icons.js +98 -98
  177. package/dist/_pkgs/affine-widget-page-dragging-area/index.js +10 -10
  178. package/dist/_pkgs/affine-widget-viewport-overlay/index.js +13 -13
  179. package/package.json +1 -1
  180. package/dist/_pkgs/affine-database-engine/view-presets/calendar/calendar-view-manager.d.ts +0 -70
  181. package/dist/_pkgs/affine-database-engine/view-presets/calendar/calendar-view-manager.js +0 -449
  182. package/dist/_pkgs/affine-database-engine/view-presets/calendar/define.d.ts +0 -10
  183. package/dist/_pkgs/affine-database-engine/view-presets/calendar/define.js +0 -29
  184. package/dist/_pkgs/affine-database-engine/view-presets/calendar/effect.d.ts +0 -1
  185. package/dist/_pkgs/affine-database-engine/view-presets/calendar/effect.js +0 -4
  186. package/dist/_pkgs/affine-database-engine/view-presets/calendar/index.d.ts +0 -6
  187. package/dist/_pkgs/affine-database-engine/view-presets/calendar/index.js +0 -6
  188. package/dist/_pkgs/affine-database-engine/view-presets/calendar/layout.d.ts +0 -37
  189. package/dist/_pkgs/affine-database-engine/view-presets/calendar/layout.js +0 -138
  190. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/actions.d.ts +0 -7
  191. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/actions.js +0 -64
  192. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/dnd.d.ts +0 -32
  193. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/dnd.js +0 -159
  194. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/effect.d.ts +0 -1
  195. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/effect.js +0 -7
  196. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/hit-test.d.ts +0 -1
  197. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/hit-test.js +0 -28
  198. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/styles.d.ts +0 -1
  199. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/styles.js +0 -707
  200. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/view.d.ts +0 -89
  201. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/view.js +0 -849
  202. package/dist/_pkgs/affine-database-engine/view-presets/calendar/renderer.d.ts +0 -2
  203. package/dist/_pkgs/affine-database-engine/view-presets/calendar/renderer.js +0 -8
  204. package/dist/_pkgs/affine-database-engine/view-presets/calendar/source.d.ts +0 -8
  205. package/dist/_pkgs/affine-database-engine/view-presets/calendar/source.js +0 -3
  206. package/dist/_pkgs/affine-database-engine/view-presets/calendar/types.d.ts +0 -79
  207. package/dist/_pkgs/affine-database-engine/view-presets/calendar/types.js +0 -1
@@ -1404,7 +1404,7 @@ model {
1404
1404
  link https://github.com/formicoidea/blocksuite-labre/tree/blocksuite-labre-main/packages/affine/database/block
1405
1405
  metadata {
1406
1406
  path 'packages/affine/database/block'
1407
- files '63'
1407
+ files '65'
1408
1408
  }
1409
1409
  adapters = folder 'adapters/' {
1410
1410
  link https://github.com/formicoidea/blocksuite-labre/tree/blocksuite-labre-main/packages/affine/database/block/src/adapters
@@ -1459,7 +1459,7 @@ model {
1459
1459
  link https://github.com/formicoidea/blocksuite-labre/tree/blocksuite-labre-main/packages/affine/database/block/src
1460
1460
  metadata {
1461
1461
  path 'packages/affine/database/block/src'
1462
- files '18'
1462
+ files '20'
1463
1463
  }
1464
1464
  }
1465
1465
  utils = folder 'utils/' {
@@ -1537,13 +1537,13 @@ model {
1537
1537
  link https://github.com/formicoidea/blocksuite-labre/tree/blocksuite-labre-main/packages/affine/database/engine
1538
1538
  metadata {
1539
1539
  path 'packages/affine/database/engine'
1540
- files '351'
1540
+ files '338'
1541
1541
  }
1542
1542
  core = folder 'core/' {
1543
1543
  link https://github.com/formicoidea/blocksuite-labre/tree/blocksuite-labre-main/packages/affine/database/engine/src/core
1544
1544
  metadata {
1545
1545
  path 'packages/affine/database/engine/src/core'
1546
- files '166'
1546
+ files '167'
1547
1547
  }
1548
1548
  }
1549
1549
  property-presets = folder 'property-presets/' {
@@ -1564,7 +1564,7 @@ model {
1564
1564
  link https://github.com/formicoidea/blocksuite-labre/tree/blocksuite-labre-main/packages/affine/database/engine/src/view-presets
1565
1565
  metadata {
1566
1566
  path 'packages/affine/database/engine/src/view-presets'
1567
- files '128'
1567
+ files '114'
1568
1568
  }
1569
1569
  }
1570
1570
  widget-presets = folder 'widget-presets/' {
@@ -3722,19 +3722,19 @@ model {
3722
3722
  features.components -[uses]-> framework.store '8 imports, 7 type-only'
3723
3723
  features.components -[uses]-> framework.sync '1 import, 1 type-only'
3724
3724
  features.components -[uses]-> model_.model_ '16 imports, 5 type-only'
3725
- features.database.block -[uses]-> features.components '8 imports, 1 type-only'
3725
+ features.database.block -[uses]-> features.components '10 imports, 1 type-only'
3726
3726
  features.database.block -[uses]-> features.database.engine '42 imports, 10 type-only'
3727
3727
  features.database.block -[uses]-> features.ext-loader '2 imports'
3728
3728
  features.database.block -[uses]-> features.inlines.preset '3 imports'
3729
3729
  features.database.block -[uses]-> features.inlines.reference '1 import'
3730
3730
  features.database.block -[uses]-> features.rich-text '2 imports, 2 type-only'
3731
- features.database.block -[uses]-> features.shared '41 imports, 7 type-only'
3731
+ features.database.block -[uses]-> features.shared '45 imports, 8 type-only'
3732
3732
  features.database.block -[uses]-> features.widgets.drag-handle '1 import'
3733
3733
  features.database.block -[uses]-> features.widgets.slash-menu '2 imports, 1 type-only'
3734
3734
  features.database.block -[uses]-> framework.global_ '16 imports'
3735
- features.database.block -[uses]-> framework.std '18 imports, 8 type-only'
3736
- features.database.block -[uses]-> framework.store '23 imports, 15 type-only'
3737
- features.database.block -[uses]-> model_.model_ '19 imports, 11 type-only'
3735
+ features.database.block -[uses]-> framework.std '19 imports, 9 type-only'
3736
+ features.database.block -[uses]-> framework.store '24 imports, 16 type-only'
3737
+ features.database.block -[uses]-> model_.model_ '21 imports, 13 type-only'
3738
3738
  features.database.editor -[uses]-> features.components '6 imports'
3739
3739
  features.database.editor -[uses]-> features.database.block '9 imports, 2 type-only'
3740
3740
  features.database.editor -[uses]-> features.database.engine '8 imports, 2 type-only'
@@ -3744,14 +3744,14 @@ model {
3744
3744
  features.database.editor -[uses]-> framework.global_ '3 imports'
3745
3745
  features.database.editor -[uses]-> framework.std '8 imports, 5 type-only'
3746
3746
  features.database.editor -[uses]-> framework.store '1 import'
3747
- features.database.engine -[uses]-> features.components '74 imports, 4 type-only'
3748
- features.database.engine -[uses]-> features.shared '84 imports, 42 type-only'
3749
- features.database.engine -[uses]-> framework.global_ '97 imports, 5 type-only'
3750
- features.database.engine -[uses]-> framework.std '82 imports, 11 type-only'
3751
- features.database.engine -[uses]-> framework.store '13 imports, 4 type-only'
3747
+ features.database.engine -[uses]-> features.components '75 imports, 4 type-only'
3748
+ features.database.engine -[uses]-> features.shared '98 imports, 44 type-only'
3749
+ features.database.engine -[uses]-> framework.global_ '96 imports, 5 type-only'
3750
+ features.database.engine -[uses]-> framework.std '81 imports, 9 type-only'
3751
+ features.database.engine -[uses]-> framework.store '12 imports, 4 type-only'
3752
3752
  features.database.engine -[uses]-> model_.model_ '7 imports, 4 type-only'
3753
3753
  features.database.view-block -[uses]-> features.components '5 imports'
3754
- features.database.view-block -[uses]-> features.database.block '3 imports'
3754
+ features.database.view-block -[uses]-> features.database.block '5 imports'
3755
3755
  features.database.view-block -[uses]-> features.database.engine '11 imports, 4 type-only'
3756
3756
  features.database.view-block -[uses]-> features.ext-loader '2 imports'
3757
3757
  features.database.view-block -[uses]-> features.shared '6 imports'
@@ -5697,7 +5697,8 @@ model {
5697
5697
  features.database.block.components -[imports]-> framework.global_.lit '2 imports'
5698
5698
  features.database.block.components -[imports]-> framework.std.src '3 imports'
5699
5699
  features.database.block.components -[imports]-> framework.store.src '1 import, 1 type-only'
5700
- features.database.block.configs -[imports]-> features.database.block.src '3 imports'
5700
+ features.database.block.configs -[imports]-> features.database.block.src '4 imports'
5701
+ features.database.block.configs -[imports]-> features.database.engine.src '1 import'
5701
5702
  features.database.block.configs -[imports]-> features.database.engine.view-presets '1 import'
5702
5703
  features.database.block.configs -[imports]-> features.shared.commands '1 import'
5703
5704
  features.database.block.configs -[imports]-> features.shared.services '1 import'
@@ -5706,12 +5707,13 @@ model {
5706
5707
  features.database.block.configs -[imports]-> framework.std.src '1 import, 1 type-only'
5707
5708
  features.database.block.context -[imports]-> framework.global_.di '1 import'
5708
5709
  features.database.block.context -[imports]-> framework.std.src '1 import, 1 type-only'
5710
+ features.database.block.detail-panel -[imports]-> features.database.block.src '1 import'
5709
5711
  features.database.block.detail-panel -[imports]-> features.database.block.utils '1 import'
5710
5712
  features.database.block.detail-panel -[imports]-> features.database.engine.src '2 imports, 2 type-only'
5711
5713
  features.database.block.detail-panel -[imports]-> features.database.engine.view-presets '1 import, 1 type-only'
5712
5714
  features.database.block.detail-panel -[imports]-> features.inlines.preset.src '1 import'
5713
5715
  features.database.block.detail-panel -[imports]-> features.shared.consts '1 import'
5714
- features.database.block.detail-panel -[imports]-> features.shared.services '1 import'
5716
+ features.database.block.detail-panel -[imports]-> features.shared.services '2 imports'
5715
5717
  features.database.block.detail-panel -[imports]-> features.shared.types '1 import, 1 type-only'
5716
5718
  features.database.block.detail-panel -[imports]-> features.shared.utils '1 import'
5717
5719
  features.database.block.detail-panel -[imports]-> framework.global_.lit '2 imports'
@@ -5719,7 +5721,7 @@ model {
5719
5721
  features.database.block.detail-panel -[imports]-> framework.store.src '1 import, 1 type-only'
5720
5722
  features.database.block.detail-panel -[imports]-> model_.model_.src '1 import'
5721
5723
  features.database.block.properties -[imports]-> features.database.block.context '5 imports'
5722
- features.database.block.properties -[imports]-> features.database.block.src '2 imports, 2 type-only'
5724
+ features.database.block.properties -[imports]-> features.database.block.src '6 imports, 2 type-only'
5723
5725
  features.database.block.properties -[imports]-> features.database.block.utils '3 imports'
5724
5726
  features.database.block.properties -[imports]-> features.database.engine.property-presets '6 imports'
5725
5727
  features.database.block.properties -[imports]-> features.database.engine.src '14 imports, 2 type-only'
@@ -5744,8 +5746,9 @@ model {
5744
5746
  features.database.block.src -[imports]-> features.components.caption '1 import'
5745
5747
  features.database.block.src -[imports]-> features.components.context-menu '2 imports, 1 type-only'
5746
5748
  features.database.block.src -[imports]-> features.components.drop-indicator '1 import'
5749
+ features.database.block.src -[imports]-> features.components.icons_ '1 import'
5747
5750
  features.database.block.src -[imports]-> features.components.peek '1 import'
5748
- features.database.block.src -[imports]-> features.components.toast '1 import'
5751
+ features.database.block.src -[imports]-> features.components.toast '2 imports'
5749
5752
  features.database.block.src -[imports]-> features.database.block.adapters '1 import'
5750
5753
  features.database.block.src -[imports]-> features.database.block.components '4 imports'
5751
5754
  features.database.block.src -[imports]-> features.database.block.configs '1 import'
@@ -5757,12 +5760,12 @@ model {
5757
5760
  features.database.block.src -[imports]-> features.database.block.views_ '1 import'
5758
5761
  features.database.block.src -[imports]-> features.database.engine.property-presets '1 import'
5759
5762
  features.database.block.src -[imports]-> features.database.engine.src '7 imports, 2 type-only'
5760
- features.database.block.src -[imports]-> features.database.engine.view-presets '2 imports'
5763
+ features.database.block.src -[imports]-> features.database.engine.view-presets '1 import'
5761
5764
  features.database.block.src -[imports]-> features.database.engine.widget-presets '1 import'
5762
5765
  features.database.block.src -[imports]-> features.ext-loader.src '2 imports'
5763
5766
  features.database.block.src -[imports]-> features.shared.commands '1 import'
5764
5767
  features.database.block.src -[imports]-> features.shared.consts '1 import'
5765
- features.database.block.src -[imports]-> features.shared.services '4 imports, 1 type-only'
5768
+ features.database.block.src -[imports]-> features.shared.services '7 imports, 2 type-only'
5766
5769
  features.database.block.src -[imports]-> features.shared.theme '1 import'
5767
5770
  features.database.block.src -[imports]-> features.shared.utils '4 imports, 1 type-only'
5768
5771
  features.database.block.src -[imports]-> features.widgets.drag-handle.src '1 import'
@@ -5771,9 +5774,9 @@ model {
5771
5774
  features.database.block.src -[imports]-> framework.global_.disposable '1 import'
5772
5775
  features.database.block.src -[imports]-> framework.global_.gfx '1 import'
5773
5776
  features.database.block.src -[imports]-> framework.std.inline '1 import'
5774
- features.database.block.src -[imports]-> framework.std.src '8 imports, 4 type-only'
5775
- features.database.block.src -[imports]-> framework.store.src '8 imports, 5 type-only'
5776
- features.database.block.src -[imports]-> model_.model_.src '9 imports, 7 type-only'
5777
+ features.database.block.src -[imports]-> framework.std.src '9 imports, 5 type-only'
5778
+ features.database.block.src -[imports]-> framework.store.src '9 imports, 6 type-only'
5779
+ features.database.block.src -[imports]-> model_.model_.src '11 imports, 9 type-only'
5777
5780
  features.database.block.utils -[imports]-> features.database.block.service '1 import, 1 type-only'
5778
5781
  features.database.block.utils -[imports]-> features.shared.types '1 import, 1 type-only'
5779
5782
  features.database.block.utils -[imports]-> features.shared.utils '1 import'
@@ -5830,10 +5833,10 @@ model {
5830
5833
  features.database.engine.core -[imports]-> features.components.color-picker '2 imports'
5831
5834
  features.database.engine.core -[imports]-> features.components.context-menu '18 imports, 4 type-only'
5832
5835
  features.database.engine.core -[imports]-> features.components.icons_ '1 import'
5833
- features.database.engine.core -[imports]-> features.components.src '1 import'
5834
- features.database.engine.core -[imports]-> features.database.engine.src '7 imports'
5836
+ features.database.engine.core -[imports]-> features.components.src '2 imports'
5837
+ features.database.engine.core -[imports]-> features.database.engine.src '23 imports'
5835
5838
  features.database.engine.core -[imports]-> features.database.engine.view-presets '5 imports, 3 type-only'
5836
- features.database.engine.core -[imports]-> features.shared.services '13 imports, 6 type-only'
5839
+ features.database.engine.core -[imports]-> features.shared.services '18 imports, 10 type-only'
5837
5840
  features.database.engine.core -[imports]-> features.shared.theme '5 imports'
5838
5841
  features.database.engine.core -[imports]-> features.shared.types '12 imports, 12 type-only'
5839
5842
  features.database.engine.core -[imports]-> features.shared.utils '10 imports, 8 type-only'
@@ -5842,14 +5845,15 @@ model {
5842
5845
  features.database.engine.core -[imports]-> framework.global_.env '3 imports'
5843
5846
  features.database.engine.core -[imports]-> framework.global_.exceptions '3 imports'
5844
5847
  features.database.engine.core -[imports]-> framework.global_.lit '19 imports'
5845
- features.database.engine.core -[imports]-> framework.std.src '27 imports, 7 type-only'
5848
+ features.database.engine.core -[imports]-> framework.std.src '27 imports, 6 type-only'
5846
5849
  features.database.engine.core -[imports]-> framework.store.src '6 imports, 2 type-only'
5847
5850
  features.database.engine.core -[imports]-> model_.model_.src '6 imports, 3 type-only'
5848
5851
  features.database.engine.property-presets -[imports]-> features.components.context-menu '3 imports'
5849
5852
  features.database.engine.property-presets -[imports]-> features.components.date-picker '1 import'
5850
5853
  features.database.engine.property-presets -[imports]-> features.components.portal '1 import'
5851
5854
  features.database.engine.property-presets -[imports]-> features.database.engine.core '50 imports, 2 type-only'
5852
- features.database.engine.property-presets -[imports]-> features.shared.services '1 import'
5855
+ features.database.engine.property-presets -[imports]-> features.database.engine.src '8 imports'
5856
+ features.database.engine.property-presets -[imports]-> features.shared.services '2 imports, 1 type-only'
5853
5857
  features.database.engine.property-presets -[imports]-> features.shared.theme '1 import'
5854
5858
  features.database.engine.property-presets -[imports]-> framework.global_.env '2 imports'
5855
5859
  features.database.engine.property-presets -[imports]-> framework.global_.gfx '1 import'
@@ -5859,29 +5863,28 @@ model {
5859
5863
  features.database.engine.src -[imports]-> features.database.engine.view-presets '1 import'
5860
5864
  features.database.engine.src -[imports]-> features.database.engine.widget-presets '1 import'
5861
5865
  features.database.engine.src -[imports]-> features.shared.services '1 import, 1 type-only'
5862
- features.database.engine.view-presets -[imports]-> features.components.context-menu '32 imports'
5863
- features.database.engine.view-presets -[imports]-> features.components.src '3 imports'
5864
- features.database.engine.view-presets -[imports]-> features.database.engine.core '225 imports, 68 type-only'
5866
+ features.database.engine.view-presets -[imports]-> features.components.context-menu '30 imports'
5867
+ features.database.engine.view-presets -[imports]-> features.components.src '5 imports'
5868
+ features.database.engine.view-presets -[imports]-> features.database.engine.core '228 imports, 60 type-only'
5865
5869
  features.database.engine.view-presets -[imports]-> features.database.engine.property-presets '7 imports'
5866
- features.database.engine.view-presets -[imports]-> features.database.engine.src '11 imports'
5870
+ features.database.engine.view-presets -[imports]-> features.database.engine.src '31 imports'
5867
5871
  features.database.engine.view-presets -[imports]-> features.database.engine.widget-presets '2 imports'
5868
- features.database.engine.view-presets -[imports]-> features.shared.services '3 imports'
5872
+ features.database.engine.view-presets -[imports]-> features.shared.services '10 imports'
5869
5873
  features.database.engine.view-presets -[imports]-> features.shared.theme '10 imports'
5870
- features.database.engine.view-presets -[imports]-> features.shared.types '2 imports, 2 type-only'
5871
- features.database.engine.view-presets -[imports]-> features.shared.utils '17 imports, 12 type-only'
5872
- features.database.engine.view-presets -[imports]-> framework.global_.di '1 import'
5874
+ features.database.engine.view-presets -[imports]-> features.shared.types '1 import, 1 type-only'
5875
+ features.database.engine.view-presets -[imports]-> features.shared.utils '15 imports, 10 type-only'
5873
5876
  features.database.engine.view-presets -[imports]-> framework.global_.disposable '3 imports'
5874
5877
  features.database.engine.view-presets -[imports]-> framework.global_.env '1 import'
5875
5878
  features.database.engine.view-presets -[imports]-> framework.global_.exceptions '2 imports'
5876
5879
  features.database.engine.view-presets -[imports]-> framework.global_.gfx '1 import'
5877
5880
  features.database.engine.view-presets -[imports]-> framework.global_.lit '38 imports'
5878
- features.database.engine.view-presets -[imports]-> framework.std.src '43 imports, 4 type-only'
5879
- features.database.engine.view-presets -[imports]-> framework.store.src '5 imports, 2 type-only'
5881
+ features.database.engine.view-presets -[imports]-> framework.std.src '42 imports, 3 type-only'
5882
+ features.database.engine.view-presets -[imports]-> framework.store.src '4 imports, 2 type-only'
5880
5883
  features.database.engine.widget-presets -[imports]-> features.components.context-menu '12 imports'
5881
- features.database.engine.widget-presets -[imports]-> features.database.engine.core '91 imports, 24 type-only'
5882
- features.database.engine.widget-presets -[imports]-> features.database.engine.src '9 imports'
5884
+ features.database.engine.widget-presets -[imports]-> features.database.engine.core '95 imports, 24 type-only'
5885
+ features.database.engine.widget-presets -[imports]-> features.database.engine.src '13 imports'
5883
5886
  features.database.engine.widget-presets -[imports]-> features.database.engine.view-presets '2 imports, 2 type-only'
5884
- features.database.engine.widget-presets -[imports]-> features.shared.services '4 imports, 1 type-only'
5887
+ features.database.engine.widget-presets -[imports]-> features.shared.services '8 imports, 1 type-only'
5885
5888
  features.database.engine.widget-presets -[imports]-> features.shared.theme '5 imports'
5886
5889
  features.database.engine.widget-presets -[imports]-> framework.global_.di '1 import'
5887
5890
  features.database.engine.widget-presets -[imports]-> framework.global_.env '3 imports'
@@ -5895,6 +5898,7 @@ model {
5895
5898
  features.database.view-block.columns -[imports]-> features.database.block.src '1 import'
5896
5899
  features.database.view-block.columns -[imports]-> features.database.engine.property-presets '1 import'
5897
5900
  features.database.view-block.columns -[imports]-> features.database.engine.src '1 import, 1 type-only'
5901
+ features.database.view-block.configs -[imports]-> features.database.block.src '1 import'
5898
5902
  features.database.view-block.configs -[imports]-> features.database.engine.src '1 import'
5899
5903
  features.database.view-block.configs -[imports]-> features.database.view-block.src '1 import, 1 type-only'
5900
5904
  features.database.view-block.configs -[imports]-> features.shared.services '1 import'
@@ -5905,7 +5909,7 @@ model {
5905
5909
  features.database.view-block.src -[imports]-> features.components.icons_ '1 import'
5906
5910
  features.database.view-block.src -[imports]-> features.components.peek '1 import'
5907
5911
  features.database.view-block.src -[imports]-> features.components.toast '1 import'
5908
- features.database.view-block.src -[imports]-> features.database.block.src '2 imports'
5912
+ features.database.view-block.src -[imports]-> features.database.block.src '3 imports'
5909
5913
  features.database.view-block.src -[imports]-> features.database.engine.property-presets '1 import'
5910
5914
  features.database.view-block.src -[imports]-> features.database.engine.src '3 imports, 1 type-only'
5911
5915
  features.database.view-block.src -[imports]-> features.database.engine.widget-presets '1 import'
@@ -1,3 +1,3 @@
1
- {
2
- "name": "blocksuite"
3
- }
1
+ {
2
+ "name": "blocksuite"
3
+ }
@@ -26,7 +26,7 @@ export declare const builtinToolbarConfig: {
26
26
  readonly tooltip: "Create Table";
27
27
  readonly tooltipWording: import("../../affine-shared/services/index.js").ChromeWording;
28
28
  readonly icon: import("lit-html").TemplateResult<1>;
29
- readonly when: ({ chain }: import("../../affine-shared/services/index.js").ToolbarContext) => boolean;
29
+ readonly when: ({ chain, std }: import("../../affine-shared/services/index.js").ToolbarContext) => boolean;
30
30
  readonly run: ({ host }: import("../../affine-shared/services/index.js").ToolbarContext) => void;
31
31
  }, {
32
32
  readonly id: "f.convert-to-linked-doc";
@@ -1,4 +1,4 @@
1
- import { convertToDatabase, DATABASE_CONVERT_WHITE_LIST, } from '../../affine-database-block/index.js';
1
+ import { canConvertToDatabase, convertToDatabase, DATABASE_CONVERT_WHITE_LIST, } from '../../affine-database-block/index.js';
2
2
  import { convertSelectedBlocksToLinkedDoc, getTitleFromSelectedModels, notifyDocCreated, promptDocTitle, } from '../../affine-block-embed/index.js';
3
3
  import { updateBlockType } from '../../affine-block-note/index.js';
4
4
  import { toast } from '../../affine-components/toast/index.js';
@@ -129,7 +129,9 @@ const turnIntoDatabase = {
129
129
  tooltip: 'Create Table',
130
130
  tooltipWording: ROOT_TOOLBAR_CREATE_TABLE,
131
131
  icon: DatabaseTableViewIcon(),
132
- when({ chain }) {
132
+ when({ chain, std }) {
133
+ if (!canConvertToDatabase(std))
134
+ return false;
133
135
  const middleware = (count = 0) => {
134
136
  return (ctx, next) => {
135
137
  const { selectedBlocks } = ctx;
@@ -58,18 +58,18 @@ const READ_LABEL_FALLBACK = 'Read this component';
58
58
  * Drawn inline like its neighbours: this package does not depend on
59
59
  * `@blocksuite/icons` and one glyph is not worth a new dependency.
60
60
  */
61
- const ReadIcon = html `<svg
62
- width="20"
63
- height="20"
64
- viewBox="0 0 24 24"
65
- fill="none"
66
- stroke="currentColor"
67
- stroke-width="2"
68
- stroke-linecap="round"
69
- stroke-linejoin="round"
70
- >
71
- <path d="M2 12s3.5-6 10-6 10 6 10 6-3.5 6-10 6-10-6-10-6z" />
72
- <circle cx="12" cy="12" r="3" />
61
+ const ReadIcon = html `<svg
62
+ width="20"
63
+ height="20"
64
+ viewBox="0 0 24 24"
65
+ fill="none"
66
+ stroke="currentColor"
67
+ stroke-width="2"
68
+ stroke-linecap="round"
69
+ stroke-linejoin="round"
70
+ >
71
+ <path d="M2 12s3.5-6 10-6 10 6 10 6-3.5 6-10 6-10-6-10-6z" />
72
+ <circle cx="12" cy="12" r="3" />
73
73
  </svg>`;
74
74
  /** The command this module drives. Spelled once. */
75
75
  const ELEMENT_READ_ID = 'element.read';
@@ -23,6 +23,7 @@ export declare const menu: {
23
23
  postfix?: import("lit-html").TemplateResult;
24
24
  prefix?: import("lit-html").TemplateResult;
25
25
  class?: string;
26
+ testId?: string;
26
27
  options: import("./menu.js").MenuOptions;
27
28
  disableArrow?: boolean;
28
29
  hide?: () => boolean;
@@ -1,6 +1,6 @@
1
1
  import type { BlockStdScope } from '../../std/index.js';
2
2
  import { ShadowlessElement } from '../../std/index.js';
3
- import { type Middleware, type ReferenceElement } from '@floating-ui/dom';
3
+ import { type Middleware, type Placement, type ReferenceElement } from '@floating-ui/dom';
4
4
  import type { MenuFocusable } from './focusable.js';
5
5
  import { Menu, type MenuConfig, type MenuOptions } from './menu.js';
6
6
  import type { MenuComponentInterface } from './types.js';
@@ -61,6 +61,8 @@ export declare const createPopup: (target: PopupTarget, content: HTMLElement, op
61
61
  onClose?: () => void;
62
62
  middleware?: Array<Middleware | null | undefined | false>;
63
63
  container?: HTMLElement;
64
+ /** Told where the popup was placed, at each placement. */
65
+ onPlaced?: (placement: Placement) => void;
64
66
  }) => () => void;
65
67
  export type MenuHandler = {
66
68
  close: () => void;
@@ -527,7 +527,8 @@ export const createPopup = (target, content, options) => {
527
527
  computePosition(target.targetRect, content, {
528
528
  middleware: options?.middleware ?? [shift({ crossAxis: true })],
529
529
  })
530
- .then(({ x, y }) => {
530
+ .then(({ x, y, placement }) => {
531
+ options?.onPlaced?.(placement);
531
532
  Object.assign(content.style, {
532
533
  left: `${x}px`,
533
534
  top: `${y}px`,
@@ -620,6 +621,13 @@ export const popMenu = (target, props) => {
620
621
  onClose: () => {
621
622
  menu.close();
622
623
  },
624
+ // A menu placed beside its anchor opens its sub-menus on that side too.
625
+ onPlaced: placement => {
626
+ if (placement.startsWith('left'))
627
+ menu.side = 'left';
628
+ else if (placement.startsWith('right'))
629
+ menu.side = 'right';
630
+ },
623
631
  middleware: props.middleware ?? [
624
632
  autoPlacement({
625
633
  allowedPlacements: [
@@ -19,9 +19,16 @@ export type MenuOptions = {
19
19
  };
20
20
  type MenuOpenListener = (menu: Menu) => (() => void) | void;
21
21
  export declare function onMenuOpen(listener: MenuOpenListener): () => void;
22
+ /** The side of its parent a sub-menu opened on. */
23
+ export type SubMenuSide = 'left' | 'right';
22
24
  export declare class Menu {
23
25
  options: MenuOptions;
24
26
  private _cleanupFns;
27
+ /**
28
+ * Set once a sub-menu is placed; its own sub-menus open on the same side
29
+ * (`nestedSubMenuPosition`). Undefined for a root menu.
30
+ */
31
+ side: SubMenuSide | undefined;
25
32
  private readonly _currentFocused$;
26
33
  private readonly _subMenu$;
27
34
  closed: boolean;
@@ -18,6 +18,11 @@ export class Menu {
18
18
  constructor(options) {
19
19
  this.options = options;
20
20
  this._cleanupFns = [];
21
+ /**
22
+ * Set once a sub-menu is placed; its own sub-menus open on the same side
23
+ * (`nestedSubMenuPosition`). Undefined for a root menu.
24
+ */
25
+ this.side = undefined;
21
26
  this._currentFocused$ = signal();
22
27
  this._subMenu$ = signal();
23
28
  this.closed = false;
@@ -1,11 +1,13 @@
1
1
  import { type TemplateResult } from 'lit';
2
2
  import { MenuFocusable } from './focusable.js';
3
- import { Menu, type MenuOptions } from './menu.js';
3
+ import { Menu, type MenuOptions, type SubMenuSide } from './menu.js';
4
4
  export type MenuSubMenuData = {
5
5
  content: () => TemplateResult;
6
6
  options: MenuOptions;
7
7
  select?: () => void;
8
8
  class?: string;
9
+ /** Names the entry itself; `options.testId` names the menu it opens. */
10
+ testId?: string;
9
11
  };
10
12
  export declare const subMenuOffset: {
11
13
  name: string;
@@ -22,6 +24,21 @@ export declare const subMenuMiddleware: {
22
24
  options?: any;
23
25
  fn: (state: import("@floating-ui/dom").MiddlewareState) => import("@floating-ui/core").MiddlewareReturn | Promise<import("@floating-ui/core").MiddlewareReturn>;
24
26
  }[];
27
+ /**
28
+ * Where a nested sub-menu opens: on the side its parent opened on, right for
29
+ * a menu's first sub-menu, the other side only when it does not fit there.
30
+ * `autoPlacement` took the side with the most room, so a third level drawn
31
+ * from a menu sitting right of the page's middle went left, back over the
32
+ * first menu, instead of beside the second (#571).
33
+ */
34
+ export declare function nestedSubMenuPosition(parentSide: SubMenuSide | undefined): {
35
+ placement: "left-start" | "right-start";
36
+ middleware: {
37
+ name: string;
38
+ options?: any;
39
+ fn: (state: import("@floating-ui/dom").MiddlewareState) => import("@floating-ui/core").MiddlewareReturn | Promise<import("@floating-ui/core").MiddlewareReturn>;
40
+ }[];
41
+ };
25
42
  export declare class MenuSubMenu extends MenuFocusable {
26
43
  createTime: number;
27
44
  connectedCallback(): void;
@@ -49,6 +66,7 @@ export declare const subMenuItems: {
49
66
  postfix?: TemplateResult;
50
67
  prefix?: TemplateResult;
51
68
  class?: string;
69
+ testId?: string;
52
70
  options: MenuOptions;
53
71
  disableArrow?: boolean;
54
72
  hide?: () => boolean;
@@ -34,10 +34,11 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
34
34
  };
35
35
  import { IS_MOBILE } from '../../global/env/index.js';
36
36
  import { ArrowRightSmallIcon } from '@blocksuite/icons/lit';
37
- import { autoPlacement, autoUpdate, computePosition, offset, } from '@floating-ui/dom';
37
+ import { autoPlacement, autoUpdate, computePosition, flip, offset, shift, } from '@floating-ui/dom';
38
38
  import { html, nothing } from 'lit';
39
39
  import { property } from 'lit/decorators.js';
40
40
  import { classMap } from 'lit/directives/class-map.js';
41
+ import { ifDefined } from 'lit/directives/if-defined.js';
41
42
  import { MenuFocusable } from './focusable.js';
42
43
  import { Menu } from './menu.js';
43
44
  import { popMenu, popupTargetFromElement } from './menu-renderer.js';
@@ -49,6 +50,27 @@ export const subMenuPlacements = autoPlacement({
49
50
  allowedPlacements: ['right-start', 'left-start', 'right-end', 'left-end'],
50
51
  });
51
52
  export const subMenuMiddleware = [subMenuOffset, subMenuPlacements];
53
+ /**
54
+ * Where a nested sub-menu opens: on the side its parent opened on, right for
55
+ * a menu's first sub-menu, the other side only when it does not fit there.
56
+ * `autoPlacement` took the side with the most room, so a third level drawn
57
+ * from a menu sitting right of the page's middle went left, back over the
58
+ * first menu, instead of beside the second (#571).
59
+ */
60
+ export function nestedSubMenuPosition(parentSide) {
61
+ const side = parentSide ?? 'right';
62
+ const other = side === 'right' ? 'left' : 'right';
63
+ return {
64
+ placement: `${side}-start`,
65
+ middleware: [
66
+ subMenuOffset,
67
+ flip({
68
+ fallbackPlacements: [`${other}-start`, `${side}-end`, `${other}-end`],
69
+ }),
70
+ shift({ padding: 8 }),
71
+ ],
72
+ };
73
+ }
52
74
  let MenuSubMenu = (() => {
53
75
  let _classSuper = MenuFocusable;
54
76
  let _data_decorators;
@@ -89,7 +111,13 @@ let MenuSubMenu = (() => {
89
111
  const focus = this.menu.currentFocused$.value;
90
112
  const menu = new Menu({
91
113
  ...this.data.options,
114
+ // An entry picked at any depth completes the whole chain: this menu's
115
+ // own completion runs too, so a pick two levels down closes the root
116
+ // as a pick one level down always did (#571: "Link an existing source"
117
+ // → database → source left the creation popover open, and the next
118
+ // click only closed it).
92
119
  onComplete: () => {
120
+ this.menu.options.onComplete?.();
93
121
  this.menu.close();
94
122
  },
95
123
  onClose: () => {
@@ -100,11 +128,11 @@ let MenuSubMenu = (() => {
100
128
  },
101
129
  });
102
130
  this.menu.menuElement.parentElement?.append(menu.menuElement);
131
+ const position = nestedSubMenuPosition(this.menu.side);
103
132
  const unsub = autoUpdate(this, menu.menuElement, () => {
104
- computePosition(this, menu.menuElement, {
105
- middleware: subMenuMiddleware,
106
- })
107
- .then(({ x, y }) => {
133
+ computePosition(this, menu.menuElement, position)
134
+ .then(({ x, y, placement }) => {
135
+ menu.side = placement.startsWith('left') ? 'left' : 'right';
108
136
  menu.menuElement.style.left = `${x}px`;
109
137
  menu.menuElement.style.top = `${y}px`;
110
138
  })
@@ -121,7 +149,12 @@ let MenuSubMenu = (() => {
121
149
  'affine-menu-button': true,
122
150
  focused: this.isFocused$.value,
123
151
  });
124
- return html ` <div class="${classString}">${this.data.content()}</div>`;
152
+ return html ` <div
153
+ class="${classString}"
154
+ data-testid=${ifDefined(this.data.testId)}
155
+ >
156
+ ${this.data.content()}
157
+ </div>`;
125
158
  }
126
159
  #data_accessor_storage;
127
160
  get data() { return this.#data_accessor_storage; }
@@ -182,7 +215,12 @@ let MobileSubMenu = (() => {
182
215
  'mobile-menu-button': true,
183
216
  focused: this.isFocused$.value,
184
217
  });
185
- return html ` <div class="${classString}">${this.data.content()}</div>`;
218
+ return html ` <div
219
+ class="${classString}"
220
+ data-testid=${ifDefined(this.data.testId)}
221
+ >
222
+ ${this.data.content()}
223
+ </div>`;
186
224
  }
187
225
  #data_accessor_storage = __runInitializers(this, _data_initializers, void 0);
188
226
  get data() { return this.#data_accessor_storage; }
@@ -219,6 +257,7 @@ export const subMenuItems = {
219
257
  ${config.postfix}
220
258
  ${config.disableArrow ? nothing : ArrowRightSmallIcon()} `,
221
259
  class: config.class,
260
+ testId: config.testId,
222
261
  options: config.options,
223
262
  };
224
263
  return renderSubMenu(data, menu);
@@ -1,14 +1,14 @@
1
1
  import { HighLightDuotoneIcon } from '@blocksuite/icons/lit';
2
2
  import { css, LitElement } from 'lit';
3
3
  export class HighlightDuotoneIcon extends LitElement {
4
- static { this.styles = css `
5
- svg {
6
- display: flex;
7
- font-size: 20px;
8
- }
9
- svg > path:nth-child(1) {
10
- fill: var(--color, unset);
11
- }
4
+ static { this.styles = css `
5
+ svg {
6
+ display: flex;
7
+ font-size: 20px;
8
+ }
9
+ svg > path:nth-child(1) {
10
+ fill: var(--color, unset);
11
+ }
12
12
  `; }
13
13
  render() {
14
14
  return HighLightDuotoneIcon();
@@ -1,17 +1,17 @@
1
1
  import { TextBackgroundDuotoneIcon } from '@blocksuite/icons/lit';
2
2
  import { css, LitElement } from 'lit';
3
3
  export class TextDuotoneIcon extends LitElement {
4
- static { this.styles = css `
5
- svg {
6
- display: flex;
7
- font-size: 20px;
8
- }
9
- svg > path:nth-child(1) {
10
- fill: var(--background, unset);
11
- }
12
- svg > path:nth-child(3) {
13
- fill: var(--color, unset);
14
- }
4
+ static { this.styles = css `
5
+ svg {
6
+ display: flex;
7
+ font-size: 20px;
8
+ }
9
+ svg > path:nth-child(1) {
10
+ fill: var(--background, unset);
11
+ }
12
+ svg > path:nth-child(3) {
13
+ fill: var(--color, unset);
14
+ }
15
15
  `; }
16
16
  render() {
17
17
  return TextBackgroundDuotoneIcon();
@@ -1,4 +1,28 @@
1
1
  import type { SlashMenuConfig } from '../../affine-widget-slash-menu/index.js';
2
+ import type { BlockStdScope } from '../../std/index.js';
3
+ /**
4
+ * With a data-source picker the host owns database creation (ADR 0035 §5):
5
+ * its `createDatabase` is the only way in, and without it no entry creates
6
+ * one. Without a picker, a native inline database, as in 0.48.
7
+ */
8
+ export declare function canCreateDatabase(std: BlockStdScope): boolean;
9
+ /**
10
+ * Three ways in, by what is registered (ADR 0035 §5, amendment of
11
+ * 2026-10-28):
12
+ *
13
+ * - a picker and the bundle's creation menu: the database lands at once,
14
+ * native and with no row, and the menu opens over it to connect it to a
15
+ * source (`connectDatabaseToSource`). Dismissed, the native database stays
16
+ * and renders: nothing is lost by closing the popover;
17
+ * - a picker alone (a core-only host): the host's `createDatabase` first,
18
+ * then a view of its first source, as in 0.61;
19
+ * - no picker: a native inline database with 3 rows, as in 0.48.
20
+ *
21
+ * The one creation gesture: the slash entries and the mobile keyboard
22
+ * toolbar's "Table view" / "Kanban view" both run it (ADR 0035 amendment of
23
+ * 2026-10-29), so neither inserts native rows a host's picker would not see.
24
+ */
25
+ export declare function createDatabaseByGesture(std: BlockStdScope, viewType: string): void;
2
26
  /**
3
27
  * The slash entries that CREATE a database, registered by the gated
4
28
  * `DatabaseViewExtension` only. No Calendar entry after 0.48 (ADR 0035 §6):