@cahyo-dimas/freeday 1.33.0 → 1.34.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 +117 -0
- package/COMPONENTS.md +26 -2
- package/README.id.md +1 -1
- package/README.md +1 -1
- package/adapters/blazor/FdyTable.razor +2 -35
- package/adapters/blazor/FdyTable.razor.cs +56 -9
- package/adapters/blazor/FdyTableFooter.razor +60 -0
- package/adapters/blazor/FdyTableFooter.razor.cs +59 -0
- package/adapters/blazor/TableModel.cs +12 -0
- package/adapters/core/table-model.d.ts +2 -0
- package/adapters/core/table-model.js +21 -0
- package/adapters/react/components/FdyAutocomplete.tsx +1 -1
- package/adapters/react/components/FdyCascade.tsx +2 -2
- package/adapters/react/components/FdyCfl.tsx +25 -11
- package/adapters/react/components/FdyTable.tsx +49 -33
- package/adapters/react/components/FdyTableFooter.tsx +102 -0
- package/adapters/react/index.d.ts +3 -0
- package/adapters/react/index.js +1 -0
- package/adapters/vue/components/FdyAutocomplete.vue +1 -1
- package/adapters/vue/components/FdyCascade.vue +2 -2
- package/adapters/vue/components/FdyCfl.vue +25 -11
- package/adapters/vue/components/FdyTable.vue +51 -46
- package/adapters/vue/components/FdyTableFooter.vue +121 -0
- package/adapters/vue/index.d.ts +3 -0
- package/adapters/vue/index.js +1 -0
- package/dist/freeday-table.js +24 -1
- package/dist/freeday.bundle.css +29 -13
- package/dist/freeday.css +29 -13
- package/dist/freeday.js +24 -1
- package/docs/agent-onboarding.md +2 -0
- package/docs/getting-started.md +1 -1
- package/package.json +29 -8
- package/src/components/alert.css +1 -1
- package/src/components/app-shell.css +2 -2
- package/src/components/cfl.css +1 -1
- package/src/components/composition.css +1 -1
- package/src/components/datepicker.css +8 -4
- package/src/components/file-upload.css +1 -1
- package/src/components/list.css +1 -1
- package/src/components/states.css +1 -1
- package/src/components/table.css +12 -0
- package/src/components/toast.css +1 -1
package/adapters/vue/index.d.ts
CHANGED
|
@@ -35,6 +35,9 @@ export type { CascadeNode } from './components/FdyCascade.vue';
|
|
|
35
35
|
export { default as FdyCfl } from './components/FdyCfl.vue';
|
|
36
36
|
export { default as FdyChart } from './components/FdyChart.vue';
|
|
37
37
|
export { default as FdyTable } from './components/FdyTable.vue';
|
|
38
|
+
/** The table's own footer, standalone — for a responsive list whose table is hidden at some
|
|
39
|
+
* breakpoints and so cannot host it. */
|
|
40
|
+
export { default as FdyTableFooter } from './components/FdyTableFooter.vue';
|
|
38
41
|
export { default as FdyModal } from './components/FdyModal.vue';
|
|
39
42
|
export { default as FdyDrawer } from './components/FdyDrawer.vue';
|
|
40
43
|
|
package/adapters/vue/index.js
CHANGED
|
@@ -8,5 +8,6 @@ export { default as FdyCascade } from './components/FdyCascade.vue';
|
|
|
8
8
|
export { default as FdyCfl } from './components/FdyCfl.vue';
|
|
9
9
|
export { default as FdyChart } from './components/FdyChart.vue';
|
|
10
10
|
export { default as FdyTable } from './components/FdyTable.vue';
|
|
11
|
+
export { default as FdyTableFooter } from './components/FdyTableFooter.vue';
|
|
11
12
|
export { default as FdyModal } from './components/FdyModal.vue';
|
|
12
13
|
export { default as FdyDrawer } from './components/FdyDrawer.vue';
|
package/dist/freeday-table.js
CHANGED
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
* a `<table class="fdy-table">` whose sortable headers hold
|
|
9
9
|
* `<button class="fdy-table__sortbtn" data-fdy-sort[="number"]>`, optional
|
|
10
10
|
* selection checkboxes (`[data-fdy-select-all]`, `[data-fdy-row-select]`), and a
|
|
11
|
-
* `.fdy-table-footer` (with `[data-fdy-table-info]`, `[data-fdy-table-pagination]
|
|
11
|
+
* `.fdy-table-footer` (with `[data-fdy-table-info]`, `[data-fdy-table-pagination]`, and an
|
|
12
|
+
* optional `<select data-fdy-table-page-size>` whose options are row counts).
|
|
12
13
|
* Numeric columns should give each cell a `data-sort-value`.
|
|
13
14
|
*
|
|
14
15
|
* Column filters: mark a header `<th data-fdy-filter="text|enum|number">` and a funnel
|
|
@@ -44,6 +45,7 @@
|
|
|
44
45
|
var countEl = root.querySelector('[data-fdy-table-count]');
|
|
45
46
|
var infoEl = root.querySelector('[data-fdy-table-info]');
|
|
46
47
|
var pagerEl = root.querySelector('[data-fdy-table-pagination]');
|
|
48
|
+
var pageSizeEl = root.querySelector('[data-fdy-table-page-size]');
|
|
47
49
|
var selectAll = root.querySelector('[data-fdy-select-all]');
|
|
48
50
|
var pageSize = parseInt(root.getAttribute('data-page-size'), 10) || 0; // 0 = no pagination
|
|
49
51
|
|
|
@@ -440,6 +442,27 @@
|
|
|
440
442
|
updateBulk();
|
|
441
443
|
});
|
|
442
444
|
|
|
445
|
+
/* Rows per page. The select is app-authored markup (its options ARE the offer), so this only
|
|
446
|
+
* wires it: adopt whatever it currently shows, and on a change keep the reader on the row they
|
|
447
|
+
* were looking at rather than sending them back to page 1. */
|
|
448
|
+
if (pageSizeEl) {
|
|
449
|
+
var chosen = parseInt(pageSizeEl.value, 10);
|
|
450
|
+
if (chosen > 0) pageSize = chosen;
|
|
451
|
+
var onPageSize = function (e) {
|
|
452
|
+
var raw = (e && e.detail && e.detail.value != null) ? e.detail.value : pageSizeEl.value;
|
|
453
|
+
var next = parseInt(raw, 10);
|
|
454
|
+
if (!(next > 0) || next === pageSize) return;
|
|
455
|
+
var firstRow = (page - 1) * pageSize;
|
|
456
|
+
pageSize = next;
|
|
457
|
+
page = Math.floor(firstRow / next) + 1;
|
|
458
|
+
render();
|
|
459
|
+
};
|
|
460
|
+
/* Both kinds: a native <select> fires `change`, and `.fdy-combo` (freeday-select.js) fires
|
|
461
|
+
* `fdy-change` with the value in `detail`. A raw page may use either. */
|
|
462
|
+
pageSizeEl.addEventListener('change', onPageSize);
|
|
463
|
+
pageSizeEl.addEventListener('fdy-change', onPageSize);
|
|
464
|
+
}
|
|
465
|
+
|
|
443
466
|
if (bulkClear) bulkClear.addEventListener('click', clearSelection);
|
|
444
467
|
|
|
445
468
|
// Dismiss an open filter popover on outside click or Escape.
|
package/dist/freeday.bundle.css
CHANGED
|
@@ -446,7 +446,7 @@ a { color: var(--color-primary); }
|
|
|
446
446
|
.fdy-alert__icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;margin-top:.05rem;}
|
|
447
447
|
.fdy-alert__icon svg{width:100%;height:100%;}
|
|
448
448
|
.fdy-alert__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:var(--space-1);}
|
|
449
|
-
.fdy-alert__title{font-weight:var(--weight-semibold);color:var(--color-text);}
|
|
449
|
+
.fdy-alert__title{font-size:inherit;font-weight:var(--weight-semibold);color:var(--color-text);margin:0;}
|
|
450
450
|
.fdy-alert__text{color:var(--color-text);line-height:var(--leading-normal);}
|
|
451
451
|
.fdy-alert__close{flex:none;align-self:flex-start;border:0;background:transparent;color:var(--color-text-muted);cursor:pointer;font-size:var(--text-lg);line-height:1;padding:0 var(--space-1);border-radius:var(--radius-sm);}
|
|
452
452
|
.fdy-alert__close:hover{color:var(--color-text);}
|
|
@@ -483,8 +483,8 @@ a { color: var(--color-primary); }
|
|
|
483
483
|
.fdy-app__brand-mark{flex:none;width:1.5rem;height:1.5rem;}
|
|
484
484
|
.fdy-app__brand-mark svg{display:block;width:100%;height:100%;}
|
|
485
485
|
.fdy-app__brand-text{display:flex;flex-direction:column;min-width:0;}
|
|
486
|
-
.fdy-app__brand-title{display:block;font-family:var(--font-display);font-weight:var(--weight-bold);font-size:var(--text-lg);color:var(--color-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
487
|
-
.fdy-app__brand-subtitle{display:block;font-size:var(--text-xs);font-weight:var(--weight-regular);color:var(--color-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
486
|
+
.fdy-app__brand-title{display:block;font-family:var(--font-display);font-weight:var(--weight-bold);font-size:var(--text-lg);color:var(--color-text);margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
487
|
+
.fdy-app__brand-subtitle{display:block;font-size:var(--text-xs);font-weight:var(--weight-regular);color:var(--color-text-muted);margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
488
488
|
.fdy-nav{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:2px;padding:var(--space-3) var(--space-3) var(--space-6);}
|
|
489
489
|
/* Horizontal variant — the SAME nav links laid out as a row, for a top-nav application (one that
|
|
490
490
|
* puts its primary navigation in `.fdy-appbar` / `.fdy-app__topbar` and has no sidebar). Deliberately
|
|
@@ -901,7 +901,7 @@ a { color: var(--color-primary); }
|
|
|
901
901
|
.fdy-cfl__check input{pointer-events:none;}
|
|
902
902
|
|
|
903
903
|
/* Empty result state. */
|
|
904
|
-
.fdy-cfl__empty{padding:var(--space-8) var(--space-5);text-align:center;color:var(--color-text-muted);font-size:var(--text-sm);}
|
|
904
|
+
.fdy-cfl__empty{padding:var(--space-8) var(--space-5);text-align:center;color:var(--color-text-muted);font-size:var(--text-sm);margin:0;}
|
|
905
905
|
.fdy-cfl__empty[hidden]{display:none;}
|
|
906
906
|
|
|
907
907
|
/* Footer — selection count (multi) sits left, actions right. */
|
|
@@ -1051,7 +1051,7 @@ a { color: var(--color-primary); }
|
|
|
1051
1051
|
prose. -subtle is gated at 3.0 on purpose (placeholders, separators, decorative glyphs) and
|
|
1052
1052
|
measures 4.41 on the page ground — axe reports it as a serious color-contrast failure. Same
|
|
1053
1053
|
argument, same ink, same 4.41 as .fdy-stat__label in 1.30.0. */
|
|
1054
|
-
.fdy-eyebrow{font-family:var(--font-body);font-size:var(--text-xs);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-wide);text-transform:uppercase;color:var(--color-text-muted);}
|
|
1054
|
+
.fdy-eyebrow{font-family:var(--font-body);font-size:var(--text-xs);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-wide);text-transform:uppercase;color:var(--color-text-muted);margin:0;}
|
|
1055
1055
|
.fdy-title-page{font-family:var(--font-display);font-size:var(--text-3xl);font-weight:var(--weight-bold);letter-spacing:var(--tracking-tighter);line-height:var(--leading-tight);color:var(--color-text);margin:0;text-wrap:balance;}
|
|
1056
1056
|
.fdy-title-section{font-family:var(--font-display);font-size:var(--text-xl);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight);line-height:var(--leading-snug);color:var(--color-text);margin:0;text-wrap:balance;}
|
|
1057
1057
|
.fdy-title-card{font-family:var(--font-display);font-size:var(--text-lg);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight);color:var(--color-text);margin:0;}
|
|
@@ -1142,12 +1142,9 @@ a { color: var(--color-primary); }
|
|
|
1142
1142
|
.fdy-cal__head{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-2);}
|
|
1143
1143
|
/* The title is a CONTROL now (#004 §1): it drills to the month grid, so it needs the UA button box
|
|
1144
1144
|
reset and the same hover/focus treatment as the arrows beside it. */
|
|
1145
|
-
.fdy-cal__title{flex:1;appearance:none;border:0;background:transparent;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);text-align:center;font-family:inherit;font-weight:var(--weight-semibold);font-size:var(--text-sm);color:var(--color-text);text-transform:capitalize;cursor:pointer;}
|
|
1145
|
+
.fdy-cal__title{flex:1;appearance:none;border:0;background:transparent;margin:0;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);text-align:center;font-family:inherit;font-weight:var(--weight-semibold);font-size:var(--text-sm);color:var(--color-text);text-transform:capitalize;cursor:pointer;}
|
|
1146
1146
|
.fdy-cal__title:hover{background:var(--color-surface-2);}
|
|
1147
1147
|
.fdy-cal__title:focus-visible{outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary) 26%,transparent);}
|
|
1148
|
-
/* Month grid — 3×4 over the same track width as the 7-column day grid, so the panel does not resize
|
|
1149
|
-
when you drill and the pointer does not have to travel. */
|
|
1150
|
-
.fdy-cal__grid--months{grid-template-columns:repeat(3,1fr);gap:var(--space-1);}
|
|
1151
1148
|
.fdy-cal__month{display:inline-flex;align-items:center;justify-content:center;height:2.25rem;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--color-text);font-family:inherit;font-size:var(--text-sm);text-transform:capitalize;cursor:pointer;}
|
|
1152
1149
|
.fdy-cal__month:hover{background:var(--color-surface-2);}
|
|
1153
1150
|
.fdy-cal__month:focus-visible{outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary) 26%,transparent);}
|
|
@@ -1158,6 +1155,13 @@ a { color: var(--color-primary); }
|
|
|
1158
1155
|
.fdy-cal__nav:hover{background:var(--color-surface-2);color:var(--color-text);}
|
|
1159
1156
|
.fdy-cal__nav:focus-visible{outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary) 26%,transparent);}
|
|
1160
1157
|
.fdy-cal__grid{display:grid;grid-template-columns:repeat(7,2rem);gap:2px;}
|
|
1158
|
+
/* Month grid — 3×4 over the same track width as the 7-column day grid, so the panel does not resize
|
|
1159
|
+
when you drill and the pointer does not have to travel.
|
|
1160
|
+
|
|
1161
|
+
AFTER `.fdy-cal__grid`, and that is the whole rule: the element carries both classes, they weigh
|
|
1162
|
+
the same, so source order decides. Declared earlier, the modifier lost to the base it modifies and
|
|
1163
|
+
twelve months rendered seven across — the layout the comment above described, never once applied. */
|
|
1164
|
+
.fdy-cal__grid--months{grid-template-columns:repeat(3,1fr);gap:var(--space-1);}
|
|
1161
1165
|
.fdy-cal__dow{display:flex;align-items:center;justify-content:center;height:1.75rem;font-size:var(--text-xs);font-weight:var(--weight-semibold);color:var(--color-text-muted);text-transform:capitalize;}
|
|
1162
1166
|
.fdy-cal__day{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--color-text);font-size:var(--text-sm);font-variant-numeric:tabular-nums;cursor:pointer;}
|
|
1163
1167
|
.fdy-cal__day:hover{background:var(--color-surface-2);}
|
|
@@ -1238,7 +1242,7 @@ a { color: var(--color-primary); }
|
|
|
1238
1242
|
.fdy-dropzone__icon{color:var(--color-text-subtle);}
|
|
1239
1243
|
.fdy-dropzone.is-dragover .fdy-dropzone__icon{color:var(--color-primary);}
|
|
1240
1244
|
.fdy-dropzone__icon svg{display:block;width:2rem;height:2rem;}
|
|
1241
|
-
.fdy-dropzone__title{font-weight:var(--weight-medium);color:var(--color-text);}
|
|
1245
|
+
.fdy-dropzone__title{font-size:inherit;font-weight:var(--weight-medium);color:var(--color-text);margin:0;}
|
|
1242
1246
|
.fdy-dropzone__hint{font-size:var(--text-xs);}
|
|
1243
1247
|
/* Wide (horizontal) layout — icon beside the copy instead of stacked, for full-width
|
|
1244
1248
|
* sections. Wrap the title + hint in .fdy-dropzone__text. */
|
|
@@ -1425,7 +1429,7 @@ fieldset.fdy-field>legend{padding:0;float:none;margin-bottom:var(--space-2);}
|
|
|
1425
1429
|
.fdy-list__row--button:disabled:hover,.fdy-list__row--button[aria-disabled="true"]:hover,.fdy-list__row--interactive[aria-disabled="true"]:hover{background:none;}
|
|
1426
1430
|
/* Row internals: a title/meta stack that truncates, and a trailing slot pinned right. */
|
|
1427
1431
|
.fdy-list__main{display:flex;flex-direction:column;gap:var(--space-1);min-width:0;flex:1;}
|
|
1428
|
-
.fdy-list__title{font-weight:var(--weight-medium);color:var(--color-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
1432
|
+
.fdy-list__title{font-family:var(--font-body);font-size:var(--text-base);font-weight:var(--weight-medium);letter-spacing:normal;color:var(--color-text);margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
1429
1433
|
.fdy-list__meta{font-size:var(--text-sm);color:var(--color-text-muted);display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;}
|
|
1430
1434
|
.fdy-list__aside{flex:none;display:flex;align-items:center;gap:var(--space-2);}
|
|
1431
1435
|
/* Density: rows tighten with the rest of the kit (--space-* mid-range steps under compact). */
|
|
@@ -1582,7 +1586,7 @@ fieldset.fdy-field>legend{padding:0;float:none;margin-bottom:var(--space-2);}
|
|
|
1582
1586
|
.fdy-state{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--space-2);padding:var(--space-10) var(--space-6);}
|
|
1583
1587
|
.fdy-state__icon{display:inline-flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;color:var(--color-text-subtle);}
|
|
1584
1588
|
.fdy-state__icon svg{width:100%;height:100%;}
|
|
1585
|
-
.fdy-state__title{font-family:var(--font-display);font-size:var(--text-lg);font-weight:var(--weight-semibold);color:var(--color-text);}
|
|
1589
|
+
.fdy-state__title{font-family:var(--font-display);font-size:var(--text-lg);font-weight:var(--weight-semibold);color:var(--color-text);margin:0;}
|
|
1586
1590
|
.fdy-state__text{font-size:var(--text-sm);color:var(--color-text-muted);max-width:24rem;line-height:var(--leading-normal);}
|
|
1587
1591
|
.fdy-state__actions{margin-top:var(--space-2);display:flex;gap:var(--space-2);flex-wrap:wrap;justify-content:center;}
|
|
1588
1592
|
.fdy-state--danger .fdy-state__icon{color:var(--color-danger-strong);}
|
|
@@ -1662,6 +1666,18 @@ fieldset.fdy-field>legend{padding:0;float:none;margin-bottom:var(--space-2);}
|
|
|
1662
1666
|
.fdy-table-toolbar__count{font-size:var(--text-sm);color:var(--color-text-muted);white-space:nowrap;}
|
|
1663
1667
|
.fdy-table-footer{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);flex-wrap:wrap;padding:var(--space-3) var(--space-4);border-top:var(--bw) solid var(--color-border);}
|
|
1664
1668
|
.fdy-table-footer__info{font-size:var(--text-sm);color:var(--color-text-muted);}
|
|
1669
|
+
/* Rows per page. `margin-left:auto` eats the free space, so the size control and the pager travel
|
|
1670
|
+
together on the right while the range stays left — no wrapper element, which is what keeps the
|
|
1671
|
+
footer's DOM byte-identical for the tables that don't offer one (#008). The control is the kit's
|
|
1672
|
+
own `.fdy-combo`, never a native <select>: an OS menu is unthemeable, and on macOS it drops a
|
|
1673
|
+
dark panel into a light page — which is the reason FdyCombo exists at all. Sized to its content:
|
|
1674
|
+
`.fdy-combo` is display:block at max-width 22rem, which in a footer is a bar-wide box for two
|
|
1675
|
+
digits. Its HEIGHT is left alone on purpose — `--control-h`, the same as every other control on
|
|
1676
|
+
the page. It briefly carried 2.25rem to match the pager links beside it, which made the one
|
|
1677
|
+
combobox in a compact app 4px taller than all the others; a pager link is a nav button, and the
|
|
1678
|
+
thing this must agree with is the form controls. */
|
|
1679
|
+
.fdy-table-footer__size{display:inline-flex;align-items:center;gap:var(--space-2);margin-left:auto;font-size:var(--text-sm);color:var(--color-text-muted);}
|
|
1680
|
+
.fdy-table-footer__size .fdy-combo{width:5.5rem;}
|
|
1665
1681
|
|
|
1666
1682
|
/* Column filter — funnel button injected (enhancer) or rendered (FdyTable) into a filterable <th> */
|
|
1667
1683
|
.fdy-table__filterwrap{display:inline-flex;align-items:center;vertical-align:middle;}
|
|
@@ -1753,7 +1769,7 @@ fieldset.fdy-field>legend{padding:0;float:none;margin-bottom:var(--space-2);}
|
|
|
1753
1769
|
.fdy-toast--danger .fdy-toast__accent{background:var(--color-danger);}
|
|
1754
1770
|
.fdy-toast--info .fdy-toast__accent{background:var(--color-info);}
|
|
1755
1771
|
.fdy-toast__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:var(--space-1);font-size:var(--text-sm);}
|
|
1756
|
-
.fdy-toast__title{font-weight:var(--weight-semibold);}
|
|
1772
|
+
.fdy-toast__title{font-size:inherit;font-weight:var(--weight-semibold);margin:0;}
|
|
1757
1773
|
.fdy-toast__text{opacity:.88;line-height:var(--leading-normal);}
|
|
1758
1774
|
.fdy-toast__close{flex:none;border:0;background:transparent;color:var(--color-inverse-text);opacity:.7;cursor:pointer;font-size:var(--text-lg);line-height:1;padding:0 var(--space-1);border-radius:var(--radius-sm);}
|
|
1759
1775
|
.fdy-toast__close:hover{opacity:1;}
|
package/dist/freeday.css
CHANGED
|
@@ -63,7 +63,7 @@ a { color: var(--color-primary); }
|
|
|
63
63
|
.fdy-alert__icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;margin-top:.05rem;}
|
|
64
64
|
.fdy-alert__icon svg{width:100%;height:100%;}
|
|
65
65
|
.fdy-alert__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:var(--space-1);}
|
|
66
|
-
.fdy-alert__title{font-weight:var(--weight-semibold);color:var(--color-text);}
|
|
66
|
+
.fdy-alert__title{font-size:inherit;font-weight:var(--weight-semibold);color:var(--color-text);margin:0;}
|
|
67
67
|
.fdy-alert__text{color:var(--color-text);line-height:var(--leading-normal);}
|
|
68
68
|
.fdy-alert__close{flex:none;align-self:flex-start;border:0;background:transparent;color:var(--color-text-muted);cursor:pointer;font-size:var(--text-lg);line-height:1;padding:0 var(--space-1);border-radius:var(--radius-sm);}
|
|
69
69
|
.fdy-alert__close:hover{color:var(--color-text);}
|
|
@@ -100,8 +100,8 @@ a { color: var(--color-primary); }
|
|
|
100
100
|
.fdy-app__brand-mark{flex:none;width:1.5rem;height:1.5rem;}
|
|
101
101
|
.fdy-app__brand-mark svg{display:block;width:100%;height:100%;}
|
|
102
102
|
.fdy-app__brand-text{display:flex;flex-direction:column;min-width:0;}
|
|
103
|
-
.fdy-app__brand-title{display:block;font-family:var(--font-display);font-weight:var(--weight-bold);font-size:var(--text-lg);color:var(--color-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
104
|
-
.fdy-app__brand-subtitle{display:block;font-size:var(--text-xs);font-weight:var(--weight-regular);color:var(--color-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
103
|
+
.fdy-app__brand-title{display:block;font-family:var(--font-display);font-weight:var(--weight-bold);font-size:var(--text-lg);color:var(--color-text);margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
104
|
+
.fdy-app__brand-subtitle{display:block;font-size:var(--text-xs);font-weight:var(--weight-regular);color:var(--color-text-muted);margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
105
105
|
.fdy-nav{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:2px;padding:var(--space-3) var(--space-3) var(--space-6);}
|
|
106
106
|
/* Horizontal variant — the SAME nav links laid out as a row, for a top-nav application (one that
|
|
107
107
|
* puts its primary navigation in `.fdy-appbar` / `.fdy-app__topbar` and has no sidebar). Deliberately
|
|
@@ -518,7 +518,7 @@ a { color: var(--color-primary); }
|
|
|
518
518
|
.fdy-cfl__check input{pointer-events:none;}
|
|
519
519
|
|
|
520
520
|
/* Empty result state. */
|
|
521
|
-
.fdy-cfl__empty{padding:var(--space-8) var(--space-5);text-align:center;color:var(--color-text-muted);font-size:var(--text-sm);}
|
|
521
|
+
.fdy-cfl__empty{padding:var(--space-8) var(--space-5);text-align:center;color:var(--color-text-muted);font-size:var(--text-sm);margin:0;}
|
|
522
522
|
.fdy-cfl__empty[hidden]{display:none;}
|
|
523
523
|
|
|
524
524
|
/* Footer — selection count (multi) sits left, actions right. */
|
|
@@ -668,7 +668,7 @@ a { color: var(--color-primary); }
|
|
|
668
668
|
prose. -subtle is gated at 3.0 on purpose (placeholders, separators, decorative glyphs) and
|
|
669
669
|
measures 4.41 on the page ground — axe reports it as a serious color-contrast failure. Same
|
|
670
670
|
argument, same ink, same 4.41 as .fdy-stat__label in 1.30.0. */
|
|
671
|
-
.fdy-eyebrow{font-family:var(--font-body);font-size:var(--text-xs);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-wide);text-transform:uppercase;color:var(--color-text-muted);}
|
|
671
|
+
.fdy-eyebrow{font-family:var(--font-body);font-size:var(--text-xs);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-wide);text-transform:uppercase;color:var(--color-text-muted);margin:0;}
|
|
672
672
|
.fdy-title-page{font-family:var(--font-display);font-size:var(--text-3xl);font-weight:var(--weight-bold);letter-spacing:var(--tracking-tighter);line-height:var(--leading-tight);color:var(--color-text);margin:0;text-wrap:balance;}
|
|
673
673
|
.fdy-title-section{font-family:var(--font-display);font-size:var(--text-xl);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight);line-height:var(--leading-snug);color:var(--color-text);margin:0;text-wrap:balance;}
|
|
674
674
|
.fdy-title-card{font-family:var(--font-display);font-size:var(--text-lg);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight);color:var(--color-text);margin:0;}
|
|
@@ -759,12 +759,9 @@ a { color: var(--color-primary); }
|
|
|
759
759
|
.fdy-cal__head{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-2);}
|
|
760
760
|
/* The title is a CONTROL now (#004 §1): it drills to the month grid, so it needs the UA button box
|
|
761
761
|
reset and the same hover/focus treatment as the arrows beside it. */
|
|
762
|
-
.fdy-cal__title{flex:1;appearance:none;border:0;background:transparent;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);text-align:center;font-family:inherit;font-weight:var(--weight-semibold);font-size:var(--text-sm);color:var(--color-text);text-transform:capitalize;cursor:pointer;}
|
|
762
|
+
.fdy-cal__title{flex:1;appearance:none;border:0;background:transparent;margin:0;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);text-align:center;font-family:inherit;font-weight:var(--weight-semibold);font-size:var(--text-sm);color:var(--color-text);text-transform:capitalize;cursor:pointer;}
|
|
763
763
|
.fdy-cal__title:hover{background:var(--color-surface-2);}
|
|
764
764
|
.fdy-cal__title:focus-visible{outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary) 26%,transparent);}
|
|
765
|
-
/* Month grid — 3×4 over the same track width as the 7-column day grid, so the panel does not resize
|
|
766
|
-
when you drill and the pointer does not have to travel. */
|
|
767
|
-
.fdy-cal__grid--months{grid-template-columns:repeat(3,1fr);gap:var(--space-1);}
|
|
768
765
|
.fdy-cal__month{display:inline-flex;align-items:center;justify-content:center;height:2.25rem;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--color-text);font-family:inherit;font-size:var(--text-sm);text-transform:capitalize;cursor:pointer;}
|
|
769
766
|
.fdy-cal__month:hover{background:var(--color-surface-2);}
|
|
770
767
|
.fdy-cal__month:focus-visible{outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary) 26%,transparent);}
|
|
@@ -775,6 +772,13 @@ a { color: var(--color-primary); }
|
|
|
775
772
|
.fdy-cal__nav:hover{background:var(--color-surface-2);color:var(--color-text);}
|
|
776
773
|
.fdy-cal__nav:focus-visible{outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary) 26%,transparent);}
|
|
777
774
|
.fdy-cal__grid{display:grid;grid-template-columns:repeat(7,2rem);gap:2px;}
|
|
775
|
+
/* Month grid — 3×4 over the same track width as the 7-column day grid, so the panel does not resize
|
|
776
|
+
when you drill and the pointer does not have to travel.
|
|
777
|
+
|
|
778
|
+
AFTER `.fdy-cal__grid`, and that is the whole rule: the element carries both classes, they weigh
|
|
779
|
+
the same, so source order decides. Declared earlier, the modifier lost to the base it modifies and
|
|
780
|
+
twelve months rendered seven across — the layout the comment above described, never once applied. */
|
|
781
|
+
.fdy-cal__grid--months{grid-template-columns:repeat(3,1fr);gap:var(--space-1);}
|
|
778
782
|
.fdy-cal__dow{display:flex;align-items:center;justify-content:center;height:1.75rem;font-size:var(--text-xs);font-weight:var(--weight-semibold);color:var(--color-text-muted);text-transform:capitalize;}
|
|
779
783
|
.fdy-cal__day{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--color-text);font-size:var(--text-sm);font-variant-numeric:tabular-nums;cursor:pointer;}
|
|
780
784
|
.fdy-cal__day:hover{background:var(--color-surface-2);}
|
|
@@ -855,7 +859,7 @@ a { color: var(--color-primary); }
|
|
|
855
859
|
.fdy-dropzone__icon{color:var(--color-text-subtle);}
|
|
856
860
|
.fdy-dropzone.is-dragover .fdy-dropzone__icon{color:var(--color-primary);}
|
|
857
861
|
.fdy-dropzone__icon svg{display:block;width:2rem;height:2rem;}
|
|
858
|
-
.fdy-dropzone__title{font-weight:var(--weight-medium);color:var(--color-text);}
|
|
862
|
+
.fdy-dropzone__title{font-size:inherit;font-weight:var(--weight-medium);color:var(--color-text);margin:0;}
|
|
859
863
|
.fdy-dropzone__hint{font-size:var(--text-xs);}
|
|
860
864
|
/* Wide (horizontal) layout — icon beside the copy instead of stacked, for full-width
|
|
861
865
|
* sections. Wrap the title + hint in .fdy-dropzone__text. */
|
|
@@ -1042,7 +1046,7 @@ fieldset.fdy-field>legend{padding:0;float:none;margin-bottom:var(--space-2);}
|
|
|
1042
1046
|
.fdy-list__row--button:disabled:hover,.fdy-list__row--button[aria-disabled="true"]:hover,.fdy-list__row--interactive[aria-disabled="true"]:hover{background:none;}
|
|
1043
1047
|
/* Row internals: a title/meta stack that truncates, and a trailing slot pinned right. */
|
|
1044
1048
|
.fdy-list__main{display:flex;flex-direction:column;gap:var(--space-1);min-width:0;flex:1;}
|
|
1045
|
-
.fdy-list__title{font-weight:var(--weight-medium);color:var(--color-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
1049
|
+
.fdy-list__title{font-family:var(--font-body);font-size:var(--text-base);font-weight:var(--weight-medium);letter-spacing:normal;color:var(--color-text);margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
1046
1050
|
.fdy-list__meta{font-size:var(--text-sm);color:var(--color-text-muted);display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;}
|
|
1047
1051
|
.fdy-list__aside{flex:none;display:flex;align-items:center;gap:var(--space-2);}
|
|
1048
1052
|
/* Density: rows tighten with the rest of the kit (--space-* mid-range steps under compact). */
|
|
@@ -1199,7 +1203,7 @@ fieldset.fdy-field>legend{padding:0;float:none;margin-bottom:var(--space-2);}
|
|
|
1199
1203
|
.fdy-state{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--space-2);padding:var(--space-10) var(--space-6);}
|
|
1200
1204
|
.fdy-state__icon{display:inline-flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;color:var(--color-text-subtle);}
|
|
1201
1205
|
.fdy-state__icon svg{width:100%;height:100%;}
|
|
1202
|
-
.fdy-state__title{font-family:var(--font-display);font-size:var(--text-lg);font-weight:var(--weight-semibold);color:var(--color-text);}
|
|
1206
|
+
.fdy-state__title{font-family:var(--font-display);font-size:var(--text-lg);font-weight:var(--weight-semibold);color:var(--color-text);margin:0;}
|
|
1203
1207
|
.fdy-state__text{font-size:var(--text-sm);color:var(--color-text-muted);max-width:24rem;line-height:var(--leading-normal);}
|
|
1204
1208
|
.fdy-state__actions{margin-top:var(--space-2);display:flex;gap:var(--space-2);flex-wrap:wrap;justify-content:center;}
|
|
1205
1209
|
.fdy-state--danger .fdy-state__icon{color:var(--color-danger-strong);}
|
|
@@ -1279,6 +1283,18 @@ fieldset.fdy-field>legend{padding:0;float:none;margin-bottom:var(--space-2);}
|
|
|
1279
1283
|
.fdy-table-toolbar__count{font-size:var(--text-sm);color:var(--color-text-muted);white-space:nowrap;}
|
|
1280
1284
|
.fdy-table-footer{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);flex-wrap:wrap;padding:var(--space-3) var(--space-4);border-top:var(--bw) solid var(--color-border);}
|
|
1281
1285
|
.fdy-table-footer__info{font-size:var(--text-sm);color:var(--color-text-muted);}
|
|
1286
|
+
/* Rows per page. `margin-left:auto` eats the free space, so the size control and the pager travel
|
|
1287
|
+
together on the right while the range stays left — no wrapper element, which is what keeps the
|
|
1288
|
+
footer's DOM byte-identical for the tables that don't offer one (#008). The control is the kit's
|
|
1289
|
+
own `.fdy-combo`, never a native <select>: an OS menu is unthemeable, and on macOS it drops a
|
|
1290
|
+
dark panel into a light page — which is the reason FdyCombo exists at all. Sized to its content:
|
|
1291
|
+
`.fdy-combo` is display:block at max-width 22rem, which in a footer is a bar-wide box for two
|
|
1292
|
+
digits. Its HEIGHT is left alone on purpose — `--control-h`, the same as every other control on
|
|
1293
|
+
the page. It briefly carried 2.25rem to match the pager links beside it, which made the one
|
|
1294
|
+
combobox in a compact app 4px taller than all the others; a pager link is a nav button, and the
|
|
1295
|
+
thing this must agree with is the form controls. */
|
|
1296
|
+
.fdy-table-footer__size{display:inline-flex;align-items:center;gap:var(--space-2);margin-left:auto;font-size:var(--text-sm);color:var(--color-text-muted);}
|
|
1297
|
+
.fdy-table-footer__size .fdy-combo{width:5.5rem;}
|
|
1282
1298
|
|
|
1283
1299
|
/* Column filter — funnel button injected (enhancer) or rendered (FdyTable) into a filterable <th> */
|
|
1284
1300
|
.fdy-table__filterwrap{display:inline-flex;align-items:center;vertical-align:middle;}
|
|
@@ -1370,7 +1386,7 @@ fieldset.fdy-field>legend{padding:0;float:none;margin-bottom:var(--space-2);}
|
|
|
1370
1386
|
.fdy-toast--danger .fdy-toast__accent{background:var(--color-danger);}
|
|
1371
1387
|
.fdy-toast--info .fdy-toast__accent{background:var(--color-info);}
|
|
1372
1388
|
.fdy-toast__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:var(--space-1);font-size:var(--text-sm);}
|
|
1373
|
-
.fdy-toast__title{font-weight:var(--weight-semibold);}
|
|
1389
|
+
.fdy-toast__title{font-size:inherit;font-weight:var(--weight-semibold);margin:0;}
|
|
1374
1390
|
.fdy-toast__text{opacity:.88;line-height:var(--leading-normal);}
|
|
1375
1391
|
.fdy-toast__close{flex:none;border:0;background:transparent;color:var(--color-inverse-text);opacity:.7;cursor:pointer;font-size:var(--text-lg);line-height:1;padding:0 var(--space-1);border-radius:var(--radius-sm);}
|
|
1376
1392
|
.fdy-toast__close:hover{opacity:1;}
|
package/dist/freeday.js
CHANGED
|
@@ -2871,7 +2871,8 @@
|
|
|
2871
2871
|
* a `<table class="fdy-table">` whose sortable headers hold
|
|
2872
2872
|
* `<button class="fdy-table__sortbtn" data-fdy-sort[="number"]>`, optional
|
|
2873
2873
|
* selection checkboxes (`[data-fdy-select-all]`, `[data-fdy-row-select]`), and a
|
|
2874
|
-
* `.fdy-table-footer` (with `[data-fdy-table-info]`, `[data-fdy-table-pagination]
|
|
2874
|
+
* `.fdy-table-footer` (with `[data-fdy-table-info]`, `[data-fdy-table-pagination]`, and an
|
|
2875
|
+
* optional `<select data-fdy-table-page-size>` whose options are row counts).
|
|
2875
2876
|
* Numeric columns should give each cell a `data-sort-value`.
|
|
2876
2877
|
*
|
|
2877
2878
|
* Column filters: mark a header `<th data-fdy-filter="text|enum|number">` and a funnel
|
|
@@ -2907,6 +2908,7 @@
|
|
|
2907
2908
|
var countEl = root.querySelector('[data-fdy-table-count]');
|
|
2908
2909
|
var infoEl = root.querySelector('[data-fdy-table-info]');
|
|
2909
2910
|
var pagerEl = root.querySelector('[data-fdy-table-pagination]');
|
|
2911
|
+
var pageSizeEl = root.querySelector('[data-fdy-table-page-size]');
|
|
2910
2912
|
var selectAll = root.querySelector('[data-fdy-select-all]');
|
|
2911
2913
|
var pageSize = parseInt(root.getAttribute('data-page-size'), 10) || 0; // 0 = no pagination
|
|
2912
2914
|
|
|
@@ -3303,6 +3305,27 @@
|
|
|
3303
3305
|
updateBulk();
|
|
3304
3306
|
});
|
|
3305
3307
|
|
|
3308
|
+
/* Rows per page. The select is app-authored markup (its options ARE the offer), so this only
|
|
3309
|
+
* wires it: adopt whatever it currently shows, and on a change keep the reader on the row they
|
|
3310
|
+
* were looking at rather than sending them back to page 1. */
|
|
3311
|
+
if (pageSizeEl) {
|
|
3312
|
+
var chosen = parseInt(pageSizeEl.value, 10);
|
|
3313
|
+
if (chosen > 0) pageSize = chosen;
|
|
3314
|
+
var onPageSize = function (e) {
|
|
3315
|
+
var raw = (e && e.detail && e.detail.value != null) ? e.detail.value : pageSizeEl.value;
|
|
3316
|
+
var next = parseInt(raw, 10);
|
|
3317
|
+
if (!(next > 0) || next === pageSize) return;
|
|
3318
|
+
var firstRow = (page - 1) * pageSize;
|
|
3319
|
+
pageSize = next;
|
|
3320
|
+
page = Math.floor(firstRow / next) + 1;
|
|
3321
|
+
render();
|
|
3322
|
+
};
|
|
3323
|
+
/* Both kinds: a native <select> fires `change`, and `.fdy-combo` (freeday-select.js) fires
|
|
3324
|
+
* `fdy-change` with the value in `detail`. A raw page may use either. */
|
|
3325
|
+
pageSizeEl.addEventListener('change', onPageSize);
|
|
3326
|
+
pageSizeEl.addEventListener('fdy-change', onPageSize);
|
|
3327
|
+
}
|
|
3328
|
+
|
|
3306
3329
|
if (bulkClear) bulkClear.addEventListener('click', clearSelection);
|
|
3307
3330
|
|
|
3308
3331
|
// Dismiss an open filter popover on outside click or Escape.
|
package/docs/agent-onboarding.md
CHANGED
|
@@ -122,6 +122,8 @@ Recent additions most likely to replace something an app hand-rolled (all detail
|
|
|
122
122
|
| `.fdy-text-warning` / `-danger` / `-success` | a caption class on a line that should stand out |
|
|
123
123
|
| `.fdy-icon` | your own `width:1em;height:1em` rule, once per project |
|
|
124
124
|
| `data-density="comfortable"` | restating the default spacing tokens on a wrapper |
|
|
125
|
+
| `pageSizes` on `FdyTable` | a rows-per-page control bolted above the table, away from the pager |
|
|
126
|
+
| `FdyTableFooter` | rebuilding the range + pager to add a size control, on a responsive list |
|
|
125
127
|
| the calendar's month grid (press the title) | clicking "previous month" thirty times |
|
|
126
128
|
|
|
127
129
|
## 3. Starting a new screen
|
package/docs/getting-started.md
CHANGED
|
@@ -184,7 +184,7 @@ live docs also have a copy button per component.
|
|
|
184
184
|
```bash
|
|
185
185
|
npm i @cahyo-dimas/freeday
|
|
186
186
|
```
|
|
187
|
-
Lands in `package.json` as `"@cahyo-dimas/freeday": "^1.
|
|
187
|
+
Lands in `package.json` as `"@cahyo-dimas/freeday": "^1.34.0"` (public npm package). `dist/` is
|
|
188
188
|
committed and published → no build step; `npm ci` runs without auth.
|
|
189
189
|
|
|
190
190
|
### 2. Import the CSS + enhancers **once** in your entry (`src/main.ts`)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cahyo-dimas/freeday",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.34.0",
|
|
4
4
|
"description": "Freeday — token-driven, framework-agnostic UI KIT (design source-of-truth).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -38,13 +38,34 @@
|
|
|
38
38
|
"docs/reference-screen.html"
|
|
39
39
|
],
|
|
40
40
|
"exports": {
|
|
41
|
-
".": {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
"./
|
|
46
|
-
|
|
47
|
-
|
|
41
|
+
".": {
|
|
42
|
+
"types": "./dist/freeday.d.ts",
|
|
43
|
+
"default": "./dist/freeday.js"
|
|
44
|
+
},
|
|
45
|
+
"./css": {
|
|
46
|
+
"types": "./dist/asset.d.ts",
|
|
47
|
+
"default": "./dist/freeday.bundle.css"
|
|
48
|
+
},
|
|
49
|
+
"./css/components": {
|
|
50
|
+
"types": "./dist/asset.d.ts",
|
|
51
|
+
"default": "./dist/freeday.css"
|
|
52
|
+
},
|
|
53
|
+
"./tokens": {
|
|
54
|
+
"types": "./dist/asset.d.ts",
|
|
55
|
+
"default": "./dist/freeday.tokens.css"
|
|
56
|
+
},
|
|
57
|
+
"./breakpoints": {
|
|
58
|
+
"types": "./tokens/breakpoints.d.ts",
|
|
59
|
+
"default": "./tokens/breakpoints.mjs"
|
|
60
|
+
},
|
|
61
|
+
"./table-model": {
|
|
62
|
+
"types": "./adapters/core/table-model.d.ts",
|
|
63
|
+
"default": "./adapters/core/table-model.js"
|
|
64
|
+
},
|
|
65
|
+
"./enhancers/*": {
|
|
66
|
+
"types": "./dist/asset.d.ts",
|
|
67
|
+
"default": "./dist/freeday-*.js"
|
|
68
|
+
},
|
|
48
69
|
"./vue": {
|
|
49
70
|
"types": "./adapters/vue/index.d.ts",
|
|
50
71
|
"default": "./adapters/vue/index.js"
|
package/src/components/alert.css
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
.fdy-alert__icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;margin-top:.05rem;}
|
|
4
4
|
.fdy-alert__icon svg{width:100%;height:100%;}
|
|
5
5
|
.fdy-alert__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:var(--space-1);}
|
|
6
|
-
.fdy-alert__title{font-weight:var(--weight-semibold);color:var(--color-text);}
|
|
6
|
+
.fdy-alert__title{font-size:inherit;font-weight:var(--weight-semibold);color:var(--color-text);margin:0;}
|
|
7
7
|
.fdy-alert__text{color:var(--color-text);line-height:var(--leading-normal);}
|
|
8
8
|
.fdy-alert__close{flex:none;align-self:flex-start;border:0;background:transparent;color:var(--color-text-muted);cursor:pointer;font-size:var(--text-lg);line-height:1;padding:0 var(--space-1);border-radius:var(--radius-sm);}
|
|
9
9
|
.fdy-alert__close:hover{color:var(--color-text);}
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
.fdy-app__brand-mark{flex:none;width:1.5rem;height:1.5rem;}
|
|
22
22
|
.fdy-app__brand-mark svg{display:block;width:100%;height:100%;}
|
|
23
23
|
.fdy-app__brand-text{display:flex;flex-direction:column;min-width:0;}
|
|
24
|
-
.fdy-app__brand-title{display:block;font-family:var(--font-display);font-weight:var(--weight-bold);font-size:var(--text-lg);color:var(--color-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
25
|
-
.fdy-app__brand-subtitle{display:block;font-size:var(--text-xs);font-weight:var(--weight-regular);color:var(--color-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
24
|
+
.fdy-app__brand-title{display:block;font-family:var(--font-display);font-weight:var(--weight-bold);font-size:var(--text-lg);color:var(--color-text);margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
25
|
+
.fdy-app__brand-subtitle{display:block;font-size:var(--text-xs);font-weight:var(--weight-regular);color:var(--color-text-muted);margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
26
26
|
.fdy-nav{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:2px;padding:var(--space-3) var(--space-3) var(--space-6);}
|
|
27
27
|
/* Horizontal variant — the SAME nav links laid out as a row, for a top-nav application (one that
|
|
28
28
|
* puts its primary navigation in `.fdy-appbar` / `.fdy-app__topbar` and has no sidebar). Deliberately
|
package/src/components/cfl.css
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
.fdy-cfl__check input{pointer-events:none;}
|
|
20
20
|
|
|
21
21
|
/* Empty result state. */
|
|
22
|
-
.fdy-cfl__empty{padding:var(--space-8) var(--space-5);text-align:center;color:var(--color-text-muted);font-size:var(--text-sm);}
|
|
22
|
+
.fdy-cfl__empty{padding:var(--space-8) var(--space-5);text-align:center;color:var(--color-text-muted);font-size:var(--text-sm);margin:0;}
|
|
23
23
|
.fdy-cfl__empty[hidden]{display:none;}
|
|
24
24
|
|
|
25
25
|
/* Footer — selection count (multi) sits left, actions right. */
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
prose. -subtle is gated at 3.0 on purpose (placeholders, separators, decorative glyphs) and
|
|
14
14
|
measures 4.41 on the page ground — axe reports it as a serious color-contrast failure. Same
|
|
15
15
|
argument, same ink, same 4.41 as .fdy-stat__label in 1.30.0. */
|
|
16
|
-
.fdy-eyebrow{font-family:var(--font-body);font-size:var(--text-xs);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-wide);text-transform:uppercase;color:var(--color-text-muted);}
|
|
16
|
+
.fdy-eyebrow{font-family:var(--font-body);font-size:var(--text-xs);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-wide);text-transform:uppercase;color:var(--color-text-muted);margin:0;}
|
|
17
17
|
.fdy-title-page{font-family:var(--font-display);font-size:var(--text-3xl);font-weight:var(--weight-bold);letter-spacing:var(--tracking-tighter);line-height:var(--leading-tight);color:var(--color-text);margin:0;text-wrap:balance;}
|
|
18
18
|
.fdy-title-section{font-family:var(--font-display);font-size:var(--text-xl);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight);line-height:var(--leading-snug);color:var(--color-text);margin:0;text-wrap:balance;}
|
|
19
19
|
.fdy-title-card{font-family:var(--font-display);font-size:var(--text-lg);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight);color:var(--color-text);margin:0;}
|
|
@@ -31,12 +31,9 @@
|
|
|
31
31
|
.fdy-cal__head{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-2);}
|
|
32
32
|
/* The title is a CONTROL now (#004 §1): it drills to the month grid, so it needs the UA button box
|
|
33
33
|
reset and the same hover/focus treatment as the arrows beside it. */
|
|
34
|
-
.fdy-cal__title{flex:1;appearance:none;border:0;background:transparent;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);text-align:center;font-family:inherit;font-weight:var(--weight-semibold);font-size:var(--text-sm);color:var(--color-text);text-transform:capitalize;cursor:pointer;}
|
|
34
|
+
.fdy-cal__title{flex:1;appearance:none;border:0;background:transparent;margin:0;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);text-align:center;font-family:inherit;font-weight:var(--weight-semibold);font-size:var(--text-sm);color:var(--color-text);text-transform:capitalize;cursor:pointer;}
|
|
35
35
|
.fdy-cal__title:hover{background:var(--color-surface-2);}
|
|
36
36
|
.fdy-cal__title:focus-visible{outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary) 26%,transparent);}
|
|
37
|
-
/* Month grid — 3×4 over the same track width as the 7-column day grid, so the panel does not resize
|
|
38
|
-
when you drill and the pointer does not have to travel. */
|
|
39
|
-
.fdy-cal__grid--months{grid-template-columns:repeat(3,1fr);gap:var(--space-1);}
|
|
40
37
|
.fdy-cal__month{display:inline-flex;align-items:center;justify-content:center;height:2.25rem;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--color-text);font-family:inherit;font-size:var(--text-sm);text-transform:capitalize;cursor:pointer;}
|
|
41
38
|
.fdy-cal__month:hover{background:var(--color-surface-2);}
|
|
42
39
|
.fdy-cal__month:focus-visible{outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary) 26%,transparent);}
|
|
@@ -47,6 +44,13 @@
|
|
|
47
44
|
.fdy-cal__nav:hover{background:var(--color-surface-2);color:var(--color-text);}
|
|
48
45
|
.fdy-cal__nav:focus-visible{outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary) 26%,transparent);}
|
|
49
46
|
.fdy-cal__grid{display:grid;grid-template-columns:repeat(7,2rem);gap:2px;}
|
|
47
|
+
/* Month grid — 3×4 over the same track width as the 7-column day grid, so the panel does not resize
|
|
48
|
+
when you drill and the pointer does not have to travel.
|
|
49
|
+
|
|
50
|
+
AFTER `.fdy-cal__grid`, and that is the whole rule: the element carries both classes, they weigh
|
|
51
|
+
the same, so source order decides. Declared earlier, the modifier lost to the base it modifies and
|
|
52
|
+
twelve months rendered seven across — the layout the comment above described, never once applied. */
|
|
53
|
+
.fdy-cal__grid--months{grid-template-columns:repeat(3,1fr);gap:var(--space-1);}
|
|
50
54
|
.fdy-cal__dow{display:flex;align-items:center;justify-content:center;height:1.75rem;font-size:var(--text-xs);font-weight:var(--weight-semibold);color:var(--color-text-muted);text-transform:capitalize;}
|
|
51
55
|
.fdy-cal__day{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--color-text);font-size:var(--text-sm);font-variant-numeric:tabular-nums;cursor:pointer;}
|
|
52
56
|
.fdy-cal__day:hover{background:var(--color-surface-2);}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
.fdy-dropzone__icon{color:var(--color-text-subtle);}
|
|
9
9
|
.fdy-dropzone.is-dragover .fdy-dropzone__icon{color:var(--color-primary);}
|
|
10
10
|
.fdy-dropzone__icon svg{display:block;width:2rem;height:2rem;}
|
|
11
|
-
.fdy-dropzone__title{font-weight:var(--weight-medium);color:var(--color-text);}
|
|
11
|
+
.fdy-dropzone__title{font-size:inherit;font-weight:var(--weight-medium);color:var(--color-text);margin:0;}
|
|
12
12
|
.fdy-dropzone__hint{font-size:var(--text-xs);}
|
|
13
13
|
/* Wide (horizontal) layout — icon beside the copy instead of stacked, for full-width
|
|
14
14
|
* sections. Wrap the title + hint in .fdy-dropzone__text. */
|
package/src/components/list.css
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
.fdy-list__row--button:disabled:hover,.fdy-list__row--button[aria-disabled="true"]:hover,.fdy-list__row--interactive[aria-disabled="true"]:hover{background:none;}
|
|
38
38
|
/* Row internals: a title/meta stack that truncates, and a trailing slot pinned right. */
|
|
39
39
|
.fdy-list__main{display:flex;flex-direction:column;gap:var(--space-1);min-width:0;flex:1;}
|
|
40
|
-
.fdy-list__title{font-weight:var(--weight-medium);color:var(--color-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
40
|
+
.fdy-list__title{font-family:var(--font-body);font-size:var(--text-base);font-weight:var(--weight-medium);letter-spacing:normal;color:var(--color-text);margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
41
41
|
.fdy-list__meta{font-size:var(--text-sm);color:var(--color-text-muted);display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;}
|
|
42
42
|
.fdy-list__aside{flex:none;display:flex;align-items:center;gap:var(--space-2);}
|
|
43
43
|
/* Density: rows tighten with the rest of the kit (--space-* mid-range steps under compact). */
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
.fdy-state{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--space-2);padding:var(--space-10) var(--space-6);}
|
|
3
3
|
.fdy-state__icon{display:inline-flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;color:var(--color-text-subtle);}
|
|
4
4
|
.fdy-state__icon svg{width:100%;height:100%;}
|
|
5
|
-
.fdy-state__title{font-family:var(--font-display);font-size:var(--text-lg);font-weight:var(--weight-semibold);color:var(--color-text);}
|
|
5
|
+
.fdy-state__title{font-family:var(--font-display);font-size:var(--text-lg);font-weight:var(--weight-semibold);color:var(--color-text);margin:0;}
|
|
6
6
|
.fdy-state__text{font-size:var(--text-sm);color:var(--color-text-muted);max-width:24rem;line-height:var(--leading-normal);}
|
|
7
7
|
.fdy-state__actions{margin-top:var(--space-2);display:flex;gap:var(--space-2);flex-wrap:wrap;justify-content:center;}
|
|
8
8
|
.fdy-state--danger .fdy-state__icon{color:var(--color-danger-strong);}
|
package/src/components/table.css
CHANGED
|
@@ -46,6 +46,18 @@
|
|
|
46
46
|
.fdy-table-toolbar__count{font-size:var(--text-sm);color:var(--color-text-muted);white-space:nowrap;}
|
|
47
47
|
.fdy-table-footer{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);flex-wrap:wrap;padding:var(--space-3) var(--space-4);border-top:var(--bw) solid var(--color-border);}
|
|
48
48
|
.fdy-table-footer__info{font-size:var(--text-sm);color:var(--color-text-muted);}
|
|
49
|
+
/* Rows per page. `margin-left:auto` eats the free space, so the size control and the pager travel
|
|
50
|
+
together on the right while the range stays left — no wrapper element, which is what keeps the
|
|
51
|
+
footer's DOM byte-identical for the tables that don't offer one (#008). The control is the kit's
|
|
52
|
+
own `.fdy-combo`, never a native <select>: an OS menu is unthemeable, and on macOS it drops a
|
|
53
|
+
dark panel into a light page — which is the reason FdyCombo exists at all. Sized to its content:
|
|
54
|
+
`.fdy-combo` is display:block at max-width 22rem, which in a footer is a bar-wide box for two
|
|
55
|
+
digits. Its HEIGHT is left alone on purpose — `--control-h`, the same as every other control on
|
|
56
|
+
the page. It briefly carried 2.25rem to match the pager links beside it, which made the one
|
|
57
|
+
combobox in a compact app 4px taller than all the others; a pager link is a nav button, and the
|
|
58
|
+
thing this must agree with is the form controls. */
|
|
59
|
+
.fdy-table-footer__size{display:inline-flex;align-items:center;gap:var(--space-2);margin-left:auto;font-size:var(--text-sm);color:var(--color-text-muted);}
|
|
60
|
+
.fdy-table-footer__size .fdy-combo{width:5.5rem;}
|
|
49
61
|
|
|
50
62
|
/* Column filter — funnel button injected (enhancer) or rendered (FdyTable) into a filterable <th> */
|
|
51
63
|
.fdy-table__filterwrap{display:inline-flex;align-items:center;vertical-align:middle;}
|
package/src/components/toast.css
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
.fdy-toast--danger .fdy-toast__accent{background:var(--color-danger);}
|
|
8
8
|
.fdy-toast--info .fdy-toast__accent{background:var(--color-info);}
|
|
9
9
|
.fdy-toast__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:var(--space-1);font-size:var(--text-sm);}
|
|
10
|
-
.fdy-toast__title{font-weight:var(--weight-semibold);}
|
|
10
|
+
.fdy-toast__title{font-size:inherit;font-weight:var(--weight-semibold);margin:0;}
|
|
11
11
|
.fdy-toast__text{opacity:.88;line-height:var(--leading-normal);}
|
|
12
12
|
.fdy-toast__close{flex:none;border:0;background:transparent;color:var(--color-inverse-text);opacity:.7;cursor:pointer;font-size:var(--text-lg);line-height:1;padding:0 var(--space-1);border-radius:var(--radius-sm);}
|
|
13
13
|
.fdy-toast__close:hover{opacity:1;}
|