@kenjura/ursa 0.55.0 → 0.58.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ # 0.58.0
2
+ 2025-12-26
3
+
4
+ - new menu UI with 2-pane horizontal layout
5
+
6
+ # 0.57.0
7
+ 2025-12-26
8
+
9
+ - added full-text indexing and search using lunr.js
10
+ - all links in generated html will be full links with extensions (e.g. /folder/page.html)
11
+
12
+ # 0.56.0
13
+ 2025-12-23
14
+
15
+ - restored metadata to directory index JSON files
16
+
1
17
  # 0.55.0
2
18
  2025-12-21
3
19
 
package/README.md CHANGED
@@ -242,4 +242,17 @@ Generates the site once using default directories.
242
242
 
243
243
  ## Requirements
244
244
 
245
- SOURCE folder should have at least an index.md in it.
245
+ SOURCE folder should have at least an index.md in it.
246
+
247
+
248
+ ## Link logic
249
+ Links are allowed to be extensionless. Link resolution works as follows:
250
+ - If link has an extension, look for exact match, and 404 if not found
251
+ - If link has no extension:
252
+ - Look for exact match with .md, .txt, .yml extensions (in that order)
253
+ - If not found, assume the path is a folder, and look for:
254
+ - index.md, index.txt, _index.md, _index.txt
255
+ - home.md, home.txt, _home.md, _home.txt
256
+ - (folder name).md, (folder name).txt
257
+ - If any of these are found, link to that file's html version
258
+ - If still not found, 404
package/meta/default.css CHANGED
@@ -180,15 +180,54 @@ nav#nav-global {
180
180
  font-style: italic;
181
181
  }
182
182
 
183
+ /* Search section styling (for combined path/full-text results) */
184
+ .search-section {
185
+ border-bottom: 1px solid var(--nav-top-bg);
186
+ }
187
+
188
+ .search-section:last-child {
189
+ border-bottom: none;
190
+ }
191
+
192
+ .search-section-header {
193
+ padding: 8px 16px;
194
+ font-size: 0.75em;
195
+ font-weight: 600;
196
+ text-transform: uppercase;
197
+ letter-spacing: 0.5px;
198
+ color: var(--text-color);
199
+ opacity: 0.6;
200
+ background-color: color-mix(in srgb, var(--nav-top-bg) 50%, transparent);
201
+ border-bottom: 1px solid var(--nav-top-bg);
202
+ }
203
+
204
+ .search-show-more {
205
+ display: block;
206
+ width: 100%;
207
+ padding: 8px 16px;
208
+ background: transparent;
209
+ border: none;
210
+ color: var(--link-color);
211
+ font-size: 0.85em;
212
+ cursor: pointer;
213
+ text-align: center;
214
+ transition: background-color 0.2s ease;
215
+ }
216
+
217
+ .search-show-more:hover {
218
+ background-color: var(--nav-top-bg);
219
+ text-decoration: underline;
220
+ }
221
+
183
222
  nav#nav-main {
184
223
  position: fixed;
185
224
  top: calc(var(--global-nav-height));
186
225
  left: 0;
187
226
  width: 260px;
188
227
  max-height: calc(100vh - var(--global-nav-height));
189
- overflow-y: auto;
190
- padding: 0.5rem 0;
191
- font-size: 0.9rem;
228
+ overflow: hidden;
229
+ padding: 0;
230
+ font-size: 0.85rem;
192
231
  transition: transform 0.2s ease;
193
232
  }
194
233
 
@@ -204,114 +243,88 @@ body:has(nav#nav-main.collapsed) article#main-content {
204
243
  }
205
244
 
206
245
  nav#nav-main {
207
-
208
- /* Scrollbar styling */
209
- &::-webkit-scrollbar {
210
- width: 6px;
211
- }
212
- &::-webkit-scrollbar-track {
213
- background: transparent;
214
- }
215
- &::-webkit-scrollbar-thumb {
216
- background: rgba(128, 128, 128, 0.3);
217
- border-radius: 3px;
246
+ /* Column-based menu styles */
247
+
248
+ .menu-loading {
249
+ padding: 1rem;
250
+ opacity: 0.6;
251
+ text-align: center;
218
252
  }
219
- &::-webkit-scrollbar-thumb:hover {
220
- background: rgba(128, 128, 128, 0.5);
253
+
254
+ /* Container that clips the columns */
255
+ .menu-columns-container {
256
+ width: 100%;
257
+ height: calc(100vh - var(--global-nav-height) - 40px);
258
+ overflow: hidden;
259
+ position: relative;
221
260
  }
222
-
223
- /* Breadcrumb navigation header */
224
- .menu-breadcrumb {
261
+
262
+ /* Wrapper that holds all columns and transforms for scrolling */
263
+ .menu-columns-wrapper {
225
264
  display: flex;
226
- align-items: center;
227
- gap: 8px;
228
- padding: 0.5rem 1rem;
229
- margin: 0 8px 0.5rem 8px;
230
- border-bottom: 1px solid rgba(128, 128, 128, 0.2);
231
- }
232
-
233
- .menu-breadcrumb button {
234
- background: none;
235
- border: none;
236
- color: var(--text-color);
237
- cursor: pointer;
238
- padding: 4px 8px;
239
- border-radius: 4px;
240
- font-size: 1rem;
241
- opacity: 0.7;
242
- transition: all 0.2s ease;
243
- }
244
-
245
- .menu-breadcrumb button:hover {
246
- opacity: 1;
247
- background: rgba(128, 128, 128, 0.2);
265
+ height: 100%;
266
+ transition: transform 0.25s ease-out;
248
267
  }
249
-
250
- .menu-current-path {
251
- flex: 1;
252
- font-weight: 500;
253
- opacity: 0.9;
254
- text-transform: capitalize;
255
- white-space: nowrap;
256
- overflow: hidden;
257
- text-overflow: ellipsis;
268
+
269
+ /* Individual column */
270
+ .menu-column {
271
+ width: 130px;
272
+ min-width: 130px;
273
+ height: 100%;
274
+ overflow-y: auto;
275
+ overflow-x: hidden;
276
+ border-right: 1px solid rgba(128, 128, 128, 0.15);
277
+
278
+ /* Scrollbar styling */
279
+ &::-webkit-scrollbar {
280
+ width: 4px;
281
+ }
282
+ &::-webkit-scrollbar-track {
283
+ background: transparent;
284
+ }
285
+ &::-webkit-scrollbar-thumb {
286
+ background: rgba(128, 128, 128, 0.2);
287
+ border-radius: 2px;
288
+ }
289
+ &::-webkit-scrollbar-thumb:hover {
290
+ background: rgba(128, 128, 128, 0.4);
291
+ }
258
292
  }
259
-
260
- /* Root ul */
261
- ul.menu-level {
262
- list-style: none;
263
- margin: 0;
264
- padding: 0;
293
+
294
+ .menu-column:last-child {
295
+ border-right: none;
265
296
  }
266
-
267
- ul {
297
+
298
+ /* Column list */
299
+ .menu-column-list {
268
300
  list-style: none;
269
301
  margin: 0;
270
- padding: 0;
302
+ padding: 4px 0;
271
303
  }
272
-
273
- li {
304
+
305
+ /* Column item */
306
+ .menu-column-item {
274
307
  margin: 0;
275
308
  padding: 0;
276
309
  }
277
-
278
- /* Menu item row container - cleaner style like reference */
279
- .menu-item-row {
310
+
311
+ .menu-column-item-row {
280
312
  display: flex;
281
313
  align-items: center;
282
- padding: 0.5rem 0.75rem;
283
- margin: 2px 8px;
284
- border-radius: 6px;
314
+ padding: 6px 8px;
315
+ margin: 1px 4px;
316
+ border-radius: 4px;
285
317
  cursor: pointer;
286
- transition: all 0.15s ease;
287
- gap: 10px;
318
+ transition: background-color 0.15s ease;
319
+ gap: 4px;
288
320
  }
289
-
290
- .menu-item-row:hover {
291
- background-color: rgba(128, 128, 128, 0.1);
292
- }
293
-
294
- /* Icon container */
295
- .menu-icon {
296
- display: flex;
297
- align-items: center;
298
- justify-content: center;
299
- width: 20px;
300
- height: 20px;
301
- flex-shrink: 0;
302
- font-size: 16px;
303
- opacity: 0.7;
304
- }
305
-
306
- .menu-icon img {
307
- width: 18px;
308
- height: 18px;
309
- object-fit: contain;
310
- border-radius: 3px;
321
+
322
+ .menu-column-item-row:hover {
323
+ background-color: rgba(128, 128, 128, 0.15);
311
324
  }
312
-
313
- /* Menu link */
314
- .menu-label {
325
+
326
+ /* Label styling */
327
+ .menu-column-label {
315
328
  flex: 1;
316
329
  text-decoration: none;
317
330
  color: var(--text-color);
@@ -320,89 +333,105 @@ nav#nav-main {
320
333
  overflow: hidden;
321
334
  text-overflow: ellipsis;
322
335
  font-weight: 400;
323
- line-height: 1.4;
336
+ line-height: 1.3;
324
337
  text-transform: capitalize;
338
+ font-size: 0.8rem;
325
339
  }
326
-
327
- .menu-item-row:hover .menu-label {
340
+
341
+ .menu-column-item-row:hover .menu-column-label {
328
342
  opacity: 1;
329
343
  }
330
-
331
- /* More indicator for items with children */
332
- .menu-more {
344
+
345
+ /* Arrow for folders */
346
+ .menu-column-arrow {
333
347
  opacity: 0.4;
334
- font-size: 14px;
335
- padding: 0 4px;
336
- cursor: pointer;
337
- transition: opacity 0.15s ease;
348
+ font-size: 12px;
349
+ flex-shrink: 0;
338
350
  }
339
-
340
- .menu-item-row:hover .menu-more {
341
- opacity: 0.7;
351
+
352
+ .menu-column-item.has-children .menu-column-item-row:hover .menu-column-arrow {
353
+ opacity: 0.8;
342
354
  }
343
-
344
- .menu-more:hover {
345
- opacity: 1 !important;
355
+
356
+ /* Selected item (on path to current doc) */
357
+ .menu-column-item.selected > .menu-column-item-row {
358
+ background-color: rgba(128, 128, 128, 0.2);
346
359
  }
347
-
348
- /* Caret indicator for level-1 expandable items */
349
- .menu-caret {
350
- opacity: 0.4;
351
- font-size: 12px;
352
- padding: 0 4px;
353
- cursor: pointer;
354
- transition: opacity 0.15s ease;
355
- font-weight: bold;
360
+
361
+ .menu-column-item.selected > .menu-column-item-row .menu-column-label {
362
+ font-weight: 500;
363
+ opacity: 1;
356
364
  }
357
-
358
- .menu-item-row:hover .menu-caret {
359
- opacity: 0.7;
365
+
366
+ /* Current page item */
367
+ .menu-column-item.current-page > .menu-column-item-row {
368
+ background-color: rgba(0, 255, 255, 0.2);
360
369
  }
361
-
362
- .menu-caret:hover {
363
- opacity: 1 !important;
370
+
371
+ .menu-column-item.current-page > .menu-column-item-row .menu-column-label {
372
+ font-weight: 600;
373
+ opacity: 1;
364
374
  }
365
-
366
- /* Current/active item */
367
- .current-menu-item > .menu-item-row {
368
- background-color: rgba(0, 255, 255, 0.15);
375
+
376
+ /* Scroll buttons */
377
+ .menu-scroll-btn {
378
+ position: absolute;
379
+ top: 50%;
380
+ transform: translateY(-50%);
381
+ width: 24px;
382
+ height: 48px;
383
+ background: rgba(0, 0, 0, 0.4);
384
+ border: none;
385
+ color: var(--text-color);
386
+ font-size: 18px;
387
+ cursor: pointer;
388
+ z-index: 10;
389
+ border-radius: 4px;
390
+ transition: all 0.2s ease;
391
+ display: flex;
392
+ align-items: center;
393
+ justify-content: center;
369
394
  }
370
-
371
- .current-menu-item > .menu-item-row .menu-label {
372
- opacity: 1;
373
- font-weight: 500;
395
+
396
+ .menu-scroll-btn:hover:not(:disabled) {
397
+ background: rgba(0, 0, 0, 0.6);
374
398
  }
375
-
376
- /* Level 1 items - main folder entries */
377
- .menu-item.level-1 > .menu-item-row {
378
- font-size: 0.9rem;
399
+
400
+ .menu-scroll-btn:disabled {
401
+ cursor: default;
379
402
  }
380
-
381
- .menu-item.level-1.has-children > .menu-item-row {
382
- margin-top: 0.25rem;
403
+
404
+ .menu-scroll-btn.scroll-left {
405
+ left: 2px;
383
406
  }
384
-
385
- /* Sublevel container - always visible for 2-level nav */
386
- .menu-sublevel {
387
- margin-left: 0;
388
- padding-left: 0;
407
+
408
+ .menu-scroll-btn.scroll-right {
409
+ right: 2px;
389
410
  }
390
-
391
- /* Level 2 items - nested under folders */
392
- .menu-item.level-2 > .menu-item-row {
393
- padding-left: 2.5rem;
394
- font-size: 0.85rem;
411
+
412
+ /* Scroll indicator for current doc */
413
+ .menu-scroll-indicator {
414
+ position: absolute;
415
+ bottom: 8px;
416
+ left: 50%;
417
+ transform: translateX(-50%);
418
+ z-index: 10;
395
419
  }
396
-
397
- .menu-item.level-2 > .menu-item-row .menu-icon {
398
- display: none;
420
+
421
+ .menu-scroll-indicator .scroll-to-current {
422
+ background: rgba(0, 255, 255, 0.3);
423
+ border: 1px solid rgba(0, 255, 255, 0.5);
424
+ color: var(--text-color);
425
+ padding: 4px 12px;
426
+ border-radius: 12px;
427
+ font-size: 0.75rem;
428
+ cursor: pointer;
429
+ transition: all 0.2s ease;
430
+ white-space: nowrap;
399
431
  }
400
-
401
- /* Separator between sections */
402
- .menu-item.level-1.has-children + .menu-item.level-1:not(.has-children) {
403
- margin-top: 0.5rem;
404
- padding-top: 0.5rem;
405
- border-top: 1px solid rgba(128, 128, 128, 0.15);
432
+
433
+ .menu-scroll-indicator .scroll-to-current:hover {
434
+ background: rgba(0, 255, 255, 0.5);
406
435
  }
407
436
  }
408
437