@getaster/elements 0.3.5 → 0.4.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.
Files changed (93) hide show
  1. package/NOTICE +4 -0
  2. package/README.md +13 -4
  3. package/bin/aster-theme-check.js +35 -4
  4. package/dist/base/element.d.ts +8 -1
  5. package/dist/base/element.js +7 -2
  6. package/dist/button/button.d.ts +17 -2
  7. package/dist/button/button.js +42 -8
  8. package/dist/composition/builtins.d.ts +623 -1
  9. package/dist/composition/builtins.js +232 -4
  10. package/dist/date/calendar.d.ts +3 -0
  11. package/dist/date/calendar.js +8 -2
  12. package/dist/date/date-field.d.ts +23 -3
  13. package/dist/date/date-field.js +77 -9
  14. package/dist/date/dates.d.ts +10 -2
  15. package/dist/date/dates.js +23 -3
  16. package/dist/dialog/config.d.ts +4 -0
  17. package/dist/dialog/config.js +8 -0
  18. package/dist/dialog/dialog.d.ts +34 -6
  19. package/dist/dialog/dialog.js +151 -14
  20. package/dist/field/bound-field.d.ts +17 -1
  21. package/dist/field/bound-field.js +68 -7
  22. package/dist/field/check.js +1 -0
  23. package/dist/field/field.js +1 -1
  24. package/dist/field/input.d.ts +1 -0
  25. package/dist/field/input.js +2 -2
  26. package/dist/field/number-field.js +2 -2
  27. package/dist/filter/filter-builder.d.ts +7 -1
  28. package/dist/filter/filter-builder.js +8 -1
  29. package/dist/form/controls.d.ts +40 -8
  30. package/dist/form/controls.js +58 -15
  31. package/dist/form/custom-field.d.ts +1 -0
  32. package/dist/form/custom-field.js +23 -0
  33. package/dist/form/features.d.ts +27 -0
  34. package/dist/form/features.js +52 -0
  35. package/dist/form/form.d.ts +67 -7
  36. package/dist/form/form.js +267 -24
  37. package/dist/form/policy.d.ts +29 -0
  38. package/dist/form/policy.js +16 -0
  39. package/dist/grid/appearance.d.ts +365 -0
  40. package/dist/grid/appearance.js +814 -0
  41. package/dist/grid/features.d.ts +38 -0
  42. package/dist/grid/features.js +78 -0
  43. package/dist/grid/grid.d.ts +216 -4
  44. package/dist/grid/grid.js +1810 -308
  45. package/dist/grid/policy.d.ts +58 -0
  46. package/dist/grid/policy.js +17 -0
  47. package/dist/grid/view.d.ts +32 -2
  48. package/dist/grid/view.js +89 -4
  49. package/dist/index.d.ts +14 -11
  50. package/dist/index.js +2 -1
  51. package/dist/menu/config.d.ts +7 -0
  52. package/dist/menu/config.js +44 -0
  53. package/dist/menu/menu.d.ts +23 -0
  54. package/dist/menu/menu.js +69 -17
  55. package/dist/picker/picker.js +8 -3
  56. package/dist/section/accordion.d.ts +26 -0
  57. package/dist/section/accordion.js +86 -8
  58. package/dist/section/policy.d.ts +8 -0
  59. package/dist/section/policy.js +17 -0
  60. package/dist/section/section.d.ts +30 -0
  61. package/dist/section/section.js +106 -3
  62. package/dist/select/choice-element.d.ts +12 -0
  63. package/dist/select/choice-element.js +36 -0
  64. package/dist/select/choice.d.ts +12 -2
  65. package/dist/select/choice.js +93 -28
  66. package/dist/select/select.d.ts +12 -0
  67. package/dist/select/select.js +37 -1
  68. package/dist/styles/contract.d.ts +14 -0
  69. package/dist/styles/contract.js +15 -0
  70. package/dist/switch/switch.d.ts +16 -0
  71. package/dist/switch/switch.js +56 -6
  72. package/dist/tree/navigator.d.ts +3 -0
  73. package/dist/tree/navigator.js +26 -2
  74. package/dist/window/chrome.d.ts +5 -1
  75. package/dist/window/chrome.js +4 -3
  76. package/dist/window/config.d.ts +71 -0
  77. package/dist/window/config.js +40 -0
  78. package/dist/window/window.d.ts +51 -13
  79. package/dist/window/window.js +233 -38
  80. package/dist/yaml.d.ts +19 -0
  81. package/dist/yaml.js +57 -0
  82. package/package.json +10 -4
  83. package/styles/aster-ui.css +181 -10
  84. package/styles/base.css +14 -0
  85. package/styles/contract.ts +16 -0
  86. package/styles/elements.css +167 -10
  87. package/styles/fonts/OFL-bricolage-grotesque.txt +93 -0
  88. package/styles/fonts/OFL-fraunces.txt +93 -0
  89. package/styles/fonts/bricolage-grotesque-latin-opsz-normal.woff2 +0 -0
  90. package/styles/fonts/fraunces-latin-full-normal.woff2 +0 -0
  91. package/styles/fonts.css +17 -0
  92. package/styles/theme-harbour.css +5 -0
  93. package/styles/theme-lamplight.css +5 -0
@@ -50,6 +50,8 @@
50
50
  .aster-number:has(.aster-number-steps) { height:auto; min-height:48px; }
51
51
  .aster-number-steps button, .aster-split-tools button, .aster-breadcrumbs :is(a,button) { min-width:44px; min-height:44px; }
52
52
  .aster-accordion > .aster-accordion-item > aster-section > .aster-section-head button { min-height:44px; }
53
+ .aster-accordion-reorder button { width:44px; height:44px; }
54
+ .aster-section-head > .aster-section-close { width:44px; height:44px; }
53
55
  }
54
56
  @media (forced-colors:active) { .aster-number-steps button { border:1px solid ButtonText; } }
55
57
  aster-component { display: block; min-width: 0; }
@@ -163,6 +165,17 @@
163
165
  .aster-button[aria-busy="true"] .aster-label-swap { opacity: .75; }
164
166
  .aster-button[aria-disabled="true"] { opacity: .45; box-shadow: var(--aster-ring); transform: none; }
165
167
  .aster-button[data-variant="primary"][aria-disabled="true"] { background: var(--aster-text-3); }
168
+ .aster-button[data-tone="danger"] { color: var(--aster-negative); box-shadow: inset 0 0 0 .5px oklch(from var(--aster-negative) l c h / .55), var(--aster-e1); }
169
+ .aster-button[data-tone="danger"]:hover { background: oklch(from var(--aster-negative) l c h / .08); box-shadow: inset 0 0 0 .5px var(--aster-negative), var(--aster-e2); }
170
+ .aster-button[data-tone="danger"]:active { box-shadow: inset 1px 1px 2px var(--aster-press), inset 0 0 0 .5px var(--aster-negative); }
171
+ .aster-button[data-size="sm"] { height: var(--aster-ctl-tight); padding: 0 8px; font-size: 12.5px; }
172
+ .aster-button[data-size="lg"] { height: var(--aster-ctl); padding: 0 16px; font-size: 13.5px; }
173
+ @media (forced-colors: active) {
174
+ /* The button edge is a shadow; forced colours drop shadows, so draw it. */
175
+ .aster-button { border: 1px solid ButtonText; }
176
+ .aster-button[aria-disabled="true"], .aster-button:disabled { border-color: GrayText; color: GrayText; }
177
+ }
178
+ .aster-button:disabled { opacity: .45; box-shadow: var(--aster-ring); cursor: not-allowed; transform: none; }
166
179
  .aster-button svg { width: 13px; height: 13px; fill: none; stroke: currentColor; stroke-width: 1.7; }
167
180
  .aster-label-swap { display: inline-grid; }
168
181
  .aster-label-swap > * { grid-area: 1 / 1; transition: opacity 120ms; }
@@ -201,6 +214,10 @@
201
214
  aster-switch:last-child { border-bottom: 0; }
202
215
  aster-switch .aster-error { padding-bottom: 8px; }
203
216
  .aster-switch-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: calc(var(--aster-row-y) + 2px) 0; user-select: none; }
217
+ .aster-switch-end { display: flex; align-items: center; gap: 10px; flex: none; }
218
+ .aster-switch-state { font-size: 12px; color: var(--aster-text-3); }
219
+ .aster-switch-row[data-disabled] { opacity: .55; }
220
+ .aster-switch-row[data-disabled], .aster-switch-row[data-readonly] { cursor: default; }
204
221
  .aster-switch {
205
222
  position: relative; width: 28px; height: 16px; flex: none; border-radius: 999px;
206
223
  background: var(--aster-sunk); box-shadow: var(--aster-well); transition: background var(--aster-t-micro);
@@ -261,10 +278,16 @@
261
278
  .aster-dialog[open]::backdrop { opacity: 1; }
262
279
  @starting-style { .aster-dialog[open]::backdrop { opacity: 0; } }
263
280
  .aster-dialog-panel {
264
- width: var(--dialog-width, 372px); max-width: 100%; border-radius: var(--aster-r-dialog); overflow: hidden;
281
+ width: var(--dialog-width, 372px); max-width: min(var(--aster-dialog-max-width), 100%); border-radius: var(--aster-r-dialog); overflow: hidden;
265
282
  background: var(--aster-surface); box-shadow: var(--aster-e3);
266
283
  view-transition-name: aster-dialog-panel; corner-shape: squircle;
267
284
  }
285
+ .aster-dialog-head { display: flex; align-items: center; gap: 8px; padding: 12px 10px 0 16px; }
286
+ .aster-dialog-title { flex: 1; min-width: 0; margin: 0; font-size: 15px; font-weight: var(--aster-weight-strong); }
287
+ .aster-dialog-close { display: grid; place-items: center; flex: none; width: var(--aster-ctl); height: var(--aster-ctl); border-radius: var(--aster-r-ctl); color: var(--aster-text-2); }
288
+ .aster-dialog-close:hover { background: var(--aster-accent-soft); color: var(--aster-text); }
289
+ .aster-dialog-close svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 1.4; stroke-linecap: round; }
290
+ .aster-dialog-footer { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 16px; border-top: 1px solid var(--aster-rule-2); }
268
291
  ::view-transition-group(aster-dialog-panel) { animation-duration: var(--aster-t-morph); animation-timing-function: var(--aster-ease); }
269
292
  ::view-transition-old(aster-dialog-panel) { animation: 90ms ease both aster-vt-out; }
270
293
  ::view-transition-new(aster-dialog-panel) { animation: var(--aster-t-ink) ease 80ms both aster-vt-in; }
@@ -298,12 +321,22 @@
298
321
  /* Against an element, and every submenu: anchor positioning, flipping at the edges. */
299
322
  .aster-menu[data-anchored] { left: auto; top: auto; translate: none; margin: 4px 0; position-area: bottom span-right; position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline; }
300
323
  .aster-menu[data-depth]:not([data-depth="0"]) { margin: 0 2px; position-area: right span-bottom; position-try-fallbacks: flip-inline, flip-block, flip-inline flip-block; }
301
- .aster-menu [role^="menuitem"] { display: flex; align-items: center; gap: 6px; padding: var(--aster-row-y) 10px var(--aster-row-y) 6px; border-radius: var(--aster-r-ctl); text-align: left; }
324
+ .aster-menu[data-depth]:not([data-depth="0"])[data-submenu="end"] { position-area: right span-bottom; position-try-fallbacks: flip-block; }
325
+ .aster-menu[data-depth]:not([data-depth="0"])[data-submenu="start"] { position-area: left span-bottom; position-try-fallbacks: flip-block; }
326
+ :dir(rtl) .aster-menu[data-depth]:not([data-depth="0"])[data-submenu="end"] { position-area: left span-bottom; }
327
+ :dir(rtl) .aster-menu[data-depth]:not([data-depth="0"])[data-submenu="start"] { position-area: right span-bottom; }
328
+ .aster-menu [role^="menuitem"] { display: flex; align-items: center; gap: 6px; min-height: var(--aster-menu-cell-height); padding: var(--aster-row-y) 10px var(--aster-row-y) 6px; border-radius: var(--aster-r-ctl); text-align: left; }
302
329
  .aster-menu [role^="menuitem"]:hover, .aster-menu [role^="menuitem"]:focus, .aster-menu [aria-expanded="true"] { background: var(--aster-accent-soft); outline: none; }
303
330
  .aster-menu [role^="menuitem"]:focus-visible { outline: 2px solid var(--aster-focus); outline-offset: -2px; }
304
331
  .aster-menu [aria-disabled="true"] { color: var(--aster-text-3); }
305
332
  .aster-menu-mark { width: 12px; flex: none; text-align: center; color: var(--aster-accent); }
333
+ .aster-menu-icon { display: grid; place-items: center; flex: none; width: calc(var(--aster-menu-icon-size) + 2px); color: var(--aster-text-2); }
334
+ .aster-menu-icon svg { width: var(--aster-menu-icon-size); height: var(--aster-menu-icon-size); fill: none; stroke: currentColor; stroke-width: 1.4; }
335
+ .aster-menu-shortcut { margin-inline-start: auto; padding-inline-start: 24px; color: var(--aster-text-3); font-size: 11.5px; white-space: nowrap; }
336
+ .aster-menu-shortcut + .aster-menu-more { margin-left: 8px; padding-left: 0; }
306
337
  .aster-menu-more { margin-left: auto; padding-left: 16px; color: var(--aster-text-3); }
338
+ .aster-menu-empty { padding: calc(var(--aster-row-y) + 2px) 10px; color: var(--aster-text-2); font-size: 12.5px; }
339
+ .aster-menu:focus-visible { outline: 2px solid var(--aster-focus); outline-offset: 2px; }
307
340
  .aster-menu-separator { height: 1px; margin: 4px 6px; background: var(--aster-rule-2); }
308
341
  .aster-menu-heading { padding: var(--aster-row-y) 10px 2px 24px; font-size: 11.5px; font-weight: var(--aster-weight-label); color: var(--aster-text-3); }
309
342
 
@@ -326,6 +359,9 @@
326
359
  .aster-list-edit-row[data-new] .aster-field { box-shadow: var(--aster-well), inset 2px 0 0 var(--aster-accent); }
327
360
  [data-readonly] .aster-field { background: transparent; box-shadow: inset 0 0 0 .5px var(--aster-rule); }
328
361
  [data-readonly] .aster-field :is(input, select) { color: var(--aster-text-2); }
362
+ [data-disabled] .aster-field { background: var(--aster-sunk); opacity: .6; }
363
+ [data-disabled] .aster-field :is(input, textarea) { cursor: not-allowed; }
364
+ [data-disabled] .aster-field-head { opacity: .6; }
329
365
 
330
366
  /* ── check ── */
331
367
  aster-check { display: grid; gap: 6px; }
@@ -336,6 +372,15 @@
336
372
  .aster-select-value { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; outline: none; user-select: none; }
337
373
  .aster-select-value[data-placeholder] { color: var(--aster-text-3); }
338
374
  [data-readonly] .aster-select-value { color: var(--aster-text-2); }
375
+ .aster-select:has([aria-disabled="true"]) { opacity: .55; cursor: not-allowed; }
376
+ .aster-select-clear {
377
+ display: grid; place-items: center; flex: none; width: 18px; height: 18px; border-radius: 999px;
378
+ color: var(--aster-text-2);
379
+ }
380
+ .aster-select-clear:hover { background: oklch(from var(--aster-text) l c h / .08); color: var(--aster-text); }
381
+ .aster-select-clear:focus-visible { outline: 2px solid var(--aster-focus); outline-offset: -1px; }
382
+ .aster-select-clear svg { width: 10px; height: 10px; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; }
383
+ .aster-choice-empty { padding: var(--aster-row-y) 10px; color: var(--aster-text-2); font-size: 12.5px; }
339
384
 
340
385
  /* ── picker ── */
341
386
  .aster-picker { position: relative; }
@@ -350,18 +395,28 @@
350
395
  aster-window { display: contents; }
351
396
  .aster-window {
352
397
  position: fixed; inset: auto; margin: 0; left: var(--window-x, auto); top: var(--window-y, 24px); right: auto;
353
- display: none; flex-direction: column; width: 340px; height: 420px; min-width: min(240px, calc(100vw - 16px)); min-height: min(160px, calc(100dvh - 16px));
354
- max-width: calc(100vw - 16px); max-height: calc(100dvh - 16px); padding: 0; border: 0; overflow: hidden; resize: both;
398
+ display: none; flex-direction: column; width: 340px; height: 420px;
399
+ min-width: min(240px, var(--window-cap-width, calc(100vw - 16px))); min-height: min(160px, var(--window-cap-height, calc(100dvh - 16px)));
400
+ max-width: var(--window-cap-width, calc(100vw - 16px)); max-height: var(--window-cap-height, calc(100dvh - 16px));
401
+ padding: 0; border: 0; overflow: hidden; resize: both;
355
402
  border-radius: var(--aster-r-pop); background: var(--aster-surface); color: inherit; box-shadow: var(--aster-e3);
356
403
  }
357
404
  .aster-window:popover-open { display: flex; }
405
+ /* A modal window is a native dialog's child: the dialog supplies inertness and focus containment. */
406
+ .aster-window-modal {
407
+ position: fixed; inset: 0; width: auto; height: auto; max-width: none; max-height: none;
408
+ margin: 0; padding: 0; border: 0; background: transparent; overflow: visible;
409
+ }
410
+ .aster-window-modal::backdrop { background: var(--aster-scrim); }
411
+ .aster-window-modal[open] > .aster-window { display: flex; }
412
+ .aster-window[data-resizer="false"] { resize: none; }
358
413
  .aster-window[data-state="maximized"] {
359
414
  left: 8px; top: 8px; width: calc(100vw - 16px) !important; height: calc(100dvh - 16px) !important; resize: none;
360
415
  }
361
416
  .aster-window[data-active="true"] { outline: 1px solid var(--aster-rule); }
362
417
  .aster-window:focus-visible { outline: 2px solid var(--aster-focus); outline-offset: 2px; }
363
418
  .aster-window-bar {
364
- display: flex; align-items: center; gap: 2px; padding: calc(var(--aster-pad) / 2) 6px calc(var(--aster-pad) / 2) 14px; cursor: grab; touch-action: none; user-select: none;
419
+ display: flex; align-items: center; gap: 2px; min-height: var(--aster-window-header-height); padding: calc(var(--aster-pad) / 2) 6px calc(var(--aster-pad) / 2) 14px; cursor: grab; touch-action: none; user-select: none;
365
420
  border-bottom: 1px solid var(--aster-rule-2);
366
421
  }
367
422
  .aster-window-bar:active { cursor: grabbing; }
@@ -378,6 +433,8 @@
378
433
  .aster-window-bar .aster-window-move, .aster-window-bar button[aria-describedby$="-resize-help"] { display:none; }
379
434
  }
380
435
  .aster-window-body { flex: 1; min-height: 0; overflow: auto; padding: var(--aster-pad) 14px; }
436
+ .aster-window-footer { flex: none; padding: calc(var(--aster-pad) / 2) 14px; border-top: 1px solid var(--aster-rule-2); }
437
+ .aster-window-status { flex: none; padding: 3px 14px; border-top: 1px solid var(--aster-rule-2); color: var(--aster-text-2); font-size: 11.5px; }
381
438
  /* Dashboard geometry stays in CSS; stored sizes are column/row intent. */
382
439
  aster-dashboard { display: block; min-width: 0; container-type: inline-size; }
383
440
  .aster-dashboard-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); grid-auto-rows: var(--dashboard-row, 300px); gap: var(--dashboard-gap, 16px); }
@@ -427,6 +484,8 @@
427
484
  .aster-calendar td[role="gridcell"]:hover { background: var(--aster-accent-soft); }
428
485
  .aster-calendar td[aria-current="date"] { font-weight: var(--aster-weight-label); color: var(--aster-accent); }
429
486
  .aster-calendar td[aria-selected="true"] { background: var(--aster-accent); color: var(--aster-on-accent); }
487
+ .aster-calendar td[aria-disabled="true"] { color: var(--aster-text-3); text-decoration: line-through; cursor: not-allowed; }
488
+ .aster-calendar td[aria-disabled="true"]:hover { background: none; }
430
489
  .aster-calendar td:focus { outline: 2px solid var(--aster-focus); outline-offset: -2px; }
431
490
  .aster-picker-list {
432
491
  min-width: anchor-size(width); max-width: min(480px, 100vw - 32px); max-height: min(280px, 45vh); overflow: auto;
@@ -503,11 +562,34 @@
503
562
 
504
563
  /* ── section ── */
505
564
  aster-section { display: block; }
565
+ .aster-accordion-tools { display: flex; justify-content: flex-end; padding-bottom: 4px; }
566
+ .aster-accordion-tools button { min-height: var(--aster-ctl); padding: 0 8px; border-radius: var(--aster-r-ctl); color: var(--aster-accent); font-size: 12.5px; font-weight: var(--aster-weight-strong); }
567
+ .aster-accordion-tools button:hover { background: var(--aster-accent-soft); }
568
+ .aster-accordion-reorder { display: inline-flex; gap: 2px; }
569
+ .aster-accordion-reorder button { width: var(--aster-ctl); height: var(--aster-ctl); border-radius: var(--aster-r-ctl); color: var(--aster-text-2); }
570
+ .aster-accordion-reorder button:hover:not(:disabled) { background: var(--aster-accent-soft); color: var(--aster-text); }
571
+ .aster-accordion-reorder button:disabled { opacity: .4; }
506
572
  .aster-section-head { display: flex; align-items: center; gap: 10px; margin: 0; padding: var(--aster-pad) 0 calc(var(--aster-pad) - 4px); font: inherit; border-bottom: 1px solid var(--aster-rule-2); }
507
573
  .aster-section-head button { display: flex; align-items: center; gap: 8px; font-size: 13.5px; font-weight: var(--aster-weight-strong); color: var(--aster-text); }
508
574
  .aster-section-head svg { width: 10px; height: 10px; fill: none; stroke: currentColor; stroke-width: 1.5; transition: rotate var(--aster-t-micro) var(--aster-ease); }
509
- aster-section[data-open] > .aster-section-head > button > svg { rotate: 90deg; }
575
+ aster-section[data-open] > .aster-section-head > button:not(.aster-section-close) > svg { rotate: 90deg; }
576
+ .aster-section-title { font-size: 13.5px; font-weight: var(--aster-weight-strong); color: var(--aster-text); }
510
577
  .aster-section-summary { font-size: 12px; color: var(--aster-text-3); }
578
+ .aster-section-head > .aster-section-close {
579
+ flex: none; display: grid; place-items: center; width: calc(var(--aster-ctl) - 2px); height: calc(var(--aster-ctl) - 2px);
580
+ border-radius: var(--aster-r-ctl); color: var(--aster-text-2);
581
+ }
582
+ .aster-section-head > .aster-section-close:hover { background: var(--aster-accent-soft); color: var(--aster-text); }
583
+ .aster-section-head > .aster-section-close:focus-visible { outline: 2px solid var(--aster-focus); outline-offset: -2px; }
584
+ .aster-section-close svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 1.4; stroke-linecap: round; }
585
+ /* The window bar without its drag affordance: an in-flow panel. */
586
+ aster-section > .aster-window-bar { cursor: default; touch-action: auto; user-select: auto; }
587
+ aster-section > .aster-window-bar > h2 { display: flex; align-items: baseline; gap: 6px; }
588
+ .aster-window-bar .aster-section-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
589
+ .aster-window-bar .aster-section-summary { flex: none; font-weight: var(--aster-weight); }
590
+ .aster-window-bar .aster-section-fold svg { transition: rotate var(--aster-t-micro) var(--aster-ease); }
591
+ aster-section[data-open] > .aster-window-bar > .aster-section-fold svg { rotate: 180deg; }
592
+ .aster-section-footer { margin-top: var(--aster-pad); padding-top: calc(var(--aster-pad) - 4px); border-top: 1px solid var(--aster-rule-2); }
511
593
  /* Height animates as a grid track, so nothing is measured in JS. */
512
594
  .aster-section-body { display: grid; grid-template-rows: 0fr; transition: grid-template-rows var(--aster-t-morph) var(--aster-ease); }
513
595
  aster-section[data-open] > .aster-section-body { grid-template-rows: 1fr; }
@@ -518,9 +600,26 @@
518
600
  aster-form { display: block; container-type: inline-size; }
519
601
  .aster-form-grid { display: grid; grid-template-columns: repeat(var(--columns, 2), minmax(0, 1fr)); gap: var(--aster-gap) calc(var(--aster-gap) + 4px); padding: var(--aster-gap) 0 calc(var(--aster-gap) + 4px); }
520
602
  .aster-form-grid > * { grid-column: span min(var(--span, 1), var(--columns, 2)); }
603
+ .aster-form-summary {
604
+ margin: 0 0 var(--aster-gap); padding: var(--aster-pad); border-radius: var(--aster-r-card);
605
+ background: var(--aster-sunk); box-shadow: inset 0 0 0 .5px var(--aster-negative), var(--aster-well);
606
+ }
607
+ .aster-form-summary-title { margin: 0 0 4px; color: var(--aster-negative); font-size: 13px; font-weight: var(--aster-weight-strong); }
608
+ .aster-form-summary-form { margin: 4px 0; color: var(--aster-text); font-size: 12.5px; }
609
+ .aster-form-summary ul { display: grid; gap: 2px; margin: 0; padding-left: 18px; }
610
+ .aster-form-summary button { color: var(--aster-negative); font-size: 12.5px; text-align: left; text-decoration: underline; text-underline-offset: 2px; border-radius: 2px; }
611
+ .aster-form-summary button:focus-visible { outline: 2px solid var(--aster-focus); outline-offset: 1px; }
612
+ aster-form[data-title-orientation="start"] .aster-form-grid > * {
613
+ display: grid; grid-template-columns: var(--aster-form-label-width, 9rem) minmax(0, 1fr);
614
+ column-gap: var(--aster-gap); row-gap: 6px; align-items: start;
615
+ }
616
+ aster-form[data-title-orientation="start"] .aster-form-grid > * > .aster-field-head { grid-column: 1; grid-row: 1; align-self: center; }
617
+ aster-form[data-title-orientation="start"] .aster-form-grid > * > :not(.aster-field-head) { grid-column: 2; }
521
618
  @container (max-width: 520px) {
522
619
  .aster-form-grid { grid-template-columns: minmax(0, 1fr); }
523
620
  .aster-form-grid > * { grid-column: auto; }
621
+ aster-form[data-title-orientation="start"] .aster-form-grid > * { display: grid; grid-template-columns: minmax(0, 1fr); }
622
+ aster-form[data-title-orientation="start"] .aster-form-grid > * > :not(.aster-field-head) { grid-column: auto; }
524
623
  }
525
624
 
526
625
  /* ── split ── */
@@ -680,11 +779,22 @@
680
779
 
681
780
  /* ── grid ── */
682
781
  aster-grid { position: relative; display: grid; grid-template-rows: auto minmax(0, 1fr) auto; min-height: 0; container: aster-grid / inline-size; }
782
+ /* The chrome row is always present: a hidden toolbar leaves it empty, and the table still takes the middle row. */
783
+ /* A hidden header stays in the accessibility tree so columnheader names and aria-rowcount arithmetic survive. */
784
+ .aster-grid-scroll[data-head-hidden] .aster-grid-head { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }
683
785
 
684
786
  aster-grid[data-dragging], aster-grid[data-dragging] * { cursor: grabbing; }
685
- .aster-grid-toolbar { position: relative; display: flex; flex-wrap: wrap; align-items: center; gap: 4px; padding: var(--aster-row-y) 12px; border-bottom: 1px solid var(--aster-rule-2); }
787
+ .aster-grid-chrome { min-width: 0; }
788
+ .aster-grid-toolbar { position: relative; display: flex; flex-wrap: wrap; align-items: center; gap: 4px; min-height: var(--aster-grid-toolbar-height); padding: var(--aster-row-y) 12px; border-bottom: 1px solid var(--aster-rule-2); }
789
+ /* Drift lives outside the toolbar: hiding the toolbar cannot silence it. */
790
+ .aster-grid-drift { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px; padding: var(--aster-row-y) 12px; border-bottom: 1px solid var(--aster-rule-2); font-size: 12.5px; color: var(--aster-text-2); background: var(--aster-surface); }
791
+ .aster-grid-drift > span { flex: 1; min-width: 0; }
792
+ .aster-grid-drift button { flex: none; color: var(--aster-accent); font-weight: var(--aster-weight-label); }
793
+ .aster-grid-paging { display: flex; align-items: center; gap: 4px; padding: var(--aster-row-y) 12px; border-bottom: 1px solid var(--aster-rule-2); background: var(--aster-surface); }
794
+ .aster-grid-page { flex: 1; min-width: 0; text-align: center; font-size: 12.5px; color: var(--aster-text-2); font-variant-numeric: tabular-nums; }
795
+ .aster-grid-paging button:disabled { opacity: .4; }
686
796
  .aster-grid-group-tools { display: inline-flex; align-items: center; max-width: 100%; }
687
- .aster-grid-summary { flex: none; padding: var(--aster-row-y) 12px; border-top: 1px solid var(--aster-rule-2); font-size: 12.5px; }
797
+ .aster-grid-summary { flex: none; min-height: var(--aster-grid-summary-height); padding: var(--aster-row-y) 12px; border-top: 1px solid var(--aster-rule-2); font-size: 12.5px; }
688
798
  .aster-grid-summary dl { display: flex; flex-wrap: wrap; gap: 8px 24px; margin: 0; }
689
799
  .aster-grid-summary dl > div { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 8px; min-width: 0; }
690
800
  .aster-grid-summary dt { color: var(--aster-text-2); overflow-wrap: anywhere; }
@@ -750,6 +860,8 @@
750
860
  .aster-drill-crumbs button { color: var(--aster-accent); font-size: 12.5px; }
751
861
  .aster-drill-crumbs button:hover { text-decoration: underline; }
752
862
  .aster-drill-crumbs button[aria-current] { color: var(--aster-text); font-weight: var(--aster-weight-strong); }
863
+ .aster-drill-search { flex: none; margin-inline-start: auto; }
864
+ .aster-drill-search input { width: 9rem; min-height: var(--aster-ctl); max-width: 34vw; font-size: 12.5px; }
753
865
  .aster-drill-heading { margin: 0; font-size: 14px; font-weight: var(--aster-weight-label); }
754
866
  .aster-drill-heading:focus-visible { outline: 2px solid var(--aster-focus); outline-offset: 2px; border-radius: 2px; }
755
867
  .aster-drill-viewport { position: relative; isolation: isolate; overflow: hidden; min-height: 48px; }
@@ -780,11 +892,13 @@
780
892
  .aster-grid-row[data-drop="ok"] > .aster-grid-cell { background: var(--aster-accent-soft); box-shadow: inset 0 -2px 0 var(--aster-accent); }
781
893
  .aster-grid-row[data-drop="refused"] > .aster-grid-cell { background: oklch(from var(--aster-negative) l c h / .08); cursor: not-allowed; }
782
894
  /* Tree grid: the first column's indent and opener. */
783
- .aster-grid-tree { display: inline-flex; align-items: center; flex: none; padding-left: calc(var(--level, 0) * 18px); margin-right: 4px; vertical-align: middle; }
895
+ .aster-grid-tree { display: inline-flex; align-items: center; flex: none; padding-left: calc(var(--level, 0) * var(--aster-grid-tree-indent)); margin-right: 4px; vertical-align: middle; }
784
896
  .aster-grid-opener { display: grid; place-items: center; width: 18px; height: 18px; border-radius: var(--aster-r-ctl); color: var(--aster-text-2); }
785
897
  button.aster-grid-opener:hover { background: var(--aster-accent-soft); color: var(--aster-text); }
786
898
  .aster-grid-opener svg { width: 10px; height: 10px; fill: none; stroke: currentColor; stroke-width: 1.4; transition: rotate var(--aster-t-micro) var(--aster-ease); }
787
899
  .aster-grid-opener[data-open] svg { rotate: 90deg; }
900
+ .aster-grid-tree-icon { display: inline-grid; place-items: center; flex: none; width: 18px; height: 18px; margin-inline-end: 4px; color: var(--aster-text-2); }
901
+ .aster-grid-tree-icon svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 1.4; }
788
902
  .aster-grid-note { font-size: 12.5px; color: var(--aster-text-2); }
789
903
  /* A popover under its toolbar button, aligned to the button's right edge. */
790
904
  .aster-grid-panel {
@@ -811,6 +925,7 @@
811
925
  .aster-grid-sort-panel li { gap: 8px; }
812
926
  .aster-grid-sort-name { flex: 1; min-width: 0; color: var(--aster-text-2); }
813
927
  .aster-grid-sort-title { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
928
+ .aster-grid-sort-reason { display: block; margin-top: 2px; font-size: 11px; color: var(--aster-text-3); overflow-wrap: anywhere; }
814
929
  .aster-grid-sort-panel li:has([aria-pressed="true"]) .aster-grid-sort-name { color: var(--aster-text); }
815
930
  .aster-grid-sort-actions { flex: none; display: flex; align-items: center; gap: 2px; }
816
931
  .aster-grid-sort-priority { width: 14px; flex: none; text-align: right; font-size: 10px; font-variant-numeric: tabular-nums; color: var(--aster-text-3); }
@@ -847,10 +962,42 @@
847
962
  min-width: 0; padding: var(--aster-pad-y) 12px; background: var(--aster-surface);
848
963
  overflow-wrap: anywhere; line-height: 1.4;
849
964
  }
965
+ /* Record rows keep at least a single line's height; the header, filter row,
966
+ group headers and the card layout set their own geometry. */
967
+ .aster-grid-row:not(.aster-grid-head, .aster-grid-filters, .aster-grid-group) > .aster-grid-cell { min-height: var(--aster-grid-row-min-height); }
968
+ .aster-grid-head .aster-grid-cell { min-height: var(--aster-grid-header-height); }
850
969
  .aster-grid-cell[data-numeric] { text-align: right; font-variant-numeric: tabular-nums; }
970
+ .aster-grid-cell[data-align="start"] { text-align: start; }
971
+ .aster-grid-cell[data-align="center"] { text-align: center; }
972
+ .aster-grid-cell[data-align="end"] { text-align: end; }
973
+ /* A row tone is a leading edge above the cells, never a background the cells cover. */
974
+ .aster-grid-row[data-tone]::before {
975
+ content: ""; position: absolute; inset-block: 0; inset-inline-start: 0; z-index: 3;
976
+ width: 3px; background: var(--aster-text-3); pointer-events: none;
977
+ }
978
+ .aster-grid-row[data-tone="positive"]::before { background: var(--aster-positive); }
979
+ .aster-grid-row[data-tone="caution"]::before { background: var(--aster-caution); }
980
+ .aster-grid-row[data-tone="negative"]::before { background: var(--aster-negative); }
981
+ @media (forced-colors: active) { .aster-grid-row[data-tone]::before { background: CanvasText; } }
851
982
  .aster-grid-cell[data-frozen] { position: sticky; z-index: 1; }
852
983
  .aster-grid-cell[data-frozen]:last-of-type, .aster-grid-cell[data-frozen]:has(+ :not([data-frozen])) { box-shadow: 1px 0 0 var(--aster-rule); }
853
984
  .aster-grid-row[aria-selected="true"] > .aster-grid-cell { background: color-mix(in oklch, var(--aster-accent-soft), var(--aster-surface)); }
985
+ /* Cell selection: mark the active column instead of the whole row. */
986
+ .aster-grid-scroll[data-selection-appearance="cell"] .aster-grid-row[aria-selected="true"] > .aster-grid-cell { background: var(--aster-surface); }
987
+ .aster-grid-scroll[data-selection-appearance="cell"] .aster-grid-cell[data-selected-cell] { background: color-mix(in oklch, var(--aster-accent-soft), var(--aster-surface)); }
988
+ .aster-grid-cell[data-tone="positive"] { background: color-mix(in oklch, var(--aster-positive) 9%, var(--aster-surface)); }
989
+ .aster-grid-cell[data-tone="caution"] { background: color-mix(in oklch, var(--aster-caution) 9%, var(--aster-surface)); }
990
+ .aster-grid-cell[data-tone="negative"] { background: color-mix(in oklch, var(--aster-negative) 9%, var(--aster-surface)); }
991
+ .aster-grid-cell[data-tone="neutral"] { background: color-mix(in oklch, var(--aster-text-3) 9%, var(--aster-surface)); }
992
+ /* The selection column: a leading, always-present track of its own. */
993
+ .aster-grid-cell.aster-grid-select {
994
+ position: sticky; left: 0; z-index: 1; display: grid; place-items: center; padding: 0;
995
+ background: var(--aster-surface); box-shadow: inset -1px 0 0 var(--aster-rule-2);
996
+ }
997
+ .aster-grid-head .aster-grid-cell.aster-grid-select { z-index: 3; }
998
+ .aster-grid-select input { width: 16px; height: 16px; margin: 0; accent-color: var(--aster-accent); cursor: pointer; }
999
+ .aster-grid-select input:focus-visible { outline: 2px solid var(--aster-focus); outline-offset: 2px; border-radius: 2px; }
1000
+ .aster-grid-select-rank { position: absolute; inset-inline-end: 2px; bottom: 1px; font-size: 10px; color: var(--aster-text-3); font-variant-numeric: tabular-nums; }
854
1001
  /* The header and filter row stick together. */
855
1002
  .aster-grid-headgroup { position: sticky; top: 0; z-index: 2; display: grid; grid-column: 1 / -1; grid-template-columns: subgrid; }
856
1003
  .aster-grid-head { border-bottom: 1px solid var(--aster-rule); }
@@ -864,6 +1011,7 @@
864
1011
  .aster-grid-resize::after { content: ""; position: absolute; top: 25%; bottom: 25%; left: 3px; width: 2px; border-radius: 1px; background: transparent; transition: background var(--aster-t-micro); }
865
1012
  .aster-grid-resize:hover::after { background: var(--aster-accent); }
866
1013
  .aster-grid-filters .aster-grid-cell { padding: 4px 6px; background: var(--aster-surface); }
1014
+ .aster-grid-filter-refused { display: inline-flex; align-items: center; height: var(--aster-ctl-tight); font-size: 12.5px; color: var(--aster-text-3); }
867
1015
  .aster-grid-filters .aster-field { height: var(--aster-ctl-tight); padding: 0 8px; font-size: 12.5px; }
868
1016
  .aster-grid-filters .aster-error { font-size: 11.5px; }
869
1017
  .aster-grid-sort {
@@ -871,6 +1019,9 @@
871
1019
  font-size: 12px; font-weight: var(--aster-weight-label); color: var(--aster-text-2);
872
1020
  }
873
1021
  .aster-grid-header[data-numeric] .aster-grid-sort { justify-content: flex-end; }
1022
+ .aster-grid-header[data-align="start"] .aster-grid-sort { justify-content: flex-start; }
1023
+ .aster-grid-header[data-align="center"] .aster-grid-sort { justify-content: center; }
1024
+ .aster-grid-header[data-align="end"] .aster-grid-sort { justify-content: flex-end; }
874
1025
  .aster-grid-sort:hover { color: var(--aster-text); }
875
1026
  .aster-grid-sort-mark { width: 10px; height: 10px; flex: none; fill: none; stroke: currentColor; stroke-width: 1.5; }
876
1027
  .aster-grid-sort small { font-size: 10px; color: var(--aster-text-3); }
@@ -895,6 +1046,10 @@
895
1046
  .aster-grid-row-note button { color: var(--aster-accent); font-weight: var(--aster-weight-strong); }
896
1047
  .aster-grid-skeleton { display: block; height: 10px; margin-block: 4px; border-radius: 3px; background: oklch(from var(--aster-text) l c h / .06); }
897
1048
  .aster-grid-empty { padding: 24px 14px; color: var(--aster-text-3); }
1049
+ .aster-grid-loading { padding: 24px 14px; color: var(--aster-text-2); }
1050
+ .aster-grid-failure { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px; padding: var(--aster-row-y) 12px; border-bottom: 1px solid var(--aster-rule-2); background: var(--aster-surface); color: var(--aster-negative); font-size: 12.5px; }
1051
+ .aster-grid-failure > span { flex: 1; min-width: 0; }
1052
+ .aster-grid-failure button { flex: none; color: var(--aster-accent); font-weight: var(--aster-weight-label); }
898
1053
 
899
1054
  /* Touch: larger targets, same look. */
900
1055
  @media (pointer: coarse) {
@@ -920,13 +1075,15 @@
920
1075
  .aster-grid-row:not(.aster-grid-head) { display: block; padding: calc(var(--aster-pad) - 4px) var(--aster-pad); border-bottom: 1px solid var(--aster-rule); }
921
1076
  .aster-grid-row:not(.aster-grid-head) > .aster-grid-cell {
922
1077
  position: static; display: grid; grid-template-columns: minmax(6.5rem, 34%) minmax(0, 1fr); gap: 8px;
923
- padding: 3px 0; box-shadow: none; text-align: left;
1078
+ min-height: 0; padding: 3px 0; box-shadow: none; text-align: left;
924
1079
  }
925
1080
  .aster-grid-row:not(.aster-grid-head) > .aster-grid-cell[data-numeric] { justify-content: initial; }
926
1081
  /* The card, not its cells, carries the row's background, so selection and drop targets cover its padding too. */
927
1082
  .aster-grid-row:not(.aster-grid-head) { background: var(--aster-surface); }
928
1083
  .aster-grid-row:not(.aster-grid-head) > .aster-grid-cell { background: none; }
929
1084
  .aster-grid-row[aria-selected="true"]:not(.aster-grid-head) { background: color-mix(in oklch, var(--aster-accent-soft), var(--aster-surface)); }
1085
+ .aster-grid-scroll[data-selection-appearance="cell"] .aster-grid-row[aria-selected="true"]:not(.aster-grid-head) { background: var(--aster-surface); }
1086
+ .aster-grid-row:not(.aster-grid-head) > .aster-grid-cell.aster-grid-select { position: static; box-shadow: none; padding: 3px 0; }
930
1087
  .aster-grid-row[data-drop="ok"]:not(.aster-grid-head) { background: var(--aster-accent-soft); box-shadow: inset 0 -2px 0 var(--aster-accent); }
931
1088
  .aster-grid-row[data-drop="refused"]:not(.aster-grid-head) { background: oklch(from var(--aster-negative) l c h / .08); }
932
1089
  .aster-grid-row:not(.aster-grid-head) > .aster-grid-cell[data-label]::before {
@@ -0,0 +1,93 @@
1
+ Copyright 2022 The Bricolage Grotesque Project Authors (https://github.com/ateliertriay/bricolage)
2
+
3
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
+ This license is copied below, and is also available with a FAQ at:
5
+ http://scripts.sil.org/OFL
6
+
7
+
8
+ -----------------------------------------------------------
9
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10
+ -----------------------------------------------------------
11
+
12
+ PREAMBLE
13
+ The goals of the Open Font License (OFL) are to stimulate worldwide
14
+ development of collaborative font projects, to support the font creation
15
+ efforts of academic and linguistic communities, and to provide a free and
16
+ open framework in which fonts may be shared and improved in partnership
17
+ with others.
18
+
19
+ The OFL allows the licensed fonts to be used, studied, modified and
20
+ redistributed freely as long as they are not sold by themselves. The
21
+ fonts, including any derivative works, can be bundled, embedded,
22
+ redistributed and/or sold with any software provided that any reserved
23
+ names are not used by derivative works. The fonts and derivatives,
24
+ however, cannot be released under any other type of license. The
25
+ requirement for fonts to remain under this license does not apply
26
+ to any document created using the fonts or their derivatives.
27
+
28
+ DEFINITIONS
29
+ "Font Software" refers to the set of files released by the Copyright
30
+ Holder(s) under this license and clearly marked as such. This may
31
+ include source files, build scripts and documentation.
32
+
33
+ "Reserved Font Name" refers to any names specified as such after the
34
+ copyright statement(s).
35
+
36
+ "Original Version" refers to the collection of Font Software components as
37
+ distributed by the Copyright Holder(s).
38
+
39
+ "Modified Version" refers to any derivative made by adding to, deleting,
40
+ or substituting -- in part or in whole -- any of the components of the
41
+ Original Version, by changing formats or by porting the Font Software to a
42
+ new environment.
43
+
44
+ "Author" refers to any designer, engineer, programmer, technical
45
+ writer or other person who contributed to the Font Software.
46
+
47
+ PERMISSION & CONDITIONS
48
+ Permission is hereby granted, free of charge, to any person obtaining
49
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
50
+ redistribute, and sell modified and unmodified copies of the Font
51
+ Software, subject to the following conditions:
52
+
53
+ 1) Neither the Font Software nor any of its individual components,
54
+ in Original or Modified Versions, may be sold by itself.
55
+
56
+ 2) Original or Modified Versions of the Font Software may be bundled,
57
+ redistributed and/or sold with any software, provided that each copy
58
+ contains the above copyright notice and this license. These can be
59
+ included either as stand-alone text files, human-readable headers or
60
+ in the appropriate machine-readable metadata fields within text or
61
+ binary files as long as those fields can be easily viewed by the user.
62
+
63
+ 3) No Modified Version of the Font Software may use the Reserved Font
64
+ Name(s) unless explicit written permission is granted by the corresponding
65
+ Copyright Holder. This restriction only applies to the primary font name as
66
+ presented to the users.
67
+
68
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69
+ Software shall not be used to promote, endorse or advertise any
70
+ Modified Version, except to acknowledge the contribution(s) of the
71
+ Copyright Holder(s) and the Author(s) or with their explicit written
72
+ permission.
73
+
74
+ 5) The Font Software, modified or unmodified, in part or in whole,
75
+ must be distributed entirely under this license, and must not be
76
+ distributed under any other license. The requirement for fonts to
77
+ remain under this license does not apply to any document created
78
+ using the Font Software.
79
+
80
+ TERMINATION
81
+ This license becomes null and void if any of the above conditions are
82
+ not met.
83
+
84
+ DISCLAIMER
85
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -0,0 +1,93 @@
1
+ Copyright 2020 The Fraunces Project Authors (github.com/undercasetype/Fraunces) Fraunces-Italic[SOFT,WONK,opsz,wght].ttf: Copyright 2020 The Fraunces Project Authors (github.com/undercasetype/Fraunces)
2
+
3
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
+ This license is copied below, and is also available with a FAQ at:
5
+ http://scripts.sil.org/OFL
6
+
7
+
8
+ -----------------------------------------------------------
9
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10
+ -----------------------------------------------------------
11
+
12
+ PREAMBLE
13
+ The goals of the Open Font License (OFL) are to stimulate worldwide
14
+ development of collaborative font projects, to support the font creation
15
+ efforts of academic and linguistic communities, and to provide a free and
16
+ open framework in which fonts may be shared and improved in partnership
17
+ with others.
18
+
19
+ The OFL allows the licensed fonts to be used, studied, modified and
20
+ redistributed freely as long as they are not sold by themselves. The
21
+ fonts, including any derivative works, can be bundled, embedded,
22
+ redistributed and/or sold with any software provided that any reserved
23
+ names are not used by derivative works. The fonts and derivatives,
24
+ however, cannot be released under any other type of license. The
25
+ requirement for fonts to remain under this license does not apply
26
+ to any document created using the fonts or their derivatives.
27
+
28
+ DEFINITIONS
29
+ "Font Software" refers to the set of files released by the Copyright
30
+ Holder(s) under this license and clearly marked as such. This may
31
+ include source files, build scripts and documentation.
32
+
33
+ "Reserved Font Name" refers to any names specified as such after the
34
+ copyright statement(s).
35
+
36
+ "Original Version" refers to the collection of Font Software components as
37
+ distributed by the Copyright Holder(s).
38
+
39
+ "Modified Version" refers to any derivative made by adding to, deleting,
40
+ or substituting -- in part or in whole -- any of the components of the
41
+ Original Version, by changing formats or by porting the Font Software to a
42
+ new environment.
43
+
44
+ "Author" refers to any designer, engineer, programmer, technical
45
+ writer or other person who contributed to the Font Software.
46
+
47
+ PERMISSION & CONDITIONS
48
+ Permission is hereby granted, free of charge, to any person obtaining
49
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
50
+ redistribute, and sell modified and unmodified copies of the Font
51
+ Software, subject to the following conditions:
52
+
53
+ 1) Neither the Font Software nor any of its individual components,
54
+ in Original or Modified Versions, may be sold by itself.
55
+
56
+ 2) Original or Modified Versions of the Font Software may be bundled,
57
+ redistributed and/or sold with any software, provided that each copy
58
+ contains the above copyright notice and this license. These can be
59
+ included either as stand-alone text files, human-readable headers or
60
+ in the appropriate machine-readable metadata fields within text or
61
+ binary files as long as those fields can be easily viewed by the user.
62
+
63
+ 3) No Modified Version of the Font Software may use the Reserved Font
64
+ Name(s) unless explicit written permission is granted by the corresponding
65
+ Copyright Holder. This restriction only applies to the primary font name as
66
+ presented to the users.
67
+
68
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69
+ Software shall not be used to promote, endorse or advertise any
70
+ Modified Version, except to acknowledge the contribution(s) of the
71
+ Copyright Holder(s) and the Author(s) or with their explicit written
72
+ permission.
73
+
74
+ 5) The Font Software, modified or unmodified, in part or in whole,
75
+ must be distributed entirely under this license, and must not be
76
+ distributed under any other license. The requirement for fonts to
77
+ remain under this license does not apply to any document created
78
+ using the Font Software.
79
+
80
+ TERMINATION
81
+ This license becomes null and void if any of the above conditions are
82
+ not met.
83
+
84
+ DISCLAIMER
85
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -0,0 +1,17 @@
1
+ /* The faces Lamplight names, Latin subsets only. Bun's CSS minifier drops the
2
+ `+` from `unicode-range`, so the files are declared per subset instead; it
3
+ also unquotes `format("woff2")`, which stays valid. */
4
+ @font-face {
5
+ font-family: "Bricolage Grotesque Variable";
6
+ font-style: normal;
7
+ font-display: swap;
8
+ font-weight: 200 800;
9
+ src: url("./fonts/bricolage-grotesque-latin-opsz-normal.woff2") format("woff2");
10
+ }
11
+ @font-face {
12
+ font-family: "Fraunces Variable";
13
+ font-style: normal;
14
+ font-display: swap;
15
+ font-weight: 100 900;
16
+ src: url("./fonts/fraunces-latin-full-normal.woff2") format("woff2");
17
+ }
@@ -0,0 +1,5 @@
1
+ /* Harbour in one import: base primitives, element styles, identity. It uses
2
+ system rounded type, so it needs no font files. */
3
+ @import "./base.css";
4
+ @import "./elements.css";
5
+ @import "./harbour.css";
@@ -0,0 +1,5 @@
1
+ /* Lamplight in one import: faces, base primitives, element styles, identity. */
2
+ @import "./fonts.css";
3
+ @import "./base.css";
4
+ @import "./elements.css";
5
+ @import "./lamplight.css";