active_canvas 0.0.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 (80) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +318 -0
  4. data/Rakefile +6 -0
  5. data/app/assets/javascripts/active_canvas/editor/ai_panel.js +1607 -0
  6. data/app/assets/javascripts/active_canvas/editor/asset_manager.js +498 -0
  7. data/app/assets/javascripts/active_canvas/editor/blocks.js +1083 -0
  8. data/app/assets/javascripts/active_canvas/editor/code_panel.js +572 -0
  9. data/app/assets/javascripts/active_canvas/editor/component_toolbar.js +394 -0
  10. data/app/assets/javascripts/active_canvas/editor/panels.js +460 -0
  11. data/app/assets/javascripts/active_canvas/editor/utils.js +56 -0
  12. data/app/assets/javascripts/active_canvas/editor.js +295 -0
  13. data/app/assets/stylesheets/active_canvas/application.css +15 -0
  14. data/app/assets/stylesheets/active_canvas/editor.css +2929 -0
  15. data/app/controllers/active_canvas/admin/ai_controller.rb +181 -0
  16. data/app/controllers/active_canvas/admin/application_controller.rb +56 -0
  17. data/app/controllers/active_canvas/admin/media_controller.rb +61 -0
  18. data/app/controllers/active_canvas/admin/page_types_controller.rb +57 -0
  19. data/app/controllers/active_canvas/admin/page_versions_controller.rb +23 -0
  20. data/app/controllers/active_canvas/admin/pages_controller.rb +133 -0
  21. data/app/controllers/active_canvas/admin/partials_controller.rb +88 -0
  22. data/app/controllers/active_canvas/admin/settings_controller.rb +256 -0
  23. data/app/controllers/active_canvas/application_controller.rb +20 -0
  24. data/app/controllers/active_canvas/pages_controller.rb +18 -0
  25. data/app/controllers/concerns/active_canvas/current_user.rb +12 -0
  26. data/app/controllers/concerns/active_canvas/rate_limitable.rb +75 -0
  27. data/app/controllers/concerns/active_canvas/tailwind_compilation.rb +39 -0
  28. data/app/helpers/active_canvas/application_helper.rb +4 -0
  29. data/app/jobs/active_canvas/application_job.rb +4 -0
  30. data/app/jobs/active_canvas/compile_tailwind_job.rb +64 -0
  31. data/app/mailers/active_canvas/application_mailer.rb +6 -0
  32. data/app/models/active_canvas/ai_model.rb +136 -0
  33. data/app/models/active_canvas/application_record.rb +5 -0
  34. data/app/models/active_canvas/media.rb +141 -0
  35. data/app/models/active_canvas/page.rb +85 -0
  36. data/app/models/active_canvas/page_type.rb +22 -0
  37. data/app/models/active_canvas/page_version.rb +80 -0
  38. data/app/models/active_canvas/partial.rb +73 -0
  39. data/app/models/active_canvas/setting.rb +292 -0
  40. data/app/services/active_canvas/ai_configuration.rb +40 -0
  41. data/app/services/active_canvas/ai_models.rb +128 -0
  42. data/app/services/active_canvas/ai_service.rb +289 -0
  43. data/app/services/active_canvas/content_sanitizer.rb +112 -0
  44. data/app/services/active_canvas/tailwind_compiler.rb +156 -0
  45. data/app/views/active_canvas/admin/media/index.html.erb +401 -0
  46. data/app/views/active_canvas/admin/media/show.html.erb +297 -0
  47. data/app/views/active_canvas/admin/page_types/_form.html.erb +25 -0
  48. data/app/views/active_canvas/admin/page_types/edit.html.erb +13 -0
  49. data/app/views/active_canvas/admin/page_types/index.html.erb +29 -0
  50. data/app/views/active_canvas/admin/page_types/new.html.erb +9 -0
  51. data/app/views/active_canvas/admin/page_types/show.html.erb +18 -0
  52. data/app/views/active_canvas/admin/page_versions/show.html.erb +469 -0
  53. data/app/views/active_canvas/admin/pages/_form.html.erb +62 -0
  54. data/app/views/active_canvas/admin/pages/content.html.erb +139 -0
  55. data/app/views/active_canvas/admin/pages/edit.html.erb +335 -0
  56. data/app/views/active_canvas/admin/pages/editor.html.erb +710 -0
  57. data/app/views/active_canvas/admin/pages/index.html.erb +149 -0
  58. data/app/views/active_canvas/admin/pages/new.html.erb +19 -0
  59. data/app/views/active_canvas/admin/pages/show.html.erb +258 -0
  60. data/app/views/active_canvas/admin/pages/versions.html.erb +333 -0
  61. data/app/views/active_canvas/admin/partials/edit.html.erb +182 -0
  62. data/app/views/active_canvas/admin/partials/editor.html.erb +703 -0
  63. data/app/views/active_canvas/admin/partials/index.html.erb +131 -0
  64. data/app/views/active_canvas/admin/settings/show.html.erb +1864 -0
  65. data/app/views/active_canvas/pages/no_homepage.html.erb +45 -0
  66. data/app/views/active_canvas/pages/show.html.erb +113 -0
  67. data/app/views/layouts/active_canvas/admin/application.html.erb +960 -0
  68. data/app/views/layouts/active_canvas/admin/editor.html.erb +826 -0
  69. data/app/views/layouts/active_canvas/application.html.erb +55 -0
  70. data/config/routes.rb +48 -0
  71. data/db/migrate/20260202000001_create_active_canvas_tables.rb +113 -0
  72. data/db/migrate/20260202000002_create_active_canvas_ai_models.rb +26 -0
  73. data/lib/active_canvas/configuration.rb +232 -0
  74. data/lib/active_canvas/engine.rb +44 -0
  75. data/lib/active_canvas/version.rb +3 -0
  76. data/lib/active_canvas.rb +26 -0
  77. data/lib/generators/active_canvas/install/install_generator.rb +263 -0
  78. data/lib/generators/active_canvas/install/templates/initializer.rb.tt +163 -0
  79. data/lib/tasks/active_canvas_tasks.rake +69 -0
  80. metadata +150 -0
@@ -0,0 +1,131 @@
1
+ <% content_for :page_title, "Header & Footer" %>
2
+
3
+ <!-- Page Header -->
4
+ <div class="page-header">
5
+ <div class="page-header-left">
6
+ <h2>Header & Footer</h2>
7
+ <p class="page-header-subtitle">Design reusable components that appear on all your pages</p>
8
+ </div>
9
+ </div>
10
+
11
+ <!-- Partials Grid -->
12
+ <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 1.5rem;">
13
+ <% @partials.each do |partial| %>
14
+ <div class="card">
15
+ <div style="padding: 1.5rem;">
16
+ <!-- Header Row -->
17
+ <div style="display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 1.25rem;">
18
+ <div style="display: flex; align-items: center; gap: 1rem;">
19
+ <!-- Icon -->
20
+ <div style="width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; background: <%= partial.header? ? '#eef2ff' : '#ecfdf5' %>;">
21
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="<%= partial.header? ? '#6366f1' : '#10b981' %>" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
22
+ <% if partial.header? %>
23
+ <rect x="3" y="3" width="18" height="6" rx="2"/>
24
+ <rect x="3" y="13" width="18" height="8" rx="2" opacity="0.3"/>
25
+ <% else %>
26
+ <rect x="3" y="3" width="18" height="8" rx="2" opacity="0.3"/>
27
+ <rect x="3" y="15" width="18" height="6" rx="2"/>
28
+ <% end %>
29
+ </svg>
30
+ </div>
31
+ <!-- Title -->
32
+ <div>
33
+ <h3 style="margin: 0 0 0.25rem 0; font-size: 1.125rem; font-weight: 600;"><%= partial.name %></h3>
34
+ <span style="font-size: 0.8125rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.025em;"><%= partial.partial_type %></span>
35
+ </div>
36
+ </div>
37
+ <!-- Status Badge -->
38
+ <% if partial.active? %>
39
+ <span class="badge badge-success">
40
+ <span class="badge-dot"></span>
41
+ Active
42
+ </span>
43
+ <% else %>
44
+ <span class="badge badge-gray">
45
+ <span class="badge-dot"></span>
46
+ Inactive
47
+ </span>
48
+ <% end %>
49
+ </div>
50
+
51
+ <!-- Status Info -->
52
+ <div style="background: var(--bg-main); border-radius: 8px; padding: 1rem; margin-bottom: 1.25rem;">
53
+ <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 1rem;">
54
+ <div>
55
+ <div style="font-size: 0.6875rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); margin-bottom: 0.25rem;">Content</div>
56
+ <div style="font-size: 0.875rem; font-weight: 500;">
57
+ <% if partial.content.present? %>
58
+ <span style="color: var(--success);">Configured</span>
59
+ <% else %>
60
+ <span style="color: var(--text-muted);">Empty</span>
61
+ <% end %>
62
+ </div>
63
+ </div>
64
+ <div>
65
+ <div style="font-size: 0.6875rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); margin-bottom: 0.25rem;">Tailwind CSS</div>
66
+ <div style="font-size: 0.875rem; font-weight: 500;">
67
+ <% if partial.compiled_css.present? %>
68
+ <span style="color: var(--success);"><%= number_to_human_size(partial.compiled_css.bytesize) %></span>
69
+ <% else %>
70
+ <span style="color: var(--text-muted);">Not compiled</span>
71
+ <% end %>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+
77
+ <!-- Actions -->
78
+ <div style="display: flex; gap: 0.75rem;">
79
+ <%= link_to editor_admin_partial_path(partial), class: "btn btn-primary", style: "flex: 1; justify-content: center;" do %>
80
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
81
+ <polygon points="12 2 2 7 12 12 22 7 12 2"/>
82
+ <polyline points="2 17 12 22 22 17"/>
83
+ <polyline points="2 12 12 17 22 12"/>
84
+ </svg>
85
+ Open Designer
86
+ <% end %>
87
+ <%= link_to edit_admin_partial_path(partial), class: "btn btn-secondary", title: "Settings" do %>
88
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
89
+ <circle cx="12" cy="12" r="3"/>
90
+ <path d="M12 1v6m0 6v10"/>
91
+ <path d="M21 12h-6m-6 0H3"/>
92
+ </svg>
93
+ <% end %>
94
+ </div>
95
+ </div>
96
+ </div>
97
+ <% end %>
98
+ </div>
99
+
100
+ <!-- How It Works -->
101
+ <div class="card" style="margin-top: 2rem;">
102
+ <div class="card-header">
103
+ <span class="card-title">
104
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align: -2px; margin-right: 0.5rem;">
105
+ <circle cx="12" cy="12" r="10"/>
106
+ <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"/>
107
+ <line x1="12" y1="17" x2="12.01" y2="17"/>
108
+ </svg>
109
+ How it works
110
+ </span>
111
+ </div>
112
+ <div class="card-body">
113
+ <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.5rem;">
114
+ <div style="text-align: center;">
115
+ <div style="width: 40px; height: 40px; border-radius: 50%; background: var(--primary-light); color: var(--primary); display: flex; align-items: center; justify-content: center; margin: 0 auto 0.75rem; font-weight: 600;">1</div>
116
+ <h4 style="font-size: 0.875rem; font-weight: 600; margin-bottom: 0.375rem;">Design your partials</h4>
117
+ <p style="font-size: 0.8125rem; color: var(--text-muted); margin: 0;">Use the visual designer to create your header and footer</p>
118
+ </div>
119
+ <div style="text-align: center;">
120
+ <div style="width: 40px; height: 40px; border-radius: 50%; background: var(--primary-light); color: var(--primary); display: flex; align-items: center; justify-content: center; margin: 0 auto 0.75rem; font-weight: 600;">2</div>
121
+ <h4 style="font-size: 0.875rem; font-weight: 600; margin-bottom: 0.375rem;">Enable per page</h4>
122
+ <p style="font-size: 0.8125rem; color: var(--text-muted); margin: 0;">Toggle header/footer visibility in each page's settings</p>
123
+ </div>
124
+ <div style="text-align: center;">
125
+ <div style="width: 40px; height: 40px; border-radius: 50%; background: var(--primary-light); color: var(--primary); display: flex; align-items: center; justify-content: center; margin: 0 auto 0.75rem; font-weight: 600;">3</div>
126
+ <h4 style="font-size: 0.875rem; font-weight: 600; margin-bottom: 0.375rem;">Auto-compiled CSS</h4>
127
+ <p style="font-size: 0.8125rem; color: var(--text-muted); margin: 0;">Tailwind CSS is compiled automatically when you save</p>
128
+ </div>
129
+ </div>
130
+ </div>
131
+ </div>