@cahyo-dimas/freeday 1.10.0 → 1.11.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 +23 -0
- package/README.id.md +1 -1
- package/README.md +1 -1
- package/dist/freeday-chart.js +4 -1
- package/dist/freeday.bundle.css +9 -2
- package/dist/freeday.css +9 -2
- package/dist/freeday.js +4 -1
- package/package.json +1 -1
- package/src/components/badge.css +1 -1
- package/src/components/filterbar.css +8 -1
- package/src/freeday-chart.js +4 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,29 @@
|
|
|
3
3
|
Semua perubahan penting dicatat di sini. Format longgar mengikuti
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/); tiap versi = git tag.
|
|
5
5
|
|
|
6
|
+
## [1.11.0] — 2026-07-28
|
|
7
|
+
Follow-ups from the doc-ai-automation migration (improvement notes #31–#33). Additive / corrective.
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
- **Badges no longer wrap and break the pill (#31).** `.fdy-badge` had `line-height:1` but no
|
|
11
|
+
`white-space`, so a two-word label (e.g. "Needs review") wrapped and collided with the pill padding,
|
|
12
|
+
turning the capsule into a cramped lozenge. Added `white-space:nowrap` — matching the sibling
|
|
13
|
+
`.fdy-badge-ov`, which already had it. A too-narrow badge now overflows its column (which
|
|
14
|
+
`.fdy-table-scroll` already handles) instead of wrapping.
|
|
15
|
+
- **Donut chart honours `legend="none"` (#33).** `freeday-chart.js` read `data-fdy-legend` only in the
|
|
16
|
+
cartesian renderer; the donut appended its legend unconditionally, so `<FdyChart type="donut"
|
|
17
|
+
legend="none">` still printed the built-in legend even when the caller supplied its own. Gated the
|
|
18
|
+
donut legend on the same attribute (`auto` still shows it — a donut is unreadable without labels).
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
- **`.fdy-filterbar--actions-inline` modifier (#32).** Opt-in: sits the trailing actions inline after
|
|
22
|
+
the last field instead of at the far edge, so a wrapped bar reads as attached to its filters. Also
|
|
23
|
+
**documented** the filterbar's wrap behaviour: a wrapped bar breaks flex lines on each item's
|
|
24
|
+
*flex-basis* (the grow field's `flex:1 1 16rem` reserves 16rem), not its rendered width — so the
|
|
25
|
+
grow basis decides the wrap point; to avoid stranded actions, tune the `--w-grow` basis or drop a
|
|
26
|
+
field. (The note's margin-swap proposal to un-strand the actions was **tested in-browser and does not
|
|
27
|
+
work** — margins don't change flex line-breaking — so only the modifier + docs were taken.)
|
|
28
|
+
|
|
6
29
|
## [1.10.0] — 2026-07-28
|
|
7
30
|
Follow-ups from the doc-ai-automation migration (improvement notes #27–#30). Additive / corrective;
|
|
8
31
|
no breaking changes.
|
package/README.id.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
> **Lebih banyak _free day_ buat dev — UI kit-nya sudah siap pakai.**
|
|
6
6
|
|
|
7
7
|
[](https://cahyo-dimas.github.io/freeday-ui-kit/)
|
|
8
|
-
[](https://github.com/cahyo-dimas/freeday-ui-kit/tree/v1.11.0)
|
|
9
9
|
|
|
10
10
|
UI KIT yang token-driven & framework-agnostic — satu sumber kebenaran untuk warna, tipografi,
|
|
11
11
|
spasi, dan komponen. Blueprint: `docs/superpowers/specs/2026-07-21-freeday-ui-kit-design.md`.
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
> **More free days for devs — the UI kit is ready to use.**
|
|
6
6
|
|
|
7
7
|
[](https://cahyo-dimas.github.io/freeday-ui-kit/)
|
|
8
|
-
[](https://github.com/cahyo-dimas/freeday-ui-kit/tree/v1.11.0)
|
|
9
9
|
|
|
10
10
|
A token-driven, framework-agnostic UI kit — one source of truth for color, typography,
|
|
11
11
|
spacing, and components. Blueprint: `docs/superpowers/specs/2026-07-21-freeday-ui-kit-design.md`.
|
package/dist/freeday-chart.js
CHANGED
|
@@ -380,7 +380,10 @@
|
|
|
380
380
|
li.appendChild(document.createTextNode((labels[i] || ('#' + (i + 1))) + ' — ' + Math.round((v / total) * 100) + '%'));
|
|
381
381
|
legend.appendChild(li);
|
|
382
382
|
});
|
|
383
|
-
el.appendChild(ring);
|
|
383
|
+
el.appendChild(ring);
|
|
384
|
+
// Honour data-fdy-legend for the donut too — a caller may supply its own richer legend. 'auto'
|
|
385
|
+
// keeps today's behaviour (a donut is unreadable without labels, so it shows); 'none' suppresses it.
|
|
386
|
+
if ((el.getAttribute('data-fdy-legend') || 'auto') !== 'none') el.appendChild(legend);
|
|
384
387
|
ensureImg(el);
|
|
385
388
|
}
|
|
386
389
|
|
package/dist/freeday.bundle.css
CHANGED
|
@@ -526,7 +526,7 @@ a { color: var(--color-primary); }
|
|
|
526
526
|
.fdy-avatar-group .fdy-avatar:first-child{margin-left:0;}
|
|
527
527
|
|
|
528
528
|
/* Freeday — Badge */
|
|
529
|
-
.fdy-badge{display:inline-flex;align-items:center;gap:var(--space-1);font-family:var(--font-body);font-size:var(--text-xs);font-weight:var(--weight-semibold);line-height:1;padding:.35em .7em;border-radius:var(--radius-full);color:var(--color-primary-strong);background:var(--color-primary-soft);border:var(--bw) solid color-mix(in srgb,var(--color-primary) 22%,transparent);box-shadow:0 1px 1.5px rgba(16,14,30,.05);}
|
|
529
|
+
.fdy-badge{display:inline-flex;align-items:center;gap:var(--space-1);font-family:var(--font-body);font-size:var(--text-xs);font-weight:var(--weight-semibold);line-height:1;white-space:nowrap;padding:.35em .7em;border-radius:var(--radius-full);color:var(--color-primary-strong);background:var(--color-primary-soft);border:var(--bw) solid color-mix(in srgb,var(--color-primary) 22%,transparent);box-shadow:0 1px 1.5px rgba(16,14,30,.05);}
|
|
530
530
|
.fdy-badge--success{color:var(--color-success-strong);background:var(--color-success-soft);border-color:color-mix(in srgb,var(--color-success) 26%,transparent);}
|
|
531
531
|
.fdy-badge--warning{color:var(--color-warning-strong);background:var(--color-warning-soft);border-color:color-mix(in srgb,var(--color-warning) 26%,transparent);}
|
|
532
532
|
.fdy-badge--danger{color:var(--color-danger-strong);background:var(--color-danger-soft);border-color:color-mix(in srgb,var(--color-danger) 26%,transparent);}
|
|
@@ -984,8 +984,15 @@ a { color: var(--color-primary); }
|
|
|
984
984
|
.fdy-filterbar>.fdy-field--w-2xl{width:25rem;}
|
|
985
985
|
/* One growing field (usually the search) absorbs the remaining width. */
|
|
986
986
|
.fdy-filterbar>.fdy-field--w-grow{flex:1 1 16rem;width:auto;min-width:12rem;}
|
|
987
|
-
/* Trailing actions (buttons) pushed to the end, aligned with the controls' baseline.
|
|
987
|
+
/* Trailing actions (buttons) pushed to the end, aligned with the controls' baseline.
|
|
988
|
+
* Wrap note: a wrapped bar breaks flex lines on each item's *flex-basis* (the grow field's
|
|
989
|
+
* `flex:1 1 16rem` reserves 16rem for line-breaking), NOT its rendered width — so the grow basis,
|
|
990
|
+
* not the visible width, decides the wrap point. Margins can't keep the actions off a lonely wrapped
|
|
991
|
+
* row; to avoid stranded actions, tune the --w-grow basis or drop a field so the bar fits one row. */
|
|
988
992
|
.fdy-filterbar__actions{display:flex;align-items:center;gap:var(--space-2);margin-left:auto;}
|
|
993
|
+
/* Opt-in: sit the actions inline right after the last field instead of at the far edge — so when the
|
|
994
|
+
* bar wraps they read as attached to the filters rather than shoved to the right of a lonely row. */
|
|
995
|
+
.fdy-filterbar--actions-inline .fdy-filterbar__actions{margin-left:0;}
|
|
989
996
|
/* Stack on narrow screens so nothing overflows the row. */
|
|
990
997
|
@media (max-width:640px){
|
|
991
998
|
.fdy-filterbar>.fdy-field,.fdy-filterbar>.fdy-field--w-sm,.fdy-filterbar>.fdy-field--w-lg,.fdy-filterbar>.fdy-field--w-xl,.fdy-filterbar>.fdy-field--w-2xl,.fdy-filterbar>.fdy-field--w-grow{width:100%;flex:1 1 100%;}
|
package/dist/freeday.css
CHANGED
|
@@ -181,7 +181,7 @@ a { color: var(--color-primary); }
|
|
|
181
181
|
.fdy-avatar-group .fdy-avatar:first-child{margin-left:0;}
|
|
182
182
|
|
|
183
183
|
/* Freeday — Badge */
|
|
184
|
-
.fdy-badge{display:inline-flex;align-items:center;gap:var(--space-1);font-family:var(--font-body);font-size:var(--text-xs);font-weight:var(--weight-semibold);line-height:1;padding:.35em .7em;border-radius:var(--radius-full);color:var(--color-primary-strong);background:var(--color-primary-soft);border:var(--bw) solid color-mix(in srgb,var(--color-primary) 22%,transparent);box-shadow:0 1px 1.5px rgba(16,14,30,.05);}
|
|
184
|
+
.fdy-badge{display:inline-flex;align-items:center;gap:var(--space-1);font-family:var(--font-body);font-size:var(--text-xs);font-weight:var(--weight-semibold);line-height:1;white-space:nowrap;padding:.35em .7em;border-radius:var(--radius-full);color:var(--color-primary-strong);background:var(--color-primary-soft);border:var(--bw) solid color-mix(in srgb,var(--color-primary) 22%,transparent);box-shadow:0 1px 1.5px rgba(16,14,30,.05);}
|
|
185
185
|
.fdy-badge--success{color:var(--color-success-strong);background:var(--color-success-soft);border-color:color-mix(in srgb,var(--color-success) 26%,transparent);}
|
|
186
186
|
.fdy-badge--warning{color:var(--color-warning-strong);background:var(--color-warning-soft);border-color:color-mix(in srgb,var(--color-warning) 26%,transparent);}
|
|
187
187
|
.fdy-badge--danger{color:var(--color-danger-strong);background:var(--color-danger-soft);border-color:color-mix(in srgb,var(--color-danger) 26%,transparent);}
|
|
@@ -639,8 +639,15 @@ a { color: var(--color-primary); }
|
|
|
639
639
|
.fdy-filterbar>.fdy-field--w-2xl{width:25rem;}
|
|
640
640
|
/* One growing field (usually the search) absorbs the remaining width. */
|
|
641
641
|
.fdy-filterbar>.fdy-field--w-grow{flex:1 1 16rem;width:auto;min-width:12rem;}
|
|
642
|
-
/* Trailing actions (buttons) pushed to the end, aligned with the controls' baseline.
|
|
642
|
+
/* Trailing actions (buttons) pushed to the end, aligned with the controls' baseline.
|
|
643
|
+
* Wrap note: a wrapped bar breaks flex lines on each item's *flex-basis* (the grow field's
|
|
644
|
+
* `flex:1 1 16rem` reserves 16rem for line-breaking), NOT its rendered width — so the grow basis,
|
|
645
|
+
* not the visible width, decides the wrap point. Margins can't keep the actions off a lonely wrapped
|
|
646
|
+
* row; to avoid stranded actions, tune the --w-grow basis or drop a field so the bar fits one row. */
|
|
643
647
|
.fdy-filterbar__actions{display:flex;align-items:center;gap:var(--space-2);margin-left:auto;}
|
|
648
|
+
/* Opt-in: sit the actions inline right after the last field instead of at the far edge — so when the
|
|
649
|
+
* bar wraps they read as attached to the filters rather than shoved to the right of a lonely row. */
|
|
650
|
+
.fdy-filterbar--actions-inline .fdy-filterbar__actions{margin-left:0;}
|
|
644
651
|
/* Stack on narrow screens so nothing overflows the row. */
|
|
645
652
|
@media (max-width:640px){
|
|
646
653
|
.fdy-filterbar>.fdy-field,.fdy-filterbar>.fdy-field--w-sm,.fdy-filterbar>.fdy-field--w-lg,.fdy-filterbar>.fdy-field--w-xl,.fdy-filterbar>.fdy-field--w-2xl,.fdy-filterbar>.fdy-field--w-grow{width:100%;flex:1 1 100%;}
|
package/dist/freeday.js
CHANGED
|
@@ -1153,7 +1153,10 @@
|
|
|
1153
1153
|
li.appendChild(document.createTextNode((labels[i] || ('#' + (i + 1))) + ' — ' + Math.round((v / total) * 100) + '%'));
|
|
1154
1154
|
legend.appendChild(li);
|
|
1155
1155
|
});
|
|
1156
|
-
el.appendChild(ring);
|
|
1156
|
+
el.appendChild(ring);
|
|
1157
|
+
// Honour data-fdy-legend for the donut too — a caller may supply its own richer legend. 'auto'
|
|
1158
|
+
// keeps today's behaviour (a donut is unreadable without labels, so it shows); 'none' suppresses it.
|
|
1159
|
+
if ((el.getAttribute('data-fdy-legend') || 'auto') !== 'none') el.appendChild(legend);
|
|
1157
1160
|
ensureImg(el);
|
|
1158
1161
|
}
|
|
1159
1162
|
|
package/package.json
CHANGED
package/src/components/badge.css
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* Freeday — Badge */
|
|
2
|
-
.fdy-badge{display:inline-flex;align-items:center;gap:var(--space-1);font-family:var(--font-body);font-size:var(--text-xs);font-weight:var(--weight-semibold);line-height:1;padding:.35em .7em;border-radius:var(--radius-full);color:var(--color-primary-strong);background:var(--color-primary-soft);border:var(--bw) solid color-mix(in srgb,var(--color-primary) 22%,transparent);box-shadow:0 1px 1.5px rgba(16,14,30,.05);}
|
|
2
|
+
.fdy-badge{display:inline-flex;align-items:center;gap:var(--space-1);font-family:var(--font-body);font-size:var(--text-xs);font-weight:var(--weight-semibold);line-height:1;white-space:nowrap;padding:.35em .7em;border-radius:var(--radius-full);color:var(--color-primary-strong);background:var(--color-primary-soft);border:var(--bw) solid color-mix(in srgb,var(--color-primary) 22%,transparent);box-shadow:0 1px 1.5px rgba(16,14,30,.05);}
|
|
3
3
|
.fdy-badge--success{color:var(--color-success-strong);background:var(--color-success-soft);border-color:color-mix(in srgb,var(--color-success) 26%,transparent);}
|
|
4
4
|
.fdy-badge--warning{color:var(--color-warning-strong);background:var(--color-warning-soft);border-color:color-mix(in srgb,var(--color-warning) 26%,transparent);}
|
|
5
5
|
.fdy-badge--danger{color:var(--color-danger-strong);background:var(--color-danger-soft);border-color:color-mix(in srgb,var(--color-danger) 26%,transparent);}
|
|
@@ -18,8 +18,15 @@
|
|
|
18
18
|
.fdy-filterbar>.fdy-field--w-2xl{width:25rem;}
|
|
19
19
|
/* One growing field (usually the search) absorbs the remaining width. */
|
|
20
20
|
.fdy-filterbar>.fdy-field--w-grow{flex:1 1 16rem;width:auto;min-width:12rem;}
|
|
21
|
-
/* Trailing actions (buttons) pushed to the end, aligned with the controls' baseline.
|
|
21
|
+
/* Trailing actions (buttons) pushed to the end, aligned with the controls' baseline.
|
|
22
|
+
* Wrap note: a wrapped bar breaks flex lines on each item's *flex-basis* (the grow field's
|
|
23
|
+
* `flex:1 1 16rem` reserves 16rem for line-breaking), NOT its rendered width — so the grow basis,
|
|
24
|
+
* not the visible width, decides the wrap point. Margins can't keep the actions off a lonely wrapped
|
|
25
|
+
* row; to avoid stranded actions, tune the --w-grow basis or drop a field so the bar fits one row. */
|
|
22
26
|
.fdy-filterbar__actions{display:flex;align-items:center;gap:var(--space-2);margin-left:auto;}
|
|
27
|
+
/* Opt-in: sit the actions inline right after the last field instead of at the far edge — so when the
|
|
28
|
+
* bar wraps they read as attached to the filters rather than shoved to the right of a lonely row. */
|
|
29
|
+
.fdy-filterbar--actions-inline .fdy-filterbar__actions{margin-left:0;}
|
|
23
30
|
/* Stack on narrow screens so nothing overflows the row. */
|
|
24
31
|
@media (max-width:640px){
|
|
25
32
|
.fdy-filterbar>.fdy-field,.fdy-filterbar>.fdy-field--w-sm,.fdy-filterbar>.fdy-field--w-lg,.fdy-filterbar>.fdy-field--w-xl,.fdy-filterbar>.fdy-field--w-2xl,.fdy-filterbar>.fdy-field--w-grow{width:100%;flex:1 1 100%;}
|
package/src/freeday-chart.js
CHANGED
|
@@ -380,7 +380,10 @@
|
|
|
380
380
|
li.appendChild(document.createTextNode((labels[i] || ('#' + (i + 1))) + ' — ' + Math.round((v / total) * 100) + '%'));
|
|
381
381
|
legend.appendChild(li);
|
|
382
382
|
});
|
|
383
|
-
el.appendChild(ring);
|
|
383
|
+
el.appendChild(ring);
|
|
384
|
+
// Honour data-fdy-legend for the donut too — a caller may supply its own richer legend. 'auto'
|
|
385
|
+
// keeps today's behaviour (a donut is unreadable without labels, so it shows); 'none' suppresses it.
|
|
386
|
+
if ((el.getAttribute('data-fdy-legend') || 'auto') !== 'none') el.appendChild(legend);
|
|
384
387
|
ensureImg(el);
|
|
385
388
|
}
|
|
386
389
|
|