11import type { NodeSpec } from 'prosemirror-model' ;
2- import { TabsNode } from './const' ;
2+ import { YfmTabsSpecsOptions } from '.' ;
3+ import { TabAttrs , TabPanelAttrs , TabsAttrs , TabsListAttrs , TabsNode } from './const' ;
34
4- export const spec : Record < TabsNode , NodeSpec > = {
5+ const DEFAULT_PLACEHOLDERS = {
6+ TabTitle : 'Tab title' ,
7+ } ;
8+
9+ export const getSpec : ( opts : YfmTabsSpecsOptions ) => Record < TabsNode , NodeSpec > = ( opts ) => ( {
510 [ TabsNode . Tab ] : {
611 attrs : {
7- id : { default : 'unknown' } ,
8- class : { default : 'unknown' } ,
9- role : { default : 'unknown' } ,
10- 'aria-controls' : { default : 'unknown' } ,
11- 'aria-selected' : { default : 'unknown' } ,
12- tabindex : { default : 'unknown' } ,
12+ [ TabAttrs . id ] : { default : 'unknown' } ,
13+ [ TabAttrs . class ] : { default : 'unknown' } ,
14+ [ TabAttrs . role ] : { default : 'unknown' } ,
15+ [ TabAttrs . ariaControls ] : { default : 'unknown' } ,
16+ [ TabAttrs . ariaSelected ] : { default : 'unknown' } ,
17+ [ TabAttrs . tabindex ] : { default : 'unknown' } ,
1318 } ,
1419 marks : '' ,
1520 content : 'text*' ,
@@ -18,18 +23,22 @@ export const spec: Record<TabsNode, NodeSpec> = {
1823 toDOM ( node ) {
1924 return [ 'div' , node . attrs , 0 ] ;
2025 } ,
26+ placeholder : {
27+ content : opts ?. tabPlaceholder ?? DEFAULT_PLACEHOLDERS . TabTitle ,
28+ alwaysVisible : true ,
29+ } ,
2130 selectable : false ,
2231 allowSelection : false ,
2332 complex : 'leaf' ,
2433 } ,
2534
2635 [ TabsNode . TabPanel ] : {
2736 attrs : {
28- id : { default : 'unknown' } ,
29- class : { default : 'unknown' } ,
30- role : { default : 'unknown' } ,
31- 'data-title' : { default : 'unknown' } ,
32- 'aria-labelledby' : { default : 'unknown' } ,
37+ [ TabPanelAttrs . id ] : { default : 'unknown' } ,
38+ [ TabPanelAttrs . class ] : { default : 'unknown' } ,
39+ [ TabPanelAttrs . role ] : { default : 'unknown' } ,
40+ [ TabPanelAttrs . dataTitle ] : { default : 'unknown' } ,
41+ [ TabPanelAttrs . ariaLabelledby ] : { default : 'unknown' } ,
3342 } ,
3443 content : 'block*' ,
3544 group : 'block' ,
@@ -40,10 +49,11 @@ export const spec: Record<TabsNode, NodeSpec> = {
4049 selectable : false ,
4150 allowSelection : false ,
4251 complex : 'leaf' ,
52+ isolating : true ,
4353 } ,
4454
4555 [ TabsNode . Tabs ] : {
46- attrs : { class : { default : 'unknown' } } ,
56+ attrs : { [ TabsAttrs . class ] : { default : 'unknown' } } ,
4757 content : 'yfm_tabs_list yfm_tab_panel+' ,
4858 group : 'block' ,
4959 parseDOM : [ { tag : 'div.yfm-tabs' } ] ,
@@ -54,7 +64,10 @@ export const spec: Record<TabsNode, NodeSpec> = {
5464 } ,
5565
5666 [ TabsNode . TabsList ] : {
57- attrs : { class : { default : 'unknown' } , role : { default : 'unknown' } } ,
67+ attrs : {
68+ [ TabsListAttrs . class ] : { default : 'unknown' } ,
69+ [ TabsListAttrs . role ] : { default : 'unknown' } ,
70+ } ,
5871 content : 'yfm_tab*' ,
5972 group : 'block' ,
6073 parseDOM : [ { tag : 'div.yfm-tab-list' } ] ,
@@ -65,4 +78,4 @@ export const spec: Record<TabsNode, NodeSpec> = {
6578 allowSelection : false ,
6679 complex : 'inner' ,
6780 } ,
68- } ;
81+ } ) ;
0 commit comments