inkpen 0.7.1

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 (95) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.rubocop.yml +8 -0
  4. data/.yardopts +11 -0
  5. data/CLAUDE.md +141 -0
  6. data/README.md +409 -0
  7. data/Rakefile +19 -0
  8. data/app/assets/javascripts/inkpen/controllers/editor_controller.js +2050 -0
  9. data/app/assets/javascripts/inkpen/controllers/sticky_toolbar_controller.js +667 -0
  10. data/app/assets/javascripts/inkpen/controllers/toolbar_controller.js +693 -0
  11. data/app/assets/javascripts/inkpen/export/html.js +637 -0
  12. data/app/assets/javascripts/inkpen/export/index.js +30 -0
  13. data/app/assets/javascripts/inkpen/export/markdown.js +697 -0
  14. data/app/assets/javascripts/inkpen/export/pdf.js +372 -0
  15. data/app/assets/javascripts/inkpen/extensions/advanced_table.js +640 -0
  16. data/app/assets/javascripts/inkpen/extensions/block_commands.js +300 -0
  17. data/app/assets/javascripts/inkpen/extensions/block_gutter.js +338 -0
  18. data/app/assets/javascripts/inkpen/extensions/callout.js +303 -0
  19. data/app/assets/javascripts/inkpen/extensions/columns.js +403 -0
  20. data/app/assets/javascripts/inkpen/extensions/database.js +990 -0
  21. data/app/assets/javascripts/inkpen/extensions/document_section.js +352 -0
  22. data/app/assets/javascripts/inkpen/extensions/drag_handle.js +407 -0
  23. data/app/assets/javascripts/inkpen/extensions/embed.js +629 -0
  24. data/app/assets/javascripts/inkpen/extensions/enhanced_image.js +566 -0
  25. data/app/assets/javascripts/inkpen/extensions/export_commands.js +271 -0
  26. data/app/assets/javascripts/inkpen/extensions/file_attachment.js +593 -0
  27. data/app/assets/javascripts/inkpen/extensions/inkpen_table/index.js +58 -0
  28. data/app/assets/javascripts/inkpen/extensions/inkpen_table/inkpen_table.js +638 -0
  29. data/app/assets/javascripts/inkpen/extensions/inkpen_table/inkpen_table_cell.js +100 -0
  30. data/app/assets/javascripts/inkpen/extensions/inkpen_table/inkpen_table_header.js +100 -0
  31. data/app/assets/javascripts/inkpen/extensions/inkpen_table/table_constants.js +152 -0
  32. data/app/assets/javascripts/inkpen/extensions/inkpen_table/table_helpers.js +254 -0
  33. data/app/assets/javascripts/inkpen/extensions/inkpen_table/table_menu.js +282 -0
  34. data/app/assets/javascripts/inkpen/extensions/preformatted.js +239 -0
  35. data/app/assets/javascripts/inkpen/extensions/section.js +281 -0
  36. data/app/assets/javascripts/inkpen/extensions/section_title.js +126 -0
  37. data/app/assets/javascripts/inkpen/extensions/slash_commands.js +439 -0
  38. data/app/assets/javascripts/inkpen/extensions/table_of_contents.js +474 -0
  39. data/app/assets/javascripts/inkpen/extensions/toggle_block.js +332 -0
  40. data/app/assets/javascripts/inkpen/index.js +87 -0
  41. data/app/assets/stylesheets/inkpen/advanced_table.css +514 -0
  42. data/app/assets/stylesheets/inkpen/animations.css +626 -0
  43. data/app/assets/stylesheets/inkpen/block_gutter.css +265 -0
  44. data/app/assets/stylesheets/inkpen/callout.css +359 -0
  45. data/app/assets/stylesheets/inkpen/columns.css +314 -0
  46. data/app/assets/stylesheets/inkpen/database.css +658 -0
  47. data/app/assets/stylesheets/inkpen/document_section.css +305 -0
  48. data/app/assets/stylesheets/inkpen/drag_drop.css +220 -0
  49. data/app/assets/stylesheets/inkpen/editor.css +652 -0
  50. data/app/assets/stylesheets/inkpen/embed.css +468 -0
  51. data/app/assets/stylesheets/inkpen/enhanced_image.css +453 -0
  52. data/app/assets/stylesheets/inkpen/export.css +499 -0
  53. data/app/assets/stylesheets/inkpen/file_attachment.css +347 -0
  54. data/app/assets/stylesheets/inkpen/footnotes.css +136 -0
  55. data/app/assets/stylesheets/inkpen/inkpen_table.css +608 -0
  56. data/app/assets/stylesheets/inkpen/preformatted.css +215 -0
  57. data/app/assets/stylesheets/inkpen/search_replace.css +58 -0
  58. data/app/assets/stylesheets/inkpen/section.css +236 -0
  59. data/app/assets/stylesheets/inkpen/slash_menu.css +252 -0
  60. data/app/assets/stylesheets/inkpen/sticky_toolbar.css +314 -0
  61. data/app/assets/stylesheets/inkpen/toc.css +386 -0
  62. data/app/assets/stylesheets/inkpen/toggle.css +260 -0
  63. data/app/helpers/inkpen/editor_helper.rb +114 -0
  64. data/app/views/inkpen/_editor.html.erb +139 -0
  65. data/config/importmap.rb +170 -0
  66. data/docs/.DS_Store +0 -0
  67. data/docs/CHANGELOG.md +571 -0
  68. data/docs/FEATURES.md +436 -0
  69. data/docs/ROADMAP.md +3029 -0
  70. data/docs/VISION.md +235 -0
  71. data/docs/extensions/INKPEN_TABLE.md +482 -0
  72. data/docs/thinking/CORRECTED_NO_VUE.md +756 -0
  73. data/docs/thinking/EXECUTIVE_SUMMARY.md +403 -0
  74. data/docs/thinking/INKPEN_CODE_SAMPLES.md +1479 -0
  75. data/docs/thinking/INKPEN_MASTER_GUIDE.md +891 -0
  76. data/docs/thinking/README_START_HERE.md +341 -0
  77. data/lib/inkpen/configuration.rb +175 -0
  78. data/lib/inkpen/editor.rb +204 -0
  79. data/lib/inkpen/engine.rb +32 -0
  80. data/lib/inkpen/extensions/base.rb +109 -0
  81. data/lib/inkpen/extensions/code_block_syntax.rb +177 -0
  82. data/lib/inkpen/extensions/document_section.rb +111 -0
  83. data/lib/inkpen/extensions/forced_document.rb +183 -0
  84. data/lib/inkpen/extensions/mention.rb +155 -0
  85. data/lib/inkpen/extensions/preformatted.rb +111 -0
  86. data/lib/inkpen/extensions/section.rb +139 -0
  87. data/lib/inkpen/extensions/slash_commands.rb +100 -0
  88. data/lib/inkpen/extensions/table.rb +182 -0
  89. data/lib/inkpen/extensions/task_list.rb +145 -0
  90. data/lib/inkpen/sticky_toolbar.rb +157 -0
  91. data/lib/inkpen/toolbar.rb +145 -0
  92. data/lib/inkpen/version.rb +5 -0
  93. data/lib/inkpen.rb +101 -0
  94. data/sig/inkpen.rbs +4 -0
  95. metadata +165 -0
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Inkpen
4
+ ##
5
+ # View helpers for rendering Inkpen editors in Rails views.
6
+ #
7
+ # Include this module in your ApplicationHelper or use it directly
8
+ # in views that need Inkpen editors.
9
+ #
10
+ # @example Basic form field
11
+ # <%= inkpen_field :post, :body %>
12
+ #
13
+ # @example With configuration
14
+ # <%= inkpen_field :post, :body,
15
+ # toolbar: :floating,
16
+ # extensions: [:slash_commands, :drag_handle] %>
17
+ #
18
+ # @example Standalone editor
19
+ # <%= inkpen_editor name: "content", value: @content %>
20
+ #
21
+ # @author Nauman Tariq
22
+ # @since 0.1.0
23
+ #
24
+ module EditorHelper
25
+ ##
26
+ # Render an Inkpen editor field bound to a model attribute.
27
+ #
28
+ # This helper automatically retrieves the value from the model
29
+ # instance variable if available.
30
+ #
31
+ # @param object_name [Symbol, String] the model name (e.g., :post)
32
+ # @param method [Symbol, String] the attribute name (e.g., :body)
33
+ # @param options [Hash] editor configuration options
34
+ #
35
+ # @option options [String] :value override the attribute value
36
+ # @option options [Symbol] :toolbar toolbar style (:floating, :fixed, :none)
37
+ # @option options [Array<Symbol>] :extensions list of extensions
38
+ # @option options [Hash] :extension_config per-extension config
39
+ # @option options [String] :placeholder placeholder text
40
+ #
41
+ # @return [String] rendered editor HTML
42
+ #
43
+ # @example Basic usage
44
+ # <%= inkpen_field :post, :body %>
45
+ #
46
+ # @example With extensions
47
+ # <%= inkpen_field :post, :body, extensions: [:mentions, :hashtags] %>
48
+ #
49
+ def inkpen_field(object_name, method, options = {})
50
+ value = options.delete(:value)
51
+
52
+ # Try to get value from object if not provided
53
+ if value.nil? && (object = instance_variable_get("@#{object_name}"))
54
+ value = object.public_send(method) if object.respond_to?(method)
55
+ end
56
+
57
+ name = "#{object_name}[#{method}]"
58
+
59
+ editor = Inkpen::Editor.new(
60
+ name: name,
61
+ value: value,
62
+ **options
63
+ )
64
+
65
+ render_inkpen_editor(editor)
66
+ end
67
+
68
+ ##
69
+ # Render an Inkpen editor with explicit configuration.
70
+ #
71
+ # Use this when you need full control over the field name and value,
72
+ # or when not binding to a model.
73
+ #
74
+ # @param name [String] the form field name
75
+ # @param value [String, nil] initial HTML content
76
+ # @param options [Hash] editor configuration options
77
+ #
78
+ # @option options [Symbol] :toolbar toolbar style
79
+ # @option options [Array<Symbol>] :extensions list of extensions
80
+ # @option options [StickyToolbar] :sticky_toolbar sticky toolbar config
81
+ #
82
+ # @return [String] rendered editor HTML
83
+ #
84
+ # @example Basic usage
85
+ # <%= inkpen_editor name: "content", value: @content %>
86
+ #
87
+ # @example Full-featured
88
+ # <%= inkpen_editor name: "post[body]",
89
+ # toolbar: :sticky,
90
+ # extensions: [:slash_commands, :export_commands] %>
91
+ #
92
+ def inkpen_editor(name:, value: nil, **options)
93
+ editor = Inkpen::Editor.new(
94
+ name: name,
95
+ value: value,
96
+ **options
97
+ )
98
+
99
+ render_inkpen_editor(editor)
100
+ end
101
+
102
+ private
103
+
104
+ ##
105
+ # Render the editor partial.
106
+ #
107
+ # @param editor [Editor] the editor instance
108
+ # @return [String] rendered HTML
109
+ #
110
+ def render_inkpen_editor(editor)
111
+ render partial: "inkpen/editor", locals: { editor: editor }
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,139 @@
1
+ <%# Inkpen Editor Partial %>
2
+ <%# Renders a TipTap-based rich text editor with Stimulus controller %>
3
+
4
+ <div class="inkpen-editor <%= 'inkpen-editor--fixed-toolbar' if editor.toolbar == :fixed %>"
5
+ <%= tag.attributes(editor.data_attributes) %>
6
+ <%= tag.attributes(editor.html_attributes) %>
7
+ style="<%= editor.style_attributes %>">
8
+
9
+ <%
10
+ markdown_toggle_enabled = editor.markdown_mode&.enabled? && editor.markdown_mode.show_toggle
11
+ inline_mode_toggle = markdown_toggle_enabled && editor.toolbar == :fixed && editor.markdown_mode.inline_toggle?
12
+ mode_toggle_markup = nil
13
+
14
+ if markdown_toggle_enabled
15
+ mode_toggle_markup = capture do
16
+ %>
17
+ <div class="inkpen-mode-toggle <%= 'inkpen-mode-toggle--inline' if inline_mode_toggle %>" data-inkpen--editor-target="modeToggle">
18
+ <button type="button"
19
+ data-mode="wysiwyg"
20
+ data-action="click->inkpen--editor#setMode"
21
+ data-shortcut="⌘⇧M"
22
+ class="<%= 'active' if editor.markdown_mode.wysiwyg_default? %>">
23
+ Visual
24
+ </button>
25
+ <button type="button"
26
+ data-mode="markdown"
27
+ data-action="click->inkpen--editor#setMode"
28
+ data-shortcut="⌘⇧M"
29
+ class="<%= 'active' if editor.markdown_mode.markdown_default? %>">
30
+ Markdown
31
+ </button>
32
+ <button type="button"
33
+ data-mode="split"
34
+ data-action="click->inkpen--editor#setMode"
35
+ data-shortcut="⌘⇧V"
36
+ class="<%= 'active' if editor.markdown_mode.split_default? %>">
37
+ Split
38
+ </button>
39
+ </div>
40
+ <%
41
+ end
42
+ end
43
+ %>
44
+
45
+ <%# Markdown mode toggle (top placement) %>
46
+ <% if markdown_toggle_enabled && !inline_mode_toggle %>
47
+ <%= mode_toggle_markup %>
48
+ <% end %>
49
+
50
+ <%# Hidden input for form submission %>
51
+ <input type="hidden"
52
+ name="<%= editor.input_name %>"
53
+ id="<%= editor.input_id %>"
54
+ value="<%= editor.value %>"
55
+ data-inkpen--editor-target="input">
56
+
57
+ <%# Fixed toolbar - always visible above editor %>
58
+ <% if editor.toolbar == :fixed %>
59
+ <% if inline_mode_toggle %>
60
+ <div class="inkpen-toolbar-row">
61
+ <%= mode_toggle_markup %>
62
+ <div class="inkpen-toolbar inkpen-toolbar--fixed"
63
+ data-controller="inkpen--toolbar"
64
+ data-inkpen--editor-target="toolbar"
65
+ data-inkpen--toolbar-style-value="fixed"
66
+ role="toolbar"
67
+ aria-label="Text formatting">
68
+ </div>
69
+ </div>
70
+ <% else %>
71
+ <div class="inkpen-toolbar inkpen-toolbar--fixed"
72
+ data-controller="inkpen--toolbar"
73
+ data-inkpen--editor-target="toolbar"
74
+ data-inkpen--toolbar-style-value="fixed"
75
+ role="toolbar"
76
+ aria-label="Text formatting">
77
+ </div>
78
+ <% end %>
79
+ <% end %>
80
+
81
+ <%# Markdown editor textarea (hidden by default unless markdown mode) %>
82
+ <% if editor.markdown_mode&.enabled? %>
83
+ <textarea class="inkpen-markdown-editor <%= 'hidden' unless editor.markdown_mode.markdown_default? || editor.markdown_mode.split_default? %>"
84
+ data-inkpen--editor-target="markdownEditor"
85
+ data-label="Markdown"
86
+ placeholder="Write markdown here..."></textarea>
87
+ <% end %>
88
+
89
+ <%# Editor content area - TipTap mounts here %>
90
+ <div class="inkpen-editor__content <%= 'hidden' if editor.markdown_mode&.enabled? && editor.markdown_mode.markdown_default? %>"
91
+ data-inkpen--editor-target="content"
92
+ data-label="Preview"
93
+ data-placeholder="<%= editor.placeholder %>">
94
+ </div>
95
+
96
+ <%# Floating toolbar container (appears on text selection) %>
97
+ <% if editor.toolbar == :floating %>
98
+ <div class="inkpen-toolbar inkpen-toolbar--floating"
99
+ data-controller="inkpen--toolbar"
100
+ data-inkpen--editor-target="toolbar"
101
+ data-inkpen--toolbar-style-value="floating"
102
+ role="toolbar"
103
+ aria-label="Text formatting">
104
+ </div>
105
+ <% end %>
106
+
107
+ <%# Editor hints toggle — shows available shortcuts %>
108
+ <% if editor.extensions.include?(:mention) || editor.extensions.include?(:slash_commands) %>
109
+ <button type="button"
110
+ class="inkpen-hints-toggle"
111
+ data-action="click->inkpen--editor#toggleHints"
112
+ aria-label="Editor shortcuts"
113
+ title="Editor shortcuts">?</button>
114
+ <div class="inkpen-hints-panel"
115
+ data-inkpen--editor-target="hintsPanel"
116
+ hidden>
117
+ <div class="inkpen-hints-panel__title">Shortcuts</div>
118
+ <% if editor.extensions.include?(:slash_commands) %>
119
+ <div class="inkpen-hints-panel__item">
120
+ <kbd>/</kbd><span>Insert block</span>
121
+ </div>
122
+ <% end %>
123
+ <% if editor.extensions.include?(:mention) %>
124
+ <div class="inkpen-hints-panel__item">
125
+ <kbd>@</kbd><span>Mention user</span>
126
+ </div>
127
+ <% end %>
128
+ <div class="inkpen-hints-panel__item">
129
+ <kbd>⌘B</kbd><span>Bold</span>
130
+ </div>
131
+ <div class="inkpen-hints-panel__item">
132
+ <kbd>⌘I</kbd><span>Italic</span>
133
+ </div>
134
+ <div class="inkpen-hints-panel__item">
135
+ <kbd>⌘K</kbd><span>Link</span>
136
+ </div>
137
+ </div>
138
+ <% end %>
139
+ </div>
@@ -0,0 +1,170 @@
1
+ # Inkpen importmap configuration
2
+ # These pins are automatically added to the host app's importmap
3
+ # Using esm.sh for browser-compatible builds (no Node.js polyfills needed)
4
+
5
+ # ProseMirror core (TipTap's underlying editor framework)
6
+ pin "prosemirror-state", to: "https://esm.sh/prosemirror-state@1.4.3"
7
+ pin "prosemirror-view", to: "https://esm.sh/prosemirror-view@1.33.8"
8
+ pin "prosemirror-model", to: "https://esm.sh/prosemirror-model@1.22.3"
9
+ pin "prosemirror-transform", to: "https://esm.sh/prosemirror-transform@1.9.0"
10
+ pin "prosemirror-commands", to: "https://esm.sh/prosemirror-commands@1.5.2"
11
+ pin "prosemirror-keymap", to: "https://esm.sh/prosemirror-keymap@1.2.2"
12
+ pin "prosemirror-history", to: "https://esm.sh/prosemirror-history@1.4.1"
13
+ pin "prosemirror-dropcursor", to: "https://esm.sh/prosemirror-dropcursor@1.8.1"
14
+ pin "prosemirror-gapcursor", to: "https://esm.sh/prosemirror-gapcursor@1.3.2"
15
+ pin "prosemirror-schema-list", to: "https://esm.sh/prosemirror-schema-list@1.4.1"
16
+ pin "prosemirror-inputrules", to: "https://esm.sh/prosemirror-inputrules@1.4.0"
17
+ pin "prosemirror-tables", to: "https://esm.sh/prosemirror-tables@1.4.0"
18
+ pin "rope-sequence", to: "https://esm.sh/rope-sequence@1.3.4"
19
+ pin "orderedmap", to: "https://esm.sh/orderedmap@2.1.1"
20
+ pin "w3c-keyname", to: "https://esm.sh/w3c-keyname@2.2.8"
21
+ pin "crelt", to: "https://esm.sh/crelt@1.0.6"
22
+
23
+ # TipTap core
24
+ pin "@tiptap/core", to: "https://esm.sh/@tiptap/core@2.10.3"
25
+ pin "@tiptap/pm/state", to: "https://esm.sh/@tiptap/pm@2.10.3/state"
26
+ pin "@tiptap/pm/view", to: "https://esm.sh/@tiptap/pm@2.10.3/view"
27
+ pin "@tiptap/pm/model", to: "https://esm.sh/@tiptap/pm@2.10.3/model"
28
+ pin "@tiptap/pm/transform", to: "https://esm.sh/@tiptap/pm@2.10.3/transform"
29
+ pin "@tiptap/pm/commands", to: "https://esm.sh/@tiptap/pm@2.10.3/commands"
30
+ pin "@tiptap/pm/keymap", to: "https://esm.sh/@tiptap/pm@2.10.3/keymap"
31
+ pin "@tiptap/pm/history", to: "https://esm.sh/@tiptap/pm@2.10.3/history"
32
+ pin "@tiptap/pm/dropcursor", to: "https://esm.sh/@tiptap/pm@2.10.3/dropcursor"
33
+ pin "@tiptap/pm/gapcursor", to: "https://esm.sh/@tiptap/pm@2.10.3/gapcursor"
34
+ pin "@tiptap/pm/schema-list", to: "https://esm.sh/@tiptap/pm@2.10.3/schema-list"
35
+ pin "@tiptap/pm/inputrules", to: "https://esm.sh/@tiptap/pm@2.10.3/inputrules"
36
+ pin "@tiptap/pm/tables", to: "https://esm.sh/@tiptap/pm@2.10.3/tables"
37
+
38
+ # TipTap starter kit (includes common extensions)
39
+ pin "@tiptap/starter-kit", to: "https://esm.sh/@tiptap/starter-kit@2.10.3"
40
+
41
+ # TipTap extensions
42
+ pin "@tiptap/extension-document", to: "https://esm.sh/@tiptap/extension-document@2.10.3"
43
+ pin "@tiptap/extension-paragraph", to: "https://esm.sh/@tiptap/extension-paragraph@2.10.3"
44
+ pin "@tiptap/extension-text", to: "https://esm.sh/@tiptap/extension-text@2.10.3"
45
+ pin "@tiptap/extension-bold", to: "https://esm.sh/@tiptap/extension-bold@2.10.3"
46
+ pin "@tiptap/extension-italic", to: "https://esm.sh/@tiptap/extension-italic@2.10.3"
47
+ pin "@tiptap/extension-strike", to: "https://esm.sh/@tiptap/extension-strike@2.10.3"
48
+ pin "@tiptap/extension-heading", to: "https://esm.sh/@tiptap/extension-heading@2.10.3"
49
+ pin "@tiptap/extension-bullet-list", to: "https://esm.sh/@tiptap/extension-bullet-list@2.10.3"
50
+ pin "@tiptap/extension-ordered-list", to: "https://esm.sh/@tiptap/extension-ordered-list@2.10.3"
51
+ pin "@tiptap/extension-list-item", to: "https://esm.sh/@tiptap/extension-list-item@2.10.3"
52
+ pin "@tiptap/extension-blockquote", to: "https://esm.sh/@tiptap/extension-blockquote@2.10.3"
53
+ pin "@tiptap/extension-code-block", to: "https://esm.sh/@tiptap/extension-code-block@2.10.3"
54
+ pin "@tiptap/extension-code", to: "https://esm.sh/@tiptap/extension-code@2.10.3"
55
+ pin "@tiptap/extension-horizontal-rule", to: "https://esm.sh/@tiptap/extension-horizontal-rule@2.10.3"
56
+ pin "@tiptap/extension-hard-break", to: "https://esm.sh/@tiptap/extension-hard-break@2.10.3"
57
+ pin "@tiptap/extension-history", to: "https://esm.sh/@tiptap/extension-history@2.10.3"
58
+ pin "@tiptap/extension-dropcursor", to: "https://esm.sh/@tiptap/extension-dropcursor@2.10.3"
59
+ pin "@tiptap/extension-gapcursor", to: "https://esm.sh/@tiptap/extension-gapcursor@2.10.3"
60
+ pin "@tiptap/extension-link", to: "https://esm.sh/@tiptap/extension-link@2.10.3"
61
+
62
+ # Link extension dependencies
63
+ pin "linkifyjs", to: "https://esm.sh/linkifyjs@4.1.3"
64
+ pin "@tiptap/extension-placeholder", to: "https://esm.sh/@tiptap/extension-placeholder@2.10.3"
65
+ pin "@tiptap/extension-table", to: "https://esm.sh/@tiptap/extension-table@2.10.3"
66
+ pin "@tiptap/extension-table-row", to: "https://esm.sh/@tiptap/extension-table-row@2.10.3"
67
+ pin "@tiptap/extension-table-cell", to: "https://esm.sh/@tiptap/extension-table-cell@2.10.3"
68
+ pin "@tiptap/extension-table-header", to: "https://esm.sh/@tiptap/extension-table-header@2.10.3"
69
+ pin "@tiptap/extension-image", to: "https://esm.sh/@tiptap/extension-image@2.10.3"
70
+
71
+ # Task List extension
72
+ pin "@tiptap/extension-task-list", to: "https://esm.sh/@tiptap/extension-task-list@2.10.3"
73
+ pin "@tiptap/extension-task-item", to: "https://esm.sh/@tiptap/extension-task-item@2.10.3"
74
+
75
+ # Mention extension
76
+ pin "@tiptap/extension-mention", to: "https://esm.sh/@tiptap/extension-mention@2.10.3"
77
+ pin "@tiptap/suggestion", to: "https://esm.sh/@tiptap/suggestion@2.10.3"
78
+
79
+ # Syntax highlighting for code blocks
80
+ pin "@tiptap/extension-code-block-lowlight", to: "https://esm.sh/@tiptap/extension-code-block-lowlight@2.10.3"
81
+
82
+ # Typography extension (markdown shortcuts, smart quotes)
83
+ pin "@tiptap/extension-typography", to: "https://esm.sh/@tiptap/extension-typography@2.10.3"
84
+
85
+ # Text formatting marks
86
+ pin "@tiptap/extension-highlight", to: "https://esm.sh/@tiptap/extension-highlight@2.10.3"
87
+ pin "@tiptap/extension-underline", to: "https://esm.sh/@tiptap/extension-underline@2.10.3"
88
+ pin "@tiptap/extension-subscript", to: "https://esm.sh/@tiptap/extension-subscript@2.10.3"
89
+ pin "@tiptap/extension-superscript", to: "https://esm.sh/@tiptap/extension-superscript@2.10.3"
90
+
91
+ # YouTube video embeds
92
+ pin "@tiptap/extension-youtube", to: "https://esm.sh/@tiptap/extension-youtube@2.10.3"
93
+
94
+ # Character count
95
+ pin "@tiptap/extension-character-count", to: "https://esm.sh/@tiptap/extension-character-count@2.10.3"
96
+
97
+ # BubbleMenu (floating toolbar on text selection)
98
+ pin "@tiptap/extension-bubble-menu", to: "https://esm.sh/@tiptap/extension-bubble-menu@2.10.3"
99
+
100
+ # FloatingMenu (toolbar on empty lines)
101
+ pin "@tiptap/extension-floating-menu", to: "https://esm.sh/@tiptap/extension-floating-menu@2.10.3"
102
+
103
+ # Tippy.js - required by BubbleMenu for positioning
104
+ pin "tippy.js", to: "https://esm.sh/tippy.js@6.3.7"
105
+ pin "@popperjs/core", to: "https://esm.sh/@popperjs/core@2.11.8"
106
+
107
+ # Lowlight with bundled dependencies
108
+ pin "lowlight", to: "https://esm.sh/lowlight@3?bundle"
109
+
110
+ # Highlight.js core and common languages for syntax highlighting
111
+ pin "highlight.js/lib/core", to: "https://esm.sh/highlight.js@11.9.0/lib/core"
112
+ pin "highlight.js/lib/languages/javascript", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/javascript"
113
+ pin "highlight.js/lib/languages/typescript", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/typescript"
114
+ pin "highlight.js/lib/languages/ruby", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/ruby"
115
+ pin "highlight.js/lib/languages/python", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/python"
116
+ pin "highlight.js/lib/languages/css", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/css"
117
+ pin "highlight.js/lib/languages/xml", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/xml"
118
+ pin "highlight.js/lib/languages/json", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/json"
119
+ pin "highlight.js/lib/languages/bash", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/bash"
120
+ pin "highlight.js/lib/languages/sql", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/sql"
121
+ pin "highlight.js/lib/languages/markdown", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/markdown"
122
+
123
+ # Emoji replacer extension (auto-replaces :emoji: shortcodes)
124
+ pin "@tiptap-extend/emoji-replacer", to: "https://esm.sh/@tiptap-extend/emoji-replacer@2.1.6?deps=@tiptap/core@2.10.3"
125
+
126
+ # Search and Replace extension
127
+ pin "@sereneinserenade/tiptap-search-and-replace", to: "https://esm.sh/@sereneinserenade/tiptap-search-and-replace@0.1.1"
128
+
129
+ # Footnotes extension
130
+ pin "tiptap-footnotes", to: "https://esm.sh/tiptap-footnotes@2.0.4?deps=@tiptap/core@2.10.3,@tiptap/pm@2.10.3"
131
+
132
+ # Inkpen controllers and extensions
133
+ pin "inkpen", to: "inkpen/index.js"
134
+ pin_all_from File.expand_path("../app/assets/javascripts/inkpen", __dir__), under: "inkpen"
135
+
136
+ # Inkpen custom extensions - explicit pins required for nested directories
137
+ pin "inkpen/extensions/section", to: "inkpen/extensions/section.js"
138
+ pin "inkpen/extensions/preformatted", to: "inkpen/extensions/preformatted.js"
139
+ pin "inkpen/extensions/slash_commands", to: "inkpen/extensions/slash_commands.js"
140
+ pin "inkpen/extensions/block_gutter", to: "inkpen/extensions/block_gutter.js"
141
+ pin "inkpen/extensions/drag_handle", to: "inkpen/extensions/drag_handle.js"
142
+ pin "inkpen/extensions/toggle_block", to: "inkpen/extensions/toggle_block.js"
143
+ pin "inkpen/extensions/columns", to: "inkpen/extensions/columns.js"
144
+ pin "inkpen/extensions/callout", to: "inkpen/extensions/callout.js"
145
+ pin "inkpen/extensions/block_commands", to: "inkpen/extensions/block_commands.js"
146
+ pin "inkpen/extensions/enhanced_image", to: "inkpen/extensions/enhanced_image.js"
147
+ pin "inkpen/extensions/file_attachment", to: "inkpen/extensions/file_attachment.js"
148
+ pin "inkpen/extensions/embed", to: "inkpen/extensions/embed.js"
149
+ pin "inkpen/extensions/advanced_table", to: "inkpen/extensions/advanced_table.js"
150
+ pin "inkpen/extensions/table_of_contents", to: "inkpen/extensions/table_of_contents.js"
151
+ pin "inkpen/extensions/database", to: "inkpen/extensions/database.js"
152
+ pin "inkpen/extensions/document_section", to: "inkpen/extensions/document_section.js"
153
+ pin "inkpen/extensions/section_title", to: "inkpen/extensions/section_title.js"
154
+ pin "inkpen/extensions/export_commands", to: "inkpen/extensions/export_commands.js"
155
+ pin "inkpen/extensions/content_embed", to: "inkpen/extensions/content_embed.js"
156
+
157
+ # Export modules - explicit pins for relative import resolution
158
+ pin "inkpen/export", to: "inkpen/export/index.js"
159
+ pin "inkpen/export/markdown", to: "inkpen/export/markdown.js"
160
+ pin "inkpen/export/html", to: "inkpen/export/html.js"
161
+ pin "inkpen/export/pdf", to: "inkpen/export/pdf.js"
162
+
163
+ # InkpenTable module - explicit pins for all sub-modules
164
+ pin "inkpen/extensions/inkpen_table", to: "inkpen/extensions/inkpen_table/index.js"
165
+ pin "inkpen/extensions/inkpen_table/inkpen_table", to: "inkpen/extensions/inkpen_table/inkpen_table.js"
166
+ pin "inkpen/extensions/inkpen_table/inkpen_table_cell", to: "inkpen/extensions/inkpen_table/inkpen_table_cell.js"
167
+ pin "inkpen/extensions/inkpen_table/inkpen_table_header", to: "inkpen/extensions/inkpen_table/inkpen_table_header.js"
168
+ pin "inkpen/extensions/inkpen_table/table_menu", to: "inkpen/extensions/inkpen_table/table_menu.js"
169
+ pin "inkpen/extensions/inkpen_table/table_helpers", to: "inkpen/extensions/inkpen_table/table_helpers.js"
170
+ pin "inkpen/extensions/inkpen_table/table_constants", to: "inkpen/extensions/inkpen_table/table_constants.js"
data/docs/.DS_Store ADDED
Binary file