@cahyo-dimas/freeday 1.54.0 → 2.1.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 (147) hide show
  1. package/CHANGELOG.md +713 -545
  2. package/COMPONENTS.md +417 -139
  3. package/README.id.md +46 -45
  4. package/README.md +46 -43
  5. package/USAGE.md +34 -34
  6. package/adapters/blazor/FdyAppShell.razor +2 -2
  7. package/adapters/blazor/FdyAppShell.razor.cs +6 -6
  8. package/adapters/blazor/FdyCfl.razor.cs +1 -1
  9. package/adapters/blazor/FdyChart.razor +1 -1
  10. package/adapters/blazor/FdyChart.razor.cs +3 -3
  11. package/adapters/blazor/FdyChartSeries.cs +1 -1
  12. package/adapters/blazor/FdyCombo.razor.cs +2 -2
  13. package/adapters/blazor/FdyModal.razor +1 -1
  14. package/adapters/blazor/FdyTable.razor.cs +7 -7
  15. package/adapters/blazor/FdyTableFilter.razor +1 -1
  16. package/adapters/blazor/FdyTableFooter.razor +1 -1
  17. package/adapters/blazor/FdyTableFooter.razor.cs +4 -4
  18. package/adapters/blazor/Freeday.Blazor.csproj +1 -1
  19. package/adapters/blazor/FreedayComponentBase.cs +1 -1
  20. package/adapters/blazor/TableModel.cs +3 -3
  21. package/adapters/blazor/TableTypes.cs +3 -3
  22. package/adapters/blazor/freeday-blazor.js +5 -5
  23. package/adapters/core/app-shell.d.ts +1 -1
  24. package/adapters/core/app-shell.js +6 -6
  25. package/adapters/core/cfl-value.d.ts +11 -0
  26. package/adapters/core/cfl-value.js +31 -0
  27. package/adapters/core/table-model.d.ts +2 -2
  28. package/adapters/core/table-model.js +8 -8
  29. package/adapters/react/components/FdyAppShell.tsx +5 -5
  30. package/adapters/react/components/FdyAutocomplete.tsx +1 -1
  31. package/adapters/react/components/FdyCascade.tsx +1 -1
  32. package/adapters/react/components/FdyCfl.tsx +11 -11
  33. package/adapters/react/components/FdyDateRange.tsx +2 -2
  34. package/adapters/react/components/FdyDatepicker.tsx +5 -5
  35. package/adapters/react/components/FdyDrawer.tsx +1 -1
  36. package/adapters/react/components/FdyModal.tsx +2 -2
  37. package/adapters/react/components/FdyTable.tsx +7 -7
  38. package/adapters/react/components/FdyTableFilter.tsx +1 -1
  39. package/adapters/react/components/FdyTableFooter.tsx +5 -5
  40. package/adapters/react/index.d.ts +4 -1
  41. package/adapters/react/index.js +1 -0
  42. package/adapters/react/useFreeday.js +3 -3
  43. package/adapters/vue/components/FdyAppShell.vue +5 -5
  44. package/adapters/vue/components/FdyAutocomplete.vue +1 -1
  45. package/adapters/vue/components/FdyCascade.vue +1 -1
  46. package/adapters/vue/components/FdyCfl.vue +8 -8
  47. package/adapters/vue/components/FdyChart.vue +2 -2
  48. package/adapters/vue/components/FdyCombo.vue +1 -1
  49. package/adapters/vue/components/FdyDateRange.vue +2 -2
  50. package/adapters/vue/components/FdyDatepicker.vue +5 -5
  51. package/adapters/vue/components/FdyDrawer.vue +3 -3
  52. package/adapters/vue/components/FdyModal.vue +3 -3
  53. package/adapters/vue/components/FdyTable.vue +7 -7
  54. package/adapters/vue/components/FdyTableFilter.vue +1 -1
  55. package/adapters/vue/components/FdyTableFooter.vue +5 -5
  56. package/adapters/vue/index.d.ts +5 -2
  57. package/adapters/vue/index.js +1 -0
  58. package/adapters/vue/useFreeday.js +3 -3
  59. package/dist/asset.d.ts +3 -3
  60. package/dist/freeday-app-shell.js +9 -9
  61. package/dist/freeday-autocomplete.js +2 -2
  62. package/dist/freeday-breakpoint.js +1 -1
  63. package/dist/freeday-carousel.js +8 -7
  64. package/dist/freeday-cascade.js +10 -9
  65. package/dist/freeday-cfl.js +12 -11
  66. package/dist/freeday-chart.js +11 -11
  67. package/dist/freeday-chip.js +3 -3
  68. package/dist/freeday-datepicker.js +11 -7
  69. package/dist/freeday-datetime.js +5 -5
  70. package/dist/freeday-drawer.js +1 -1
  71. package/dist/freeday-form.js +17 -16
  72. package/dist/freeday-mask.js +9 -8
  73. package/dist/freeday-menu.js +1 -1
  74. package/dist/freeday-number.js +3 -3
  75. package/dist/freeday-popover.js +3 -3
  76. package/dist/freeday-rating.js +2 -2
  77. package/dist/freeday-select.js +5 -5
  78. package/dist/freeday-slider.js +2 -2
  79. package/dist/freeday-stepper.js +10 -9
  80. package/dist/freeday-table.js +18 -17
  81. package/dist/freeday-tabs.js +1 -1
  82. package/dist/freeday-timepicker.js +2 -2
  83. package/dist/freeday-toast.js +11 -10
  84. package/dist/freeday-tree.js +3 -3
  85. package/dist/freeday-upload.js +28 -27
  86. package/dist/freeday.bundle.css +176 -176
  87. package/dist/freeday.css +170 -170
  88. package/dist/freeday.d.ts +2 -2
  89. package/dist/freeday.js +189 -176
  90. package/dist/freeday.tokens.css +5 -5
  91. package/docs/agent-onboarding.md +49 -46
  92. package/docs/getting-started.md +49 -40
  93. package/docs/integrations.md +18 -18
  94. package/docs/reference-screen.html +14 -14
  95. package/package.json +4 -3
  96. package/src/base.css +6 -6
  97. package/src/components/accordion.css +4 -4
  98. package/src/components/alert.css +1 -1
  99. package/src/components/app-shell.css +10 -10
  100. package/src/components/appbar.css +3 -3
  101. package/src/components/autocomplete.css +1 -1
  102. package/src/components/avatar.css +3 -3
  103. package/src/components/badge.css +5 -5
  104. package/src/components/breadcrumb.css +1 -1
  105. package/src/components/breakpoints.css +4 -4
  106. package/src/components/button.css +13 -13
  107. package/src/components/card.css +8 -8
  108. package/src/components/carousel.css +2 -2
  109. package/src/components/cascade.css +2 -2
  110. package/src/components/cfl.css +4 -4
  111. package/src/components/chart.css +3 -3
  112. package/src/components/chip.css +2 -2
  113. package/src/components/combo.css +3 -3
  114. package/src/components/composition.css +7 -7
  115. package/src/components/datepicker.css +6 -6
  116. package/src/components/datetimepicker.css +1 -1
  117. package/src/components/description-list.css +1 -1
  118. package/src/components/divider.css +1 -1
  119. package/src/components/drawer.css +1 -1
  120. package/src/components/file-upload.css +5 -5
  121. package/src/components/filterbar.css +7 -7
  122. package/src/components/form-grid.css +2 -2
  123. package/src/components/input-group.css +6 -6
  124. package/src/components/input.css +6 -6
  125. package/src/components/kbd.css +1 -1
  126. package/src/components/list.css +6 -6
  127. package/src/components/menu.css +3 -3
  128. package/src/components/modal.css +1 -1
  129. package/src/components/pagination.css +1 -1
  130. package/src/components/progress.css +1 -1
  131. package/src/components/rating.css +2 -2
  132. package/src/components/selection.css +4 -4
  133. package/src/components/skeleton.css +1 -1
  134. package/src/components/slider.css +1 -1
  135. package/src/components/spinner.css +1 -1
  136. package/src/components/states.css +1 -1
  137. package/src/components/stepper.css +2 -2
  138. package/src/components/table.css +15 -15
  139. package/src/components/tabs.css +3 -3
  140. package/src/components/timeline.css +1 -1
  141. package/src/components/timepicker.css +1 -1
  142. package/src/components/toast.css +3 -3
  143. package/src/components/tooltip.css +1 -1
  144. package/src/components/tree.css +2 -2
  145. package/tokens/breakpoints.d.ts +2 -2
  146. package/tokens/breakpoints.mjs +3 -3
  147. package/tokens/tokens.json +1 -1
@@ -1,4 +1,4 @@
1
- /* Freeday — States (empty / loading / error placeholders) */
1
+ /* Freeday. States (empty / loading / error placeholders) */
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%;}
@@ -1,4 +1,4 @@
1
- /* Freeday — Stepper / Wizard (progress header + optional panels).
1
+ /* Freeday. Stepper / Wizard (progress header + optional panels).
2
2
  * Enhanced by freeday-stepper.js for prev/next navigation. */
3
3
  .fdy-stepper{display:flex;list-style:none;margin:0;padding:0;}
4
4
  .fdy-step{flex:1;position:relative;display:flex;flex-direction:column;align-items:center;text-align:center;min-width:0;}
@@ -8,7 +8,7 @@
8
8
  .fdy-step__btn{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;gap:var(--space-2);padding:0 var(--space-2);background:none;border:0;font:inherit;color:inherit;cursor:pointer;max-width:100%;}
9
9
  .fdy-step__btn:disabled{cursor:default;}
10
10
  /* The marker carries the lift itself, NOT `__btn`. The connector above is position:absolute with
11
- z-index:0, and a positioned box paints after in-flow inline content in the same stacking context —
11
+ z-index:0, and a positioned box paints after in-flow inline content in the same stacking context,
12
12
  so a marker that is merely inline (an indicator-only stepper with no `__btn`) gets painted THROUGH
13
13
  by the connector line. Lifting the part that must always exist makes that assembly impossible;
14
14
  `__btn`'s own z-index stays, harmlessly, for the navigable case. */
@@ -1,5 +1,5 @@
1
- /* Freeday — Table */
2
- /* position:relative on every scroller/clipper — it makes the box the containing block for its own
1
+ /* Freeday. Table */
2
+ /* position:relative on every scroller/clipper, it makes the box the containing block for its own
3
3
  absolutely positioned content (.fdy-visually-hidden above all), which `overflow` alone does NOT
4
4
  clip. Without it a hidden label in a wide table scrolls the whole page. See base.css. */
5
5
  .fdy-table-wrap{position:relative;overflow-x:auto;border:var(--bw) solid var(--color-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-1);background:var(--color-surface);}
@@ -10,7 +10,7 @@
10
10
  .fdy-table tbody tr:last-child td{border-bottom:0;}
11
11
  .fdy-table tbody tr{transition:background-color var(--dur-fast) var(--ease-standard);}
12
12
  .fdy-table tbody tr:hover{background:var(--color-surface-2);}
13
- /* Monospace data — ids, codes, IPs, timestamps. Alignment-neutral so it works in any cell
13
+ /* Monospace data, ids, codes, IPs, timestamps. Alignment-neutral so it works in any cell
14
14
  or inline (`<span class="fdy-mono">`), not just numeric columns. */
15
15
  .fdy-mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
16
16
  /* Numeric cells are mono + right-aligned. Kept self-contained (not composed from .fdy-mono)
@@ -37,7 +37,7 @@
37
37
  .fdy-table__selcol{width:1px;white-space:nowrap;}
38
38
  .fdy-table tbody tr[aria-selected="true"],.fdy-table tbody tr[aria-selected="true"]:hover{background:var(--color-primary-soft);}
39
39
 
40
- /* Frozen header row and/or first column — a rate matrix, a timetable, any grid read
40
+ /* Frozen header row and/or first column, a rate matrix, a timetable, any grid read
41
41
  against two axes at once.
42
42
 
43
43
  This modifier exists because `position:sticky` alone is NOT enough. With
@@ -51,12 +51,12 @@
51
51
  /* Freezing the HEADER ROW is its own modifier because it needs a vertical
52
52
  scrollport (`.fdy-table-scroll--frozen`). A table that only freezes columns
53
53
  scrolls with the PAGE, and `top:0` against the page sticks the header under
54
- the viewport edge — over the app's own top bar — which is worse than not
54
+ the viewport edge, over the app's own top bar, which is worse than not
55
55
  freezing it. Ask for the axis you actually have. */
56
56
  .fdy-table--sticky-head thead th{position:sticky;top:0;z-index:2;border-bottom:var(--bw) solid var(--color-border);}
57
57
 
58
58
  /* Freezing a COLUMN: put `.fdy-table__freeze` on every cell of it, header
59
- included, and give each frozen column its own `--fdy-freeze-left` — 0 for the
59
+ included, and give each frozen column its own `--fdy-freeze-left`. 0 for the
60
60
  first, the summed widths of the frozen columns left of it after that. One
61
61
  frozen column needs no variable at all. Mark the last one `--edge` so the
62
62
  reader can see where the frozen block ends.
@@ -65,12 +65,12 @@
65
65
  widths, which CSS cannot sum, and hard-coding them here would only work for
66
66
  tables whose columns are all the same width. */
67
67
  .fdy-table--sticky .fdy-table__freeze{position:sticky;left:var(--fdy-freeze-left,0);}
68
- /* A frozen body cell slides OVER the data, so it must be OPAQUE — otherwise the
68
+ /* A frozen body cell slides OVER the data, so it must be OPAQUE, otherwise the
69
69
  cells beneath show through it. A `th` already carries the header tint from the
70
70
  base rule, and that tint is usually the whole point: it is what marks a column
71
71
  as identity rather than data. So only a `td` is given a surface here. A table
72
- that wants its frozen `th` to read as a body row instead — a rate matrix, where
73
- a hovered row should band unbroken across the freeze line — says so itself. */
72
+ that wants its frozen `th` to read as a body row instead, a rate matrix, where
73
+ a hovered row should band unbroken across the freeze line, says so itself. */
74
74
  .fdy-table--sticky tbody .fdy-table__freeze{z-index:1;}
75
75
  .fdy-table--sticky tbody td.fdy-table__freeze{background:var(--color-surface);}
76
76
  .fdy-table--sticky tbody tr:hover td.fdy-table__freeze{background:var(--color-surface-2);}
@@ -93,19 +93,19 @@
93
93
  .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);}
94
94
  .fdy-table-footer__info{font-size:var(--text-sm);color:var(--color-text-muted);}
95
95
  /* Rows per page. `margin-left:auto` eats the free space, so the size control and the pager travel
96
- together on the right while the range stays left — no wrapper element, which is what keeps the
96
+ together on the right while the range stays left, no wrapper element, which is what keeps the
97
97
  footer's DOM byte-identical for the tables that don't offer one (#008). The control is the kit's
98
98
  own `.fdy-combo`, never a native <select>: an OS menu is unthemeable, and on macOS it drops a
99
- dark panel into a light page — which is the reason FdyCombo exists at all. Sized to its content:
99
+ dark panel into a light page, which is the reason FdyCombo exists at all. Sized to its content:
100
100
  `.fdy-combo` is display:block at max-width 22rem, which in a footer is a bar-wide box for two
101
- digits. Its HEIGHT is left alone on purpose — `--control-h`, the same as every other control on
101
+ digits. Its HEIGHT is left alone on purpose, `--control-h`, the same as every other control on
102
102
  the page. It briefly carried 2.25rem to match the pager links beside it, which made the one
103
103
  combobox in a compact app 4px taller than all the others; a pager link is a nav button, and the
104
104
  thing this must agree with is the form controls. */
105
105
  .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);}
106
106
  .fdy-table-footer__size .fdy-combo{width:5.5rem;}
107
107
 
108
- /* Column filter — funnel button injected (enhancer) or rendered (FdyTable) into a filterable <th> */
108
+ /* Column filter, funnel button injected (enhancer) or rendered (FdyTable) into a filterable <th> */
109
109
  .fdy-table__filterwrap{display:inline-flex;align-items:center;vertical-align:middle;}
110
110
  .fdy-table__filterbtn{appearance:none;display:inline-flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-left:var(--space-1);padding:0;vertical-align:middle;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--color-text-subtle);cursor:pointer;}
111
111
  .fdy-table__filterbtn:hover{background:var(--color-surface-3);color:var(--color-text);}
@@ -122,7 +122,7 @@
122
122
  .fdy-filter__range .fdy-input{width:6rem;}
123
123
  .fdy-filter__foot{display:flex;justify-content:space-between;gap:var(--space-2);margin-top:var(--space-3);}
124
124
 
125
- /* Bulk-action bar — appears above the table body once rows are selected */
125
+ /* Bulk-action bar, appears above the table body once rows are selected */
126
126
  .fdy-table-bulkbar{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-2) var(--space-4);background:var(--color-primary-soft);border-bottom:var(--bw) solid var(--color-border);color:var(--color-primary-strong);font-size:var(--text-sm);}
127
127
  .fdy-table-bulkbar[hidden]{display:none;}
128
128
  .fdy-table-bulkbar__count{font-weight:var(--weight-semibold);white-space:nowrap;}
@@ -130,7 +130,7 @@
130
130
  .fdy-table-bulkbar__actions{display:flex;gap:var(--space-2);}
131
131
 
132
132
  /* Controls inside a data row. `.fdy-input` and friends are width:100%, which in an auto-layout
133
- table means they contribute NO intrinsic width — the column shrinks to whatever the header text
133
+ table means they contribute NO intrinsic width, the column shrinks to whatever the header text
134
134
  needs and the control collapses with it. A NOTE column ends up a box too narrow to read what you
135
135
  typed into it. The floor is per-control rather than on the column, because the table does not
136
136
  know which of its columns hold controls. */
@@ -1,5 +1,5 @@
1
- /* Freeday — Tabs (WAI-ARIA APG) */
2
- /* position:relative — containing block for out-of-flow content in the tabs (see base.css). */
1
+ /* Freeday. Tabs (WAI-ARIA APG) */
2
+ /* position:relative, containing block for out-of-flow content in the tabs (see base.css). */
3
3
  .fdy-tabs__list{position:relative;display:flex;gap:var(--space-1);border-bottom:var(--bw) solid var(--color-border);overflow-x:auto;}
4
4
  .fdy-tabs__tab{appearance:none;border:0;background:transparent;cursor:pointer;white-space:nowrap;font-family:var(--font-body);font-size:var(--text-sm);font-weight:var(--weight-medium);color:var(--color-text-muted);padding:var(--space-3) var(--space-4);border-bottom:2px solid transparent;margin-bottom:-1px;transition:color var(--dur-fast) var(--ease-standard),border-color var(--dur-fast) var(--ease-standard);}
5
5
  .fdy-tabs__tab:hover{color:var(--color-text);}
@@ -7,7 +7,7 @@
7
7
  .fdy-tabs__tab:disabled:hover,.fdy-tabs__tab[aria-disabled="true"]:hover{color:var(--color-text-muted);}
8
8
  /* `aria-current="page"` is honoured alongside `aria-selected="true"` so the tab look can be used for
9
9
  ROUTE-driven sub-navigation (/settings/profile · /settings/billing), where the tabs are real links.
10
- A link cannot be `aria-selected` — that is invalid ARIA on an anchor; `aria-current` is the only
10
+ A link cannot be `aria-selected`, that is invalid ARIA on an anchor; `aria-current` is the only
11
11
  correct marker, and it is what a router sets. Use `.fdy-tabs` + `freeday-tabs.js` (roving tabindex,
12
12
  a panel per tab) for in-page tabs; use these classes on plain links for routed ones, and
13
13
  `.fdy-nav--horizontal` for an application's PRIMARY navigation. */
@@ -1,4 +1,4 @@
1
- /* Freeday — Timeline (vertical event feed: dot markers on a connector line). Pure CSS. */
1
+ /* Freeday. Timeline (vertical event feed: dot markers on a connector line). Pure CSS. */
2
2
  .fdy-timeline{list-style:none;margin:0;padding:0;}
3
3
  .fdy-timeline__item{position:relative;padding:0 0 var(--space-5) var(--space-6);border-left:2px solid var(--color-border);}
4
4
  .fdy-timeline__item:last-child{border-left-color:transparent;padding-bottom:0;}
@@ -1,4 +1,4 @@
1
- /* Freeday — Time picker (input-styled trigger + scrollable time-list popover).
1
+ /* Freeday. Time picker (input-styled trigger + scrollable time-list popover).
2
2
  * Built by freeday-timepicker.js from an empty [data-fdy-timepicker] wrapper.
3
3
  * Trigger visual mirrors the date picker for a consistent control family. */
4
4
  .fdy-timepicker{position:relative;display:inline-block;width:100%;max-width:11rem;}
@@ -1,11 +1,11 @@
1
- /* Freeday — Toast (transient notification) */
1
+ /* Freeday. Toast (transient notification) */
2
2
  /* The region is a POPOVER, not merely a high z-index.
3
- `.fdy-modal` is a native <dialog> opened with showModal(), which puts it in the TOP LAYER — a
3
+ `.fdy-modal` is a native <dialog> opened with showModal(), which puts it in the TOP LAYER, a
4
4
  layer above the whole z-index universe, so no number here could ever beat it. A toast raised by
5
5
  an action taken inside a modal was painted behind that modal's backdrop: dimmed, unreadable, and
6
6
  most of it under the dialog itself. `freeday-toast.js` calls showPopover() as each toast is
7
7
  added, which puts the region in the top layer too, and last-in wins there.
8
- Everything after `pointer-events` is undoing the UA's [popover] defaults — it arrives with
8
+ Everything after `pointer-events` is undoing the UA's [popover] defaults, it arrives with
9
9
  inset:0, auto margins, a border, padding, a Canvas background and overflow:auto, none of which a
10
10
  toast stack wants. Where showPopover() is unavailable the element is still an ordinary fixed
11
11
  block at z-index 200, which is exactly what it was before. */
@@ -1,4 +1,4 @@
1
- /* Freeday — Tooltip (CSS-only, hover/focus) */
1
+ /* Freeday. Tooltip (CSS-only, hover/focus) */
2
2
  .fdy-tooltip-wrap{position:relative;display:inline-flex;}
3
3
  .fdy-tooltip{position:absolute;bottom:calc(100% + var(--space-2));left:50%;z-index:150;max-width:16rem;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);font-size:var(--text-xs);font-weight:var(--weight-medium);line-height:var(--leading-snug);color:var(--color-inverse-text);background:var(--color-inverse-surface);box-shadow:var(--shadow-2);opacity:0;visibility:hidden;pointer-events:none;transform:translateX(-50%) translateY(4px);transition:opacity var(--dur-fast) var(--ease-standard),transform var(--dur-fast) var(--ease-standard);}
4
4
  .fdy-tooltip::after{content:"";position:absolute;top:100%;left:50%;transform:translateX(-50%);border:.3rem solid transparent;border-top-color:var(--color-inverse-surface);}
@@ -1,4 +1,4 @@
1
- /* Freeday — Tree view (hierarchy via nested native <details>: keyboard-toggle, zero-JS).
1
+ /* Freeday. Tree view (hierarchy via nested native <details>: keyboard-toggle, zero-JS).
2
2
  * Branches expand/collapse; leaves are plain rows. Chevron + optional folder/file icons. */
3
3
  .fdy-tree{list-style:none;margin:0;padding:0;font-size:var(--text-sm);}
4
4
  .fdy-tree ul{list-style:none;margin:0;padding-left:var(--space-4);}
@@ -15,7 +15,7 @@
15
15
  /* Disabled row (branch summary or leaf): dimmed, no hover, not interactive. */
16
16
  .fdy-tree__leaf[aria-disabled="true"],.fdy-tree__branch[aria-disabled="true"] > summary{opacity:.5;cursor:not-allowed;pointer-events:none;}
17
17
 
18
- /* Checkbox variant — a selectable tree (cascading parent/child via freeday-tree.js).
18
+ /* Checkbox variant, a selectable tree (cascading parent/child via freeday-tree.js).
19
19
  * A native <input class="fdy-checkbox"> sits at the start of every row; a partially
20
20
  * selected branch shows the native :indeterminate dash. The checkbox stops click
21
21
  * propagation, so toggling selection never expands/collapses the branch. */
@@ -1,8 +1,8 @@
1
- // Types for tokens/breakpoints.mjs — the JS-side breakpoint scale in px
1
+ // Types for tokens/breakpoints.mjs: the JS-side breakpoint scale in px
2
2
  // (mirrors the sm/md/lg/xl utilities in src/components/breakpoints.css).
3
3
  export declare const breakpoints: {
4
4
  /** Width at which .fdy-app's sidebar turns from off-canvas drawer into a static column.
5
- * Not part of the sm/md/lg/xl ramp — it mirrors app-shell.css and nothing else. */
5
+ * Not part of the sm/md/lg/xl ramp; it mirrors app-shell.css and nothing else. */
6
6
  nav: number;
7
7
  sm: number;
8
8
  md: number;
@@ -1,11 +1,11 @@
1
- // Freeday breakpoint scale in px — mirrors src/components/breakpoints.css utilities
1
+ // Freeday breakpoint scale in px, mirrors src/components/breakpoints.css utilities
2
2
  // (sm/md/lg/xl). CSS @media can't read custom properties, so this is the JS-side
3
3
  // source of the scale for matchMedia / app @media alignment.
4
4
  //
5
5
  // `nav` is not part of the sm/md/lg/xl ramp: it is the width at which .fdy-app switches the
6
6
  // sidebar from an off-canvas drawer (below) to a static column (at and above), hard-wired in
7
- // src/components/app-shell.css. Anything that has to agree with the shell — a matchMedia guard
7
+ // src/components/app-shell.css. Anything that has to agree with the shell, a matchMedia guard
8
8
  // deciding whether the nav toggle sets --nav-open or --nav-collapsed, a utility-framework
9
- // variant — must use THIS number, not md. Aligning such code to md (960) leaves 721–959px
9
+ // variant, must use THIS number, not md. Aligning such code to md (960) leaves 721–959px
10
10
  // broken: the sidebar is already static while the script still thinks it is an overlay.
11
11
  export const breakpoints = { nav: 721, sm: 600, md: 960, lg: 1280, xl: 1920 };
@@ -118,7 +118,7 @@
118
118
  "tick": { "$value": "{slate.400}", "$dark": "{slate.600}" }
119
119
  },
120
120
 
121
- "_comment_tone": "General categorical palette — the same 8 validated hues as chart, aliased under a chart-neutral name for avatars, chips, tags, legend swatches (theme-follows via chart's own $dark).",
121
+ "_comment_tone": "General categorical palette: the same 8 validated hues as chart, aliased under a chart-neutral name for avatars, chips, tags, legend swatches (theme-follows via chart's own $dark).",
122
122
  "tone": {
123
123
  "1": { "$value": "{chart.1}" },
124
124
  "2": { "$value": "{chart.2}" },