leva 0.1.9.1 → 0.1.11

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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +21 -5
  3. data/app/assets/stylesheets/leva/application.css +3083 -15
  4. data/app/controllers/leva/application_controller.rb +1 -1
  5. data/app/controllers/leva/dataset_records_controller.rb +1 -1
  6. data/app/controllers/leva/datasets_controller.rb +6 -6
  7. data/app/controllers/leva/design_system_controller.rb +9 -0
  8. data/app/controllers/leva/experiments_controller.rb +8 -8
  9. data/app/controllers/leva/runner_results_controller.rb +1 -1
  10. data/app/controllers/leva/workbench_controller.rb +26 -15
  11. data/app/helpers/leva/application_helper.rb +7 -7
  12. data/app/jobs/leva/experiment_job.rb +1 -1
  13. data/app/jobs/leva/run_eval_job.rb +1 -1
  14. data/app/models/concerns/leva/recordable.rb +5 -5
  15. data/app/models/leva/dataset.rb +1 -1
  16. data/app/models/leva/evaluation_result.rb +1 -1
  17. data/app/models/leva/experiment.rb +1 -1
  18. data/app/models/leva/prompt.rb +1 -1
  19. data/app/views/layouts/leva/application.html.erb +23 -24
  20. data/app/views/leva/dataset_records/index.html.erb +70 -43
  21. data/app/views/leva/dataset_records/show.html.erb +115 -25
  22. data/app/views/leva/datasets/_dataset.html.erb +11 -18
  23. data/app/views/leva/datasets/_form.html.erb +18 -14
  24. data/app/views/leva/datasets/edit.html.erb +16 -4
  25. data/app/views/leva/datasets/index.html.erb +33 -41
  26. data/app/views/leva/datasets/new.html.erb +15 -4
  27. data/app/views/leva/datasets/show.html.erb +120 -139
  28. data/app/views/leva/design_system/index.html.erb +1731 -0
  29. data/app/views/leva/experiments/_experiment.html.erb +46 -31
  30. data/app/views/leva/experiments/_form.html.erb +62 -35
  31. data/app/views/leva/experiments/edit.html.erb +17 -3
  32. data/app/views/leva/experiments/index.html.erb +41 -36
  33. data/app/views/leva/experiments/new.html.erb +52 -4
  34. data/app/views/leva/experiments/show.html.erb +155 -98
  35. data/app/views/leva/runner_results/show.html.erb +271 -54
  36. data/app/views/leva/workbench/_evaluation_area.html.erb +18 -4
  37. data/app/views/leva/workbench/_prompt_content.html.erb +124 -73
  38. data/app/views/leva/workbench/_prompt_form.html.erb +24 -23
  39. data/app/views/leva/workbench/_prompt_sidebar.html.erb +57 -12
  40. data/app/views/leva/workbench/_results_section.html.erb +274 -112
  41. data/app/views/leva/workbench/_top_bar.html.erb +16 -6
  42. data/app/views/leva/workbench/edit.html.erb +46 -15
  43. data/app/views/leva/workbench/index.html.erb +5 -8
  44. data/app/views/leva/workbench/new.html.erb +74 -42
  45. data/config/routes.rb +11 -9
  46. data/db/migrate/20240813173033_create_leva_dataset_records.rb +1 -0
  47. data/db/migrate/20240813173035_create_leva_experiments.rb +2 -0
  48. data/db/migrate/{20240816201419_create_leva_runner_results.rb → 20240813173040_create_leva_runner_results.rb} +4 -1
  49. data/db/migrate/20240813173050_create_leva_evaluation_results.rb +3 -3
  50. data/lib/generators/leva/eval_generator.rb +4 -4
  51. data/lib/generators/leva/runner_generator.rb +4 -4
  52. data/lib/generators/leva/templates/runner.rb.erb +20 -0
  53. data/lib/leva/version.rb +1 -1
  54. data/lib/leva.rb +24 -2
  55. metadata +5 -11
  56. data/db/migrate/20240816201433_update_leva_evaluation_results.rb +0 -8
  57. data/db/migrate/20240821163608_make_experiment_optional_for_runner_results.rb +0 -6
  58. data/db/migrate/20240821181934_add_prompt_to_leva_runner_results.rb +0 -5
  59. data/db/migrate/20240821183153_add_runner_and_evaluator_to_leva_experiments.rb +0 -6
  60. data/db/migrate/20240821191713_add_actual_result_to_leva_dataset_records.rb +0 -5
  61. data/db/migrate/20240822143201_remove_actual_result_from_leva_runner_results.rb +0 -5
  62. data/db/migrate/20240912183556_add_runner_class_to_leva_runner_results.rb +0 -5
  63. data/lib/tasks/auto_annotate_models.rake +0 -59
@@ -1,30 +1,120 @@
1
1
  <% content_for :title, "#{@dataset.name} - Record Details" %>
2
- <div class="container mx-auto px-4 py-8 bg-gray-950 text-white">
3
- <div class="mb-8">
4
- <div class="flex justify-between items-center">
5
- <h1 class="text-3xl font-bold text-indigo-400 mb-2"><%= @dataset.name %> - Record Details</h1>
6
- <div class="flex space-x-4">
7
- <%= link_to dataset_dataset_records_path(@dataset), class: 'btn btn-secondary flex items-center' do %>
8
- <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-2" viewBox="0 0 20 20" fill="currentColor">
9
- <path fill-rule="evenodd" d="M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z" clip-rule="evenodd" />
10
- </svg>
11
- Back to Records
12
- <% end %>
13
- <%= link_to workbench_index_path(dataset_record_id: @record.id), class: 'btn btn-primary flex items-center' do %>
14
- <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-2" viewBox="0 0 20 20" fill="currentColor">
15
- <path fill-rule="evenodd" d="M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z" clip-rule="evenodd" />
16
- </svg>
17
- Use in Workbench
18
- <% end %>
19
- </div>
2
+ <div class="container page">
3
+ <%# Breadcrumb Navigation %>
4
+ <nav class="breadcrumb mb-4">
5
+ <%= link_to datasets_path, class: 'breadcrumb-link' do %>Datasets<% end %>
6
+ <span class="breadcrumb-sep">/</span>
7
+ <%= link_to @dataset.name, dataset_path(@dataset), class: 'breadcrumb-link' %>
8
+ <span class="breadcrumb-sep">/</span>
9
+ <%= link_to 'Records', dataset_dataset_records_path(@dataset), class: 'breadcrumb-link' %>
10
+ <span class="breadcrumb-sep">/</span>
11
+ <span class="breadcrumb-current"><%= @record.display_name.truncate(30) %></span>
12
+ </nav>
13
+
14
+ <div class="page-header">
15
+ <div>
16
+ <h1 class="page-title"><%= @record.display_name %></h1>
17
+ <p class="text-muted mt-2">Record from <strong><%= @dataset.name %></strong></p>
18
+ </div>
19
+ <div class="btn-group">
20
+ <%= link_to workbench_index_path(dataset_record_id: @record.id), class: 'btn btn-primary' do %>
21
+ <svg class="icon-sm" viewBox="0 0 20 20" fill="currentColor">
22
+ <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM9.555 7.168A1 1 0 008 8v4a1 1 0 001.555.832l3-2a1 1 0 000-1.664l-3-2z" clip-rule="evenodd" />
23
+ </svg>
24
+ Open in Workbench
25
+ <% end %>
20
26
  </div>
21
27
  </div>
22
- <div class="bg-gray-800 rounded-lg shadow-lg p-6">
23
- <% @record.show_attributes.each do |key, value| %>
24
- <div class="mb-4">
25
- <h3 class="text-lg font-semibold text-indigo-300 mb-2"><%= key.to_s.humanize %></h3>
26
- <p class="text-gray-300"><%= value %></p>
28
+
29
+ <%# Record Metadata %>
30
+ <section class="mb-6">
31
+ <div class="exp-meta">
32
+ <div class="exp-meta-item">
33
+ <span class="exp-meta-label">Record ID</span>
34
+ <span class="exp-meta-value font-mono"><%= @record.id %></span>
35
+ </div>
36
+ <div class="exp-meta-item">
37
+ <span class="exp-meta-label">Recordable Type</span>
38
+ <span class="exp-meta-value"><%= @record.recordable_type %></span>
39
+ </div>
40
+ <div class="exp-meta-item">
41
+ <span class="exp-meta-label">Recordable ID</span>
42
+ <span class="exp-meta-value font-mono"><%= @record.recordable_id %></span>
43
+ </div>
44
+ <div class="exp-meta-item">
45
+ <span class="exp-meta-label">Created</span>
46
+ <span class="exp-meta-value"><%= time_ago_in_words(@record.created_at) %> ago</span>
47
+ </div>
48
+ </div>
49
+ </section>
50
+
51
+ <%# Record Attributes %>
52
+ <section class="mb-8">
53
+ <div class="section-header">
54
+ <h3 class="section-title">Record Data</h3>
55
+ <span class="section-count"><%= @record.show_attributes.count %> fields</span>
56
+ </div>
57
+
58
+ <% if @record.show_attributes.any? %>
59
+ <div class="grid gap-4" style="grid-template-columns: 1fr;">
60
+ <% @record.show_attributes.each do |key, value| %>
61
+ <div class="result-panel">
62
+ <div class="result-panel-header">
63
+ <span class="result-panel-label"><%= key.to_s.humanize %></span>
64
+ </div>
65
+ <div class="result-panel-content">
66
+ <% if value.to_s.length > 200 || value.to_s.include?("\n") %>
67
+ <pre class="result-code"><code><%= value %></code></pre>
68
+ <% else %>
69
+ <p style="color: var(--gray-200); margin: 0; font-size: var(--text-sm);"><%= value.presence || '—' %></p>
70
+ <% end %>
71
+ </div>
72
+ </div>
73
+ <% end %>
74
+ </div>
75
+ <% else %>
76
+ <div class="empty-state-inline">
77
+ <p class="text-muted">No display attributes defined for this record type.</p>
27
78
  </div>
28
79
  <% end %>
29
- </div>
30
- </div>
80
+ </section>
81
+
82
+ <%# Record Navigation %>
83
+ <%
84
+ all_records = @dataset.dataset_records.order(:id).pluck(:id)
85
+ current_index = all_records.index(@record.id)
86
+ prev_record_id = current_index && current_index > 0 ? all_records[current_index - 1] : nil
87
+ next_record_id = current_index && current_index < all_records.length - 1 ? all_records[current_index + 1] : nil
88
+ %>
89
+ <% if prev_record_id || next_record_id %>
90
+ <section>
91
+ <div class="flex justify-between items-center" style="padding: var(--space-4) 0; border-top: 1px solid var(--gray-800);">
92
+ <% if prev_record_id %>
93
+ <%= link_to dataset_dataset_record_path(@dataset, prev_record_id), class: 'btn btn-ghost' do %>
94
+ <svg class="icon-sm" viewBox="0 0 20 20" fill="currentColor">
95
+ <path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd" />
96
+ </svg>
97
+ Previous Record
98
+ <% end %>
99
+ <% else %>
100
+ <span></span>
101
+ <% end %>
102
+
103
+ <span class="text-sm text-muted">
104
+ Record <%= (current_index || 0) + 1 %> of <%= all_records.length %>
105
+ </span>
106
+
107
+ <% if next_record_id %>
108
+ <%= link_to dataset_dataset_record_path(@dataset, next_record_id), class: 'btn btn-ghost' do %>
109
+ Next Record
110
+ <svg class="icon-sm" viewBox="0 0 20 20" fill="currentColor">
111
+ <path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd" />
112
+ </svg>
113
+ <% end %>
114
+ <% else %>
115
+ <span></span>
116
+ <% end %>
117
+ </div>
118
+ </section>
119
+ <% end %>
120
+ </div>
@@ -1,18 +1,11 @@
1
- <tr class="hover:bg-gray-700 transition-colors duration-200">
2
- <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-300">
3
- <%= dataset.name %>
4
- </td>
5
- <td class="px-6 py-4 text-sm text-gray-300">
6
- <%= truncate(dataset.description, length: 100) %>
7
- </td>
8
- <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-300">
9
- <%= dataset.dataset_records.count %>
10
- </td>
11
- <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-300">
12
- <%= dataset.experiments.count %>
13
- </td>
14
- <td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
15
- <%= link_to 'View', dataset_path(dataset), class: 'text-indigo-400 hover:text-indigo-300 transition-colors duration-200 mr-3' %>
16
- <%= link_to 'Edit', edit_dataset_path(dataset), class: 'text-indigo-400 hover:text-indigo-300 transition-colors duration-200' %>
17
- </td>
18
- </tr>
1
+ <tr class="clickable-row" onclick="window.location='<%= dataset_path(dataset) %>'">
2
+ <td>
3
+ <span class="row-title"><%= dataset.name %></span>
4
+ <% if dataset.description.present? %>
5
+ <p class="text-xs text-muted truncate mt-1" style="max-width: 300px;"><%= dataset.description %></p>
6
+ <% end %>
7
+ </td>
8
+ <td class="text-right text-muted text-sm text-nowrap"><%= time_ago_in_words(dataset.created_at) %></td>
9
+ <td class="text-right cell-numeric font-mono"><%= dataset.dataset_records.count %></td>
10
+ <td class="text-right cell-numeric font-mono"><%= dataset.experiments.count %></td>
11
+ </tr>
@@ -1,24 +1,28 @@
1
- <%= form_with(model: dataset, local: true, class: "bg-gray-800 rounded-lg shadow-lg p-6") do |form| %>
1
+ <%= form_with(model: dataset, local: true, class: "card p-5") do |form| %>
2
2
  <% if dataset.errors.any? %>
3
- <div class="bg-red-900 border border-red-700 text-red-100 px-4 py-3 rounded-lg mb-4" role="alert">
4
- <strong class="font-bold">Error:</strong>
5
- <ul class="list-disc list-inside">
3
+ <div class="form-errors">
4
+ <p class="form-errors-title">Please fix the following errors:</p>
5
+ <ul>
6
6
  <% dataset.errors.full_messages.each do |message| %>
7
7
  <li><%= message %></li>
8
8
  <% end %>
9
9
  </ul>
10
10
  </div>
11
11
  <% end %>
12
- <div class="mb-4">
13
- <%= form.label :name, class: "block text-sm font-semibold mb-2 text-indigo-300" %>
14
- <%= form.text_field :name, autofocus: true, class: "w-full bg-gray-700 text-white p-3 rounded-lg focus:ring-2 focus:ring-indigo-500 focus:outline-none" %>
12
+
13
+ <div class="form-group">
14
+ <%= form.label :name, class: "form-label" %>
15
+ <%= form.text_field :name, autofocus: true, class: "form-input", placeholder: "e.g., Customer Support Q&A" %>
15
16
  </div>
16
- <div class="mb-6">
17
- <%= form.label :description, class: "block text-sm font-semibold mb-2 text-indigo-300" %>
18
- <%= form.text_area :description, rows: 4, class: "w-full bg-gray-700 text-white p-3 rounded-lg focus:ring-2 focus:ring-indigo-500 focus:outline-none" %>
17
+
18
+ <div class="form-group">
19
+ <%= form.label :description, class: "form-label" %>
20
+ <%= form.text_area :description, rows: 3, class: "form-textarea", placeholder: "Brief description of what this dataset contains..." %>
21
+ <p class="form-hint">Optional. Helps you and your team understand the dataset's purpose.</p>
19
22
  </div>
20
- <div class="flex items-center justify-end space-x-4">
21
- <%= link_to "Cancel", dataset.persisted? ? dataset_path(dataset) : datasets_path, class: "px-3 py-2 rounded-md text-sm font-medium text-gray-300 hover:bg-gray-800 hover:text-white transition-colors duration-150 ease-in-out" %>
22
- <%= form.submit dataset.persisted? ? "Update Dataset" : "Create Dataset", class: "px-3 py-2 rounded-md text-sm font-medium bg-indigo-600 text-white shadow-lg hover:bg-indigo-700 transition-colors duration-150 ease-in-out" %>
23
+
24
+ <div class="form-actions justify-end">
25
+ <%= link_to "Cancel", dataset.persisted? ? dataset_path(dataset) : datasets_path, class: "btn btn-ghost" %>
26
+ <%= form.submit dataset.persisted? ? "Save Changes" : "Create Dataset", class: "btn btn-primary" %>
23
27
  </div>
24
- <% end %>
28
+ <% end %>
@@ -1,5 +1,17 @@
1
1
  <% content_for :title, "Edit #{@dataset.name}" %>
2
- <div class="container mx-auto px-4 py-8 bg-gray-950 text-white">
3
- <h1 class="text-3xl font-bold text-indigo-400 mb-6">Edit Dataset</h1>
4
- <%= render 'form', dataset: @dataset %>
5
- </div>
2
+ <div class="container page">
3
+ <div class="mb-6">
4
+ <div class="breadcrumb mb-2">
5
+ <%= link_to "Datasets", datasets_path, class: "breadcrumb-link" %>
6
+ <span class="breadcrumb-sep">/</span>
7
+ <%= link_to @dataset.name, dataset_path(@dataset), class: "breadcrumb-link" %>
8
+ <span class="breadcrumb-sep">/</span>
9
+ <span class="breadcrumb-current">Edit</span>
10
+ </div>
11
+ <h1 class="page-title">Edit Dataset</h1>
12
+ </div>
13
+
14
+ <div style="max-width: 560px;">
15
+ <%= render 'form', dataset: @dataset %>
16
+ </div>
17
+ </div>
@@ -1,51 +1,43 @@
1
1
  <% content_for :title, 'Datasets' %>
2
- <div class="container mx-auto px-4 py-8 bg-gray-950 text-white">
3
- <div class="flex justify-between items-center mb-6">
4
- <h1 class="text-3xl font-bold text-indigo-400">Datasets</h1>
5
- <%= link_to new_dataset_path, class: "btn btn-primary flex items-center" do %>
6
- <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-2" viewBox="0 0 20 20" fill="currentColor">
2
+ <div class="container page">
3
+ <div class="page-header">
4
+ <h1>Datasets</h1>
5
+ <%= link_to new_dataset_path, class: "btn btn-primary" do %>
6
+ <svg class="icon-sm" viewBox="0 0 20 20" fill="currentColor">
7
7
  <path fill-rule="evenodd" d="M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z" clip-rule="evenodd" />
8
8
  </svg>
9
- Create New Dataset
9
+ New Dataset
10
10
  <% end %>
11
11
  </div>
12
+
12
13
  <% if @datasets.any? %>
13
- <div class="bg-gray-800 rounded-lg shadow-lg overflow-hidden">
14
- <table class="min-w-full divide-y divide-gray-700">
15
- <thead class="bg-gray-700">
16
- <tr>
17
- <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider">
18
- Name
19
- </th>
20
- <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider">
21
- Description
22
- </th>
23
- <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider">
24
- Records
25
- </th>
26
- <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider">
27
- Experiments
28
- </th>
29
- <th scope="col" class="relative px-6 py-3">
30
- <span class="sr-only">Actions</span>
31
- </th>
32
- </tr>
33
- </thead>
34
- <tbody class="bg-gray-800 divide-y divide-gray-700">
35
- <%= render @datasets %>
36
- </tbody>
37
- </table>
14
+ <div class="table-wrapper">
15
+ <div class="table-scroll">
16
+ <table class="table table-clickable">
17
+ <thead>
18
+ <tr>
19
+ <th>Name</th>
20
+ <th class="text-right" style="width: 90px;">Created</th>
21
+ <th class="text-right" style="width: 70px;">Records</th>
22
+ <th class="text-right" style="width: 70px;">Exps</th>
23
+ </tr>
24
+ </thead>
25
+ <tbody>
26
+ <%= render @datasets %>
27
+ </tbody>
28
+ </table>
29
+ </div>
38
30
  </div>
39
31
  <% else %>
40
- <div class="bg-gray-800 rounded-lg shadow-lg p-12 text-center">
41
- <svg class="mx-auto h-12 w-12 text-indigo-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
42
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" />
43
- </svg>
44
- <h3 class="mt-2 text-xl font-medium text-indigo-300">No datasets yet</h3>
45
- <p class="mt-1 text-gray-400">Get started by creating a new dataset.</p>
46
- <div class="mt-6">
47
- <%= link_to new_dataset_path, class: "btn btn-primary inline-flex items-center" do %>
48
- <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-2" viewBox="0 0 20 20" fill="currentColor">
32
+ <div class="card">
33
+ <div class="empty-state">
34
+ <svg class="empty-state-icon" fill="none" viewBox="0 0 24 24" stroke="currentColor">
35
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" />
36
+ </svg>
37
+ <h3 class="empty-state-title">No datasets yet</h3>
38
+ <p class="empty-state-description">Get started by creating a new dataset.</p>
39
+ <%= link_to new_dataset_path, class: "btn btn-primary" do %>
40
+ <svg class="icon-sm" viewBox="0 0 20 20" fill="currentColor">
49
41
  <path fill-rule="evenodd" d="M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z" clip-rule="evenodd" />
50
42
  </svg>
51
43
  Create your first dataset
@@ -53,4 +45,4 @@
53
45
  </div>
54
46
  </div>
55
47
  <% end %>
56
- </div>
48
+ </div>
@@ -1,5 +1,16 @@
1
1
  <% content_for :title, 'New Dataset' %>
2
- <div class="container mx-auto px-4 py-8 bg-gray-950 text-white">
3
- <h1 class="text-3xl font-bold text-indigo-400 mb-6">New Dataset</h1>
4
- <%= render 'form', dataset: @dataset %>
5
- </div>
2
+ <div class="container page">
3
+ <div class="mb-6">
4
+ <div class="breadcrumb mb-2">
5
+ <%= link_to "Datasets", datasets_path, class: "breadcrumb-link" %>
6
+ <span class="breadcrumb-sep">/</span>
7
+ <span class="breadcrumb-current">New</span>
8
+ </div>
9
+ <h1 class="page-title">New Dataset</h1>
10
+ <p class="text-muted text-sm mt-2">Create a dataset to organize your evaluation records.</p>
11
+ </div>
12
+
13
+ <div style="max-width: 560px;">
14
+ <%= render 'form', dataset: @dataset %>
15
+ </div>
16
+ </div>