plain-rails 0.1.1 → 0.2.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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +31 -9
  3. data/app/assets/builds/plain.css +1 -1
  4. data/app/assets/stylesheets/plain/application.tailwind.css +34 -1
  5. data/app/controllers/plain/conversations_controller.rb +8 -4
  6. data/app/controllers/plain/docs_controller.rb +51 -16
  7. data/app/controllers/plain/documents_controller.rb +28 -0
  8. data/app/controllers/plain/home_controller.rb +2 -2
  9. data/app/helpers/plain/documents_helper.rb +4 -0
  10. data/app/models/plain/document.rb +49 -0
  11. data/app/services/plain/ai_docs.rb +10 -9
  12. data/app/services/plain/docs_service.rb +21 -3
  13. data/app/views/layouts/plain/application.html.erb +133 -49
  14. data/app/views/plain/conversations/_conversation_item.html.erb +22 -15
  15. data/app/views/plain/conversations/_conversation_list.html.erb +1 -1
  16. data/app/views/plain/conversations/_modal.html.erb +9 -8
  17. data/app/views/plain/conversations/_status.erb +9 -0
  18. data/app/views/plain/conversations/destroy.turbo_stream.erb +1 -0
  19. data/app/views/plain/conversations/index.html.erb +9 -5
  20. data/app/views/plain/conversations/pin.turbo_stream.erb +3 -0
  21. data/app/views/plain/conversations/show.html.erb +3 -1
  22. data/app/views/plain/docs/_form.html.erb +41 -0
  23. data/app/views/plain/docs/_menu.erb +1 -5
  24. data/app/views/plain/docs/_sections.erb +1 -1
  25. data/app/views/plain/docs/edit.html.erb +3 -0
  26. data/app/views/plain/docs/show.html.erb +28 -9
  27. data/app/views/plain/docs/update.turbo_stream.erb +3 -0
  28. data/app/views/plain/documents/_form.erb +47 -0
  29. data/app/views/plain/documents/create.turbo_stream.erb +15 -0
  30. data/app/views/plain/documents/new.html.erb +3 -0
  31. data/app/views/plain/home/index.html.erb +8 -25
  32. data/app/views/plain/messages/_form.html.erb +7 -3
  33. data/app/views/plain/messages/_message_item.html.erb +35 -13
  34. data/app/views/plain/shared/_powered_by.erb +10 -0
  35. data/config/routes.rb +9 -1
  36. data/lib/plain/configuration.rb +2 -1
  37. data/lib/plain/engine.rb +1 -1
  38. data/lib/plain/version.rb +1 -1
  39. data/lib/tasks/plain_tasks.rake +40 -0
  40. metadata +19 -21
  41. data/app/views/plain/conversations/_conversation_item.erb +0 -15
@@ -40,11 +40,11 @@ module Langchain
40
40
  end
41
41
 
42
42
  module Plain
43
- class Markdownray < Redcarpet::Render::HTML
44
- def block_code(code, language)
45
- CodeRay.scan(code, language).div() rescue "xxx"
46
- end
47
- end
43
+ #class Markdownray < Redcarpet::Render::HTML
44
+ # def block_code(code, language)
45
+ # CodeRay.scan(code, language).div() rescue "xxx"
46
+ # end
47
+ #end
48
48
 
49
49
  class AiDocs
50
50
 
@@ -87,9 +87,10 @@ module Plain
87
87
  # Distinguishing files from directories
88
88
  files_without_extension, directories = Plain.configuration.paths.partition { |path| File.file?(path) }
89
89
 
90
+
90
91
  # Getting files from directories based on the allowed extensions
91
92
  files_with_extension = directories.flat_map do |dir|
92
- Dir[File.join(dir, "*.{#{Plain.configuration.extensions.join(',')}}")]
93
+ Dir[File.join("#{dir}/*/**", "*.{#{Plain.configuration.extensions.join(',')}}")]
93
94
  end
94
95
 
95
96
  puts "FILES WITH EXTENSIONS"
@@ -109,15 +110,15 @@ module Plain
109
110
  end
110
111
 
111
112
  def self.convert_markdown(text)
112
- rndr = Markdownray.new(filter_html: true, hard_wrap: true)
113
+ # rndr = Markdownray.new(filter_html: true, hard_wrap: true)
113
114
  options = {
114
115
  fenced_code_blocks: true,
115
116
  no_intra_emphasis: true,
116
117
  autolink: true,
117
118
  lax_html_blocks: true
118
119
  }
119
- # markdown_to_html = Redcarpet::Markdown.new(Redcarpet::Render::HTML, autolink: true, tables: true)
120
- markdown_to_html = Redcarpet::Markdown.new(rndr, options)
120
+ markdown_to_html = Redcarpet::Markdown.new(Redcarpet::Render::HTML, options)
121
+ # markdown_to_html = Redcarpet::Markdown.new(rndr, options)
121
122
  markdown_to_html.render(text) #rescue nil
122
123
  end
123
124
 
@@ -13,6 +13,21 @@ class Plain::DocsService
13
13
  }
14
14
  end
15
15
 
16
+ # used in the compile rake task
17
+ def self.get_all_files(structure)
18
+ files = []
19
+
20
+ structure[:children].each do |child|
21
+ if child[:type] == 'file'
22
+ files << child
23
+ elsif child[:type] == 'directory'
24
+ files.concat(get_all_files(child))
25
+ end
26
+ end
27
+
28
+ files
29
+ end
30
+
16
31
  def self.parse_section_items
17
32
  config = self.config
18
33
  main_sections = config['sections']
@@ -50,9 +65,14 @@ class Plain::DocsService
50
65
  # Sort by position and return children
51
66
  all_sections.sort_by { |section| section[:position] }
52
67
  end
68
+
69
+ def self.get_markdown(file_path)
70
+ parsed = FrontMatterParser::Parser.parse_file(Rails.root.join('docs', "#{file_path}.md"))
71
+ parsed
72
+ end
53
73
 
54
74
  def self.get_content(file_path)
55
- parsed = FrontMatterParser::Parser.parse_file(Rails.root.join('docs', "#{file_path}.md"))
75
+ parsed = self.get_markdown(file_path)
56
76
 
57
77
  # markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, autolink: true, tables: true)
58
78
  # markdown.render(parsed.content).html_safe
@@ -103,8 +123,6 @@ class Plain::DocsService
103
123
  end
104
124
  end
105
125
 
106
-
107
-
108
126
  def self.assign_position_from_config(parent, path)
109
127
  config = YAML.load_file(path)
110
128
  parent[:position] = config&.fetch('position', DEFAULT_POSITION)
@@ -1,51 +1,135 @@
1
1
  <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Plain</title>
5
- <%= csrf_meta_tags %>
6
- <%= csp_meta_tag %>
7
-
8
- <%= stylesheet_link_tag "plain", "data-turbo-track": "reload" %>
9
- <!-- actual rails host app -->
10
- <% #= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>
11
-
12
-
13
- <script type="module">
14
- // import railsActioncable from 'https://cdn.skypack.dev/@rails/actioncable';
15
- // import railsActioncable from 'https://cdn.skypack.dev/@rails/actioncable'
16
- import {Turbo} from 'https://jspm.dev/@hotwired/turbo-rails';
17
- //Turbo.session.drive = false
18
- window.Turbo = Turbo
19
- </script>
20
-
21
- <script type="module">
22
- import { Application, Controller } from "https://unpkg.com/@hotwired/stimulus/dist/stimulus.js"
23
- window.Stimulus = Application.start()
24
-
25
- Stimulus.debug = true
26
- Stimulus.register("scroll", class extends Controller {
27
- // static targets = [ "scroll" ]
28
- connect() {
29
- this.element.scrollIntoView()
30
- }
31
- })
32
-
33
- Stimulus.register("toggle-class", class extends Controller {
34
- toggle(event) {
35
- // Toggle 'active' class on button
36
- event.currentTarget.classList.toggle('active');
37
-
38
- // Toggle 'hidden' class on controller's root element
39
- this.element.classList.toggle('hidden');
40
- }
41
- })
42
- </script>
43
-
44
-
45
- </head>
46
- <body>
47
-
48
- <%= yield %>
49
-
50
- </body>
2
+ <html data-controller="dark-mode">
3
+ <head>
4
+ <title>Plain</title>
5
+ <%= csrf_meta_tags %>
6
+ <%= csp_meta_tag %>
7
+
8
+
9
+ <% if params[:static].present? %>
10
+ <style>
11
+ <%= Rails.application.assets.find_asset('plain.css').to_s %>
12
+ </style>
13
+ <% else %>
14
+ <%= stylesheet_link_tag "plain", "data-turbo-track": "reload" %>
15
+ <% end %>
16
+
17
+ <!-- actual rails host app -->
18
+ <% #= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>
19
+
20
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/dark.min.css">
21
+ <!--<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/default.min.css">-->
22
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
23
+
24
+ <link
25
+ rel="stylesheet"
26
+ href="https://cdn.jsdelivr.net/npm/easymde/dist/easymde.min.css"
27
+ />
28
+ <script src="https://cdn.jsdelivr.net/npm/easymde/dist/easymde.min.js"></script>
29
+
30
+ <script type="module">
31
+ import Markdoc from "https://cdn.skypack.dev/@markdoc/markdoc";
32
+ window.Markdoc = Markdoc
33
+ </script>
34
+
35
+ <script type="module">
36
+ import {Turbo} from 'https://jspm.dev/@hotwired/turbo-rails';
37
+ window.Turbo = Turbo
38
+ </script>
39
+
40
+ <script type="module">
41
+ import { Application, Controller } from "https://unpkg.com/@hotwired/stimulus/dist/stimulus.js"
42
+ window.Stimulus = Application.start()
43
+
44
+ Stimulus.debug = true
45
+ Stimulus.register("scroll-to", class extends Controller {
46
+ // static targets = [ "scroll" ]
47
+ connect() {
48
+ this.element.scrollIntoView()
49
+ }
50
+ })
51
+
52
+ Stimulus.register("toggle-class", class extends Controller {
53
+ toggle(event) {
54
+ // Toggle 'active' class on button
55
+ event.currentTarget.classList.toggle('active');
56
+
57
+ // Toggle 'hidden' class on controller's root element
58
+ this.element.classList.toggle('hidden');
59
+ }
60
+ })
61
+
62
+ Stimulus.register("markdoc", class extends Controller {
63
+ static values = {
64
+ content: String
65
+ }
66
+
67
+ static targets = ["container"]
68
+
69
+ connect(){
70
+ console.log("content", this.contentValue)
71
+ this.renderMarkdoc()
72
+ }
73
+
74
+ contentValueChanged() {
75
+ this.renderMarkdoc()
76
+ }
77
+
78
+ renderMarkdoc(){
79
+ const ast = Markdoc.parse(this.contentValue)
80
+ console.log(ast)
81
+ const content = Markdoc.transform(ast, /* config */);
82
+ const html = Markdoc.renderers.html(content)
83
+ console.log(html)
84
+
85
+ this.containerTarget.innerHTML = html
86
+
87
+ this.containerTarget.querySelectorAll('pre').forEach((el) => {
88
+ hljs.highlightElement(el);
89
+ });
90
+ // console.log(`${Markdoc.renderers.html(content)}`)
91
+ }
92
+ })
93
+
94
+ Stimulus.register("highlight", class extends Controller {
95
+ connect(){
96
+ this.element.querySelectorAll('pre').forEach((el) => {
97
+ hljs.highlightElement(el);
98
+ });
99
+ }
100
+ })
101
+
102
+ Stimulus.register("dark-mode", class extends Controller {
103
+ initialize() {
104
+ if (localStorage.getItem('dark-mode') === 'enabled') {
105
+ this.element.classList.add('dark');
106
+ }
107
+ }
108
+
109
+ toggleDarkMode(e) {
110
+ e.preventDefault()
111
+ if (this.element.classList.toggle('dark')) {
112
+ localStorage.setItem('dark-mode', 'enabled');
113
+ } else {
114
+ localStorage.setItem('dark-mode', 'disabled');
115
+ }
116
+ }
117
+ });
118
+
119
+ Stimulus.register("markdown-editor", class extends Controller {
120
+ initialize() {
121
+ this.editor = new EasyMDE({element: this.element });
122
+ }
123
+
124
+ disconnect(){
125
+ this.editor && this.editor.cleanup()
126
+ }
127
+ });
128
+ </script>
129
+
130
+ </head>
131
+
132
+ <body class="antialiased text-zinc-500 dark:text-zinc-400 bg-white dark:bg-zinc-900">
133
+ <%= yield %>
134
+ </body>
51
135
  </html>
@@ -1,21 +1,28 @@
1
- <div class="p-2 rounded-sm hover:bg-black/5">
2
- <%= link_to conversation_path(conversation), data: {"turbo-frame": "plain"} do %>
3
- <div class="p-2 rounded-sm hover:bg-black/5">
1
+ <div class="p-2 rounded-sm hover:bg-black/5" id="conversation-<%= conversation.id%>">
4
2
 
5
- <div class="flex space-x-2">
6
- <% if conversation.pinned? %>
7
- <div class="w-5 h-5">
8
- <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
9
- <path stroke-linecap="round" stroke-linejoin="round" d="M17.593 3.322c1.1.128 1.907 1.077 1.907 2.185V21L12 17.25 4.5 21V5.507c0-1.108.806-2.057 1.907-2.185a48.507 48.507 0 0111.186 0z" />
10
- </svg>
11
- </div>
12
- <% end %>
3
+ <div class="flex justify-between">
13
4
 
5
+ <div class="flex space-x-2 ">
6
+ <%= render "plain/conversations/status", conversation: conversation %>
7
+
8
+ <%= link_to conversation_path(conversation), data: {"turbo-frame": "plain"} do %>
14
9
  <span><%= conversation.subject || "new chat" %> </span>
15
- </div>
16
- <p class="text-xs">
17
- <%= time_ago_in_words(conversation.created_at) %>
18
- </p>
10
+ <% end %>
19
11
  </div>
12
+
13
+ <% if !Rails.env.production? %>
14
+ <%= link_to conversation_path(conversation),
15
+ class: "rounded-full p-1 hover:border dark:border-gray-600",
16
+ "data-turbo-method": "delete",
17
+ "data-turbo-confirm": "sure?" do %>
18
+ <svg class="h-3 w-3" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true">
19
+ <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"></path>
20
+ </svg>
21
+ <% end %>
20
22
  <% end %>
21
23
  </div>
24
+ <p class="text-xs text-gray-400">
25
+ <%= time_ago_in_words(conversation.created_at) %>
26
+ </p>
27
+
28
+ </div>
@@ -1,5 +1,5 @@
1
1
  <%= turbo_frame_tag "conversation-list-#{@current_page}" do %>
2
- <div class="divide divide-y">
2
+ <div class="divide divide-y dark:divide-zinc-700">
3
3
  <%= render partial: "plain/conversations/conversation_item", collection: @conversations, as: :conversation %>
4
4
  </div>
5
5
  <% if @conversations.size.positive? %>
@@ -1,4 +1,4 @@
1
- <div class="relative z-50"
1
+ <div class="relative z-50 antialiased"
2
2
  id="ai-assistant"
3
3
  data-controller="toggle-class"
4
4
  aria-labelledby="slide-over-title"
@@ -24,26 +24,27 @@
24
24
  <div class="flex h-full flex-col divide-y divide-gray-200 bg-white shadow-xl">
25
25
 
26
26
 
27
- <div class="h-0 flex-1 overflow-y-auto bg-black/5">
28
- <div class="bg-brand-700 px-4 py-6 sm:px-6">
27
+ <div class="h-0 flex-1 overflow-y-auto bg-zinc-50 dark:bg-zinc-900 border-l dark:border-zinc-700">
28
+ <div class="bg-white/80 dark:bg-zinc-900/90 backdrop-blur shadow-[0_1px_rgba(202,206,214,.3),0_5px_10px_-5px_rgba(0,0,0,.05)] justify-between py-3 pl-3 pr-2">
29
29
  <div class="flex items-center justify-between">
30
30
 
31
31
  <% if @conversation.present? || @needs_back %>
32
- <%= link_to plain.root_path, class: "p-4 rounded-md hover:bg-black/10" do %>
32
+ <%= link_to plain.root_path, class: "p-2 rounded-md hover:bg-black/10" do %>
33
33
  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
34
34
  <path stroke-linecap="round" stroke-linejoin="round" d="M19.5 12h-15m0 0l6.75 6.75M4.5 12l6.75-6.75" />
35
35
  </svg>
36
36
  <% end %>
37
37
  <% end %>
38
38
 
39
- <h2 class="text-base font-semibold leading-6 text-white" id="slide-over-title">
39
+ <h2 class="text-lg font-bold leading-6 text-gray-900 dark:text-gray-100"
40
+ id="slide-over-title">
40
41
  PLAIN AI ASSISTANT
41
42
  </h2>
42
43
 
43
44
  <div class="ml-3 flex h-7 items-center">
44
45
  <button type="button"
45
46
  data-action="toggle-class#toggle"
46
- class="rounded-md bg-brand-700 text-brand-200 hover:text-white focus:outline-none focus:ring-2 focus:ring-white">
47
+ class="rounded-md bg-black/20 text-gray-700 dark:text-gray-300 hover:text-white focus:outline-none focus:ring-2 focus:ring-white">
47
48
  <span class="sr-only">Close panel</span>
48
49
  <svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true">
49
50
  <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
@@ -52,13 +53,13 @@
52
53
  </div>
53
54
  </div>
54
55
  <div class="mt-1 hidden">
55
- <p class="text-sm text-brand-300">
56
+ <p class="text-sm text-brand-300 dark:text-brand-700">
56
57
  Get started by filling in the information below to create your new project.
57
58
  </p>
58
59
  </div>
59
60
  </div>
60
61
  <div class="flex flex-1 flex-col justify-between">
61
- <div class="divide-y divide-gray-200">
62
+ <div class="divide-y divide-gray-200 dark:divide-gray-800">
62
63
  <div class="space-y-6-- py-6--">
63
64
  <%= yield %>
64
65
  </div>
@@ -0,0 +1,9 @@
1
+ <%= turbo_frame_tag "conversation-#{conversation.id}-status" do %>
2
+ <%= link_to pin_conversation_path(conversation), "data-turbo-method": :put do %>
3
+ <div class="w-5 h-5 hover:text-green-600 <%= conversation.pinned? ? "text-green-500" : "text-gray-300" %> ">
4
+ <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
5
+ <path stroke-linecap="round" stroke-linejoin="round" d="M17.593 3.322c1.1.128 1.907 1.077 1.907 2.185V21L12 17.25 4.5 21V5.507c0-1.108.806-2.057 1.907-2.185a48.507 48.507 0 0111.186 0z" />
6
+ </svg>
7
+ </div>
8
+ <% end %>
9
+ <% end %>
@@ -0,0 +1 @@
1
+ <%= turbo_stream.remove "conversation-#{@conversation.id}" %>
@@ -1,17 +1,21 @@
1
1
  <%= turbo_frame_tag "plain" do %>
2
2
  <%= render "modal" do %>
3
- <div class="border shadow-sm rounded-md bg-white m-4">
4
- <h2 class=" p-4 inline-block text-2xl sm:text-3xl font-extrabold text-slate-900 tracking-tight dark:text-slate-200">
3
+
4
+ <div class="border dark:border-zinc-900 shadow-sm rounded-md bg-white dark:bg-zinc-800 m-4">
5
+ <h2 class=" p-4 inline-block text-md sm:text-lg font-extrabold text-zinc-900 tracking-tight dark:text-zinc-200">
5
6
  Continue conversations
6
7
  </h2>
7
8
 
8
9
  <div class="h-[calc(100vh-255px)] overflow-y-scroll group">
9
10
  <%= render "plain/conversations/conversation_list" %>
10
11
  </div>
11
-
12
- <div class="m-2">
13
- <%= link_to "New conversation", new_conversation_path, class: "rounded-md bg-brand-600 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand-600" %>
12
+
13
+ <div class="flex justify-between px-3 py-2 text-xs font-medium border-t dark:border-zinc-700 rounded-b-lg bg-zinc-100/75 dark:bg-zinc-900/75">
14
+ <%= link_to "New conversation", new_conversation_path, class: "btn-dark" %>
15
+ <%= link_to "See previous chats", conversations_path, class: "link" %>
14
16
  </div>
15
17
  </div>
18
+
19
+ <%= render "plain/shared/powered_by" %>
16
20
  <% end %>
17
21
  <% end %>
@@ -0,0 +1,3 @@
1
+ <%= turbo_stream.update "conversation-#{@conversation.id}-status" do %>
2
+ <%= render "plain/conversations/status", conversation: @conversation %>
3
+ <% end %>
@@ -1,14 +1,16 @@
1
1
  <%= turbo_frame_tag "plain" do %>
2
2
  <%= render "modal" do %>
3
3
  <%= turbo_stream_from(@conversation) %>
4
- <div class="h-[calc(100vh-155px)] overflow-y-scroll">
4
+ <div class="h-[calc(100vh-117px)] overflow-y-scroll">
5
5
  <%= turbo_frame_tag "message-list-0", loading: :lazy,
6
6
  src: plain.conversation_messages_path(@conversation, page: 0),
7
7
  class: 'empty:block group' %>
8
8
  <div id="new-messages-container"></div>
9
9
  </div>
10
+
10
11
  <div class="bg-red-600">
11
12
  <%= render "plain/messages/form", conversation: @conversation %>
12
13
  </div>
13
14
  <% end %>
15
+
14
16
  <% end %>
@@ -0,0 +1,41 @@
1
+
2
+ <%= form_for @document, url: update_doc_path(@file_path), method: :put do |f| %>
3
+ <div class="flex space-x-2 dark:bg-zinc-800 p-10 rounded-lg ">
4
+
5
+ <% #= @document.errors.full_messages %>
6
+ <div class="w-2/3">
7
+ <%= f.text_area :content, "data-controller": "markdown-editor"%>
8
+ </div>
9
+
10
+ <div>
11
+
12
+ <div class="sm:col-span-3">
13
+ <%= f.label :title, class: "block text-sm font-medium leading-6 text-gray-900 dark:text-gray-100" %>
14
+ <div class="mt-2">
15
+ <%= f.text_field :title, class: "bg-white dark:bg-transparent block w-full rounded-md border-0 py-1.5 text-gray-900 dark:text-gray-100 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6" %>
16
+ </div>
17
+ </div>
18
+
19
+ <div class="sm:col-span-3">
20
+ <%= f.label :menu_position, class: "block text-sm font-medium leading-6 text-gray-900 dark:text-gray-100" %>
21
+ <div class="mt-2">
22
+ <%= f.number_field :menu_position, class: "bg-white dark:bg-transparent block w-full rounded-md border-0 py-1.5 text-gray-900 dark:text-gray-100 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6" %>
23
+ </div>
24
+ </div>
25
+
26
+ <div class="sm:col-span-4">
27
+ <%= f.label :path, class: "block text-sm font-medium leading-6 text-gray-900 dark:text-gray-100" %>
28
+ <div class="mt-2">
29
+ <div class="flex rounded-md shadow-sm ring-1 ring-inset ring-gray-300 focus-within:ring-2 focus-within:ring-inset focus-within:ring-indigo-600 sm:max-w-md">
30
+ <span class="flex select-none items-center pl-3 text-gray-500 sm:text-sm">/docs/</span>
31
+ <%= f.text_field :path, class: "block flex-1 border-0 bg-transparent py-1.5 pl-1 text-gray-900 dark:text-gray-100 placeholder:text-gray-400 focus:ring-0 sm:text-sm sm:leading-6", placeholder: "janesmith" %>
32
+ </div>
33
+ </div>
34
+ </div>
35
+
36
+ <%= f.submit class: "btn-dark my-2" %>
37
+
38
+ </div>
39
+
40
+ </div>
41
+ <% end %>
@@ -1,14 +1,11 @@
1
-
2
1
  <ul role="list" class="border-l border-transparent">
3
-
4
-
5
2
  <% nodes.each do |node| %>
6
3
  <% if node[:type] == 'directory' %>
7
4
  <li class="relative">
8
5
  <span class="<%= level == 1 ? 'text-xs font-semibold text-zinc-900 dark:text-white' : 'flex justify-between gap-2 py-1 pr-3 text-sm transition pl-4 text-zinc-900 dark:text-white'%>">
9
6
  <%= node[:name].capitalize.humanize %>
10
7
  </span>
11
- <%= render partial: 'menu', locals: { nodes: node[:children], level: level + 1 } %>
8
+ <%= render partial: 'plain/docs/menu', locals: { nodes: node[:children], level: level + 1 } %>
12
9
  </li>
13
10
  <% else %>
14
11
  <li class="relative">
@@ -16,5 +13,4 @@
16
13
  </li>
17
14
  <% end %>
18
15
  <% end %>
19
-
20
16
  </ul>
@@ -47,7 +47,7 @@
47
47
  </svg>
48
48
  </div>
49
49
  </div>
50
- <div class="absolute inset-0 rounded-2xl ring-1 ring-inset ring-zinc-900/7.5 group-hover:ring-zinc-900/10 dark:ring-white/10 dark:group-hover:ring-white/20"></div>
50
+ <div class="dark:bg-zinc-800 absolute inset-0 rounded-2xl ring-1 ring-inset ring-zinc-900/7.5 group-hover:ring-zinc-900/10 dark:ring-white/10 dark:group-hover:ring-white/20"></div>
51
51
  <div class="relative rounded-2xl px-4 pb-4 pt-16">
52
52
  <div class="flex h-7 w-7 items-center justify-center rounded-full bg-zinc-900/5 ring-1 ring-zinc-900/25 backdrop-blur-[2px] transition duration-300 group-hover:bg-white/50 group-hover:ring-zinc-900/25 dark:bg-white/7.5 dark:ring-white/15 dark:group-hover:bg-emerald-300/10 dark:group-hover:ring-emerald-400">
53
53
  <svg viewBox="0 0 20 20" aria-hidden="true" class="h-5 w-5 fill-zinc-700/10 stroke-zinc-700 transition-colors duration-300 group-hover:stroke-zinc-900 dark:fill-white/10 dark:stroke-zinc-400 dark:group-hover:fill-emerald-300/10 dark:group-hover:stroke-emerald-400">
@@ -0,0 +1,3 @@
1
+ <%= turbo_frame_tag "doc-frame" do %>
2
+ <%= render "form", markdown_content: @markdown_content %>
3
+ <% end %>
@@ -8,7 +8,7 @@
8
8
  <div class="contents lg:pointer-events-auto lg:block lg:w-72 lg:overflow-y-auto lg:border-r lg:border-zinc-900/10 lg:px-6 lg:pb-8 lg:pt-4 lg:dark:border-white/10 xl:w-80">
9
9
  <div class="hidden lg:flex">
10
10
  <a aria-label="Home" href="/" class="flex space-x-2 items-center">
11
- <% if @config["logo"] %>
11
+ <% if @config["logo"] && params[:static].blank? %>
12
12
  <%= image_tag(@config["logo"], class: "h-10") %>
13
13
  <% end %>
14
14
  <span class="font-extrabold uppercase text-xl">
@@ -73,16 +73,20 @@
73
73
  <% end %>
74
74
  </ul>
75
75
  </nav>
76
- <div class="hidden md:block md:h-5 md:w-px md:bg-zinc-900/10 md:dark:bg-white/15"></div>
77
- <div class="hidden flex gap-4">
76
+ <div class="md:block md:h-5 md:w-px md:bg-zinc-900/10 md:dark:bg-white/15"></div>
77
+ <div class="flex gap-4">
78
+
78
79
  <div class="contents lg:hidden">
79
80
  <button type="button" class="flex h-6 w-6 items-center justify-center rounded-md transition hover:bg-zinc-900/5 dark:hover:bg-white/5 lg:hidden focus:[&amp;:not(:focus-visible)]:outline-none" aria-label="Find something...">
80
81
  <svg viewBox="0 0 20 20" fill="none" aria-hidden="true" class="h-5 w-5 stroke-zinc-900 dark:stroke-white">
81
82
  <path stroke-linecap="round" stroke-linejoin="round" d="M12.01 12a4.25 4.25 0 1 0-6.02-6 4.25 4.25 0 0 0 6.02 6Zm0 0 3.24 3.25"></path>
82
83
  </svg>
84
+ xxx
83
85
  </button>
84
86
  </div>
85
- <button type="button" class="flex h-6 w-6 items-center justify-center rounded-md transition hover:bg-zinc-900/5 dark:hover:bg-white/5" aria-label="Toggle dark mode">
87
+
88
+ <a href="#" data-action="dark-mode#toggleDarkMode"
89
+ class="flex h-6 w-6 items-center justify-center rounded-md transition hover:bg-zinc-900/5 dark:hover:bg-white/5" aria-label="Toggle dark mode">
86
90
  <svg viewBox="0 0 20 20" fill="none" aria-hidden="true" class="h-5 w-5 stroke-zinc-900 dark:hidden">
87
91
  <path d="M12.5 10a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0Z"></path>
88
92
  <path stroke-linecap="round" d="M10 5.5v-1M13.182 6.818l.707-.707M14.5 10h1M13.182 13.182l.707.707M10 15.5v-1M6.11 13.889l.708-.707M4.5 10h1M6.11 6.111l.708.707"></path>
@@ -90,7 +94,8 @@
90
94
  <svg viewBox="0 0 20 20" fill="none" aria-hidden="true" class="hidden h-5 w-5 stroke-white dark:block">
91
95
  <path d="M15.224 11.724a5.5 5.5 0 0 1-6.949-6.949 5.5 5.5 0 1 0 6.949 6.949Z"></path>
92
96
  </svg>
93
- </button>
97
+ </a>
98
+
94
99
  </div>
95
100
  <!--
96
101
  <div class="hidden min-[416px]:contents">
@@ -102,7 +107,7 @@
102
107
 
103
108
  </div>
104
109
 
105
- <nav class="hidden lg:mt-10 lg:block">
110
+ <nav id="docs-menu" class="hidden lg:mt-10 lg:block">
106
111
  <%= render partial: 'menu', locals: { nodes: @docs_structure[:children], level: 1 } %>
107
112
  </nav>
108
113
 
@@ -111,9 +116,23 @@
111
116
 
112
117
  <div class="relative px-4 pt-14 sm:px-6 lg:px-8">
113
118
  <main class="py-16">
114
- <article class="prose dark:prose-invert">
115
- <%= @content.html_safe unless @content.nil? %>
116
- </article>
119
+
120
+ <%= turbo_frame_tag "doc-frame" do %>
121
+ <article class="prose dark:prose-invert" data-controller="highlight">
122
+ <%= @content.html_safe unless @content.nil? %>
123
+ </article>
124
+ <% end %>
125
+
126
+ <% if params[:file_path].present? && Rails.env.development? %>
127
+ <div class="flex justify-start">
128
+ <%= link_to edit_doc_path(params[:file_path]), "data-turbo-frame": "doc-frame", class: "rounded-link flex space-x-2 items-center" do %>
129
+ <span>Edit</span>
130
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
131
+ <path stroke-linecap="round" stroke-linejoin="round" d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10" />
132
+ </svg>
133
+ <% end %>
134
+ </div>
135
+ <% end %>
117
136
  </main>
118
137
 
119
138
 
@@ -0,0 +1,3 @@
1
+ <%= turbo_frame_tag "doc-frame" do %>
2
+ <%= render "form", markdown_content: @markdown_content %>
3
+ <% end %>