plain-rails 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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 %>