miguelgargallo commited on
Commit
8ebffea
·
1 Parent(s): 65aa41e

Design Update

Browse files
Files changed (6) hide show
  1. README.md +1 -1
  2. assets/avoid.svg +7 -0
  3. assets/correct.svg +4 -0
  4. content.json +36 -7
  5. main.js +37 -10
  6. styles.css +36 -41
README.md CHANGED
@@ -1,6 +1,6 @@
1
  ---
2
  title: PylarAI 3rd Party License
3
- emoji: 🌍
4
  colorFrom: indigo
5
  colorTo: indigo
6
  sdk: static
 
1
  ---
2
  title: PylarAI 3rd Party License
3
+ emoji: 🏛️
4
  colorFrom: indigo
5
  colorTo: indigo
6
  sdk: static
assets/avoid.svg ADDED
assets/correct.svg ADDED
content.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "title": "PylarAI 3rd Party License",
3
- "version": "Version 1.0 December 2025",
4
  "subtitle": "Software License Agreement focused on strict third-party compliance, transparent attribution, and responsible integration of external components in any derived project or deliverable.",
5
  "meta": "SOFTWARE LICENSE AGREEMENT / THIRD-PARTY COMPLIANCE",
6
  "badge": "PYLARAI 3RD PARTY LICENSE",
@@ -13,7 +13,7 @@
13
  "content": [
14
  "<strong>Software</strong>: Refers to the program, application, component, script, or any digital material licensed under this agreement.",
15
  "<strong>Third-Party Components</strong>: Includes any code, library, plugin, module, content, or technology developed by an entity other than the Licensor.",
16
- "<strong>Project Deliverables</strong>: Any derivative content, result, modification, or integration involving the use of the Software or any third-party component.",
17
  "<strong>End User</strong>: Any individual or legal entity that uses, distributes, or adapts the Software within the boundaries defined by this license."
18
  ]
19
  },
@@ -53,10 +53,39 @@
53
  }
54
  ],
55
  "sidePanel": {
56
- "pill": "Third-Party First",
57
  "principles": {
58
- "title": "Design Principles",
59
- "text": "Minimal surface, maximum clarity: the focus stays on the legal text, with a layout optimized for reading and section scanning across devices."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  },
61
  "snapshot": {
62
  "title": "License Snapshot",
@@ -80,8 +109,8 @@
80
  ]
81
  },
82
  "hint": {
83
- "title": "Implementation Hint",
84
- "text": "Include this license alongside your model or application documentation and reference it explicitly in your project's README or Terms section for transparency."
85
  }
86
  }
87
  }
 
1
  {
2
  "title": "PylarAI 3rd Party License",
3
+ "version": "Version 1.0 - December 2025",
4
  "subtitle": "Software License Agreement focused on strict third-party compliance, transparent attribution, and responsible integration of external components in any derived project or deliverable.",
5
  "meta": "SOFTWARE LICENSE AGREEMENT / THIRD-PARTY COMPLIANCE",
6
  "badge": "PYLARAI 3RD PARTY LICENSE",
 
13
  "content": [
14
  "<strong>Software</strong>: Refers to the program, application, component, script, or any digital material licensed under this agreement.",
15
  "<strong>Third-Party Components</strong>: Includes any code, library, plugin, module, content, or technology developed by an entity other than the Licensor.",
16
+ "<strong>Project Deliverable</strong>: Any derivative content, result, modification, or integration involving the use of the Software or any third-party component.",
17
  "<strong>End User</strong>: Any individual or legal entity that uses, distributes, or adapts the Software within the boundaries defined by this license."
18
  ]
19
  },
 
53
  }
54
  ],
55
  "sidePanel": {
56
+ "pill": " Compliance | ❌ No Bypass",
57
  "principles": {
58
+ "title": "Third-Party Rules",
59
+ "items": [
60
+ {
61
+ "type": "allow",
62
+ "text": "Development & testing use"
63
+ },
64
+ {
65
+ "type": "allow",
66
+ "text": "Retain original licenses"
67
+ },
68
+ {
69
+ "type": "allow",
70
+ "text": "Document all components"
71
+ },
72
+ {
73
+ "type": "avoid",
74
+ "text": "No license bypassing"
75
+ },
76
+ {
77
+ "type": "avoid",
78
+ "text": "No credit reassignment"
79
+ },
80
+ {
81
+ "type": "avoid",
82
+ "text": "No trademark removal"
83
+ },
84
+ {
85
+ "type": "avoid",
86
+ "text": "No commercial distribution"
87
+ }
88
+ ]
89
  },
90
  "snapshot": {
91
  "title": "License Snapshot",
 
109
  ]
110
  },
111
  "hint": {
112
+ "title": "License Validity",
113
+ "text": "To use and have validity, always link the source URL on your License or just copy paste the License.md"
114
  }
115
  }
116
  }
main.js CHANGED
@@ -12,21 +12,21 @@ async function loadContent() {
12
  document.title = content.title;
13
 
14
  // Source
15
- document.querySelector("[data-source-url]").href = content.sourceUrl;
16
- document.querySelector("[data-source-url]").textContent = content.sourceUrl;
 
17
  document.querySelector("[data-source-text]").textContent = content.sourceText;
18
 
19
  // Sections
20
  const sectionsContainer = document.querySelector("[data-sections]");
21
  content.sections.forEach((section) => {
22
  const sectionEl = document.createElement("div");
 
23
  sectionEl.innerHTML = `
24
  <div class="section-label">${content.sectionLabel}</div>
25
  <h2>${section.title}</h2>
26
  ${Array.isArray(section.content)
27
- ? `<ul>${section.content
28
- .map((item) => `<li>${item}</li>`)
29
- .join("")}</ul>`
30
  : `<p>${section.content}</p>`
31
  }
32
  `;
@@ -42,20 +42,18 @@ async function loadContent() {
42
  ${content.sidePanel.pill}
43
  </div>
44
  <h3 class="side-title">${content.sidePanel.principles.title}</h3>
45
- <p class="side-text">${content.sidePanel.principles.text}</p>
46
  </div>
47
  <div class="side-card">
48
  <h3 class="side-title">${content.sidePanel.snapshot.title}</h3>
49
  <div class="meta-grid">
50
  ${content.sidePanel.snapshot.items
51
- .map(
52
- ([key, value]) => `
53
  <div class="meta-item">
54
  <span>${key}</span>
55
  <span>${value}</span>
56
  </div>
57
- `
58
- )
59
  .join("")}
60
  </div>
61
  </div>
@@ -64,8 +62,37 @@ async function loadContent() {
64
  <p class="side-text">${content.sidePanel.hint.text}</p>
65
  </div>
66
  `;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  } catch (error) {
68
  console.error("Error loading content:", error);
 
69
  }
70
  }
71
 
 
12
  document.title = content.title;
13
 
14
  // Source
15
+ const sourceUrlEl = document.querySelector("[data-source-url]");
16
+ sourceUrlEl.href = content.sourceUrl;
17
+ sourceUrlEl.textContent = content.sourceUrl || "No source available";
18
  document.querySelector("[data-source-text]").textContent = content.sourceText;
19
 
20
  // Sections
21
  const sectionsContainer = document.querySelector("[data-sections]");
22
  content.sections.forEach((section) => {
23
  const sectionEl = document.createElement("div");
24
+ sectionEl.className = "section";
25
  sectionEl.innerHTML = `
26
  <div class="section-label">${content.sectionLabel}</div>
27
  <h2>${section.title}</h2>
28
  ${Array.isArray(section.content)
29
+ ? `<ul>${section.content.map((item) => `<li>${item}</li>`).join("")}</ul>`
 
 
30
  : `<p>${section.content}</p>`
31
  }
32
  `;
 
42
  ${content.sidePanel.pill}
43
  </div>
44
  <h3 class="side-title">${content.sidePanel.principles.title}</h3>
45
+ <div class="principles-list" data-principles></div>
46
  </div>
47
  <div class="side-card">
48
  <h3 class="side-title">${content.sidePanel.snapshot.title}</h3>
49
  <div class="meta-grid">
50
  ${content.sidePanel.snapshot.items
51
+ .map(([key, value]) => `
 
52
  <div class="meta-item">
53
  <span>${key}</span>
54
  <span>${value}</span>
55
  </div>
56
+ `)
 
57
  .join("")}
58
  </div>
59
  </div>
 
62
  <p class="side-text">${content.sidePanel.hint.text}</p>
63
  </div>
64
  `;
65
+
66
+ // Render principles with SVG icons
67
+ const principlesList = document.querySelector("[data-principles]");
68
+ if (content.sidePanel.principles.items) {
69
+ const items = content.sidePanel.principles.items;
70
+ const allowedItems = items.filter(item => item.type === 'allow');
71
+ const avoidItems = items.filter(item => item.type === 'avoid');
72
+
73
+ principlesList.innerHTML = `
74
+ <div class="permissions-group">
75
+ ${allowedItems.map(item => `
76
+ <div class="permission-item">
77
+ <img src="assets/correct.svg" width="16" height="16" alt="Allowed" />
78
+ <span>${item.text}</span>
79
+ </div>
80
+ `).join('')}
81
+ </div>
82
+ <div class="permissions-group avoid">
83
+ ${avoidItems.map(item => `
84
+ <div class="permission-item">
85
+ <img src="assets/avoid.svg" width="16" height="16" alt="Prohibited" />
86
+ <span>${item.text}</span>
87
+ </div>
88
+ `).join('')}
89
+ </div>
90
+ `;
91
+ }
92
+
93
  } catch (error) {
94
  console.error("Error loading content:", error);
95
+ document.body.innerHTML = "<h1>Error loading license content</h1>";
96
  }
97
  }
98
 
styles.css CHANGED
@@ -56,6 +56,7 @@ body {
56
  backdrop-filter: blur(16px);
57
  }
58
 
 
59
  header {
60
  display: flex;
61
  flex-direction: column;
@@ -65,35 +66,6 @@ header {
65
  padding-bottom: 16px;
66
  }
67
 
68
- .badge {
69
- display: inline-flex;
70
- align-items: center;
71
- gap: 8px;
72
- font-size: 11px;
73
- letter-spacing: 0.14em;
74
- text-transform: uppercase;
75
- color: var(--text-muted);
76
- }
77
-
78
- .badge-dot {
79
- width: 8px;
80
- height: 8px;
81
- border-radius: 999px;
82
- background: var(--accent);
83
- box-shadow: 0 0 12px var(--accent);
84
- }
85
-
86
- .h1 {
87
- /* font-size: 26px;
88
- font-weight: 650;
89
- letter-spacing: 0.04em;
90
- text-transform: uppercase;
91
- display: flex;
92
- flex-wrap: wrap;
93
- align-items: center;
94
- gap: 8px; */
95
- }
96
-
97
  .htitle {
98
  font-size: 22px;
99
  font-weight: 650;
@@ -126,16 +98,6 @@ hpill {
126
  border: 1px solid rgba(230, 57, 70, 0.45);
127
  }
128
 
129
- h1 span {
130
- font-size: 12px;
131
- font-weight: 400;
132
- color: var(--accent);
133
- padding: 3px 9px;
134
- border-radius: 999px;
135
- background: var(--accent-soft);
136
- border: 1px solid rgba(230, 57, 70, 0.45);
137
- }
138
-
139
  .subtitle {
140
  font-size: 13px;
141
  color: var(--text-muted);
@@ -151,6 +113,7 @@ h1 span {
151
  margin-top: 2px;
152
  }
153
 
 
154
  main {
155
  display: grid;
156
  grid-template-columns: minmax(0, 1.3fr) minmax(0, 0.9fr);
@@ -210,6 +173,7 @@ main {
210
  margin-bottom: 2px;
211
  }
212
 
 
213
  .pill {
214
  display: inline-flex;
215
  align-items: center;
@@ -263,6 +227,37 @@ main {
263
  line-height: 1.5;
264
  }
265
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
266
  .meta-grid {
267
  display: grid;
268
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -308,7 +303,7 @@ a:hover {
308
 
309
  /* Responsive */
310
  @media (min-width: 900px) {
311
- h1 {
312
  font-size: 28px;
313
  }
314
  }
@@ -328,7 +323,7 @@ a:hover {
328
  }
329
 
330
  @media (max-width: 600px) {
331
- h1 {
332
  font-size: 18px;
333
  }
334
 
 
56
  backdrop-filter: blur(16px);
57
  }
58
 
59
+ /* Header styles */
60
  header {
61
  display: flex;
62
  flex-direction: column;
 
66
  padding-bottom: 16px;
67
  }
68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
  .htitle {
70
  font-size: 22px;
71
  font-weight: 650;
 
98
  border: 1px solid rgba(230, 57, 70, 0.45);
99
  }
100
 
 
 
 
 
 
 
 
 
 
 
101
  .subtitle {
102
  font-size: 13px;
103
  color: var(--text-muted);
 
113
  margin-top: 2px;
114
  }
115
 
116
+ /* Main content */
117
  main {
118
  display: grid;
119
  grid-template-columns: minmax(0, 1.3fr) minmax(0, 0.9fr);
 
173
  margin-bottom: 2px;
174
  }
175
 
176
+ /* Side panel */
177
  .pill {
178
  display: inline-flex;
179
  align-items: center;
 
227
  line-height: 1.5;
228
  }
229
 
230
+ /* Permissions list */
231
+ .permissions-group {
232
+ margin-bottom: 12px;
233
+ }
234
+
235
+ .permissions-group:last-child {
236
+ margin-bottom: 0;
237
+ }
238
+
239
+ .permissions-group.avoid {
240
+ padding-top: 8px;
241
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
242
+ }
243
+
244
+ .permission-item {
245
+ display: flex;
246
+ align-items: center;
247
+ gap: 8px;
248
+ margin-bottom: 6px;
249
+ font-family: monospace;
250
+ font-size: 13px;
251
+ }
252
+
253
+ .permission-item span {
254
+ color: var(--text-muted);
255
+ }
256
+
257
+ .permissions-group.avoid .permission-item span {
258
+ color: #fca5a5;
259
+ }
260
+
261
  .meta-grid {
262
  display: grid;
263
  grid-template-columns: repeat(2, minmax(0, 1fr));
 
303
 
304
  /* Responsive */
305
  @media (min-width: 900px) {
306
+ .htitle {
307
  font-size: 28px;
308
  }
309
  }
 
323
  }
324
 
325
  @media (max-width: 600px) {
326
+ .htitle {
327
  font-size: 18px;
328
  }
329