@f-ewald/components 1.0.0 → 1.0.3
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/README.md +6 -0
- package/custom-elements.json +891 -22
- package/dist/address-autocomplete.d.ts +8 -0
- package/dist/address-autocomplete.d.ts.map +1 -1
- package/dist/address-autocomplete.js +165 -15
- package/dist/address-autocomplete.js.map +1 -1
- package/dist/animate-confetti.d.ts +8 -5
- package/dist/animate-confetti.d.ts.map +1 -1
- package/dist/animate-confetti.js +46 -19
- package/dist/animate-confetti.js.map +1 -1
- package/dist/autocomplete-input.d.ts +8 -0
- package/dist/autocomplete-input.d.ts.map +1 -1
- package/dist/autocomplete-input.js +165 -15
- package/dist/autocomplete-input.js.map +1 -1
- package/dist/calendar-month.d.ts.map +1 -1
- package/dist/calendar-month.js +27 -13
- package/dist/calendar-month.js.map +1 -1
- package/dist/calendar-year.d.ts.map +1 -1
- package/dist/calendar-year.js +11 -2
- package/dist/calendar-year.js.map +1 -1
- package/dist/chat-message.d.ts.map +1 -1
- package/dist/chat-message.js +77 -24
- package/dist/chat-message.js.map +1 -1
- package/dist/confirm-dialog.d.ts +8 -1
- package/dist/confirm-dialog.d.ts.map +1 -1
- package/dist/confirm-dialog.js +130 -18
- package/dist/confirm-dialog.js.map +1 -1
- package/dist/copy-link-button.d.ts +2 -0
- package/dist/copy-link-button.d.ts.map +1 -1
- package/dist/copy-link-button.js +35 -3
- package/dist/copy-link-button.js.map +1 -1
- package/dist/data-table.d.ts +2 -0
- package/dist/data-table.d.ts.map +1 -1
- package/dist/data-table.js +83 -11
- package/dist/data-table.js.map +1 -1
- package/dist/distance-value.d.ts +0 -1
- package/dist/distance-value.d.ts.map +1 -1
- package/dist/distance-value.js +3 -8
- package/dist/distance-value.js.map +1 -1
- package/dist/distribution-chart.d.ts.map +1 -1
- package/dist/distribution-chart.js +54 -17
- package/dist/distribution-chart.js.map +1 -1
- package/dist/dropdown-button.d.ts.map +1 -1
- package/dist/dropdown-button.js +60 -11
- package/dist/dropdown-button.js.map +1 -1
- package/dist/editable-text.d.ts.map +1 -1
- package/dist/editable-text.js +46 -13
- package/dist/editable-text.js.map +1 -1
- package/dist/form-select.d.ts.map +1 -1
- package/dist/form-select.js +70 -22
- package/dist/form-select.js.map +1 -1
- package/dist/frame-box.d.ts.map +1 -1
- package/dist/frame-box.js +20 -12
- package/dist/frame-box.js.map +1 -1
- package/dist/icon-button.d.ts.map +1 -1
- package/dist/icon-button.js +11 -0
- package/dist/icon-button.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/kbd-hint.d.ts +30 -0
- package/dist/kbd-hint.d.ts.map +1 -0
- package/dist/kbd-hint.js +184 -0
- package/dist/kbd-hint.js.map +1 -0
- package/dist/live-timer.d.ts +0 -1
- package/dist/live-timer.d.ts.map +1 -1
- package/dist/live-timer.js +1 -6
- package/dist/live-timer.js.map +1 -1
- package/dist/map-circle.d.ts.map +1 -1
- package/dist/map-circle.js +16 -1
- package/dist/map-circle.js.map +1 -1
- package/dist/map-pin.d.ts.map +1 -1
- package/dist/map-pin.js +16 -1
- package/dist/map-pin.js.map +1 -1
- package/dist/percent-bar-chart.d.ts +3 -0
- package/dist/percent-bar-chart.d.ts.map +1 -1
- package/dist/percent-bar-chart.js +60 -4
- package/dist/percent-bar-chart.js.map +1 -1
- package/dist/photo-gallery.d.ts.map +1 -1
- package/dist/photo-gallery.js +12 -3
- package/dist/photo-gallery.js.map +1 -1
- package/dist/popover-panel.d.ts.map +1 -1
- package/dist/popover-panel.js +132 -23
- package/dist/popover-panel.js.map +1 -1
- package/dist/price-history-chart.d.ts.map +1 -1
- package/dist/price-history-chart.js +52 -18
- package/dist/price-history-chart.js.map +1 -1
- package/dist/radio-cards.d.ts +2 -0
- package/dist/radio-cards.d.ts.map +1 -1
- package/dist/radio-cards.js +51 -5
- package/dist/radio-cards.js.map +1 -1
- package/dist/radio-pills.d.ts +2 -0
- package/dist/radio-pills.d.ts.map +1 -1
- package/dist/radio-pills.js +46 -4
- package/dist/radio-pills.js.map +1 -1
- package/dist/relative-time.d.ts +0 -1
- package/dist/relative-time.d.ts.map +1 -1
- package/dist/relative-time.js +1 -6
- package/dist/relative-time.js.map +1 -1
- package/dist/reveal-button.d.ts +2 -0
- package/dist/reveal-button.d.ts.map +1 -1
- package/dist/reveal-button.js +42 -5
- package/dist/reveal-button.js.map +1 -1
- package/dist/roman-numeral.js +1 -1
- package/dist/roman-numeral.js.map +1 -1
- package/dist/slide-panel.d.ts +7 -3
- package/dist/slide-panel.d.ts.map +1 -1
- package/dist/slide-panel.js +95 -23
- package/dist/slide-panel.js.map +1 -1
- package/dist/stat-meter.d.ts.map +1 -1
- package/dist/stat-meter.js +17 -7
- package/dist/stat-meter.js.map +1 -1
- package/dist/status-pill.d.ts.map +1 -1
- package/dist/status-pill.js +26 -12
- package/dist/status-pill.js.map +1 -1
- package/dist/tile-grid.d.ts +8 -0
- package/dist/tile-grid.d.ts.map +1 -1
- package/dist/tile-grid.js +88 -12
- package/dist/tile-grid.js.map +1 -1
- package/dist/toast-notification.d.ts.map +1 -1
- package/dist/toast-notification.js +40 -11
- package/dist/toast-notification.js.map +1 -1
- package/dist/tokens.css +19 -0
- package/dist/tokens.d.ts.map +1 -1
- package/dist/tokens.js +13 -0
- package/dist/tokens.js.map +1 -1
- package/dist/ui-button.d.ts +2 -0
- package/dist/ui-button.d.ts.map +1 -1
- package/dist/ui-button.js +58 -9
- package/dist/ui-button.js.map +1 -1
- package/dist/user-avatar.d.ts.map +1 -1
- package/dist/user-avatar.js +18 -3
- package/dist/user-avatar.js.map +1 -1
- package/dist/utils/form.d.ts +3 -0
- package/dist/utils/form.d.ts.map +1 -0
- package/dist/utils/form.js +14 -0
- package/dist/utils/form.js.map +1 -0
- package/dist/utils/layer-stack.d.ts +9 -0
- package/dist/utils/layer-stack.d.ts.map +1 -0
- package/dist/utils/layer-stack.js +35 -0
- package/dist/utils/layer-stack.js.map +1 -0
- package/dist/weight-bar-chart.d.ts.map +1 -1
- package/dist/weight-bar-chart.js +27 -8
- package/dist/weight-bar-chart.js.map +1 -1
- package/docs/address-autocomplete.md +5 -0
- package/docs/autocomplete-input.md +5 -0
- package/docs/calendar-month.md +2 -0
- package/docs/chat-message.md +4 -0
- package/docs/confirm-dialog.md +2 -0
- package/docs/copy-link-button.md +2 -0
- package/docs/data-table.md +2 -0
- package/docs/design-language.md +149 -0
- package/docs/distribution-chart.md +4 -0
- package/docs/dropdown-button.md +1 -0
- package/docs/frame-box.md +2 -0
- package/docs/kbd-hint.md +42 -0
- package/docs/percent-bar-chart.md +4 -1
- package/docs/photo-gallery.md +1 -0
- package/docs/popover-panel.md +2 -0
- package/docs/price-history-chart.md +8 -1
- package/docs/radio-cards.md +2 -0
- package/docs/radio-pills.md +2 -0
- package/docs/reveal-button.md +3 -0
- package/docs/slide-panel.md +4 -2
- package/docs/status-pill.md +3 -0
- package/docs/tile-grid.md +10 -1
- package/docs/toast-notification.md +4 -1
- package/docs/ui-button.md +2 -0
- package/docs/user-avatar.md +1 -0
- package/llms.txt +59 -34
- package/package.json +5 -1
package/dist/calendar-month.js
CHANGED
|
@@ -44,7 +44,16 @@ let CalendarMonth = class CalendarMonth extends LitElement {
|
|
|
44
44
|
css `
|
|
45
45
|
:host {
|
|
46
46
|
display: block;
|
|
47
|
-
font-family: var(
|
|
47
|
+
font-family: var(
|
|
48
|
+
--ui-font,
|
|
49
|
+
ui-sans-serif,
|
|
50
|
+
system-ui,
|
|
51
|
+
sans-serif,
|
|
52
|
+
"Apple Color Emoji",
|
|
53
|
+
"Segoe UI Emoji",
|
|
54
|
+
"Segoe UI Symbol",
|
|
55
|
+
"Noto Color Emoji"
|
|
56
|
+
);
|
|
48
57
|
font-size: var(--ui-font-size-sm, 0.75rem);
|
|
49
58
|
}
|
|
50
59
|
.month-name {
|
|
@@ -92,7 +101,7 @@ let CalendarMonth = class CalendarMonth extends LitElement {
|
|
|
92
101
|
font-weight: 600;
|
|
93
102
|
}
|
|
94
103
|
.lane-cell {
|
|
95
|
-
padding: 0.
|
|
104
|
+
padding: 0.25rem 0.5rem;
|
|
96
105
|
}
|
|
97
106
|
.entry-bar {
|
|
98
107
|
border-radius: 0;
|
|
@@ -119,27 +128,27 @@ let CalendarMonth = class CalendarMonth extends LitElement {
|
|
|
119
128
|
border-bottom: 0;
|
|
120
129
|
}
|
|
121
130
|
.entry-bar.neutral {
|
|
122
|
-
background: color-mix(in srgb, var(--ui-text-muted, #64748b) 15%, var(--ui-surface, #
|
|
131
|
+
background: color-mix(in srgb, var(--ui-text-muted, #64748b) 15%, var(--ui-surface, #ffffff));
|
|
123
132
|
color: var(--ui-text-muted, #64748b);
|
|
124
133
|
}
|
|
125
134
|
.entry-bar.info {
|
|
126
|
-
background: color-mix(in srgb, #0ea5e9 15%, var(--ui-surface, #
|
|
127
|
-
color: #0ea5e9;
|
|
135
|
+
background: color-mix(in srgb, var(--ui-info, #0ea5e9) 15%, var(--ui-surface, #ffffff));
|
|
136
|
+
color: var(--ui-info, #0ea5e9);
|
|
128
137
|
}
|
|
129
138
|
.entry-bar.primary {
|
|
130
|
-
background: color-mix(in srgb, var(--ui-primary, #4f46e5) 15%, var(--ui-surface, #
|
|
139
|
+
background: color-mix(in srgb, var(--ui-primary, #4f46e5) 15%, var(--ui-surface, #ffffff));
|
|
131
140
|
color: var(--ui-primary, #4f46e5);
|
|
132
141
|
}
|
|
133
142
|
.entry-bar.success {
|
|
134
|
-
background: color-mix(in srgb, var(--ui-success, #16a34a) 15%, var(--ui-surface, #
|
|
143
|
+
background: color-mix(in srgb, var(--ui-success, #16a34a) 15%, var(--ui-surface, #ffffff));
|
|
135
144
|
color: var(--ui-success, #16a34a);
|
|
136
145
|
}
|
|
137
146
|
.entry-bar.warning {
|
|
138
|
-
background: color-mix(in srgb, #d97706 15%, var(--ui-surface, #
|
|
139
|
-
color: #d97706;
|
|
147
|
+
background: color-mix(in srgb, var(--ui-warning, #d97706) 15%, var(--ui-surface, #ffffff));
|
|
148
|
+
color: var(--ui-warning, #d97706);
|
|
140
149
|
}
|
|
141
150
|
.entry-bar.danger {
|
|
142
|
-
background: color-mix(in srgb, var(--ui-danger, #dc2626) 15%, var(--ui-surface, #
|
|
151
|
+
background: color-mix(in srgb, var(--ui-danger, #dc2626) 15%, var(--ui-surface, #ffffff));
|
|
143
152
|
color: var(--ui-danger, #dc2626);
|
|
144
153
|
}
|
|
145
154
|
.entry-line {
|
|
@@ -153,7 +162,7 @@ let CalendarMonth = class CalendarMonth extends LitElement {
|
|
|
153
162
|
.entry-title {
|
|
154
163
|
box-sizing: border-box;
|
|
155
164
|
font-weight: 500;
|
|
156
|
-
padding: 0.
|
|
165
|
+
padding: 0.25rem 0.5rem;
|
|
157
166
|
pointer-events: none;
|
|
158
167
|
white-space: nowrap;
|
|
159
168
|
text-overflow: ellipsis;
|
|
@@ -189,7 +198,7 @@ let CalendarMonth = class CalendarMonth extends LitElement {
|
|
|
189
198
|
min-height: 0;
|
|
190
199
|
flex-direction: column;
|
|
191
200
|
overflow: hidden;
|
|
192
|
-
padding: 0.
|
|
201
|
+
padding: 0.25rem 0.5rem;
|
|
193
202
|
color: inherit;
|
|
194
203
|
pointer-events: none;
|
|
195
204
|
}
|
|
@@ -198,7 +207,7 @@ let CalendarMonth = class CalendarMonth extends LitElement {
|
|
|
198
207
|
min-height: 1.15em;
|
|
199
208
|
margin-top: auto;
|
|
200
209
|
border-top: 1px solid color-mix(in srgb, currentColor 20%, transparent);
|
|
201
|
-
padding-top: 0.
|
|
210
|
+
padding-top: 0.25rem;
|
|
202
211
|
font-size: var(--ui-font-size-xs, 0.6875rem);
|
|
203
212
|
font-weight: 500;
|
|
204
213
|
line-height: 1.15;
|
|
@@ -226,6 +235,11 @@ let CalendarMonth = class CalendarMonth extends LitElement {
|
|
|
226
235
|
box-shadow: none;
|
|
227
236
|
}
|
|
228
237
|
}
|
|
238
|
+
@media (prefers-reduced-motion: reduce) {
|
|
239
|
+
.entry-bar {
|
|
240
|
+
transition: none;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
229
243
|
slot {
|
|
230
244
|
display: none;
|
|
231
245
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar-month.js","sourceRoot":"","sources":["../src/calendar-month.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, css, html, nothing } from \"lit\";\nimport { customElement, property, queryAssignedElements, state } from \"lit/decorators.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { CalendarEntry } from \"./calendar-entry.js\";\nimport { tokens } from \"./tokens.js\";\nimport {\n CALENDAR_ENTRY_ATTRIBUTES,\n WEEKDAY_ABBR,\n assignLanes,\n daysInMonth,\n isWeekend,\n monthName,\n overlapsRange,\n readCalendarEntryElement,\n resolveEntry,\n toIsoDate,\n type LanedEntry,\n type ResolvedCalendarEntry,\n} from \"./utils/calendar.js\";\n\n/**\n * One month rendered as a top-to-bottom list of days — weekends and today\n * highlighted, with declarative `calendar-entry` children shown as colored\n * bars spanning the days they cover. An entry's title uses its first visible\n * day; every remaining visible day becomes one shared body for wrapped\n * details and an optional ending footer. Overlapping entries stack into\n * side-by-side lanes rather than being layered/hidden. Read-only.\n *\n * Lanes are computed independently per instance, from only the entries\n * overlapping this month — an entry spanning a month boundary may therefore\n * land in a different lane index in the adjacent month's `calendar-month`.\n * This is an accepted v1 limitation: cross-month lane continuity would\n * require a shared parent (`calendar-year`) to assign lanes globally.\n *\n * Entry attributes and slotted title/detail text are observed, so a\n * standalone month re-renders when consumers update declarative metadata.\n *\n * @element calendar-month\n * @slot - Declarative `calendar-entry` elements to render for this month.\n */\n@customElement(\"calendar-month\")\nexport class CalendarMonth extends LitElement {\n /** Calendar year, e.g. `2026`. */\n @property({ type: Number, reflect: true }) year: number = new Date().getFullYear();\n\n /** Calendar month, 1-12 (January = 1). */\n @property({ type: Number, reflect: true }) month = 1;\n\n @queryAssignedElements({ selector: \"calendar-entry\" })\n private readonly _entryElements!: CalendarEntry[];\n\n /** Bumped when entry elements, attributes, or slotted text change to force a re-render. */\n @state() private _entriesVersion = 0;\n\n private _entriesObserver?: MutationObserver;\n\n static override styles = [\n tokens,\n css`\n :host {\n display: block;\n font-family: var(--ui-font, ui-sans-serif, system-ui, sans-serif);\n font-size: var(--ui-font-size-sm, 0.75rem);\n }\n .month-name {\n margin: 0 0 0.5rem;\n color: var(--ui-text, #0f172a);\n font-size: var(--ui-font-size, 0.875rem);\n font-weight: 600;\n }\n table {\n width: 100%;\n border-collapse: collapse;\n table-layout: fixed;\n }\n .day-row td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--ui-border, #e2e8f0);\n }\n .day-row.weekend {\n background: var(--ui-surface-muted, #f8fafc);\n }\n .day-row.today {\n background: color-mix(in srgb, var(--ui-primary, #4f46e5) 10%, transparent);\n }\n .day-number {\n width: 1.5rem;\n color: var(--ui-text-muted, #64748b);\n font-variant-numeric: tabular-nums;\n text-align: right;\n white-space: nowrap;\n }\n .day-row.today .day-number {\n color: var(--ui-primary, #4f46e5);\n font-weight: 700;\n }\n .day-weekday {\n width: 2.25rem;\n color: var(--ui-text-muted, #64748b);\n white-space: nowrap;\n }\n .day-row.today .day-weekday {\n color: var(--ui-primary, #4f46e5);\n font-weight: 600;\n }\n .day-row.weekend .day-weekday {\n font-weight: 600;\n }\n .lane-cell {\n padding: 0.1rem 0.4rem;\n }\n .entry-bar {\n border-radius: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n transition: box-shadow 120ms ease;\n white-space: nowrap;\n }\n .entry-bar.entry-hovered,\n .entry-bar.entry-focused {\n box-shadow: inset 0 0 0 100vmax var(--ui-hover-overlay, rgb(255 255 255 / 0.32));\n }\n .entry-bar.segment-single {\n border-radius: var(--ui-radius-sm, 0.25rem);\n }\n .entry-bar.segment-start {\n border-radius: var(--ui-radius-sm, 0.25rem) var(--ui-radius-sm, 0.25rem) 0 0;\n }\n .entry-bar.segment-end {\n border-radius: 0 0 var(--ui-radius-sm, 0.25rem) var(--ui-radius-sm, 0.25rem);\n }\n .entry-bar.segment-start,\n .entry-bar.segment-middle {\n border-bottom: 0;\n }\n .entry-bar.neutral {\n background: color-mix(in srgb, var(--ui-text-muted, #64748b) 15%, var(--ui-surface, #fff));\n color: var(--ui-text-muted, #64748b);\n }\n .entry-bar.info {\n background: color-mix(in srgb, #0ea5e9 15%, var(--ui-surface, #fff));\n color: #0ea5e9;\n }\n .entry-bar.primary {\n background: color-mix(in srgb, var(--ui-primary, #4f46e5) 15%, var(--ui-surface, #fff));\n color: var(--ui-primary, #4f46e5);\n }\n .entry-bar.success {\n background: color-mix(in srgb, var(--ui-success, #16a34a) 15%, var(--ui-surface, #fff));\n color: var(--ui-success, #16a34a);\n }\n .entry-bar.warning {\n background: color-mix(in srgb, #d97706 15%, var(--ui-surface, #fff));\n color: #d97706;\n }\n .entry-bar.danger {\n background: color-mix(in srgb, var(--ui-danger, #dc2626) 15%, var(--ui-surface, #fff));\n color: var(--ui-danger, #dc2626);\n }\n .entry-line {\n display: block;\n overflow: hidden;\n }\n .day-row td.entry-title-cell {\n position: relative;\n padding: 0;\n }\n .entry-title {\n box-sizing: border-box;\n font-weight: 500;\n padding: 0.15rem 0.4rem;\n pointer-events: none;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n .entry-details {\n display: -webkit-box;\n min-height: 0;\n max-height: var(--entry-detail-max-height, 1.15em);\n flex: 0 0 auto;\n overflow: hidden;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: var(--entry-detail-lines, 1);\n font-size: var(--ui-font-size-xs, 0.6875rem);\n font-weight: 400;\n line-height: 1.15;\n overflow-wrap: anywhere;\n text-overflow: ellipsis;\n white-space: normal;\n }\n .entry-detail {\n min-height: 1.15em;\n }\n .day-row td.entry-body-cell {\n position: relative;\n padding: 0;\n vertical-align: top;\n }\n .entry-body {\n position: absolute;\n inset: 0;\n box-sizing: border-box;\n display: flex;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n padding: 0.15rem 0.4rem;\n color: inherit;\n pointer-events: none;\n }\n .entry-footer {\n flex: 0 0 auto;\n min-height: 1.15em;\n margin-top: auto;\n border-top: 1px solid color-mix(in srgb, currentColor 20%, transparent);\n padding-top: 0.15rem;\n font-size: var(--ui-font-size-xs, 0.6875rem);\n font-weight: 500;\n line-height: 1.15;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .entry-link {\n position: absolute;\n z-index: 1;\n inset: 0;\n border-radius: inherit;\n color: inherit;\n cursor: pointer;\n text-decoration: none;\n }\n .entry-link:focus-visible {\n outline: 2px solid var(--ui-primary, #4f46e5);\n outline-offset: -2px;\n box-shadow: var(--ui-focus-ring, 0 0 0 3px rgb(79 70 229 / 0.35)) inset;\n }\n @media (forced-colors: active) {\n .entry-link:focus-visible {\n outline-color: Highlight;\n box-shadow: none;\n }\n }\n slot {\n display: none;\n }\n `,\n ];\n\n /** Observes declarative entry attributes and slotted text for live updates. */\n override connectedCallback(): void {\n super.connectedCallback();\n this._entriesVersion++;\n this._entriesObserver ??= new MutationObserver(() => this._entriesVersion++);\n this._entriesObserver.observe(this, {\n attributes: true,\n attributeFilter: CALENDAR_ENTRY_ATTRIBUTES,\n characterData: true,\n childList: true,\n subtree: true,\n });\n }\n\n /** Releases the entry observer when this month disconnects. */\n override disconnectedCallback(): void {\n this._entriesObserver?.disconnect();\n super.disconnectedCallback();\n }\n\n /** Restores hover/focus classes from the live DOM after Lit updates or reuses cells. */\n protected override updated(): void {\n this._syncEntryInteractions();\n }\n\n /** Re-renders when declarative `calendar-entry` children are added or removed. */\n private _handleSlotChange(): void {\n this._entriesVersion++;\n }\n\n /** Finds the laned entry (if any) covering `date` in a given lane. */\n private _entryFor(laned: LanedEntry[], lane: number, date: Date): LanedEntry | undefined {\n return laned.find((entry) => entry.lane === lane && entry.startDate <= date && date <= entry.endDate);\n }\n\n /** Classifies one day of an entry so only the outer endpoints are rounded. */\n private _segmentClass(entry: LanedEntry, date: Date): string {\n const startsHere = date.getTime() === entry.startDate.getTime();\n const endsHere = date.getTime() === entry.endDate.getTime();\n if (startsHere && endsHere) return \"segment-single\";\n if (startsHere) return \"segment-start\";\n if (endsHere) return \"segment-end\";\n return \"segment-middle\";\n }\n\n /** Current render key shared by an entry's title and body cells. */\n private _entryKey(entry: LanedEntry): string {\n return `${entry.lane}|${entry.start}|${entry.end}|${entry.label}|${entry.href ?? \"\"}`;\n }\n\n /** Toggles one interaction class on every rendered cell belonging to an entry. */\n private _setEntryInteraction(entryKey: string, className: string, active: boolean): void {\n for (const cell of this.renderRoot.querySelectorAll<HTMLElement>(\".entry-bar\")) {\n if (cell.dataset.entryKey === entryKey) {\n cell.classList.toggle(className, active);\n }\n }\n }\n\n /** Reconciles classes against the links actually hovered or focused after a render. */\n private _syncEntryInteractions(): void {\n for (const cell of this.renderRoot.querySelectorAll<HTMLElement>(\".entry-bar\")) {\n cell.classList.remove(\"entry-hovered\", \"entry-focused\");\n }\n for (const link of this.renderRoot.querySelectorAll<HTMLElement>(\".entry-link:hover\")) {\n this._setEntryInteraction(link.dataset.entryKey ?? \"\", \"entry-hovered\", true);\n }\n const activeElement = this.shadowRoot?.activeElement;\n if (activeElement instanceof HTMLElement && activeElement.matches(\".entry-link\")) {\n this._setEntryInteraction(activeElement.dataset.entryKey ?? \"\", \"entry-focused\", true);\n }\n }\n\n /** Renders a transparent full-cell link without wrapping the visible text. */\n private _renderEntryLink(entry: LanedEntry, accessibleText: string) {\n const entryKey = this._entryKey(entry);\n return entry.href\n ? html`<a\n class=\"entry-link\"\n href=${entry.href}\n aria-label=${accessibleText}\n data-entry-key=${entryKey}\n @pointerenter=${() => this._setEntryInteraction(entryKey, \"entry-hovered\", true)}\n @pointerleave=${() => this._setEntryInteraction(entryKey, \"entry-hovered\", false)}\n @focus=${() => this._setEntryInteraction(entryKey, \"entry-focused\", true)}\n @blur=${() => this._setEntryInteraction(entryKey, \"entry-focused\", false)}\n ></a>`\n : nothing;\n }\n\n /** Joins the event title, details, and visible footer for tooltips and accessible link names. */\n private _entryBodyText(entry: LanedEntry, showFooter: boolean): string {\n return [entry.label, ...(entry.details ?? []), showFooter ? entry.footer : undefined]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\");\n }\n\n /** Renders the shared details body, with the footer reserved at its bottom edge. */\n private _renderEntryBody(\n entry: LanedEntry,\n showFooter: boolean,\n detailLineClamp: number,\n showTitleFallback = false,\n ) {\n const sourceDetails = entry.details ?? [];\n const footer = showFooter ? entry.footer : undefined;\n const details =\n showTitleFallback && sourceDetails.length === 0 && !footer\n ? [entry.label]\n : sourceDetails;\n const bodyText = this._entryBodyText(entry, showFooter);\n return html`\n ${this._renderEntryLink(entry, bodyText)}\n <div class=\"entry-body\" aria-hidden=${entry.href ? \"true\" : nothing}>\n ${detailLineClamp > 0 && details.length > 0\n ? html`\n <div\n class=\"entry-details\"\n style=${`--entry-detail-lines: ${detailLineClamp}; --entry-detail-max-height: ${\n detailLineClamp * 1.15\n }em`}\n >\n ${details.map((detail) => html`<div class=\"entry-detail\">${detail}</div>`)}\n </div>\n `\n : nothing}\n ${footer ? html`<div class=\"entry-footer\" title=${footer}>${footer}</div>` : nothing}\n </div>\n `;\n }\n\n /** Renders a row-spanning body cell with whole-line detail and footer budgets. */\n private _renderEntryBodyCell(\n entry: LanedEntry,\n bodyRows: number,\n reachesEventEnd: boolean,\n showTitleFallback = false,\n ) {\n const segmentClass = reachesEventEnd ? \"segment-end\" : \"segment-middle\";\n const footerLineBudget = reachesEventEnd && entry.footer ? 1 : 0;\n const detailLineClamp = Math.max(0, bodyRows - footerLineBudget);\n const bodyText = this._entryBodyText(entry, reachesEventEnd);\n return html`\n <td\n class=\"lane-cell entry-bar entry-body-cell ${entry.color} ${segmentClass}\"\n data-entry-key=${this._entryKey(entry)}\n rowspan=${bodyRows}\n title=${entry.href ? nothing : bodyText}\n >\n ${this._renderEntryBody(entry, reachesEventEnd, detailLineClamp, showTitleFallback)}\n </td>\n `;\n }\n\n /** Renders a lane's title/body cell, skips rows covered by a body rowspan, or emits an empty spacer. */\n private _renderLaneCell(\n laned: LanedEntry[],\n lane: number,\n date: Date,\n monthStart: Date,\n monthEnd: Date,\n ) {\n const entry = this._entryFor(laned, lane, date);\n if (!entry) {\n return html`<td class=\"lane-cell empty\"></td>`;\n }\n\n const firstVisibleDay = entry.startDate > monthStart ? entry.startDate : monthStart;\n const lastVisibleDay = entry.endDate < monthEnd ? entry.endDate : monthEnd;\n const dayOffset = date.getDate() - firstVisibleDay.getDate();\n const visibleDayCount = lastVisibleDay.getDate() - firstVisibleDay.getDate() + 1;\n const isMultiDayEntry = entry.startDate.getTime() !== entry.endDate.getTime();\n const isEndingOnlyClip =\n visibleDayCount === 1 &&\n isMultiDayEntry &&\n date.getTime() === entry.endDate.getTime();\n if (isEndingOnlyClip) {\n return this._renderEntryBodyCell(entry, 1, true, true);\n }\n if (dayOffset > 1) return nothing;\n\n if (dayOffset === 1) {\n const bodyRows = visibleDayCount - 1;\n const reachesEventEnd = lastVisibleDay.getTime() === entry.endDate.getTime();\n return this._renderEntryBodyCell(entry, bodyRows, reachesEventEnd);\n }\n\n return html`\n <td\n class=\"lane-cell entry-bar entry-title-cell ${entry.color} ${this._segmentClass(entry, date)}\"\n data-entry-key=${this._entryKey(entry)}\n title=${entry.href ? nothing : entry.label}\n >\n ${this._renderEntryLink(entry, entry.label)}\n <span class=\"entry-line entry-title\" aria-hidden=${entry.href ? \"true\" : nothing}>\n ${entry.label}\n </span>\n </td>\n `;\n }\n\n protected override render() {\n const totalDays = daysInMonth(this.year, this.month);\n const monthStart = new Date(this.year, this.month - 1, 1);\n const monthEnd = new Date(this.year, this.month - 1, totalDays);\n\n const resolved = this._entryElements\n .map(readCalendarEntryElement)\n .map(resolveEntry)\n .filter((entry): entry is ResolvedCalendarEntry => entry !== null)\n .filter((entry) => overlapsRange(entry, monthStart, monthEnd));\n const { entries: laned, laneCount } = assignLanes(resolved);\n const todayIso = toIsoDate(new Date());\n const lanes = Array.from({ length: Math.max(laneCount, 1) }, (_, i) => i);\n\n return html`\n <div class=\"month\">\n <h4 class=\"month-name\">${monthName(this.month)} ${this.year}</h4>\n <table>\n <tbody>\n ${repeat(\n Array.from({ length: totalDays }, (_, i) => i + 1),\n (d) => d,\n (d) => {\n const date = new Date(this.year, this.month - 1, d);\n const dow = date.getDay();\n const weekendCls = isWeekend(date) ? \"weekend\" : \"\";\n const todayCls = toIsoDate(date) === todayIso ? \"today\" : \"\";\n return html`\n <tr class=\"day-row ${weekendCls} ${todayCls}\">\n <td class=\"day-number\">${d}</td>\n <td class=\"day-weekday\">${WEEKDAY_ABBR[dow]}</td>\n ${lanes.map((lane) => this._renderLaneCell(laned, lane, date, monthStart, monthEnd))}\n </tr>\n `;\n },\n )}\n </tbody>\n </table>\n <slot @slotchange=${this._handleSlotChange}></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"calendar-month\": CalendarMonth;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"calendar-month.js","sourceRoot":"","sources":["../src/calendar-month.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, css, html, nothing } from \"lit\";\nimport { customElement, property, queryAssignedElements, state } from \"lit/decorators.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { CalendarEntry } from \"./calendar-entry.js\";\nimport { tokens } from \"./tokens.js\";\nimport {\n CALENDAR_ENTRY_ATTRIBUTES,\n WEEKDAY_ABBR,\n assignLanes,\n daysInMonth,\n isWeekend,\n monthName,\n overlapsRange,\n readCalendarEntryElement,\n resolveEntry,\n toIsoDate,\n type LanedEntry,\n type ResolvedCalendarEntry,\n} from \"./utils/calendar.js\";\n\n/**\n * One month rendered as a top-to-bottom list of days — weekends and today\n * highlighted, with declarative `calendar-entry` children shown as colored\n * bars spanning the days they cover. An entry's title uses its first visible\n * day; every remaining visible day becomes one shared body for wrapped\n * details and an optional ending footer. Overlapping entries stack into\n * side-by-side lanes rather than being layered/hidden. Read-only.\n *\n * Lanes are computed independently per instance, from only the entries\n * overlapping this month — an entry spanning a month boundary may therefore\n * land in a different lane index in the adjacent month's `calendar-month`.\n * This is an accepted v1 limitation: cross-month lane continuity would\n * require a shared parent (`calendar-year`) to assign lanes globally.\n *\n * Entry attributes and slotted title/detail text are observed, so a\n * standalone month re-renders when consumers update declarative metadata.\n *\n * @element calendar-month\n * @slot - Declarative `calendar-entry` elements to render for this month.\n */\n@customElement(\"calendar-month\")\nexport class CalendarMonth extends LitElement {\n /** Calendar year, e.g. `2026`. */\n @property({ type: Number, reflect: true }) year: number = new Date().getFullYear();\n\n /** Calendar month, 1-12 (January = 1). */\n @property({ type: Number, reflect: true }) month = 1;\n\n @queryAssignedElements({ selector: \"calendar-entry\" })\n private readonly _entryElements!: CalendarEntry[];\n\n /** Bumped when entry elements, attributes, or slotted text change to force a re-render. */\n @state() private _entriesVersion = 0;\n\n private _entriesObserver?: MutationObserver;\n\n static override styles = [\n tokens,\n css`\n :host {\n display: block;\n font-family: var(\n --ui-font,\n ui-sans-serif,\n system-ui,\n sans-serif,\n \"Apple Color Emoji\",\n \"Segoe UI Emoji\",\n \"Segoe UI Symbol\",\n \"Noto Color Emoji\"\n );\n font-size: var(--ui-font-size-sm, 0.75rem);\n }\n .month-name {\n margin: 0 0 0.5rem;\n color: var(--ui-text, #0f172a);\n font-size: var(--ui-font-size, 0.875rem);\n font-weight: 600;\n }\n table {\n width: 100%;\n border-collapse: collapse;\n table-layout: fixed;\n }\n .day-row td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--ui-border, #e2e8f0);\n }\n .day-row.weekend {\n background: var(--ui-surface-muted, #f8fafc);\n }\n .day-row.today {\n background: color-mix(in srgb, var(--ui-primary, #4f46e5) 10%, transparent);\n }\n .day-number {\n width: 1.5rem;\n color: var(--ui-text-muted, #64748b);\n font-variant-numeric: tabular-nums;\n text-align: right;\n white-space: nowrap;\n }\n .day-row.today .day-number {\n color: var(--ui-primary, #4f46e5);\n font-weight: 700;\n }\n .day-weekday {\n width: 2.25rem;\n color: var(--ui-text-muted, #64748b);\n white-space: nowrap;\n }\n .day-row.today .day-weekday {\n color: var(--ui-primary, #4f46e5);\n font-weight: 600;\n }\n .day-row.weekend .day-weekday {\n font-weight: 600;\n }\n .lane-cell {\n padding: 0.25rem 0.5rem;\n }\n .entry-bar {\n border-radius: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n transition: box-shadow 120ms ease;\n white-space: nowrap;\n }\n .entry-bar.entry-hovered,\n .entry-bar.entry-focused {\n box-shadow: inset 0 0 0 100vmax var(--ui-hover-overlay, rgb(255 255 255 / 0.32));\n }\n .entry-bar.segment-single {\n border-radius: var(--ui-radius-sm, 0.25rem);\n }\n .entry-bar.segment-start {\n border-radius: var(--ui-radius-sm, 0.25rem) var(--ui-radius-sm, 0.25rem) 0 0;\n }\n .entry-bar.segment-end {\n border-radius: 0 0 var(--ui-radius-sm, 0.25rem) var(--ui-radius-sm, 0.25rem);\n }\n .entry-bar.segment-start,\n .entry-bar.segment-middle {\n border-bottom: 0;\n }\n .entry-bar.neutral {\n background: color-mix(in srgb, var(--ui-text-muted, #64748b) 15%, var(--ui-surface, #ffffff));\n color: var(--ui-text-muted, #64748b);\n }\n .entry-bar.info {\n background: color-mix(in srgb, var(--ui-info, #0ea5e9) 15%, var(--ui-surface, #ffffff));\n color: var(--ui-info, #0ea5e9);\n }\n .entry-bar.primary {\n background: color-mix(in srgb, var(--ui-primary, #4f46e5) 15%, var(--ui-surface, #ffffff));\n color: var(--ui-primary, #4f46e5);\n }\n .entry-bar.success {\n background: color-mix(in srgb, var(--ui-success, #16a34a) 15%, var(--ui-surface, #ffffff));\n color: var(--ui-success, #16a34a);\n }\n .entry-bar.warning {\n background: color-mix(in srgb, var(--ui-warning, #d97706) 15%, var(--ui-surface, #ffffff));\n color: var(--ui-warning, #d97706);\n }\n .entry-bar.danger {\n background: color-mix(in srgb, var(--ui-danger, #dc2626) 15%, var(--ui-surface, #ffffff));\n color: var(--ui-danger, #dc2626);\n }\n .entry-line {\n display: block;\n overflow: hidden;\n }\n .day-row td.entry-title-cell {\n position: relative;\n padding: 0;\n }\n .entry-title {\n box-sizing: border-box;\n font-weight: 500;\n padding: 0.25rem 0.5rem;\n pointer-events: none;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n .entry-details {\n display: -webkit-box;\n min-height: 0;\n max-height: var(--entry-detail-max-height, 1.15em);\n flex: 0 0 auto;\n overflow: hidden;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: var(--entry-detail-lines, 1);\n font-size: var(--ui-font-size-xs, 0.6875rem);\n font-weight: 400;\n line-height: 1.15;\n overflow-wrap: anywhere;\n text-overflow: ellipsis;\n white-space: normal;\n }\n .entry-detail {\n min-height: 1.15em;\n }\n .day-row td.entry-body-cell {\n position: relative;\n padding: 0;\n vertical-align: top;\n }\n .entry-body {\n position: absolute;\n inset: 0;\n box-sizing: border-box;\n display: flex;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n padding: 0.25rem 0.5rem;\n color: inherit;\n pointer-events: none;\n }\n .entry-footer {\n flex: 0 0 auto;\n min-height: 1.15em;\n margin-top: auto;\n border-top: 1px solid color-mix(in srgb, currentColor 20%, transparent);\n padding-top: 0.25rem;\n font-size: var(--ui-font-size-xs, 0.6875rem);\n font-weight: 500;\n line-height: 1.15;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .entry-link {\n position: absolute;\n z-index: 1;\n inset: 0;\n border-radius: inherit;\n color: inherit;\n cursor: pointer;\n text-decoration: none;\n }\n .entry-link:focus-visible {\n outline: 2px solid var(--ui-primary, #4f46e5);\n outline-offset: -2px;\n box-shadow: var(--ui-focus-ring, 0 0 0 3px rgb(79 70 229 / 0.35)) inset;\n }\n @media (forced-colors: active) {\n .entry-link:focus-visible {\n outline-color: Highlight;\n box-shadow: none;\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .entry-bar {\n transition: none;\n }\n }\n slot {\n display: none;\n }\n `,\n ];\n\n /** Observes declarative entry attributes and slotted text for live updates. */\n override connectedCallback(): void {\n super.connectedCallback();\n this._entriesVersion++;\n this._entriesObserver ??= new MutationObserver(() => this._entriesVersion++);\n this._entriesObserver.observe(this, {\n attributes: true,\n attributeFilter: CALENDAR_ENTRY_ATTRIBUTES,\n characterData: true,\n childList: true,\n subtree: true,\n });\n }\n\n /** Releases the entry observer when this month disconnects. */\n override disconnectedCallback(): void {\n this._entriesObserver?.disconnect();\n super.disconnectedCallback();\n }\n\n /** Restores hover/focus classes from the live DOM after Lit updates or reuses cells. */\n protected override updated(): void {\n this._syncEntryInteractions();\n }\n\n /** Re-renders when declarative `calendar-entry` children are added or removed. */\n private _handleSlotChange(): void {\n this._entriesVersion++;\n }\n\n /** Finds the laned entry (if any) covering `date` in a given lane. */\n private _entryFor(laned: LanedEntry[], lane: number, date: Date): LanedEntry | undefined {\n return laned.find((entry) => entry.lane === lane && entry.startDate <= date && date <= entry.endDate);\n }\n\n /** Classifies one day of an entry so only the outer endpoints are rounded. */\n private _segmentClass(entry: LanedEntry, date: Date): string {\n const startsHere = date.getTime() === entry.startDate.getTime();\n const endsHere = date.getTime() === entry.endDate.getTime();\n if (startsHere && endsHere) return \"segment-single\";\n if (startsHere) return \"segment-start\";\n if (endsHere) return \"segment-end\";\n return \"segment-middle\";\n }\n\n /** Current render key shared by an entry's title and body cells. */\n private _entryKey(entry: LanedEntry): string {\n return `${entry.lane}|${entry.start}|${entry.end}|${entry.label}|${entry.href ?? \"\"}`;\n }\n\n /** Toggles one interaction class on every rendered cell belonging to an entry. */\n private _setEntryInteraction(entryKey: string, className: string, active: boolean): void {\n for (const cell of this.renderRoot.querySelectorAll<HTMLElement>(\".entry-bar\")) {\n if (cell.dataset.entryKey === entryKey) {\n cell.classList.toggle(className, active);\n }\n }\n }\n\n /** Reconciles classes against the links actually hovered or focused after a render. */\n private _syncEntryInteractions(): void {\n for (const cell of this.renderRoot.querySelectorAll<HTMLElement>(\".entry-bar\")) {\n cell.classList.remove(\"entry-hovered\", \"entry-focused\");\n }\n for (const link of this.renderRoot.querySelectorAll<HTMLElement>(\".entry-link:hover\")) {\n this._setEntryInteraction(link.dataset.entryKey ?? \"\", \"entry-hovered\", true);\n }\n const activeElement = this.shadowRoot?.activeElement;\n if (activeElement instanceof HTMLElement && activeElement.matches(\".entry-link\")) {\n this._setEntryInteraction(activeElement.dataset.entryKey ?? \"\", \"entry-focused\", true);\n }\n }\n\n /** Renders a transparent full-cell link without wrapping the visible text. */\n private _renderEntryLink(entry: LanedEntry, accessibleText: string) {\n const entryKey = this._entryKey(entry);\n return entry.href\n ? html`<a\n class=\"entry-link\"\n href=${entry.href}\n aria-label=${accessibleText}\n data-entry-key=${entryKey}\n @pointerenter=${() => this._setEntryInteraction(entryKey, \"entry-hovered\", true)}\n @pointerleave=${() => this._setEntryInteraction(entryKey, \"entry-hovered\", false)}\n @focus=${() => this._setEntryInteraction(entryKey, \"entry-focused\", true)}\n @blur=${() => this._setEntryInteraction(entryKey, \"entry-focused\", false)}\n ></a>`\n : nothing;\n }\n\n /** Joins the event title, details, and visible footer for tooltips and accessible link names. */\n private _entryBodyText(entry: LanedEntry, showFooter: boolean): string {\n return [entry.label, ...(entry.details ?? []), showFooter ? entry.footer : undefined]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\");\n }\n\n /** Renders the shared details body, with the footer reserved at its bottom edge. */\n private _renderEntryBody(\n entry: LanedEntry,\n showFooter: boolean,\n detailLineClamp: number,\n showTitleFallback = false,\n ) {\n const sourceDetails = entry.details ?? [];\n const footer = showFooter ? entry.footer : undefined;\n const details =\n showTitleFallback && sourceDetails.length === 0 && !footer\n ? [entry.label]\n : sourceDetails;\n const bodyText = this._entryBodyText(entry, showFooter);\n return html`\n ${this._renderEntryLink(entry, bodyText)}\n <div class=\"entry-body\" aria-hidden=${entry.href ? \"true\" : nothing}>\n ${detailLineClamp > 0 && details.length > 0\n ? html`\n <div\n class=\"entry-details\"\n style=${`--entry-detail-lines: ${detailLineClamp}; --entry-detail-max-height: ${\n detailLineClamp * 1.15\n }em`}\n >\n ${details.map((detail) => html`<div class=\"entry-detail\">${detail}</div>`)}\n </div>\n `\n : nothing}\n ${footer ? html`<div class=\"entry-footer\" title=${footer}>${footer}</div>` : nothing}\n </div>\n `;\n }\n\n /** Renders a row-spanning body cell with whole-line detail and footer budgets. */\n private _renderEntryBodyCell(\n entry: LanedEntry,\n bodyRows: number,\n reachesEventEnd: boolean,\n showTitleFallback = false,\n ) {\n const segmentClass = reachesEventEnd ? \"segment-end\" : \"segment-middle\";\n const footerLineBudget = reachesEventEnd && entry.footer ? 1 : 0;\n const detailLineClamp = Math.max(0, bodyRows - footerLineBudget);\n const bodyText = this._entryBodyText(entry, reachesEventEnd);\n return html`\n <td\n class=\"lane-cell entry-bar entry-body-cell ${entry.color} ${segmentClass}\"\n data-entry-key=${this._entryKey(entry)}\n rowspan=${bodyRows}\n title=${entry.href ? nothing : bodyText}\n >\n ${this._renderEntryBody(entry, reachesEventEnd, detailLineClamp, showTitleFallback)}\n </td>\n `;\n }\n\n /** Renders a lane's title/body cell, skips rows covered by a body rowspan, or emits an empty spacer. */\n private _renderLaneCell(\n laned: LanedEntry[],\n lane: number,\n date: Date,\n monthStart: Date,\n monthEnd: Date,\n ) {\n const entry = this._entryFor(laned, lane, date);\n if (!entry) {\n return html`<td class=\"lane-cell empty\"></td>`;\n }\n\n const firstVisibleDay = entry.startDate > monthStart ? entry.startDate : monthStart;\n const lastVisibleDay = entry.endDate < monthEnd ? entry.endDate : monthEnd;\n const dayOffset = date.getDate() - firstVisibleDay.getDate();\n const visibleDayCount = lastVisibleDay.getDate() - firstVisibleDay.getDate() + 1;\n const isMultiDayEntry = entry.startDate.getTime() !== entry.endDate.getTime();\n const isEndingOnlyClip =\n visibleDayCount === 1 &&\n isMultiDayEntry &&\n date.getTime() === entry.endDate.getTime();\n if (isEndingOnlyClip) {\n return this._renderEntryBodyCell(entry, 1, true, true);\n }\n if (dayOffset > 1) return nothing;\n\n if (dayOffset === 1) {\n const bodyRows = visibleDayCount - 1;\n const reachesEventEnd = lastVisibleDay.getTime() === entry.endDate.getTime();\n return this._renderEntryBodyCell(entry, bodyRows, reachesEventEnd);\n }\n\n return html`\n <td\n class=\"lane-cell entry-bar entry-title-cell ${entry.color} ${this._segmentClass(entry, date)}\"\n data-entry-key=${this._entryKey(entry)}\n title=${entry.href ? nothing : entry.label}\n >\n ${this._renderEntryLink(entry, entry.label)}\n <span class=\"entry-line entry-title\" aria-hidden=${entry.href ? \"true\" : nothing}>\n ${entry.label}\n </span>\n </td>\n `;\n }\n\n protected override render() {\n const totalDays = daysInMonth(this.year, this.month);\n const monthStart = new Date(this.year, this.month - 1, 1);\n const monthEnd = new Date(this.year, this.month - 1, totalDays);\n\n const resolved = this._entryElements\n .map(readCalendarEntryElement)\n .map(resolveEntry)\n .filter((entry): entry is ResolvedCalendarEntry => entry !== null)\n .filter((entry) => overlapsRange(entry, monthStart, monthEnd));\n const { entries: laned, laneCount } = assignLanes(resolved);\n const todayIso = toIsoDate(new Date());\n const lanes = Array.from({ length: Math.max(laneCount, 1) }, (_, i) => i);\n\n return html`\n <div class=\"month\">\n <h4 class=\"month-name\">${monthName(this.month)} ${this.year}</h4>\n <table>\n <tbody>\n ${repeat(\n Array.from({ length: totalDays }, (_, i) => i + 1),\n (d) => d,\n (d) => {\n const date = new Date(this.year, this.month - 1, d);\n const dow = date.getDay();\n const weekendCls = isWeekend(date) ? \"weekend\" : \"\";\n const todayCls = toIsoDate(date) === todayIso ? \"today\" : \"\";\n return html`\n <tr class=\"day-row ${weekendCls} ${todayCls}\">\n <td class=\"day-number\">${d}</td>\n <td class=\"day-weekday\">${WEEKDAY_ABBR[dow]}</td>\n ${lanes.map((lane) => this._renderLaneCell(laned, lane, date, monthStart, monthEnd))}\n </tr>\n `;\n },\n )}\n </tbody>\n </table>\n <slot @slotchange=${this._handleSlotChange}></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"calendar-month\": CalendarMonth;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar-year.d.ts","sourceRoot":"","sources":["../src/calendar-year.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAKrD,OAAO,qBAAqB,CAAC;AAc7B;;;;;;;;;GASG;AACH,qBACa,YAAa,SAAQ,UAAU;IAC1C,8DAA8D;IACnB,IAAI,EAAE,MAAM,CAA4B;IAGnF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmB;IAElD,+FAA+F;IACtF,OAAO,CAAC,eAAe,CAAK;IAErC,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwC;IACnE,OAAO,CAAC,aAAa,CAAK;IAE1B,OAAgB,MAAM,
|
|
1
|
+
{"version":3,"file":"calendar-year.d.ts","sourceRoot":"","sources":["../src/calendar-year.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAKrD,OAAO,qBAAqB,CAAC;AAc7B;;;;;;;;;GASG;AACH,qBACa,YAAa,SAAQ,UAAU;IAC1C,8DAA8D;IACnB,IAAI,EAAE,MAAM,CAA4B;IAGnF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmB;IAElD,+FAA+F;IACtF,OAAO,CAAC,eAAe,CAAK;IAErC,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwC;IACnE,OAAO,CAAC,aAAa,CAAK;IAE1B,OAAgB,MAAM,4BAyBpB;IAEF;;;;;OAKG;IACM,iBAAiB,IAAI,IAAI,CAWjC;IAED,mEAAmE;IAC1D,oBAAoB,IAAI,IAAI,CAGpC;IAED,kFAAkF;IAClF,OAAO,CAAC,iBAAiB;IAIzB,qEAAqE;IACrE,OAAO,CAAC,SAAS;IASjB,UAAmB,MAAM,yCA0CxB;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,YAAY,CAAC;KAC/B;CACF"}
|
package/dist/calendar-year.js
CHANGED
|
@@ -37,11 +37,20 @@ let CalendarYear = class CalendarYear extends LitElement {
|
|
|
37
37
|
css `
|
|
38
38
|
:host {
|
|
39
39
|
display: block;
|
|
40
|
-
font-family: var(
|
|
40
|
+
font-family: var(
|
|
41
|
+
--ui-font,
|
|
42
|
+
ui-sans-serif,
|
|
43
|
+
system-ui,
|
|
44
|
+
sans-serif,
|
|
45
|
+
"Apple Color Emoji",
|
|
46
|
+
"Segoe UI Emoji",
|
|
47
|
+
"Segoe UI Symbol",
|
|
48
|
+
"Noto Color Emoji"
|
|
49
|
+
);
|
|
41
50
|
}
|
|
42
51
|
.year {
|
|
43
52
|
display: grid;
|
|
44
|
-
grid-template-columns: repeat(auto-fill, minmax(
|
|
53
|
+
grid-template-columns: repeat(auto-fill, minmax(13.75rem, 1fr));
|
|
45
54
|
gap: 1.5rem;
|
|
46
55
|
}
|
|
47
56
|
slot {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar-year.js","sourceRoot":"","sources":["../src/calendar-year.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,qBAAqB,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,OAAO,qBAAqB,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,yBAAyB,EACzB,WAAW,EACX,aAAa,EACb,wBAAwB,EACxB,YAAY,GAEb,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAG3D;;;;;;;;;GASG;AAEI,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,UAAU;IAArC;;QACL,8DAA8D;QACnB,SAAI,GAAW,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAKnF,+FAA+F;QAC9E,oBAAe,GAAG,CAAC,CAAC;QAGpB,eAAU,GAAG,IAAI,OAAO,EAAyB,CAAC;QAC3D,kBAAa,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"calendar-year.js","sourceRoot":"","sources":["../src/calendar-year.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, css, html, nothing } from \"lit\";\nimport { customElement, property, queryAssignedElements, state } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { CalendarEntry } from \"./calendar-entry.js\";\nimport \"./calendar-month.js\";\nimport { tokens } from \"./tokens.js\";\nimport {\n CALENDAR_ENTRY_ATTRIBUTES,\n daysInMonth,\n overlapsRange,\n readCalendarEntryElement,\n resolveEntry,\n type ResolvedCalendarEntry,\n} from \"./utils/calendar.js\";\n\nconst MONTHS = Array.from({ length: 12 }, (_, i) => i + 1);\ntype ProjectedCalendarEntry = ResolvedCalendarEntry & { projectionKey: string };\n\n/**\n * A full year of `calendar-month` blocks, generated from declarative\n * `calendar-entry` children. Each entry is re-projected into the\n * `calendar-month` blocks it overlaps as a freshly-created `calendar-entry`\n * element — the original elements stay slotted here and are never moved,\n * since a DOM node can only have one parent. Read-only.\n *\n * @element calendar-year\n * @slot - Declarative `calendar-entry` elements spanning the displayed year.\n */\n@customElement(\"calendar-year\")\nexport class CalendarYear extends LitElement {\n /** Calendar year to render all 12 months for, e.g. `2026`. */\n @property({ type: Number, reflect: true }) year: number = new Date().getFullYear();\n\n @queryAssignedElements({ selector: \"calendar-entry\" })\n private readonly _entryElements!: CalendarEntry[];\n\n /** Bumped whenever entry elements, attributes, or slotted text change to force a re-render. */\n @state() private _entriesVersion = 0;\n\n private _entriesObserver?: MutationObserver;\n private readonly _entryKeys = new WeakMap<CalendarEntry, string>();\n private _nextEntryKey = 0;\n\n static override styles = [\n tokens,\n css`\n :host {\n display: block;\n font-family: var(\n --ui-font,\n ui-sans-serif,\n system-ui,\n sans-serif,\n \"Apple Color Emoji\",\n \"Segoe UI Emoji\",\n \"Segoe UI Symbol\",\n \"Noto Color Emoji\"\n );\n }\n .year {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(13.75rem, 1fr));\n gap: 1.5rem;\n }\n slot {\n display: none;\n }\n `,\n ];\n\n /**\n * Watches slotted `calendar-entry` attributes and title/detail text.\n * Neither reflected-property changes nor edits inside assigned elements\n * fire this component's `slotchange`, so a subtree observer keeps the\n * projected month entries synchronized.\n */\n override connectedCallback(): void {\n super.connectedCallback();\n this._entriesVersion++;\n this._entriesObserver ??= new MutationObserver(() => this._entriesVersion++);\n this._entriesObserver.observe(this, {\n attributes: true,\n attributeFilter: CALENDAR_ENTRY_ATTRIBUTES,\n characterData: true,\n childList: true,\n subtree: true,\n });\n }\n\n /** Releases the mutation observer when the element disconnects. */\n override disconnectedCallback(): void {\n this._entriesObserver?.disconnect();\n super.disconnectedCallback();\n }\n\n /** Re-renders when declarative `calendar-entry` children are added or removed. */\n private _handleSlotChange(): void {\n this._entriesVersion++;\n }\n\n /** Returns an immutable identity for each original slotted entry. */\n private _entryKey(element: CalendarEntry): string {\n let key = this._entryKeys.get(element);\n if (!key) {\n key = `entry-${this._nextEntryKey++}`;\n this._entryKeys.set(element, key);\n }\n return key;\n }\n\n protected override render() {\n const entries = this._entryElements\n .map((element) => {\n const entry = resolveEntry(readCalendarEntryElement(element));\n return entry ? { ...entry, projectionKey: this._entryKey(element) } : null;\n })\n .filter((entry): entry is ProjectedCalendarEntry => entry !== null);\n\n return html`\n <div class=\"year\">\n ${repeat(\n MONTHS,\n (m) => m,\n (m) => {\n const monthStart = new Date(this.year, m - 1, 1);\n const monthEnd = new Date(this.year, m - 1, daysInMonth(this.year, m));\n const monthEntries = entries.filter((entry) => overlapsRange(entry, monthStart, monthEnd));\n return html`\n <calendar-month .year=${this.year} .month=${m}>\n ${repeat(\n monthEntries,\n (entry) => entry.projectionKey,\n (entry) => html`\n <calendar-entry\n start=${entry.start}\n end=${entry.end}\n label=${entry.label}\n color=${entry.color}\n href=${ifDefined(entry.href)}\n >\n ${(entry.details ?? []).map((detail) => html`<span slot=\"detail\">${detail}</span>`)}\n ${entry.footer ? html`<span slot=\"footer\">${entry.footer}</span>` : nothing}\n </calendar-entry>\n `,\n )}\n </calendar-month>\n `;\n },\n )}\n </div>\n <slot @slotchange=${this._handleSlotChange}></slot>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"calendar-year\": CalendarYear;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-message.d.ts","sourceRoot":"","sources":["../src/chat-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAGrD,OAAO,oBAAoB,CAAC;AAG5B,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC1D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEhE;;;;;;;;;GASG;AACH,qBACa,WAAY,SAAQ,UAAU;IACzC,OAAgB,MAAM,
|
|
1
|
+
{"version":3,"file":"chat-message.d.ts","sourceRoot":"","sources":["../src/chat-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAGrD,OAAO,oBAAoB,CAAC;AAG5B,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC1D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEhE;;;;;;;;;GASG;AACH,qBACa,WAAY,SAAQ,UAAU;IACzC,OAAgB,MAAM,4BAyGpB;IAEF,gEAAgE;IAC1B,IAAI,EAAE,eAAe,CAAW;IACtE,6FAA6F;IAChE,OAAO,EAAE,kBAAkB,CAAY;IACpE,kDAAkD;IACtC,MAAM,SAAM;IACxB,sEAAsE;IAC1D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5C,+FAA+F;IACnF,OAAO,SAAM;IACzB,iEAAiE;IACpC,WAAW,UAAS;IACjD,0DAA0D;IACd,SAAS,UAAS;IAE9D,OAAO,CAAC,OAAO;IAMN,MAAM,yCA8Bd;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,WAAW,CAAC;KAC7B;CACF"}
|
package/dist/chat-message.js
CHANGED
|
@@ -42,23 +42,43 @@ let ChatMessage = class ChatMessage extends LitElement {
|
|
|
42
42
|
css `
|
|
43
43
|
:host {
|
|
44
44
|
display: block;
|
|
45
|
-
font-family: var(
|
|
45
|
+
font-family: var(
|
|
46
|
+
--ui-font,
|
|
47
|
+
ui-sans-serif,
|
|
48
|
+
system-ui,
|
|
49
|
+
sans-serif,
|
|
50
|
+
"Apple Color Emoji",
|
|
51
|
+
"Segoe UI Emoji",
|
|
52
|
+
"Segoe UI Symbol",
|
|
53
|
+
"Noto Color Emoji"
|
|
54
|
+
);
|
|
46
55
|
font-size: var(--ui-font-size, 0.875rem);
|
|
47
56
|
}
|
|
48
57
|
.header {
|
|
49
58
|
display: flex;
|
|
50
59
|
align-items: center;
|
|
51
|
-
gap: 0.
|
|
52
|
-
font-size: 0.75rem;
|
|
60
|
+
gap: 0.5rem;
|
|
61
|
+
font-size: var(--ui-font-size-sm, 0.75rem);
|
|
53
62
|
color: var(--ui-text-muted, #64748b);
|
|
54
|
-
margin-bottom: 0.
|
|
63
|
+
margin-bottom: 0.25rem;
|
|
55
64
|
}
|
|
56
|
-
.header
|
|
65
|
+
button.header {
|
|
66
|
+
width: 100%;
|
|
67
|
+
padding: 0;
|
|
68
|
+
border: 0;
|
|
69
|
+
background: none;
|
|
70
|
+
font-family: inherit;
|
|
71
|
+
text-align: left;
|
|
57
72
|
cursor: pointer;
|
|
58
73
|
}
|
|
74
|
+
button.header:focus-visible {
|
|
75
|
+
outline: none;
|
|
76
|
+
border-radius: var(--ui-radius-sm, 0.25rem);
|
|
77
|
+
box-shadow: var(--ui-focus-ring, 0 0 0 3px rgb(79 70 229 / 0.35));
|
|
78
|
+
}
|
|
59
79
|
.chevron {
|
|
60
80
|
display: inline-flex;
|
|
61
|
-
transition: transform
|
|
81
|
+
transition: transform 150ms ease;
|
|
62
82
|
}
|
|
63
83
|
.chevron.expanded {
|
|
64
84
|
transform: rotate(90deg);
|
|
@@ -74,7 +94,7 @@ let ChatMessage = class ChatMessage extends LitElement {
|
|
|
74
94
|
}
|
|
75
95
|
.body-card {
|
|
76
96
|
border-radius: var(--ui-radius, 0.5rem);
|
|
77
|
-
padding: 0.
|
|
97
|
+
padding: 0.5rem 0.75rem;
|
|
78
98
|
color: var(--ui-text, #0f172a);
|
|
79
99
|
line-height: 1.5;
|
|
80
100
|
}
|
|
@@ -82,24 +102,44 @@ let ChatMessage = class ChatMessage extends LitElement {
|
|
|
82
102
|
display: none;
|
|
83
103
|
}
|
|
84
104
|
:host([role="user"]) .body-card {
|
|
85
|
-
background: color-mix(in srgb, var(--ui-primary, #4f46e5) 8%, var(--ui-surface, #
|
|
105
|
+
background: color-mix(in srgb, var(--ui-primary, #4f46e5) 8%, var(--ui-surface, #ffffff));
|
|
86
106
|
}
|
|
87
107
|
:host([role="agent"]) .body-card {
|
|
88
|
-
background: var(--ui-surface, #
|
|
108
|
+
background: var(--ui-surface, #ffffff);
|
|
89
109
|
border: 1px solid var(--ui-border, #e2e8f0);
|
|
90
110
|
}
|
|
91
111
|
:host([role="system"]) .body-card {
|
|
92
|
-
padding: 0 0 0
|
|
93
|
-
font-size: 0.
|
|
112
|
+
padding: 0 0 0 1rem;
|
|
113
|
+
font-size: var(--ui-font-size-sm, 0.75rem);
|
|
94
114
|
color: var(--ui-text-muted, #64748b);
|
|
95
115
|
}
|
|
96
116
|
:host([variant="tool"]) .body-card,
|
|
97
117
|
:host([variant="thinking"]) .body-card {
|
|
98
118
|
opacity: 0.7;
|
|
99
|
-
font-size: 0.
|
|
119
|
+
font-size: var(--ui-font-size-sm, 0.75rem);
|
|
100
120
|
}
|
|
101
121
|
:host([variant="tool"]) .body-card {
|
|
102
|
-
font-family:
|
|
122
|
+
font-family: var(
|
|
123
|
+
--ui-font-mono,
|
|
124
|
+
ui-monospace,
|
|
125
|
+
SFMono-Regular,
|
|
126
|
+
Menlo,
|
|
127
|
+
Monaco,
|
|
128
|
+
Consolas,
|
|
129
|
+
monospace
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
@media (prefers-reduced-motion: reduce) {
|
|
133
|
+
.chevron {
|
|
134
|
+
transition: none;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
@media (forced-colors: active) {
|
|
138
|
+
button.header:focus-visible {
|
|
139
|
+
outline: 2px solid CanvasText;
|
|
140
|
+
outline-offset: 2px;
|
|
141
|
+
box-shadow: none;
|
|
142
|
+
}
|
|
103
143
|
}
|
|
104
144
|
`,
|
|
105
145
|
]; }
|
|
@@ -110,18 +150,31 @@ let ChatMessage = class ChatMessage extends LitElement {
|
|
|
110
150
|
this.dispatchEvent(new CustomEvent("toggle", { detail: { collapsed: this.collapsed } }));
|
|
111
151
|
}
|
|
112
152
|
render() {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
>`
|
|
153
|
+
const headerContent = html `
|
|
154
|
+
${this.collapsible
|
|
155
|
+
? html `<span class="chevron ${this.collapsed ? "" : "expanded"}" aria-hidden="true"
|
|
156
|
+
>${iconChevronRight(12)}</span
|
|
157
|
+
>`
|
|
119
158
|
: nothing}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
159
|
+
${this.author ? html `<span class="author">${this.author}</span>` : nothing}
|
|
160
|
+
${this.timestamp ? html `<relative-time datetime=${this.timestamp}></relative-time>` : nothing}
|
|
161
|
+
${this.summary ? html `<span class="summary">${this.summary}</span>` : nothing}
|
|
162
|
+
`;
|
|
163
|
+
return html `
|
|
164
|
+
${this.collapsible
|
|
165
|
+
? html `
|
|
166
|
+
<button
|
|
167
|
+
class="header"
|
|
168
|
+
type="button"
|
|
169
|
+
aria-expanded=${String(!this.collapsed)}
|
|
170
|
+
aria-controls="message-body"
|
|
171
|
+
@click=${this._toggle}
|
|
172
|
+
>
|
|
173
|
+
${headerContent}
|
|
174
|
+
</button>
|
|
175
|
+
`
|
|
176
|
+
: html `<div class="header">${headerContent}</div>`}
|
|
177
|
+
<div id="message-body" class="body-card" ?hidden=${this.collapsible && this.collapsed}>
|
|
125
178
|
<slot></slot>
|
|
126
179
|
</div>
|
|
127
180
|
`;
|
package/dist/chat-message.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-message.js","sourceRoot":"","sources":["../src/chat-message.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,oBAAoB,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAKrC;;;;;;;;;GASG;AAEI,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,UAAU;IAApC;;
|
|
1
|
+
{"version":3,"file":"chat-message.js","sourceRoot":"","sources":["../src/chat-message.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, css, html, nothing } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { iconChevronRight } from \"./icons.js\";\nimport \"./relative-time.js\";\nimport { tokens } from \"./tokens.js\";\n\nexport type ChatMessageRole = \"user\" | \"agent\" | \"system\";\nexport type ChatMessageVariant = \"normal\" | \"tool\" | \"thinking\";\n\n/**\n * One conversation entry in a chat-style activity feed. Tool calls and\n * \"thinking\" traces are variants of this component rather than separate\n * ones — they share the same header, collapse behavior, and body card as a\n * normal message, just dimmed and collapsible with an always-visible summary.\n *\n * @element chat-message\n * @slot - Message body (consumers slot in already-rendered content, e.g. sanitized markdown HTML).\n * @fires toggle - Fired with `{ collapsed: boolean }` when the header/summary is clicked in collapsible mode.\n */\n@customElement(\"chat-message\")\nexport class ChatMessage extends LitElement {\n static override styles = [\n tokens,\n css`\n :host {\n display: block;\n font-family: var(\n --ui-font,\n ui-sans-serif,\n system-ui,\n sans-serif,\n \"Apple Color Emoji\",\n \"Segoe UI Emoji\",\n \"Segoe UI Symbol\",\n \"Noto Color Emoji\"\n );\n font-size: var(--ui-font-size, 0.875rem);\n }\n .header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: var(--ui-font-size-sm, 0.75rem);\n color: var(--ui-text-muted, #64748b);\n margin-bottom: 0.25rem;\n }\n button.header {\n width: 100%;\n padding: 0;\n border: 0;\n background: none;\n font-family: inherit;\n text-align: left;\n cursor: pointer;\n }\n button.header:focus-visible {\n outline: none;\n border-radius: var(--ui-radius-sm, 0.25rem);\n box-shadow: var(--ui-focus-ring, 0 0 0 3px rgb(79 70 229 / 0.35));\n }\n .chevron {\n display: inline-flex;\n transition: transform 150ms ease;\n }\n .chevron.expanded {\n transform: rotate(90deg);\n }\n .author {\n font-weight: 600;\n color: var(--ui-text, #0f172a);\n }\n .summary {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .body-card {\n border-radius: var(--ui-radius, 0.5rem);\n padding: 0.5rem 0.75rem;\n color: var(--ui-text, #0f172a);\n line-height: 1.5;\n }\n .body-card[hidden] {\n display: none;\n }\n :host([role=\"user\"]) .body-card {\n background: color-mix(in srgb, var(--ui-primary, #4f46e5) 8%, var(--ui-surface, #ffffff));\n }\n :host([role=\"agent\"]) .body-card {\n background: var(--ui-surface, #ffffff);\n border: 1px solid var(--ui-border, #e2e8f0);\n }\n :host([role=\"system\"]) .body-card {\n padding: 0 0 0 1rem;\n font-size: var(--ui-font-size-sm, 0.75rem);\n color: var(--ui-text-muted, #64748b);\n }\n :host([variant=\"tool\"]) .body-card,\n :host([variant=\"thinking\"]) .body-card {\n opacity: 0.7;\n font-size: var(--ui-font-size-sm, 0.75rem);\n }\n :host([variant=\"tool\"]) .body-card {\n font-family: var(\n --ui-font-mono,\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n monospace\n );\n }\n @media (prefers-reduced-motion: reduce) {\n .chevron {\n transition: none;\n }\n }\n @media (forced-colors: active) {\n button.header:focus-visible {\n outline: 2px solid CanvasText;\n outline-offset: 2px;\n box-shadow: none;\n }\n }\n `,\n ];\n\n /** Whose message this is; drives the card background/border. */\n @property({ reflect: true }) override role: ChatMessageRole = \"agent\";\n /** `tool`/`thinking` render dimmed and smaller, with `tool` using monospace for its body. */\n @property({ reflect: true }) variant: ChatMessageVariant = \"normal\";\n /** Header label, e.g. \"Freddy\" or \"Architect\". */\n @property() author = \"\";\n /** ISO-8601 timestamp, rendered via `relative-time` in the header. */\n @property() timestamp: string | null = null;\n /** Always-visible one-liner for `tool`/`thinking` variants (e.g. a truncated args preview). */\n @property() summary = \"\";\n /** Whether clicking the header/summary toggles the body slot. */\n @property({ type: Boolean }) collapsible = false;\n /** Current collapse state (reflected as an attribute). */\n @property({ type: Boolean, reflect: true }) collapsed = false;\n\n private _toggle() {\n if (!this.collapsible) return;\n this.collapsed = !this.collapsed;\n this.dispatchEvent(new CustomEvent(\"toggle\", { detail: { collapsed: this.collapsed } }));\n }\n\n override render() {\n const headerContent = html`\n ${this.collapsible\n ? html`<span class=\"chevron ${this.collapsed ? \"\" : \"expanded\"}\" aria-hidden=\"true\"\n >${iconChevronRight(12)}</span\n >`\n : nothing}\n ${this.author ? html`<span class=\"author\">${this.author}</span>` : nothing}\n ${this.timestamp ? html`<relative-time datetime=${this.timestamp}></relative-time>` : nothing}\n ${this.summary ? html`<span class=\"summary\">${this.summary}</span>` : nothing}\n `;\n\n return html`\n ${this.collapsible\n ? html`\n <button\n class=\"header\"\n type=\"button\"\n aria-expanded=${String(!this.collapsed)}\n aria-controls=\"message-body\"\n @click=${this._toggle}\n >\n ${headerContent}\n </button>\n `\n : html`<div class=\"header\">${headerContent}</div>`}\n <div id=\"message-body\" class=\"body-card\" ?hidden=${this.collapsible && this.collapsed}>\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"chat-message\": ChatMessage;\n }\n}\n"]}
|
package/dist/confirm-dialog.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LitElement } from "lit";
|
|
1
|
+
import { LitElement, type PropertyValues } from "lit";
|
|
2
2
|
/**
|
|
3
3
|
* Reusable confirmation dialog: overlay + centered card with a slotted body,
|
|
4
4
|
* an optional error line, and Cancel/Confirm actions. Instant `display:none`
|
|
@@ -24,8 +24,15 @@ export declare class ConfirmDialog extends LitElement {
|
|
|
24
24
|
busy: boolean;
|
|
25
25
|
/** Inline error line shown below the body, or null for none. */
|
|
26
26
|
error: string | null;
|
|
27
|
+
private _previousFocus;
|
|
27
28
|
private _confirm;
|
|
28
29
|
private _cancel;
|
|
30
|
+
private _getFocusableElements;
|
|
31
|
+
private _focusInitial;
|
|
32
|
+
private _onDocumentFocusIn;
|
|
33
|
+
private _onWindowKeydown;
|
|
34
|
+
protected updated(changed: PropertyValues): void;
|
|
35
|
+
disconnectedCallback(): void;
|
|
29
36
|
render(): import("lit-html").TemplateResult<1>;
|
|
30
37
|
}
|
|
31
38
|
declare global {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirm-dialog.d.ts","sourceRoot":"","sources":["../src/confirm-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"confirm-dialog.d.ts","sourceRoot":"","sources":["../src/confirm-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAW1E;;;;;;;;;;GAUG;AACH,qBACa,aAAc,SAAQ,UAAU;IAC3C,OAAgB,MAAM,4BAqIpB;IAEF,qCAAqC;IACR,IAAI,UAAS;IAC1C,oCAAoC;IACM,YAAY,SAAY;IAClE,mCAAmC;IACM,WAAW,SAAY;IAChE,wEAAwE;IAC3C,MAAM,UAAQ;IAC3C,8EAA8E;IACjD,IAAI,UAAS;IAC1C,gEAAgE;IACpD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAExC,OAAO,CAAC,cAAc,CAA4B;IAElD,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,kBAAkB,CAGxB;IAEF,OAAO,CAAC,gBAAgB,CAuBtB;IAEF,UAAmB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAexD;IAEQ,oBAAoB,IAAI,IAAI,CAQpC;IAEQ,MAAM,yCA4Bd;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,aAAa,CAAC;KACjC;CACF"}
|